github.com/nextlinux/gosbom@v0.81.1-0.20230627115839-1ff50c281391/gosbom/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 []CPE 14 expected []CPE 15 }{ 16 { 17 name: "sort strictly by wfn *", 18 input: []CPE{ 19 Must("cpe:2.3:a:*:package:1:*:*:*:*:*:*:*"), 20 Must("cpe:2.3:a:some:package:1:*:*:*:*:*:*:*"), 21 Must("cpe:2.3:a:*:package:1:*:*:*:*:some:*:*"), 22 Must("cpe:2.3:a:some:package:1:*:*:*:*:some:*:*"), 23 Must("cpe:2.3:a:some:package:*:*:*:*:*:*:*:*"), 24 }, 25 expected: []CPE{ 26 Must("cpe:2.3:a:some:package:1:*:*:*:*:some:*:*"), 27 Must("cpe:2.3:a:some:package:1:*:*:*:*:*:*:*"), 28 Must("cpe:2.3:a:some:package:*:*:*:*:*:*:*:*"), 29 Must("cpe:2.3:a:*:package:1:*:*:*:*:some:*:*"), 30 Must("cpe:2.3:a:*:package:1:*:*:*:*:*:*:*"), 31 }, 32 }, 33 { 34 name: "sort strictly by field length", 35 input: []CPE{ 36 Must("cpe:2.3:a:1:22:1:*:*:*:*:1:*:*"), 37 Must("cpe:2.3:a:55555:1:1:*:*:*:*:1:*:*"), 38 Must("cpe:2.3:a:1:1:333:*:*:*:*:1:*:*"), 39 Must("cpe:2.3:a:1:666666:1:*:*:*:*:1:*:*"), 40 Must("cpe:2.3:a:1:1:1:*:*:*:*:1:*:*"), 41 Must("cpe:2.3:a:1:1:1:*:*:*:*:4444:*:*"), 42 }, 43 expected: []CPE{ 44 Must("cpe:2.3:a:1:666666:1:*:*:*:*:1:*:*"), 45 Must("cpe:2.3:a:55555:1:1:*:*:*:*:1:*:*"), 46 Must("cpe:2.3:a:1:1:1:*:*:*:*:4444:*:*"), 47 Must("cpe:2.3:a:1:1:333:*:*:*:*:1:*:*"), 48 Must("cpe:2.3:a:1:22:1:*:*:*:*:1:*:*"), 49 Must("cpe:2.3:a:1:1:1:*:*:*:*:1:*:*"), 50 }, 51 }, 52 { 53 name: "sort by mix of field length and specificity", 54 input: []CPE{ 55 Must("cpe:2.3:a:1:666666:*:*:*:*:*:1:*:*"), 56 Must("cpe:2.3:a:*:1:1:*:*:*:*:4444:*:*"), 57 Must("cpe:2.3:a:1:*:333:*:*:*:*:*:*:*"), 58 Must("cpe:2.3:a:1:1:1:*:*:*:*:1:*:*"), 59 Must("cpe:2.3:a:1:22:1:*:*:*:*:1:*:*"), 60 Must("cpe:2.3:a:55555:1:1:*:*:*:*:1:*:*"), 61 }, 62 expected: []CPE{ 63 Must("cpe:2.3:a:55555:1:1:*:*:*:*:1:*:*"), 64 Must("cpe:2.3:a:1:22:1:*:*:*:*:1:*:*"), 65 Must("cpe:2.3:a:1:1:1:*:*:*:*:1:*:*"), 66 Must("cpe:2.3:a:1:666666:*:*:*:*:*:1:*:*"), 67 Must("cpe:2.3:a:*:1:1:*:*:*:*:4444:*:*"), 68 Must("cpe:2.3:a:1:*:333:*:*:*:*:*:*:*"), 69 }, 70 }, 71 { 72 name: "sort by mix of field length, specificity, dash", 73 input: []CPE{ 74 Must("cpe:2.3:a:alpine:alpine_keys:2.3-r1:*:*:*:*:*:*:*"), 75 Must("cpe:2.3:a:alpine_keys:alpine_keys:2.3-r1:*:*:*:*:*:*:*"), 76 Must("cpe:2.3:a:alpine-keys:alpine_keys:2.3-r1:*:*:*:*:*:*:*"), 77 Must("cpe:2.3:a:alpine:alpine-keys:2.3-r1:*:*:*:*:*:*:*"), 78 Must("cpe:2.3:a:alpine-keys:alpine-keys:2.3-r1:*:*:*:*:*:*:*"), 79 Must("cpe:2.3:a:alpine_keys:alpine-keys:2.3-r1:*:*:*:*:*:*:*"), 80 }, 81 expected: []CPE{ 82 Must("cpe:2.3:a:alpine-keys:alpine-keys:2.3-r1:*:*:*:*:*:*:*"), 83 Must("cpe:2.3:a:alpine-keys:alpine_keys:2.3-r1:*:*:*:*:*:*:*"), 84 Must("cpe:2.3:a:alpine_keys:alpine-keys:2.3-r1:*:*:*:*:*:*:*"), 85 Must("cpe:2.3:a:alpine_keys:alpine_keys:2.3-r1:*:*:*:*:*:*:*"), 86 Must("cpe:2.3:a:alpine:alpine-keys:2.3-r1:*:*:*:*:*:*:*"), 87 Must("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 }