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