Skip to content
go-libfossil Artifact [dea0b22e5c]
Login

Artifact [dea0b22e5c]

Artifact dea0b22e5ca13e6e8d554df11e7b438707f5df2e5678b674742021b8bc3dc960:


package manifest

import (
	"testing"
	"time"

	"github.com/danmestas/go-libfossil/internal/cone"
	"github.com/danmestas/go-libfossil/internal/content"
	"github.com/danmestas/go-libfossil/internal/deck"
)

func TestSparseDeltaMetadataUsesEffectiveBaselineView(t *testing.T) {
	f := newTreeFixture(t)
	old := f.file("src/a")
	outside := f.leaf(f.file("vendor/a"))
	base := f.store(treeDeck(time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC), []deck.SubmanifestCard{f.leaf(old), outside}))
	replacement := f.file("src/b")
	delta := f.store(&deck.Deck{C: "delta", D: time.Date(2026, 1, 2, 0, 0, 0, 0, time.UTC), B: base,
		F: []deck.FileCard{{Name: old.Name}, replacement}, U: deck.User("u")})
	elideWriterNode(t, f.r, outside.UUID)
	elideWriterNode(t, f.r, old.UUID)
	c, err := cone.New([]string{"src"}, nil)
	if err != nil {
		t.Fatal(err)
	}
	if err := content.SetStoreCone(f.r.DB(), c); err != nil {
		t.Fatal(err)
	}
	if _, err := Crosslink(f.r); err != nil {
		t.Fatal(err)
	}
	rid, _ := content.AvailableByUUID(f.r.DB(), delta)
	var events, mlinks int
	if err := f.r.DB().QueryRow("SELECT count(*) FROM event WHERE objid=?", rid).Scan(&events); err != nil {
		t.Fatal(err)
	}
	if err := f.r.DB().QueryRow("SELECT count(*) FROM mlink WHERE mid=?", rid).Scan(&mlinks); err != nil {
		t.Fatal(err)
	}
	if events != 1 || mlinks != 0 {
		t.Fatalf("effective delta metadata events=%d mlinks=%d, want 1/0", events, mlinks)
	}
}

func TestSparseMetadataRefusesInvalidDependencies(t *testing.T) {
	for _, kind := range []string{"parent", "baseline", "cherrypick"} {
		t.Run(kind, func(t *testing.T) {
			f := newTreeFixture(t)
			inside := f.file("src/a")
			outside := f.leaf(f.file("vendor/a"))
			d := treeDeck(time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC), []deck.SubmanifestCard{f.leaf(inside), outside})
			invalid := f.storeBytes([]byte("not a check-in"))
			switch kind {
			case "parent":
				d.P = []string{invalid}
			case "baseline":
				d.S = nil
				d.F = []deck.FileCard{inside}
				d.B = invalid
			case "cherrypick":
				d.Q = []deck.CherryPick{{Target: invalid}}
			}
			uuid := f.store(d)
			elideWriterNode(t, f.r, outside.UUID)
			c, err := cone.New([]string{"src"}, nil)
			if err != nil {
				t.Fatal(err)
			}
			if err := content.SetStoreCone(f.r.DB(), c); err != nil {
				t.Fatal(err)
			}
			if _, err := Crosslink(f.r); err != nil {
				t.Fatal(err)
			}
			rid, _ := content.AvailableByUUID(f.r.DB(), uuid)
			var events int
			if err := f.r.DB().QueryRow("SELECT count(*) FROM event WHERE objid=?", rid).Scan(&events); err != nil {
				t.Fatal(err)
			}
			if events != 0 {
				t.Fatal("invalid dependency allowed metadata publication")
			}
		})
	}
}