xref: /aosp_15_r20/external/spdx-tools/tvsaver/saver2v2/save_file_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 saver2v2
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_2"
11*ba677afaSXin Li)
12*ba677afaSXin Li
13*ba677afaSXin Li// ===== File section Saver tests =====
14*ba677afaSXin Lifunc TestSaver2_2FileSavesText(t *testing.T) {
15*ba677afaSXin Li	f := &v2_2.File{
16*ba677afaSXin Li		FileName:           "/tmp/whatever.txt",
17*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File123"),
18*ba677afaSXin Li		FileTypes: []string{
19*ba677afaSXin Li			"TEXT",
20*ba677afaSXin Li			"DOCUMENTATION",
21*ba677afaSXin Li		},
22*ba677afaSXin Li		Checksums: []common.Checksum{
23*ba677afaSXin Li			{Algorithm: common.SHA1, Value: "85ed0817af83a24ad8da68c2b5094de69833983c"},
24*ba677afaSXin Li			{Algorithm: common.SHA256, Value: "11b6d3ee554eedf79299905a98f9b9a04e498210b59f15094c916c91d150efcd"},
25*ba677afaSXin Li			{Algorithm: common.MD5, Value: "624c1abb3664f4b35547e7c73864ad24"},
26*ba677afaSXin Li		},
27*ba677afaSXin Li		LicenseConcluded: "Apache-2.0",
28*ba677afaSXin Li		LicenseInfoInFiles: []string{
29*ba677afaSXin Li			"Apache-2.0",
30*ba677afaSXin Li			"Apache-1.1",
31*ba677afaSXin Li		},
32*ba677afaSXin Li		LicenseComments:   "this is a license comment(s)",
33*ba677afaSXin Li		FileCopyrightText: "Copyright (c) Jane Doe",
34*ba677afaSXin Li		ArtifactOfProjects: []*v2_2.ArtifactOfProject{
35*ba677afaSXin Li			&v2_2.ArtifactOfProject{
36*ba677afaSXin Li				Name:     "project1",
37*ba677afaSXin Li				HomePage: "http://example.com/1/",
38*ba677afaSXin Li				URI:      "http://example.com/1/uri.whatever",
39*ba677afaSXin Li			},
40*ba677afaSXin Li			&v2_2.ArtifactOfProject{
41*ba677afaSXin Li				Name: "project2",
42*ba677afaSXin Li			},
43*ba677afaSXin Li			&v2_2.ArtifactOfProject{
44*ba677afaSXin Li				Name:     "project3",
45*ba677afaSXin Li				HomePage: "http://example.com/3/",
46*ba677afaSXin Li			},
47*ba677afaSXin Li			&v2_2.ArtifactOfProject{
48*ba677afaSXin Li				Name: "project4",
49*ba677afaSXin Li				URI:  "http://example.com/4/uri.whatever",
50*ba677afaSXin Li			},
51*ba677afaSXin Li		},
52*ba677afaSXin Li		FileComment: "this is a file comment",
53*ba677afaSXin Li		FileNotice:  "This file may be used under either Apache-2.0 or Apache-1.1.",
54*ba677afaSXin Li		FileContributors: []string{
55*ba677afaSXin Li			"John Doe [email protected]",
56*ba677afaSXin Li			"EvilCorp",
57*ba677afaSXin Li		},
58*ba677afaSXin Li		FileAttributionTexts: []string{
59*ba677afaSXin Li			"attributions",
60*ba677afaSXin Li			`multi-line
61*ba677afaSXin Liattribution`,
62*ba677afaSXin Li		},
63*ba677afaSXin Li		FileDependencies: []string{
64*ba677afaSXin Li			"f-1.txt",
65*ba677afaSXin Li			"g.txt",
66*ba677afaSXin Li		},
67*ba677afaSXin Li	}
68*ba677afaSXin Li
69*ba677afaSXin Li	// what we want to get, as a buffer of bytes
70*ba677afaSXin Li	want := bytes.NewBufferString(`FileName: /tmp/whatever.txt
71*ba677afaSXin LiSPDXID: SPDXRef-File123
72*ba677afaSXin LiFileType: TEXT
73*ba677afaSXin LiFileType: DOCUMENTATION
74*ba677afaSXin LiFileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983c
75*ba677afaSXin LiFileChecksum: SHA256: 11b6d3ee554eedf79299905a98f9b9a04e498210b59f15094c916c91d150efcd
76*ba677afaSXin LiFileChecksum: MD5: 624c1abb3664f4b35547e7c73864ad24
77*ba677afaSXin LiLicenseConcluded: Apache-2.0
78*ba677afaSXin LiLicenseInfoInFile: Apache-2.0
79*ba677afaSXin LiLicenseInfoInFile: Apache-1.1
80*ba677afaSXin LiLicenseComments: this is a license comment(s)
81*ba677afaSXin LiFileCopyrightText: Copyright (c) Jane Doe
82*ba677afaSXin LiArtifactOfProjectName: project1
83*ba677afaSXin LiArtifactOfProjectHomePage: http://example.com/1/
84*ba677afaSXin LiArtifactOfProjectURI: http://example.com/1/uri.whatever
85*ba677afaSXin LiArtifactOfProjectName: project2
86*ba677afaSXin LiArtifactOfProjectName: project3
87*ba677afaSXin LiArtifactOfProjectHomePage: http://example.com/3/
88*ba677afaSXin LiArtifactOfProjectName: project4
89*ba677afaSXin LiArtifactOfProjectURI: http://example.com/4/uri.whatever
90*ba677afaSXin LiFileComment: this is a file comment
91*ba677afaSXin LiFileNotice: This file may be used under either Apache-2.0 or Apache-1.1.
92*ba677afaSXin LiFileContributor: John Doe jdoe@example.com
93*ba677afaSXin LiFileContributor: EvilCorp
94*ba677afaSXin LiFileAttributionText: attributions
95*ba677afaSXin LiFileAttributionText: <text>multi-line
96*ba677afaSXin Liattribution</text>
97*ba677afaSXin LiFileDependency: f-1.txt
98*ba677afaSXin LiFileDependency: g.txt
99*ba677afaSXin Li
100*ba677afaSXin Li`)
101*ba677afaSXin Li
102*ba677afaSXin Li	// render as buffer of bytes
103*ba677afaSXin Li	var got bytes.Buffer
104*ba677afaSXin Li	err := renderFile2_2(f, &got)
105*ba677afaSXin Li	if err != nil {
106*ba677afaSXin Li		t.Errorf("Expected nil error, got %v", err)
107*ba677afaSXin Li	}
108*ba677afaSXin Li
109*ba677afaSXin Li	// check that they match
110*ba677afaSXin Li	c := bytes.Compare(want.Bytes(), got.Bytes())
111*ba677afaSXin Li	if c != 0 {
112*ba677afaSXin Li		t.Errorf("Expected %v, got %v", want.String(), got.String())
113*ba677afaSXin Li	}
114*ba677afaSXin Li}
115*ba677afaSXin Li
116*ba677afaSXin Lifunc TestSaver2_2FileSavesSnippetsAlso(t *testing.T) {
117*ba677afaSXin Li	sn1 := &v2_2.Snippet{
118*ba677afaSXin Li		SnippetSPDXIdentifier:         common.ElementID("Snippet19"),
119*ba677afaSXin Li		SnippetFromFileSPDXIdentifier: common.MakeDocElementID("", "File123").ElementRefID,
120*ba677afaSXin Li		Ranges:                        []common.SnippetRange{{StartPointer: common.SnippetRangePointer{Offset: 17}, EndPointer: common.SnippetRangePointer{Offset: 209}}},
121*ba677afaSXin Li		SnippetLicenseConcluded:       "GPL-2.0-or-later",
122*ba677afaSXin Li		SnippetCopyrightText:          "Copyright (c) John Doe 20x6",
123*ba677afaSXin Li	}
124*ba677afaSXin Li
125*ba677afaSXin Li	sn2 := &v2_2.Snippet{
126*ba677afaSXin Li		SnippetSPDXIdentifier:         common.ElementID("Snippet20"),
127*ba677afaSXin Li		SnippetFromFileSPDXIdentifier: common.MakeDocElementID("", "File123").ElementRefID,
128*ba677afaSXin Li		Ranges:                        []common.SnippetRange{{StartPointer: common.SnippetRangePointer{Offset: 268}, EndPointer: common.SnippetRangePointer{Offset: 309}}},
129*ba677afaSXin Li		SnippetLicenseConcluded:       "WTFPL",
130*ba677afaSXin Li		SnippetCopyrightText:          "NOASSERTION",
131*ba677afaSXin Li	}
132*ba677afaSXin Li
133*ba677afaSXin Li	sns := map[common.ElementID]*v2_2.Snippet{
134*ba677afaSXin Li		common.ElementID("Snippet19"): sn1,
135*ba677afaSXin Li		common.ElementID("Snippet20"): sn2,
136*ba677afaSXin Li	}
137*ba677afaSXin Li
138*ba677afaSXin Li	f := &v2_2.File{
139*ba677afaSXin Li		FileName:           "/tmp/whatever.txt",
140*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File123"),
141*ba677afaSXin Li		Checksums: []common.Checksum{
142*ba677afaSXin Li			{Algorithm: common.SHA1, Value: "85ed0817af83a24ad8da68c2b5094de69833983c"},
143*ba677afaSXin Li		},
144*ba677afaSXin Li		LicenseConcluded: "Apache-2.0",
145*ba677afaSXin Li		LicenseInfoInFiles: []string{
146*ba677afaSXin Li			"Apache-2.0",
147*ba677afaSXin Li		},
148*ba677afaSXin Li		FileCopyrightText: "Copyright (c) Jane Doe",
149*ba677afaSXin Li		Snippets:          sns,
150*ba677afaSXin Li	}
151*ba677afaSXin Li
152*ba677afaSXin Li	// what we want to get, as a buffer of bytes
153*ba677afaSXin Li	want := bytes.NewBufferString(`FileName: /tmp/whatever.txt
154*ba677afaSXin LiSPDXID: SPDXRef-File123
155*ba677afaSXin LiFileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983c
156*ba677afaSXin LiLicenseConcluded: Apache-2.0
157*ba677afaSXin LiLicenseInfoInFile: Apache-2.0
158*ba677afaSXin LiFileCopyrightText: Copyright (c) Jane Doe
159*ba677afaSXin Li
160*ba677afaSXin LiSnippetSPDXID: SPDXRef-Snippet19
161*ba677afaSXin LiSnippetFromFileSPDXID: SPDXRef-File123
162*ba677afaSXin LiSnippetByteRange: 17:209
163*ba677afaSXin LiSnippetLicenseConcluded: GPL-2.0-or-later
164*ba677afaSXin LiSnippetCopyrightText: Copyright (c) John Doe 20x6
165*ba677afaSXin Li
166*ba677afaSXin LiSnippetSPDXID: SPDXRef-Snippet20
167*ba677afaSXin LiSnippetFromFileSPDXID: SPDXRef-File123
168*ba677afaSXin LiSnippetByteRange: 268:309
169*ba677afaSXin LiSnippetLicenseConcluded: WTFPL
170*ba677afaSXin LiSnippetCopyrightText: NOASSERTION
171*ba677afaSXin Li
172*ba677afaSXin Li`)
173*ba677afaSXin Li
174*ba677afaSXin Li	// render as buffer of bytes
175*ba677afaSXin Li	var got bytes.Buffer
176*ba677afaSXin Li	err := renderFile2_2(f, &got)
177*ba677afaSXin Li	if err != nil {
178*ba677afaSXin Li		t.Errorf("Expected nil error, got %v", err)
179*ba677afaSXin Li	}
180*ba677afaSXin Li
181*ba677afaSXin Li	// check that they match
182*ba677afaSXin Li	c := bytes.Compare(want.Bytes(), got.Bytes())
183*ba677afaSXin Li	if c != 0 {
184*ba677afaSXin Li		t.Errorf("Expected %v, got %v", want.String(), got.String())
185*ba677afaSXin Li	}
186*ba677afaSXin Li}
187*ba677afaSXin Li
188*ba677afaSXin Lifunc TestSaver2_2FileOmitsOptionalFieldsIfEmpty(t *testing.T) {
189*ba677afaSXin Li	f := &v2_2.File{
190*ba677afaSXin Li		FileName:           "/tmp/whatever.txt",
191*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File123"),
192*ba677afaSXin Li		Checksums: []common.Checksum{
193*ba677afaSXin Li			{Algorithm: common.SHA1, Value: "85ed0817af83a24ad8da68c2b5094de69833983c"},
194*ba677afaSXin Li		},
195*ba677afaSXin Li		LicenseConcluded: "Apache-2.0",
196*ba677afaSXin Li		LicenseInfoInFiles: []string{
197*ba677afaSXin Li			"Apache-2.0",
198*ba677afaSXin Li		},
199*ba677afaSXin Li		FileCopyrightText: "Copyright (c) Jane Doe",
200*ba677afaSXin Li	}
201*ba677afaSXin Li
202*ba677afaSXin Li	// what we want to get, as a buffer of bytes
203*ba677afaSXin Li	want := bytes.NewBufferString(`FileName: /tmp/whatever.txt
204*ba677afaSXin LiSPDXID: SPDXRef-File123
205*ba677afaSXin LiFileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983c
206*ba677afaSXin LiLicenseConcluded: Apache-2.0
207*ba677afaSXin LiLicenseInfoInFile: Apache-2.0
208*ba677afaSXin LiFileCopyrightText: Copyright (c) Jane Doe
209*ba677afaSXin Li
210*ba677afaSXin Li`)
211*ba677afaSXin Li
212*ba677afaSXin Li	// render as buffer of bytes
213*ba677afaSXin Li	var got bytes.Buffer
214*ba677afaSXin Li	err := renderFile2_2(f, &got)
215*ba677afaSXin Li	if err != nil {
216*ba677afaSXin Li		t.Errorf("Expected nil error, got %v", err)
217*ba677afaSXin Li	}
218*ba677afaSXin Li
219*ba677afaSXin Li	// check that they match
220*ba677afaSXin Li	c := bytes.Compare(want.Bytes(), got.Bytes())
221*ba677afaSXin Li	if c != 0 {
222*ba677afaSXin Li		t.Errorf("Expected %v, got %v", want.String(), got.String())
223*ba677afaSXin Li	}
224*ba677afaSXin Li}
225*ba677afaSXin Li
226*ba677afaSXin Lifunc TestSaver2_2FileWrapsCopyrightMultiLine(t *testing.T) {
227*ba677afaSXin Li	f := &v2_2.File{
228*ba677afaSXin Li		FileName:           "/tmp/whatever.txt",
229*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File123"),
230*ba677afaSXin Li		Checksums: []common.Checksum{
231*ba677afaSXin Li			{Algorithm: common.SHA1, Value: "85ed0817af83a24ad8da68c2b5094de69833983c"},
232*ba677afaSXin Li		},
233*ba677afaSXin Li		LicenseConcluded: "Apache-2.0",
234*ba677afaSXin Li		LicenseInfoInFiles: []string{
235*ba677afaSXin Li			"Apache-2.0",
236*ba677afaSXin Li		},
237*ba677afaSXin Li		FileCopyrightText: `Copyright (c) Jane Doe
238*ba677afaSXin LiCopyright (c) John Doe`,
239*ba677afaSXin Li	}
240*ba677afaSXin Li
241*ba677afaSXin Li	// what we want to get, as a buffer of bytes
242*ba677afaSXin Li	want := bytes.NewBufferString(`FileName: /tmp/whatever.txt
243*ba677afaSXin LiSPDXID: SPDXRef-File123
244*ba677afaSXin LiFileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983c
245*ba677afaSXin LiLicenseConcluded: Apache-2.0
246*ba677afaSXin LiLicenseInfoInFile: Apache-2.0
247*ba677afaSXin LiFileCopyrightText: <text>Copyright (c) Jane Doe
248*ba677afaSXin LiCopyright (c) John Doe</text>
249*ba677afaSXin Li
250*ba677afaSXin Li`)
251*ba677afaSXin Li
252*ba677afaSXin Li	// render as buffer of bytes
253*ba677afaSXin Li	var got bytes.Buffer
254*ba677afaSXin Li	err := renderFile2_2(f, &got)
255*ba677afaSXin Li	if err != nil {
256*ba677afaSXin Li		t.Errorf("Expected nil error, got %v", err)
257*ba677afaSXin Li	}
258*ba677afaSXin Li
259*ba677afaSXin Li	// check that they match
260*ba677afaSXin Li	c := bytes.Compare(want.Bytes(), got.Bytes())
261*ba677afaSXin Li	if c != 0 {
262*ba677afaSXin Li		t.Errorf("Expected %v, got %v", want.String(), got.String())
263*ba677afaSXin Li	}
264*ba677afaSXin Li}
265*ba677afaSXin Li
266*ba677afaSXin Lifunc TestSaver2_2FileWrapsCommentsAndNoticesMultiLine(t *testing.T) {
267*ba677afaSXin Li	f := &v2_2.File{
268*ba677afaSXin Li		FileName:           "/tmp/whatever.txt",
269*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File123"),
270*ba677afaSXin Li		Checksums: []common.Checksum{
271*ba677afaSXin Li			{Algorithm: common.SHA1, Value: "85ed0817af83a24ad8da68c2b5094de69833983c"},
272*ba677afaSXin Li		},
273*ba677afaSXin Li		LicenseComments: `this is a
274*ba677afaSXin Limulti-line license comment`,
275*ba677afaSXin Li		LicenseConcluded: "Apache-2.0",
276*ba677afaSXin Li		LicenseInfoInFiles: []string{
277*ba677afaSXin Li			"Apache-2.0",
278*ba677afaSXin Li		},
279*ba677afaSXin Li		FileCopyrightText: "Copyright (c) Jane Doe",
280*ba677afaSXin Li		FileComment: `this is a
281*ba677afaSXin Limulti-line file comment`,
282*ba677afaSXin Li		FileNotice: `This file may be used
283*ba677afaSXin Liunder either Apache-2.0 or Apache-1.1.`,
284*ba677afaSXin Li	}
285*ba677afaSXin Li
286*ba677afaSXin Li	// what we want to get, as a buffer of bytes
287*ba677afaSXin Li	want := bytes.NewBufferString(`FileName: /tmp/whatever.txt
288*ba677afaSXin LiSPDXID: SPDXRef-File123
289*ba677afaSXin LiFileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983c
290*ba677afaSXin LiLicenseConcluded: Apache-2.0
291*ba677afaSXin LiLicenseInfoInFile: Apache-2.0
292*ba677afaSXin LiLicenseComments: <text>this is a
293*ba677afaSXin Limulti-line license comment</text>
294*ba677afaSXin LiFileCopyrightText: Copyright (c) Jane Doe
295*ba677afaSXin LiFileComment: <text>this is a
296*ba677afaSXin Limulti-line file comment</text>
297*ba677afaSXin LiFileNotice: <text>This file may be used
298*ba677afaSXin Liunder either Apache-2.0 or Apache-1.1.</text>
299*ba677afaSXin Li
300*ba677afaSXin Li`)
301*ba677afaSXin Li
302*ba677afaSXin Li	// render as buffer of bytes
303*ba677afaSXin Li	var got bytes.Buffer
304*ba677afaSXin Li	err := renderFile2_2(f, &got)
305*ba677afaSXin Li	if err != nil {
306*ba677afaSXin Li		t.Errorf("Expected nil error, got %v", err)
307*ba677afaSXin Li	}
308*ba677afaSXin Li
309*ba677afaSXin Li	// check that they match
310*ba677afaSXin Li	c := bytes.Compare(want.Bytes(), got.Bytes())
311*ba677afaSXin Li	if c != 0 {
312*ba677afaSXin Li		t.Errorf("Expected %v, got %v", want.String(), got.String())
313*ba677afaSXin Li	}
314*ba677afaSXin Li}
315