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  }