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 file section state change tests ===== 12*ba677afaSXin Lifunc TestParser2_1FileStartsNewFileAfterParsingFileNameTag(t *testing.T) { 13*ba677afaSXin Li // create the first file 14*ba677afaSXin Li fileOldName := "f1.txt" 15*ba677afaSXin Li 16*ba677afaSXin Li parser := tvParser2_1{ 17*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 18*ba677afaSXin Li st: psFile2_1, 19*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 20*ba677afaSXin Li file: &v2_1.File{FileName: fileOldName, FileSPDXIdentifier: "f1"}, 21*ba677afaSXin Li } 22*ba677afaSXin Li fileOld := parser.file 23*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 24*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, fileOld) 25*ba677afaSXin Li // the Package's Files should have this one only 26*ba677afaSXin Li if len(parser.pkg.Files) != 1 { 27*ba677afaSXin Li t.Fatalf("expected 1 file, got %d", len(parser.pkg.Files)) 28*ba677afaSXin Li } 29*ba677afaSXin Li if parser.pkg.Files[0] != fileOld { 30*ba677afaSXin Li t.Errorf("expected file %v in Files[f1], got %v", fileOld, parser.pkg.Files[0]) 31*ba677afaSXin Li } 32*ba677afaSXin Li if parser.pkg.Files[0].FileName != fileOldName { 33*ba677afaSXin Li t.Errorf("expected file name %s in Files[f1], got %s", fileOldName, parser.pkg.Files[0].FileName) 34*ba677afaSXin Li } 35*ba677afaSXin Li 36*ba677afaSXin Li // now add a new file 37*ba677afaSXin Li fileName := "f2.txt" 38*ba677afaSXin Li err := parser.parsePair2_1("FileName", fileName) 39*ba677afaSXin Li if err != nil { 40*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 41*ba677afaSXin Li } 42*ba677afaSXin Li // state should be correct 43*ba677afaSXin Li if parser.st != psFile2_1 { 44*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psFile2_1, parser.st) 45*ba677afaSXin Li } 46*ba677afaSXin Li // and a file should be created 47*ba677afaSXin Li if parser.file == nil { 48*ba677afaSXin Li t.Fatalf("parser didn't create new file") 49*ba677afaSXin Li } 50*ba677afaSXin Li // and the file name should be as expected 51*ba677afaSXin Li if parser.file.FileName != fileName { 52*ba677afaSXin Li t.Errorf("expected file name %s, got %s", fileName, parser.file.FileName) 53*ba677afaSXin Li } 54*ba677afaSXin Li // and the Package's Files should still be of size 1 and not have this new 55*ba677afaSXin Li // one yet, since it hasn't seen an SPDX identifier 56*ba677afaSXin Li if len(parser.pkg.Files) != 1 { 57*ba677afaSXin Li t.Fatalf("expected 1 file, got %d", len(parser.pkg.Files)) 58*ba677afaSXin Li } 59*ba677afaSXin Li if parser.pkg.Files[0] != fileOld { 60*ba677afaSXin Li t.Errorf("expected file %v in Files[f1], got %v", fileOld, parser.pkg.Files[0]) 61*ba677afaSXin Li } 62*ba677afaSXin Li if parser.pkg.Files[0].FileName != fileOldName { 63*ba677afaSXin Li t.Errorf("expected file name %s in Files[f1], got %s", fileOldName, parser.pkg.Files[0].FileName) 64*ba677afaSXin Li } 65*ba677afaSXin Li 66*ba677afaSXin Li // now parse an SPDX identifier tag 67*ba677afaSXin Li err = parser.parsePair2_1("SPDXID", "SPDXRef-f2ID") 68*ba677afaSXin Li if err != nil { 69*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 70*ba677afaSXin Li } 71*ba677afaSXin Li // and the Package's Files should now be of size 2 and have this new one 72*ba677afaSXin Li if len(parser.pkg.Files) != 2 { 73*ba677afaSXin Li t.Fatalf("expected 2 files, got %d", len(parser.pkg.Files)) 74*ba677afaSXin Li } 75*ba677afaSXin Li if parser.pkg.Files[0] != fileOld { 76*ba677afaSXin Li t.Errorf("expected file %v in Files[f1], got %v", fileOld, parser.pkg.Files[0]) 77*ba677afaSXin Li } 78*ba677afaSXin Li if parser.pkg.Files[0].FileName != fileOldName { 79*ba677afaSXin Li t.Errorf("expected file name %s in Files[f1], got %s", fileOldName, parser.pkg.Files[0].FileName) 80*ba677afaSXin Li } 81*ba677afaSXin Li if parser.pkg.Files[1] != parser.file { 82*ba677afaSXin Li t.Errorf("expected file %v in Files[f2ID], got %v", parser.file, parser.pkg.Files[1]) 83*ba677afaSXin Li } 84*ba677afaSXin Li if parser.pkg.Files[1].FileName != fileName { 85*ba677afaSXin Li t.Errorf("expected file name %s in Files[f2ID], got %s", fileName, parser.pkg.Files[1].FileName) 86*ba677afaSXin Li } 87*ba677afaSXin Li} 88*ba677afaSXin Li 89*ba677afaSXin Lifunc TestParser2_1FileAddsToPackageOrUnpackagedFiles(t *testing.T) { 90*ba677afaSXin Li // start with no packages 91*ba677afaSXin Li parser := tvParser2_1{ 92*ba677afaSXin Li doc: &v2_1.Document{}, 93*ba677afaSXin Li st: psCreationInfo2_1, 94*ba677afaSXin Li } 95*ba677afaSXin Li 96*ba677afaSXin Li // add a file and SPDX identifier 97*ba677afaSXin Li fileName := "f2.txt" 98*ba677afaSXin Li err := parser.parsePair2_1("FileName", fileName) 99*ba677afaSXin Li if err != nil { 100*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 101*ba677afaSXin Li } 102*ba677afaSXin Li err = parser.parsePair2_1("SPDXID", "SPDXRef-f2ID") 103*ba677afaSXin Li if err != nil { 104*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 105*ba677afaSXin Li } 106*ba677afaSXin Li fileOld := parser.file 107*ba677afaSXin Li // should have been added to Files 108*ba677afaSXin Li if len(parser.doc.Files) != 1 { 109*ba677afaSXin Li t.Fatalf("expected 1 file in Files, got %d", len(parser.doc.Files)) 110*ba677afaSXin Li } 111*ba677afaSXin Li if parser.doc.Files[0] != fileOld { 112*ba677afaSXin Li t.Errorf("expected file %v in Files[f2ID], got %v", fileOld, parser.doc.Files[0]) 113*ba677afaSXin Li } 114*ba677afaSXin Li // now create a package and a new file 115*ba677afaSXin Li err = parser.parsePair2_1("PackageName", "package1") 116*ba677afaSXin Li if err != nil { 117*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 118*ba677afaSXin Li } 119*ba677afaSXin Li err = parser.parsePair2_1("SPDXID", "SPDXRef-pkg1") 120*ba677afaSXin Li if err != nil { 121*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 122*ba677afaSXin Li } 123*ba677afaSXin Li err = parser.parsePair2_1("FileName", "f3.txt") 124*ba677afaSXin Li if err != nil { 125*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 126*ba677afaSXin Li } 127*ba677afaSXin Li err = parser.parsePair2_1("SPDXID", "SPDXRef-f3ID") 128*ba677afaSXin Li if err != nil { 129*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 130*ba677afaSXin Li } 131*ba677afaSXin Li // Files should still be size 1 and have old file only 132*ba677afaSXin Li if len(parser.doc.Files) != 1 { 133*ba677afaSXin Li t.Fatalf("expected 1 file in Files, got %d", len(parser.doc.Files)) 134*ba677afaSXin Li } 135*ba677afaSXin Li if parser.doc.Files[0] != fileOld { 136*ba677afaSXin Li t.Errorf("expected file %v in Files[f2ID], got %v", fileOld, parser.doc.Files[0]) 137*ba677afaSXin Li } 138*ba677afaSXin Li // and new package should have gotten the new file 139*ba677afaSXin Li if len(parser.pkg.Files) != 1 { 140*ba677afaSXin Li t.Fatalf("expected 1 file in Files, got %d", len(parser.pkg.Files)) 141*ba677afaSXin Li } 142*ba677afaSXin Li if parser.pkg.Files[0] != parser.file { 143*ba677afaSXin Li t.Errorf("expected file %v in Files[f3ID], got %v", parser.file, parser.pkg.Files[0]) 144*ba677afaSXin Li } 145*ba677afaSXin Li} 146*ba677afaSXin Li 147*ba677afaSXin Lifunc TestParser2_1FileStartsNewPackageAfterParsingPackageNameTag(t *testing.T) { 148*ba677afaSXin Li // create the first file and package 149*ba677afaSXin Li p1Name := "package1" 150*ba677afaSXin Li f1Name := "f1.txt" 151*ba677afaSXin Li 152*ba677afaSXin Li parser := tvParser2_1{ 153*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 154*ba677afaSXin Li st: psFile2_1, 155*ba677afaSXin Li pkg: &v2_1.Package{PackageName: p1Name, PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}}, 156*ba677afaSXin Li file: &v2_1.File{FileName: f1Name, FileSPDXIdentifier: "f1"}, 157*ba677afaSXin Li } 158*ba677afaSXin Li p1 := parser.pkg 159*ba677afaSXin Li f1 := parser.file 160*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, p1) 161*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, f1) 162*ba677afaSXin Li 163*ba677afaSXin Li // now add a new package 164*ba677afaSXin Li p2Name := "package2" 165*ba677afaSXin Li err := parser.parsePair2_1("PackageName", p2Name) 166*ba677afaSXin Li if err != nil { 167*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 168*ba677afaSXin Li } 169*ba677afaSXin Li // state should go back to Package 170*ba677afaSXin Li if parser.st != psPackage2_1 { 171*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psPackage2_1, parser.st) 172*ba677afaSXin Li } 173*ba677afaSXin Li // and a package should be created 174*ba677afaSXin Li if parser.pkg == nil { 175*ba677afaSXin Li t.Fatalf("parser didn't create new pkg") 176*ba677afaSXin Li } 177*ba677afaSXin Li // and the package name should be as expected 178*ba677afaSXin Li if parser.pkg.PackageName != p2Name { 179*ba677afaSXin Li t.Errorf("expected package name %s, got %s", p2Name, parser.pkg.PackageName) 180*ba677afaSXin Li } 181*ba677afaSXin Li // and the package should default to true for FilesAnalyzed 182*ba677afaSXin Li if parser.pkg.FilesAnalyzed != true { 183*ba677afaSXin Li t.Errorf("expected FilesAnalyzed to default to true, got false") 184*ba677afaSXin Li } 185*ba677afaSXin Li if parser.pkg.IsFilesAnalyzedTagPresent != false { 186*ba677afaSXin Li t.Errorf("expected IsFilesAnalyzedTagPresent to default to false, got true") 187*ba677afaSXin Li } 188*ba677afaSXin Li // and the new Package should have no files 189*ba677afaSXin Li if len(parser.pkg.Files) != 0 { 190*ba677afaSXin Li t.Errorf("Expected no files in pkg.Files, got %d", len(parser.pkg.Files)) 191*ba677afaSXin Li } 192*ba677afaSXin Li // and the Document's Packages should still be of size 1 and not have this 193*ba677afaSXin Li // new one, because no SPDX identifier has been seen yet 194*ba677afaSXin Li if len(parser.doc.Packages) != 1 { 195*ba677afaSXin Li t.Fatalf("expected 1 package, got %d", len(parser.doc.Packages)) 196*ba677afaSXin Li } 197*ba677afaSXin Li if parser.doc.Packages[0] != p1 { 198*ba677afaSXin Li t.Errorf("Expected package %v in Packages[package1], got %v", p1, parser.doc.Packages[0]) 199*ba677afaSXin Li } 200*ba677afaSXin Li if parser.doc.Packages[0].PackageName != p1Name { 201*ba677afaSXin Li t.Errorf("expected package name %s in Packages[package1], got %s", p1Name, parser.doc.Packages[0].PackageName) 202*ba677afaSXin Li } 203*ba677afaSXin Li // and the first Package's Files should be of size 1 and have f1 only 204*ba677afaSXin Li if len(parser.doc.Packages[0].Files) != 1 { 205*ba677afaSXin Li t.Errorf("Expected 1 file in Packages[package1].Files, got %d", len(parser.doc.Packages[0].Files)) 206*ba677afaSXin Li } 207*ba677afaSXin Li if parser.doc.Packages[0].Files[0] != f1 { 208*ba677afaSXin Li t.Errorf("Expected file %v in Files[f1], got %v", f1, parser.doc.Packages[0].Files[0]) 209*ba677afaSXin Li } 210*ba677afaSXin Li if parser.doc.Packages[0].Files[0].FileName != f1Name { 211*ba677afaSXin Li t.Errorf("expected file name %s in Files[f1], got %s", f1Name, parser.doc.Packages[0].Files[0].FileName) 212*ba677afaSXin Li } 213*ba677afaSXin Li // and the current file should be nil 214*ba677afaSXin Li if parser.file != nil { 215*ba677afaSXin Li t.Errorf("Expected nil for parser.file, got %v", parser.file) 216*ba677afaSXin Li } 217*ba677afaSXin Li} 218*ba677afaSXin Li 219*ba677afaSXin Lifunc TestParser2_1FileMovesToSnippetAfterParsingSnippetSPDXIDTag(t *testing.T) { 220*ba677afaSXin Li parser := tvParser2_1{ 221*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 222*ba677afaSXin Li st: psFile2_1, 223*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 224*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"}, 225*ba677afaSXin Li } 226*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 227*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 228*ba677afaSXin Li fileCurrent := parser.file 229*ba677afaSXin Li 230*ba677afaSXin Li err := parser.parsePair2_1("SnippetSPDXID", "SPDXRef-Test1") 231*ba677afaSXin Li if err != nil { 232*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 233*ba677afaSXin Li } 234*ba677afaSXin Li // state should be correct 235*ba677afaSXin Li if parser.st != psSnippet2_1 { 236*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psSnippet2_1, parser.st) 237*ba677afaSXin Li } 238*ba677afaSXin Li // and current file should remain what it was 239*ba677afaSXin Li if parser.file != fileCurrent { 240*ba677afaSXin Li t.Fatalf("expected file to remain %v, got %v", fileCurrent, parser.file) 241*ba677afaSXin Li } 242*ba677afaSXin Li} 243*ba677afaSXin Li 244*ba677afaSXin Lifunc TestParser2_1FileMovesToOtherLicenseAfterParsingLicenseIDTag(t *testing.T) { 245*ba677afaSXin Li parser := tvParser2_1{ 246*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 247*ba677afaSXin Li st: psFile2_1, 248*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 249*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"}, 250*ba677afaSXin Li } 251*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 252*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 253*ba677afaSXin Li 254*ba677afaSXin Li err := parser.parsePair2_1("LicenseID", "LicenseRef-TestLic") 255*ba677afaSXin Li if err != nil { 256*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 257*ba677afaSXin Li } 258*ba677afaSXin Li if parser.st != psOtherLicense2_1 { 259*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psOtherLicense2_1, parser.st) 260*ba677afaSXin Li } 261*ba677afaSXin Li} 262*ba677afaSXin Li 263*ba677afaSXin Lifunc TestParser2_1FileMovesToReviewAfterParsingReviewerTag(t *testing.T) { 264*ba677afaSXin Li parser := tvParser2_1{ 265*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 266*ba677afaSXin Li st: psFile2_1, 267*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 268*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"}, 269*ba677afaSXin Li } 270*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 271*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 272*ba677afaSXin Li 273*ba677afaSXin Li err := parser.parsePair2_1("Reviewer", "Person: John Doe") 274*ba677afaSXin Li if err != nil { 275*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 276*ba677afaSXin Li } 277*ba677afaSXin Li if parser.st != psReview2_1 { 278*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psReview2_1, parser.st) 279*ba677afaSXin Li } 280*ba677afaSXin Li} 281*ba677afaSXin Li 282*ba677afaSXin Lifunc TestParser2_1FileStaysAfterParsingRelationshipTags(t *testing.T) { 283*ba677afaSXin Li parser := tvParser2_1{ 284*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 285*ba677afaSXin Li st: psFile2_1, 286*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 287*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"}, 288*ba677afaSXin Li } 289*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 290*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 291*ba677afaSXin Li 292*ba677afaSXin Li err := parser.parsePair2_1("Relationship", "SPDXRef-blah CONTAINS SPDXRef-blah-else") 293*ba677afaSXin Li if err != nil { 294*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 295*ba677afaSXin Li } 296*ba677afaSXin Li // state should remain unchanged 297*ba677afaSXin Li if parser.st != psFile2_1 { 298*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psFile2_1, parser.st) 299*ba677afaSXin Li } 300*ba677afaSXin Li 301*ba677afaSXin Li err = parser.parsePair2_1("RelationshipComment", "blah") 302*ba677afaSXin Li if err != nil { 303*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 304*ba677afaSXin Li } 305*ba677afaSXin Li // state should still remain unchanged 306*ba677afaSXin Li if parser.st != psFile2_1 { 307*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psFile2_1, parser.st) 308*ba677afaSXin Li } 309*ba677afaSXin Li} 310*ba677afaSXin Li 311*ba677afaSXin Lifunc TestParser2_1FileStaysAfterParsingAnnotationTags(t *testing.T) { 312*ba677afaSXin Li parser := tvParser2_1{ 313*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 314*ba677afaSXin Li st: psFile2_1, 315*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 316*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"}, 317*ba677afaSXin Li } 318*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 319*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 320*ba677afaSXin Li 321*ba677afaSXin Li err := parser.parsePair2_1("Annotator", "Person: John Doe ()") 322*ba677afaSXin Li if err != nil { 323*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 324*ba677afaSXin Li } 325*ba677afaSXin Li if parser.st != psFile2_1 { 326*ba677afaSXin Li t.Errorf("parser is in state %v, expected %v", parser.st, psFile2_1) 327*ba677afaSXin Li } 328*ba677afaSXin Li 329*ba677afaSXin Li err = parser.parsePair2_1("AnnotationDate", "2018-09-15T00:36:00Z") 330*ba677afaSXin Li if err != nil { 331*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 332*ba677afaSXin Li } 333*ba677afaSXin Li if parser.st != psFile2_1 { 334*ba677afaSXin Li t.Errorf("parser is in state %v, expected %v", parser.st, psFile2_1) 335*ba677afaSXin Li } 336*ba677afaSXin Li 337*ba677afaSXin Li err = parser.parsePair2_1("AnnotationType", "REVIEW") 338*ba677afaSXin Li if err != nil { 339*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 340*ba677afaSXin Li } 341*ba677afaSXin Li if parser.st != psFile2_1 { 342*ba677afaSXin Li t.Errorf("parser is in state %v, expected %v", parser.st, psFile2_1) 343*ba677afaSXin Li } 344*ba677afaSXin Li 345*ba677afaSXin Li err = parser.parsePair2_1("SPDXREF", "SPDXRef-45") 346*ba677afaSXin Li if err != nil { 347*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 348*ba677afaSXin Li } 349*ba677afaSXin Li if parser.st != psFile2_1 { 350*ba677afaSXin Li t.Errorf("parser is in state %v, expected %v", parser.st, psFile2_1) 351*ba677afaSXin Li } 352*ba677afaSXin Li 353*ba677afaSXin Li err = parser.parsePair2_1("AnnotationComment", "i guess i had something to say about this particular file") 354*ba677afaSXin Li if err != nil { 355*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 356*ba677afaSXin Li } 357*ba677afaSXin Li if parser.st != psFile2_1 { 358*ba677afaSXin Li t.Errorf("parser is in state %v, expected %v", parser.st, psFile2_1) 359*ba677afaSXin Li } 360*ba677afaSXin Li} 361*ba677afaSXin Li 362*ba677afaSXin Li// ===== File data section tests ===== 363*ba677afaSXin Lifunc TestParser2_1CanParseFileTags(t *testing.T) { 364*ba677afaSXin Li parser := tvParser2_1{ 365*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 366*ba677afaSXin Li st: psFile2_1, 367*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 368*ba677afaSXin Li } 369*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 370*ba677afaSXin Li 371*ba677afaSXin Li // File Name 372*ba677afaSXin Li err := parser.parsePairFromFile2_1("FileName", "f1.txt") 373*ba677afaSXin Li if err != nil { 374*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 375*ba677afaSXin Li } 376*ba677afaSXin Li if parser.file.FileName != "f1.txt" { 377*ba677afaSXin Li t.Errorf("got %v for FileName", parser.file.FileName) 378*ba677afaSXin Li } 379*ba677afaSXin Li // should not yet be added to the Packages file list, because we haven't 380*ba677afaSXin Li // seen an SPDX identifier yet 381*ba677afaSXin Li if len(parser.pkg.Files) != 0 { 382*ba677afaSXin Li t.Errorf("expected 0 files, got %d", len(parser.pkg.Files)) 383*ba677afaSXin Li } 384*ba677afaSXin Li 385*ba677afaSXin Li // File SPDX Identifier 386*ba677afaSXin Li err = parser.parsePairFromFile2_1("SPDXID", "SPDXRef-f1") 387*ba677afaSXin Li if err != nil { 388*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 389*ba677afaSXin Li } 390*ba677afaSXin Li if parser.file.FileSPDXIdentifier != "f1" { 391*ba677afaSXin Li t.Errorf("got %v for FileSPDXIdentifier", parser.file.FileSPDXIdentifier) 392*ba677afaSXin Li } 393*ba677afaSXin Li // should now be added to the Packages file list 394*ba677afaSXin Li if len(parser.pkg.Files) != 1 { 395*ba677afaSXin Li t.Errorf("expected 1 file, got %d", len(parser.pkg.Files)) 396*ba677afaSXin Li } 397*ba677afaSXin Li if parser.pkg.Files[0] != parser.file { 398*ba677afaSXin Li t.Errorf("expected Files[f1] to be %v, got %v", parser.file, parser.pkg.Files[0]) 399*ba677afaSXin Li } 400*ba677afaSXin Li 401*ba677afaSXin Li // File Type 402*ba677afaSXin Li fileTypes := []string{ 403*ba677afaSXin Li "TEXT", 404*ba677afaSXin Li "DOCUMENTATION", 405*ba677afaSXin Li } 406*ba677afaSXin Li for _, ty := range fileTypes { 407*ba677afaSXin Li err = parser.parsePairFromFile2_1("FileType", ty) 408*ba677afaSXin Li if err != nil { 409*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 410*ba677afaSXin Li } 411*ba677afaSXin Li } 412*ba677afaSXin Li for _, typeWant := range fileTypes { 413*ba677afaSXin Li flagFound := false 414*ba677afaSXin Li for _, typeCheck := range parser.file.FileTypes { 415*ba677afaSXin Li if typeWant == typeCheck { 416*ba677afaSXin Li flagFound = true 417*ba677afaSXin Li } 418*ba677afaSXin Li } 419*ba677afaSXin Li if flagFound == false { 420*ba677afaSXin Li t.Errorf("didn't find %s in FileTypes", typeWant) 421*ba677afaSXin Li } 422*ba677afaSXin Li } 423*ba677afaSXin Li if len(fileTypes) != len(parser.file.FileTypes) { 424*ba677afaSXin Li t.Errorf("expected %d types in FileTypes, got %d", len(fileTypes), 425*ba677afaSXin Li len(parser.file.FileTypes)) 426*ba677afaSXin Li } 427*ba677afaSXin Li 428*ba677afaSXin Li // File Checksums 429*ba677afaSXin Li codeSha1 := "85ed0817af83a24ad8da68c2b5094de69833983c" 430*ba677afaSXin Li sumSha1 := "SHA1: 85ed0817af83a24ad8da68c2b5094de69833983c" 431*ba677afaSXin Li codeSha256 := "11b6d3ee554eedf79299905a98f9b9a04e498210b59f15094c916c91d150efcd" 432*ba677afaSXin Li sumSha256 := "SHA256: 11b6d3ee554eedf79299905a98f9b9a04e498210b59f15094c916c91d150efcd" 433*ba677afaSXin Li codeMd5 := "624c1abb3664f4b35547e7c73864ad24" 434*ba677afaSXin Li sumMd5 := "MD5: 624c1abb3664f4b35547e7c73864ad24" 435*ba677afaSXin Li err = parser.parsePairFromFile2_1("FileChecksum", sumSha1) 436*ba677afaSXin Li if err != nil { 437*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 438*ba677afaSXin Li } 439*ba677afaSXin Li err = parser.parsePairFromFile2_1("FileChecksum", sumSha256) 440*ba677afaSXin Li if err != nil { 441*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 442*ba677afaSXin Li } 443*ba677afaSXin Li err = parser.parsePairFromFile2_1("FileChecksum", sumMd5) 444*ba677afaSXin Li if err != nil { 445*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 446*ba677afaSXin Li } 447*ba677afaSXin Li for _, checksum := range parser.file.Checksums { 448*ba677afaSXin Li switch checksum.Algorithm { 449*ba677afaSXin Li case common.SHA1: 450*ba677afaSXin Li if checksum.Value != codeSha1 { 451*ba677afaSXin Li t.Errorf("expected %s for FileChecksumSHA1, got %s", codeSha1, checksum.Value) 452*ba677afaSXin Li } 453*ba677afaSXin Li case common.SHA256: 454*ba677afaSXin Li if checksum.Value != codeSha256 { 455*ba677afaSXin Li t.Errorf("expected %s for FileChecksumSHA1, got %s", codeSha256, checksum.Value) 456*ba677afaSXin Li } 457*ba677afaSXin Li case common.MD5: 458*ba677afaSXin Li if checksum.Value != codeMd5 { 459*ba677afaSXin Li t.Errorf("expected %s for FileChecksumSHA1, got %s", codeMd5, checksum.Value) 460*ba677afaSXin Li } 461*ba677afaSXin Li } 462*ba677afaSXin Li } 463*ba677afaSXin Li // Concluded License 464*ba677afaSXin Li err = parser.parsePairFromFile2_1("LicenseConcluded", "Apache-2.0 OR GPL-2.0-or-later") 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.file.LicenseConcluded != "Apache-2.0 OR GPL-2.0-or-later" { 469*ba677afaSXin Li t.Errorf("got %v for LicenseConcluded", parser.file.LicenseConcluded) 470*ba677afaSXin Li } 471*ba677afaSXin Li 472*ba677afaSXin Li // License Information in File 473*ba677afaSXin Li lics := []string{ 474*ba677afaSXin Li "Apache-2.0", 475*ba677afaSXin Li "GPL-2.0-or-later", 476*ba677afaSXin Li "CC0-1.0", 477*ba677afaSXin Li } 478*ba677afaSXin Li for _, lic := range lics { 479*ba677afaSXin Li err = parser.parsePairFromFile2_1("LicenseInfoInFile", lic) 480*ba677afaSXin Li if err != nil { 481*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 482*ba677afaSXin Li } 483*ba677afaSXin Li } 484*ba677afaSXin Li for _, licWant := range lics { 485*ba677afaSXin Li flagFound := false 486*ba677afaSXin Li for _, licCheck := range parser.file.LicenseInfoInFiles { 487*ba677afaSXin Li if licWant == licCheck { 488*ba677afaSXin Li flagFound = true 489*ba677afaSXin Li } 490*ba677afaSXin Li } 491*ba677afaSXin Li if flagFound == false { 492*ba677afaSXin Li t.Errorf("didn't find %s in LicenseInfoInFiles", licWant) 493*ba677afaSXin Li } 494*ba677afaSXin Li } 495*ba677afaSXin Li if len(lics) != len(parser.file.LicenseInfoInFiles) { 496*ba677afaSXin Li t.Errorf("expected %d licenses in LicenseInfoInFiles, got %d", len(lics), 497*ba677afaSXin Li len(parser.file.LicenseInfoInFiles)) 498*ba677afaSXin Li } 499*ba677afaSXin Li 500*ba677afaSXin Li // Comments on License 501*ba677afaSXin Li err = parser.parsePairFromFile2_1("LicenseComments", "this is a comment") 502*ba677afaSXin Li if err != nil { 503*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 504*ba677afaSXin Li } 505*ba677afaSXin Li if parser.file.LicenseComments != "this is a comment" { 506*ba677afaSXin Li t.Errorf("got %v for LicenseComments", parser.file.LicenseComments) 507*ba677afaSXin Li } 508*ba677afaSXin Li 509*ba677afaSXin Li // Copyright Text 510*ba677afaSXin Li err = parser.parsePairFromFile2_1("FileCopyrightText", "copyright (c) me") 511*ba677afaSXin Li if err != nil { 512*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 513*ba677afaSXin Li } 514*ba677afaSXin Li if parser.file.FileCopyrightText != "copyright (c) me" { 515*ba677afaSXin Li t.Errorf("got %v for FileCopyrightText", parser.file.FileCopyrightText) 516*ba677afaSXin Li } 517*ba677afaSXin Li 518*ba677afaSXin Li // Artifact of Projects: Name, HomePage and URI 519*ba677afaSXin Li // Artifact set 1 520*ba677afaSXin Li err = parser.parsePairFromFile2_1("ArtifactOfProjectName", "project1") 521*ba677afaSXin Li if err != nil { 522*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 523*ba677afaSXin Li } 524*ba677afaSXin Li err = parser.parsePairFromFile2_1("ArtifactOfProjectHomePage", "http://example.com/1/") 525*ba677afaSXin Li if err != nil { 526*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 527*ba677afaSXin Li } 528*ba677afaSXin Li err = parser.parsePairFromFile2_1("ArtifactOfProjectURI", "http://example.com/1/uri.whatever") 529*ba677afaSXin Li if err != nil { 530*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 531*ba677afaSXin Li } 532*ba677afaSXin Li // Artifact set 2 -- just name 533*ba677afaSXin Li err = parser.parsePairFromFile2_1("ArtifactOfProjectName", "project2") 534*ba677afaSXin Li if err != nil { 535*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 536*ba677afaSXin Li } 537*ba677afaSXin Li // Artifact set 3 -- just name and home page 538*ba677afaSXin Li err = parser.parsePairFromFile2_1("ArtifactOfProjectName", "project3") 539*ba677afaSXin Li if err != nil { 540*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 541*ba677afaSXin Li } 542*ba677afaSXin Li err = parser.parsePairFromFile2_1("ArtifactOfProjectHomePage", "http://example.com/3/") 543*ba677afaSXin Li if err != nil { 544*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 545*ba677afaSXin Li } 546*ba677afaSXin Li // Artifact set 4 -- just name and URI 547*ba677afaSXin Li err = parser.parsePairFromFile2_1("ArtifactOfProjectName", "project4") 548*ba677afaSXin Li if err != nil { 549*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 550*ba677afaSXin Li } 551*ba677afaSXin Li err = parser.parsePairFromFile2_1("ArtifactOfProjectURI", "http://example.com/4/uri.whatever") 552*ba677afaSXin Li if err != nil { 553*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 554*ba677afaSXin Li } 555*ba677afaSXin Li 556*ba677afaSXin Li if len(parser.file.ArtifactOfProjects) != 4 { 557*ba677afaSXin Li t.Fatalf("expected len %d, got %d", 4, len(parser.file.ArtifactOfProjects)) 558*ba677afaSXin Li } 559*ba677afaSXin Li 560*ba677afaSXin Li aop := parser.file.ArtifactOfProjects[0] 561*ba677afaSXin Li if aop.Name != "project1" { 562*ba677afaSXin Li t.Errorf("expected %v, got %v", "project1", aop.Name) 563*ba677afaSXin Li } 564*ba677afaSXin Li if aop.HomePage != "http://example.com/1/" { 565*ba677afaSXin Li t.Errorf("expected %v, got %v", "http://example.com/1/", aop.HomePage) 566*ba677afaSXin Li } 567*ba677afaSXin Li if aop.URI != "http://example.com/1/uri.whatever" { 568*ba677afaSXin Li t.Errorf("expected %v, got %v", "http://example.com/1/uri.whatever", aop.URI) 569*ba677afaSXin Li } 570*ba677afaSXin Li 571*ba677afaSXin Li aop = parser.file.ArtifactOfProjects[1] 572*ba677afaSXin Li if aop.Name != "project2" { 573*ba677afaSXin Li t.Errorf("expected %v, got %v", "project2", aop.Name) 574*ba677afaSXin Li } 575*ba677afaSXin Li if aop.HomePage != "" { 576*ba677afaSXin Li t.Errorf("expected %v, got %v", "", aop.HomePage) 577*ba677afaSXin Li } 578*ba677afaSXin Li if aop.URI != "" { 579*ba677afaSXin Li t.Errorf("expected %v, got %v", "", aop.URI) 580*ba677afaSXin Li } 581*ba677afaSXin Li 582*ba677afaSXin Li aop = parser.file.ArtifactOfProjects[2] 583*ba677afaSXin Li if aop.Name != "project3" { 584*ba677afaSXin Li t.Errorf("expected %v, got %v", "project3", aop.Name) 585*ba677afaSXin Li } 586*ba677afaSXin Li if aop.HomePage != "http://example.com/3/" { 587*ba677afaSXin Li t.Errorf("expected %v, got %v", "http://example.com/3/", aop.HomePage) 588*ba677afaSXin Li } 589*ba677afaSXin Li if aop.URI != "" { 590*ba677afaSXin Li t.Errorf("expected %v, got %v", "", aop.URI) 591*ba677afaSXin Li } 592*ba677afaSXin Li 593*ba677afaSXin Li aop = parser.file.ArtifactOfProjects[3] 594*ba677afaSXin Li if aop.Name != "project4" { 595*ba677afaSXin Li t.Errorf("expected %v, got %v", "project4", aop.Name) 596*ba677afaSXin Li } 597*ba677afaSXin Li if aop.HomePage != "" { 598*ba677afaSXin Li t.Errorf("expected %v, got %v", "", aop.HomePage) 599*ba677afaSXin Li } 600*ba677afaSXin Li if aop.URI != "http://example.com/4/uri.whatever" { 601*ba677afaSXin Li t.Errorf("expected %v, got %v", "http://example.com/4/uri.whatever", aop.URI) 602*ba677afaSXin Li } 603*ba677afaSXin Li 604*ba677afaSXin Li // File Comment 605*ba677afaSXin Li err = parser.parsePairFromFile2_1("FileComment", "this is a comment") 606*ba677afaSXin Li if err != nil { 607*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 608*ba677afaSXin Li } 609*ba677afaSXin Li if parser.file.FileComment != "this is a comment" { 610*ba677afaSXin Li t.Errorf("got %v for FileComment", parser.file.FileComment) 611*ba677afaSXin Li } 612*ba677afaSXin Li 613*ba677afaSXin Li // File Notice 614*ba677afaSXin Li err = parser.parsePairFromFile2_1("FileNotice", "this is a Notice") 615*ba677afaSXin Li if err != nil { 616*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 617*ba677afaSXin Li } 618*ba677afaSXin Li if parser.file.FileNotice != "this is a Notice" { 619*ba677afaSXin Li t.Errorf("got %v for FileNotice", parser.file.FileNotice) 620*ba677afaSXin Li } 621*ba677afaSXin Li 622*ba677afaSXin Li // File Contributor 623*ba677afaSXin Li contribs := []string{ 624*ba677afaSXin Li "John Doe [email protected]", 625*ba677afaSXin Li "EvilCorp", 626*ba677afaSXin Li } 627*ba677afaSXin Li for _, contrib := range contribs { 628*ba677afaSXin Li err = parser.parsePairFromFile2_1("FileContributor", contrib) 629*ba677afaSXin Li if err != nil { 630*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 631*ba677afaSXin Li } 632*ba677afaSXin Li } 633*ba677afaSXin Li for _, contribWant := range contribs { 634*ba677afaSXin Li flagFound := false 635*ba677afaSXin Li for _, contribCheck := range parser.file.FileContributors { 636*ba677afaSXin Li if contribWant == contribCheck { 637*ba677afaSXin Li flagFound = true 638*ba677afaSXin Li } 639*ba677afaSXin Li } 640*ba677afaSXin Li if flagFound == false { 641*ba677afaSXin Li t.Errorf("didn't find %s in FileContributors", contribWant) 642*ba677afaSXin Li } 643*ba677afaSXin Li } 644*ba677afaSXin Li if len(contribs) != len(parser.file.FileContributors) { 645*ba677afaSXin Li t.Errorf("expected %d contribenses in FileContributors, got %d", len(contribs), 646*ba677afaSXin Li len(parser.file.FileContributors)) 647*ba677afaSXin Li } 648*ba677afaSXin Li 649*ba677afaSXin Li // File Dependencies 650*ba677afaSXin Li deps := []string{ 651*ba677afaSXin Li "f-1.txt", 652*ba677afaSXin Li "g.txt", 653*ba677afaSXin Li } 654*ba677afaSXin Li for _, dep := range deps { 655*ba677afaSXin Li err = parser.parsePairFromFile2_1("FileDependency", dep) 656*ba677afaSXin Li if err != nil { 657*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 658*ba677afaSXin Li } 659*ba677afaSXin Li } 660*ba677afaSXin Li for _, depWant := range deps { 661*ba677afaSXin Li flagFound := false 662*ba677afaSXin Li for _, depCheck := range parser.file.FileDependencies { 663*ba677afaSXin Li if depWant == depCheck { 664*ba677afaSXin Li flagFound = true 665*ba677afaSXin Li } 666*ba677afaSXin Li } 667*ba677afaSXin Li if flagFound == false { 668*ba677afaSXin Li t.Errorf("didn't find %s in FileDependency", depWant) 669*ba677afaSXin Li } 670*ba677afaSXin Li } 671*ba677afaSXin Li if len(deps) != len(parser.file.FileDependencies) { 672*ba677afaSXin Li t.Errorf("expected %d depenses in FileDependency, got %d", len(deps), 673*ba677afaSXin Li len(parser.file.FileDependencies)) 674*ba677afaSXin Li } 675*ba677afaSXin Li 676*ba677afaSXin Li} 677*ba677afaSXin Li 678*ba677afaSXin Lifunc TestParser2_1FileCreatesRelationshipInDocument(t *testing.T) { 679*ba677afaSXin Li parser := tvParser2_1{ 680*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 681*ba677afaSXin Li st: psFile2_1, 682*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 683*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"}, 684*ba677afaSXin Li } 685*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 686*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 687*ba677afaSXin Li 688*ba677afaSXin Li err := parser.parsePair2_1("Relationship", "SPDXRef-blah CONTAINS SPDXRef-blah-whatever") 689*ba677afaSXin Li if err != nil { 690*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 691*ba677afaSXin Li } 692*ba677afaSXin Li if parser.rln == nil { 693*ba677afaSXin Li t.Fatalf("parser didn't create and point to Relationship struct") 694*ba677afaSXin Li } 695*ba677afaSXin Li if parser.rln != parser.doc.Relationships[0] { 696*ba677afaSXin Li t.Errorf("pointer to new Relationship doesn't match idx 0 for doc.Relationships[]") 697*ba677afaSXin Li } 698*ba677afaSXin Li} 699*ba677afaSXin Li 700*ba677afaSXin Lifunc TestParser2_1FileCreatesAnnotationInDocument(t *testing.T) { 701*ba677afaSXin Li parser := tvParser2_1{ 702*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 703*ba677afaSXin Li st: psFile2_1, 704*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 705*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"}, 706*ba677afaSXin Li } 707*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 708*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 709*ba677afaSXin Li 710*ba677afaSXin Li err := parser.parsePair2_1("Annotator", "Person: John Doe ()") 711*ba677afaSXin Li if err != nil { 712*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 713*ba677afaSXin Li } 714*ba677afaSXin Li if parser.ann == nil { 715*ba677afaSXin Li t.Fatalf("parser didn't create and point to Annotation struct") 716*ba677afaSXin Li } 717*ba677afaSXin Li if parser.ann != parser.doc.Annotations[0] { 718*ba677afaSXin Li t.Errorf("pointer to new Annotation doesn't match idx 0 for doc.Annotations[]") 719*ba677afaSXin Li } 720*ba677afaSXin Li} 721*ba677afaSXin Li 722*ba677afaSXin Lifunc TestParser2_1FileUnknownTagFails(t *testing.T) { 723*ba677afaSXin Li parser := tvParser2_1{ 724*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 725*ba677afaSXin Li st: psFile2_1, 726*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 727*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"}, 728*ba677afaSXin Li } 729*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 730*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 731*ba677afaSXin Li 732*ba677afaSXin Li err := parser.parsePairFromFile2_1("blah", "something") 733*ba677afaSXin Li if err == nil { 734*ba677afaSXin Li t.Errorf("expected error from parsing unknown tag") 735*ba677afaSXin Li } 736*ba677afaSXin Li} 737*ba677afaSXin Li 738*ba677afaSXin Lifunc TestFileAOPPointerChangesAfterTags(t *testing.T) { 739*ba677afaSXin Li parser := tvParser2_1{ 740*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 741*ba677afaSXin Li st: psFile2_1, 742*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 743*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1"}, 744*ba677afaSXin Li } 745*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 746*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 747*ba677afaSXin Li 748*ba677afaSXin Li err := parser.parsePairFromFile2_1("ArtifactOfProjectName", "project1") 749*ba677afaSXin Li if err != nil { 750*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 751*ba677afaSXin Li } 752*ba677afaSXin Li if parser.fileAOP == nil { 753*ba677afaSXin Li t.Errorf("expected non-nil AOP pointer, got nil") 754*ba677afaSXin Li } 755*ba677afaSXin Li curPtr := parser.fileAOP 756*ba677afaSXin Li 757*ba677afaSXin Li // now, a home page; pointer should stay 758*ba677afaSXin Li err = parser.parsePairFromFile2_1("ArtifactOfProjectHomePage", "http://example.com/1/") 759*ba677afaSXin Li if err != nil { 760*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 761*ba677afaSXin Li } 762*ba677afaSXin Li if parser.fileAOP != curPtr { 763*ba677afaSXin Li t.Errorf("expected no change in AOP pointer, was %v, got %v", curPtr, parser.fileAOP) 764*ba677afaSXin Li } 765*ba677afaSXin Li 766*ba677afaSXin Li // a URI; pointer should stay 767*ba677afaSXin Li err = parser.parsePairFromFile2_1("ArtifactOfProjectURI", "http://example.com/1/uri.whatever") 768*ba677afaSXin Li if err != nil { 769*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 770*ba677afaSXin Li } 771*ba677afaSXin Li if parser.fileAOP != curPtr { 772*ba677afaSXin Li t.Errorf("expected no change in AOP pointer, was %v, got %v", curPtr, parser.fileAOP) 773*ba677afaSXin Li } 774*ba677afaSXin Li 775*ba677afaSXin Li // now, another artifact name; pointer should change but be non-nil 776*ba677afaSXin Li // now, a home page; pointer should stay 777*ba677afaSXin Li err = parser.parsePairFromFile2_1("ArtifactOfProjectName", "project2") 778*ba677afaSXin Li if err != nil { 779*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 780*ba677afaSXin Li } 781*ba677afaSXin Li if parser.fileAOP == curPtr { 782*ba677afaSXin Li t.Errorf("expected change in AOP pointer, got no change") 783*ba677afaSXin Li } 784*ba677afaSXin Li 785*ba677afaSXin Li // finally, an unrelated tag; pointer should go away 786*ba677afaSXin Li err = parser.parsePairFromFile2_1("FileComment", "whatever") 787*ba677afaSXin Li if err != nil { 788*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 789*ba677afaSXin Li } 790*ba677afaSXin Li if parser.fileAOP != nil { 791*ba677afaSXin Li t.Errorf("expected nil AOP pointer, got %v", parser.fileAOP) 792*ba677afaSXin Li } 793*ba677afaSXin Li} 794*ba677afaSXin Li 795*ba677afaSXin Lifunc TestParser2_1FailsIfInvalidSPDXIDInFileSection(t *testing.T) { 796*ba677afaSXin Li parser := tvParser2_1{ 797*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 798*ba677afaSXin Li st: psFile2_1, 799*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 800*ba677afaSXin Li } 801*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 802*ba677afaSXin Li 803*ba677afaSXin Li // start with File Name 804*ba677afaSXin Li err := parser.parsePairFromFile2_1("FileName", "f1.txt") 805*ba677afaSXin Li if err != nil { 806*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 807*ba677afaSXin Li } 808*ba677afaSXin Li // invalid SPDX Identifier 809*ba677afaSXin Li err = parser.parsePairFromFile2_1("SPDXID", "whoops") 810*ba677afaSXin Li if err == nil { 811*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 812*ba677afaSXin Li } 813*ba677afaSXin Li} 814*ba677afaSXin Li 815*ba677afaSXin Lifunc TestParser2_1FailsIfInvalidChecksumFormatInFileSection(t *testing.T) { 816*ba677afaSXin Li parser := tvParser2_1{ 817*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 818*ba677afaSXin Li st: psFile2_1, 819*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 820*ba677afaSXin Li } 821*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 822*ba677afaSXin Li 823*ba677afaSXin Li // start with File Name 824*ba677afaSXin Li err := parser.parsePairFromFile2_1("FileName", "f1.txt") 825*ba677afaSXin Li if err != nil { 826*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 827*ba677afaSXin Li } 828*ba677afaSXin Li // invalid format for checksum line, missing colon 829*ba677afaSXin Li err = parser.parsePairFromFile2_1("FileChecksum", "SHA1 85ed0817af83a24ad8da68c2b5094de69833983c") 830*ba677afaSXin Li if err == nil { 831*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 832*ba677afaSXin Li } 833*ba677afaSXin Li} 834*ba677afaSXin Li 835*ba677afaSXin Lifunc TestParser2_1FailsIfUnknownChecksumTypeInFileSection(t *testing.T) { 836*ba677afaSXin Li parser := tvParser2_1{ 837*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 838*ba677afaSXin Li st: psFile2_1, 839*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 840*ba677afaSXin Li } 841*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 842*ba677afaSXin Li 843*ba677afaSXin Li // start with File Name 844*ba677afaSXin Li err := parser.parsePairFromFile2_1("FileName", "f1.txt") 845*ba677afaSXin Li if err != nil { 846*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 847*ba677afaSXin Li } 848*ba677afaSXin Li // unknown checksum type 849*ba677afaSXin Li err = parser.parsePairFromFile2_1("FileChecksum", "Special: 85ed0817af83a24ad8da68c2b5094de69833983c") 850*ba677afaSXin Li if err == nil { 851*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 852*ba677afaSXin Li } 853*ba677afaSXin Li} 854*ba677afaSXin Li 855*ba677afaSXin Lifunc TestParser2_1FailsIfArtifactHomePageBeforeArtifactName(t *testing.T) { 856*ba677afaSXin Li parser := tvParser2_1{ 857*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 858*ba677afaSXin Li st: psFile2_1, 859*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 860*ba677afaSXin Li } 861*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 862*ba677afaSXin Li 863*ba677afaSXin Li // start with File Name 864*ba677afaSXin Li err := parser.parsePairFromFile2_1("FileName", "f1.txt") 865*ba677afaSXin Li if err != nil { 866*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 867*ba677afaSXin Li } 868*ba677afaSXin Li // artifact home page appears before artifact name 869*ba677afaSXin Li err = parser.parsePairFromFile2_1("ArtifactOfProjectHomePage", "https://example.com") 870*ba677afaSXin Li if err == nil { 871*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 872*ba677afaSXin Li } 873*ba677afaSXin Li} 874*ba677afaSXin Li 875*ba677afaSXin Lifunc TestParser2_1FailsIfArtifactURIBeforeArtifactName(t *testing.T) { 876*ba677afaSXin Li parser := tvParser2_1{ 877*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 878*ba677afaSXin Li st: psFile2_1, 879*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 880*ba677afaSXin Li } 881*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 882*ba677afaSXin Li 883*ba677afaSXin Li // start with File Name 884*ba677afaSXin Li err := parser.parsePairFromFile2_1("FileName", "f1.txt") 885*ba677afaSXin Li if err != nil { 886*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 887*ba677afaSXin Li } 888*ba677afaSXin Li // artifact home page appears before artifact name 889*ba677afaSXin Li err = parser.parsePairFromFile2_1("ArtifactOfProjectURI", "https://example.com") 890*ba677afaSXin Li if err == nil { 891*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 892*ba677afaSXin Li } 893*ba677afaSXin Li} 894*ba677afaSXin Li 895*ba677afaSXin Lifunc TestParser2_1FilesWithoutSpdxIdThrowError(t *testing.T) { 896*ba677afaSXin Li // case 1: The previous file (packaged or unpackaged) does not contain spdxID 897*ba677afaSXin Li parser1 := tvParser2_1{ 898*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 899*ba677afaSXin Li st: psFile2_1, 900*ba677afaSXin Li file: &v2_1.File{FileName: "FileName"}, 901*ba677afaSXin Li } 902*ba677afaSXin Li 903*ba677afaSXin Li err := parser1.parsePair2_1("FileName", "f2") 904*ba677afaSXin Li if err == nil { 905*ba677afaSXin Li t.Errorf("file without SPDX Identifier getting accepted") 906*ba677afaSXin Li } 907*ba677afaSXin Li 908*ba677afaSXin Li // case 2: Invalid file with snippet 909*ba677afaSXin Li // Last unpackaged file before a snippet starts 910*ba677afaSXin Li sid1 := common.ElementID("s1") 911*ba677afaSXin Li fileName := "f2.txt" 912*ba677afaSXin Li parser2 := tvParser2_1{ 913*ba677afaSXin Li doc: &v2_1.Document{}, 914*ba677afaSXin Li st: psCreationInfo2_1, 915*ba677afaSXin Li file: &v2_1.File{FileName: fileName}, 916*ba677afaSXin Li } 917*ba677afaSXin Li err = parser2.parsePair2_1("SnippetSPDXID", string(sid1)) 918*ba677afaSXin Li if err == nil { 919*ba677afaSXin Li t.Errorf("file without SPDX Identifier getting accepted") 920*ba677afaSXin Li } 921*ba677afaSXin Li 922*ba677afaSXin Li // case 3 : Invalid File without snippets 923*ba677afaSXin Li // Last unpackaged file before a package starts 924*ba677afaSXin Li // Last file of a package and New package starts 925*ba677afaSXin Li parser3 := tvParser2_1{ 926*ba677afaSXin Li doc: &v2_1.Document{}, 927*ba677afaSXin Li st: psCreationInfo2_1, 928*ba677afaSXin Li } 929*ba677afaSXin Li fileName = "f3.txt" 930*ba677afaSXin Li err = parser3.parsePair2_1("FileName", fileName) 931*ba677afaSXin Li if err != nil { 932*ba677afaSXin Li t.Errorf("%s", err) 933*ba677afaSXin Li } 934*ba677afaSXin Li err = parser3.parsePair2_1("PackageName", "p2") 935*ba677afaSXin Li if err == nil { 936*ba677afaSXin Li t.Errorf("files withoutSpdx Identifier getting accepted") 937*ba677afaSXin Li } 938*ba677afaSXin Li} 939