github.com/anchore/syft@v1.4.2-0.20240516191711-1bec1fc5d397/syft/cpe/by_specificity_test.go (about) 1 package cpe 2 3 import ( 4 "sort" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 ) 9 10 func Test_BySpecificity(t *testing.T) { 11 tests := []struct { 12 name string 13 input []Attributes 14 expected []Attributes 15 }{ 16 { 17 name: "sort strictly by wfn *", 18 input: []Attributes{ 19 MustAttributes("cpe:2.3:a:*:package:1:*:*:*:*:*:*:*"), 20 MustAttributes("cpe:2.3:a:some:package:1:*:*:*:*:*:*:*"), 21 MustAttributes("cpe:2.3:a:*:package:1:*:*:*:*:some:*:*"), 22 MustAttributes("cpe:2.3:a:some:package:1:*:*:*:*:some:*:*"), 23 MustAttributes("cpe:2.3:a:some:package:*:*:*:*:*:*:*:*"), 24 }, 25 expected: []Attributes{ 26 MustAttributes("cpe:2.3:a:some:package:1:*:*:*:*:some:*:*"), 27 MustAttributes("cpe:2.3:a:some:package:1:*:*:*:*:*:*:*"), 28 MustAttributes("cpe:2.3:a:some:package:*:*:*:*:*:*:*:*"), 29 MustAttributes("cpe:2.3:a:*:package:1:*:*:*:*:some:*:*"), 30 MustAttributes("cpe:2.3:a:*:package:1:*:*:*:*:*:*:*"), 31 }, 32 }, 33 { 34 name: "sort strictly by field length", 35 input: []Attributes{ 36 MustAttributes("cpe:2.3:a:1:22:1:*:*:*:*:1:*:*"), 37 MustAttributes("cpe:2.3:a:55555:1:1:*:*:*:*:1:*:*"), 38 MustAttributes("cpe:2.3:a:1:1:333:*:*:*:*:1:*:*"), 39 MustAttributes("cpe:2.3:a:1:666666:1:*:*:*:*:1:*:*"), 40 MustAttributes("cpe:2.3:a:1:1:1:*:*:*:*:1:*:*"), 41 MustAttributes("cpe:2.3:a:1:1:1:*:*:*:*:4444:*:*"), 42 }, 43 expected: []Attributes{ 44 MustAttributes("cpe:2.3:a:1:666666:1:*:*:*:*:1:*:*"), 45 MustAttributes("cpe:2.3:a:55555:1:1:*:*:*:*:1:*:*"), 46 MustAttributes("cpe:2.3:a:1:1:1:*:*:*:*:4444:*:*"), 47 MustAttributes("cpe:2.3:a:1:1:333:*:*:*:*:1:*:*"), 48 MustAttributes("cpe:2.3:a:1:22:1:*:*:*:*:1:*:*"), 49 MustAttributes("cpe:2.3:a:1:1:1:*:*:*:*:1:*:*"), 50 }, 51 }, 52 { 53 name: "sort by mix of field length and specificity", 54 input: []Attributes{ 55 MustAttributes("cpe:2.3:a:1:666666:*:*:*:*:*:1:*:*"), 56 MustAttributes("cpe:2.3:a:*:1:1:*:*:*:*:4444:*:*"), 57 MustAttributes("cpe:2.3:a:1:*:333:*:*:*:*:*:*:*"), 58 MustAttributes("cpe:2.3:a:1:1:1:*:*:*:*:1:*:*"), 59 MustAttributes("cpe:2.3:a:1:22:1:*:*:*:*:1:*:*"), 60 MustAttributes("cpe:2.3:a:55555:1:1:*:*:*:*:1:*:*"), 61 }, 62 expected: []Attributes{ 63 MustAttributes("cpe:2.3:a:55555:1:1:*:*:*:*:1:*:*"), 64 MustAttributes("cpe:2.3:a:1:22:1:*:*:*:*:1:*:*"), 65 MustAttributes("cpe:2.3:a:1:1:1:*:*:*:*:1:*:*"), 66 MustAttributes("cpe:2.3:a:1:666666:*:*:*:*:*:1:*:*"), 67 MustAttributes("cpe:2.3:a:*:1:1:*:*:*:*:4444:*:*"), 68 MustAttributes("cpe:2.3:a:1:*:333:*:*:*:*:*:*:*"), 69 }, 70 }, 71 { 72 name: "sort by mix of field length, specificity, dash", 73 input: []Attributes{ 74 MustAttributes("cpe:2.3:a:alpine:alpine_keys:2.3-r1:*:*:*:*:*:*:*"), 75 MustAttributes("cpe:2.3:a:alpine_keys:alpine_keys:2.3-r1:*:*:*:*:*:*:*"), 76 MustAttributes("cpe:2.3:a:alpine-keys:alpine_keys:2.3-r1:*:*:*:*:*:*:*"), 77 MustAttributes("cpe:2.3:a:alpine:alpine-keys:2.3-r1:*:*:*:*:*:*:*"), 78 MustAttributes("cpe:2.3:a:alpine-keys:alpine-keys:2.3-r1:*:*:*:*:*:*:*"), 79 MustAttributes("cpe:2.3:a:alpine_keys:alpine-keys:2.3-r1:*:*:*:*:*:*:*"), 80 }, 81 expected: []Attributes{ 82 MustAttributes("cpe:2.3:a:alpine-keys:alpine-keys:2.3-r1:*:*:*:*:*:*:*"), 83 MustAttributes("cpe:2.3:a:alpine-keys:alpine_keys:2.3-r1:*:*:*:*:*:*:*"), 84 MustAttributes("cpe:2.3:a:alpine_keys:alpine-keys:2.3-r1:*:*:*:*:*:*:*"), 85 MustAttributes("cpe:2.3:a:alpine_keys:alpine_keys:2.3-r1:*:*:*:*:*:*:*"), 86 MustAttributes("cpe:2.3:a:alpine:alpine-keys:2.3-r1:*:*:*:*:*:*:*"), 87 MustAttributes("cpe:2.3:a:alpine:alpine_keys:2.3-r1:*:*:*:*:*:*:*"), 88 }, 89 }, 90 } 91 92 for _, test := range tests { 93 t.Run(test.name, func(t *testing.T) { 94 sort.Sort(BySpecificity(test.input)) 95 assert.Equal(t, test.expected, test.input) 96 }) 97 } 98 }