xref: /aosp_15_r20/external/spdx-tools/tvloader/parser2v1/parse_snippet_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 snippet section state change tests =====
12*ba677afaSXin Lifunc TestParser2_1SnippetStartsNewSnippetAfterParsingSnippetSPDXIDTag(t *testing.T) {
13*ba677afaSXin Li	// create the first snippet
14*ba677afaSXin Li	sid1 := common.ElementID("s1")
15*ba677afaSXin Li	parser := tvParser2_1{
16*ba677afaSXin Li		doc:     &v2_1.Document{Packages: []*v2_1.Package{}},
17*ba677afaSXin Li		st:      psSnippet2_1,
18*ba677afaSXin Li		pkg:     &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}},
19*ba677afaSXin Li		file:    &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}},
20*ba677afaSXin Li		snippet: &v2_1.Snippet{SnippetSPDXIdentifier: sid1},
21*ba677afaSXin Li	}
22*ba677afaSXin Li	s1 := parser.snippet
23*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
24*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
25*ba677afaSXin Li	parser.file.Snippets[sid1] = parser.snippet
26*ba677afaSXin Li
27*ba677afaSXin Li	// the File's Snippets should have this one only
28*ba677afaSXin Li	if len(parser.file.Snippets) != 1 {
29*ba677afaSXin Li		t.Errorf("Expected len(Snippets) to be 1, got %d", len(parser.file.Snippets))
30*ba677afaSXin Li	}
31*ba677afaSXin Li	if parser.file.Snippets["s1"] != s1 {
32*ba677afaSXin Li		t.Errorf("Expected snippet %v in Snippets[s1], got %v", s1, parser.file.Snippets["s1"])
33*ba677afaSXin Li	}
34*ba677afaSXin Li	if parser.file.Snippets["s1"].SnippetSPDXIdentifier != sid1 {
35*ba677afaSXin Li		t.Errorf("expected snippet ID %s in Snippets[s1], got %s", sid1, parser.file.Snippets["s1"].SnippetSPDXIdentifier)
36*ba677afaSXin Li	}
37*ba677afaSXin Li
38*ba677afaSXin Li	// now add a new snippet
39*ba677afaSXin Li	err := parser.parsePair2_1("SnippetSPDXID", "SPDXRef-s2")
40*ba677afaSXin Li	if err != nil {
41*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_1: %v", err)
42*ba677afaSXin Li	}
43*ba677afaSXin Li	// state should be correct
44*ba677afaSXin Li	if parser.st != psSnippet2_1 {
45*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psSnippet2_1, parser.st)
46*ba677afaSXin Li	}
47*ba677afaSXin Li	// and a snippet should be created
48*ba677afaSXin Li	if parser.snippet == nil {
49*ba677afaSXin Li		t.Fatalf("parser didn't create new snippet")
50*ba677afaSXin Li	}
51*ba677afaSXin Li	// and the snippet ID should be as expected
52*ba677afaSXin Li	if parser.snippet.SnippetSPDXIdentifier != "s2" {
53*ba677afaSXin Li		t.Errorf("expected snippet ID %s, got %s", "s2", parser.snippet.SnippetSPDXIdentifier)
54*ba677afaSXin Li	}
55*ba677afaSXin Li	// and the File's Snippets should be of size 2 and have these two
56*ba677afaSXin Li	if len(parser.file.Snippets) != 2 {
57*ba677afaSXin Li		t.Errorf("Expected len(Snippets) to be 2, got %d", len(parser.file.Snippets))
58*ba677afaSXin Li	}
59*ba677afaSXin Li	if parser.file.Snippets["s1"] != s1 {
60*ba677afaSXin Li		t.Errorf("Expected snippet %v in Snippets[s1], got %v", s1, parser.file.Snippets["s1"])
61*ba677afaSXin Li	}
62*ba677afaSXin Li	if parser.file.Snippets["s1"].SnippetSPDXIdentifier != sid1 {
63*ba677afaSXin Li		t.Errorf("expected snippet ID %s in Snippets[s1], got %s", sid1, parser.file.Snippets["s1"].SnippetSPDXIdentifier)
64*ba677afaSXin Li	}
65*ba677afaSXin Li	if parser.file.Snippets["s2"] != parser.snippet {
66*ba677afaSXin Li		t.Errorf("Expected snippet %v in Snippets[s2], got %v", parser.snippet, parser.file.Snippets["s2"])
67*ba677afaSXin Li	}
68*ba677afaSXin Li	if parser.file.Snippets["s2"].SnippetSPDXIdentifier != "s2" {
69*ba677afaSXin Li		t.Errorf("expected snippet ID %s in Snippets[s2], got %s", "s2", parser.file.Snippets["s2"].SnippetSPDXIdentifier)
70*ba677afaSXin Li	}
71*ba677afaSXin Li}
72*ba677afaSXin Li
73*ba677afaSXin Lifunc TestParser2_1SnippetStartsNewPackageAfterParsingPackageNameTag(t *testing.T) {
74*ba677afaSXin Li	parser := tvParser2_1{
75*ba677afaSXin Li		doc:     &v2_1.Document{Packages: []*v2_1.Package{}},
76*ba677afaSXin Li		st:      psSnippet2_1,
77*ba677afaSXin Li		pkg:     &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}},
78*ba677afaSXin Li		file:    &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}},
79*ba677afaSXin Li		snippet: &v2_1.Snippet{SnippetSPDXIdentifier: "s1"},
80*ba677afaSXin Li	}
81*ba677afaSXin Li	p1 := parser.pkg
82*ba677afaSXin Li	f1 := parser.file
83*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
84*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
85*ba677afaSXin Li	parser.file.Snippets["s1"] = parser.snippet
86*ba677afaSXin Li
87*ba677afaSXin Li	// now add a new package
88*ba677afaSXin Li	p2Name := "package2"
89*ba677afaSXin Li	err := parser.parsePair2_1("PackageName", p2Name)
90*ba677afaSXin Li	if err != nil {
91*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_1: %v", err)
92*ba677afaSXin Li	}
93*ba677afaSXin Li	// state should go back to Package
94*ba677afaSXin Li	if parser.st != psPackage2_1 {
95*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psPackage2_1, parser.st)
96*ba677afaSXin Li	}
97*ba677afaSXin Li	// and a package should be created
98*ba677afaSXin Li	if parser.pkg == nil {
99*ba677afaSXin Li		t.Fatalf("parser didn't create new pkg")
100*ba677afaSXin Li	}
101*ba677afaSXin Li	// and the package name should be as expected
102*ba677afaSXin Li	if parser.pkg.PackageName != p2Name {
103*ba677afaSXin Li		t.Errorf("expected package name %s, got %s", p2Name, parser.pkg.PackageName)
104*ba677afaSXin Li	}
105*ba677afaSXin Li	// and the package should default to true for FilesAnalyzed
106*ba677afaSXin Li	if parser.pkg.FilesAnalyzed != true {
107*ba677afaSXin Li		t.Errorf("expected FilesAnalyzed to default to true, got false")
108*ba677afaSXin Li	}
109*ba677afaSXin Li	if parser.pkg.IsFilesAnalyzedTagPresent != false {
110*ba677afaSXin Li		t.Errorf("expected IsFilesAnalyzedTagPresent to default to false, got true")
111*ba677afaSXin Li	}
112*ba677afaSXin Li	// and the Document's Packages should still be of size 1 b/c no SPDX
113*ba677afaSXin Li	// identifier has been seen yet
114*ba677afaSXin Li	if len(parser.doc.Packages) != 1 {
115*ba677afaSXin Li		t.Errorf("Expected len(Packages) to be 1, got %d", len(parser.doc.Packages))
116*ba677afaSXin Li	}
117*ba677afaSXin Li	if parser.doc.Packages[0] != p1 {
118*ba677afaSXin Li		t.Errorf("Expected package %v in Packages[package1], got %v", p1, parser.doc.Packages[0])
119*ba677afaSXin Li	}
120*ba677afaSXin Li	if parser.doc.Packages[0].PackageName != "package1" {
121*ba677afaSXin Li		t.Errorf("expected package name %s in Packages[package1], got %s", "package1", parser.doc.Packages[0].PackageName)
122*ba677afaSXin Li	}
123*ba677afaSXin Li	// and the first Package's Files should be of size 1 and have f1 only
124*ba677afaSXin Li	if len(parser.doc.Packages[0].Files) != 1 {
125*ba677afaSXin Li		t.Errorf("Expected 1 file in Packages[package1].Files, got %d", len(parser.doc.Packages[0].Files))
126*ba677afaSXin Li	}
127*ba677afaSXin Li	if parser.doc.Packages[0].Files[0] != f1 {
128*ba677afaSXin Li		t.Errorf("Expected file %v in Files[f1], got %v", f1, parser.doc.Packages[0].Files[0])
129*ba677afaSXin Li	}
130*ba677afaSXin Li	if parser.doc.Packages[0].Files[0].FileName != "f1.txt" {
131*ba677afaSXin Li		t.Errorf("expected file name %s in Files[f1], got %s", "f1.txt", parser.doc.Packages[0].Files[0].FileName)
132*ba677afaSXin Li	}
133*ba677afaSXin Li	// and the new Package should have no files
134*ba677afaSXin Li	if len(parser.pkg.Files) != 0 {
135*ba677afaSXin Li		t.Errorf("Expected no files in Packages[1].Files, got %d", len(parser.pkg.Files))
136*ba677afaSXin Li	}
137*ba677afaSXin Li	// and the current file should be nil
138*ba677afaSXin Li	if parser.file != nil {
139*ba677afaSXin Li		t.Errorf("Expected nil for parser.file, got %v", parser.file)
140*ba677afaSXin Li	}
141*ba677afaSXin Li	// and the current snippet should be nil
142*ba677afaSXin Li	if parser.snippet != nil {
143*ba677afaSXin Li		t.Errorf("Expected nil for parser.snippet, got %v", parser.snippet)
144*ba677afaSXin Li	}
145*ba677afaSXin Li}
146*ba677afaSXin Li
147*ba677afaSXin Lifunc TestParser2_1SnippetMovesToFileAfterParsingFileNameTag(t *testing.T) {
148*ba677afaSXin Li	f1Name := "f1.txt"
149*ba677afaSXin Li	parser := tvParser2_1{
150*ba677afaSXin Li		doc:     &v2_1.Document{Packages: []*v2_1.Package{}},
151*ba677afaSXin Li		st:      psSnippet2_1,
152*ba677afaSXin Li		pkg:     &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}},
153*ba677afaSXin Li		file:    &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}},
154*ba677afaSXin Li		snippet: &v2_1.Snippet{SnippetSPDXIdentifier: "s1"},
155*ba677afaSXin Li	}
156*ba677afaSXin Li	p1 := parser.pkg
157*ba677afaSXin Li	f1 := parser.file
158*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
159*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
160*ba677afaSXin Li	parser.file.Snippets["s1"] = parser.snippet
161*ba677afaSXin Li
162*ba677afaSXin Li	f2Name := "f2.txt"
163*ba677afaSXin Li	err := parser.parsePair2_1("FileName", f2Name)
164*ba677afaSXin Li	if err != nil {
165*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_1: %v", err)
166*ba677afaSXin Li	}
167*ba677afaSXin Li	// state should be correct
168*ba677afaSXin Li	if parser.st != psFile2_1 {
169*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psSnippet2_1, parser.st)
170*ba677afaSXin Li	}
171*ba677afaSXin Li	// and current package should remain what it was
172*ba677afaSXin Li	if parser.pkg != p1 {
173*ba677afaSXin Li		t.Fatalf("expected package to remain %v, got %v", p1, parser.pkg)
174*ba677afaSXin Li	}
175*ba677afaSXin Li	// and a file should be created
176*ba677afaSXin Li	if parser.file == nil {
177*ba677afaSXin Li		t.Fatalf("parser didn't create new file")
178*ba677afaSXin Li	}
179*ba677afaSXin Li	// and the file name should be as expected
180*ba677afaSXin Li	if parser.file.FileName != f2Name {
181*ba677afaSXin Li		t.Errorf("expected file name %s, got %s", f2Name, parser.file.FileName)
182*ba677afaSXin Li	}
183*ba677afaSXin Li	// and the Package's Files should still be of size 1 since we haven't seen
184*ba677afaSXin Li	// an SPDX identifier yet for this new file
185*ba677afaSXin Li	if len(parser.pkg.Files) != 1 {
186*ba677afaSXin Li		t.Errorf("Expected len(Files) to be 1, got %d", len(parser.pkg.Files))
187*ba677afaSXin Li	}
188*ba677afaSXin Li	if parser.pkg.Files[0] != f1 {
189*ba677afaSXin Li		t.Errorf("Expected file %v in Files[f1], got %v", f1, parser.pkg.Files[0])
190*ba677afaSXin Li	}
191*ba677afaSXin Li	if parser.pkg.Files[0].FileName != f1Name {
192*ba677afaSXin Li		t.Errorf("expected file name %s in Files[f1], got %s", f1Name, parser.pkg.Files[0].FileName)
193*ba677afaSXin Li	}
194*ba677afaSXin Li	// and the current snippet should be nil
195*ba677afaSXin Li	if parser.snippet != nil {
196*ba677afaSXin Li		t.Errorf("Expected nil for parser.snippet, got %v", parser.snippet)
197*ba677afaSXin Li	}
198*ba677afaSXin Li}
199*ba677afaSXin Li
200*ba677afaSXin Lifunc TestParser2_1SnippetMovesToOtherLicenseAfterParsingLicenseIDTag(t *testing.T) {
201*ba677afaSXin Li	parser := tvParser2_1{
202*ba677afaSXin Li		doc:     &v2_1.Document{Packages: []*v2_1.Package{}},
203*ba677afaSXin Li		st:      psSnippet2_1,
204*ba677afaSXin Li		pkg:     &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}},
205*ba677afaSXin Li		file:    &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}},
206*ba677afaSXin Li		snippet: &v2_1.Snippet{SnippetSPDXIdentifier: "s1"},
207*ba677afaSXin Li	}
208*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
209*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
210*ba677afaSXin Li	parser.file.Snippets["s1"] = parser.snippet
211*ba677afaSXin Li
212*ba677afaSXin Li	err := parser.parsePair2_1("LicenseID", "LicenseRef-TestLic")
213*ba677afaSXin Li	if err != nil {
214*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_1: %v", err)
215*ba677afaSXin Li	}
216*ba677afaSXin Li	if parser.st != psOtherLicense2_1 {
217*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psOtherLicense2_1, parser.st)
218*ba677afaSXin Li	}
219*ba677afaSXin Li}
220*ba677afaSXin Li
221*ba677afaSXin Lifunc TestParser2_1SnippetMovesToReviewAfterParsingReviewerTag(t *testing.T) {
222*ba677afaSXin Li	parser := tvParser2_1{
223*ba677afaSXin Li		doc:     &v2_1.Document{Packages: []*v2_1.Package{}},
224*ba677afaSXin Li		st:      psSnippet2_1,
225*ba677afaSXin Li		pkg:     &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}},
226*ba677afaSXin Li		file:    &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}},
227*ba677afaSXin Li		snippet: &v2_1.Snippet{SnippetSPDXIdentifier: "s1"},
228*ba677afaSXin Li	}
229*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
230*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
231*ba677afaSXin Li	parser.file.Snippets["s1"] = parser.snippet
232*ba677afaSXin Li
233*ba677afaSXin Li	err := parser.parsePair2_1("Reviewer", "Person: John Doe")
234*ba677afaSXin Li	if err != nil {
235*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_1: %v", err)
236*ba677afaSXin Li	}
237*ba677afaSXin Li	if parser.st != psReview2_1 {
238*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psReview2_1, parser.st)
239*ba677afaSXin Li	}
240*ba677afaSXin Li}
241*ba677afaSXin Li
242*ba677afaSXin Lifunc TestParser2_1SnippetStaysAfterParsingRelationshipTags(t *testing.T) {
243*ba677afaSXin Li	parser := tvParser2_1{
244*ba677afaSXin Li		doc:     &v2_1.Document{Packages: []*v2_1.Package{}},
245*ba677afaSXin Li		st:      psSnippet2_1,
246*ba677afaSXin Li		pkg:     &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}},
247*ba677afaSXin Li		file:    &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}},
248*ba677afaSXin Li		snippet: &v2_1.Snippet{SnippetSPDXIdentifier: "s1"},
249*ba677afaSXin Li	}
250*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
251*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
252*ba677afaSXin Li	parser.file.Snippets["s1"] = parser.snippet
253*ba677afaSXin Li
254*ba677afaSXin Li	err := parser.parsePair2_1("Relationship", "SPDXRef-blah CONTAINS SPDXRef-blah-else")
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	// state should remain unchanged
259*ba677afaSXin Li	if parser.st != psSnippet2_1 {
260*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psSnippet2_1, parser.st)
261*ba677afaSXin Li	}
262*ba677afaSXin Li	// and the relationship should be in the Document's Relationships
263*ba677afaSXin Li	if len(parser.doc.Relationships) != 1 {
264*ba677afaSXin Li		t.Fatalf("expected doc.Relationships to have len 1, got %d", len(parser.doc.Relationships))
265*ba677afaSXin Li	}
266*ba677afaSXin Li	deID := parser.doc.Relationships[0].RefA
267*ba677afaSXin Li	if deID.DocumentRefID != "" || deID.ElementRefID != "blah" {
268*ba677afaSXin Li		t.Errorf("expected RefA to be %s, got %s", "blah", parser.doc.Relationships[0].RefA)
269*ba677afaSXin Li	}
270*ba677afaSXin Li
271*ba677afaSXin Li	err = parser.parsePair2_1("RelationshipComment", "blah")
272*ba677afaSXin Li	if err != nil {
273*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_1: %v", err)
274*ba677afaSXin Li	}
275*ba677afaSXin Li	// state should still remain unchanged
276*ba677afaSXin Li	if parser.st != psSnippet2_1 {
277*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psSnippet2_1, parser.st)
278*ba677afaSXin Li	}
279*ba677afaSXin Li}
280*ba677afaSXin Li
281*ba677afaSXin Lifunc TestParser2_1SnippetStaysAfterParsingAnnotationTags(t *testing.T) {
282*ba677afaSXin Li	parser := tvParser2_1{
283*ba677afaSXin Li		doc:     &v2_1.Document{Packages: []*v2_1.Package{}},
284*ba677afaSXin Li		st:      psSnippet2_1,
285*ba677afaSXin Li		pkg:     &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}},
286*ba677afaSXin Li		file:    &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}},
287*ba677afaSXin Li		snippet: &v2_1.Snippet{SnippetSPDXIdentifier: "s1"},
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	parser.file.Snippets["s1"] = parser.snippet
292*ba677afaSXin Li
293*ba677afaSXin Li	err := parser.parsePair2_1("Annotator", "Person: John Doe ()")
294*ba677afaSXin Li	if err != nil {
295*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_1: %v", err)
296*ba677afaSXin Li	}
297*ba677afaSXin Li	if parser.st != psSnippet2_1 {
298*ba677afaSXin Li		t.Errorf("parser is in state %v, expected %v", parser.st, psSnippet2_1)
299*ba677afaSXin Li	}
300*ba677afaSXin Li
301*ba677afaSXin Li	err = parser.parsePair2_1("AnnotationDate", "2018-09-15T00:36:00Z")
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	if parser.st != psSnippet2_1 {
306*ba677afaSXin Li		t.Errorf("parser is in state %v, expected %v", parser.st, psSnippet2_1)
307*ba677afaSXin Li	}
308*ba677afaSXin Li
309*ba677afaSXin Li	err = parser.parsePair2_1("AnnotationType", "REVIEW")
310*ba677afaSXin Li	if err != nil {
311*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_1: %v", err)
312*ba677afaSXin Li	}
313*ba677afaSXin Li	if parser.st != psSnippet2_1 {
314*ba677afaSXin Li		t.Errorf("parser is in state %v, expected %v", parser.st, psSnippet2_1)
315*ba677afaSXin Li	}
316*ba677afaSXin Li
317*ba677afaSXin Li	err = parser.parsePair2_1("SPDXREF", "SPDXRef-45")
318*ba677afaSXin Li	if err != nil {
319*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_1: %v", err)
320*ba677afaSXin Li	}
321*ba677afaSXin Li	if parser.st != psSnippet2_1 {
322*ba677afaSXin Li		t.Errorf("parser is in state %v, expected %v", parser.st, psSnippet2_1)
323*ba677afaSXin Li	}
324*ba677afaSXin Li
325*ba677afaSXin Li	err = parser.parsePair2_1("AnnotationComment", "i guess i had something to say about this particular file")
326*ba677afaSXin Li	if err != nil {
327*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_1: %v", err)
328*ba677afaSXin Li	}
329*ba677afaSXin Li	if parser.st != psSnippet2_1 {
330*ba677afaSXin Li		t.Errorf("parser is in state %v, expected %v", parser.st, psSnippet2_1)
331*ba677afaSXin Li	}
332*ba677afaSXin Li
333*ba677afaSXin Li	// and the annotation should be in the Document's Annotations
334*ba677afaSXin Li	if len(parser.doc.Annotations) != 1 {
335*ba677afaSXin Li		t.Fatalf("expected doc.Annotations to have len 1, got %d", len(parser.doc.Annotations))
336*ba677afaSXin Li	}
337*ba677afaSXin Li	if parser.doc.Annotations[0].Annotator.Annotator != "John Doe ()" {
338*ba677afaSXin Li		t.Errorf("expected Annotator to be %s, got %s", "John Doe ()", parser.doc.Annotations[0].Annotator)
339*ba677afaSXin Li	}
340*ba677afaSXin Li}
341*ba677afaSXin Li
342*ba677afaSXin Li// ===== Snippet data section tests =====
343*ba677afaSXin Lifunc TestParser2_1CanParseSnippetTags(t *testing.T) {
344*ba677afaSXin Li	parser := tvParser2_1{
345*ba677afaSXin Li		doc:     &v2_1.Document{Packages: []*v2_1.Package{}},
346*ba677afaSXin Li		st:      psSnippet2_1,
347*ba677afaSXin Li		pkg:     &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}},
348*ba677afaSXin Li		file:    &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}},
349*ba677afaSXin Li		snippet: &v2_1.Snippet{},
350*ba677afaSXin Li	}
351*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
352*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
353*ba677afaSXin Li
354*ba677afaSXin Li	// Snippet SPDX Identifier
355*ba677afaSXin Li	err := parser.parsePairFromSnippet2_1("SnippetSPDXID", "SPDXRef-s1")
356*ba677afaSXin Li	if err != nil {
357*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
358*ba677afaSXin Li	}
359*ba677afaSXin Li	if parser.snippet.SnippetSPDXIdentifier != "s1" {
360*ba677afaSXin Li		t.Errorf("got %v for SnippetSPDXIdentifier", parser.snippet.SnippetSPDXIdentifier)
361*ba677afaSXin Li	}
362*ba677afaSXin Li
363*ba677afaSXin Li	// Snippet from File SPDX Identifier
364*ba677afaSXin Li	err = parser.parsePairFromSnippet2_1("SnippetFromFileSPDXID", "SPDXRef-f1")
365*ba677afaSXin Li	if err != nil {
366*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
367*ba677afaSXin Li	}
368*ba677afaSXin Li	wantDeID := common.DocElementID{DocumentRefID: "", ElementRefID: common.ElementID("f1")}
369*ba677afaSXin Li	if parser.snippet.SnippetFromFileSPDXIdentifier != wantDeID.ElementRefID {
370*ba677afaSXin Li		t.Errorf("got %v for SnippetFromFileSPDXIdentifier", parser.snippet.SnippetFromFileSPDXIdentifier)
371*ba677afaSXin Li	}
372*ba677afaSXin Li
373*ba677afaSXin Li	// Snippet Byte Range
374*ba677afaSXin Li	err = parser.parsePairFromSnippet2_1("SnippetByteRange", "20:320")
375*ba677afaSXin Li	if err != nil {
376*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
377*ba677afaSXin Li	}
378*ba677afaSXin Li	if parser.snippet.Ranges[0].StartPointer.Offset != 20 {
379*ba677afaSXin Li		t.Errorf("got %v for SnippetByteRangeStart", parser.snippet.Ranges[0].StartPointer.Offset)
380*ba677afaSXin Li	}
381*ba677afaSXin Li	if parser.snippet.Ranges[0].EndPointer.Offset != 320 {
382*ba677afaSXin Li		t.Errorf("got %v for SnippetByteRangeEnd", parser.snippet.Ranges[0].EndPointer.Offset)
383*ba677afaSXin Li	}
384*ba677afaSXin Li
385*ba677afaSXin Li	// Snippet Line Range
386*ba677afaSXin Li	err = parser.parsePairFromSnippet2_1("SnippetLineRange", "5:12")
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.snippet.Ranges[1].StartPointer.LineNumber != 5 {
391*ba677afaSXin Li		t.Errorf("got %v for SnippetLineRangeStart", parser.snippet.Ranges[1].StartPointer.LineNumber)
392*ba677afaSXin Li	}
393*ba677afaSXin Li	if parser.snippet.Ranges[1].EndPointer.LineNumber != 12 {
394*ba677afaSXin Li		t.Errorf("got %v for SnippetLineRangeEnd", parser.snippet.Ranges[1].EndPointer.LineNumber)
395*ba677afaSXin Li	}
396*ba677afaSXin Li
397*ba677afaSXin Li	// Snippet Concluded License
398*ba677afaSXin Li	err = parser.parsePairFromSnippet2_1("SnippetLicenseConcluded", "BSD-3-Clause")
399*ba677afaSXin Li	if err != nil {
400*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
401*ba677afaSXin Li	}
402*ba677afaSXin Li	if parser.snippet.SnippetLicenseConcluded != "BSD-3-Clause" {
403*ba677afaSXin Li		t.Errorf("got %v for SnippetLicenseConcluded", parser.snippet.SnippetLicenseConcluded)
404*ba677afaSXin Li	}
405*ba677afaSXin Li
406*ba677afaSXin Li	// License Information in Snippet
407*ba677afaSXin Li	lics := []string{
408*ba677afaSXin Li		"Apache-2.0",
409*ba677afaSXin Li		"GPL-2.0-or-later",
410*ba677afaSXin Li		"CC0-1.0",
411*ba677afaSXin Li	}
412*ba677afaSXin Li	for _, lic := range lics {
413*ba677afaSXin Li		err = parser.parsePairFromSnippet2_1("LicenseInfoInSnippet", lic)
414*ba677afaSXin Li		if err != nil {
415*ba677afaSXin Li			t.Errorf("expected nil error, got %v", err)
416*ba677afaSXin Li		}
417*ba677afaSXin Li	}
418*ba677afaSXin Li	for _, licWant := range lics {
419*ba677afaSXin Li		flagFound := false
420*ba677afaSXin Li		for _, licCheck := range parser.snippet.LicenseInfoInSnippet {
421*ba677afaSXin Li			if licWant == licCheck {
422*ba677afaSXin Li				flagFound = true
423*ba677afaSXin Li			}
424*ba677afaSXin Li		}
425*ba677afaSXin Li		if flagFound == false {
426*ba677afaSXin Li			t.Errorf("didn't find %s in LicenseInfoInSnippet", licWant)
427*ba677afaSXin Li		}
428*ba677afaSXin Li	}
429*ba677afaSXin Li	if len(lics) != len(parser.snippet.LicenseInfoInSnippet) {
430*ba677afaSXin Li		t.Errorf("expected %d licenses in LicenseInfoInSnippet, got %d", len(lics),
431*ba677afaSXin Li			len(parser.snippet.LicenseInfoInSnippet))
432*ba677afaSXin Li	}
433*ba677afaSXin Li
434*ba677afaSXin Li	// Snippet Comments on License
435*ba677afaSXin Li	err = parser.parsePairFromSnippet2_1("SnippetLicenseComments", "this is a comment about the licenses")
436*ba677afaSXin Li	if err != nil {
437*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
438*ba677afaSXin Li	}
439*ba677afaSXin Li	if parser.snippet.SnippetLicenseComments != "this is a comment about the licenses" {
440*ba677afaSXin Li		t.Errorf("got %v for SnippetLicenseComments", parser.snippet.SnippetLicenseComments)
441*ba677afaSXin Li	}
442*ba677afaSXin Li
443*ba677afaSXin Li	// Snippet Copyright Text
444*ba677afaSXin Li	err = parser.parsePairFromSnippet2_1("SnippetCopyrightText", "copyright (c) John Doe and friends")
445*ba677afaSXin Li	if err != nil {
446*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
447*ba677afaSXin Li	}
448*ba677afaSXin Li	if parser.snippet.SnippetCopyrightText != "copyright (c) John Doe and friends" {
449*ba677afaSXin Li		t.Errorf("got %v for SnippetCopyrightText", parser.snippet.SnippetCopyrightText)
450*ba677afaSXin Li	}
451*ba677afaSXin Li
452*ba677afaSXin Li	// Snippet Comment
453*ba677afaSXin Li	err = parser.parsePairFromSnippet2_1("SnippetComment", "this is a comment about the snippet")
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.snippet.SnippetComment != "this is a comment about the snippet" {
458*ba677afaSXin Li		t.Errorf("got %v for SnippetComment", parser.snippet.SnippetComment)
459*ba677afaSXin Li	}
460*ba677afaSXin Li
461*ba677afaSXin Li	// Snippet Name
462*ba677afaSXin Li	err = parser.parsePairFromSnippet2_1("SnippetName", "from some other package called abc")
463*ba677afaSXin Li	if err != nil {
464*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
465*ba677afaSXin Li	}
466*ba677afaSXin Li	if parser.snippet.SnippetName != "from some other package called abc" {
467*ba677afaSXin Li		t.Errorf("got %v for SnippetName", parser.snippet.SnippetName)
468*ba677afaSXin Li	}
469*ba677afaSXin Li}
470*ba677afaSXin Li
471*ba677afaSXin Lifunc TestParser2_1SnippetUnknownTagFails(t *testing.T) {
472*ba677afaSXin Li	parser := tvParser2_1{
473*ba677afaSXin Li		doc:     &v2_1.Document{Packages: []*v2_1.Package{}},
474*ba677afaSXin Li		st:      psSnippet2_1,
475*ba677afaSXin Li		pkg:     &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}},
476*ba677afaSXin Li		file:    &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}},
477*ba677afaSXin Li		snippet: &v2_1.Snippet{SnippetSPDXIdentifier: "s1"},
478*ba677afaSXin Li	}
479*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
480*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
481*ba677afaSXin Li
482*ba677afaSXin Li	err := parser.parsePairFromSnippet2_1("blah", "something")
483*ba677afaSXin Li	if err == nil {
484*ba677afaSXin Li		t.Errorf("expected error from parsing unknown tag")
485*ba677afaSXin Li	}
486*ba677afaSXin Li}
487*ba677afaSXin Li
488*ba677afaSXin Lifunc TestParser2_1FailsForInvalidSnippetSPDXID(t *testing.T) {
489*ba677afaSXin Li	parser := tvParser2_1{
490*ba677afaSXin Li		doc:     &v2_1.Document{Packages: []*v2_1.Package{}},
491*ba677afaSXin Li		st:      psSnippet2_1,
492*ba677afaSXin Li		pkg:     &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}},
493*ba677afaSXin Li		file:    &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}},
494*ba677afaSXin Li		snippet: &v2_1.Snippet{},
495*ba677afaSXin Li	}
496*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
497*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
498*ba677afaSXin Li
499*ba677afaSXin Li	// invalid Snippet SPDX Identifier
500*ba677afaSXin Li	err := parser.parsePairFromSnippet2_1("SnippetSPDXID", "whoops")
501*ba677afaSXin Li	if err == nil {
502*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
503*ba677afaSXin Li	}
504*ba677afaSXin Li}
505*ba677afaSXin Li
506*ba677afaSXin Lifunc TestParser2_1FailsForInvalidSnippetFromFileSPDXID(t *testing.T) {
507*ba677afaSXin Li	parser := tvParser2_1{
508*ba677afaSXin Li		doc:     &v2_1.Document{Packages: []*v2_1.Package{}},
509*ba677afaSXin Li		st:      psSnippet2_1,
510*ba677afaSXin Li		pkg:     &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}},
511*ba677afaSXin Li		file:    &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}},
512*ba677afaSXin Li		snippet: &v2_1.Snippet{},
513*ba677afaSXin Li	}
514*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
515*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
516*ba677afaSXin Li
517*ba677afaSXin Li	// start with Snippet SPDX Identifier
518*ba677afaSXin Li	err := parser.parsePairFromSnippet2_1("SnippetSPDXID", "SPDXRef-s1")
519*ba677afaSXin Li	if err != nil {
520*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
521*ba677afaSXin Li	}
522*ba677afaSXin Li	// invalid From File identifier
523*ba677afaSXin Li	err = parser.parsePairFromSnippet2_1("SnippetFromFileSPDXID", "whoops")
524*ba677afaSXin Li	if err == nil {
525*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
526*ba677afaSXin Li	}
527*ba677afaSXin Li}
528*ba677afaSXin Li
529*ba677afaSXin Lifunc TestParser2_1FailsForInvalidSnippetByteValues(t *testing.T) {
530*ba677afaSXin Li	parser := tvParser2_1{
531*ba677afaSXin Li		doc:     &v2_1.Document{Packages: []*v2_1.Package{}},
532*ba677afaSXin Li		st:      psSnippet2_1,
533*ba677afaSXin Li		pkg:     &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}},
534*ba677afaSXin Li		file:    &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}},
535*ba677afaSXin Li		snippet: &v2_1.Snippet{},
536*ba677afaSXin Li	}
537*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
538*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
539*ba677afaSXin Li
540*ba677afaSXin Li	// start with Snippet SPDX Identifier
541*ba677afaSXin Li	err := parser.parsePairFromSnippet2_1("SnippetSPDXID", "SPDXRef-s1")
542*ba677afaSXin Li	if err != nil {
543*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
544*ba677afaSXin Li	}
545*ba677afaSXin Li	// invalid byte formats and values
546*ba677afaSXin Li	err = parser.parsePairFromSnippet2_1("SnippetByteRange", "200 210")
547*ba677afaSXin Li	if err == nil {
548*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
549*ba677afaSXin Li	}
550*ba677afaSXin Li	err = parser.parsePairFromSnippet2_1("SnippetByteRange", "a:210")
551*ba677afaSXin Li	if err == nil {
552*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
553*ba677afaSXin Li	}
554*ba677afaSXin Li	err = parser.parsePairFromSnippet2_1("SnippetByteRange", "200:a")
555*ba677afaSXin Li	if err == nil {
556*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
557*ba677afaSXin Li	}
558*ba677afaSXin Li}
559*ba677afaSXin Li
560*ba677afaSXin Lifunc TestParser2_1FailsForInvalidSnippetLineValues(t *testing.T) {
561*ba677afaSXin Li	parser := tvParser2_1{
562*ba677afaSXin Li		doc:     &v2_1.Document{Packages: []*v2_1.Package{}},
563*ba677afaSXin Li		st:      psSnippet2_1,
564*ba677afaSXin Li		pkg:     &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}},
565*ba677afaSXin Li		file:    &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}},
566*ba677afaSXin Li		snippet: &v2_1.Snippet{},
567*ba677afaSXin Li	}
568*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
569*ba677afaSXin Li	parser.pkg.Files = append(parser.pkg.Files, parser.file)
570*ba677afaSXin Li
571*ba677afaSXin Li	// start with Snippet SPDX Identifier
572*ba677afaSXin Li	err := parser.parsePairFromSnippet2_1("SnippetSPDXID", "SPDXRef-s1")
573*ba677afaSXin Li	if err != nil {
574*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
575*ba677afaSXin Li	}
576*ba677afaSXin Li	// invalid byte formats and values
577*ba677afaSXin Li	err = parser.parsePairFromSnippet2_1("SnippetLineRange", "200 210")
578*ba677afaSXin Li	if err == nil {
579*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
580*ba677afaSXin Li	}
581*ba677afaSXin Li	err = parser.parsePairFromSnippet2_1("SnippetLineRange", "a:210")
582*ba677afaSXin Li	if err == nil {
583*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
584*ba677afaSXin Li	}
585*ba677afaSXin Li	err = parser.parsePairFromSnippet2_1("SnippetLineRange", "200:a")
586*ba677afaSXin Li	if err == nil {
587*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
588*ba677afaSXin Li	}
589*ba677afaSXin Li}
590*ba677afaSXin Li
591*ba677afaSXin Lifunc TestParser2_1FilesWithoutSpdxIdThrowErrorWithSnippets(t *testing.T) {
592*ba677afaSXin Li	// Invalid file with snippet
593*ba677afaSXin Li	// Last unpackaged file before the snippet starts
594*ba677afaSXin Li	// Last file of a package and new snippet starts
595*ba677afaSXin Li	fileName := "f2.txt"
596*ba677afaSXin Li	sid1 := common.ElementID("s1")
597*ba677afaSXin Li	parser2 := tvParser2_1{
598*ba677afaSXin Li		doc:  &v2_1.Document{},
599*ba677afaSXin Li		st:   psCreationInfo2_1,
600*ba677afaSXin Li		file: &v2_1.File{FileName: fileName},
601*ba677afaSXin Li	}
602*ba677afaSXin Li	err := parser2.parsePair2_1("SnippetSPDXID", string(sid1))
603*ba677afaSXin Li	if err == nil {
604*ba677afaSXin Li		t.Errorf("files without SPDX Identifiers getting accepted")
605*ba677afaSXin Li	}
606*ba677afaSXin Li
607*ba677afaSXin Li}
608