xref: /aosp_15_r20/external/spdx-tools/tvloader/parser2v2/parse_file_test.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
2*ba677afaSXin Lipackage parser2v2
3*ba677afaSXin Li
4*ba677afaSXin Liimport (
5*ba677afaSXin Li	"fmt"
6*ba677afaSXin Li	"testing"
7*ba677afaSXin Li
8*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/common"
9*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/v2_2"
10*ba677afaSXin Li)
11*ba677afaSXin Li
12*ba677afaSXin Li// ===== Parser file section state change tests =====
13*ba677afaSXin Lifunc TestParser2_2FileStartsNewFileAfterParsingFileNameTag(t *testing.T) {
14*ba677afaSXin Li	// create the first file
15*ba677afaSXin Li	fileOldName := "f1.txt"
16*ba677afaSXin Li
17*ba677afaSXin Li	parser := tvParser2_2{
18*ba677afaSXin Li		doc:  &v2_2.Document{Packages: []*v2_2.Package{}},
19*ba677afaSXin Li		st:   psFile2_2,
20*ba677afaSXin Li		pkg:  &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
21*ba677afaSXin Li		file: &v2_2.File{FileName: fileOldName, FileSPDXIdentifier: "f1"},
22*ba677afaSXin Li	}
23*ba677afaSXin Li	fileOld := parser.file
24*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
25*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, fileOld)
26*ba677afaSXin Li	// the Package's Files should have this one only
27*ba677afaSXin Li	if len(parser.pkg.Files) != 1 {
28*ba677afaSXin Li		t.Fatalf("expected 1 file, got %d", len(parser.pkg.Files))
29*ba677afaSXin Li	}
30*ba677afaSXin Li	if parser.pkg.Files[0] != fileOld {
31*ba677afaSXin Li		t.Errorf("expected file %v in Files[f1], got %v", fileOld, parser.pkg.Files[0])
32*ba677afaSXin Li	}
33*ba677afaSXin Li	if parser.pkg.Files[0].FileName != fileOldName {
34*ba677afaSXin Li		t.Errorf("expected file name %s in Files[f1], got %s", fileOldName, parser.pkg.Files[0].FileName)
35*ba677afaSXin Li	}
36*ba677afaSXin Li
37*ba677afaSXin Li	// now add a new file
38*ba677afaSXin Li	fileName := "f2.txt"
39*ba677afaSXin Li	err := parser.parsePair2_2("FileName", fileName)
40*ba677afaSXin Li	if err != nil {
41*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
42*ba677afaSXin Li	}
43*ba677afaSXin Li	// state should be correct
44*ba677afaSXin Li	if parser.st != psFile2_2 {
45*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psFile2_2, parser.st)
46*ba677afaSXin Li	}
47*ba677afaSXin Li	// and a file should be created
48*ba677afaSXin Li	if parser.file == nil {
49*ba677afaSXin Li		t.Fatalf("parser didn't create new file")
50*ba677afaSXin Li	}
51*ba677afaSXin Li	// and the file name should be as expected
52*ba677afaSXin Li	if parser.file.FileName != fileName {
53*ba677afaSXin Li		t.Errorf("expected file name %s, got %s", fileName, parser.file.FileName)
54*ba677afaSXin Li	}
55*ba677afaSXin Li	// and the Package's Files should still be of size 1 and not have this new
56*ba677afaSXin Li	// one yet, since it hasn't seen an SPDX identifier
57*ba677afaSXin Li	if len(parser.pkg.Files) != 1 {
58*ba677afaSXin Li		t.Fatalf("expected 1 file, got %d", len(parser.pkg.Files))
59*ba677afaSXin Li	}
60*ba677afaSXin Li	if parser.pkg.Files[0] != fileOld {
61*ba677afaSXin Li		t.Errorf("expected file %v in Files[f1], got %v", fileOld, parser.pkg.Files[0])
62*ba677afaSXin Li	}
63*ba677afaSXin Li	if parser.pkg.Files[0].FileName != fileOldName {
64*ba677afaSXin Li		t.Errorf("expected file name %s in Files[f1], got %s", fileOldName, parser.pkg.Files[0].FileName)
65*ba677afaSXin Li	}
66*ba677afaSXin Li
67*ba677afaSXin Li	// now parse an SPDX identifier tag
68*ba677afaSXin Li	err = parser.parsePair2_2("SPDXID", "SPDXRef-f2ID")
69*ba677afaSXin Li	if err != nil {
70*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
71*ba677afaSXin Li	}
72*ba677afaSXin Li	// and the Package's Files should now be of size 2 and have this new one
73*ba677afaSXin Li	if len(parser.pkg.Files) != 2 {
74*ba677afaSXin Li		t.Fatalf("expected 2 files, got %d", len(parser.pkg.Files))
75*ba677afaSXin Li	}
76*ba677afaSXin Li	if parser.pkg.Files[0] != fileOld {
77*ba677afaSXin Li		t.Errorf("expected file %v in Files[f1], got %v", fileOld, parser.pkg.Files[0])
78*ba677afaSXin Li	}
79*ba677afaSXin Li	if parser.pkg.Files[0].FileName != fileOldName {
80*ba677afaSXin Li		t.Errorf("expected file name %s in Files[f1], got %s", fileOldName, parser.pkg.Files[0].FileName)
81*ba677afaSXin Li	}
82*ba677afaSXin Li	if parser.pkg.Files[1] != parser.file {
83*ba677afaSXin Li		t.Errorf("expected file %v in Files[f2ID], got %v", parser.file, parser.pkg.Files[1])
84*ba677afaSXin Li	}
85*ba677afaSXin Li	if parser.pkg.Files[1].FileName != fileName {
86*ba677afaSXin Li		t.Errorf("expected file name %s in Files[f2ID], got %s", fileName, parser.pkg.Files[1].FileName)
87*ba677afaSXin Li	}
88*ba677afaSXin Li}
89*ba677afaSXin Li
90*ba677afaSXin Lifunc TestParser2_2FileAddsToPackageOrUnpackagedFiles(t *testing.T) {
91*ba677afaSXin Li	// start with no packages
92*ba677afaSXin Li	parser := tvParser2_2{
93*ba677afaSXin Li		doc: &v2_2.Document{},
94*ba677afaSXin Li		st:  psCreationInfo2_2,
95*ba677afaSXin Li	}
96*ba677afaSXin Li
97*ba677afaSXin Li	// add a file and SPDX identifier
98*ba677afaSXin Li	fileName := "f2.txt"
99*ba677afaSXin Li	err := parser.parsePair2_2("FileName", fileName)
100*ba677afaSXin Li	if err != nil {
101*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
102*ba677afaSXin Li	}
103*ba677afaSXin Li	err = parser.parsePair2_2("SPDXID", "SPDXRef-f2ID")
104*ba677afaSXin Li	if err != nil {
105*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
106*ba677afaSXin Li	}
107*ba677afaSXin Li	fileOld := parser.file
108*ba677afaSXin Li	// should have been added to Files
109*ba677afaSXin Li	if len(parser.doc.Files) != 1 {
110*ba677afaSXin Li		t.Fatalf("expected 1 file in Files, got %d", len(parser.doc.Files))
111*ba677afaSXin Li	}
112*ba677afaSXin Li	if parser.doc.Files[0] != fileOld {
113*ba677afaSXin Li		t.Errorf("expected file %v in Files[f2ID], got %v", fileOld, parser.doc.Files[0])
114*ba677afaSXin Li	}
115*ba677afaSXin Li	// now create a package and a new file
116*ba677afaSXin Li	err = parser.parsePair2_2("PackageName", "package1")
117*ba677afaSXin Li	if err != nil {
118*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
119*ba677afaSXin Li	}
120*ba677afaSXin Li	err = parser.parsePair2_2("SPDXID", "SPDXRef-pkg1")
121*ba677afaSXin Li	if err != nil {
122*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
123*ba677afaSXin Li	}
124*ba677afaSXin Li	err = parser.parsePair2_2("FileName", "f3.txt")
125*ba677afaSXin Li	if err != nil {
126*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
127*ba677afaSXin Li	}
128*ba677afaSXin Li	err = parser.parsePair2_2("SPDXID", "SPDXRef-f3ID")
129*ba677afaSXin Li	if err != nil {
130*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
131*ba677afaSXin Li	}
132*ba677afaSXin Li	// Files should still be size 1 and have old file only
133*ba677afaSXin Li	if len(parser.doc.Files) != 1 {
134*ba677afaSXin Li		t.Fatalf("expected 1 file in Files, got %d", len(parser.doc.Files))
135*ba677afaSXin Li	}
136*ba677afaSXin Li	if parser.doc.Files[0] != fileOld {
137*ba677afaSXin Li		t.Errorf("expected file %v in Files[f2ID], got %v", fileOld, parser.doc.Files[0])
138*ba677afaSXin Li	}
139*ba677afaSXin Li	// and new package should have gotten the new file
140*ba677afaSXin Li	if len(parser.pkg.Files) != 1 {
141*ba677afaSXin Li		t.Fatalf("expected 1 file in Files, got %d", len(parser.pkg.Files))
142*ba677afaSXin Li	}
143*ba677afaSXin Li	if parser.pkg.Files[0] != parser.file {
144*ba677afaSXin Li		t.Errorf("expected file %v in Files[f3ID], got %v", parser.file, parser.pkg.Files[0])
145*ba677afaSXin Li	}
146*ba677afaSXin Li}
147*ba677afaSXin Li
148*ba677afaSXin Lifunc TestParser2_2FileStartsNewPackageAfterParsingPackageNameTag(t *testing.T) {
149*ba677afaSXin Li	// create the first file and package
150*ba677afaSXin Li	p1Name := "package1"
151*ba677afaSXin Li	f1Name := "f1.txt"
152*ba677afaSXin Li
153*ba677afaSXin Li	parser := tvParser2_2{
154*ba677afaSXin Li		doc:  &v2_2.Document{Packages: []*v2_2.Package{}},
155*ba677afaSXin Li		st:   psFile2_2,
156*ba677afaSXin Li		pkg:  &v2_2.Package{PackageName: p1Name, PackageSPDXIdentifier: "package1", Files: []*v2_2.File{}},
157*ba677afaSXin Li		file: &v2_2.File{FileName: f1Name, FileSPDXIdentifier: "f1"},
158*ba677afaSXin Li	}
159*ba677afaSXin Li	p1 := parser.pkg
160*ba677afaSXin Li	f1 := parser.file
161*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, p1)
162*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, f1)
163*ba677afaSXin Li
164*ba677afaSXin Li	// now add a new package
165*ba677afaSXin Li	p2Name := "package2"
166*ba677afaSXin Li	err := parser.parsePair2_2("PackageName", p2Name)
167*ba677afaSXin Li	if err != nil {
168*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
169*ba677afaSXin Li	}
170*ba677afaSXin Li	// state should go back to Package
171*ba677afaSXin Li	if parser.st != psPackage2_2 {
172*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psPackage2_2, parser.st)
173*ba677afaSXin Li	}
174*ba677afaSXin Li	// and a package should be created
175*ba677afaSXin Li	if parser.pkg == nil {
176*ba677afaSXin Li		t.Fatalf("parser didn't create new pkg")
177*ba677afaSXin Li	}
178*ba677afaSXin Li	// and the package name should be as expected
179*ba677afaSXin Li	if parser.pkg.PackageName != p2Name {
180*ba677afaSXin Li		t.Errorf("expected package name %s, got %s", p2Name, parser.pkg.PackageName)
181*ba677afaSXin Li	}
182*ba677afaSXin Li	// and the package should default to true for FilesAnalyzed
183*ba677afaSXin Li	if parser.pkg.FilesAnalyzed != true {
184*ba677afaSXin Li		t.Errorf("expected FilesAnalyzed to default to true, got false")
185*ba677afaSXin Li	}
186*ba677afaSXin Li	if parser.pkg.IsFilesAnalyzedTagPresent != false {
187*ba677afaSXin Li		t.Errorf("expected IsFilesAnalyzedTagPresent to default to false, got true")
188*ba677afaSXin Li	}
189*ba677afaSXin Li	// and the new Package should have no files
190*ba677afaSXin Li	if len(parser.pkg.Files) != 0 {
191*ba677afaSXin Li		t.Errorf("Expected no files in pkg.Files, got %d", len(parser.pkg.Files))
192*ba677afaSXin Li	}
193*ba677afaSXin Li	// and the Document's Packages should still be of size 1 and not have this
194*ba677afaSXin Li	// new one, because no SPDX identifier has been seen yet
195*ba677afaSXin Li	if len(parser.doc.Packages) != 1 {
196*ba677afaSXin Li		t.Fatalf("expected 1 package, got %d", len(parser.doc.Packages))
197*ba677afaSXin Li	}
198*ba677afaSXin Li	if parser.doc.Packages[0] != p1 {
199*ba677afaSXin Li		t.Errorf("Expected package %v in Packages[package1], got %v", p1, parser.doc.Packages[0])
200*ba677afaSXin Li	}
201*ba677afaSXin Li	if parser.doc.Packages[0].PackageName != p1Name {
202*ba677afaSXin Li		t.Errorf("expected package name %s in Packages[package1], got %s", p1Name, parser.doc.Packages[0].PackageName)
203*ba677afaSXin Li	}
204*ba677afaSXin Li	// and the first Package's Files should be of size 1 and have f1 only
205*ba677afaSXin Li	if len(parser.doc.Packages[0].Files) != 1 {
206*ba677afaSXin Li		t.Errorf("Expected 1 file in Packages[package1].Files, got %d", len(parser.doc.Packages[0].Files))
207*ba677afaSXin Li	}
208*ba677afaSXin Li	if parser.doc.Packages[0].Files[0] != f1 {
209*ba677afaSXin Li		t.Errorf("Expected file %v in Files[f1], got %v", f1, parser.doc.Packages[0].Files[0])
210*ba677afaSXin Li	}
211*ba677afaSXin Li	if parser.doc.Packages[0].Files[0].FileName != f1Name {
212*ba677afaSXin Li		t.Errorf("expected file name %s in Files[f1], got %s", f1Name, parser.doc.Packages[0].Files[0].FileName)
213*ba677afaSXin Li	}
214*ba677afaSXin Li	// and the current file should be nil
215*ba677afaSXin Li	if parser.file != nil {
216*ba677afaSXin Li		t.Errorf("Expected nil for parser.file, got %v", parser.file)
217*ba677afaSXin Li	}
218*ba677afaSXin Li}
219*ba677afaSXin Li
220*ba677afaSXin Lifunc TestParser2_2FileMovesToSnippetAfterParsingSnippetSPDXIDTag(t *testing.T) {
221*ba677afaSXin Li	parser := tvParser2_2{
222*ba677afaSXin Li		doc:  &v2_2.Document{Packages: []*v2_2.Package{}},
223*ba677afaSXin Li		st:   psFile2_2,
224*ba677afaSXin Li		pkg:  &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
225*ba677afaSXin Li		file: &v2_2.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"},
226*ba677afaSXin Li	}
227*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
228*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
229*ba677afaSXin Li	fileCurrent := parser.file
230*ba677afaSXin Li
231*ba677afaSXin Li	err := parser.parsePair2_2("SnippetSPDXID", "SPDXRef-Test1")
232*ba677afaSXin Li	if err != nil {
233*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
234*ba677afaSXin Li	}
235*ba677afaSXin Li	// state should be correct
236*ba677afaSXin Li	if parser.st != psSnippet2_2 {
237*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psSnippet2_2, parser.st)
238*ba677afaSXin Li	}
239*ba677afaSXin Li	// and current file should remain what it was
240*ba677afaSXin Li	if parser.file != fileCurrent {
241*ba677afaSXin Li		t.Fatalf("expected file to remain %v, got %v", fileCurrent, parser.file)
242*ba677afaSXin Li	}
243*ba677afaSXin Li}
244*ba677afaSXin Li
245*ba677afaSXin Lifunc TestParser2_2FileMovesToOtherLicenseAfterParsingLicenseIDTag(t *testing.T) {
246*ba677afaSXin Li	parser := tvParser2_2{
247*ba677afaSXin Li		doc:  &v2_2.Document{Packages: []*v2_2.Package{}},
248*ba677afaSXin Li		st:   psFile2_2,
249*ba677afaSXin Li		pkg:  &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
250*ba677afaSXin Li		file: &v2_2.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"},
251*ba677afaSXin Li	}
252*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
253*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
254*ba677afaSXin Li
255*ba677afaSXin Li	err := parser.parsePair2_2("LicenseID", "LicenseRef-TestLic")
256*ba677afaSXin Li	if err != nil {
257*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
258*ba677afaSXin Li	}
259*ba677afaSXin Li	if parser.st != psOtherLicense2_2 {
260*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psOtherLicense2_2, parser.st)
261*ba677afaSXin Li	}
262*ba677afaSXin Li}
263*ba677afaSXin Li
264*ba677afaSXin Lifunc TestParser2_2FileMovesToReviewAfterParsingReviewerTag(t *testing.T) {
265*ba677afaSXin Li	parser := tvParser2_2{
266*ba677afaSXin Li		doc:  &v2_2.Document{Packages: []*v2_2.Package{}},
267*ba677afaSXin Li		st:   psFile2_2,
268*ba677afaSXin Li		pkg:  &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
269*ba677afaSXin Li		file: &v2_2.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"},
270*ba677afaSXin Li	}
271*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
272*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
273*ba677afaSXin Li
274*ba677afaSXin Li	err := parser.parsePair2_2("Reviewer", "Person: John Doe")
275*ba677afaSXin Li	if err != nil {
276*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
277*ba677afaSXin Li	}
278*ba677afaSXin Li	if parser.st != psReview2_2 {
279*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psReview2_2, parser.st)
280*ba677afaSXin Li	}
281*ba677afaSXin Li}
282*ba677afaSXin Li
283*ba677afaSXin Lifunc TestParser2_2FileStaysAfterParsingRelationshipTags(t *testing.T) {
284*ba677afaSXin Li	parser := tvParser2_2{
285*ba677afaSXin Li		doc:  &v2_2.Document{Packages: []*v2_2.Package{}},
286*ba677afaSXin Li		st:   psFile2_2,
287*ba677afaSXin Li		pkg:  &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
288*ba677afaSXin Li		file: &v2_2.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"},
289*ba677afaSXin Li	}
290*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
291*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
292*ba677afaSXin Li
293*ba677afaSXin Li	err := parser.parsePair2_2("Relationship", "SPDXRef-blah CONTAINS SPDXRef-blah-else")
294*ba677afaSXin Li	if err != nil {
295*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
296*ba677afaSXin Li	}
297*ba677afaSXin Li	// state should remain unchanged
298*ba677afaSXin Li	if parser.st != psFile2_2 {
299*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psFile2_2, parser.st)
300*ba677afaSXin Li	}
301*ba677afaSXin Li
302*ba677afaSXin Li	err = parser.parsePair2_2("RelationshipComment", "blah")
303*ba677afaSXin Li	if err != nil {
304*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
305*ba677afaSXin Li	}
306*ba677afaSXin Li	// state should still remain unchanged
307*ba677afaSXin Li	if parser.st != psFile2_2 {
308*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psFile2_2, parser.st)
309*ba677afaSXin Li	}
310*ba677afaSXin Li}
311*ba677afaSXin Li
312*ba677afaSXin Lifunc TestParser2_2FileStaysAfterParsingAnnotationTags(t *testing.T) {
313*ba677afaSXin Li	parser := tvParser2_2{
314*ba677afaSXin Li		doc:  &v2_2.Document{Packages: []*v2_2.Package{}},
315*ba677afaSXin Li		st:   psFile2_2,
316*ba677afaSXin Li		pkg:  &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
317*ba677afaSXin Li		file: &v2_2.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"},
318*ba677afaSXin Li	}
319*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
320*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
321*ba677afaSXin Li
322*ba677afaSXin Li	err := parser.parsePair2_2("Annotator", "Person: John Doe ()")
323*ba677afaSXin Li	if err != nil {
324*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
325*ba677afaSXin Li	}
326*ba677afaSXin Li	if parser.st != psFile2_2 {
327*ba677afaSXin Li		t.Errorf("parser is in state %v, expected %v", parser.st, psFile2_2)
328*ba677afaSXin Li	}
329*ba677afaSXin Li
330*ba677afaSXin Li	err = parser.parsePair2_2("AnnotationDate", "2018-09-15T00:36:00Z")
331*ba677afaSXin Li	if err != nil {
332*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
333*ba677afaSXin Li	}
334*ba677afaSXin Li	if parser.st != psFile2_2 {
335*ba677afaSXin Li		t.Errorf("parser is in state %v, expected %v", parser.st, psFile2_2)
336*ba677afaSXin Li	}
337*ba677afaSXin Li
338*ba677afaSXin Li	err = parser.parsePair2_2("AnnotationType", "REVIEW")
339*ba677afaSXin Li	if err != nil {
340*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
341*ba677afaSXin Li	}
342*ba677afaSXin Li	if parser.st != psFile2_2 {
343*ba677afaSXin Li		t.Errorf("parser is in state %v, expected %v", parser.st, psFile2_2)
344*ba677afaSXin Li	}
345*ba677afaSXin Li
346*ba677afaSXin Li	err = parser.parsePair2_2("SPDXREF", "SPDXRef-45")
347*ba677afaSXin Li	if err != nil {
348*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
349*ba677afaSXin Li	}
350*ba677afaSXin Li	if parser.st != psFile2_2 {
351*ba677afaSXin Li		t.Errorf("parser is in state %v, expected %v", parser.st, psFile2_2)
352*ba677afaSXin Li	}
353*ba677afaSXin Li
354*ba677afaSXin Li	err = parser.parsePair2_2("AnnotationComment", "i guess i had something to say about this particular file")
355*ba677afaSXin Li	if err != nil {
356*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
357*ba677afaSXin Li	}
358*ba677afaSXin Li	if parser.st != psFile2_2 {
359*ba677afaSXin Li		t.Errorf("parser is in state %v, expected %v", parser.st, psFile2_2)
360*ba677afaSXin Li	}
361*ba677afaSXin Li}
362*ba677afaSXin Li
363*ba677afaSXin Li// ===== File data section tests =====
364*ba677afaSXin Lifunc TestParser2_2CanParseFileTags(t *testing.T) {
365*ba677afaSXin Li	parser := tvParser2_2{
366*ba677afaSXin Li		doc: &v2_2.Document{Packages: []*v2_2.Package{}},
367*ba677afaSXin Li		st:  psFile2_2,
368*ba677afaSXin Li		pkg: &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
369*ba677afaSXin Li	}
370*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
371*ba677afaSXin Li
372*ba677afaSXin Li	// File Name
373*ba677afaSXin Li	err := parser.parsePairFromFile2_2("FileName", "f1.txt")
374*ba677afaSXin Li	if err != nil {
375*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
376*ba677afaSXin Li	}
377*ba677afaSXin Li	if parser.file.FileName != "f1.txt" {
378*ba677afaSXin Li		t.Errorf("got %v for FileName", parser.file.FileName)
379*ba677afaSXin Li	}
380*ba677afaSXin Li	// should not yet be added to the Packages file list, because we haven't
381*ba677afaSXin Li	// seen an SPDX identifier yet
382*ba677afaSXin Li	if len(parser.pkg.Files) != 0 {
383*ba677afaSXin Li		t.Errorf("expected 0 files, got %d", len(parser.pkg.Files))
384*ba677afaSXin Li	}
385*ba677afaSXin Li
386*ba677afaSXin Li	// File SPDX Identifier
387*ba677afaSXin Li	err = parser.parsePairFromFile2_2("SPDXID", "SPDXRef-f1")
388*ba677afaSXin Li	if err != nil {
389*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
390*ba677afaSXin Li	}
391*ba677afaSXin Li	if parser.file.FileSPDXIdentifier != "f1" {
392*ba677afaSXin Li		t.Errorf("got %v for FileSPDXIdentifier", parser.file.FileSPDXIdentifier)
393*ba677afaSXin Li	}
394*ba677afaSXin Li	// should now be added to the Packages file list
395*ba677afaSXin Li	if len(parser.pkg.Files) != 1 {
396*ba677afaSXin Li		t.Errorf("expected 1 file, got %d", len(parser.pkg.Files))
397*ba677afaSXin Li	}
398*ba677afaSXin Li	if parser.pkg.Files[0] != parser.file {
399*ba677afaSXin Li		t.Errorf("expected Files[f1] to be %v, got %v", parser.file, parser.pkg.Files[0])
400*ba677afaSXin Li	}
401*ba677afaSXin Li
402*ba677afaSXin Li	// File Type
403*ba677afaSXin Li	fileTypes := []string{
404*ba677afaSXin Li		"TEXT",
405*ba677afaSXin Li		"DOCUMENTATION",
406*ba677afaSXin Li	}
407*ba677afaSXin Li	for _, ty := range fileTypes {
408*ba677afaSXin Li		err = parser.parsePairFromFile2_2("FileType", ty)
409*ba677afaSXin Li		if err != nil {
410*ba677afaSXin Li			t.Errorf("expected nil error, got %v", err)
411*ba677afaSXin Li		}
412*ba677afaSXin Li	}
413*ba677afaSXin Li	for _, typeWant := range fileTypes {
414*ba677afaSXin Li		flagFound := false
415*ba677afaSXin Li		for _, typeCheck := range parser.file.FileTypes {
416*ba677afaSXin Li			if typeWant == typeCheck {
417*ba677afaSXin Li				flagFound = true
418*ba677afaSXin Li			}
419*ba677afaSXin Li		}
420*ba677afaSXin Li		if flagFound == false {
421*ba677afaSXin Li			t.Errorf("didn't find %s in FileTypes", typeWant)
422*ba677afaSXin Li		}
423*ba677afaSXin Li	}
424*ba677afaSXin Li	if len(fileTypes) != len(parser.file.FileTypes) {
425*ba677afaSXin Li		t.Errorf("expected %d types in FileTypes, got %d", len(fileTypes),
426*ba677afaSXin Li			len(parser.file.FileTypes))
427*ba677afaSXin Li	}
428*ba677afaSXin Li
429*ba677afaSXin Li	testChecksums := map[common.ChecksumAlgorithm]string{
430*ba677afaSXin Li		"MD5":    "624c1abb3664f4b35547e7c73864ad24",
431*ba677afaSXin Li		"SHA1":   "85ed0817af83a24ad8da68c2b5094de69833983c",
432*ba677afaSXin Li		"SHA256": "11b6d3ee554eedf79299905a98f9b9a04e498210b59f15094c916c91d150efcd",
433*ba677afaSXin Li		"SHA512": "4ced3267f5ed38df65ceebc43e97aa6c2948cc7ef3288c2e5074e7df7fab544cc93339604513ea5f65616f9ed1c48581465043c8a9b693ef20fd4fddaf25e1b9",
434*ba677afaSXin Li	}
435*ba677afaSXin Li
436*ba677afaSXin Li	for algo, tc := range testChecksums {
437*ba677afaSXin Li		if err := parser.parsePairFromFile2_2(
438*ba677afaSXin Li			"FileChecksum", fmt.Sprintf("%s: %s", algo, tc)); err != nil {
439*ba677afaSXin Li			t.Errorf("expected error, got %v", err)
440*ba677afaSXin Li		}
441*ba677afaSXin Li	}
442*ba677afaSXin Li
443*ba677afaSXin Li	for _, checksum := range parser.file.Checksums {
444*ba677afaSXin Li		if checksum.Value != testChecksums[checksum.Algorithm] {
445*ba677afaSXin Li			t.Errorf(
446*ba677afaSXin Li				"expected %s for FileChecksum%s, got %s",
447*ba677afaSXin Li				testChecksums[checksum.Algorithm], checksum.Algorithm, checksum.Value,
448*ba677afaSXin Li			)
449*ba677afaSXin Li		}
450*ba677afaSXin Li	}
451*ba677afaSXin Li
452*ba677afaSXin Li	// Concluded License
453*ba677afaSXin Li	err = parser.parsePairFromFile2_2("LicenseConcluded", "Apache-2.0 OR GPL-2.0-or-later")
454*ba677afaSXin Li	if err != nil {
455*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
456*ba677afaSXin Li	}
457*ba677afaSXin Li	if parser.file.LicenseConcluded != "Apache-2.0 OR GPL-2.0-or-later" {
458*ba677afaSXin Li		t.Errorf("got %v for LicenseConcluded", parser.file.LicenseConcluded)
459*ba677afaSXin Li	}
460*ba677afaSXin Li
461*ba677afaSXin Li	// License Information in File
462*ba677afaSXin Li	lics := []string{
463*ba677afaSXin Li		"Apache-2.0",
464*ba677afaSXin Li		"GPL-2.0-or-later",
465*ba677afaSXin Li		"CC0-1.0",
466*ba677afaSXin Li	}
467*ba677afaSXin Li	for _, lic := range lics {
468*ba677afaSXin Li		err = parser.parsePairFromFile2_2("LicenseInfoInFile", lic)
469*ba677afaSXin Li		if err != nil {
470*ba677afaSXin Li			t.Errorf("expected nil error, got %v", err)
471*ba677afaSXin Li		}
472*ba677afaSXin Li	}
473*ba677afaSXin Li	for _, licWant := range lics {
474*ba677afaSXin Li		flagFound := false
475*ba677afaSXin Li		for _, licCheck := range parser.file.LicenseInfoInFiles {
476*ba677afaSXin Li			if licWant == licCheck {
477*ba677afaSXin Li				flagFound = true
478*ba677afaSXin Li			}
479*ba677afaSXin Li		}
480*ba677afaSXin Li		if flagFound == false {
481*ba677afaSXin Li			t.Errorf("didn't find %s in LicenseInfoInFiles", licWant)
482*ba677afaSXin Li		}
483*ba677afaSXin Li	}
484*ba677afaSXin Li	if len(lics) != len(parser.file.LicenseInfoInFiles) {
485*ba677afaSXin Li		t.Errorf("expected %d licenses in LicenseInfoInFiles, got %d", len(lics),
486*ba677afaSXin Li			len(parser.file.LicenseInfoInFiles))
487*ba677afaSXin Li	}
488*ba677afaSXin Li
489*ba677afaSXin Li	// Comments on License
490*ba677afaSXin Li	err = parser.parsePairFromFile2_2("LicenseComments", "this is a comment")
491*ba677afaSXin Li	if err != nil {
492*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
493*ba677afaSXin Li	}
494*ba677afaSXin Li	if parser.file.LicenseComments != "this is a comment" {
495*ba677afaSXin Li		t.Errorf("got %v for LicenseComments", parser.file.LicenseComments)
496*ba677afaSXin Li	}
497*ba677afaSXin Li
498*ba677afaSXin Li	// Copyright Text
499*ba677afaSXin Li	err = parser.parsePairFromFile2_2("FileCopyrightText", "copyright (c) me")
500*ba677afaSXin Li	if err != nil {
501*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
502*ba677afaSXin Li	}
503*ba677afaSXin Li	if parser.file.FileCopyrightText != "copyright (c) me" {
504*ba677afaSXin Li		t.Errorf("got %v for FileCopyrightText", parser.file.FileCopyrightText)
505*ba677afaSXin Li	}
506*ba677afaSXin Li
507*ba677afaSXin Li	// Artifact of Projects: Name, HomePage and URI
508*ba677afaSXin Li	// Artifact set 1
509*ba677afaSXin Li	err = parser.parsePairFromFile2_2("ArtifactOfProjectName", "project1")
510*ba677afaSXin Li	if err != nil {
511*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
512*ba677afaSXin Li	}
513*ba677afaSXin Li	err = parser.parsePairFromFile2_2("ArtifactOfProjectHomePage", "http://example.com/1/")
514*ba677afaSXin Li	if err != nil {
515*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
516*ba677afaSXin Li	}
517*ba677afaSXin Li	err = parser.parsePairFromFile2_2("ArtifactOfProjectURI", "http://example.com/1/uri.whatever")
518*ba677afaSXin Li	if err != nil {
519*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
520*ba677afaSXin Li	}
521*ba677afaSXin Li	// Artifact set 2 -- just name
522*ba677afaSXin Li	err = parser.parsePairFromFile2_2("ArtifactOfProjectName", "project2")
523*ba677afaSXin Li	if err != nil {
524*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
525*ba677afaSXin Li	}
526*ba677afaSXin Li	// Artifact set 3 -- just name and home page
527*ba677afaSXin Li	err = parser.parsePairFromFile2_2("ArtifactOfProjectName", "project3")
528*ba677afaSXin Li	if err != nil {
529*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
530*ba677afaSXin Li	}
531*ba677afaSXin Li	err = parser.parsePairFromFile2_2("ArtifactOfProjectHomePage", "http://example.com/3/")
532*ba677afaSXin Li	if err != nil {
533*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
534*ba677afaSXin Li	}
535*ba677afaSXin Li	// Artifact set 4 -- just name and URI
536*ba677afaSXin Li	err = parser.parsePairFromFile2_2("ArtifactOfProjectName", "project4")
537*ba677afaSXin Li	if err != nil {
538*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
539*ba677afaSXin Li	}
540*ba677afaSXin Li	err = parser.parsePairFromFile2_2("ArtifactOfProjectURI", "http://example.com/4/uri.whatever")
541*ba677afaSXin Li	if err != nil {
542*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
543*ba677afaSXin Li	}
544*ba677afaSXin Li
545*ba677afaSXin Li	if len(parser.file.ArtifactOfProjects) != 4 {
546*ba677afaSXin Li		t.Fatalf("expected len %d, got %d", 4, len(parser.file.ArtifactOfProjects))
547*ba677afaSXin Li	}
548*ba677afaSXin Li
549*ba677afaSXin Li	aop := parser.file.ArtifactOfProjects[0]
550*ba677afaSXin Li	if aop.Name != "project1" {
551*ba677afaSXin Li		t.Errorf("expected %v, got %v", "project1", aop.Name)
552*ba677afaSXin Li	}
553*ba677afaSXin Li	if aop.HomePage != "http://example.com/1/" {
554*ba677afaSXin Li		t.Errorf("expected %v, got %v", "http://example.com/1/", aop.HomePage)
555*ba677afaSXin Li	}
556*ba677afaSXin Li	if aop.URI != "http://example.com/1/uri.whatever" {
557*ba677afaSXin Li		t.Errorf("expected %v, got %v", "http://example.com/1/uri.whatever", aop.URI)
558*ba677afaSXin Li	}
559*ba677afaSXin Li
560*ba677afaSXin Li	aop = parser.file.ArtifactOfProjects[1]
561*ba677afaSXin Li	if aop.Name != "project2" {
562*ba677afaSXin Li		t.Errorf("expected %v, got %v", "project2", aop.Name)
563*ba677afaSXin Li	}
564*ba677afaSXin Li	if aop.HomePage != "" {
565*ba677afaSXin Li		t.Errorf("expected %v, got %v", "", aop.HomePage)
566*ba677afaSXin Li	}
567*ba677afaSXin Li	if aop.URI != "" {
568*ba677afaSXin Li		t.Errorf("expected %v, got %v", "", aop.URI)
569*ba677afaSXin Li	}
570*ba677afaSXin Li
571*ba677afaSXin Li	aop = parser.file.ArtifactOfProjects[2]
572*ba677afaSXin Li	if aop.Name != "project3" {
573*ba677afaSXin Li		t.Errorf("expected %v, got %v", "project3", aop.Name)
574*ba677afaSXin Li	}
575*ba677afaSXin Li	if aop.HomePage != "http://example.com/3/" {
576*ba677afaSXin Li		t.Errorf("expected %v, got %v", "http://example.com/3/", aop.HomePage)
577*ba677afaSXin Li	}
578*ba677afaSXin Li	if aop.URI != "" {
579*ba677afaSXin Li		t.Errorf("expected %v, got %v", "", aop.URI)
580*ba677afaSXin Li	}
581*ba677afaSXin Li
582*ba677afaSXin Li	aop = parser.file.ArtifactOfProjects[3]
583*ba677afaSXin Li	if aop.Name != "project4" {
584*ba677afaSXin Li		t.Errorf("expected %v, got %v", "project4", aop.Name)
585*ba677afaSXin Li	}
586*ba677afaSXin Li	if aop.HomePage != "" {
587*ba677afaSXin Li		t.Errorf("expected %v, got %v", "", aop.HomePage)
588*ba677afaSXin Li	}
589*ba677afaSXin Li	if aop.URI != "http://example.com/4/uri.whatever" {
590*ba677afaSXin Li		t.Errorf("expected %v, got %v", "http://example.com/4/uri.whatever", aop.URI)
591*ba677afaSXin Li	}
592*ba677afaSXin Li
593*ba677afaSXin Li	// File Comment
594*ba677afaSXin Li	err = parser.parsePairFromFile2_2("FileComment", "this is a comment")
595*ba677afaSXin Li	if err != nil {
596*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
597*ba677afaSXin Li	}
598*ba677afaSXin Li	if parser.file.FileComment != "this is a comment" {
599*ba677afaSXin Li		t.Errorf("got %v for FileComment", parser.file.FileComment)
600*ba677afaSXin Li	}
601*ba677afaSXin Li
602*ba677afaSXin Li	// File Notice
603*ba677afaSXin Li	err = parser.parsePairFromFile2_2("FileNotice", "this is a Notice")
604*ba677afaSXin Li	if err != nil {
605*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
606*ba677afaSXin Li	}
607*ba677afaSXin Li	if parser.file.FileNotice != "this is a Notice" {
608*ba677afaSXin Li		t.Errorf("got %v for FileNotice", parser.file.FileNotice)
609*ba677afaSXin Li	}
610*ba677afaSXin Li
611*ba677afaSXin Li	// File Contributor
612*ba677afaSXin Li	contribs := []string{
613*ba677afaSXin Li		"John Doe [email protected]",
614*ba677afaSXin Li		"EvilCorp",
615*ba677afaSXin Li	}
616*ba677afaSXin Li	for _, contrib := range contribs {
617*ba677afaSXin Li		err = parser.parsePairFromFile2_2("FileContributor", contrib)
618*ba677afaSXin Li		if err != nil {
619*ba677afaSXin Li			t.Errorf("expected nil error, got %v", err)
620*ba677afaSXin Li		}
621*ba677afaSXin Li	}
622*ba677afaSXin Li	for _, contribWant := range contribs {
623*ba677afaSXin Li		flagFound := false
624*ba677afaSXin Li		for _, contribCheck := range parser.file.FileContributors {
625*ba677afaSXin Li			if contribWant == contribCheck {
626*ba677afaSXin Li				flagFound = true
627*ba677afaSXin Li			}
628*ba677afaSXin Li		}
629*ba677afaSXin Li		if flagFound == false {
630*ba677afaSXin Li			t.Errorf("didn't find %s in FileContributors", contribWant)
631*ba677afaSXin Li		}
632*ba677afaSXin Li	}
633*ba677afaSXin Li	if len(contribs) != len(parser.file.FileContributors) {
634*ba677afaSXin Li		t.Errorf("expected %d contribenses in FileContributors, got %d", len(contribs),
635*ba677afaSXin Li			len(parser.file.FileContributors))
636*ba677afaSXin Li	}
637*ba677afaSXin Li
638*ba677afaSXin Li	// File Dependencies
639*ba677afaSXin Li	deps := []string{
640*ba677afaSXin Li		"f-1.txt",
641*ba677afaSXin Li		"g.txt",
642*ba677afaSXin Li	}
643*ba677afaSXin Li	for _, dep := range deps {
644*ba677afaSXin Li		err = parser.parsePairFromFile2_2("FileDependency", dep)
645*ba677afaSXin Li		if err != nil {
646*ba677afaSXin Li			t.Errorf("expected nil error, got %v", err)
647*ba677afaSXin Li		}
648*ba677afaSXin Li	}
649*ba677afaSXin Li	for _, depWant := range deps {
650*ba677afaSXin Li		flagFound := false
651*ba677afaSXin Li		for _, depCheck := range parser.file.FileDependencies {
652*ba677afaSXin Li			if depWant == depCheck {
653*ba677afaSXin Li				flagFound = true
654*ba677afaSXin Li			}
655*ba677afaSXin Li		}
656*ba677afaSXin Li		if flagFound == false {
657*ba677afaSXin Li			t.Errorf("didn't find %s in FileDependency", depWant)
658*ba677afaSXin Li		}
659*ba677afaSXin Li	}
660*ba677afaSXin Li	if len(deps) != len(parser.file.FileDependencies) {
661*ba677afaSXin Li		t.Errorf("expected %d depenses in FileDependency, got %d", len(deps),
662*ba677afaSXin Li			len(parser.file.FileDependencies))
663*ba677afaSXin Li	}
664*ba677afaSXin Li
665*ba677afaSXin Li	// File Attribution Texts
666*ba677afaSXin Li	attrs := []string{
667*ba677afaSXin Li		"Include this notice in all advertising materials",
668*ba677afaSXin Li		"This is a \nmulti-line string",
669*ba677afaSXin Li	}
670*ba677afaSXin Li	for _, attr := range attrs {
671*ba677afaSXin Li		err = parser.parsePairFromFile2_2("FileAttributionText", attr)
672*ba677afaSXin Li		if err != nil {
673*ba677afaSXin Li			t.Errorf("expected nil error, got %v", err)
674*ba677afaSXin Li		}
675*ba677afaSXin Li	}
676*ba677afaSXin Li	for _, attrWant := range attrs {
677*ba677afaSXin Li		flagFound := false
678*ba677afaSXin Li		for _, attrCheck := range parser.file.FileAttributionTexts {
679*ba677afaSXin Li			if attrWant == attrCheck {
680*ba677afaSXin Li				flagFound = true
681*ba677afaSXin Li			}
682*ba677afaSXin Li		}
683*ba677afaSXin Li		if flagFound == false {
684*ba677afaSXin Li			t.Errorf("didn't find %s in FileAttributionText", attrWant)
685*ba677afaSXin Li		}
686*ba677afaSXin Li	}
687*ba677afaSXin Li	if len(attrs) != len(parser.file.FileAttributionTexts) {
688*ba677afaSXin Li		t.Errorf("expected %d attribution texts in FileAttributionTexts, got %d", len(attrs),
689*ba677afaSXin Li			len(parser.file.FileAttributionTexts))
690*ba677afaSXin Li	}
691*ba677afaSXin Li
692*ba677afaSXin Li}
693*ba677afaSXin Li
694*ba677afaSXin Lifunc TestParser2_2FileCreatesRelationshipInDocument(t *testing.T) {
695*ba677afaSXin Li	parser := tvParser2_2{
696*ba677afaSXin Li		doc:  &v2_2.Document{Packages: []*v2_2.Package{}},
697*ba677afaSXin Li		st:   psFile2_2,
698*ba677afaSXin Li		pkg:  &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
699*ba677afaSXin Li		file: &v2_2.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"},
700*ba677afaSXin Li	}
701*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
702*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
703*ba677afaSXin Li
704*ba677afaSXin Li	err := parser.parsePair2_2("Relationship", "SPDXRef-blah CONTAINS SPDXRef-blah-whatever")
705*ba677afaSXin Li	if err != nil {
706*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
707*ba677afaSXin Li	}
708*ba677afaSXin Li	if parser.rln == nil {
709*ba677afaSXin Li		t.Fatalf("parser didn't create and point to Relationship struct")
710*ba677afaSXin Li	}
711*ba677afaSXin Li	if parser.rln != parser.doc.Relationships[0] {
712*ba677afaSXin Li		t.Errorf("pointer to new Relationship doesn't match idx 0 for doc.Relationships[]")
713*ba677afaSXin Li	}
714*ba677afaSXin Li}
715*ba677afaSXin Li
716*ba677afaSXin Lifunc TestParser2_2FileCreatesAnnotationInDocument(t *testing.T) {
717*ba677afaSXin Li	parser := tvParser2_2{
718*ba677afaSXin Li		doc:  &v2_2.Document{Packages: []*v2_2.Package{}},
719*ba677afaSXin Li		st:   psFile2_2,
720*ba677afaSXin Li		pkg:  &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
721*ba677afaSXin Li		file: &v2_2.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"},
722*ba677afaSXin Li	}
723*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
724*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
725*ba677afaSXin Li
726*ba677afaSXin Li	err := parser.parsePair2_2("Annotator", "Person: John Doe ()")
727*ba677afaSXin Li	if err != nil {
728*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_2: %v", err)
729*ba677afaSXin Li	}
730*ba677afaSXin Li	if parser.ann == nil {
731*ba677afaSXin Li		t.Fatalf("parser didn't create and point to Annotation struct")
732*ba677afaSXin Li	}
733*ba677afaSXin Li	if parser.ann != parser.doc.Annotations[0] {
734*ba677afaSXin Li		t.Errorf("pointer to new Annotation doesn't match idx 0 for doc.Annotations[]")
735*ba677afaSXin Li	}
736*ba677afaSXin Li}
737*ba677afaSXin Li
738*ba677afaSXin Lifunc TestParser2_2FileUnknownTagFails(t *testing.T) {
739*ba677afaSXin Li	parser := tvParser2_2{
740*ba677afaSXin Li		doc:  &v2_2.Document{Packages: []*v2_2.Package{}},
741*ba677afaSXin Li		st:   psFile2_2,
742*ba677afaSXin Li		pkg:  &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
743*ba677afaSXin Li		file: &v2_2.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"},
744*ba677afaSXin Li	}
745*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
746*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
747*ba677afaSXin Li
748*ba677afaSXin Li	err := parser.parsePairFromFile2_2("blah", "something")
749*ba677afaSXin Li	if err == nil {
750*ba677afaSXin Li		t.Errorf("expected error from parsing unknown tag")
751*ba677afaSXin Li	}
752*ba677afaSXin Li}
753*ba677afaSXin Li
754*ba677afaSXin Lifunc TestFileAOPPointerChangesAfterTags(t *testing.T) {
755*ba677afaSXin Li	parser := tvParser2_2{
756*ba677afaSXin Li		doc:  &v2_2.Document{Packages: []*v2_2.Package{}},
757*ba677afaSXin Li		st:   psFile2_2,
758*ba677afaSXin Li		pkg:  &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
759*ba677afaSXin Li		file: &v2_2.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"},
760*ba677afaSXin Li	}
761*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
762*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
763*ba677afaSXin Li
764*ba677afaSXin Li	err := parser.parsePairFromFile2_2("ArtifactOfProjectName", "project1")
765*ba677afaSXin Li	if err != nil {
766*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
767*ba677afaSXin Li	}
768*ba677afaSXin Li	if parser.fileAOP == nil {
769*ba677afaSXin Li		t.Errorf("expected non-nil AOP pointer, got nil")
770*ba677afaSXin Li	}
771*ba677afaSXin Li	curPtr := parser.fileAOP
772*ba677afaSXin Li
773*ba677afaSXin Li	// now, a home page; pointer should stay
774*ba677afaSXin Li	err = parser.parsePairFromFile2_2("ArtifactOfProjectHomePage", "http://example.com/1/")
775*ba677afaSXin Li	if err != nil {
776*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
777*ba677afaSXin Li	}
778*ba677afaSXin Li	if parser.fileAOP != curPtr {
779*ba677afaSXin Li		t.Errorf("expected no change in AOP pointer, was %v, got %v", curPtr, parser.fileAOP)
780*ba677afaSXin Li	}
781*ba677afaSXin Li
782*ba677afaSXin Li	// a URI; pointer should stay
783*ba677afaSXin Li	err = parser.parsePairFromFile2_2("ArtifactOfProjectURI", "http://example.com/1/uri.whatever")
784*ba677afaSXin Li	if err != nil {
785*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
786*ba677afaSXin Li	}
787*ba677afaSXin Li	if parser.fileAOP != curPtr {
788*ba677afaSXin Li		t.Errorf("expected no change in AOP pointer, was %v, got %v", curPtr, parser.fileAOP)
789*ba677afaSXin Li	}
790*ba677afaSXin Li
791*ba677afaSXin Li	// now, another artifact name; pointer should change but be non-nil
792*ba677afaSXin Li	// now, a home page; pointer should stay
793*ba677afaSXin Li	err = parser.parsePairFromFile2_2("ArtifactOfProjectName", "project2")
794*ba677afaSXin Li	if err != nil {
795*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
796*ba677afaSXin Li	}
797*ba677afaSXin Li	if parser.fileAOP == curPtr {
798*ba677afaSXin Li		t.Errorf("expected change in AOP pointer, got no change")
799*ba677afaSXin Li	}
800*ba677afaSXin Li
801*ba677afaSXin Li	// finally, an unrelated tag; pointer should go away
802*ba677afaSXin Li	err = parser.parsePairFromFile2_2("FileComment", "whatever")
803*ba677afaSXin Li	if err != nil {
804*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
805*ba677afaSXin Li	}
806*ba677afaSXin Li	if parser.fileAOP != nil {
807*ba677afaSXin Li		t.Errorf("expected nil AOP pointer, got %v", parser.fileAOP)
808*ba677afaSXin Li	}
809*ba677afaSXin Li}
810*ba677afaSXin Li
811*ba677afaSXin Lifunc TestParser2_2FailsIfInvalidSPDXIDInFileSection(t *testing.T) {
812*ba677afaSXin Li	parser := tvParser2_2{
813*ba677afaSXin Li		doc: &v2_2.Document{Packages: []*v2_2.Package{}},
814*ba677afaSXin Li		st:  psFile2_2,
815*ba677afaSXin Li		pkg: &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
816*ba677afaSXin Li	}
817*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
818*ba677afaSXin Li
819*ba677afaSXin Li	// start with File Name
820*ba677afaSXin Li	err := parser.parsePairFromFile2_2("FileName", "f1.txt")
821*ba677afaSXin Li	if err != nil {
822*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
823*ba677afaSXin Li	}
824*ba677afaSXin Li	// invalid SPDX Identifier
825*ba677afaSXin Li	err = parser.parsePairFromFile2_2("SPDXID", "whoops")
826*ba677afaSXin Li	if err == nil {
827*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
828*ba677afaSXin Li	}
829*ba677afaSXin Li}
830*ba677afaSXin Li
831*ba677afaSXin Lifunc TestParser2_2FailsIfInvalidChecksumFormatInFileSection(t *testing.T) {
832*ba677afaSXin Li	parser := tvParser2_2{
833*ba677afaSXin Li		doc: &v2_2.Document{Packages: []*v2_2.Package{}},
834*ba677afaSXin Li		st:  psFile2_2,
835*ba677afaSXin Li		pkg: &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
836*ba677afaSXin Li	}
837*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
838*ba677afaSXin Li
839*ba677afaSXin Li	// start with File Name
840*ba677afaSXin Li	err := parser.parsePairFromFile2_2("FileName", "f1.txt")
841*ba677afaSXin Li	if err != nil {
842*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
843*ba677afaSXin Li	}
844*ba677afaSXin Li	// invalid format for checksum line, missing colon
845*ba677afaSXin Li	err = parser.parsePairFromFile2_2("FileChecksum", "SHA1 85ed0817af83a24ad8da68c2b5094de69833983c")
846*ba677afaSXin Li	if err == nil {
847*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
848*ba677afaSXin Li	}
849*ba677afaSXin Li}
850*ba677afaSXin Li
851*ba677afaSXin Lifunc TestParser2_1FailsIfUnknownChecksumTypeInFileSection(t *testing.T) {
852*ba677afaSXin Li	parser := tvParser2_2{
853*ba677afaSXin Li		doc: &v2_2.Document{Packages: []*v2_2.Package{}},
854*ba677afaSXin Li		st:  psFile2_2,
855*ba677afaSXin Li		pkg: &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
856*ba677afaSXin Li	}
857*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
858*ba677afaSXin Li
859*ba677afaSXin Li	// start with File Name
860*ba677afaSXin Li	err := parser.parsePairFromFile2_2("FileName", "f1.txt")
861*ba677afaSXin Li	if err != nil {
862*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
863*ba677afaSXin Li	}
864*ba677afaSXin Li	// unknown checksum type
865*ba677afaSXin Li	err = parser.parsePairFromFile2_2("FileChecksum", "Special: 85ed0817af83a24ad8da68c2b5094de69833983c")
866*ba677afaSXin Li	if err == nil {
867*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
868*ba677afaSXin Li	}
869*ba677afaSXin Li}
870*ba677afaSXin Li
871*ba677afaSXin Lifunc TestParser2_2FailsIfArtifactHomePageBeforeArtifactName(t *testing.T) {
872*ba677afaSXin Li	parser := tvParser2_2{
873*ba677afaSXin Li		doc: &v2_2.Document{Packages: []*v2_2.Package{}},
874*ba677afaSXin Li		st:  psFile2_2,
875*ba677afaSXin Li		pkg: &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
876*ba677afaSXin Li	}
877*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
878*ba677afaSXin Li
879*ba677afaSXin Li	// start with File Name
880*ba677afaSXin Li	err := parser.parsePairFromFile2_2("FileName", "f1.txt")
881*ba677afaSXin Li	if err != nil {
882*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
883*ba677afaSXin Li	}
884*ba677afaSXin Li	// artifact home page appears before artifact name
885*ba677afaSXin Li	err = parser.parsePairFromFile2_2("ArtifactOfProjectHomePage", "https://example.com")
886*ba677afaSXin Li	if err == nil {
887*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
888*ba677afaSXin Li	}
889*ba677afaSXin Li}
890*ba677afaSXin Li
891*ba677afaSXin Lifunc TestParser2_2FailsIfArtifactURIBeforeArtifactName(t *testing.T) {
892*ba677afaSXin Li	parser := tvParser2_2{
893*ba677afaSXin Li		doc: &v2_2.Document{Packages: []*v2_2.Package{}},
894*ba677afaSXin Li		st:  psFile2_2,
895*ba677afaSXin Li		pkg: &v2_2.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_2.File{}},
896*ba677afaSXin Li	}
897*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
898*ba677afaSXin Li
899*ba677afaSXin Li	// start with File Name
900*ba677afaSXin Li	err := parser.parsePairFromFile2_2("FileName", "f1.txt")
901*ba677afaSXin Li	if err != nil {
902*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
903*ba677afaSXin Li	}
904*ba677afaSXin Li	// artifact home page appears before artifact name
905*ba677afaSXin Li	err = parser.parsePairFromFile2_2("ArtifactOfProjectURI", "https://example.com")
906*ba677afaSXin Li	if err == nil {
907*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
908*ba677afaSXin Li	}
909*ba677afaSXin Li}
910*ba677afaSXin Li
911*ba677afaSXin Lifunc TestParser2_2FilesWithoutSpdxIdThrowError(t *testing.T) {
912*ba677afaSXin Li	// case 1: The previous file (packaged or unpackaged) does not contain spdx ID
913*ba677afaSXin Li	parser1 := tvParser2_2{
914*ba677afaSXin Li		doc:  &v2_2.Document{Packages: []*v2_2.Package{}},
915*ba677afaSXin Li		st:   psFile2_2,
916*ba677afaSXin Li		file: &v2_2.File{FileName: "FileName"},
917*ba677afaSXin Li	}
918*ba677afaSXin Li
919*ba677afaSXin Li	err := parser1.parsePair2_2("FileName", "f2")
920*ba677afaSXin Li	if err == nil {
921*ba677afaSXin Li		t.Errorf("file without SPDX Identifier getting accepted")
922*ba677afaSXin Li	}
923*ba677afaSXin Li
924*ba677afaSXin Li	// case 2: Invalid file with snippet
925*ba677afaSXin Li	// Last unpackaged file before the snippet start
926*ba677afaSXin Li	fileName := "f2.txt"
927*ba677afaSXin Li	sid1 := common.ElementID("s1")
928*ba677afaSXin Li	parser2 := tvParser2_2{
929*ba677afaSXin Li		doc:  &v2_2.Document{},
930*ba677afaSXin Li		st:   psCreationInfo2_2,
931*ba677afaSXin Li		file: &v2_2.File{FileName: fileName},
932*ba677afaSXin Li	}
933*ba677afaSXin Li	err = parser2.parsePair2_2("SnippetSPDXID", string(sid1))
934*ba677afaSXin Li	if err == nil {
935*ba677afaSXin Li		t.Errorf("file without SPDX Identifier getting accepted")
936*ba677afaSXin Li	}
937*ba677afaSXin Li
938*ba677afaSXin Li	// case 3: Invalid File without snippets
939*ba677afaSXin Li	// Last unpackaged file before the package starts
940*ba677afaSXin Li	// Last file of a package and New package starts
941*ba677afaSXin Li	parser3 := tvParser2_2{
942*ba677afaSXin Li		doc: &v2_2.Document{},
943*ba677afaSXin Li		st:  psCreationInfo2_2,
944*ba677afaSXin Li	}
945*ba677afaSXin Li	fileName = "f3.txt"
946*ba677afaSXin Li	err = parser3.parsePair2_2("FileName", fileName)
947*ba677afaSXin Li	if err != nil {
948*ba677afaSXin Li		t.Errorf("%s", err)
949*ba677afaSXin Li	}
950*ba677afaSXin Li	err = parser3.parsePair2_2("PackageName", "p2")
951*ba677afaSXin Li	if err == nil {
952*ba677afaSXin Li		t.Errorf("file without SPDX Identifier getting accepted")
953*ba677afaSXin Li	}
954*ba677afaSXin Li}
955