Skip to content
go-libfossil Artifact [aa07682ac9]
Login

Artifact [aa07682ac9]

Artifact aa07682ac9ab10d7e78e25f080a9dddc297d5d1085b57cf577414d1a9fb28f21:


package libfossil

import (
	"context"
	"errors"
	"path/filepath"
	"testing"
)

// Public narrowing keeps bytes; only an explicit compaction reclaims them.
func TestRepoCompactStore(t *testing.T) {
	r, err := Create(filepath.Join(t.TempDir(), "compact.fossil"), CreateOpts{User: "test"})
	if err != nil {
		t.Fatal(err)
	}
	defer r.Close()
	_, _, err = r.Commit(CommitOpts{Files: []FileToCommit{
		{Name: "docs/out", Content: []byte("outside")},
		{Name: "src/in", Content: []byte("inside")},
	}, Comment: "files", User: "test"})
	if err != nil {
		t.Fatal(err)
	}
	// Simulate acknowledged publication. Compaction protects unpublished bytes.
	if _, err := r.DB().Exec("DELETE FROM unsent"); err != nil {
		t.Fatal(err)
	}
	c, err := NewCone([]string{"src"}, nil)
	if err != nil {
		t.Fatal(err)
	}
	if err := r.SetStoreCone(c); err != nil {
		t.Fatal(err)
	}
	var before int
	if err := r.DB().QueryRow("SELECT count(*) FROM phantom").Scan(&before); err != nil {
		t.Fatal(err)
	}
	if before != 0 {
		t.Fatalf("narrowing created %d phantoms", before)
	}
	if n, err := r.CompactStore(context.Background()); err != nil || n != 1 {
		t.Fatalf("CompactStore = %d, %v; want 1, nil", n, err)
	}
	if n, err := r.CompactStore(context.Background()); err != nil || n != 0 {
		t.Fatalf("repeat CompactStore = %d, %v; want 0, nil", n, err)
	}
	ctx, cancel := context.WithCancel(context.Background())
	cancel()
	if n, err := r.CompactStore(ctx); n != 0 || !errors.Is(err, context.Canceled) {
		t.Fatalf("cancelled CompactStore = %d, %v", n, err)
	}
}