// SPDX-License-Identifier: GPL-3.0-or-later package kwcache import ( "os" "path/filepath" "testing" ) // FuzzLoad: a cache file of any content loads as a usable cache - never // nil, never a panic - and one that reports an error answers nothing. Its // answers can then be saved again. func FuzzLoad(f *testing.F) { seed := New("fp") seed.Store(a, map[string]bool{"k:acme": true, "k:x": false}) path := filepath.Join(f.TempDir(), "seed.cache") if err := seed.Save(path, []ID{a}); err != nil { f.Fatal(err) } good, err := os.ReadFile(path) if err != nil { f.Fatal(err) } f.Add(good) f.Add([]byte(`{"version":1,"fingerprint":"fp","keywords":[["b","a"]],"files":[{"dev":1,"ino":10,"size":100,"mtime":1000,"keywords":0,"hits":[5]}]}`)) f.Add([]byte(`{"version":1,"fingerprint":"fp","keywords":[],"files":[{"dev":1,"ino":10,"size":100,"mtime":1000,"keywords":-1,"hits":[]}]}`)) f.Add([]byte("{}")) f.Add([]byte("null")) f.Fuzz(func(t *testing.T, data []byte) { p := filepath.Join(t.TempDir(), "dl.cache") if err := os.WriteFile(p, data, 0o600); err != nil { t.Fatal(err) } c, err := Load(p, "fp") if c == nil { t.Fatal("Load returned a nil cache") } hits, ok := c.Lookup(a, []string{"k:acme", "k:x"}) if ok && len(hits) != 2 { t.Fatalf("Lookup answered %d of 2 keywords", len(hits)) } if err != nil && ok { t.Fatalf("a cache that failed to load (%v) answered", err) } if err := c.Save(filepath.Join(t.TempDir(), "out.cache"), []ID{a, b}); err != nil { t.Fatal(err) } }) }