github.com/google/osv-scalibr@v0.4.1/extractor/filesystem/language/cpp/conanlock/conanlock-v1_test.go (about) 1 // Copyright 2025 Google LLC 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package conanlock_test 16 17 import ( 18 "testing" 19 20 "github.com/google/go-cmp/cmp" 21 "github.com/google/go-cmp/cmp/cmpopts" 22 "github.com/google/osv-scalibr/extractor" 23 "github.com/google/osv-scalibr/extractor/filesystem/language/cpp/conanlock" 24 "github.com/google/osv-scalibr/extractor/filesystem/osv" 25 "github.com/google/osv-scalibr/inventory" 26 "github.com/google/osv-scalibr/purl" 27 "github.com/google/osv-scalibr/testing/extracttest" 28 ) 29 30 func TestExtractor_Extract_v1(t *testing.T) { 31 tests := []extracttest.TestTableEntry{ 32 { 33 Name: "invalid json", 34 InputConfig: extracttest.ScanInputMockConfig{ 35 Path: "testdata/not-json.txt", 36 }, 37 WantPackages: nil, 38 WantErr: extracttest.ContainsErrStr{Str: "could not extract"}, 39 }, 40 { 41 Name: "no packages", 42 InputConfig: extracttest.ScanInputMockConfig{ 43 Path: "testdata/empty.v1.json", 44 }, 45 WantPackages: []*extractor.Package{}, 46 }, 47 { 48 Name: "one package", 49 InputConfig: extracttest.ScanInputMockConfig{ 50 Path: "testdata/one-package.v1.json", 51 }, 52 WantPackages: []*extractor.Package{ 53 { 54 Name: "zlib", 55 Version: "1.2.11", 56 PURLType: purl.TypeConan, 57 Locations: []string{"testdata/one-package.v1.json"}, 58 Metadata: osv.DepGroupMetadata{ 59 DepGroupVals: []string{}, 60 }, 61 }, 62 }, 63 }, 64 { 65 Name: "no name", 66 InputConfig: extracttest.ScanInputMockConfig{ 67 Path: "testdata/no-name.v1.json", 68 }, 69 WantPackages: []*extractor.Package{ 70 { 71 Name: "zlib", 72 Version: "1.2.11", 73 PURLType: purl.TypeConan, 74 Locations: []string{"testdata/no-name.v1.json"}, 75 Metadata: osv.DepGroupMetadata{ 76 DepGroupVals: []string{}, 77 }, 78 }, 79 }, 80 }, 81 { 82 Name: "two packages", 83 InputConfig: extracttest.ScanInputMockConfig{ 84 Path: "testdata/two-packages.v1.json", 85 }, 86 WantPackages: []*extractor.Package{ 87 { 88 Name: "zlib", 89 Version: "1.2.11", 90 PURLType: purl.TypeConan, 91 Locations: []string{"testdata/two-packages.v1.json"}, 92 Metadata: osv.DepGroupMetadata{ 93 DepGroupVals: []string{}, 94 }, 95 }, 96 { 97 Name: "bzip2", 98 Version: "1.0.8", 99 PURLType: purl.TypeConan, 100 Locations: []string{"testdata/two-packages.v1.json"}, 101 Metadata: osv.DepGroupMetadata{ 102 DepGroupVals: []string{}, 103 }, 104 }, 105 }, 106 }, 107 { 108 Name: "nested dependencies", 109 InputConfig: extracttest.ScanInputMockConfig{ 110 Path: "testdata/nested-dependencies.v1.json", 111 }, 112 WantPackages: []*extractor.Package{ 113 { 114 Name: "zlib", 115 Version: "1.2.13", 116 PURLType: purl.TypeConan, 117 Locations: []string{"testdata/nested-dependencies.v1.json"}, 118 Metadata: osv.DepGroupMetadata{ 119 DepGroupVals: []string{}, 120 }, 121 }, 122 { 123 Name: "bzip2", 124 Version: "1.0.8", 125 PURLType: purl.TypeConan, 126 Locations: []string{"testdata/nested-dependencies.v1.json"}, 127 Metadata: osv.DepGroupMetadata{ 128 DepGroupVals: []string{}, 129 }, 130 }, 131 { 132 Name: "freetype", 133 Version: "2.12.1", 134 PURLType: purl.TypeConan, 135 Locations: []string{"testdata/nested-dependencies.v1.json"}, 136 Metadata: osv.DepGroupMetadata{ 137 DepGroupVals: []string{}, 138 }, 139 }, 140 { 141 Name: "libpng", 142 Version: "1.6.39", 143 PURLType: purl.TypeConan, 144 Locations: []string{"testdata/nested-dependencies.v1.json"}, 145 Metadata: osv.DepGroupMetadata{ 146 DepGroupVals: []string{}, 147 }, 148 }, 149 { 150 Name: "brotli", 151 Version: "1.0.9", 152 PURLType: purl.TypeConan, 153 Locations: []string{"testdata/nested-dependencies.v1.json"}, 154 Metadata: osv.DepGroupMetadata{ 155 DepGroupVals: []string{}, 156 }, 157 }, 158 }, 159 }, 160 { 161 Name: "one package dev", 162 InputConfig: extracttest.ScanInputMockConfig{ 163 Path: "testdata/one-package-dev.v1.json", 164 }, 165 WantPackages: []*extractor.Package{ 166 { 167 Name: "ninja", 168 Version: "1.11.1", 169 PURLType: purl.TypeConan, 170 Locations: []string{"testdata/one-package-dev.v1.json"}, 171 Metadata: osv.DepGroupMetadata{ 172 DepGroupVals: []string{}, 173 }, 174 }, 175 }, 176 }, 177 { 178 Name: "old format00", 179 InputConfig: extracttest.ScanInputMockConfig{ 180 Path: "testdata/old-format-0.0.json", 181 }, 182 WantPackages: []*extractor.Package{ 183 { 184 Name: "zlib", 185 Version: "1.2.11", 186 PURLType: purl.TypeConan, 187 Locations: []string{"testdata/old-format-0.0.json"}, 188 Metadata: osv.DepGroupMetadata{ 189 DepGroupVals: []string{}, 190 }, 191 }, 192 }, 193 }, 194 { 195 Name: "old format01", 196 InputConfig: extracttest.ScanInputMockConfig{ 197 Path: "testdata/old-format-0.1.json", 198 }, 199 WantPackages: []*extractor.Package{ 200 { 201 Name: "zlib", 202 Version: "1.2.11", 203 PURLType: purl.TypeConan, 204 Locations: []string{"testdata/old-format-0.1.json"}, 205 Metadata: osv.DepGroupMetadata{ 206 DepGroupVals: []string{}, 207 }, 208 }, 209 }, 210 }, 211 { 212 Name: "old format02", 213 InputConfig: extracttest.ScanInputMockConfig{ 214 Path: "testdata/old-format-0.2.json", 215 }, 216 WantPackages: []*extractor.Package{ 217 { 218 Name: "zlib", 219 Version: "1.2.11", 220 PURLType: purl.TypeConan, 221 Locations: []string{"testdata/old-format-0.2.json"}, 222 Metadata: osv.DepGroupMetadata{ 223 DepGroupVals: []string{}, 224 }, 225 }, 226 }, 227 }, 228 { 229 Name: "old format03", 230 InputConfig: extracttest.ScanInputMockConfig{ 231 Path: "testdata/old-format-0.3.json", 232 }, 233 WantPackages: []*extractor.Package{ 234 { 235 Name: "zlib", 236 Version: "1.2.11", 237 PURLType: purl.TypeConan, 238 Locations: []string{"testdata/old-format-0.3.json"}, 239 Metadata: osv.DepGroupMetadata{ 240 DepGroupVals: []string{}, 241 }, 242 }, 243 }, 244 }, 245 } 246 247 for _, tt := range tests { 248 t.Run(tt.Name, func(t *testing.T) { 249 extr := conanlock.Extractor{} 250 251 scanInput := extracttest.GenerateScanInputMock(t, tt.InputConfig) 252 defer extracttest.CloseTestScanInput(t, scanInput) 253 254 got, err := extr.Extract(t.Context(), &scanInput) 255 256 if diff := cmp.Diff(tt.WantErr, err, cmpopts.EquateErrors()); diff != "" { 257 t.Errorf("%s.Extract(%q) error diff (-want +got):\n%s", extr.Name(), tt.InputConfig.Path, diff) 258 return 259 } 260 261 wantInv := inventory.Inventory{Packages: tt.WantPackages} 262 if diff := cmp.Diff(wantInv, got, cmpopts.SortSlices(extracttest.PackageCmpLess)); diff != "" { 263 t.Errorf("%s.Extract(%q) diff (-want +got):\n%s", extr.Name(), tt.InputConfig.Path, diff) 264 } 265 }) 266 } 267 }