@@ -2,11 +2,13 @@ package bundleinstall_test
22
33import (
44 "bytes"
5+ "encoding/json"
56 "errors"
67 "fmt"
78 "io"
89 "os"
910 "path/filepath"
11+ "strings"
1012 "testing"
1113
1214 bundleinstall "github.com/paketo-buildpacks/bundle-install"
@@ -21,6 +23,91 @@ import (
2123 . "github.com/paketo-buildpacks/occam/matchers"
2224)
2325
26+ func assertCycloneDX (t * testing.T , content []byte ) {
27+ t .Helper ()
28+ Expect := NewWithT (t ).Expect
29+
30+ var document map [string ]interface {}
31+ Expect (json .Unmarshal (content , & document )).To (Succeed ())
32+ Expect (document ["$schema" ]).To (Equal ("http://cyclonedx.org/schema/bom-1.3.schema.json" ))
33+ Expect (document ["bomFormat" ]).To (Equal ("CycloneDX" ))
34+ Expect (document ["specVersion" ]).To (Equal ("1.3" ))
35+ Expect (document ["version" ]).To (BeEquivalentTo (1 ))
36+
37+ metadata , ok := document ["metadata" ].(map [string ]interface {})
38+ Expect (ok ).To (BeTrue ())
39+
40+ tools , ok := metadata ["tools" ].([]interface {})
41+ Expect (ok ).To (BeTrue ())
42+ Expect (tools ).NotTo (BeEmpty ())
43+
44+ tool , ok := tools [0 ].(map [string ]interface {})
45+ Expect (ok ).To (BeTrue ())
46+ Expect (tool ["name" ]).To (Equal ("" ))
47+ Expect (tool ["vendor" ]).To (Equal ("anchore" ))
48+ }
49+
50+ func assertSPDX (t * testing.T , content []byte ) {
51+ t .Helper ()
52+ Expect := NewWithT (t ).Expect
53+
54+ var document map [string ]interface {}
55+ Expect (json .Unmarshal (content , & document )).To (Succeed ())
56+ spdxID , ok := document ["SPDXID" ].(string )
57+ Expect (ok ).To (BeTrue ())
58+ Expect (spdxID == "SPDXRef-DOCUMENT" || spdxID == "SPDXRef-DocumentRoot-Unknown-" ).To (BeTrue ())
59+ Expect (document ["dataLicense" ]).To (Equal ("CC0-1.0" ))
60+ Expect (document ["name" ]).To (Equal ("unknown" ))
61+ Expect (document ["spdxVersion" ]).To (Equal ("SPDX-2.2" ))
62+
63+ documentNamespace , ok := document ["documentNamespace" ].(string )
64+ Expect (ok ).To (BeTrue ())
65+ Expect (
66+ strings .HasPrefix (documentNamespace , "https://paketo.io/packit/unknown-source-type/unknown-" ) ||
67+ strings .HasPrefix (documentNamespace , "https://paketo.io/unknown-source-type/unknown-" ),
68+ ).To (BeTrue ())
69+
70+ creationInfo , ok := document ["creationInfo" ].(map [string ]interface {})
71+ Expect (ok ).To (BeTrue ())
72+ creators , ok := creationInfo ["creators" ].([]interface {})
73+ Expect (ok ).To (BeTrue ())
74+ Expect (creators ).NotTo (BeEmpty ())
75+
76+ foundOrganizationCreator := false
77+ foundToolCreator := false
78+ for _ , creator := range creators {
79+ creatorString , ok := creator .(string )
80+ if ! ok {
81+ continue
82+ }
83+
84+ if creatorString == "Organization: Anchore, Inc" {
85+ foundOrganizationCreator = true
86+ }
87+
88+ if strings .HasPrefix (creatorString , "Tool:" ) {
89+ foundToolCreator = true
90+ }
91+ }
92+
93+ Expect (foundOrganizationCreator ).To (BeTrue ())
94+ Expect (foundToolCreator ).To (BeTrue ())
95+
96+ relationships , ok := document ["relationships" ].([]interface {})
97+ Expect (ok ).To (BeTrue ())
98+ Expect (relationships ).To (HaveLen (1 ))
99+
100+ relationship , ok := relationships [0 ].(map [string ]interface {})
101+ Expect (ok ).To (BeTrue ())
102+ Expect (relationship ["relationshipType" ]).To (Equal ("DESCRIBES" ))
103+ relatedElement , ok := relationship ["relatedSpdxElement" ].(string )
104+ Expect (ok ).To (BeTrue ())
105+ spdxElementID , ok := relationship ["spdxElementId" ].(string )
106+ Expect (ok ).To (BeTrue ())
107+ Expect (strings .HasPrefix (relatedElement , "SPDXRef-" )).To (BeTrue ())
108+ Expect (strings .HasPrefix (spdxElementID , "SPDXRef-" )).To (BeTrue ())
109+ }
110+
24111func testBuild (t * testing.T , context spec.G , it spec.S ) {
25112 var (
26113 Expect = NewWithT (t ).Expect
@@ -138,47 +225,12 @@ func testBuild(t *testing.T, context spec.G, it spec.S) {
138225 Expect (cdx .Extension ).To (Equal ("cdx.json" ))
139226 content , err := io .ReadAll (cdx .Content )
140227 Expect (err ).NotTo (HaveOccurred ())
141- Expect (string (content )).To (MatchJSON (`{
142- "bomFormat": "CycloneDX",
143- "components": [],
144- "metadata": {
145- "tools": [
146- {
147- "name": "syft",
148- "vendor": "anchore",
149- "version": "[not provided]"
150- }
151- ]
152- },
153- "specVersion": "1.3",
154- "version": 1
155- }` ))
228+ assertCycloneDX (t , content )
156229
157230 Expect (spdx .Extension ).To (Equal ("spdx.json" ))
158231 content , err = io .ReadAll (spdx .Content )
159232 Expect (err ).NotTo (HaveOccurred ())
160- Expect (string (content )).To (MatchJSON (`{
161- "SPDXID": "SPDXRef-DOCUMENT",
162- "creationInfo": {
163- "created": "0001-01-01T00:00:00Z",
164- "creators": [
165- "Organization: Anchore, Inc",
166- "Tool: syft-"
167- ],
168- "licenseListVersion": "3.16"
169- },
170- "dataLicense": "CC0-1.0",
171- "documentNamespace": "https://paketo.io/packit/unknown-source-type/unknown-88cfa225-65e0-5755-895f-c1c8f10fde76",
172- "name": "unknown",
173- "relationships": [
174- {
175- "relatedSpdxElement": "SPDXRef-DOCUMENT",
176- "relationshipType": "DESCRIBES",
177- "spdxElementId": "SPDXRef-DOCUMENT"
178- }
179- ],
180- "spdxVersion": "SPDX-2.2"
181- }` ))
233+ assertSPDX (t , content )
182234
183235 Expect (filepath .Join (workingDir , ".bundle" , "config" )).NotTo (BeAnExistingFile ())
184236 Expect (filepath .Join (workingDir , ".bundle" , "config.bak" )).NotTo (BeAnExistingFile ())
@@ -289,47 +341,12 @@ func testBuild(t *testing.T, context spec.G, it spec.S) {
289341 Expect (cdx .Extension ).To (Equal ("cdx.json" ))
290342 content , err := io .ReadAll (cdx .Content )
291343 Expect (err ).NotTo (HaveOccurred ())
292- Expect (string (content )).To (MatchJSON (`{
293- "bomFormat": "CycloneDX",
294- "components": [],
295- "metadata": {
296- "tools": [
297- {
298- "name": "syft",
299- "vendor": "anchore",
300- "version": "[not provided]"
301- }
302- ]
303- },
304- "specVersion": "1.3",
305- "version": 1
306- }` ))
344+ assertCycloneDX (t , content )
307345
308346 Expect (spdx .Extension ).To (Equal ("spdx.json" ))
309347 content , err = io .ReadAll (spdx .Content )
310348 Expect (err ).NotTo (HaveOccurred ())
311- Expect (string (content )).To (MatchJSON (`{
312- "SPDXID": "SPDXRef-DOCUMENT",
313- "creationInfo": {
314- "created": "0001-01-01T00:00:00Z",
315- "creators": [
316- "Organization: Anchore, Inc",
317- "Tool: syft-"
318- ],
319- "licenseListVersion": "3.16"
320- },
321- "dataLicense": "CC0-1.0",
322- "documentNamespace": "https://paketo.io/packit/unknown-source-type/unknown-88cfa225-65e0-5755-895f-c1c8f10fde76",
323- "name": "unknown",
324- "relationships": [
325- {
326- "relatedSpdxElement": "SPDXRef-DOCUMENT",
327- "relationshipType": "DESCRIBES",
328- "spdxElementId": "SPDXRef-DOCUMENT"
329- }
330- ],
331- "spdxVersion": "SPDX-2.2"
332- }` ))
349+ assertSPDX (t , content )
333350
334351 Expect (filepath .Join (workingDir , ".bundle" , "config" )).NotTo (BeAnExistingFile ())
335352
@@ -461,47 +478,12 @@ func testBuild(t *testing.T, context spec.G, it spec.S) {
461478 Expect (cdx .Extension ).To (Equal ("cdx.json" ))
462479 content , err := io .ReadAll (cdx .Content )
463480 Expect (err ).NotTo (HaveOccurred ())
464- Expect (string (content )).To (MatchJSON (`{
465- "bomFormat": "CycloneDX",
466- "components": [],
467- "metadata": {
468- "tools": [
469- {
470- "name": "syft",
471- "vendor": "anchore",
472- "version": "[not provided]"
473- }
474- ]
475- },
476- "specVersion": "1.3",
477- "version": 1
478- }` ))
481+ assertCycloneDX (t , content )
479482
480483 Expect (spdx .Extension ).To (Equal ("spdx.json" ))
481484 content , err = io .ReadAll (spdx .Content )
482485 Expect (err ).NotTo (HaveOccurred ())
483- Expect (string (content )).To (MatchJSON (`{
484- "SPDXID": "SPDXRef-DOCUMENT",
485- "creationInfo": {
486- "created": "0001-01-01T00:00:00Z",
487- "creators": [
488- "Organization: Anchore, Inc",
489- "Tool: syft-"
490- ],
491- "licenseListVersion": "3.16"
492- },
493- "dataLicense": "CC0-1.0",
494- "documentNamespace": "https://paketo.io/packit/unknown-source-type/unknown-88cfa225-65e0-5755-895f-c1c8f10fde76",
495- "name": "unknown",
496- "relationships": [
497- {
498- "relatedSpdxElement": "SPDXRef-DOCUMENT",
499- "relationshipType": "DESCRIBES",
500- "spdxElementId": "SPDXRef-DOCUMENT"
501- }
502- ],
503- "spdxVersion": "SPDX-2.2"
504- }` ))
486+ assertSPDX (t , content )
505487
506488 launchLayer := layers [1 ]
507489 Expect (launchLayer .Name ).To (Equal ("launch-gems" ))
@@ -531,47 +513,12 @@ func testBuild(t *testing.T, context spec.G, it spec.S) {
531513 Expect (cdx .Extension ).To (Equal ("cdx.json" ))
532514 content , err = io .ReadAll (cdx .Content )
533515 Expect (err ).NotTo (HaveOccurred ())
534- Expect (string (content )).To (MatchJSON (`{
535- "bomFormat": "CycloneDX",
536- "components": [],
537- "metadata": {
538- "tools": [
539- {
540- "name": "syft",
541- "vendor": "anchore",
542- "version": "[not provided]"
543- }
544- ]
545- },
546- "specVersion": "1.3",
547- "version": 1
548- }` ))
516+ assertCycloneDX (t , content )
549517
550518 Expect (spdx .Extension ).To (Equal ("spdx.json" ))
551519 content , err = io .ReadAll (spdx .Content )
552520 Expect (err ).NotTo (HaveOccurred ())
553- Expect (string (content )).To (MatchJSON (`{
554- "SPDXID": "SPDXRef-DOCUMENT",
555- "creationInfo": {
556- "created": "0001-01-01T00:00:00Z",
557- "creators": [
558- "Organization: Anchore, Inc",
559- "Tool: syft-"
560- ],
561- "licenseListVersion": "3.16"
562- },
563- "dataLicense": "CC0-1.0",
564- "documentNamespace": "https://paketo.io/packit/unknown-source-type/unknown-88cfa225-65e0-5755-895f-c1c8f10fde76",
565- "name": "unknown",
566- "relationships": [
567- {
568- "relatedSpdxElement": "SPDXRef-DOCUMENT",
569- "relationshipType": "DESCRIBES",
570- "spdxElementId": "SPDXRef-DOCUMENT"
571- }
572- ],
573- "spdxVersion": "SPDX-2.2"
574- }` ))
521+ assertSPDX (t , content )
575522
576523 content , err = os .ReadFile (filepath .Join (layersDir , "launch-gems" , "ruby" , "some-file" ))
577524 Expect (err ).NotTo (HaveOccurred ())
0 commit comments