1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2*ba677afaSXin Li 3*ba677afaSXin Lipackage saver2v1 4*ba677afaSXin Li 5*ba677afaSXin Liimport ( 6*ba677afaSXin Li "bytes" 7*ba677afaSXin Li "testing" 8*ba677afaSXin Li 9*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/common" 10*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/v2_1" 11*ba677afaSXin Li) 12*ba677afaSXin Li 13*ba677afaSXin Li// ===== entire Document Saver tests ===== 14*ba677afaSXin Lifunc TestSaver2_1DocumentSavesText(t *testing.T) { 15*ba677afaSXin Li 16*ba677afaSXin Li // Creation Info section 17*ba677afaSXin Li ci := &v2_1.CreationInfo{ 18*ba677afaSXin Li Creators: []common.Creator{ 19*ba677afaSXin Li {Creator: "John Doe", CreatorType: "Person"}, 20*ba677afaSXin Li }, 21*ba677afaSXin Li Created: "2018-10-10T06:20:00Z", 22*ba677afaSXin Li } 23*ba677afaSXin Li 24*ba677afaSXin Li // unpackaged files 25*ba677afaSXin Li f1 := &v2_1.File{ 26*ba677afaSXin Li FileName: "/tmp/whatever1.txt", 27*ba677afaSXin Li FileSPDXIdentifier: common.ElementID("File1231"), 28*ba677afaSXin Li Checksums: []common.Checksum{{Value: "85ed0817af83a24ad8da68c2b5094de69833983c", Algorithm: common.SHA1}}, 29*ba677afaSXin Li LicenseConcluded: "Apache-2.0", 30*ba677afaSXin Li LicenseInfoInFiles: []string{"Apache-2.0"}, 31*ba677afaSXin Li FileCopyrightText: "Copyright (c) Jane Doe", 32*ba677afaSXin Li } 33*ba677afaSXin Li 34*ba677afaSXin Li f2 := &v2_1.File{ 35*ba677afaSXin Li FileName: "/tmp/whatever2.txt", 36*ba677afaSXin Li FileSPDXIdentifier: common.ElementID("File1232"), 37*ba677afaSXin Li Checksums: []common.Checksum{{Value: "85ed0817af83a24ad8da68c2b5094de69833983d", Algorithm: common.SHA1}}, 38*ba677afaSXin Li LicenseConcluded: "MIT", 39*ba677afaSXin Li LicenseInfoInFiles: []string{"MIT"}, 40*ba677afaSXin Li FileCopyrightText: "Copyright (c) John Doe", 41*ba677afaSXin Li } 42*ba677afaSXin Li 43*ba677afaSXin Li unFiles := []*v2_1.File{ 44*ba677afaSXin Li f1, 45*ba677afaSXin Li f2, 46*ba677afaSXin Li } 47*ba677afaSXin Li 48*ba677afaSXin Li // Package 1: packaged files with snippets 49*ba677afaSXin Li sn1 := &v2_1.Snippet{ 50*ba677afaSXin Li SnippetSPDXIdentifier: "Snippet19", 51*ba677afaSXin Li SnippetFromFileSPDXIdentifier: common.MakeDocElementID("", "FileHasSnippets").ElementRefID, 52*ba677afaSXin Li Ranges: []common.SnippetRange{{StartPointer: common.SnippetRangePointer{Offset: 17}, EndPointer: common.SnippetRangePointer{Offset: 209}}}, 53*ba677afaSXin Li SnippetLicenseConcluded: "GPL-2.0-or-later", 54*ba677afaSXin Li SnippetCopyrightText: "Copyright (c) John Doe 20x6", 55*ba677afaSXin Li } 56*ba677afaSXin Li 57*ba677afaSXin Li sn2 := &v2_1.Snippet{ 58*ba677afaSXin Li SnippetSPDXIdentifier: "Snippet20", 59*ba677afaSXin Li SnippetFromFileSPDXIdentifier: common.MakeDocElementID("", "FileHasSnippets").ElementRefID, 60*ba677afaSXin Li Ranges: []common.SnippetRange{{StartPointer: common.SnippetRangePointer{Offset: 268}, EndPointer: common.SnippetRangePointer{Offset: 309}}}, 61*ba677afaSXin Li SnippetLicenseConcluded: "WTFPL", 62*ba677afaSXin Li SnippetCopyrightText: "NOASSERTION", 63*ba677afaSXin Li } 64*ba677afaSXin Li 65*ba677afaSXin Li f3 := &v2_1.File{ 66*ba677afaSXin Li FileName: "/tmp/file-with-snippets.txt", 67*ba677afaSXin Li FileSPDXIdentifier: common.ElementID("FileHasSnippets"), 68*ba677afaSXin Li Checksums: []common.Checksum{{Value: "85ed0817af83a24ad8da68c2b5094de69833983e", Algorithm: common.SHA1}}, 69*ba677afaSXin Li LicenseConcluded: "GPL-2.0-or-later AND WTFPL", 70*ba677afaSXin Li LicenseInfoInFiles: []string{ 71*ba677afaSXin Li "Apache-2.0", 72*ba677afaSXin Li "GPL-2.0-or-later", 73*ba677afaSXin Li "WTFPL", 74*ba677afaSXin Li }, 75*ba677afaSXin Li FileCopyrightText: "Copyright (c) Jane Doe", 76*ba677afaSXin Li Snippets: map[common.ElementID]*v2_1.Snippet{ 77*ba677afaSXin Li common.ElementID("Snippet19"): sn1, 78*ba677afaSXin Li common.ElementID("Snippet20"): sn2, 79*ba677afaSXin Li }, 80*ba677afaSXin Li } 81*ba677afaSXin Li 82*ba677afaSXin Li f4 := &v2_1.File{ 83*ba677afaSXin Li FileName: "/tmp/another-file.txt", 84*ba677afaSXin Li FileSPDXIdentifier: common.ElementID("FileAnother"), 85*ba677afaSXin Li Checksums: []common.Checksum{{Value: "85ed0817af83a24ad8da68c2b5094de69833983f", Algorithm: common.SHA1}}, 86*ba677afaSXin Li LicenseConcluded: "BSD-3-Clause", 87*ba677afaSXin Li LicenseInfoInFiles: []string{"BSD-3-Clause"}, 88*ba677afaSXin Li FileCopyrightText: "Copyright (c) Jane Doe LLC", 89*ba677afaSXin Li } 90*ba677afaSXin Li 91*ba677afaSXin Li pkgWith := &v2_1.Package{ 92*ba677afaSXin Li PackageName: "p1", 93*ba677afaSXin Li PackageSPDXIdentifier: common.ElementID("p1"), 94*ba677afaSXin Li PackageDownloadLocation: "http://example.com/p1/p1-0.1.0-master.tar.gz", 95*ba677afaSXin Li FilesAnalyzed: true, 96*ba677afaSXin Li IsFilesAnalyzedTagPresent: true, 97*ba677afaSXin Li PackageVerificationCode: common.PackageVerificationCode{Value: "0123456789abcdef0123456789abcdef01234567"}, 98*ba677afaSXin Li PackageLicenseConcluded: "GPL-2.0-or-later AND BSD-3-Clause AND WTFPL", 99*ba677afaSXin Li PackageLicenseInfoFromFiles: []string{ 100*ba677afaSXin Li "Apache-2.0", 101*ba677afaSXin Li "GPL-2.0-or-later", 102*ba677afaSXin Li "WTFPL", 103*ba677afaSXin Li "BSD-3-Clause", 104*ba677afaSXin Li }, 105*ba677afaSXin Li PackageLicenseDeclared: "Apache-2.0 OR GPL-2.0-or-later", 106*ba677afaSXin Li PackageCopyrightText: "Copyright (c) John Doe, Inc.", 107*ba677afaSXin Li Files: []*v2_1.File{ 108*ba677afaSXin Li f3, 109*ba677afaSXin Li f4, 110*ba677afaSXin Li }, 111*ba677afaSXin Li } 112*ba677afaSXin Li 113*ba677afaSXin Li // Other Licenses 1 and 2 114*ba677afaSXin Li ol1 := &v2_1.OtherLicense{ 115*ba677afaSXin Li LicenseIdentifier: "LicenseRef-1", 116*ba677afaSXin Li ExtractedText: `License 1 text 117*ba677afaSXin Liblah blah blah 118*ba677afaSXin Liblah blah blah blah`, 119*ba677afaSXin Li LicenseName: "License 1", 120*ba677afaSXin Li } 121*ba677afaSXin Li 122*ba677afaSXin Li ol2 := &v2_1.OtherLicense{ 123*ba677afaSXin Li LicenseIdentifier: "LicenseRef-2", 124*ba677afaSXin Li ExtractedText: `License 2 text - this is a license that does some stuff`, 125*ba677afaSXin Li LicenseName: "License 2", 126*ba677afaSXin Li } 127*ba677afaSXin Li 128*ba677afaSXin Li // Relationships 129*ba677afaSXin Li rln1 := &v2_1.Relationship{ 130*ba677afaSXin Li RefA: common.MakeDocElementID("", "DOCUMENT"), 131*ba677afaSXin Li RefB: common.MakeDocElementID("", "p1"), 132*ba677afaSXin Li Relationship: "DESCRIBES", 133*ba677afaSXin Li } 134*ba677afaSXin Li 135*ba677afaSXin Li rln2 := &v2_1.Relationship{ 136*ba677afaSXin Li RefA: common.MakeDocElementID("", "DOCUMENT"), 137*ba677afaSXin Li RefB: common.MakeDocElementID("", "File1231"), 138*ba677afaSXin Li Relationship: "DESCRIBES", 139*ba677afaSXin Li } 140*ba677afaSXin Li 141*ba677afaSXin Li rln3 := &v2_1.Relationship{ 142*ba677afaSXin Li RefA: common.MakeDocElementID("", "DOCUMENT"), 143*ba677afaSXin Li RefB: common.MakeDocElementID("", "File1232"), 144*ba677afaSXin Li Relationship: "DESCRIBES", 145*ba677afaSXin Li } 146*ba677afaSXin Li 147*ba677afaSXin Li // Annotations 148*ba677afaSXin Li ann1 := &v2_1.Annotation{ 149*ba677afaSXin Li Annotator: common.Annotator{Annotator: "John Doe", 150*ba677afaSXin Li AnnotatorType: "Person"}, 151*ba677afaSXin Li AnnotationDate: "2018-10-10T17:52:00Z", 152*ba677afaSXin Li AnnotationType: "REVIEW", 153*ba677afaSXin Li AnnotationSPDXIdentifier: common.MakeDocElementID("", "DOCUMENT"), 154*ba677afaSXin Li AnnotationComment: "This is an annotation about the SPDX document", 155*ba677afaSXin Li } 156*ba677afaSXin Li 157*ba677afaSXin Li ann2 := &v2_1.Annotation{ 158*ba677afaSXin Li Annotator: common.Annotator{Annotator: "John Doe, Inc.", 159*ba677afaSXin Li AnnotatorType: "Organization"}, 160*ba677afaSXin Li AnnotationDate: "2018-10-10T17:52:00Z", 161*ba677afaSXin Li AnnotationType: "REVIEW", 162*ba677afaSXin Li AnnotationSPDXIdentifier: common.MakeDocElementID("", "p1"), 163*ba677afaSXin Li AnnotationComment: "This is an annotation about Package p1", 164*ba677afaSXin Li } 165*ba677afaSXin Li 166*ba677afaSXin Li // Reviews 167*ba677afaSXin Li rev1 := &v2_1.Review{ 168*ba677afaSXin Li Reviewer: "John Doe", 169*ba677afaSXin Li ReviewerType: "Person", 170*ba677afaSXin Li ReviewDate: "2018-10-14T10:28:00Z", 171*ba677afaSXin Li } 172*ba677afaSXin Li rev2 := &v2_1.Review{ 173*ba677afaSXin Li Reviewer: "Jane Doe LLC", 174*ba677afaSXin Li ReviewerType: "Organization", 175*ba677afaSXin Li ReviewDate: "2018-10-14T10:28:00Z", 176*ba677afaSXin Li ReviewComment: "I have reviewed this SPDX document and it is awesome", 177*ba677afaSXin Li } 178*ba677afaSXin Li 179*ba677afaSXin Li // now, build the document 180*ba677afaSXin Li doc := &v2_1.Document{ 181*ba677afaSXin Li SPDXVersion: "SPDX-2.1", 182*ba677afaSXin Li DataLicense: "CC0-1.0", 183*ba677afaSXin Li SPDXIdentifier: common.ElementID("DOCUMENT"), 184*ba677afaSXin Li DocumentName: "spdx-go-0.0.1.abcdef", 185*ba677afaSXin Li DocumentNamespace: "https://github.com/swinslow/spdx-docs/spdx-go/spdx-go-0.0.1.abcdef.whatever", 186*ba677afaSXin Li CreationInfo: ci, 187*ba677afaSXin Li Packages: []*v2_1.Package{ 188*ba677afaSXin Li pkgWith, 189*ba677afaSXin Li }, 190*ba677afaSXin Li Files: unFiles, 191*ba677afaSXin Li OtherLicenses: []*v2_1.OtherLicense{ 192*ba677afaSXin Li ol1, 193*ba677afaSXin Li ol2, 194*ba677afaSXin Li }, 195*ba677afaSXin Li Relationships: []*v2_1.Relationship{ 196*ba677afaSXin Li rln1, 197*ba677afaSXin Li rln2, 198*ba677afaSXin Li rln3, 199*ba677afaSXin Li }, 200*ba677afaSXin Li Annotations: []*v2_1.Annotation{ 201*ba677afaSXin Li ann1, 202*ba677afaSXin Li ann2, 203*ba677afaSXin Li }, 204*ba677afaSXin Li Reviews: []*v2_1.Review{ 205*ba677afaSXin Li rev1, 206*ba677afaSXin Li rev2, 207*ba677afaSXin Li }, 208*ba677afaSXin Li } 209*ba677afaSXin Li 210*ba677afaSXin Li want := bytes.NewBufferString(`SPDXVersion: SPDX-2.1 211*ba677afaSXin LiDataLicense: CC0-1.0 212*ba677afaSXin LiSPDXID: SPDXRef-DOCUMENT 213*ba677afaSXin LiDocumentName: spdx-go-0.0.1.abcdef 214*ba677afaSXin LiDocumentNamespace: https://github.com/swinslow/spdx-docs/spdx-go/spdx-go-0.0.1.abcdef.whatever 215*ba677afaSXin LiCreator: Person: John Doe 216*ba677afaSXin LiCreated: 2018-10-10T06:20:00Z 217*ba677afaSXin Li 218*ba677afaSXin Li##### Unpackaged files 219*ba677afaSXin Li 220*ba677afaSXin LiFileName: /tmp/whatever1.txt 221*ba677afaSXin LiSPDXID: SPDXRef-File1231 222*ba677afaSXin LiFileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983c 223*ba677afaSXin LiLicenseConcluded: Apache-2.0 224*ba677afaSXin LiLicenseInfoInFile: Apache-2.0 225*ba677afaSXin LiFileCopyrightText: Copyright (c) Jane Doe 226*ba677afaSXin Li 227*ba677afaSXin LiFileName: /tmp/whatever2.txt 228*ba677afaSXin LiSPDXID: SPDXRef-File1232 229*ba677afaSXin LiFileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983d 230*ba677afaSXin LiLicenseConcluded: MIT 231*ba677afaSXin LiLicenseInfoInFile: MIT 232*ba677afaSXin LiFileCopyrightText: Copyright (c) John Doe 233*ba677afaSXin Li 234*ba677afaSXin Li##### Package: p1 235*ba677afaSXin Li 236*ba677afaSXin LiPackageName: p1 237*ba677afaSXin LiSPDXID: SPDXRef-p1 238*ba677afaSXin LiPackageDownloadLocation: http://example.com/p1/p1-0.1.0-master.tar.gz 239*ba677afaSXin LiFilesAnalyzed: true 240*ba677afaSXin LiPackageVerificationCode: 0123456789abcdef0123456789abcdef01234567 241*ba677afaSXin LiPackageLicenseConcluded: GPL-2.0-or-later AND BSD-3-Clause AND WTFPL 242*ba677afaSXin LiPackageLicenseInfoFromFiles: Apache-2.0 243*ba677afaSXin LiPackageLicenseInfoFromFiles: GPL-2.0-or-later 244*ba677afaSXin LiPackageLicenseInfoFromFiles: WTFPL 245*ba677afaSXin LiPackageLicenseInfoFromFiles: BSD-3-Clause 246*ba677afaSXin LiPackageLicenseDeclared: Apache-2.0 OR GPL-2.0-or-later 247*ba677afaSXin LiPackageCopyrightText: Copyright (c) John Doe, Inc. 248*ba677afaSXin Li 249*ba677afaSXin LiFileName: /tmp/another-file.txt 250*ba677afaSXin LiSPDXID: SPDXRef-FileAnother 251*ba677afaSXin LiFileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983f 252*ba677afaSXin LiLicenseConcluded: BSD-3-Clause 253*ba677afaSXin LiLicenseInfoInFile: BSD-3-Clause 254*ba677afaSXin LiFileCopyrightText: Copyright (c) Jane Doe LLC 255*ba677afaSXin Li 256*ba677afaSXin LiFileName: /tmp/file-with-snippets.txt 257*ba677afaSXin LiSPDXID: SPDXRef-FileHasSnippets 258*ba677afaSXin LiFileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983e 259*ba677afaSXin LiLicenseConcluded: GPL-2.0-or-later AND WTFPL 260*ba677afaSXin LiLicenseInfoInFile: Apache-2.0 261*ba677afaSXin LiLicenseInfoInFile: GPL-2.0-or-later 262*ba677afaSXin LiLicenseInfoInFile: WTFPL 263*ba677afaSXin LiFileCopyrightText: Copyright (c) Jane Doe 264*ba677afaSXin Li 265*ba677afaSXin LiSnippetSPDXID: SPDXRef-Snippet19 266*ba677afaSXin LiSnippetFromFileSPDXID: SPDXRef-FileHasSnippets 267*ba677afaSXin LiSnippetByteRange: 17:209 268*ba677afaSXin LiSnippetLicenseConcluded: GPL-2.0-or-later 269*ba677afaSXin LiSnippetCopyrightText: Copyright (c) John Doe 20x6 270*ba677afaSXin Li 271*ba677afaSXin LiSnippetSPDXID: SPDXRef-Snippet20 272*ba677afaSXin LiSnippetFromFileSPDXID: SPDXRef-FileHasSnippets 273*ba677afaSXin LiSnippetByteRange: 268:309 274*ba677afaSXin LiSnippetLicenseConcluded: WTFPL 275*ba677afaSXin LiSnippetCopyrightText: NOASSERTION 276*ba677afaSXin Li 277*ba677afaSXin Li##### Other Licenses 278*ba677afaSXin Li 279*ba677afaSXin LiLicenseID: LicenseRef-1 280*ba677afaSXin LiExtractedText: <text>License 1 text 281*ba677afaSXin Liblah blah blah 282*ba677afaSXin Liblah blah blah blah</text> 283*ba677afaSXin LiLicenseName: License 1 284*ba677afaSXin Li 285*ba677afaSXin LiLicenseID: LicenseRef-2 286*ba677afaSXin LiExtractedText: License 2 text - this is a license that does some stuff 287*ba677afaSXin LiLicenseName: License 2 288*ba677afaSXin Li 289*ba677afaSXin Li##### Relationships 290*ba677afaSXin Li 291*ba677afaSXin LiRelationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-p1 292*ba677afaSXin LiRelationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-File1231 293*ba677afaSXin LiRelationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-File1232 294*ba677afaSXin Li 295*ba677afaSXin Li##### Annotations 296*ba677afaSXin Li 297*ba677afaSXin LiAnnotator: Person: John Doe 298*ba677afaSXin LiAnnotationDate: 2018-10-10T17:52:00Z 299*ba677afaSXin LiAnnotationType: REVIEW 300*ba677afaSXin LiSPDXREF: SPDXRef-DOCUMENT 301*ba677afaSXin LiAnnotationComment: This is an annotation about the SPDX document 302*ba677afaSXin Li 303*ba677afaSXin LiAnnotator: Organization: John Doe, Inc. 304*ba677afaSXin LiAnnotationDate: 2018-10-10T17:52:00Z 305*ba677afaSXin LiAnnotationType: REVIEW 306*ba677afaSXin LiSPDXREF: SPDXRef-p1 307*ba677afaSXin LiAnnotationComment: This is an annotation about Package p1 308*ba677afaSXin Li 309*ba677afaSXin Li##### Reviews 310*ba677afaSXin Li 311*ba677afaSXin LiReviewer: Person: John Doe 312*ba677afaSXin LiReviewDate: 2018-10-14T10:28:00Z 313*ba677afaSXin Li 314*ba677afaSXin LiReviewer: Organization: Jane Doe LLC 315*ba677afaSXin LiReviewDate: 2018-10-14T10:28:00Z 316*ba677afaSXin LiReviewComment: I have reviewed this SPDX document and it is awesome 317*ba677afaSXin Li 318*ba677afaSXin Li`) 319*ba677afaSXin Li 320*ba677afaSXin Li // render as buffer of bytes 321*ba677afaSXin Li var got bytes.Buffer 322*ba677afaSXin Li err := RenderDocument2_1(doc, &got) 323*ba677afaSXin Li if err != nil { 324*ba677afaSXin Li t.Errorf("Expected nil error, got %v", err) 325*ba677afaSXin Li } 326*ba677afaSXin Li 327*ba677afaSXin Li // check that they match 328*ba677afaSXin Li c := bytes.Compare(want.Bytes(), got.Bytes()) 329*ba677afaSXin Li if c != 0 { 330*ba677afaSXin Li t.Errorf("Expected {{{%v}}}, got {{{%v}}}", want.String(), got.String()) 331*ba677afaSXin Li } 332*ba677afaSXin Li 333*ba677afaSXin Li} 334*ba677afaSXin Li 335*ba677afaSXin Lifunc TestSaver2_1DocumentReturnsErrorIfNilCreationInfo(t *testing.T) { 336*ba677afaSXin Li doc := &v2_1.Document{} 337*ba677afaSXin Li 338*ba677afaSXin Li var got bytes.Buffer 339*ba677afaSXin Li err := RenderDocument2_1(doc, &got) 340*ba677afaSXin Li if err == nil { 341*ba677afaSXin Li t.Errorf("Expected error, got nil") 342*ba677afaSXin Li } 343*ba677afaSXin Li} 344