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