xref: /aosp_15_r20/external/spdx-tools/tvsaver/saver2v1/save_document_test.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
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