xref: /aosp_15_r20/external/spdx-tools/tvloader/parser2v3/parse_package_test.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
2*ba677afaSXin Lipackage parser2v3
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_3"
10*ba677afaSXin Li)
11*ba677afaSXin Li
12*ba677afaSXin Li// ===== Parser package section state change tests =====
13*ba677afaSXin Lifunc TestParser2_3PackageStartsNewPackageAfterParsingPackageNameTag(t *testing.T) {
14*ba677afaSXin Li	// create the first package
15*ba677afaSXin Li	pkgOldName := "p1"
16*ba677afaSXin Li
17*ba677afaSXin Li	parser := tvParser2_3{
18*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
19*ba677afaSXin Li		st:  psPackage2_3,
20*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: pkgOldName, PackageSPDXIdentifier: "p1"},
21*ba677afaSXin Li	}
22*ba677afaSXin Li	pkgOld := parser.pkg
23*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, pkgOld)
24*ba677afaSXin Li	// the Document's Packages should have this one only
25*ba677afaSXin Li	if parser.doc.Packages[0] != pkgOld {
26*ba677afaSXin Li		t.Errorf("expected package %v, got %v", pkgOld, parser.doc.Packages[0])
27*ba677afaSXin Li	}
28*ba677afaSXin Li	if len(parser.doc.Packages) != 1 {
29*ba677afaSXin Li		t.Errorf("expected 1 package, got %d", len(parser.doc.Packages))
30*ba677afaSXin Li	}
31*ba677afaSXin Li
32*ba677afaSXin Li	// now add a new package
33*ba677afaSXin Li	pkgName := "p2"
34*ba677afaSXin Li	err := parser.parsePair2_3("PackageName", pkgName)
35*ba677afaSXin Li	if err != nil {
36*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_3: %v", err)
37*ba677afaSXin Li	}
38*ba677afaSXin Li	// state should be correct
39*ba677afaSXin Li	if parser.st != psPackage2_3 {
40*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psPackage2_3, parser.st)
41*ba677afaSXin Li	}
42*ba677afaSXin Li	// and a package should be created
43*ba677afaSXin Li	if parser.pkg == nil {
44*ba677afaSXin Li		t.Fatalf("parser didn't create new package")
45*ba677afaSXin Li	}
46*ba677afaSXin Li	// and it should not be pkgOld
47*ba677afaSXin Li	if parser.pkg == pkgOld {
48*ba677afaSXin Li		t.Errorf("expected new package, got pkgOld")
49*ba677afaSXin Li	}
50*ba677afaSXin Li	// and the package name should be as expected
51*ba677afaSXin Li	if parser.pkg.PackageName != pkgName {
52*ba677afaSXin Li		t.Errorf("expected package name %s, got %s", pkgName, parser.pkg.PackageName)
53*ba677afaSXin Li	}
54*ba677afaSXin Li	// and the package should default to true for FilesAnalyzed
55*ba677afaSXin Li	if parser.pkg.FilesAnalyzed != true {
56*ba677afaSXin Li		t.Errorf("expected FilesAnalyzed to default to true, got false")
57*ba677afaSXin Li	}
58*ba677afaSXin Li	if parser.pkg.IsFilesAnalyzedTagPresent != false {
59*ba677afaSXin Li		t.Errorf("expected IsFilesAnalyzedTagPresent to default to false, got true")
60*ba677afaSXin Li	}
61*ba677afaSXin Li	// and the Document's Packages should still be of size 1 and have pkgOld only
62*ba677afaSXin Li	if parser.doc.Packages[0] != pkgOld {
63*ba677afaSXin Li		t.Errorf("Expected package %v, got %v", pkgOld, parser.doc.Packages[0])
64*ba677afaSXin Li	}
65*ba677afaSXin Li	if len(parser.doc.Packages) != 1 {
66*ba677afaSXin Li		t.Errorf("expected 1 package, got %d", len(parser.doc.Packages))
67*ba677afaSXin Li	}
68*ba677afaSXin Li}
69*ba677afaSXin Li
70*ba677afaSXin Lifunc TestParser2_3PackageStartsNewPackageAfterParsingPackageNameTagWhileInUnpackaged(t *testing.T) {
71*ba677afaSXin Li	// pkg is nil, so that Files appearing before the first PackageName tag
72*ba677afaSXin Li	// are added to Files instead of Packages
73*ba677afaSXin Li	parser := tvParser2_3{
74*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
75*ba677afaSXin Li		st:  psFile2_3,
76*ba677afaSXin Li		pkg: nil,
77*ba677afaSXin Li	}
78*ba677afaSXin Li	// the Document's Packages should be empty
79*ba677afaSXin Li	if len(parser.doc.Packages) != 0 {
80*ba677afaSXin Li		t.Errorf("Expected zero packages, got %d", len(parser.doc.Packages))
81*ba677afaSXin Li	}
82*ba677afaSXin Li
83*ba677afaSXin Li	// now add a new package
84*ba677afaSXin Li	pkgName := "p2"
85*ba677afaSXin Li	err := parser.parsePair2_3("PackageName", pkgName)
86*ba677afaSXin Li	if err != nil {
87*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_3: %v", err)
88*ba677afaSXin Li	}
89*ba677afaSXin Li	// state should be correct
90*ba677afaSXin Li	if parser.st != psPackage2_3 {
91*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psPackage2_3, parser.st)
92*ba677afaSXin Li	}
93*ba677afaSXin Li	// and a package should be created
94*ba677afaSXin Li	if parser.pkg == nil {
95*ba677afaSXin Li		t.Fatalf("parser didn't create new package")
96*ba677afaSXin Li	}
97*ba677afaSXin Li	// and the package name should be as expected
98*ba677afaSXin Li	if parser.pkg.PackageName != pkgName {
99*ba677afaSXin Li		t.Errorf("expected package name %s, got %s", pkgName, parser.pkg.PackageName)
100*ba677afaSXin Li	}
101*ba677afaSXin Li	// and the package should default to true for FilesAnalyzed
102*ba677afaSXin Li	if parser.pkg.FilesAnalyzed != true {
103*ba677afaSXin Li		t.Errorf("expected FilesAnalyzed to default to true, got false")
104*ba677afaSXin Li	}
105*ba677afaSXin Li	if parser.pkg.IsFilesAnalyzedTagPresent != false {
106*ba677afaSXin Li		t.Errorf("expected IsFilesAnalyzedTagPresent to default to false, got true")
107*ba677afaSXin Li	}
108*ba677afaSXin Li	// and the Document's Packages should be of size 0, because the prior was
109*ba677afaSXin Li	// unpackaged files and this one won't be added until an SPDXID is seen
110*ba677afaSXin Li	if len(parser.doc.Packages) != 0 {
111*ba677afaSXin Li		t.Errorf("Expected %v packages in doc, got %v", 0, len(parser.doc.Packages))
112*ba677afaSXin Li	}
113*ba677afaSXin Li}
114*ba677afaSXin Li
115*ba677afaSXin Lifunc TestParser2_3PackageMovesToFileAfterParsingFileNameTag(t *testing.T) {
116*ba677afaSXin Li	parser := tvParser2_3{
117*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
118*ba677afaSXin Li		st:  psPackage2_3,
119*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
120*ba677afaSXin Li	}
121*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
122*ba677afaSXin Li	pkgCurrent := parser.pkg
123*ba677afaSXin Li
124*ba677afaSXin Li	err := parser.parsePair2_3("FileName", "testFile")
125*ba677afaSXin Li	if err != nil {
126*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_3: %v", err)
127*ba677afaSXin Li	}
128*ba677afaSXin Li	// state should be correct
129*ba677afaSXin Li	if parser.st != psFile2_3 {
130*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psFile2_3, parser.st)
131*ba677afaSXin Li	}
132*ba677afaSXin Li	// and current package should remain what it was
133*ba677afaSXin Li	if parser.pkg != pkgCurrent {
134*ba677afaSXin Li		t.Fatalf("expected package to remain %v, got %v", pkgCurrent, parser.pkg)
135*ba677afaSXin Li	}
136*ba677afaSXin Li}
137*ba677afaSXin Li
138*ba677afaSXin Lifunc TestParser2_3PackageMovesToOtherLicenseAfterParsingLicenseIDTag(t *testing.T) {
139*ba677afaSXin Li	parser := tvParser2_3{
140*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
141*ba677afaSXin Li		st:  psPackage2_3,
142*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
143*ba677afaSXin Li	}
144*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
145*ba677afaSXin Li
146*ba677afaSXin Li	err := parser.parsePair2_3("LicenseID", "LicenseRef-TestLic")
147*ba677afaSXin Li	if err != nil {
148*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_3: %v", err)
149*ba677afaSXin Li	}
150*ba677afaSXin Li	if parser.st != psOtherLicense2_3 {
151*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psOtherLicense2_3, parser.st)
152*ba677afaSXin Li	}
153*ba677afaSXin Li}
154*ba677afaSXin Li
155*ba677afaSXin Lifunc TestParser2_3PackageMovesToReviewAfterParsingReviewerTag(t *testing.T) {
156*ba677afaSXin Li	parser := tvParser2_3{
157*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
158*ba677afaSXin Li		st:  psPackage2_3,
159*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
160*ba677afaSXin Li	}
161*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
162*ba677afaSXin Li
163*ba677afaSXin Li	err := parser.parsePair2_3("Reviewer", "Person: John Doe")
164*ba677afaSXin Li	if err != nil {
165*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_3: %v", err)
166*ba677afaSXin Li	}
167*ba677afaSXin Li	if parser.st != psReview2_3 {
168*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psReview2_3, parser.st)
169*ba677afaSXin Li	}
170*ba677afaSXin Li}
171*ba677afaSXin Li
172*ba677afaSXin Lifunc TestParser2_3PackageStaysAfterParsingRelationshipTags(t *testing.T) {
173*ba677afaSXin Li	parser := tvParser2_3{
174*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
175*ba677afaSXin Li		st:  psPackage2_3,
176*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
177*ba677afaSXin Li	}
178*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
179*ba677afaSXin Li
180*ba677afaSXin Li	err := parser.parsePair2_3("Relationship", "SPDXRef-blah CONTAINS SPDXRef-blah-else")
181*ba677afaSXin Li	if err != nil {
182*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_3: %v", err)
183*ba677afaSXin Li	}
184*ba677afaSXin Li	// state should remain unchanged
185*ba677afaSXin Li	if parser.st != psPackage2_3 {
186*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psPackage2_3, parser.st)
187*ba677afaSXin Li	}
188*ba677afaSXin Li
189*ba677afaSXin Li	err = parser.parsePair2_3("RelationshipComment", "blah")
190*ba677afaSXin Li	if err != nil {
191*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_3: %v", err)
192*ba677afaSXin Li	}
193*ba677afaSXin Li	// state should still remain unchanged
194*ba677afaSXin Li	if parser.st != psPackage2_3 {
195*ba677afaSXin Li		t.Errorf("expected state to be %v, got %v", psPackage2_3, parser.st)
196*ba677afaSXin Li	}
197*ba677afaSXin Li}
198*ba677afaSXin Li
199*ba677afaSXin Lifunc TestParser2_3PackageStaysAfterParsingAnnotationTags(t *testing.T) {
200*ba677afaSXin Li	parser := tvParser2_3{
201*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
202*ba677afaSXin Li		st:  psPackage2_3,
203*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
204*ba677afaSXin Li	}
205*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
206*ba677afaSXin Li
207*ba677afaSXin Li	err := parser.parsePair2_3("Annotator", "Person: John Doe ()")
208*ba677afaSXin Li	if err != nil {
209*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_3: %v", err)
210*ba677afaSXin Li	}
211*ba677afaSXin Li	if parser.st != psPackage2_3 {
212*ba677afaSXin Li		t.Errorf("parser is in state %v, expected %v", parser.st, psPackage2_3)
213*ba677afaSXin Li	}
214*ba677afaSXin Li
215*ba677afaSXin Li	err = parser.parsePair2_3("AnnotationDate", "2018-09-15T00:36:00Z")
216*ba677afaSXin Li	if err != nil {
217*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_3: %v", err)
218*ba677afaSXin Li	}
219*ba677afaSXin Li	if parser.st != psPackage2_3 {
220*ba677afaSXin Li		t.Errorf("parser is in state %v, expected %v", parser.st, psPackage2_3)
221*ba677afaSXin Li	}
222*ba677afaSXin Li
223*ba677afaSXin Li	err = parser.parsePair2_3("AnnotationType", "REVIEW")
224*ba677afaSXin Li	if err != nil {
225*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_3: %v", err)
226*ba677afaSXin Li	}
227*ba677afaSXin Li	if parser.st != psPackage2_3 {
228*ba677afaSXin Li		t.Errorf("parser is in state %v, expected %v", parser.st, psPackage2_3)
229*ba677afaSXin Li	}
230*ba677afaSXin Li
231*ba677afaSXin Li	err = parser.parsePair2_3("SPDXREF", "SPDXRef-45")
232*ba677afaSXin Li	if err != nil {
233*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_3: %v", err)
234*ba677afaSXin Li	}
235*ba677afaSXin Li	if parser.st != psPackage2_3 {
236*ba677afaSXin Li		t.Errorf("parser is in state %v, expected %v", parser.st, psPackage2_3)
237*ba677afaSXin Li	}
238*ba677afaSXin Li
239*ba677afaSXin Li	err = parser.parsePair2_3("AnnotationComment", "i guess i had something to say about this package")
240*ba677afaSXin Li	if err != nil {
241*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_3: %v", err)
242*ba677afaSXin Li	}
243*ba677afaSXin Li	if parser.st != psPackage2_3 {
244*ba677afaSXin Li		t.Errorf("parser is in state %v, expected %v", parser.st, psPackage2_3)
245*ba677afaSXin Li	}
246*ba677afaSXin Li}
247*ba677afaSXin Li
248*ba677afaSXin Li// ===== Package data section tests =====
249*ba677afaSXin Lifunc TestParser2_3CanParsePackageTags(t *testing.T) {
250*ba677afaSXin Li	parser := tvParser2_3{
251*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
252*ba677afaSXin Li		st:  psPackage2_3,
253*ba677afaSXin Li		pkg: &v2_3.Package{},
254*ba677afaSXin Li	}
255*ba677afaSXin Li
256*ba677afaSXin Li	// should not yet be in Packages map, b/c no SPDX identifier
257*ba677afaSXin Li	if len(parser.doc.Packages) != 0 {
258*ba677afaSXin Li		t.Errorf("expected 0 packages, got %d", len(parser.doc.Packages))
259*ba677afaSXin Li	}
260*ba677afaSXin Li
261*ba677afaSXin Li	// Package Name
262*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageName", "p1")
263*ba677afaSXin Li	if err != nil {
264*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
265*ba677afaSXin Li	}
266*ba677afaSXin Li	if parser.pkg.PackageName != "p1" {
267*ba677afaSXin Li		t.Errorf("got %v for PackageName", parser.pkg.PackageName)
268*ba677afaSXin Li	}
269*ba677afaSXin Li	// still should not yet be in Packages map, b/c no SPDX identifier
270*ba677afaSXin Li	if len(parser.doc.Packages) != 0 {
271*ba677afaSXin Li		t.Errorf("expected 0 packages, got %d", len(parser.doc.Packages))
272*ba677afaSXin Li	}
273*ba677afaSXin Li
274*ba677afaSXin Li	// Package SPDX Identifier
275*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("SPDXID", "SPDXRef-p1")
276*ba677afaSXin Li	if err != nil {
277*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
278*ba677afaSXin Li	}
279*ba677afaSXin Li	// "SPDXRef-" prefix should be removed from the item
280*ba677afaSXin Li	if parser.pkg.PackageSPDXIdentifier != "p1" {
281*ba677afaSXin Li		t.Errorf("got %v for PackageSPDXIdentifier", parser.pkg.PackageSPDXIdentifier)
282*ba677afaSXin Li	}
283*ba677afaSXin Li	// and it should now be added to the Packages map
284*ba677afaSXin Li	if len(parser.doc.Packages) != 1 {
285*ba677afaSXin Li		t.Errorf("expected 1 package, got %d", len(parser.doc.Packages))
286*ba677afaSXin Li	}
287*ba677afaSXin Li	if parser.doc.Packages[0] != parser.pkg {
288*ba677afaSXin Li		t.Errorf("expected to point to parser.pkg, got %v", parser.doc.Packages[0])
289*ba677afaSXin Li	}
290*ba677afaSXin Li
291*ba677afaSXin Li	// Package Version
292*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageVersion", "2.1.1")
293*ba677afaSXin Li	if err != nil {
294*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
295*ba677afaSXin Li	}
296*ba677afaSXin Li	if parser.pkg.PackageVersion != "2.1.1" {
297*ba677afaSXin Li		t.Errorf("got %v for PackageVersion", parser.pkg.PackageVersion)
298*ba677afaSXin Li	}
299*ba677afaSXin Li
300*ba677afaSXin Li	// Package File Name
301*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageFileName", "p1-2.1.1.tar.gz")
302*ba677afaSXin Li	if err != nil {
303*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
304*ba677afaSXin Li	}
305*ba677afaSXin Li	if parser.pkg.PackageFileName != "p1-2.1.1.tar.gz" {
306*ba677afaSXin Li		t.Errorf("got %v for PackageFileName", parser.pkg.PackageFileName)
307*ba677afaSXin Li	}
308*ba677afaSXin Li
309*ba677afaSXin Li	// Package Supplier
310*ba677afaSXin Li	// SKIP -- separate tests for subvalues below
311*ba677afaSXin Li
312*ba677afaSXin Li	// Package Originator
313*ba677afaSXin Li	// SKIP -- separate tests for subvalues below
314*ba677afaSXin Li
315*ba677afaSXin Li	// Package Download Location
316*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageDownloadLocation", "https://example.com/whatever")
317*ba677afaSXin Li	if err != nil {
318*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
319*ba677afaSXin Li	}
320*ba677afaSXin Li	if parser.pkg.PackageDownloadLocation != "https://example.com/whatever" {
321*ba677afaSXin Li		t.Errorf("got %v for PackageDownloadLocation", parser.pkg.PackageDownloadLocation)
322*ba677afaSXin Li	}
323*ba677afaSXin Li
324*ba677afaSXin Li	// Files Analyzed
325*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("FilesAnalyzed", "false")
326*ba677afaSXin Li	if err != nil {
327*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
328*ba677afaSXin Li	}
329*ba677afaSXin Li	if parser.pkg.FilesAnalyzed != false {
330*ba677afaSXin Li		t.Errorf("got %v for FilesAnalyzed", parser.pkg.FilesAnalyzed)
331*ba677afaSXin Li	}
332*ba677afaSXin Li	if parser.pkg.IsFilesAnalyzedTagPresent != true {
333*ba677afaSXin Li		t.Errorf("got %v for IsFilesAnalyzedTagPresent", parser.pkg.IsFilesAnalyzedTagPresent)
334*ba677afaSXin Li	}
335*ba677afaSXin Li
336*ba677afaSXin Li	// Package Verification Code
337*ba677afaSXin Li	// SKIP -- separate tests for "excludes", or not, below
338*ba677afaSXin Li
339*ba677afaSXin Li	testChecksums := map[common.ChecksumAlgorithm]string{
340*ba677afaSXin Li		"MD5":    "624c1abb3664f4b35547e7c73864ad24",
341*ba677afaSXin Li		"SHA1":   "85ed0817af83a24ad8da68c2b5094de69833983c",
342*ba677afaSXin Li		"SHA256": "11b6d3ee554eedf79299905a98f9b9a04e498210b59f15094c916c91d150efcd",
343*ba677afaSXin Li		"SHA512": "4ced3267f5ed38df65ceebc43e97aa6c2948cc7ef3288c2e5074e7df7fab544cc93339604513ea5f65616f9ed1c48581465043c8a9b693ef20fd4fddaf25e1b9",
344*ba677afaSXin Li		"BLAKE3": "981d32ed7aad9e408c5c36f6346c915ba11c2bd8b3e7d44902a11d7a141abdd9",
345*ba677afaSXin Li	}
346*ba677afaSXin Li
347*ba677afaSXin Li	for algo, tc := range testChecksums {
348*ba677afaSXin Li		if err := parser.parsePairFromPackage2_3(
349*ba677afaSXin Li			"PackageChecksum", fmt.Sprintf("%s: %s", algo, tc)); err != nil {
350*ba677afaSXin Li			t.Errorf("expected error, got %v", err)
351*ba677afaSXin Li		}
352*ba677afaSXin Li	}
353*ba677afaSXin Li
354*ba677afaSXin Li	for _, checksum := range parser.pkg.PackageChecksums {
355*ba677afaSXin Li		if checksum.Value != testChecksums[checksum.Algorithm] {
356*ba677afaSXin Li			t.Errorf(
357*ba677afaSXin Li				"expected %s for PackageChecksum%s, got %s",
358*ba677afaSXin Li				testChecksums[checksum.Algorithm], checksum.Algorithm, checksum.Value,
359*ba677afaSXin Li			)
360*ba677afaSXin Li		}
361*ba677afaSXin Li	}
362*ba677afaSXin Li
363*ba677afaSXin Li	// Package Home Page
364*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageHomePage", "https://example.com/whatever2")
365*ba677afaSXin Li	if err != nil {
366*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
367*ba677afaSXin Li	}
368*ba677afaSXin Li	if parser.pkg.PackageHomePage != "https://example.com/whatever2" {
369*ba677afaSXin Li		t.Errorf("got %v for PackageHomePage", parser.pkg.PackageHomePage)
370*ba677afaSXin Li	}
371*ba677afaSXin Li
372*ba677afaSXin Li	// Package Source Info
373*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageSourceInfo", "random comment")
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.pkg.PackageSourceInfo != "random comment" {
378*ba677afaSXin Li		t.Errorf("got %v for PackageSourceInfo", parser.pkg.PackageSourceInfo)
379*ba677afaSXin Li	}
380*ba677afaSXin Li
381*ba677afaSXin Li	// Package License Concluded
382*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageLicenseConcluded", "Apache-2.0 OR GPL-2.0-or-later")
383*ba677afaSXin Li	if err != nil {
384*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
385*ba677afaSXin Li	}
386*ba677afaSXin Li	if parser.pkg.PackageLicenseConcluded != "Apache-2.0 OR GPL-2.0-or-later" {
387*ba677afaSXin Li		t.Errorf("got %v for PackageLicenseConcluded", parser.pkg.PackageLicenseConcluded)
388*ba677afaSXin Li	}
389*ba677afaSXin Li
390*ba677afaSXin Li	// All Licenses Info From Files
391*ba677afaSXin Li	lics := []string{
392*ba677afaSXin Li		"Apache-2.0",
393*ba677afaSXin Li		"GPL-2.0-or-later",
394*ba677afaSXin Li		"CC0-1.0",
395*ba677afaSXin Li	}
396*ba677afaSXin Li	for _, lic := range lics {
397*ba677afaSXin Li		err = parser.parsePairFromPackage2_3("PackageLicenseInfoFromFiles", lic)
398*ba677afaSXin Li		if err != nil {
399*ba677afaSXin Li			t.Errorf("expected nil error, got %v", err)
400*ba677afaSXin Li		}
401*ba677afaSXin Li	}
402*ba677afaSXin Li	for _, licWant := range lics {
403*ba677afaSXin Li		flagFound := false
404*ba677afaSXin Li		for _, licCheck := range parser.pkg.PackageLicenseInfoFromFiles {
405*ba677afaSXin Li			if licWant == licCheck {
406*ba677afaSXin Li				flagFound = true
407*ba677afaSXin Li			}
408*ba677afaSXin Li		}
409*ba677afaSXin Li		if flagFound == false {
410*ba677afaSXin Li			t.Errorf("didn't find %s in PackageLicenseInfoFromFiles", licWant)
411*ba677afaSXin Li		}
412*ba677afaSXin Li	}
413*ba677afaSXin Li	if len(lics) != len(parser.pkg.PackageLicenseInfoFromFiles) {
414*ba677afaSXin Li		t.Errorf("expected %d licenses in PackageLicenseInfoFromFiles, got %d", len(lics),
415*ba677afaSXin Li			len(parser.pkg.PackageLicenseInfoFromFiles))
416*ba677afaSXin Li	}
417*ba677afaSXin Li
418*ba677afaSXin Li	// Package License Declared
419*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageLicenseDeclared", "Apache-2.0 OR GPL-2.0-or-later")
420*ba677afaSXin Li	if err != nil {
421*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
422*ba677afaSXin Li	}
423*ba677afaSXin Li	if parser.pkg.PackageLicenseDeclared != "Apache-2.0 OR GPL-2.0-or-later" {
424*ba677afaSXin Li		t.Errorf("got %v for PackageLicenseDeclared", parser.pkg.PackageLicenseDeclared)
425*ba677afaSXin Li	}
426*ba677afaSXin Li
427*ba677afaSXin Li	// Package License Comments
428*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageLicenseComments", "this is a license comment")
429*ba677afaSXin Li	if err != nil {
430*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
431*ba677afaSXin Li	}
432*ba677afaSXin Li	if parser.pkg.PackageLicenseComments != "this is a license comment" {
433*ba677afaSXin Li		t.Errorf("got %v for PackageLicenseComments", parser.pkg.PackageLicenseComments)
434*ba677afaSXin Li	}
435*ba677afaSXin Li
436*ba677afaSXin Li	// Package Copyright Text
437*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageCopyrightText", "Copyright (c) me myself and i")
438*ba677afaSXin Li	if err != nil {
439*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
440*ba677afaSXin Li	}
441*ba677afaSXin Li	if parser.pkg.PackageCopyrightText != "Copyright (c) me myself and i" {
442*ba677afaSXin Li		t.Errorf("got %v for PackageCopyrightText", parser.pkg.PackageCopyrightText)
443*ba677afaSXin Li	}
444*ba677afaSXin Li
445*ba677afaSXin Li	// Package Summary
446*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageSummary", "i wrote this package")
447*ba677afaSXin Li	if err != nil {
448*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
449*ba677afaSXin Li	}
450*ba677afaSXin Li	if parser.pkg.PackageSummary != "i wrote this package" {
451*ba677afaSXin Li		t.Errorf("got %v for PackageSummary", parser.pkg.PackageSummary)
452*ba677afaSXin Li	}
453*ba677afaSXin Li
454*ba677afaSXin Li	// Package Description
455*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageDescription", "i wrote this package a lot")
456*ba677afaSXin Li	if err != nil {
457*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
458*ba677afaSXin Li	}
459*ba677afaSXin Li	if parser.pkg.PackageDescription != "i wrote this package a lot" {
460*ba677afaSXin Li		t.Errorf("got %v for PackageDescription", parser.pkg.PackageDescription)
461*ba677afaSXin Li	}
462*ba677afaSXin Li
463*ba677afaSXin Li	// Package Comment
464*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageComment", "i scanned this package")
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.pkg.PackageComment != "i scanned this package" {
469*ba677afaSXin Li		t.Errorf("got %v for PackageComment", parser.pkg.PackageComment)
470*ba677afaSXin Li	}
471*ba677afaSXin Li
472*ba677afaSXin Li	// Package Attribution Text
473*ba677afaSXin Li	attrs := []string{
474*ba677afaSXin Li		"Include this notice in all advertising materials",
475*ba677afaSXin Li		"This is a \nmulti-line string",
476*ba677afaSXin Li	}
477*ba677afaSXin Li	for _, attr := range attrs {
478*ba677afaSXin Li		err = parser.parsePairFromPackage2_3("PackageAttributionText", attr)
479*ba677afaSXin Li		if err != nil {
480*ba677afaSXin Li			t.Errorf("expected nil error, got %v", err)
481*ba677afaSXin Li		}
482*ba677afaSXin Li	}
483*ba677afaSXin Li	for _, attrWant := range attrs {
484*ba677afaSXin Li		flagFound := false
485*ba677afaSXin Li		for _, attrCheck := range parser.pkg.PackageAttributionTexts {
486*ba677afaSXin Li			if attrWant == attrCheck {
487*ba677afaSXin Li				flagFound = true
488*ba677afaSXin Li			}
489*ba677afaSXin Li		}
490*ba677afaSXin Li		if flagFound == false {
491*ba677afaSXin Li			t.Errorf("didn't find %s in PackageAttributionText", attrWant)
492*ba677afaSXin Li		}
493*ba677afaSXin Li	}
494*ba677afaSXin Li	if len(attrs) != len(parser.pkg.PackageAttributionTexts) {
495*ba677afaSXin Li		t.Errorf("expected %d attribution texts in PackageAttributionTexts, got %d", len(attrs),
496*ba677afaSXin Li			len(parser.pkg.PackageAttributionTexts))
497*ba677afaSXin Li	}
498*ba677afaSXin Li
499*ba677afaSXin Li	// Package External References and Comments
500*ba677afaSXin Li	ref1 := "SECURITY cpe23Type cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:*"
501*ba677afaSXin Li	ref1Category := "SECURITY"
502*ba677afaSXin Li	ref1Type := "cpe23Type"
503*ba677afaSXin Li	ref1Locator := "cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:*"
504*ba677afaSXin Li	ref1Comment := "this is comment #1"
505*ba677afaSXin Li	ref2 := "OTHER LocationRef-acmeforge acmecorp/acmenator/4.1.3alpha"
506*ba677afaSXin Li	ref2Category := "OTHER"
507*ba677afaSXin Li	ref2Type := "LocationRef-acmeforge"
508*ba677afaSXin Li	ref2Locator := "acmecorp/acmenator/4.1.3alpha"
509*ba677afaSXin Li	ref2Comment := "this is comment #2"
510*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("ExternalRef", ref1)
511*ba677afaSXin Li	if err != nil {
512*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
513*ba677afaSXin Li	}
514*ba677afaSXin Li	if len(parser.pkg.PackageExternalReferences) != 1 {
515*ba677afaSXin Li		t.Errorf("expected 1 external reference, got %d", len(parser.pkg.PackageExternalReferences))
516*ba677afaSXin Li	}
517*ba677afaSXin Li	if parser.pkgExtRef == nil {
518*ba677afaSXin Li		t.Errorf("expected non-nil pkgExtRef, got nil")
519*ba677afaSXin Li	}
520*ba677afaSXin Li	if parser.pkg.PackageExternalReferences[0] == nil {
521*ba677afaSXin Li		t.Errorf("expected non-nil PackageExternalReferences[0], got nil")
522*ba677afaSXin Li	}
523*ba677afaSXin Li	if parser.pkgExtRef != parser.pkg.PackageExternalReferences[0] {
524*ba677afaSXin Li		t.Errorf("expected pkgExtRef to match PackageExternalReferences[0], got no match")
525*ba677afaSXin Li	}
526*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("ExternalRefComment", ref1Comment)
527*ba677afaSXin Li	if err != nil {
528*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
529*ba677afaSXin Li	}
530*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("ExternalRef", ref2)
531*ba677afaSXin Li	if err != nil {
532*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
533*ba677afaSXin Li	}
534*ba677afaSXin Li	if len(parser.pkg.PackageExternalReferences) != 2 {
535*ba677afaSXin Li		t.Errorf("expected 2 external references, got %d", len(parser.pkg.PackageExternalReferences))
536*ba677afaSXin Li	}
537*ba677afaSXin Li	if parser.pkgExtRef == nil {
538*ba677afaSXin Li		t.Errorf("expected non-nil pkgExtRef, got nil")
539*ba677afaSXin Li	}
540*ba677afaSXin Li	if parser.pkg.PackageExternalReferences[1] == nil {
541*ba677afaSXin Li		t.Errorf("expected non-nil PackageExternalReferences[1], got nil")
542*ba677afaSXin Li	}
543*ba677afaSXin Li	if parser.pkgExtRef != parser.pkg.PackageExternalReferences[1] {
544*ba677afaSXin Li		t.Errorf("expected pkgExtRef to match PackageExternalReferences[1], got no match")
545*ba677afaSXin Li	}
546*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("ExternalRefComment", ref2Comment)
547*ba677afaSXin Li	if err != nil {
548*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
549*ba677afaSXin Li	}
550*ba677afaSXin Li	// finally, check these values
551*ba677afaSXin Li	gotRef1 := parser.pkg.PackageExternalReferences[0]
552*ba677afaSXin Li	if gotRef1.Category != ref1Category {
553*ba677afaSXin Li		t.Errorf("expected ref1 category to be %s, got %s", gotRef1.Category, ref1Category)
554*ba677afaSXin Li	}
555*ba677afaSXin Li	if gotRef1.RefType != ref1Type {
556*ba677afaSXin Li		t.Errorf("expected ref1 type to be %s, got %s", gotRef1.RefType, ref1Type)
557*ba677afaSXin Li	}
558*ba677afaSXin Li	if gotRef1.Locator != ref1Locator {
559*ba677afaSXin Li		t.Errorf("expected ref1 locator to be %s, got %s", gotRef1.Locator, ref1Locator)
560*ba677afaSXin Li	}
561*ba677afaSXin Li	if gotRef1.ExternalRefComment != ref1Comment {
562*ba677afaSXin Li		t.Errorf("expected ref1 comment to be %s, got %s", gotRef1.ExternalRefComment, ref1Comment)
563*ba677afaSXin Li	}
564*ba677afaSXin Li	gotRef2 := parser.pkg.PackageExternalReferences[1]
565*ba677afaSXin Li	if gotRef2.Category != ref2Category {
566*ba677afaSXin Li		t.Errorf("expected ref2 category to be %s, got %s", gotRef2.Category, ref2Category)
567*ba677afaSXin Li	}
568*ba677afaSXin Li	if gotRef2.RefType != ref2Type {
569*ba677afaSXin Li		t.Errorf("expected ref2 type to be %s, got %s", gotRef2.RefType, ref2Type)
570*ba677afaSXin Li	}
571*ba677afaSXin Li	if gotRef2.Locator != ref2Locator {
572*ba677afaSXin Li		t.Errorf("expected ref2 locator to be %s, got %s", gotRef2.Locator, ref2Locator)
573*ba677afaSXin Li	}
574*ba677afaSXin Li	if gotRef2.ExternalRefComment != ref2Comment {
575*ba677afaSXin Li		t.Errorf("expected ref2 comment to be %s, got %s", gotRef2.ExternalRefComment, ref2Comment)
576*ba677afaSXin Li	}
577*ba677afaSXin Li
578*ba677afaSXin Li}
579*ba677afaSXin Li
580*ba677afaSXin Lifunc TestParser2_3CanParsePackageSupplierPersonTag(t *testing.T) {
581*ba677afaSXin Li	parser := tvParser2_3{
582*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
583*ba677afaSXin Li		st:  psPackage2_3,
584*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
585*ba677afaSXin Li	}
586*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
587*ba677afaSXin Li
588*ba677afaSXin Li	// Package Supplier: Person
589*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageSupplier", "Person: John Doe")
590*ba677afaSXin Li	if err != nil {
591*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
592*ba677afaSXin Li	}
593*ba677afaSXin Li	if parser.pkg.PackageSupplier.Supplier != "John Doe" {
594*ba677afaSXin Li		t.Errorf("got %v for PackageSupplierPerson", parser.pkg.PackageSupplier.Supplier)
595*ba677afaSXin Li	}
596*ba677afaSXin Li}
597*ba677afaSXin Li
598*ba677afaSXin Lifunc TestParser2_3CanParsePackageSupplierOrganizationTag(t *testing.T) {
599*ba677afaSXin Li	parser := tvParser2_3{
600*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
601*ba677afaSXin Li		st:  psPackage2_3,
602*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
603*ba677afaSXin Li	}
604*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
605*ba677afaSXin Li
606*ba677afaSXin Li	// Package Supplier: Organization
607*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageSupplier", "Organization: John Doe, Inc.")
608*ba677afaSXin Li	if err != nil {
609*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
610*ba677afaSXin Li	}
611*ba677afaSXin Li	if parser.pkg.PackageSupplier.Supplier != "John Doe, Inc." {
612*ba677afaSXin Li		t.Errorf("got %v for PackageSupplierOrganization", parser.pkg.PackageSupplier.Supplier)
613*ba677afaSXin Li	}
614*ba677afaSXin Li}
615*ba677afaSXin Li
616*ba677afaSXin Lifunc TestParser2_3CanParsePackageSupplierNOASSERTIONTag(t *testing.T) {
617*ba677afaSXin Li	parser := tvParser2_3{
618*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
619*ba677afaSXin Li		st:  psPackage2_3,
620*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
621*ba677afaSXin Li	}
622*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
623*ba677afaSXin Li
624*ba677afaSXin Li	// Package Supplier: NOASSERTION
625*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageSupplier", "NOASSERTION")
626*ba677afaSXin Li	if err != nil {
627*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
628*ba677afaSXin Li	}
629*ba677afaSXin Li	if parser.pkg.PackageSupplier.Supplier != "NOASSERTION" {
630*ba677afaSXin Li		t.Errorf("got value for Supplier, expected NOASSERTION")
631*ba677afaSXin Li	}
632*ba677afaSXin Li}
633*ba677afaSXin Li
634*ba677afaSXin Lifunc TestParser2_3CanParsePackageOriginatorPersonTag(t *testing.T) {
635*ba677afaSXin Li	parser := tvParser2_3{
636*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
637*ba677afaSXin Li		st:  psPackage2_3,
638*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
639*ba677afaSXin Li	}
640*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
641*ba677afaSXin Li
642*ba677afaSXin Li	// Package Originator: Person
643*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageOriginator", "Person: John Doe")
644*ba677afaSXin Li	if err != nil {
645*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
646*ba677afaSXin Li	}
647*ba677afaSXin Li	if parser.pkg.PackageOriginator.Originator != "John Doe" {
648*ba677afaSXin Li		t.Errorf("got %v for PackageOriginator", parser.pkg.PackageOriginator.Originator)
649*ba677afaSXin Li	}
650*ba677afaSXin Li}
651*ba677afaSXin Li
652*ba677afaSXin Lifunc TestParser2_3CanParsePackageOriginatorOrganizationTag(t *testing.T) {
653*ba677afaSXin Li	parser := tvParser2_3{
654*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
655*ba677afaSXin Li		st:  psPackage2_3,
656*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
657*ba677afaSXin Li	}
658*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
659*ba677afaSXin Li
660*ba677afaSXin Li	// Package Originator: Organization
661*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageOriginator", "Organization: John Doe, Inc.")
662*ba677afaSXin Li	if err != nil {
663*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
664*ba677afaSXin Li	}
665*ba677afaSXin Li	if parser.pkg.PackageOriginator.Originator != "John Doe, Inc." {
666*ba677afaSXin Li		t.Errorf("got %v for PackageOriginator", parser.pkg.PackageOriginator.Originator)
667*ba677afaSXin Li	}
668*ba677afaSXin Li}
669*ba677afaSXin Li
670*ba677afaSXin Lifunc TestParser2_3CanParsePackageOriginatorNOASSERTIONTag(t *testing.T) {
671*ba677afaSXin Li	parser := tvParser2_3{
672*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
673*ba677afaSXin Li		st:  psPackage2_3,
674*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
675*ba677afaSXin Li	}
676*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
677*ba677afaSXin Li
678*ba677afaSXin Li	// Package Originator: NOASSERTION
679*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageOriginator", "NOASSERTION")
680*ba677afaSXin Li	if err != nil {
681*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
682*ba677afaSXin Li	}
683*ba677afaSXin Li	if parser.pkg.PackageOriginator.Originator != "NOASSERTION" {
684*ba677afaSXin Li		t.Errorf("got false for PackageOriginatorNOASSERTION")
685*ba677afaSXin Li	}
686*ba677afaSXin Li}
687*ba677afaSXin Li
688*ba677afaSXin Lifunc TestParser2_3CanParsePackageVerificationCodeTagWithExcludes(t *testing.T) {
689*ba677afaSXin Li	parser := tvParser2_3{
690*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
691*ba677afaSXin Li		st:  psPackage2_3,
692*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
693*ba677afaSXin Li	}
694*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
695*ba677afaSXin Li
696*ba677afaSXin Li	// Package Verification Code with excludes parenthetical
697*ba677afaSXin Li	code := "d6a770ba38583ed4bb4525bd96e50461655d2758"
698*ba677afaSXin Li	fileName := "./package.spdx"
699*ba677afaSXin Li	fullCodeValue := "d6a770ba38583ed4bb4525bd96e50461655d2758 (excludes: ./package.spdx)"
700*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageVerificationCode", fullCodeValue)
701*ba677afaSXin Li	if err != nil {
702*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
703*ba677afaSXin Li	}
704*ba677afaSXin Li	if parser.pkg.PackageVerificationCode.Value != code {
705*ba677afaSXin Li		t.Errorf("got %v for PackageVerificationCode", parser.pkg.PackageVerificationCode)
706*ba677afaSXin Li	}
707*ba677afaSXin Li	if len(parser.pkg.PackageVerificationCode.ExcludedFiles) != 1 || parser.pkg.PackageVerificationCode.ExcludedFiles[0] != fileName {
708*ba677afaSXin Li		t.Errorf("got %v for PackageVerificationCodeExcludedFile", parser.pkg.PackageVerificationCode.ExcludedFiles)
709*ba677afaSXin Li	}
710*ba677afaSXin Li
711*ba677afaSXin Li}
712*ba677afaSXin Li
713*ba677afaSXin Lifunc TestParser2_3CanParsePackageVerificationCodeTagWithoutExcludes(t *testing.T) {
714*ba677afaSXin Li	parser := tvParser2_3{
715*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
716*ba677afaSXin Li		st:  psPackage2_3,
717*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
718*ba677afaSXin Li	}
719*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
720*ba677afaSXin Li
721*ba677afaSXin Li	// Package Verification Code without excludes parenthetical
722*ba677afaSXin Li	code := "d6a770ba38583ed4bb4525bd96e50461655d2758"
723*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageVerificationCode", code)
724*ba677afaSXin Li	if err != nil {
725*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
726*ba677afaSXin Li	}
727*ba677afaSXin Li	if parser.pkg.PackageVerificationCode.Value != code {
728*ba677afaSXin Li		t.Errorf("got %v for PackageVerificationCode", parser.pkg.PackageVerificationCode)
729*ba677afaSXin Li	}
730*ba677afaSXin Li	if len(parser.pkg.PackageVerificationCode.ExcludedFiles) != 0 {
731*ba677afaSXin Li		t.Errorf("got %v for PackageVerificationCodeExcludedFile", parser.pkg.PackageVerificationCode.ExcludedFiles)
732*ba677afaSXin Li	}
733*ba677afaSXin Li
734*ba677afaSXin Li}
735*ba677afaSXin Li
736*ba677afaSXin Lifunc TestParser2_3PackageExternalRefPointerChangesAfterTags(t *testing.T) {
737*ba677afaSXin Li	parser := tvParser2_3{
738*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
739*ba677afaSXin Li		st:  psPackage2_3,
740*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
741*ba677afaSXin Li	}
742*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
743*ba677afaSXin Li
744*ba677afaSXin Li	ref1 := "SECURITY cpe23Type cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:*"
745*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("ExternalRef", ref1)
746*ba677afaSXin Li	if err != nil {
747*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
748*ba677afaSXin Li	}
749*ba677afaSXin Li	if parser.pkgExtRef == nil {
750*ba677afaSXin Li		t.Errorf("expected non-nil external reference pointer, got nil")
751*ba677afaSXin Li	}
752*ba677afaSXin Li
753*ba677afaSXin Li	// now, a comment; pointer should go away
754*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("ExternalRefComment", "whatever")
755*ba677afaSXin Li	if err != nil {
756*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
757*ba677afaSXin Li	}
758*ba677afaSXin Li	if parser.pkgExtRef != nil {
759*ba677afaSXin Li		t.Errorf("expected nil external reference pointer, got non-nil")
760*ba677afaSXin Li	}
761*ba677afaSXin Li
762*ba677afaSXin Li	ref2 := "Other LocationRef-something https://example.com/whatever"
763*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("ExternalRef", ref2)
764*ba677afaSXin Li	if err != nil {
765*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
766*ba677afaSXin Li	}
767*ba677afaSXin Li	if parser.pkgExtRef == nil {
768*ba677afaSXin Li		t.Errorf("expected non-nil external reference pointer, got nil")
769*ba677afaSXin Li	}
770*ba677afaSXin Li
771*ba677afaSXin Li	// and some other random tag makes the pointer go away too
772*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageSummary", "whatever")
773*ba677afaSXin Li	if err != nil {
774*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
775*ba677afaSXin Li	}
776*ba677afaSXin Li	if parser.pkgExtRef != nil {
777*ba677afaSXin Li		t.Errorf("expected nil external reference pointer, got non-nil")
778*ba677afaSXin Li	}
779*ba677afaSXin Li}
780*ba677afaSXin Li
781*ba677afaSXin Lifunc TestParser2_3PackageCreatesRelationshipInDocument(t *testing.T) {
782*ba677afaSXin Li	parser := tvParser2_3{
783*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
784*ba677afaSXin Li		st:  psPackage2_3,
785*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
786*ba677afaSXin Li	}
787*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
788*ba677afaSXin Li
789*ba677afaSXin Li	err := parser.parsePair2_3("Relationship", "SPDXRef-blah CONTAINS SPDXRef-blah-whatever")
790*ba677afaSXin Li	if err != nil {
791*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_3: %v", err)
792*ba677afaSXin Li	}
793*ba677afaSXin Li	if parser.rln == nil {
794*ba677afaSXin Li		t.Fatalf("parser didn't create and point to Relationship struct")
795*ba677afaSXin Li	}
796*ba677afaSXin Li	if parser.rln != parser.doc.Relationships[0] {
797*ba677afaSXin Li		t.Errorf("pointer to new Relationship doesn't match idx 0 for doc.Relationships[]")
798*ba677afaSXin Li	}
799*ba677afaSXin Li}
800*ba677afaSXin Li
801*ba677afaSXin Lifunc TestParser2_3PackageCreatesAnnotationInDocument(t *testing.T) {
802*ba677afaSXin Li	parser := tvParser2_3{
803*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
804*ba677afaSXin Li		st:  psPackage2_3,
805*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
806*ba677afaSXin Li	}
807*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
808*ba677afaSXin Li
809*ba677afaSXin Li	err := parser.parsePair2_3("Annotator", "Person: John Doe ()")
810*ba677afaSXin Li	if err != nil {
811*ba677afaSXin Li		t.Errorf("got error when calling parsePair2_3: %v", err)
812*ba677afaSXin Li	}
813*ba677afaSXin Li	if parser.ann == nil {
814*ba677afaSXin Li		t.Fatalf("parser didn't create and point to Annotation struct")
815*ba677afaSXin Li	}
816*ba677afaSXin Li	if parser.ann != parser.doc.Annotations[0] {
817*ba677afaSXin Li		t.Errorf("pointer to new Annotation doesn't match idx 0 for doc.Annotations[]")
818*ba677afaSXin Li	}
819*ba677afaSXin Li}
820*ba677afaSXin Li
821*ba677afaSXin Lifunc TestParser2_3PackageUnknownTagFails(t *testing.T) {
822*ba677afaSXin Li	parser := tvParser2_3{
823*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
824*ba677afaSXin Li		st:  psPackage2_3,
825*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"},
826*ba677afaSXin Li	}
827*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
828*ba677afaSXin Li
829*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("blah", "something")
830*ba677afaSXin Li	if err == nil {
831*ba677afaSXin Li		t.Errorf("expected error from parsing unknown tag")
832*ba677afaSXin Li	}
833*ba677afaSXin Li}
834*ba677afaSXin Li
835*ba677afaSXin Lifunc TestParser2_3FailsIfInvalidSPDXIDInPackageSection(t *testing.T) {
836*ba677afaSXin Li	parser := tvParser2_3{
837*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
838*ba677afaSXin Li		st:  psPackage2_3,
839*ba677afaSXin Li		pkg: &v2_3.Package{},
840*ba677afaSXin Li	}
841*ba677afaSXin Li
842*ba677afaSXin Li	// start with Package Name
843*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageName", "p1")
844*ba677afaSXin Li	if err != nil {
845*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
846*ba677afaSXin Li	}
847*ba677afaSXin Li	// invalid ID format
848*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("SPDXID", "whoops")
849*ba677afaSXin Li	if err == nil {
850*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
851*ba677afaSXin Li	}
852*ba677afaSXin Li}
853*ba677afaSXin Li
854*ba677afaSXin Lifunc TestParser2_3FailsIfInvalidPackageSupplierFormat(t *testing.T) {
855*ba677afaSXin Li	parser := tvParser2_3{
856*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
857*ba677afaSXin Li		st:  psPackage2_3,
858*ba677afaSXin Li		pkg: &v2_3.Package{},
859*ba677afaSXin Li	}
860*ba677afaSXin Li
861*ba677afaSXin Li	// start with Package Name
862*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageName", "p1")
863*ba677afaSXin Li	if err != nil {
864*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
865*ba677afaSXin Li	}
866*ba677afaSXin Li	// invalid supplier format
867*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageSupplier", "whoops")
868*ba677afaSXin Li	if err == nil {
869*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
870*ba677afaSXin Li	}
871*ba677afaSXin Li}
872*ba677afaSXin Li
873*ba677afaSXin Lifunc TestParser2_3FailsIfUnknownPackageSupplierType(t *testing.T) {
874*ba677afaSXin Li	parser := tvParser2_3{
875*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
876*ba677afaSXin Li		st:  psPackage2_3,
877*ba677afaSXin Li		pkg: &v2_3.Package{},
878*ba677afaSXin Li	}
879*ba677afaSXin Li
880*ba677afaSXin Li	// start with Package Name
881*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageName", "p1")
882*ba677afaSXin Li	if err != nil {
883*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
884*ba677afaSXin Li	}
885*ba677afaSXin Li	// invalid supplier type
886*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageSupplier", "whoops: John Doe")
887*ba677afaSXin Li	if err == nil {
888*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
889*ba677afaSXin Li	}
890*ba677afaSXin Li}
891*ba677afaSXin Li
892*ba677afaSXin Lifunc TestParser2_3FailsIfInvalidPackageOriginatorFormat(t *testing.T) {
893*ba677afaSXin Li	parser := tvParser2_3{
894*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
895*ba677afaSXin Li		st:  psPackage2_3,
896*ba677afaSXin Li		pkg: &v2_3.Package{},
897*ba677afaSXin Li	}
898*ba677afaSXin Li
899*ba677afaSXin Li	// start with Package Name
900*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageName", "p1")
901*ba677afaSXin Li	if err != nil {
902*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
903*ba677afaSXin Li	}
904*ba677afaSXin Li	// invalid originator format
905*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageOriginator", "whoops")
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_3FailsIfUnknownPackageOriginatorType(t *testing.T) {
912*ba677afaSXin Li	parser := tvParser2_3{
913*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
914*ba677afaSXin Li		st:  psPackage2_3,
915*ba677afaSXin Li		pkg: &v2_3.Package{},
916*ba677afaSXin Li	}
917*ba677afaSXin Li
918*ba677afaSXin Li	// start with Package Name
919*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageName", "p1")
920*ba677afaSXin Li	if err != nil {
921*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
922*ba677afaSXin Li	}
923*ba677afaSXin Li	// invalid originator type
924*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageOriginator", "whoops: John Doe")
925*ba677afaSXin Li	if err == nil {
926*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
927*ba677afaSXin Li	}
928*ba677afaSXin Li}
929*ba677afaSXin Li
930*ba677afaSXin Lifunc TestParser2_3SetsFilesAnalyzedTagsCorrectly(t *testing.T) {
931*ba677afaSXin Li	parser := tvParser2_3{
932*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
933*ba677afaSXin Li		st:  psPackage2_3,
934*ba677afaSXin Li		pkg: &v2_3.Package{},
935*ba677afaSXin Li	}
936*ba677afaSXin Li
937*ba677afaSXin Li	// start with Package Name
938*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageName", "p1")
939*ba677afaSXin Li	if err != nil {
940*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
941*ba677afaSXin Li	}
942*ba677afaSXin Li	// set tag
943*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("FilesAnalyzed", "true")
944*ba677afaSXin Li	if err != nil {
945*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
946*ba677afaSXin Li	}
947*ba677afaSXin Li	if parser.pkg.FilesAnalyzed != true {
948*ba677afaSXin Li		t.Errorf("expected %v, got %v", true, parser.pkg.FilesAnalyzed)
949*ba677afaSXin Li	}
950*ba677afaSXin Li	if parser.pkg.IsFilesAnalyzedTagPresent != true {
951*ba677afaSXin Li		t.Errorf("expected %v, got %v", true, parser.pkg.IsFilesAnalyzedTagPresent)
952*ba677afaSXin Li	}
953*ba677afaSXin Li}
954*ba677afaSXin Li
955*ba677afaSXin Lifunc TestParser2_3FailsIfInvalidPackageChecksumFormat(t *testing.T) {
956*ba677afaSXin Li	parser := tvParser2_3{
957*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
958*ba677afaSXin Li		st:  psPackage2_3,
959*ba677afaSXin Li		pkg: &v2_3.Package{},
960*ba677afaSXin Li	}
961*ba677afaSXin Li
962*ba677afaSXin Li	// start with Package Name
963*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageName", "p1")
964*ba677afaSXin Li	if err != nil {
965*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
966*ba677afaSXin Li	}
967*ba677afaSXin Li	// invalid checksum format
968*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageChecksum", "whoops")
969*ba677afaSXin Li	if err == nil {
970*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
971*ba677afaSXin Li	}
972*ba677afaSXin Li}
973*ba677afaSXin Li
974*ba677afaSXin Lifunc TestParser2_3FailsIfInvalidPackageChecksumType(t *testing.T) {
975*ba677afaSXin Li	parser := tvParser2_3{
976*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
977*ba677afaSXin Li		st:  psPackage2_3,
978*ba677afaSXin Li		pkg: &v2_3.Package{},
979*ba677afaSXin Li	}
980*ba677afaSXin Li
981*ba677afaSXin Li	// start with Package Name
982*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageName", "p1")
983*ba677afaSXin Li	if err != nil {
984*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
985*ba677afaSXin Li	}
986*ba677afaSXin Li	// invalid checksum type
987*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("PackageChecksum", "whoops: blah")
988*ba677afaSXin Li	if err == nil {
989*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
990*ba677afaSXin Li	}
991*ba677afaSXin Li}
992*ba677afaSXin Li
993*ba677afaSXin Lifunc TestParser2_3FailsIfInvalidExternalRefFormat(t *testing.T) {
994*ba677afaSXin Li	parser := tvParser2_3{
995*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
996*ba677afaSXin Li		st:  psPackage2_3,
997*ba677afaSXin Li		pkg: &v2_3.Package{},
998*ba677afaSXin Li	}
999*ba677afaSXin Li
1000*ba677afaSXin Li	// start with Package Name
1001*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageName", "p1")
1002*ba677afaSXin Li	if err != nil {
1003*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
1004*ba677afaSXin Li	}
1005*ba677afaSXin Li	// invalid external ref format
1006*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("ExternalRef", "whoops")
1007*ba677afaSXin Li	if err == nil {
1008*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
1009*ba677afaSXin Li	}
1010*ba677afaSXin Li}
1011*ba677afaSXin Li
1012*ba677afaSXin Lifunc TestParser2_3FailsIfExternalRefCommentBeforeExternalRef(t *testing.T) {
1013*ba677afaSXin Li	parser := tvParser2_3{
1014*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
1015*ba677afaSXin Li		st:  psPackage2_3,
1016*ba677afaSXin Li		pkg: &v2_3.Package{},
1017*ba677afaSXin Li	}
1018*ba677afaSXin Li
1019*ba677afaSXin Li	// start with Package Name
1020*ba677afaSXin Li	err := parser.parsePairFromPackage2_3("PackageName", "p1")
1021*ba677afaSXin Li	if err != nil {
1022*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
1023*ba677afaSXin Li	}
1024*ba677afaSXin Li	// external ref comment before external ref
1025*ba677afaSXin Li	err = parser.parsePairFromPackage2_3("ExternalRefComment", "whoops")
1026*ba677afaSXin Li	if err == nil {
1027*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
1028*ba677afaSXin Li	}
1029*ba677afaSXin Li}
1030*ba677afaSXin Li
1031*ba677afaSXin Li// ===== Helper function tests =====
1032*ba677afaSXin Li
1033*ba677afaSXin Lifunc TestCanCheckAndExtractExcludesFilenameAndCode(t *testing.T) {
1034*ba677afaSXin Li	code := "d6a770ba38583ed4bb4525bd96e50461655d2758"
1035*ba677afaSXin Li	fileName := "./package.spdx"
1036*ba677afaSXin Li	fullCodeValue := "d6a770ba38583ed4bb4525bd96e50461655d2758 (excludes: ./package.spdx)"
1037*ba677afaSXin Li
1038*ba677afaSXin Li	gotCode := extractCodeAndExcludes(fullCodeValue)
1039*ba677afaSXin Li	if gotCode.Value != code {
1040*ba677afaSXin Li		t.Errorf("got %v for gotCode", gotCode)
1041*ba677afaSXin Li	}
1042*ba677afaSXin Li	if len(gotCode.ExcludedFiles) != 1 || gotCode.ExcludedFiles[0] != fileName {
1043*ba677afaSXin Li		t.Errorf("got %v for gotFileName", gotCode.ExcludedFiles)
1044*ba677afaSXin Li	}
1045*ba677afaSXin Li}
1046*ba677afaSXin Li
1047*ba677afaSXin Lifunc TestCanExtractPackageExternalReference(t *testing.T) {
1048*ba677afaSXin Li	ref1 := "SECURITY cpe23Type cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:*"
1049*ba677afaSXin Li	category := "SECURITY"
1050*ba677afaSXin Li	refType := "cpe23Type"
1051*ba677afaSXin Li	location := "cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:*"
1052*ba677afaSXin Li
1053*ba677afaSXin Li	gotCategory, gotRefType, gotLocation, err := extractPackageExternalReference(ref1)
1054*ba677afaSXin Li	if err != nil {
1055*ba677afaSXin Li		t.Errorf("got non-nil error: %v", err)
1056*ba677afaSXin Li	}
1057*ba677afaSXin Li	if gotCategory != category {
1058*ba677afaSXin Li		t.Errorf("expected category %s, got %s", category, gotCategory)
1059*ba677afaSXin Li	}
1060*ba677afaSXin Li	if gotRefType != refType {
1061*ba677afaSXin Li		t.Errorf("expected refType %s, got %s", refType, gotRefType)
1062*ba677afaSXin Li	}
1063*ba677afaSXin Li	if gotLocation != location {
1064*ba677afaSXin Li		t.Errorf("expected location %s, got %s", location, gotLocation)
1065*ba677afaSXin Li	}
1066*ba677afaSXin Li}
1067*ba677afaSXin Li
1068*ba677afaSXin Lifunc TestCanExtractPackageExternalReferenceWithExtraWhitespace(t *testing.T) {
1069*ba677afaSXin Li	ref1 := "  SECURITY    \t cpe23Type   cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:* \t "
1070*ba677afaSXin Li	category := "SECURITY"
1071*ba677afaSXin Li	refType := "cpe23Type"
1072*ba677afaSXin Li	location := "cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:*"
1073*ba677afaSXin Li
1074*ba677afaSXin Li	gotCategory, gotRefType, gotLocation, err := extractPackageExternalReference(ref1)
1075*ba677afaSXin Li	if err != nil {
1076*ba677afaSXin Li		t.Errorf("got non-nil error: %v", err)
1077*ba677afaSXin Li	}
1078*ba677afaSXin Li	if gotCategory != category {
1079*ba677afaSXin Li		t.Errorf("expected category %s, got %s", category, gotCategory)
1080*ba677afaSXin Li	}
1081*ba677afaSXin Li	if gotRefType != refType {
1082*ba677afaSXin Li		t.Errorf("expected refType %s, got %s", refType, gotRefType)
1083*ba677afaSXin Li	}
1084*ba677afaSXin Li	if gotLocation != location {
1085*ba677afaSXin Li		t.Errorf("expected location %s, got %s", location, gotLocation)
1086*ba677afaSXin Li	}
1087*ba677afaSXin Li}
1088*ba677afaSXin Li
1089*ba677afaSXin Lifunc TestFailsPackageExternalRefWithInvalidFormat(t *testing.T) {
1090*ba677afaSXin Li	_, _, _, err := extractPackageExternalReference("whoops")
1091*ba677afaSXin Li	if err == nil {
1092*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
1093*ba677afaSXin Li	}
1094*ba677afaSXin Li}
1095*ba677afaSXin Li
1096*ba677afaSXin Lifunc TestParser2_3PackageWithoutSpdxIdentifierThrowsError(t *testing.T) {
1097*ba677afaSXin Li	// More than one package, the previous package doesn't contain an SPDX ID
1098*ba677afaSXin Li	pkgOldName := "p1"
1099*ba677afaSXin Li	parser := tvParser2_3{
1100*ba677afaSXin Li		doc: &v2_3.Document{Packages: []*v2_3.Package{}},
1101*ba677afaSXin Li		st:  psPackage2_3,
1102*ba677afaSXin Li		pkg: &v2_3.Package{PackageName: pkgOldName},
1103*ba677afaSXin Li	}
1104*ba677afaSXin Li	pkgOld := parser.pkg
1105*ba677afaSXin Li	parser.doc.Packages = append(parser.doc.Packages, pkgOld)
1106*ba677afaSXin Li	// the Document's Packages should have this one only
1107*ba677afaSXin Li	if parser.doc.Packages[0] != pkgOld {
1108*ba677afaSXin Li		t.Errorf("expected package %v, got %v", pkgOld, parser.doc.Packages[0])
1109*ba677afaSXin Li	}
1110*ba677afaSXin Li	if len(parser.doc.Packages) != 1 {
1111*ba677afaSXin Li		t.Errorf("expected 1 package, got %d", len(parser.doc.Packages))
1112*ba677afaSXin Li	}
1113*ba677afaSXin Li
1114*ba677afaSXin Li	pkgName := "p2"
1115*ba677afaSXin Li	err := parser.parsePair2_3("PackageName", pkgName)
1116*ba677afaSXin Li	if err == nil {
1117*ba677afaSXin Li		t.Errorf("package without SPDX Identifier getting accepted")
1118*ba677afaSXin Li	}
1119*ba677afaSXin Li}
1120