Artifact 9518305268724b005d6026698c09bc1145b2567cfb095e387f9af69bc3c6fa90:
- File
internal/content/cone_reference_retention_test.go
— part of check-in
[a3c6ddef9a]
at
2026-10-21 01:03:53
on branch feat/submanifest-reader
— fix(content): bound and prune sparse reference facts
Use metadata preflight and fixed-size inflation for ordinary reference discovery too. Bound artifacts, parser cards, stored bytes and declared expansions before payload and parser allocations. Preserve unknown retention for corrupt compression.
Retain only classification fields and structural identities, copying kept tokens so discarded wiki/forum bodies, cluster inventories and metadata cannot be pinned. Compare empty and large-body fixtures and reject oversized expansion reservations. (user: [email protected], size: 2186) [annotate] [blame] [check-ins using] [more...]
package content import ( "bytes" "context" "fmt" "sort" "testing" "time" "github.com/danmestas/go-libfossil/internal/blob" "github.com/danmestas/go-libfossil/internal/deck" "github.com/danmestas/go-libfossil/internal/hash" ) // Keep classification facts, not full wiki/forum payloads or cluster inventories. // Increasing those irrelevant fields must not increase retained deck storage. func TestConeReferenceFactsDiscardIrrelevantPayloads(t *testing.T) { d := setupTestDB(t) var artifacts []*deck.Deck for _, size := range []int{0, 1 << 20} { body := bytes.Repeat([]byte("w"), size) artifacts = append(artifacts, &deck.Deck{L: "wiki", D: time.Now().UTC(), U: deck.User("u"), W: body}, &deck.Deck{H: "forum", D: time.Now().UTC(), U: deck.User("u"), W: body}) } var members []string for i := 0; i < 2000; i++ { members = append(members, hash.SHA1([]byte(fmt.Sprint(i)))) } sort.Strings(members) artifacts = append(artifacts, &deck.Deck{M: members}) for _, item := range artifacts { data, err := item.Marshal() if err != nil { t.Fatal(err) } if _, _, err := blob.Store(d, data); err != nil { t.Fatal(err) } } facts, err := LoadConeReferenceFacts(context.Background(), d) if err != nil { t.Fatal(err) } if len(facts.records) != len(artifacts) { t.Fatalf("parsed records=%d want%d", len(facts.records), len(artifacts)) } for _, record := range facts.records { d := record.deck if len(d.W) != 0 || len(d.M) != 0 || d.L != "" || d.H != "" { t.Fatalf("retained irrelevant payload: W=%d M=%d L=%q H=%q", len(d.W), len(d.M), d.L, d.H) } } } // Ordinary discovery also rejects an expansion reservation above its bound // before inflation/parser work; it must not reserve memory from a lying size. func TestConeReferenceFactsOrdinaryPreflightBound(t *testing.T) { d := setupTestDB(t) rid, _, err := blob.Store(d, []byte("small stored bytes")) if err != nil { t.Fatal(err) } if _, err := d.Exec("UPDATE blob SET size=? WHERE rid=?", int64(1<<30), rid); err != nil { t.Fatal(err) } if _, err := LoadConeReferenceFacts(context.Background(), d); err == nil { t.Fatal("ordinary loader ignored expansion budget") } }