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  }