@@ -247,7 +247,7 @@ func Test_cyclonedxParser_addRootPackage(t *testing.T) {
247
247
},
248
248
},
249
249
},
250
- wantPurl : "pkg:guac/files /sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870#/home/work/test/build/webserver" ,
250
+ wantPurl : "pkg:guac/cdx /sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870#/home/work/test/build/webserver" ,
251
251
}, {
252
252
name : "file type - purl nor provided, version not provided" ,
253
253
cdxBom : & cdx.BOM {
@@ -258,7 +258,7 @@ func Test_cyclonedxParser_addRootPackage(t *testing.T) {
258
258
},
259
259
},
260
260
},
261
- wantPurl : "pkg:guac/files /home/work/test/build/webserver" ,
261
+ wantPurl : "pkg:guac/cdx /home/work/test/build/webserver" ,
262
262
}}
263
263
for _ , tt := range tests {
264
264
t .Run (tt .name , func (t * testing.T ) {
@@ -287,3 +287,163 @@ func Test_cyclonedxParser_addRootPackage(t *testing.T) {
287
287
})
288
288
}
289
289
}
290
+
291
+ func Test_cyclonedxParser_getComponentPackages (t * testing.T ) {
292
+ tests := []struct {
293
+ name string
294
+ cdxBom * cdx.BOM
295
+ wantPurl string
296
+ }{{
297
+ name : "purl provided" ,
298
+ cdxBom : & cdx.BOM {
299
+ Components : & []cdx.Component {{
300
+ Name : "gcr.io/distroless/static:nonroot" ,
301
+ Type : cdx .ComponentTypeContainer ,
302
+ Version : "sha256:6ad5b696af3ca05a048bd29bf0f623040462638cb0b29c8d702cbb2805687388" ,
303
+ PackageURL : "pkg:oci/static@sha256:6ad5b696af3ca05a048bd29bf0f623040462638cb0b29c8d702cbb2805687388?repository_url=gcr.io/distroless/static&tag=nonroot" ,
304
+ }},
305
+ },
306
+ wantPurl : "pkg:oci/static@sha256:6ad5b696af3ca05a048bd29bf0f623040462638cb0b29c8d702cbb2805687388?repository_url=gcr.io/distroless/static&tag=nonroot" ,
307
+ }, {
308
+ name : "gcr.io/distroless/static:nonroot - purl not provided" ,
309
+ cdxBom : & cdx.BOM {
310
+ Components : & []cdx.Component {{
311
+ Name : "gcr.io/distroless/static:nonroot" ,
312
+ Type : cdx .ComponentTypeContainer ,
313
+ Version : "sha256:6ad5b696af3ca05a048bd29bf0f623040462638cb0b29c8d702cbb2805687388" ,
314
+ }},
315
+ },
316
+ wantPurl : "pkg:guac/pkg/gcr.io/distroless/static@sha256:6ad5b696af3ca05a048bd29bf0f623040462638cb0b29c8d702cbb2805687388?tag=nonroot" ,
317
+ }, {
318
+ name : "gcr.io/distroless/static - purl not provided, tag not specified" ,
319
+
320
+ cdxBom : & cdx.BOM {
321
+ Components : & []cdx.Component {{
322
+ Name : "gcr.io/distroless/static" ,
323
+ Type : cdx .ComponentTypeContainer ,
324
+ Version : "sha256:6ad5b696af3ca05a048bd29bf0f623040462638cb0b29c8d702cbb2805687388" ,
325
+ }},
326
+ },
327
+ wantPurl : "pkg:guac/pkg/gcr.io/distroless/static@sha256:6ad5b696af3ca05a048bd29bf0f623040462638cb0b29c8d702cbb2805687388?tag=" ,
328
+ }, {
329
+ name : "gcr.io/distroless/static - purl not provided, tag not specified, version not specified" ,
330
+
331
+ cdxBom : & cdx.BOM {
332
+ Components : & []cdx.Component {{
333
+ Name : "gcr.io/distroless/static" ,
334
+ Type : cdx .ComponentTypeContainer ,
335
+ }},
336
+ },
337
+ wantPurl : "pkg:guac/pkg/gcr.io/distroless/static@?tag=" ,
338
+ }, {
339
+ name : "library/debian:latest - purl not provided, assume docker.io" ,
340
+
341
+ cdxBom : & cdx.BOM {
342
+ Components : & []cdx.Component {{
343
+ Name : "library/debian:latest" ,
344
+ Type : cdx .ComponentTypeContainer ,
345
+ Version : "sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870" ,
346
+ }},
347
+ },
348
+ wantPurl : "pkg:guac/pkg/library/debian@sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870?tag=latest" ,
349
+ }, {
350
+ name : "library/debian - purl not provided, tag not specified" ,
351
+ cdxBom : & cdx.BOM {
352
+ Components : & []cdx.Component {{
353
+ Name : "library/debian" ,
354
+ Type : cdx .ComponentTypeContainer ,
355
+ Version : "sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870" ,
356
+ }},
357
+ },
358
+ wantPurl : "pkg:guac/pkg/library/debian@sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870?tag=" ,
359
+ }, {
360
+ name : "library - purl not provided, tag not specified" ,
361
+ cdxBom : & cdx.BOM {
362
+ Components : & []cdx.Component {{
363
+ Name : "library" ,
364
+ Type : cdx .ComponentTypeContainer ,
365
+ Version : "sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870" ,
366
+ }},
367
+ },
368
+ wantPurl : "pkg:guac/pkg/library@sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870?tag=" ,
369
+ }, {
370
+ name : "name split length too long, tag not specified" ,
371
+ cdxBom : & cdx.BOM {
372
+ Components : & []cdx.Component {{
373
+ Name : "ghcr.io/guacsec/guac/guacsec" ,
374
+ Type : cdx .ComponentTypeContainer ,
375
+ Version : "sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870" ,
376
+ }},
377
+ },
378
+ wantPurl : "pkg:guac/pkg/ghcr.io/guacsec/guac/guacsec@sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870" ,
379
+ }, {
380
+ name : "name contains local registry, tag specified" ,
381
+ cdxBom : & cdx.BOM {
382
+ Components : & []cdx.Component {{
383
+ Name : "foo.registry.com:4443/myapp/debian:latest" ,
384
+ Type : cdx .ComponentTypeContainer ,
385
+ Version : "sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870" ,
386
+ }},
387
+ },
388
+ wantPurl : "pkg:guac/pkg/foo.registry.com:4443/myapp/debian@sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870?tag=latest" ,
389
+ }, {
390
+ name : "ComponentTypeLibrary" ,
391
+
392
+ cdxBom : & cdx.BOM {
393
+ Components : & []cdx.Component {{
394
+ Name : "ghcr.io/guacsec/guac/guacsec" ,
395
+ Type : cdx .ComponentTypeLibrary ,
396
+ Version : "sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870" ,
397
+ }},
398
+ },
399
+ wantPurl : "pkg:guac/pkg/ghcr.io/guacsec/guac/guacsec@sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870" ,
400
+ }, {
401
+ name : "file type - purl nor provided, version provided" ,
402
+ cdxBom : & cdx.BOM {
403
+ Components : & []cdx.Component {{
404
+ Name : "/home/work/test/build/webserver" ,
405
+ Type : cdx .ComponentTypeFile ,
406
+ Version : "sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870" ,
407
+ }},
408
+ },
409
+ wantPurl : "pkg:guac/files/sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870#/home/work/test/build/webserver" ,
410
+ }, {
411
+ name : "file type - purl nor provided, version not provided" ,
412
+ cdxBom : & cdx.BOM {
413
+ Components : & []cdx.Component {{
414
+ Name : "/home/work/test/build/webserver" ,
415
+ Type : cdx .ComponentTypeFile ,
416
+ }},
417
+ },
418
+ wantPurl : "pkg:guac/files/home/work/test/build/webserver" ,
419
+ }}
420
+ for _ , tt := range tests {
421
+ t .Run (tt .name , func (t * testing.T ) {
422
+ c := & cyclonedxParser {
423
+ doc : & processor.Document {
424
+ SourceInformation : processor.SourceInformation {
425
+ Collector : "test" ,
426
+ Source : "test" ,
427
+ },
428
+ },
429
+ packagePackages : map [string ][]* model.PkgInputSpec {},
430
+ identifierStrings : & common.IdentifierStrings {},
431
+ }
432
+ c .cdxBom = tt .cdxBom
433
+ if err := c .getPackages (tt .cdxBom ); err != nil {
434
+ t .Errorf ("Failed to getTopLevelPackage %s" , err )
435
+ }
436
+ wantPackage , err := asmhelpers .PurlToPkg (tt .wantPurl )
437
+ if err != nil {
438
+ t .Errorf ("Failed to parse purl %v %v" , tt .wantPurl , err )
439
+ }
440
+ for _ , comp := range * tt .cdxBom .Components {
441
+ if d := cmp .Diff (* wantPackage , * c .packagePackages [comp .BOMRef ][0 ]); len (d ) != 0 {
442
+ t .Errorf ("addRootPackage failed to produce expected package for %v" , tt .name )
443
+ t .Errorf ("spdx.GetPredicate mismatch values (+got, -expected): %s" , d )
444
+ }
445
+ }
446
+
447
+ })
448
+ }
449
+ }
0 commit comments