1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2*ba677afaSXin Lipackage parser2v2 3*ba677afaSXin Li 4*ba677afaSXin Liimport ( 5*ba677afaSXin Li "fmt" 6*ba677afaSXin Li "testing" 7*ba677afaSXin Li 8*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/common" 9*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/v2_2" 10*ba677afaSXin Li) 11*ba677afaSXin Li 12*ba677afaSXin Li// ===== Parser package section state change tests ===== 13*ba677afaSXin Lifunc TestParser2_2PackageStartsNewPackageAfterParsingPackageNameTag(t *testing.T) { 14*ba677afaSXin Li // create the first package 15*ba677afaSXin Li pkgOldName := "p1" 16*ba677afaSXin Li 17*ba677afaSXin Li parser := tvParser2_2{ 18*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 19*ba677afaSXin Li st: psPackage2_2, 20*ba677afaSXin Li pkg: &v2_2.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_2("PackageName", pkgName) 35*ba677afaSXin Li if err != nil { 36*ba677afaSXin Li t.Errorf("got error when calling parsePair2_2: %v", err) 37*ba677afaSXin Li } 38*ba677afaSXin Li // state should be correct 39*ba677afaSXin Li if parser.st != psPackage2_2 { 40*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psPackage2_2, 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_2PackageStartsNewPackageAfterParsingPackageNameTagWhileInUnpackaged(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_2{ 74*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 75*ba677afaSXin Li st: psFile2_2, 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_2("PackageName", pkgName) 86*ba677afaSXin Li if err != nil { 87*ba677afaSXin Li t.Errorf("got error when calling parsePair2_2: %v", err) 88*ba677afaSXin Li } 89*ba677afaSXin Li // state should be correct 90*ba677afaSXin Li if parser.st != psPackage2_2 { 91*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psPackage2_2, 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_2PackageMovesToFileAfterParsingFileNameTag(t *testing.T) { 116*ba677afaSXin Li parser := tvParser2_2{ 117*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 118*ba677afaSXin Li st: psPackage2_2, 119*ba677afaSXin Li pkg: &v2_2.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_2("FileName", "testFile") 125*ba677afaSXin Li if err != nil { 126*ba677afaSXin Li t.Errorf("got error when calling parsePair2_2: %v", err) 127*ba677afaSXin Li } 128*ba677afaSXin Li // state should be correct 129*ba677afaSXin Li if parser.st != psFile2_2 { 130*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psFile2_2, 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_2PackageMovesToOtherLicenseAfterParsingLicenseIDTag(t *testing.T) { 139*ba677afaSXin Li parser := tvParser2_2{ 140*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 141*ba677afaSXin Li st: psPackage2_2, 142*ba677afaSXin Li pkg: &v2_2.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_2("LicenseID", "LicenseRef-TestLic") 147*ba677afaSXin Li if err != nil { 148*ba677afaSXin Li t.Errorf("got error when calling parsePair2_2: %v", err) 149*ba677afaSXin Li } 150*ba677afaSXin Li if parser.st != psOtherLicense2_2 { 151*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psOtherLicense2_2, parser.st) 152*ba677afaSXin Li } 153*ba677afaSXin Li} 154*ba677afaSXin Li 155*ba677afaSXin Lifunc TestParser2_2PackageMovesToReviewAfterParsingReviewerTag(t *testing.T) { 156*ba677afaSXin Li parser := tvParser2_2{ 157*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 158*ba677afaSXin Li st: psPackage2_2, 159*ba677afaSXin Li pkg: &v2_2.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_2("Reviewer", "Person: John Doe") 164*ba677afaSXin Li if err != nil { 165*ba677afaSXin Li t.Errorf("got error when calling parsePair2_2: %v", err) 166*ba677afaSXin Li } 167*ba677afaSXin Li if parser.st != psReview2_2 { 168*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psReview2_2, parser.st) 169*ba677afaSXin Li } 170*ba677afaSXin Li} 171*ba677afaSXin Li 172*ba677afaSXin Lifunc TestParser2_2PackageStaysAfterParsingRelationshipTags(t *testing.T) { 173*ba677afaSXin Li parser := tvParser2_2{ 174*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 175*ba677afaSXin Li st: psPackage2_2, 176*ba677afaSXin Li pkg: &v2_2.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_2("Relationship", "SPDXRef-blah CONTAINS SPDXRef-blah-else") 181*ba677afaSXin Li if err != nil { 182*ba677afaSXin Li t.Errorf("got error when calling parsePair2_2: %v", err) 183*ba677afaSXin Li } 184*ba677afaSXin Li // state should remain unchanged 185*ba677afaSXin Li if parser.st != psPackage2_2 { 186*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psPackage2_2, parser.st) 187*ba677afaSXin Li } 188*ba677afaSXin Li 189*ba677afaSXin Li err = parser.parsePair2_2("RelationshipComment", "blah") 190*ba677afaSXin Li if err != nil { 191*ba677afaSXin Li t.Errorf("got error when calling parsePair2_2: %v", err) 192*ba677afaSXin Li } 193*ba677afaSXin Li // state should still remain unchanged 194*ba677afaSXin Li if parser.st != psPackage2_2 { 195*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psPackage2_2, parser.st) 196*ba677afaSXin Li } 197*ba677afaSXin Li} 198*ba677afaSXin Li 199*ba677afaSXin Lifunc TestParser2_2PackageStaysAfterParsingAnnotationTags(t *testing.T) { 200*ba677afaSXin Li parser := tvParser2_2{ 201*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 202*ba677afaSXin Li st: psPackage2_2, 203*ba677afaSXin Li pkg: &v2_2.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_2("Annotator", "Person: John Doe ()") 208*ba677afaSXin Li if err != nil { 209*ba677afaSXin Li t.Errorf("got error when calling parsePair2_2: %v", err) 210*ba677afaSXin Li } 211*ba677afaSXin Li if parser.st != psPackage2_2 { 212*ba677afaSXin Li t.Errorf("parser is in state %v, expected %v", parser.st, psPackage2_2) 213*ba677afaSXin Li } 214*ba677afaSXin Li 215*ba677afaSXin Li err = parser.parsePair2_2("AnnotationDate", "2018-09-15T00:36:00Z") 216*ba677afaSXin Li if err != nil { 217*ba677afaSXin Li t.Errorf("got error when calling parsePair2_2: %v", err) 218*ba677afaSXin Li } 219*ba677afaSXin Li if parser.st != psPackage2_2 { 220*ba677afaSXin Li t.Errorf("parser is in state %v, expected %v", parser.st, psPackage2_2) 221*ba677afaSXin Li } 222*ba677afaSXin Li 223*ba677afaSXin Li err = parser.parsePair2_2("AnnotationType", "REVIEW") 224*ba677afaSXin Li if err != nil { 225*ba677afaSXin Li t.Errorf("got error when calling parsePair2_2: %v", err) 226*ba677afaSXin Li } 227*ba677afaSXin Li if parser.st != psPackage2_2 { 228*ba677afaSXin Li t.Errorf("parser is in state %v, expected %v", parser.st, psPackage2_2) 229*ba677afaSXin Li } 230*ba677afaSXin Li 231*ba677afaSXin Li err = parser.parsePair2_2("SPDXREF", "SPDXRef-45") 232*ba677afaSXin Li if err != nil { 233*ba677afaSXin Li t.Errorf("got error when calling parsePair2_2: %v", err) 234*ba677afaSXin Li } 235*ba677afaSXin Li if parser.st != psPackage2_2 { 236*ba677afaSXin Li t.Errorf("parser is in state %v, expected %v", parser.st, psPackage2_2) 237*ba677afaSXin Li } 238*ba677afaSXin Li 239*ba677afaSXin Li err = parser.parsePair2_2("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_2: %v", err) 242*ba677afaSXin Li } 243*ba677afaSXin Li if parser.st != psPackage2_2 { 244*ba677afaSXin Li t.Errorf("parser is in state %v, expected %v", parser.st, psPackage2_2) 245*ba677afaSXin Li } 246*ba677afaSXin Li} 247*ba677afaSXin Li 248*ba677afaSXin Li// ===== Package data section tests ===== 249*ba677afaSXin Lifunc TestParser2_2CanParsePackageTags(t *testing.T) { 250*ba677afaSXin Li parser := tvParser2_2{ 251*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 252*ba677afaSXin Li st: psPackage2_2, 253*ba677afaSXin Li pkg: &v2_2.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_2("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_2("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_2("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_2("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_2("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_2("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 } 345*ba677afaSXin Li 346*ba677afaSXin Li for algo, tc := range testChecksums { 347*ba677afaSXin Li if err := parser.parsePairFromPackage2_2( 348*ba677afaSXin Li "PackageChecksum", fmt.Sprintf("%s: %s", algo, tc)); err != nil { 349*ba677afaSXin Li t.Errorf("expected error, got %v", err) 350*ba677afaSXin Li } 351*ba677afaSXin Li } 352*ba677afaSXin Li 353*ba677afaSXin Li for _, checksum := range parser.pkg.PackageChecksums { 354*ba677afaSXin Li if checksum.Value != testChecksums[checksum.Algorithm] { 355*ba677afaSXin Li t.Errorf( 356*ba677afaSXin Li "expected %s for PackageChecksum%s, got %s", 357*ba677afaSXin Li testChecksums[checksum.Algorithm], checksum.Algorithm, checksum.Value, 358*ba677afaSXin Li ) 359*ba677afaSXin Li } 360*ba677afaSXin Li } 361*ba677afaSXin Li 362*ba677afaSXin Li // Package Home Page 363*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageHomePage", "https://example.com/whatever2") 364*ba677afaSXin Li if err != nil { 365*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 366*ba677afaSXin Li } 367*ba677afaSXin Li if parser.pkg.PackageHomePage != "https://example.com/whatever2" { 368*ba677afaSXin Li t.Errorf("got %v for PackageHomePage", parser.pkg.PackageHomePage) 369*ba677afaSXin Li } 370*ba677afaSXin Li 371*ba677afaSXin Li // Package Source Info 372*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageSourceInfo", "random comment") 373*ba677afaSXin Li if err != nil { 374*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 375*ba677afaSXin Li } 376*ba677afaSXin Li if parser.pkg.PackageSourceInfo != "random comment" { 377*ba677afaSXin Li t.Errorf("got %v for PackageSourceInfo", parser.pkg.PackageSourceInfo) 378*ba677afaSXin Li } 379*ba677afaSXin Li 380*ba677afaSXin Li // Package License Concluded 381*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageLicenseConcluded", "Apache-2.0 OR GPL-2.0-or-later") 382*ba677afaSXin Li if err != nil { 383*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 384*ba677afaSXin Li } 385*ba677afaSXin Li if parser.pkg.PackageLicenseConcluded != "Apache-2.0 OR GPL-2.0-or-later" { 386*ba677afaSXin Li t.Errorf("got %v for PackageLicenseConcluded", parser.pkg.PackageLicenseConcluded) 387*ba677afaSXin Li } 388*ba677afaSXin Li 389*ba677afaSXin Li // All Licenses Info From Files 390*ba677afaSXin Li lics := []string{ 391*ba677afaSXin Li "Apache-2.0", 392*ba677afaSXin Li "GPL-2.0-or-later", 393*ba677afaSXin Li "CC0-1.0", 394*ba677afaSXin Li } 395*ba677afaSXin Li for _, lic := range lics { 396*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageLicenseInfoFromFiles", lic) 397*ba677afaSXin Li if err != nil { 398*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 399*ba677afaSXin Li } 400*ba677afaSXin Li } 401*ba677afaSXin Li for _, licWant := range lics { 402*ba677afaSXin Li flagFound := false 403*ba677afaSXin Li for _, licCheck := range parser.pkg.PackageLicenseInfoFromFiles { 404*ba677afaSXin Li if licWant == licCheck { 405*ba677afaSXin Li flagFound = true 406*ba677afaSXin Li } 407*ba677afaSXin Li } 408*ba677afaSXin Li if flagFound == false { 409*ba677afaSXin Li t.Errorf("didn't find %s in PackageLicenseInfoFromFiles", licWant) 410*ba677afaSXin Li } 411*ba677afaSXin Li } 412*ba677afaSXin Li if len(lics) != len(parser.pkg.PackageLicenseInfoFromFiles) { 413*ba677afaSXin Li t.Errorf("expected %d licenses in PackageLicenseInfoFromFiles, got %d", len(lics), 414*ba677afaSXin Li len(parser.pkg.PackageLicenseInfoFromFiles)) 415*ba677afaSXin Li } 416*ba677afaSXin Li 417*ba677afaSXin Li // Package License Declared 418*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageLicenseDeclared", "Apache-2.0 OR GPL-2.0-or-later") 419*ba677afaSXin Li if err != nil { 420*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 421*ba677afaSXin Li } 422*ba677afaSXin Li if parser.pkg.PackageLicenseDeclared != "Apache-2.0 OR GPL-2.0-or-later" { 423*ba677afaSXin Li t.Errorf("got %v for PackageLicenseDeclared", parser.pkg.PackageLicenseDeclared) 424*ba677afaSXin Li } 425*ba677afaSXin Li 426*ba677afaSXin Li // Package License Comments 427*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageLicenseComments", "this is a license comment") 428*ba677afaSXin Li if err != nil { 429*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 430*ba677afaSXin Li } 431*ba677afaSXin Li if parser.pkg.PackageLicenseComments != "this is a license comment" { 432*ba677afaSXin Li t.Errorf("got %v for PackageLicenseComments", parser.pkg.PackageLicenseComments) 433*ba677afaSXin Li } 434*ba677afaSXin Li 435*ba677afaSXin Li // Package Copyright Text 436*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageCopyrightText", "Copyright (c) me myself and i") 437*ba677afaSXin Li if err != nil { 438*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 439*ba677afaSXin Li } 440*ba677afaSXin Li if parser.pkg.PackageCopyrightText != "Copyright (c) me myself and i" { 441*ba677afaSXin Li t.Errorf("got %v for PackageCopyrightText", parser.pkg.PackageCopyrightText) 442*ba677afaSXin Li } 443*ba677afaSXin Li 444*ba677afaSXin Li // Package Summary 445*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageSummary", "i wrote this package") 446*ba677afaSXin Li if err != nil { 447*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 448*ba677afaSXin Li } 449*ba677afaSXin Li if parser.pkg.PackageSummary != "i wrote this package" { 450*ba677afaSXin Li t.Errorf("got %v for PackageSummary", parser.pkg.PackageSummary) 451*ba677afaSXin Li } 452*ba677afaSXin Li 453*ba677afaSXin Li // Package Description 454*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageDescription", "i wrote this package a lot") 455*ba677afaSXin Li if err != nil { 456*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 457*ba677afaSXin Li } 458*ba677afaSXin Li if parser.pkg.PackageDescription != "i wrote this package a lot" { 459*ba677afaSXin Li t.Errorf("got %v for PackageDescription", parser.pkg.PackageDescription) 460*ba677afaSXin Li } 461*ba677afaSXin Li 462*ba677afaSXin Li // Package Comment 463*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageComment", "i scanned this package") 464*ba677afaSXin Li if err != nil { 465*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 466*ba677afaSXin Li } 467*ba677afaSXin Li if parser.pkg.PackageComment != "i scanned this package" { 468*ba677afaSXin Li t.Errorf("got %v for PackageComment", parser.pkg.PackageComment) 469*ba677afaSXin Li } 470*ba677afaSXin Li 471*ba677afaSXin Li // Package Attribution Text 472*ba677afaSXin Li attrs := []string{ 473*ba677afaSXin Li "Include this notice in all advertising materials", 474*ba677afaSXin Li "This is a \nmulti-line string", 475*ba677afaSXin Li } 476*ba677afaSXin Li for _, attr := range attrs { 477*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageAttributionText", attr) 478*ba677afaSXin Li if err != nil { 479*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 480*ba677afaSXin Li } 481*ba677afaSXin Li } 482*ba677afaSXin Li for _, attrWant := range attrs { 483*ba677afaSXin Li flagFound := false 484*ba677afaSXin Li for _, attrCheck := range parser.pkg.PackageAttributionTexts { 485*ba677afaSXin Li if attrWant == attrCheck { 486*ba677afaSXin Li flagFound = true 487*ba677afaSXin Li } 488*ba677afaSXin Li } 489*ba677afaSXin Li if flagFound == false { 490*ba677afaSXin Li t.Errorf("didn't find %s in PackageAttributionText", attrWant) 491*ba677afaSXin Li } 492*ba677afaSXin Li } 493*ba677afaSXin Li if len(attrs) != len(parser.pkg.PackageAttributionTexts) { 494*ba677afaSXin Li t.Errorf("expected %d attribution texts in PackageAttributionTexts, got %d", len(attrs), 495*ba677afaSXin Li len(parser.pkg.PackageAttributionTexts)) 496*ba677afaSXin Li } 497*ba677afaSXin Li 498*ba677afaSXin Li // Package External References and Comments 499*ba677afaSXin Li ref1 := "SECURITY cpe23Type cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:*" 500*ba677afaSXin Li ref1Category := "SECURITY" 501*ba677afaSXin Li ref1Type := "cpe23Type" 502*ba677afaSXin Li ref1Locator := "cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:*" 503*ba677afaSXin Li ref1Comment := "this is comment #1" 504*ba677afaSXin Li ref2 := "OTHER LocationRef-acmeforge acmecorp/acmenator/4.1.3alpha" 505*ba677afaSXin Li ref2Category := "OTHER" 506*ba677afaSXin Li ref2Type := "LocationRef-acmeforge" 507*ba677afaSXin Li ref2Locator := "acmecorp/acmenator/4.1.3alpha" 508*ba677afaSXin Li ref2Comment := "this is comment #2" 509*ba677afaSXin Li err = parser.parsePairFromPackage2_2("ExternalRef", ref1) 510*ba677afaSXin Li if err != nil { 511*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 512*ba677afaSXin Li } 513*ba677afaSXin Li if len(parser.pkg.PackageExternalReferences) != 1 { 514*ba677afaSXin Li t.Errorf("expected 1 external reference, got %d", len(parser.pkg.PackageExternalReferences)) 515*ba677afaSXin Li } 516*ba677afaSXin Li if parser.pkgExtRef == nil { 517*ba677afaSXin Li t.Errorf("expected non-nil pkgExtRef, got nil") 518*ba677afaSXin Li } 519*ba677afaSXin Li if parser.pkg.PackageExternalReferences[0] == nil { 520*ba677afaSXin Li t.Errorf("expected non-nil PackageExternalReferences[0], got nil") 521*ba677afaSXin Li } 522*ba677afaSXin Li if parser.pkgExtRef != parser.pkg.PackageExternalReferences[0] { 523*ba677afaSXin Li t.Errorf("expected pkgExtRef to match PackageExternalReferences[0], got no match") 524*ba677afaSXin Li } 525*ba677afaSXin Li err = parser.parsePairFromPackage2_2("ExternalRefComment", ref1Comment) 526*ba677afaSXin Li if err != nil { 527*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 528*ba677afaSXin Li } 529*ba677afaSXin Li err = parser.parsePairFromPackage2_2("ExternalRef", ref2) 530*ba677afaSXin Li if err != nil { 531*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 532*ba677afaSXin Li } 533*ba677afaSXin Li if len(parser.pkg.PackageExternalReferences) != 2 { 534*ba677afaSXin Li t.Errorf("expected 2 external references, got %d", len(parser.pkg.PackageExternalReferences)) 535*ba677afaSXin Li } 536*ba677afaSXin Li if parser.pkgExtRef == nil { 537*ba677afaSXin Li t.Errorf("expected non-nil pkgExtRef, got nil") 538*ba677afaSXin Li } 539*ba677afaSXin Li if parser.pkg.PackageExternalReferences[1] == nil { 540*ba677afaSXin Li t.Errorf("expected non-nil PackageExternalReferences[1], got nil") 541*ba677afaSXin Li } 542*ba677afaSXin Li if parser.pkgExtRef != parser.pkg.PackageExternalReferences[1] { 543*ba677afaSXin Li t.Errorf("expected pkgExtRef to match PackageExternalReferences[1], got no match") 544*ba677afaSXin Li } 545*ba677afaSXin Li err = parser.parsePairFromPackage2_2("ExternalRefComment", ref2Comment) 546*ba677afaSXin Li if err != nil { 547*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 548*ba677afaSXin Li } 549*ba677afaSXin Li // finally, check these values 550*ba677afaSXin Li gotRef1 := parser.pkg.PackageExternalReferences[0] 551*ba677afaSXin Li if gotRef1.Category != ref1Category { 552*ba677afaSXin Li t.Errorf("expected ref1 category to be %s, got %s", gotRef1.Category, ref1Category) 553*ba677afaSXin Li } 554*ba677afaSXin Li if gotRef1.RefType != ref1Type { 555*ba677afaSXin Li t.Errorf("expected ref1 type to be %s, got %s", gotRef1.RefType, ref1Type) 556*ba677afaSXin Li } 557*ba677afaSXin Li if gotRef1.Locator != ref1Locator { 558*ba677afaSXin Li t.Errorf("expected ref1 locator to be %s, got %s", gotRef1.Locator, ref1Locator) 559*ba677afaSXin Li } 560*ba677afaSXin Li if gotRef1.ExternalRefComment != ref1Comment { 561*ba677afaSXin Li t.Errorf("expected ref1 comment to be %s, got %s", gotRef1.ExternalRefComment, ref1Comment) 562*ba677afaSXin Li } 563*ba677afaSXin Li gotRef2 := parser.pkg.PackageExternalReferences[1] 564*ba677afaSXin Li if gotRef2.Category != ref2Category { 565*ba677afaSXin Li t.Errorf("expected ref2 category to be %s, got %s", gotRef2.Category, ref2Category) 566*ba677afaSXin Li } 567*ba677afaSXin Li if gotRef2.RefType != ref2Type { 568*ba677afaSXin Li t.Errorf("expected ref2 type to be %s, got %s", gotRef2.RefType, ref2Type) 569*ba677afaSXin Li } 570*ba677afaSXin Li if gotRef2.Locator != ref2Locator { 571*ba677afaSXin Li t.Errorf("expected ref2 locator to be %s, got %s", gotRef2.Locator, ref2Locator) 572*ba677afaSXin Li } 573*ba677afaSXin Li if gotRef2.ExternalRefComment != ref2Comment { 574*ba677afaSXin Li t.Errorf("expected ref2 comment to be %s, got %s", gotRef2.ExternalRefComment, ref2Comment) 575*ba677afaSXin Li } 576*ba677afaSXin Li 577*ba677afaSXin Li} 578*ba677afaSXin Li 579*ba677afaSXin Lifunc TestParser2_2CanParsePackageSupplierPersonTag(t *testing.T) { 580*ba677afaSXin Li parser := tvParser2_2{ 581*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 582*ba677afaSXin Li st: psPackage2_2, 583*ba677afaSXin Li pkg: &v2_2.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"}, 584*ba677afaSXin Li } 585*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 586*ba677afaSXin Li 587*ba677afaSXin Li // Package Supplier: Person 588*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageSupplier", "Person: John Doe") 589*ba677afaSXin Li if err != nil { 590*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 591*ba677afaSXin Li } 592*ba677afaSXin Li if parser.pkg.PackageSupplier.Supplier != "John Doe" { 593*ba677afaSXin Li t.Errorf("got %v for PackageSupplierPerson", parser.pkg.PackageSupplier.Supplier) 594*ba677afaSXin Li } 595*ba677afaSXin Li} 596*ba677afaSXin Li 597*ba677afaSXin Lifunc TestParser2_2CanParsePackageSupplierOrganizationTag(t *testing.T) { 598*ba677afaSXin Li parser := tvParser2_2{ 599*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 600*ba677afaSXin Li st: psPackage2_2, 601*ba677afaSXin Li pkg: &v2_2.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"}, 602*ba677afaSXin Li } 603*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 604*ba677afaSXin Li 605*ba677afaSXin Li // Package Supplier: Organization 606*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageSupplier", "Organization: John Doe, Inc.") 607*ba677afaSXin Li if err != nil { 608*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 609*ba677afaSXin Li } 610*ba677afaSXin Li if parser.pkg.PackageSupplier.Supplier != "John Doe, Inc." { 611*ba677afaSXin Li t.Errorf("got %v for PackageSupplierOrganization", parser.pkg.PackageSupplier.Supplier) 612*ba677afaSXin Li } 613*ba677afaSXin Li} 614*ba677afaSXin Li 615*ba677afaSXin Lifunc TestParser2_2CanParsePackageSupplierNOASSERTIONTag(t *testing.T) { 616*ba677afaSXin Li parser := tvParser2_2{ 617*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 618*ba677afaSXin Li st: psPackage2_2, 619*ba677afaSXin Li pkg: &v2_2.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"}, 620*ba677afaSXin Li } 621*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 622*ba677afaSXin Li 623*ba677afaSXin Li // Package Supplier: NOASSERTION 624*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageSupplier", "NOASSERTION") 625*ba677afaSXin Li if err != nil { 626*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 627*ba677afaSXin Li } 628*ba677afaSXin Li if parser.pkg.PackageSupplier.Supplier != "NOASSERTION" { 629*ba677afaSXin Li t.Errorf("got value for Supplier, expected NOASSERTION") 630*ba677afaSXin Li } 631*ba677afaSXin Li} 632*ba677afaSXin Li 633*ba677afaSXin Lifunc TestParser2_2CanParsePackageOriginatorPersonTag(t *testing.T) { 634*ba677afaSXin Li parser := tvParser2_2{ 635*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 636*ba677afaSXin Li st: psPackage2_2, 637*ba677afaSXin Li pkg: &v2_2.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"}, 638*ba677afaSXin Li } 639*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 640*ba677afaSXin Li 641*ba677afaSXin Li // Package Originator: Person 642*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageOriginator", "Person: John Doe") 643*ba677afaSXin Li if err != nil { 644*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 645*ba677afaSXin Li } 646*ba677afaSXin Li if parser.pkg.PackageOriginator.Originator != "John Doe" { 647*ba677afaSXin Li t.Errorf("got %v for PackageOriginator", parser.pkg.PackageOriginator.Originator) 648*ba677afaSXin Li } 649*ba677afaSXin Li} 650*ba677afaSXin Li 651*ba677afaSXin Lifunc TestParser2_2CanParsePackageOriginatorOrganizationTag(t *testing.T) { 652*ba677afaSXin Li parser := tvParser2_2{ 653*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 654*ba677afaSXin Li st: psPackage2_2, 655*ba677afaSXin Li pkg: &v2_2.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"}, 656*ba677afaSXin Li } 657*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 658*ba677afaSXin Li 659*ba677afaSXin Li // Package Originator: Organization 660*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageOriginator", "Organization: John Doe, Inc.") 661*ba677afaSXin Li if err != nil { 662*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 663*ba677afaSXin Li } 664*ba677afaSXin Li if parser.pkg.PackageOriginator.Originator != "John Doe, Inc." { 665*ba677afaSXin Li t.Errorf("got %v for PackageOriginator", parser.pkg.PackageOriginator.Originator) 666*ba677afaSXin Li } 667*ba677afaSXin Li} 668*ba677afaSXin Li 669*ba677afaSXin Lifunc TestParser2_2CanParsePackageOriginatorNOASSERTIONTag(t *testing.T) { 670*ba677afaSXin Li parser := tvParser2_2{ 671*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 672*ba677afaSXin Li st: psPackage2_2, 673*ba677afaSXin Li pkg: &v2_2.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"}, 674*ba677afaSXin Li } 675*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 676*ba677afaSXin Li 677*ba677afaSXin Li // Package Originator: NOASSERTION 678*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageOriginator", "NOASSERTION") 679*ba677afaSXin Li if err != nil { 680*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 681*ba677afaSXin Li } 682*ba677afaSXin Li if parser.pkg.PackageOriginator.Originator != "NOASSERTION" { 683*ba677afaSXin Li t.Errorf("got false for PackageOriginatorNOASSERTION") 684*ba677afaSXin Li } 685*ba677afaSXin Li} 686*ba677afaSXin Li 687*ba677afaSXin Lifunc TestParser2_2CanParsePackageVerificationCodeTagWithExcludes(t *testing.T) { 688*ba677afaSXin Li parser := tvParser2_2{ 689*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 690*ba677afaSXin Li st: psPackage2_2, 691*ba677afaSXin Li pkg: &v2_2.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"}, 692*ba677afaSXin Li } 693*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 694*ba677afaSXin Li 695*ba677afaSXin Li // Package Verification Code with excludes parenthetical 696*ba677afaSXin Li code := "d6a770ba38583ed4bb4525bd96e50461655d2758" 697*ba677afaSXin Li fileName := "./package.spdx" 698*ba677afaSXin Li fullCodeValue := "d6a770ba38583ed4bb4525bd96e50461655d2758 (excludes: ./package.spdx)" 699*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageVerificationCode", fullCodeValue) 700*ba677afaSXin Li if err != nil { 701*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 702*ba677afaSXin Li } 703*ba677afaSXin Li if parser.pkg.PackageVerificationCode.Value != code { 704*ba677afaSXin Li t.Errorf("got %v for PackageVerificationCode", parser.pkg.PackageVerificationCode) 705*ba677afaSXin Li } 706*ba677afaSXin Li if len(parser.pkg.PackageVerificationCode.ExcludedFiles) != 1 || parser.pkg.PackageVerificationCode.ExcludedFiles[0] != fileName { 707*ba677afaSXin Li t.Errorf("got %v for PackageVerificationCodeExcludedFile", parser.pkg.PackageVerificationCode.ExcludedFiles) 708*ba677afaSXin Li } 709*ba677afaSXin Li 710*ba677afaSXin Li} 711*ba677afaSXin Li 712*ba677afaSXin Lifunc TestParser2_2CanParsePackageVerificationCodeTagWithoutExcludes(t *testing.T) { 713*ba677afaSXin Li parser := tvParser2_2{ 714*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 715*ba677afaSXin Li st: psPackage2_2, 716*ba677afaSXin Li pkg: &v2_2.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"}, 717*ba677afaSXin Li } 718*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 719*ba677afaSXin Li 720*ba677afaSXin Li // Package Verification Code without excludes parenthetical 721*ba677afaSXin Li code := "d6a770ba38583ed4bb4525bd96e50461655d2758" 722*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageVerificationCode", code) 723*ba677afaSXin Li if err != nil { 724*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 725*ba677afaSXin Li } 726*ba677afaSXin Li if parser.pkg.PackageVerificationCode.Value != code { 727*ba677afaSXin Li t.Errorf("got %v for PackageVerificationCode", parser.pkg.PackageVerificationCode) 728*ba677afaSXin Li } 729*ba677afaSXin Li if len(parser.pkg.PackageVerificationCode.ExcludedFiles) != 0 { 730*ba677afaSXin Li t.Errorf("got %v for PackageVerificationCodeExcludedFile", parser.pkg.PackageVerificationCode.ExcludedFiles) 731*ba677afaSXin Li } 732*ba677afaSXin Li 733*ba677afaSXin Li} 734*ba677afaSXin Li 735*ba677afaSXin Lifunc TestParser2_2PackageExternalRefPointerChangesAfterTags(t *testing.T) { 736*ba677afaSXin Li parser := tvParser2_2{ 737*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 738*ba677afaSXin Li st: psPackage2_2, 739*ba677afaSXin Li pkg: &v2_2.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"}, 740*ba677afaSXin Li } 741*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 742*ba677afaSXin Li 743*ba677afaSXin Li ref1 := "SECURITY cpe23Type cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:*" 744*ba677afaSXin Li err := parser.parsePairFromPackage2_2("ExternalRef", ref1) 745*ba677afaSXin Li if err != nil { 746*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 747*ba677afaSXin Li } 748*ba677afaSXin Li if parser.pkgExtRef == nil { 749*ba677afaSXin Li t.Errorf("expected non-nil external reference pointer, got nil") 750*ba677afaSXin Li } 751*ba677afaSXin Li 752*ba677afaSXin Li // now, a comment; pointer should go away 753*ba677afaSXin Li err = parser.parsePairFromPackage2_2("ExternalRefComment", "whatever") 754*ba677afaSXin Li if err != nil { 755*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 756*ba677afaSXin Li } 757*ba677afaSXin Li if parser.pkgExtRef != nil { 758*ba677afaSXin Li t.Errorf("expected nil external reference pointer, got non-nil") 759*ba677afaSXin Li } 760*ba677afaSXin Li 761*ba677afaSXin Li ref2 := "Other LocationRef-something https://example.com/whatever" 762*ba677afaSXin Li err = parser.parsePairFromPackage2_2("ExternalRef", ref2) 763*ba677afaSXin Li if err != nil { 764*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 765*ba677afaSXin Li } 766*ba677afaSXin Li if parser.pkgExtRef == nil { 767*ba677afaSXin Li t.Errorf("expected non-nil external reference pointer, got nil") 768*ba677afaSXin Li } 769*ba677afaSXin Li 770*ba677afaSXin Li // and some other random tag makes the pointer go away too 771*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageSummary", "whatever") 772*ba677afaSXin Li if err != nil { 773*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 774*ba677afaSXin Li } 775*ba677afaSXin Li if parser.pkgExtRef != nil { 776*ba677afaSXin Li t.Errorf("expected nil external reference pointer, got non-nil") 777*ba677afaSXin Li } 778*ba677afaSXin Li} 779*ba677afaSXin Li 780*ba677afaSXin Lifunc TestParser2_2PackageCreatesRelationshipInDocument(t *testing.T) { 781*ba677afaSXin Li parser := tvParser2_2{ 782*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 783*ba677afaSXin Li st: psPackage2_2, 784*ba677afaSXin Li pkg: &v2_2.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"}, 785*ba677afaSXin Li } 786*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 787*ba677afaSXin Li 788*ba677afaSXin Li err := parser.parsePair2_2("Relationship", "SPDXRef-blah CONTAINS SPDXRef-blah-whatever") 789*ba677afaSXin Li if err != nil { 790*ba677afaSXin Li t.Errorf("got error when calling parsePair2_2: %v", err) 791*ba677afaSXin Li } 792*ba677afaSXin Li if parser.rln == nil { 793*ba677afaSXin Li t.Fatalf("parser didn't create and point to Relationship struct") 794*ba677afaSXin Li } 795*ba677afaSXin Li if parser.rln != parser.doc.Relationships[0] { 796*ba677afaSXin Li t.Errorf("pointer to new Relationship doesn't match idx 0 for doc.Relationships[]") 797*ba677afaSXin Li } 798*ba677afaSXin Li} 799*ba677afaSXin Li 800*ba677afaSXin Lifunc TestParser2_2PackageCreatesAnnotationInDocument(t *testing.T) { 801*ba677afaSXin Li parser := tvParser2_2{ 802*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 803*ba677afaSXin Li st: psPackage2_2, 804*ba677afaSXin Li pkg: &v2_2.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"}, 805*ba677afaSXin Li } 806*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 807*ba677afaSXin Li 808*ba677afaSXin Li err := parser.parsePair2_2("Annotator", "Person: John Doe ()") 809*ba677afaSXin Li if err != nil { 810*ba677afaSXin Li t.Errorf("got error when calling parsePair2_2: %v", err) 811*ba677afaSXin Li } 812*ba677afaSXin Li if parser.ann == nil { 813*ba677afaSXin Li t.Fatalf("parser didn't create and point to Annotation struct") 814*ba677afaSXin Li } 815*ba677afaSXin Li if parser.ann != parser.doc.Annotations[0] { 816*ba677afaSXin Li t.Errorf("pointer to new Annotation doesn't match idx 0 for doc.Annotations[]") 817*ba677afaSXin Li } 818*ba677afaSXin Li} 819*ba677afaSXin Li 820*ba677afaSXin Lifunc TestParser2_2PackageUnknownTagFails(t *testing.T) { 821*ba677afaSXin Li parser := tvParser2_2{ 822*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 823*ba677afaSXin Li st: psPackage2_2, 824*ba677afaSXin Li pkg: &v2_2.Package{PackageName: "p1", PackageSPDXIdentifier: "p1"}, 825*ba677afaSXin Li } 826*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 827*ba677afaSXin Li 828*ba677afaSXin Li err := parser.parsePairFromPackage2_2("blah", "something") 829*ba677afaSXin Li if err == nil { 830*ba677afaSXin Li t.Errorf("expected error from parsing unknown tag") 831*ba677afaSXin Li } 832*ba677afaSXin Li} 833*ba677afaSXin Li 834*ba677afaSXin Lifunc TestParser2_2FailsIfInvalidSPDXIDInPackageSection(t *testing.T) { 835*ba677afaSXin Li parser := tvParser2_2{ 836*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 837*ba677afaSXin Li st: psPackage2_2, 838*ba677afaSXin Li pkg: &v2_2.Package{}, 839*ba677afaSXin Li } 840*ba677afaSXin Li 841*ba677afaSXin Li // start with Package Name 842*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageName", "p1") 843*ba677afaSXin Li if err != nil { 844*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 845*ba677afaSXin Li } 846*ba677afaSXin Li // invalid ID format 847*ba677afaSXin Li err = parser.parsePairFromPackage2_2("SPDXID", "whoops") 848*ba677afaSXin Li if err == nil { 849*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 850*ba677afaSXin Li } 851*ba677afaSXin Li} 852*ba677afaSXin Li 853*ba677afaSXin Lifunc TestParser2_2FailsIfInvalidPackageSupplierFormat(t *testing.T) { 854*ba677afaSXin Li parser := tvParser2_2{ 855*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 856*ba677afaSXin Li st: psPackage2_2, 857*ba677afaSXin Li pkg: &v2_2.Package{}, 858*ba677afaSXin Li } 859*ba677afaSXin Li 860*ba677afaSXin Li // start with Package Name 861*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageName", "p1") 862*ba677afaSXin Li if err != nil { 863*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 864*ba677afaSXin Li } 865*ba677afaSXin Li // invalid supplier format 866*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageSupplier", "whoops") 867*ba677afaSXin Li if err == nil { 868*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 869*ba677afaSXin Li } 870*ba677afaSXin Li} 871*ba677afaSXin Li 872*ba677afaSXin Lifunc TestParser2_2FailsIfUnknownPackageSupplierType(t *testing.T) { 873*ba677afaSXin Li parser := tvParser2_2{ 874*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 875*ba677afaSXin Li st: psPackage2_2, 876*ba677afaSXin Li pkg: &v2_2.Package{}, 877*ba677afaSXin Li } 878*ba677afaSXin Li 879*ba677afaSXin Li // start with Package Name 880*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageName", "p1") 881*ba677afaSXin Li if err != nil { 882*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 883*ba677afaSXin Li } 884*ba677afaSXin Li // invalid supplier type 885*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageSupplier", "whoops: John Doe") 886*ba677afaSXin Li if err == nil { 887*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 888*ba677afaSXin Li } 889*ba677afaSXin Li} 890*ba677afaSXin Li 891*ba677afaSXin Lifunc TestParser2_2FailsIfInvalidPackageOriginatorFormat(t *testing.T) { 892*ba677afaSXin Li parser := tvParser2_2{ 893*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 894*ba677afaSXin Li st: psPackage2_2, 895*ba677afaSXin Li pkg: &v2_2.Package{}, 896*ba677afaSXin Li } 897*ba677afaSXin Li 898*ba677afaSXin Li // start with Package Name 899*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageName", "p1") 900*ba677afaSXin Li if err != nil { 901*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 902*ba677afaSXin Li } 903*ba677afaSXin Li // invalid originator format 904*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageOriginator", "whoops") 905*ba677afaSXin Li if err == nil { 906*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 907*ba677afaSXin Li } 908*ba677afaSXin Li} 909*ba677afaSXin Li 910*ba677afaSXin Lifunc TestParser2_2FailsIfUnknownPackageOriginatorType(t *testing.T) { 911*ba677afaSXin Li parser := tvParser2_2{ 912*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 913*ba677afaSXin Li st: psPackage2_2, 914*ba677afaSXin Li pkg: &v2_2.Package{}, 915*ba677afaSXin Li } 916*ba677afaSXin Li 917*ba677afaSXin Li // start with Package Name 918*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageName", "p1") 919*ba677afaSXin Li if err != nil { 920*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 921*ba677afaSXin Li } 922*ba677afaSXin Li // invalid originator type 923*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageOriginator", "whoops: John Doe") 924*ba677afaSXin Li if err == nil { 925*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 926*ba677afaSXin Li } 927*ba677afaSXin Li} 928*ba677afaSXin Li 929*ba677afaSXin Lifunc TestParser2_2SetsFilesAnalyzedTagsCorrectly(t *testing.T) { 930*ba677afaSXin Li parser := tvParser2_2{ 931*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 932*ba677afaSXin Li st: psPackage2_2, 933*ba677afaSXin Li pkg: &v2_2.Package{}, 934*ba677afaSXin Li } 935*ba677afaSXin Li 936*ba677afaSXin Li // start with Package Name 937*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageName", "p1") 938*ba677afaSXin Li if err != nil { 939*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 940*ba677afaSXin Li } 941*ba677afaSXin Li // set tag 942*ba677afaSXin Li err = parser.parsePairFromPackage2_2("FilesAnalyzed", "true") 943*ba677afaSXin Li if err != nil { 944*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 945*ba677afaSXin Li } 946*ba677afaSXin Li if parser.pkg.FilesAnalyzed != true { 947*ba677afaSXin Li t.Errorf("expected %v, got %v", true, parser.pkg.FilesAnalyzed) 948*ba677afaSXin Li } 949*ba677afaSXin Li if parser.pkg.IsFilesAnalyzedTagPresent != true { 950*ba677afaSXin Li t.Errorf("expected %v, got %v", true, parser.pkg.IsFilesAnalyzedTagPresent) 951*ba677afaSXin Li } 952*ba677afaSXin Li} 953*ba677afaSXin Li 954*ba677afaSXin Lifunc TestParser2_2FailsIfInvalidPackageChecksumFormat(t *testing.T) { 955*ba677afaSXin Li parser := tvParser2_2{ 956*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 957*ba677afaSXin Li st: psPackage2_2, 958*ba677afaSXin Li pkg: &v2_2.Package{}, 959*ba677afaSXin Li } 960*ba677afaSXin Li 961*ba677afaSXin Li // start with Package Name 962*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageName", "p1") 963*ba677afaSXin Li if err != nil { 964*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 965*ba677afaSXin Li } 966*ba677afaSXin Li // invalid checksum format 967*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageChecksum", "whoops") 968*ba677afaSXin Li if err == nil { 969*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 970*ba677afaSXin Li } 971*ba677afaSXin Li} 972*ba677afaSXin Li 973*ba677afaSXin Lifunc TestParser2_2FailsIfInvalidPackageChecksumType(t *testing.T) { 974*ba677afaSXin Li parser := tvParser2_2{ 975*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 976*ba677afaSXin Li st: psPackage2_2, 977*ba677afaSXin Li pkg: &v2_2.Package{}, 978*ba677afaSXin Li } 979*ba677afaSXin Li 980*ba677afaSXin Li // start with Package Name 981*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageName", "p1") 982*ba677afaSXin Li if err != nil { 983*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 984*ba677afaSXin Li } 985*ba677afaSXin Li // invalid checksum type 986*ba677afaSXin Li err = parser.parsePairFromPackage2_2("PackageChecksum", "whoops: blah") 987*ba677afaSXin Li if err == nil { 988*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 989*ba677afaSXin Li } 990*ba677afaSXin Li} 991*ba677afaSXin Li 992*ba677afaSXin Lifunc TestParser2_2FailsIfInvalidExternalRefFormat(t *testing.T) { 993*ba677afaSXin Li parser := tvParser2_2{ 994*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 995*ba677afaSXin Li st: psPackage2_2, 996*ba677afaSXin Li pkg: &v2_2.Package{}, 997*ba677afaSXin Li } 998*ba677afaSXin Li 999*ba677afaSXin Li // start with Package Name 1000*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageName", "p1") 1001*ba677afaSXin Li if err != nil { 1002*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 1003*ba677afaSXin Li } 1004*ba677afaSXin Li // invalid external ref format 1005*ba677afaSXin Li err = parser.parsePairFromPackage2_2("ExternalRef", "whoops") 1006*ba677afaSXin Li if err == nil { 1007*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 1008*ba677afaSXin Li } 1009*ba677afaSXin Li} 1010*ba677afaSXin Li 1011*ba677afaSXin Lifunc TestParser2_2FailsIfExternalRefCommentBeforeExternalRef(t *testing.T) { 1012*ba677afaSXin Li parser := tvParser2_2{ 1013*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 1014*ba677afaSXin Li st: psPackage2_2, 1015*ba677afaSXin Li pkg: &v2_2.Package{}, 1016*ba677afaSXin Li } 1017*ba677afaSXin Li 1018*ba677afaSXin Li // start with Package Name 1019*ba677afaSXin Li err := parser.parsePairFromPackage2_2("PackageName", "p1") 1020*ba677afaSXin Li if err != nil { 1021*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 1022*ba677afaSXin Li } 1023*ba677afaSXin Li // external ref comment before external ref 1024*ba677afaSXin Li err = parser.parsePairFromPackage2_2("ExternalRefComment", "whoops") 1025*ba677afaSXin Li if err == nil { 1026*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 1027*ba677afaSXin Li } 1028*ba677afaSXin Li} 1029*ba677afaSXin Li 1030*ba677afaSXin Li// ===== Helper function tests ===== 1031*ba677afaSXin Li 1032*ba677afaSXin Lifunc TestCanCheckAndExtractExcludesFilenameAndCode(t *testing.T) { 1033*ba677afaSXin Li code := "d6a770ba38583ed4bb4525bd96e50461655d2758" 1034*ba677afaSXin Li fileName := "./package.spdx" 1035*ba677afaSXin Li fullCodeValue := "d6a770ba38583ed4bb4525bd96e50461655d2758 (excludes: ./package.spdx)" 1036*ba677afaSXin Li 1037*ba677afaSXin Li gotCode := extractCodeAndExcludes(fullCodeValue) 1038*ba677afaSXin Li if gotCode.Value != code { 1039*ba677afaSXin Li t.Errorf("got %v for gotCode", gotCode) 1040*ba677afaSXin Li } 1041*ba677afaSXin Li if len(gotCode.ExcludedFiles) != 1 || gotCode.ExcludedFiles[0] != fileName { 1042*ba677afaSXin Li t.Errorf("got %v for gotFileName", gotCode.ExcludedFiles) 1043*ba677afaSXin Li } 1044*ba677afaSXin Li} 1045*ba677afaSXin Li 1046*ba677afaSXin Lifunc TestCanExtractPackageExternalReference(t *testing.T) { 1047*ba677afaSXin Li ref1 := "SECURITY cpe23Type cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:*" 1048*ba677afaSXin Li category := "SECURITY" 1049*ba677afaSXin Li refType := "cpe23Type" 1050*ba677afaSXin Li location := "cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:*" 1051*ba677afaSXin Li 1052*ba677afaSXin Li gotCategory, gotRefType, gotLocation, err := extractPackageExternalReference(ref1) 1053*ba677afaSXin Li if err != nil { 1054*ba677afaSXin Li t.Errorf("got non-nil error: %v", err) 1055*ba677afaSXin Li } 1056*ba677afaSXin Li if gotCategory != category { 1057*ba677afaSXin Li t.Errorf("expected category %s, got %s", category, gotCategory) 1058*ba677afaSXin Li } 1059*ba677afaSXin Li if gotRefType != refType { 1060*ba677afaSXin Li t.Errorf("expected refType %s, got %s", refType, gotRefType) 1061*ba677afaSXin Li } 1062*ba677afaSXin Li if gotLocation != location { 1063*ba677afaSXin Li t.Errorf("expected location %s, got %s", location, gotLocation) 1064*ba677afaSXin Li } 1065*ba677afaSXin Li} 1066*ba677afaSXin Li 1067*ba677afaSXin Lifunc TestCanExtractPackageExternalReferenceWithExtraWhitespace(t *testing.T) { 1068*ba677afaSXin Li ref1 := " SECURITY \t cpe23Type cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:* \t " 1069*ba677afaSXin Li category := "SECURITY" 1070*ba677afaSXin Li refType := "cpe23Type" 1071*ba677afaSXin Li location := "cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:*" 1072*ba677afaSXin Li 1073*ba677afaSXin Li gotCategory, gotRefType, gotLocation, err := extractPackageExternalReference(ref1) 1074*ba677afaSXin Li if err != nil { 1075*ba677afaSXin Li t.Errorf("got non-nil error: %v", err) 1076*ba677afaSXin Li } 1077*ba677afaSXin Li if gotCategory != category { 1078*ba677afaSXin Li t.Errorf("expected category %s, got %s", category, gotCategory) 1079*ba677afaSXin Li } 1080*ba677afaSXin Li if gotRefType != refType { 1081*ba677afaSXin Li t.Errorf("expected refType %s, got %s", refType, gotRefType) 1082*ba677afaSXin Li } 1083*ba677afaSXin Li if gotLocation != location { 1084*ba677afaSXin Li t.Errorf("expected location %s, got %s", location, gotLocation) 1085*ba677afaSXin Li } 1086*ba677afaSXin Li} 1087*ba677afaSXin Li 1088*ba677afaSXin Lifunc TestFailsPackageExternalRefWithInvalidFormat(t *testing.T) { 1089*ba677afaSXin Li _, _, _, err := extractPackageExternalReference("whoops") 1090*ba677afaSXin Li if err == nil { 1091*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 1092*ba677afaSXin Li } 1093*ba677afaSXin Li} 1094*ba677afaSXin Li 1095*ba677afaSXin Lifunc TestParser2_2PackageWithoutSpdxIdentifierThrowsError(t *testing.T) { 1096*ba677afaSXin Li // More than one package, the previous package doesn't contain an SPDX ID 1097*ba677afaSXin Li pkgOldName := "p1" 1098*ba677afaSXin Li parser := tvParser2_2{ 1099*ba677afaSXin Li doc: &v2_2.Document{Packages: []*v2_2.Package{}}, 1100*ba677afaSXin Li st: psPackage2_2, 1101*ba677afaSXin Li pkg: &v2_2.Package{PackageName: pkgOldName}, 1102*ba677afaSXin Li } 1103*ba677afaSXin Li pkgOld := parser.pkg 1104*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, pkgOld) 1105*ba677afaSXin Li // the Document's Packages should have this one only 1106*ba677afaSXin Li if parser.doc.Packages[0] != pkgOld { 1107*ba677afaSXin Li t.Errorf("expected package %v, got %v", pkgOld, parser.doc.Packages[0]) 1108*ba677afaSXin Li } 1109*ba677afaSXin Li if len(parser.doc.Packages) != 1 { 1110*ba677afaSXin Li t.Errorf("expected 1 package, got %d", len(parser.doc.Packages)) 1111*ba677afaSXin Li } 1112*ba677afaSXin Li 1113*ba677afaSXin Li pkgName := "p2" 1114*ba677afaSXin Li err := parser.parsePair2_2("PackageName", pkgName) 1115*ba677afaSXin Li if err == nil { 1116*ba677afaSXin Li t.Errorf("package without SPDX Identifier getting accepted") 1117*ba677afaSXin Li } 1118*ba677afaSXin Li} 1119