github.com/anchore/syft@v1.38.2/syft/pkg/cataloger/binary/elf_package_test.go (about) 1 package binary 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/google/go-cmp/cmp" 8 "github.com/google/go-cmp/cmp/cmpopts" 9 "github.com/stretchr/testify/assert" 10 11 "github.com/anchore/syft/syft/file" 12 "github.com/anchore/syft/syft/pkg" 13 ) 14 15 func Test_packageURL(t *testing.T) { 16 tests := []struct { 17 name string 18 metadata elfBinaryPackageNotes 19 want string 20 }{ 21 { 22 name: "elf-binary-package-cataloger", 23 metadata: elfBinaryPackageNotes{ 24 Name: "github.com/anchore/syft", 25 Version: "v0.1.0", 26 ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{ 27 System: "syftsys", 28 }, 29 }, 30 want: "pkg:generic/syftsys/github.com%2Fanchore%2Fsyft@v0.1.0", 31 }, 32 { 33 name: "elf binary package short name", 34 metadata: elfBinaryPackageNotes{ 35 Name: "go.opencensus.io", 36 Version: "v0.23.0", 37 ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{ 38 System: "syftsys", 39 }, 40 }, 41 want: "pkg:generic/syftsys/go.opencensus.io@v0.23.0", 42 }, 43 { 44 name: "no info", 45 metadata: elfBinaryPackageNotes{ 46 Name: "test", 47 Version: "1.0", 48 ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{ 49 Type: "rpm", 50 }, 51 }, 52 want: "pkg:rpm/test@1.0", 53 }, 54 { 55 name: "with system", 56 metadata: elfBinaryPackageNotes{ 57 Name: "test", 58 Version: "1.0", 59 ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{ 60 Type: "rpm", 61 System: "system", 62 }, 63 }, 64 want: "pkg:rpm/system/test@1.0", 65 }, 66 { 67 name: "with os info preferred", 68 metadata: elfBinaryPackageNotes{ 69 Name: "test", 70 Version: "1.0", 71 ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{ 72 Type: "rpm", 73 OS: "fedora", 74 OSVersion: "2.0", 75 OSCPE: "cpe:/o:someone:redhat:3.0", 76 }, 77 }, 78 want: "pkg:rpm/fedora/test@1.0?distro=fedora-2.0", 79 }, 80 { 81 name: "with os info fallback to CPE parsing (missing version)", 82 metadata: elfBinaryPackageNotes{ 83 Name: "test", 84 Version: "1.0", 85 ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{ 86 Type: "rpm", 87 OS: "fedora", 88 OSCPE: "cpe:/o:someone:redhat:3.0", 89 }, 90 }, 91 want: "pkg:rpm/redhat/test@1.0?distro=redhat-3.0", 92 }, 93 { 94 name: "with os info preferred (missing OS)", 95 metadata: elfBinaryPackageNotes{ 96 Name: "test", 97 Version: "1.0", 98 ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{ 99 Type: "rpm", 100 OSVersion: "2.0", 101 OSCPE: "cpe:/o:someone:redhat:3.0", 102 }, 103 }, 104 want: "pkg:rpm/redhat/test@1.0?distro=redhat-3.0", 105 }, 106 { 107 name: "missing type", 108 metadata: elfBinaryPackageNotes{ 109 Name: "test", 110 Version: "1.0", 111 ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{ 112 System: "system", 113 }, 114 }, 115 want: "pkg:generic/system/test@1.0", 116 }, 117 { 118 name: "bad or missing OSCPE data cannot be parsed allows for correct string", 119 metadata: elfBinaryPackageNotes{ 120 Name: "test", 121 Version: "1.0", 122 ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{ 123 System: "system", 124 OSCPE: "%$#*(#*@&$(", 125 }, 126 }, 127 want: "pkg:generic/system/test@1.0", 128 }, 129 } 130 131 for _, test := range tests { 132 t.Run(test.name, func(t *testing.T) { 133 assert.Equal(t, test.want, elfPackageURL(test.metadata)) 134 }) 135 } 136 } 137 138 func Test_newELFPackage(t *testing.T) { 139 ctx := context.TODO() 140 tests := []struct { 141 name string 142 metadata elfBinaryPackageNotes 143 expected pkg.Package 144 }{ 145 { 146 name: "elf-binary-package-cataloger", 147 metadata: elfBinaryPackageNotes{ 148 Name: "syfttestfixture", 149 Version: "0.01", 150 PURL: "pkg:generic/syftsys/syfttestfixture@0.01", 151 CPE: "cpe:/o:syft:syftsys_testfixture_syfttestfixture:0.01", 152 ELFBinaryPackageNoteJSONPayload: pkg.ELFBinaryPackageNoteJSONPayload{ 153 Type: "binary", 154 System: "syftsys", 155 }, 156 }, 157 158 expected: pkg.Package{ 159 Name: "syfttestfixture", 160 Version: "0.01", 161 Type: "binary", 162 PURL: "pkg:generic/syftsys/syfttestfixture@0.01", 163 Metadata: pkg.ELFBinaryPackageNoteJSONPayload{ 164 Type: "binary", 165 System: "syftsys", 166 }, 167 }, 168 }, 169 } 170 171 for _, test := range tests { 172 t.Run(test.name, func(t *testing.T) { 173 actual := newELFPackage(ctx, test.metadata, file.NewLocationSet()) 174 if diff := cmp.Diff(test.expected, actual, cmpopts.IgnoreFields(pkg.Package{}, "id"), cmpopts.IgnoreUnexported(pkg.Package{}, file.LocationSet{}, pkg.LicenseSet{})); diff != "" { 175 t.Errorf("newELFPackage() mismatch (-want +got):\n%s", diff) 176 } 177 }) 178 } 179 }