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  }