github.com/anchore/syft@v1.38.2/internal/cache/resolver_test.go (about) 1 package cache 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "testing" 7 "time" 8 9 "github.com/stretchr/testify/require" 10 ) 11 12 func Test_Resolver(t *testing.T) { 13 original := GetManager() 14 defer SetManager(original) 15 SetManager(NewInMemory(time.Hour)) 16 17 type sub struct { 18 Name string 19 Value bool 20 } 21 22 type thing struct { 23 Value string 24 Values []int 25 Subs []*sub 26 } 27 28 versionHash := hashType[thing]() 29 cache := GetManager().GetCache("test", "v7/"+versionHash) 30 31 resolver := GetResolver[thing]("test", "v7") 32 require.NotNil(t, resolver) 33 34 require.IsType(t, &cacheResolver[thing]{}, resolver) 35 cr := resolver.(*cacheResolver[thing]) 36 37 require.IsType(t, cache, cr.cache) 38 39 resolveErrCount := 0 40 resolveThingErr := func() (thing, error) { 41 resolveErrCount++ 42 return thing{}, fmt.Errorf("an error") 43 } 44 45 _, err := resolver.Resolve("err", resolveThingErr) 46 require.ErrorContains(t, err, "an error") 47 require.Equal(t, 1, resolveErrCount) 48 49 _, err = resolver.Resolve("err", resolveThingErr) 50 require.ErrorContains(t, err, "an error") 51 require.Equal(t, 2, resolveErrCount) 52 53 aThing := thing{ 54 Value: "a value", 55 Values: []int{7, 8, 9}, 56 Subs: []*sub{ 57 { 58 Name: "sub1", 59 Value: true, 60 }, 61 { 62 Name: "sub2", 63 Value: false, 64 }, 65 }, 66 } 67 68 resolveThingCount := 0 69 resolveThing := func() (thing, error) { 70 resolveThingCount++ 71 return aThing, nil 72 } 73 74 val, err := resolver.Resolve("thing", resolveThing) 75 require.NoError(t, err) 76 require.Equal(t, 1, resolveThingCount) 77 require.Equal(t, aThing, val) 78 79 val, err = resolver.Resolve("thing", resolveThing) 80 require.NoError(t, err) 81 require.Equal(t, 1, resolveThingCount) 82 require.Equal(t, aThing, val) 83 84 rdr, err := cache.Read("thing" + resolverKeySuffix) 85 require.NoError(t, err) 86 decoder := json.NewDecoder(rdr) 87 88 var val2 thing 89 err = decoder.Decode(&val2) 90 require.NoError(t, err) 91 require.Equal(t, aThing, val2) 92 }