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