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 snippet section state change tests ===== 12*ba677afaSXin Lifunc TestParser2_1SnippetStartsNewSnippetAfterParsingSnippetSPDXIDTag(t *testing.T) { 13*ba677afaSXin Li // create the first snippet 14*ba677afaSXin Li sid1 := common.ElementID("s1") 15*ba677afaSXin Li parser := tvParser2_1{ 16*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 17*ba677afaSXin Li st: psSnippet2_1, 18*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "test", PackageSPDXIdentifier: "test", Files: []*v2_1.File{}}, 19*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}}, 20*ba677afaSXin Li snippet: &v2_1.Snippet{SnippetSPDXIdentifier: sid1}, 21*ba677afaSXin Li } 22*ba677afaSXin Li s1 := parser.snippet 23*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 24*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 25*ba677afaSXin Li parser.file.Snippets[sid1] = parser.snippet 26*ba677afaSXin Li 27*ba677afaSXin Li // the File's Snippets should have this one only 28*ba677afaSXin Li if len(parser.file.Snippets) != 1 { 29*ba677afaSXin Li t.Errorf("Expected len(Snippets) to be 1, got %d", len(parser.file.Snippets)) 30*ba677afaSXin Li } 31*ba677afaSXin Li if parser.file.Snippets["s1"] != s1 { 32*ba677afaSXin Li t.Errorf("Expected snippet %v in Snippets[s1], got %v", s1, parser.file.Snippets["s1"]) 33*ba677afaSXin Li } 34*ba677afaSXin Li if parser.file.Snippets["s1"].SnippetSPDXIdentifier != sid1 { 35*ba677afaSXin Li t.Errorf("expected snippet ID %s in Snippets[s1], got %s", sid1, parser.file.Snippets["s1"].SnippetSPDXIdentifier) 36*ba677afaSXin Li } 37*ba677afaSXin Li 38*ba677afaSXin Li // now add a new snippet 39*ba677afaSXin Li err := parser.parsePair2_1("SnippetSPDXID", "SPDXRef-s2") 40*ba677afaSXin Li if err != nil { 41*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 42*ba677afaSXin Li } 43*ba677afaSXin Li // state should be correct 44*ba677afaSXin Li if parser.st != psSnippet2_1 { 45*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psSnippet2_1, parser.st) 46*ba677afaSXin Li } 47*ba677afaSXin Li // and a snippet should be created 48*ba677afaSXin Li if parser.snippet == nil { 49*ba677afaSXin Li t.Fatalf("parser didn't create new snippet") 50*ba677afaSXin Li } 51*ba677afaSXin Li // and the snippet ID should be as expected 52*ba677afaSXin Li if parser.snippet.SnippetSPDXIdentifier != "s2" { 53*ba677afaSXin Li t.Errorf("expected snippet ID %s, got %s", "s2", parser.snippet.SnippetSPDXIdentifier) 54*ba677afaSXin Li } 55*ba677afaSXin Li // and the File's Snippets should be of size 2 and have these two 56*ba677afaSXin Li if len(parser.file.Snippets) != 2 { 57*ba677afaSXin Li t.Errorf("Expected len(Snippets) to be 2, got %d", len(parser.file.Snippets)) 58*ba677afaSXin Li } 59*ba677afaSXin Li if parser.file.Snippets["s1"] != s1 { 60*ba677afaSXin Li t.Errorf("Expected snippet %v in Snippets[s1], got %v", s1, parser.file.Snippets["s1"]) 61*ba677afaSXin Li } 62*ba677afaSXin Li if parser.file.Snippets["s1"].SnippetSPDXIdentifier != sid1 { 63*ba677afaSXin Li t.Errorf("expected snippet ID %s in Snippets[s1], got %s", sid1, parser.file.Snippets["s1"].SnippetSPDXIdentifier) 64*ba677afaSXin Li } 65*ba677afaSXin Li if parser.file.Snippets["s2"] != parser.snippet { 66*ba677afaSXin Li t.Errorf("Expected snippet %v in Snippets[s2], got %v", parser.snippet, parser.file.Snippets["s2"]) 67*ba677afaSXin Li } 68*ba677afaSXin Li if parser.file.Snippets["s2"].SnippetSPDXIdentifier != "s2" { 69*ba677afaSXin Li t.Errorf("expected snippet ID %s in Snippets[s2], got %s", "s2", parser.file.Snippets["s2"].SnippetSPDXIdentifier) 70*ba677afaSXin Li } 71*ba677afaSXin Li} 72*ba677afaSXin Li 73*ba677afaSXin Lifunc TestParser2_1SnippetStartsNewPackageAfterParsingPackageNameTag(t *testing.T) { 74*ba677afaSXin Li parser := tvParser2_1{ 75*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 76*ba677afaSXin Li st: psSnippet2_1, 77*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}}, 78*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}}, 79*ba677afaSXin Li snippet: &v2_1.Snippet{SnippetSPDXIdentifier: "s1"}, 80*ba677afaSXin Li } 81*ba677afaSXin Li p1 := parser.pkg 82*ba677afaSXin Li f1 := parser.file 83*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 84*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 85*ba677afaSXin Li parser.file.Snippets["s1"] = parser.snippet 86*ba677afaSXin Li 87*ba677afaSXin Li // now add a new package 88*ba677afaSXin Li p2Name := "package2" 89*ba677afaSXin Li err := parser.parsePair2_1("PackageName", p2Name) 90*ba677afaSXin Li if err != nil { 91*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 92*ba677afaSXin Li } 93*ba677afaSXin Li // state should go back to Package 94*ba677afaSXin Li if parser.st != psPackage2_1 { 95*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psPackage2_1, parser.st) 96*ba677afaSXin Li } 97*ba677afaSXin Li // and a package should be created 98*ba677afaSXin Li if parser.pkg == nil { 99*ba677afaSXin Li t.Fatalf("parser didn't create new pkg") 100*ba677afaSXin Li } 101*ba677afaSXin Li // and the package name should be as expected 102*ba677afaSXin Li if parser.pkg.PackageName != p2Name { 103*ba677afaSXin Li t.Errorf("expected package name %s, got %s", p2Name, parser.pkg.PackageName) 104*ba677afaSXin Li } 105*ba677afaSXin Li // and the package should default to true for FilesAnalyzed 106*ba677afaSXin Li if parser.pkg.FilesAnalyzed != true { 107*ba677afaSXin Li t.Errorf("expected FilesAnalyzed to default to true, got false") 108*ba677afaSXin Li } 109*ba677afaSXin Li if parser.pkg.IsFilesAnalyzedTagPresent != false { 110*ba677afaSXin Li t.Errorf("expected IsFilesAnalyzedTagPresent to default to false, got true") 111*ba677afaSXin Li } 112*ba677afaSXin Li // and the Document's Packages should still be of size 1 b/c no SPDX 113*ba677afaSXin Li // identifier has been seen yet 114*ba677afaSXin Li if len(parser.doc.Packages) != 1 { 115*ba677afaSXin Li t.Errorf("Expected len(Packages) to be 1, got %d", len(parser.doc.Packages)) 116*ba677afaSXin Li } 117*ba677afaSXin Li if parser.doc.Packages[0] != p1 { 118*ba677afaSXin Li t.Errorf("Expected package %v in Packages[package1], got %v", p1, parser.doc.Packages[0]) 119*ba677afaSXin Li } 120*ba677afaSXin Li if parser.doc.Packages[0].PackageName != "package1" { 121*ba677afaSXin Li t.Errorf("expected package name %s in Packages[package1], got %s", "package1", parser.doc.Packages[0].PackageName) 122*ba677afaSXin Li } 123*ba677afaSXin Li // and the first Package's Files should be of size 1 and have f1 only 124*ba677afaSXin Li if len(parser.doc.Packages[0].Files) != 1 { 125*ba677afaSXin Li t.Errorf("Expected 1 file in Packages[package1].Files, got %d", len(parser.doc.Packages[0].Files)) 126*ba677afaSXin Li } 127*ba677afaSXin Li if parser.doc.Packages[0].Files[0] != f1 { 128*ba677afaSXin Li t.Errorf("Expected file %v in Files[f1], got %v", f1, parser.doc.Packages[0].Files[0]) 129*ba677afaSXin Li } 130*ba677afaSXin Li if parser.doc.Packages[0].Files[0].FileName != "f1.txt" { 131*ba677afaSXin Li t.Errorf("expected file name %s in Files[f1], got %s", "f1.txt", parser.doc.Packages[0].Files[0].FileName) 132*ba677afaSXin Li } 133*ba677afaSXin Li // and the new Package should have no files 134*ba677afaSXin Li if len(parser.pkg.Files) != 0 { 135*ba677afaSXin Li t.Errorf("Expected no files in Packages[1].Files, got %d", len(parser.pkg.Files)) 136*ba677afaSXin Li } 137*ba677afaSXin Li // and the current file should be nil 138*ba677afaSXin Li if parser.file != nil { 139*ba677afaSXin Li t.Errorf("Expected nil for parser.file, got %v", parser.file) 140*ba677afaSXin Li } 141*ba677afaSXin Li // and the current snippet should be nil 142*ba677afaSXin Li if parser.snippet != nil { 143*ba677afaSXin Li t.Errorf("Expected nil for parser.snippet, got %v", parser.snippet) 144*ba677afaSXin Li } 145*ba677afaSXin Li} 146*ba677afaSXin Li 147*ba677afaSXin Lifunc TestParser2_1SnippetMovesToFileAfterParsingFileNameTag(t *testing.T) { 148*ba677afaSXin Li f1Name := "f1.txt" 149*ba677afaSXin Li parser := tvParser2_1{ 150*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 151*ba677afaSXin Li st: psSnippet2_1, 152*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}}, 153*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}}, 154*ba677afaSXin Li snippet: &v2_1.Snippet{SnippetSPDXIdentifier: "s1"}, 155*ba677afaSXin Li } 156*ba677afaSXin Li p1 := parser.pkg 157*ba677afaSXin Li f1 := parser.file 158*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 159*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 160*ba677afaSXin Li parser.file.Snippets["s1"] = parser.snippet 161*ba677afaSXin Li 162*ba677afaSXin Li f2Name := "f2.txt" 163*ba677afaSXin Li err := parser.parsePair2_1("FileName", f2Name) 164*ba677afaSXin Li if err != nil { 165*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 166*ba677afaSXin Li } 167*ba677afaSXin Li // state should be correct 168*ba677afaSXin Li if parser.st != psFile2_1 { 169*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psSnippet2_1, parser.st) 170*ba677afaSXin Li } 171*ba677afaSXin Li // and current package should remain what it was 172*ba677afaSXin Li if parser.pkg != p1 { 173*ba677afaSXin Li t.Fatalf("expected package to remain %v, got %v", p1, parser.pkg) 174*ba677afaSXin Li } 175*ba677afaSXin Li // and a file should be created 176*ba677afaSXin Li if parser.file == nil { 177*ba677afaSXin Li t.Fatalf("parser didn't create new file") 178*ba677afaSXin Li } 179*ba677afaSXin Li // and the file name should be as expected 180*ba677afaSXin Li if parser.file.FileName != f2Name { 181*ba677afaSXin Li t.Errorf("expected file name %s, got %s", f2Name, parser.file.FileName) 182*ba677afaSXin Li } 183*ba677afaSXin Li // and the Package's Files should still be of size 1 since we haven't seen 184*ba677afaSXin Li // an SPDX identifier yet for this new file 185*ba677afaSXin Li if len(parser.pkg.Files) != 1 { 186*ba677afaSXin Li t.Errorf("Expected len(Files) to be 1, got %d", len(parser.pkg.Files)) 187*ba677afaSXin Li } 188*ba677afaSXin Li if parser.pkg.Files[0] != f1 { 189*ba677afaSXin Li t.Errorf("Expected file %v in Files[f1], got %v", f1, parser.pkg.Files[0]) 190*ba677afaSXin Li } 191*ba677afaSXin Li if parser.pkg.Files[0].FileName != f1Name { 192*ba677afaSXin Li t.Errorf("expected file name %s in Files[f1], got %s", f1Name, parser.pkg.Files[0].FileName) 193*ba677afaSXin Li } 194*ba677afaSXin Li // and the current snippet should be nil 195*ba677afaSXin Li if parser.snippet != nil { 196*ba677afaSXin Li t.Errorf("Expected nil for parser.snippet, got %v", parser.snippet) 197*ba677afaSXin Li } 198*ba677afaSXin Li} 199*ba677afaSXin Li 200*ba677afaSXin Lifunc TestParser2_1SnippetMovesToOtherLicenseAfterParsingLicenseIDTag(t *testing.T) { 201*ba677afaSXin Li parser := tvParser2_1{ 202*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 203*ba677afaSXin Li st: psSnippet2_1, 204*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}}, 205*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}}, 206*ba677afaSXin Li snippet: &v2_1.Snippet{SnippetSPDXIdentifier: "s1"}, 207*ba677afaSXin Li } 208*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 209*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 210*ba677afaSXin Li parser.file.Snippets["s1"] = parser.snippet 211*ba677afaSXin Li 212*ba677afaSXin Li err := parser.parsePair2_1("LicenseID", "LicenseRef-TestLic") 213*ba677afaSXin Li if err != nil { 214*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 215*ba677afaSXin Li } 216*ba677afaSXin Li if parser.st != psOtherLicense2_1 { 217*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psOtherLicense2_1, parser.st) 218*ba677afaSXin Li } 219*ba677afaSXin Li} 220*ba677afaSXin Li 221*ba677afaSXin Lifunc TestParser2_1SnippetMovesToReviewAfterParsingReviewerTag(t *testing.T) { 222*ba677afaSXin Li parser := tvParser2_1{ 223*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 224*ba677afaSXin Li st: psSnippet2_1, 225*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}}, 226*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}}, 227*ba677afaSXin Li snippet: &v2_1.Snippet{SnippetSPDXIdentifier: "s1"}, 228*ba677afaSXin Li } 229*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 230*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 231*ba677afaSXin Li parser.file.Snippets["s1"] = parser.snippet 232*ba677afaSXin Li 233*ba677afaSXin Li err := parser.parsePair2_1("Reviewer", "Person: John Doe") 234*ba677afaSXin Li if err != nil { 235*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 236*ba677afaSXin Li } 237*ba677afaSXin Li if parser.st != psReview2_1 { 238*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psReview2_1, parser.st) 239*ba677afaSXin Li } 240*ba677afaSXin Li} 241*ba677afaSXin Li 242*ba677afaSXin Lifunc TestParser2_1SnippetStaysAfterParsingRelationshipTags(t *testing.T) { 243*ba677afaSXin Li parser := tvParser2_1{ 244*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 245*ba677afaSXin Li st: psSnippet2_1, 246*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}}, 247*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}}, 248*ba677afaSXin Li snippet: &v2_1.Snippet{SnippetSPDXIdentifier: "s1"}, 249*ba677afaSXin Li } 250*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 251*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 252*ba677afaSXin Li parser.file.Snippets["s1"] = parser.snippet 253*ba677afaSXin Li 254*ba677afaSXin Li err := parser.parsePair2_1("Relationship", "SPDXRef-blah CONTAINS SPDXRef-blah-else") 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 // state should remain unchanged 259*ba677afaSXin Li if parser.st != psSnippet2_1 { 260*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psSnippet2_1, parser.st) 261*ba677afaSXin Li } 262*ba677afaSXin Li // and the relationship should be in the Document's Relationships 263*ba677afaSXin Li if len(parser.doc.Relationships) != 1 { 264*ba677afaSXin Li t.Fatalf("expected doc.Relationships to have len 1, got %d", len(parser.doc.Relationships)) 265*ba677afaSXin Li } 266*ba677afaSXin Li deID := parser.doc.Relationships[0].RefA 267*ba677afaSXin Li if deID.DocumentRefID != "" || deID.ElementRefID != "blah" { 268*ba677afaSXin Li t.Errorf("expected RefA to be %s, got %s", "blah", parser.doc.Relationships[0].RefA) 269*ba677afaSXin Li } 270*ba677afaSXin Li 271*ba677afaSXin Li err = parser.parsePair2_1("RelationshipComment", "blah") 272*ba677afaSXin Li if err != nil { 273*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 274*ba677afaSXin Li } 275*ba677afaSXin Li // state should still remain unchanged 276*ba677afaSXin Li if parser.st != psSnippet2_1 { 277*ba677afaSXin Li t.Errorf("expected state to be %v, got %v", psSnippet2_1, parser.st) 278*ba677afaSXin Li } 279*ba677afaSXin Li} 280*ba677afaSXin Li 281*ba677afaSXin Lifunc TestParser2_1SnippetStaysAfterParsingAnnotationTags(t *testing.T) { 282*ba677afaSXin Li parser := tvParser2_1{ 283*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 284*ba677afaSXin Li st: psSnippet2_1, 285*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}}, 286*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}}, 287*ba677afaSXin Li snippet: &v2_1.Snippet{SnippetSPDXIdentifier: "s1"}, 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 parser.file.Snippets["s1"] = parser.snippet 292*ba677afaSXin Li 293*ba677afaSXin Li err := parser.parsePair2_1("Annotator", "Person: John Doe ()") 294*ba677afaSXin Li if err != nil { 295*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 296*ba677afaSXin Li } 297*ba677afaSXin Li if parser.st != psSnippet2_1 { 298*ba677afaSXin Li t.Errorf("parser is in state %v, expected %v", parser.st, psSnippet2_1) 299*ba677afaSXin Li } 300*ba677afaSXin Li 301*ba677afaSXin Li err = parser.parsePair2_1("AnnotationDate", "2018-09-15T00:36:00Z") 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 if parser.st != psSnippet2_1 { 306*ba677afaSXin Li t.Errorf("parser is in state %v, expected %v", parser.st, psSnippet2_1) 307*ba677afaSXin Li } 308*ba677afaSXin Li 309*ba677afaSXin Li err = parser.parsePair2_1("AnnotationType", "REVIEW") 310*ba677afaSXin Li if err != nil { 311*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 312*ba677afaSXin Li } 313*ba677afaSXin Li if parser.st != psSnippet2_1 { 314*ba677afaSXin Li t.Errorf("parser is in state %v, expected %v", parser.st, psSnippet2_1) 315*ba677afaSXin Li } 316*ba677afaSXin Li 317*ba677afaSXin Li err = parser.parsePair2_1("SPDXREF", "SPDXRef-45") 318*ba677afaSXin Li if err != nil { 319*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 320*ba677afaSXin Li } 321*ba677afaSXin Li if parser.st != psSnippet2_1 { 322*ba677afaSXin Li t.Errorf("parser is in state %v, expected %v", parser.st, psSnippet2_1) 323*ba677afaSXin Li } 324*ba677afaSXin Li 325*ba677afaSXin Li err = parser.parsePair2_1("AnnotationComment", "i guess i had something to say about this particular file") 326*ba677afaSXin Li if err != nil { 327*ba677afaSXin Li t.Errorf("got error when calling parsePair2_1: %v", err) 328*ba677afaSXin Li } 329*ba677afaSXin Li if parser.st != psSnippet2_1 { 330*ba677afaSXin Li t.Errorf("parser is in state %v, expected %v", parser.st, psSnippet2_1) 331*ba677afaSXin Li } 332*ba677afaSXin Li 333*ba677afaSXin Li // and the annotation should be in the Document's Annotations 334*ba677afaSXin Li if len(parser.doc.Annotations) != 1 { 335*ba677afaSXin Li t.Fatalf("expected doc.Annotations to have len 1, got %d", len(parser.doc.Annotations)) 336*ba677afaSXin Li } 337*ba677afaSXin Li if parser.doc.Annotations[0].Annotator.Annotator != "John Doe ()" { 338*ba677afaSXin Li t.Errorf("expected Annotator to be %s, got %s", "John Doe ()", parser.doc.Annotations[0].Annotator) 339*ba677afaSXin Li } 340*ba677afaSXin Li} 341*ba677afaSXin Li 342*ba677afaSXin Li// ===== Snippet data section tests ===== 343*ba677afaSXin Lifunc TestParser2_1CanParseSnippetTags(t *testing.T) { 344*ba677afaSXin Li parser := tvParser2_1{ 345*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 346*ba677afaSXin Li st: psSnippet2_1, 347*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}}, 348*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}}, 349*ba677afaSXin Li snippet: &v2_1.Snippet{}, 350*ba677afaSXin Li } 351*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 352*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 353*ba677afaSXin Li 354*ba677afaSXin Li // Snippet SPDX Identifier 355*ba677afaSXin Li err := parser.parsePairFromSnippet2_1("SnippetSPDXID", "SPDXRef-s1") 356*ba677afaSXin Li if err != nil { 357*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 358*ba677afaSXin Li } 359*ba677afaSXin Li if parser.snippet.SnippetSPDXIdentifier != "s1" { 360*ba677afaSXin Li t.Errorf("got %v for SnippetSPDXIdentifier", parser.snippet.SnippetSPDXIdentifier) 361*ba677afaSXin Li } 362*ba677afaSXin Li 363*ba677afaSXin Li // Snippet from File SPDX Identifier 364*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("SnippetFromFileSPDXID", "SPDXRef-f1") 365*ba677afaSXin Li if err != nil { 366*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 367*ba677afaSXin Li } 368*ba677afaSXin Li wantDeID := common.DocElementID{DocumentRefID: "", ElementRefID: common.ElementID("f1")} 369*ba677afaSXin Li if parser.snippet.SnippetFromFileSPDXIdentifier != wantDeID.ElementRefID { 370*ba677afaSXin Li t.Errorf("got %v for SnippetFromFileSPDXIdentifier", parser.snippet.SnippetFromFileSPDXIdentifier) 371*ba677afaSXin Li } 372*ba677afaSXin Li 373*ba677afaSXin Li // Snippet Byte Range 374*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("SnippetByteRange", "20:320") 375*ba677afaSXin Li if err != nil { 376*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 377*ba677afaSXin Li } 378*ba677afaSXin Li if parser.snippet.Ranges[0].StartPointer.Offset != 20 { 379*ba677afaSXin Li t.Errorf("got %v for SnippetByteRangeStart", parser.snippet.Ranges[0].StartPointer.Offset) 380*ba677afaSXin Li } 381*ba677afaSXin Li if parser.snippet.Ranges[0].EndPointer.Offset != 320 { 382*ba677afaSXin Li t.Errorf("got %v for SnippetByteRangeEnd", parser.snippet.Ranges[0].EndPointer.Offset) 383*ba677afaSXin Li } 384*ba677afaSXin Li 385*ba677afaSXin Li // Snippet Line Range 386*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("SnippetLineRange", "5:12") 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.snippet.Ranges[1].StartPointer.LineNumber != 5 { 391*ba677afaSXin Li t.Errorf("got %v for SnippetLineRangeStart", parser.snippet.Ranges[1].StartPointer.LineNumber) 392*ba677afaSXin Li } 393*ba677afaSXin Li if parser.snippet.Ranges[1].EndPointer.LineNumber != 12 { 394*ba677afaSXin Li t.Errorf("got %v for SnippetLineRangeEnd", parser.snippet.Ranges[1].EndPointer.LineNumber) 395*ba677afaSXin Li } 396*ba677afaSXin Li 397*ba677afaSXin Li // Snippet Concluded License 398*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("SnippetLicenseConcluded", "BSD-3-Clause") 399*ba677afaSXin Li if err != nil { 400*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 401*ba677afaSXin Li } 402*ba677afaSXin Li if parser.snippet.SnippetLicenseConcluded != "BSD-3-Clause" { 403*ba677afaSXin Li t.Errorf("got %v for SnippetLicenseConcluded", parser.snippet.SnippetLicenseConcluded) 404*ba677afaSXin Li } 405*ba677afaSXin Li 406*ba677afaSXin Li // License Information in Snippet 407*ba677afaSXin Li lics := []string{ 408*ba677afaSXin Li "Apache-2.0", 409*ba677afaSXin Li "GPL-2.0-or-later", 410*ba677afaSXin Li "CC0-1.0", 411*ba677afaSXin Li } 412*ba677afaSXin Li for _, lic := range lics { 413*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("LicenseInfoInSnippet", lic) 414*ba677afaSXin Li if err != nil { 415*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 416*ba677afaSXin Li } 417*ba677afaSXin Li } 418*ba677afaSXin Li for _, licWant := range lics { 419*ba677afaSXin Li flagFound := false 420*ba677afaSXin Li for _, licCheck := range parser.snippet.LicenseInfoInSnippet { 421*ba677afaSXin Li if licWant == licCheck { 422*ba677afaSXin Li flagFound = true 423*ba677afaSXin Li } 424*ba677afaSXin Li } 425*ba677afaSXin Li if flagFound == false { 426*ba677afaSXin Li t.Errorf("didn't find %s in LicenseInfoInSnippet", licWant) 427*ba677afaSXin Li } 428*ba677afaSXin Li } 429*ba677afaSXin Li if len(lics) != len(parser.snippet.LicenseInfoInSnippet) { 430*ba677afaSXin Li t.Errorf("expected %d licenses in LicenseInfoInSnippet, got %d", len(lics), 431*ba677afaSXin Li len(parser.snippet.LicenseInfoInSnippet)) 432*ba677afaSXin Li } 433*ba677afaSXin Li 434*ba677afaSXin Li // Snippet Comments on License 435*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("SnippetLicenseComments", "this is a comment about the licenses") 436*ba677afaSXin Li if err != nil { 437*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 438*ba677afaSXin Li } 439*ba677afaSXin Li if parser.snippet.SnippetLicenseComments != "this is a comment about the licenses" { 440*ba677afaSXin Li t.Errorf("got %v for SnippetLicenseComments", parser.snippet.SnippetLicenseComments) 441*ba677afaSXin Li } 442*ba677afaSXin Li 443*ba677afaSXin Li // Snippet Copyright Text 444*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("SnippetCopyrightText", "copyright (c) John Doe and friends") 445*ba677afaSXin Li if err != nil { 446*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 447*ba677afaSXin Li } 448*ba677afaSXin Li if parser.snippet.SnippetCopyrightText != "copyright (c) John Doe and friends" { 449*ba677afaSXin Li t.Errorf("got %v for SnippetCopyrightText", parser.snippet.SnippetCopyrightText) 450*ba677afaSXin Li } 451*ba677afaSXin Li 452*ba677afaSXin Li // Snippet Comment 453*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("SnippetComment", "this is a comment about the snippet") 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.snippet.SnippetComment != "this is a comment about the snippet" { 458*ba677afaSXin Li t.Errorf("got %v for SnippetComment", parser.snippet.SnippetComment) 459*ba677afaSXin Li } 460*ba677afaSXin Li 461*ba677afaSXin Li // Snippet Name 462*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("SnippetName", "from some other package called abc") 463*ba677afaSXin Li if err != nil { 464*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 465*ba677afaSXin Li } 466*ba677afaSXin Li if parser.snippet.SnippetName != "from some other package called abc" { 467*ba677afaSXin Li t.Errorf("got %v for SnippetName", parser.snippet.SnippetName) 468*ba677afaSXin Li } 469*ba677afaSXin Li} 470*ba677afaSXin Li 471*ba677afaSXin Lifunc TestParser2_1SnippetUnknownTagFails(t *testing.T) { 472*ba677afaSXin Li parser := tvParser2_1{ 473*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 474*ba677afaSXin Li st: psSnippet2_1, 475*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}}, 476*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}}, 477*ba677afaSXin Li snippet: &v2_1.Snippet{SnippetSPDXIdentifier: "s1"}, 478*ba677afaSXin Li } 479*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 480*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 481*ba677afaSXin Li 482*ba677afaSXin Li err := parser.parsePairFromSnippet2_1("blah", "something") 483*ba677afaSXin Li if err == nil { 484*ba677afaSXin Li t.Errorf("expected error from parsing unknown tag") 485*ba677afaSXin Li } 486*ba677afaSXin Li} 487*ba677afaSXin Li 488*ba677afaSXin Lifunc TestParser2_1FailsForInvalidSnippetSPDXID(t *testing.T) { 489*ba677afaSXin Li parser := tvParser2_1{ 490*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 491*ba677afaSXin Li st: psSnippet2_1, 492*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}}, 493*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}}, 494*ba677afaSXin Li snippet: &v2_1.Snippet{}, 495*ba677afaSXin Li } 496*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 497*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 498*ba677afaSXin Li 499*ba677afaSXin Li // invalid Snippet SPDX Identifier 500*ba677afaSXin Li err := parser.parsePairFromSnippet2_1("SnippetSPDXID", "whoops") 501*ba677afaSXin Li if err == nil { 502*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 503*ba677afaSXin Li } 504*ba677afaSXin Li} 505*ba677afaSXin Li 506*ba677afaSXin Lifunc TestParser2_1FailsForInvalidSnippetFromFileSPDXID(t *testing.T) { 507*ba677afaSXin Li parser := tvParser2_1{ 508*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 509*ba677afaSXin Li st: psSnippet2_1, 510*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}}, 511*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}}, 512*ba677afaSXin Li snippet: &v2_1.Snippet{}, 513*ba677afaSXin Li } 514*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 515*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 516*ba677afaSXin Li 517*ba677afaSXin Li // start with Snippet SPDX Identifier 518*ba677afaSXin Li err := parser.parsePairFromSnippet2_1("SnippetSPDXID", "SPDXRef-s1") 519*ba677afaSXin Li if err != nil { 520*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 521*ba677afaSXin Li } 522*ba677afaSXin Li // invalid From File identifier 523*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("SnippetFromFileSPDXID", "whoops") 524*ba677afaSXin Li if err == nil { 525*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 526*ba677afaSXin Li } 527*ba677afaSXin Li} 528*ba677afaSXin Li 529*ba677afaSXin Lifunc TestParser2_1FailsForInvalidSnippetByteValues(t *testing.T) { 530*ba677afaSXin Li parser := tvParser2_1{ 531*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 532*ba677afaSXin Li st: psSnippet2_1, 533*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}}, 534*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}}, 535*ba677afaSXin Li snippet: &v2_1.Snippet{}, 536*ba677afaSXin Li } 537*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 538*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 539*ba677afaSXin Li 540*ba677afaSXin Li // start with Snippet SPDX Identifier 541*ba677afaSXin Li err := parser.parsePairFromSnippet2_1("SnippetSPDXID", "SPDXRef-s1") 542*ba677afaSXin Li if err != nil { 543*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 544*ba677afaSXin Li } 545*ba677afaSXin Li // invalid byte formats and values 546*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("SnippetByteRange", "200 210") 547*ba677afaSXin Li if err == nil { 548*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 549*ba677afaSXin Li } 550*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("SnippetByteRange", "a:210") 551*ba677afaSXin Li if err == nil { 552*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 553*ba677afaSXin Li } 554*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("SnippetByteRange", "200:a") 555*ba677afaSXin Li if err == nil { 556*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 557*ba677afaSXin Li } 558*ba677afaSXin Li} 559*ba677afaSXin Li 560*ba677afaSXin Lifunc TestParser2_1FailsForInvalidSnippetLineValues(t *testing.T) { 561*ba677afaSXin Li parser := tvParser2_1{ 562*ba677afaSXin Li doc: &v2_1.Document{Packages: []*v2_1.Package{}}, 563*ba677afaSXin Li st: psSnippet2_1, 564*ba677afaSXin Li pkg: &v2_1.Package{PackageName: "package1", PackageSPDXIdentifier: "package1", Files: []*v2_1.File{}}, 565*ba677afaSXin Li file: &v2_1.File{FileName: "f1.txt", FileSPDXIdentifier: "f1", Snippets: map[common.ElementID]*v2_1.Snippet{}}, 566*ba677afaSXin Li snippet: &v2_1.Snippet{}, 567*ba677afaSXin Li } 568*ba677afaSXin Li parser.doc.Packages = append(parser.doc.Packages, parser.pkg) 569*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 570*ba677afaSXin Li 571*ba677afaSXin Li // start with Snippet SPDX Identifier 572*ba677afaSXin Li err := parser.parsePairFromSnippet2_1("SnippetSPDXID", "SPDXRef-s1") 573*ba677afaSXin Li if err != nil { 574*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 575*ba677afaSXin Li } 576*ba677afaSXin Li // invalid byte formats and values 577*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("SnippetLineRange", "200 210") 578*ba677afaSXin Li if err == nil { 579*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 580*ba677afaSXin Li } 581*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("SnippetLineRange", "a:210") 582*ba677afaSXin Li if err == nil { 583*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 584*ba677afaSXin Li } 585*ba677afaSXin Li err = parser.parsePairFromSnippet2_1("SnippetLineRange", "200:a") 586*ba677afaSXin Li if err == nil { 587*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 588*ba677afaSXin Li } 589*ba677afaSXin Li} 590*ba677afaSXin Li 591*ba677afaSXin Lifunc TestParser2_1FilesWithoutSpdxIdThrowErrorWithSnippets(t *testing.T) { 592*ba677afaSXin Li // Invalid file with snippet 593*ba677afaSXin Li // Last unpackaged file before the snippet starts 594*ba677afaSXin Li // Last file of a package and new snippet starts 595*ba677afaSXin Li fileName := "f2.txt" 596*ba677afaSXin Li sid1 := common.ElementID("s1") 597*ba677afaSXin Li parser2 := tvParser2_1{ 598*ba677afaSXin Li doc: &v2_1.Document{}, 599*ba677afaSXin Li st: psCreationInfo2_1, 600*ba677afaSXin Li file: &v2_1.File{FileName: fileName}, 601*ba677afaSXin Li } 602*ba677afaSXin Li err := parser2.parsePair2_1("SnippetSPDXID", string(sid1)) 603*ba677afaSXin Li if err == nil { 604*ba677afaSXin Li t.Errorf("files without SPDX Identifiers getting accepted") 605*ba677afaSXin Li } 606*ba677afaSXin Li 607*ba677afaSXin Li} 608