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