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