Skip to content
go-libfossil Artifact [e720d33d04]
Login

Artifact [e720d33d04]

Artifact e720d33d04161f3349b9814f5d931244aa1c65db7818038c570e0b7a93957fe1:


//go:build !js

package conformance

import (
	"context"
	"os"
	"path/filepath"
	"strings"
	"testing"
	"time"

	"github.com/danmestas/go-libfossil/db"
	"github.com/danmestas/go-libfossil/internal/checkout"
)

func TestSparseWorktreeZitNativeBoundary(t *testing.T) {
	bin := zitBinary(t)
	ref := newFossilReference(t)
	if ref == nil {
		t.Skip("native Fossil is required for the boundary proof")
	}
	home, dir := t.TempDir(), t.TempDir()
	zitRun(t, bin, home, dir, "init")
	scWrite(t, dir, "src/a.c", "source\n")
	scWrite(t, dir, "tools/t.c", "outside\n")
	zitRun(t, bin, home, dir, "add", ".")
	zitRun(t, bin, home, dir, "commit", "--user", "u", "--no-sync", "-m", "baseline")
	zitRun(t, bin, home, dir, "update", "--cone=src")
	state, err := os.ReadFile(filepath.Join(dir, ".zit-checkout"))
	if err != nil {
		t.Fatal(err)
	}
	if len(state) < 12 || string(state[:8]) != "ZITCKOT\x00" || state[8] != 4 || state[9] != 0 {
		t.Fatalf("reference checkout is not the pinned version4 container: %x", state)
	}
	for _, name := range []string{".fslckout", "_FOSSIL_"} {
		if _, err := os.Lstat(filepath.Join(dir, name)); !os.IsNotExist(err) {
			t.Fatalf("Zit created native checkout marker %s: %v", name, err)
		}
	}
	ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
	defer cancel()
	for _, args := range [][]string{
		{"status"}, {"changes"}, {"commit", "--nosync", "-m", "must refuse"},
		{"update", "--nosync"}, {"revert"}, {"stash", "save"}, {"clean", "--force"},
	} {
		cmd := ref.command(ctx, args...)
		cmd.Dir = dir
		out, err := cmd.CombinedOutput()
		if err == nil || !strings.Contains(string(out), "within an open check-out") {
			t.Fatalf("native %v against Zit checkout: %v\n%s", args, err, out)
		}
	}
	after, err := os.ReadFile(filepath.Join(dir, ".zit-checkout"))
	if err != nil || string(after) != string(state) {
		t.Fatalf("native operations changed Zit state: %v", err)
	}
}

func TestSparseWorktreeGoCreatedNativeFixture(t *testing.T) {
	ref := newFossilReference(t)
	if ref == nil {
		t.Skip("native Fossil is required for the interoperability proof")
	}
	f := newSCRepo(t, false)
	info, err := os.Stat(f.r.Path())
	if err != nil {
		t.Fatal(err)
	}
	ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
	defer cancel()
	before, err := ref.command(ctx, "test-is-repo", f.r.Path()).CombinedOutput()
	if err != nil {
		t.Fatalf("native fixture probe: %v\n%s", err, before)
	}
	t.Logf("before checkpoint: main database size=%d; %s", info.Size(), before)
	if _, err := f.r.DB().Exec("PRAGMA wal_checkpoint(TRUNCATE)"); err != nil {
		t.Fatal(err)
	}
	cmd := ref.command(ctx, "open", f.r.Path())
	cmd.Dir = t.TempDir()
	out, err := cmd.CombinedOutput()
	if err != nil {
		t.Fatalf("native open of checkpointed Go-created fixture: %v\n%s", err, out)
	}
}

// A reduced vfile is not sufficient protection: Fossil synthesizes its next
// manifest from those rows and can silently retire omitted baseline files.
func TestSparseWorktreeNativeOmittedRecordHazard(t *testing.T) {
	ref := newFossilReference(t)
	if ref == nil {
		t.Skip("native Fossil is required for the interoperability proof")
	}
	dir := t.TempDir()
	ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
	defer cancel()
	run := func(args ...string) string {
		t.Helper()
		cmd := ref.command(ctx, args...)
		cmd.Dir = dir
		out, err := cmd.CombinedOutput()
		if err != nil {
			t.Fatalf("native %v: %v\n%s", args, err, out)
		}
		return string(out)
	}
	repoPath := filepath.Join(t.TempDir(), "native.fossil")
	run("init", "--admin-user", "u", repoPath)
	run("open", repoPath)
	for name, text := range scFiles {
		scWrite(t, dir, name, text)
	}
	run("add", ".")
	run("commit", "--nosync", "--no-warnings", "-m", "baseline")
	ckdb, err := db.OpenSQL(filepath.Join(dir, checkout.PreferredDBName()), db.OpenConfig{}, nil)
	if err != nil {
		t.Fatal(err)
	}
	if _, err := ckdb.Exec("DELETE FROM vfile WHERE pathname NOT IN ('src/a.c', 'src/b.c', 'src/vendor/keep/k.c')"); err != nil {
		ckdb.Close()
		t.Fatal(err)
	}
	if err := ckdb.Close(); err != nil {
		t.Fatal(err)
	}
	scWrite(t, dir, "src/a.c", "native edit\n")
	run("commit", "--nosync", "--no-warnings", "-m", "native reduced record")
	out := run("ls")
	if strings.Contains(out, "docs/d.txt") {
		t.Fatalf("native Fossil unexpectedly preserved omitted baseline entry: %s", out)
	}
	t.Logf("Fossil silently committed only reduced managed record:\n%s", out)
}