aboutsummaryrefslogtreecommitdiff
path: root/tvloader/parser2v1/parse_file_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'tvloader/parser2v1/parse_file_test.go')
-rw-r--r--tvloader/parser2v1/parse_file_test.go700
1 files changed, 700 insertions, 0 deletions
diff --git a/tvloader/parser2v1/parse_file_test.go b/tvloader/parser2v1/parse_file_test.go
new file mode 100644
index 0000000..9aef1ea
--- /dev/null
+++ b/tvloader/parser2v1/parse_file_test.go
@@ -0,0 +1,700 @@
+// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+package parser2v1
+
+import (
+ "testing"
+
+ "github.com/spdx/tools-golang/spdx"
+)
+
+// ===== Parser file section state change tests =====
+func TestParser2_1FileStartsNewFileAfterParsingFileNameTag(t *testing.T) {
+ // create the first file
+ fileOldName := "f1.txt"
+
+ parser := tvParser2_1{
+ doc: &spdx.Document2_1{},
+ st: psFile2_1,
+ pkg: &spdx.Package2_1{PackageName: "test"},
+ file: &spdx.File2_1{FileName: fileOldName},
+ }
+ fileOld := parser.file
+ parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
+ parser.pkg.Files = append(parser.pkg.Files, fileOld)
+ // the Package's Files should have this one only
+ if parser.pkg.Files[0] != fileOld {
+ t.Errorf("Expected file %v in Files[0], got %v", fileOld, parser.pkg.Files[0])
+ }
+ if parser.pkg.Files[0].FileName != fileOldName {
+ t.Errorf("expected file name %s in Files[0], got %s", fileOldName, parser.pkg.Files[0].FileName)
+ }
+
+ // now add a new file
+ fileName := "f2.txt"
+ err := parser.parsePair2_1("FileName", fileName)
+ if err != nil {
+ t.Errorf("got error when calling parsePair2_1: %v", err)
+ }
+ // state should be correct
+ if parser.st != psFile2_1 {
+ t.Errorf("expected state to be %v, got %v", psFile2_1, parser.st)
+ }
+ // and a file should be created
+ if parser.file == nil {
+ t.Fatalf("parser didn't create new file")
+ }
+ // and the file name should be as expected
+ if parser.file.FileName != fileName {
+ t.Errorf("expected file name %s, got %s", fileName, parser.file.FileName)
+ }
+ // and the Package's Files should be of size 2 and have these two
+ if parser.pkg.Files[0] != fileOld {
+ t.Errorf("Expected file %v in Files[0], got %v", fileOld, parser.pkg.Files[0])
+ }
+ if parser.pkg.Files[0].FileName != fileOldName {
+ t.Errorf("expected file name %s in Files[0], got %s", fileOldName, parser.pkg.Files[0].FileName)
+ }
+ if parser.pkg.Files[1] != parser.file {
+ t.Errorf("Expected file %v in Files[1], got %v", parser.file, parser.pkg.Files[1])
+ }
+ if parser.pkg.Files[1].FileName != fileName {
+ t.Errorf("expected file name %s in Files[1], got %s", fileName, parser.pkg.Files[1].FileName)
+ }
+}
+
+func TestParser2_1FileStartsNewPackageAfterParsingPackageNameTag(t *testing.T) {
+ // create the first file and package
+ p1Name := "package1"
+ f1Name := "f1.txt"
+
+ parser := tvParser2_1{
+ doc: &spdx.Document2_1{},
+ st: psFile2_1,
+ pkg: &spdx.Package2_1{PackageName: p1Name},
+ file: &spdx.File2_1{FileName: f1Name},
+ }
+ p1 := parser.pkg
+ f1 := parser.file
+ parser.doc.Packages = append(parser.doc.Packages, p1)
+ parser.pkg.Files = append(parser.pkg.Files, f1)
+
+ // now add a new package
+ p2Name := "package2"
+ err := parser.parsePair2_1("PackageName", p2Name)
+ if err != nil {
+ t.Errorf("got error when calling parsePair2_1: %v", err)
+ }
+ // state should go back to Package
+ if parser.st != psPackage2_1 {
+ t.Errorf("expected state to be %v, got %v", psPackage2_1, parser.st)
+ }
+ // and a package should be created
+ if parser.pkg == nil {
+ t.Fatalf("parser didn't create new pkg")
+ }
+ // and the package name should be as expected
+ if parser.pkg.PackageName != p2Name {
+ t.Errorf("expected package name %s, got %s", p2Name, parser.pkg.PackageName)
+ }
+ // and the package should default to true for FilesAnalyzed
+ if parser.pkg.FilesAnalyzed != true {
+ t.Errorf("expected FilesAnalyzed to default to true, got false")
+ }
+ if parser.pkg.IsFilesAnalyzedTagPresent != false {
+ t.Errorf("expected IsFilesAnalyzedTagPresent to default to false, got true")
+ }
+ // and the package should _not_ be an "unpackaged" placeholder
+ if parser.pkg.IsUnpackaged == true {
+ t.Errorf("package incorrectly has IsUnpackaged flag set")
+ }
+ // and the Document's Packages should be of size 2 and have these two
+ if parser.doc.Packages[0] != p1 {
+ t.Errorf("Expected package %v in Packages[0], got %v", p1, parser.doc.Packages[0])
+ }
+ if parser.doc.Packages[0].PackageName != p1Name {
+ t.Errorf("expected package name %s in Packages[0], got %s", p1Name, parser.doc.Packages[0].PackageName)
+ }
+ if parser.doc.Packages[1] != parser.pkg {
+ t.Errorf("Expected package %v in Packages[1], got %v", parser.pkg, parser.doc.Packages[1])
+ }
+ if parser.doc.Packages[1].PackageName != p2Name {
+ t.Errorf("expected package name %s in Packages[1], got %s", p2Name, parser.doc.Packages[1].PackageName)
+ }
+ // and the first Package's Files should be of size 1 and have f1 only
+ if len(parser.doc.Packages[0].Files) != 1 {
+ t.Errorf("Expected 1 file in Packages[0].Files, got %d", len(parser.doc.Packages[0].Files))
+ }
+ if parser.doc.Packages[0].Files[0] != f1 {
+ t.Errorf("Expected file %v in Files[0], got %v", f1, parser.doc.Packages[0].Files[0])
+ }
+ if parser.doc.Packages[0].Files[0].FileName != f1Name {
+ t.Errorf("expected file name %s in Files[0], got %s", f1Name, parser.doc.Packages[0].Files[0].FileName)
+ }
+ // and the second Package should have no files
+ if len(parser.doc.Packages[1].Files) != 0 {
+ t.Errorf("Expected no files in Packages[1].Files, got %d", len(parser.doc.Packages[1].Files))
+ }
+ // and the current file should be nil
+ if parser.file != nil {
+ t.Errorf("Expected nil for parser.file, got %v", parser.file)
+ }
+}
+
+func TestParser2_1FileMovesToSnippetAfterParsingSnippetSPDXIDTag(t *testing.T) {
+ parser := tvParser2_1{
+ doc: &spdx.Document2_1{},
+ st: psFile2_1,
+ pkg: &spdx.Package2_1{PackageName: "test"},
+ file: &spdx.File2_1{FileName: "f1.txt"},
+ }
+ parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
+ parser.pkg.Files = append(parser.pkg.Files, parser.file)
+ fileCurrent := parser.file
+
+ err := parser.parsePair2_1("SnippetSPDXID", "SPDXRef-Test1")
+ if err != nil {
+ t.Errorf("got error when calling parsePair2_1: %v", err)
+ }
+ // state should be correct
+ if parser.st != psSnippet2_1 {
+ t.Errorf("expected state to be %v, got %v", psSnippet2_1, parser.st)
+ }
+ // and current file should remain what it was
+ if parser.file != fileCurrent {
+ t.Fatalf("expected file to remain %v, got %v", fileCurrent, parser.file)
+ }
+}
+
+func TestParser2_1FileMovesToOtherLicenseAfterParsingLicenseIDTag(t *testing.T) {
+ parser := tvParser2_1{
+ doc: &spdx.Document2_1{},
+ st: psFile2_1,
+ pkg: &spdx.Package2_1{PackageName: "test"},
+ file: &spdx.File2_1{FileName: "f1.txt"},
+ }
+ parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
+ parser.pkg.Files = append(parser.pkg.Files, parser.file)
+
+ err := parser.parsePair2_1("LicenseID", "LicenseRef-TestLic")
+ if err != nil {
+ t.Errorf("got error when calling parsePair2_1: %v", err)
+ }
+ if parser.st != psOtherLicense2_1 {
+ t.Errorf("expected state to be %v, got %v", psOtherLicense2_1, parser.st)
+ }
+}
+
+func TestParser2_1FileMovesToReviewAfterParsingReviewerTag(t *testing.T) {
+ parser := tvParser2_1{
+ doc: &spdx.Document2_1{},
+ st: psFile2_1,
+ pkg: &spdx.Package2_1{PackageName: "test"},
+ file: &spdx.File2_1{FileName: "f1.txt"},
+ }
+ parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
+ parser.pkg.Files = append(parser.pkg.Files, parser.file)
+
+ err := parser.parsePair2_1("Reviewer", "Person: John Doe")
+ if err != nil {
+ t.Errorf("got error when calling parsePair2_1: %v", err)
+ }
+ if parser.st != psReview2_1 {
+ t.Errorf("expected state to be %v, got %v", psReview2_1, parser.st)
+ }
+}
+
+func TestParser2_1FileStaysAfterParsingRelationshipTags(t *testing.T) {
+ parser := tvParser2_1{
+ doc: &spdx.Document2_1{},
+ st: psFile2_1,
+ pkg: &spdx.Package2_1{PackageName: "test"},
+ file: &spdx.File2_1{FileName: "f1.txt"},
+ }
+ parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
+ parser.pkg.Files = append(parser.pkg.Files, parser.file)
+
+ err := parser.parsePair2_1("Relationship", "blah CONTAINS blah-else")
+ if err != nil {
+ t.Errorf("got error when calling parsePair2_1: %v", err)
+ }
+ // state should remain unchanged
+ if parser.st != psFile2_1 {
+ t.Errorf("expected state to be %v, got %v", psFile2_1, parser.st)
+ }
+
+ err = parser.parsePair2_1("RelationshipComment", "blah")
+ if err != nil {
+ t.Errorf("got error when calling parsePair2_1: %v", err)
+ }
+ // state should still remain unchanged
+ if parser.st != psFile2_1 {
+ t.Errorf("expected state to be %v, got %v", psFile2_1, parser.st)
+ }
+}
+
+func TestParser2_1FileStaysAfterParsingAnnotationTags(t *testing.T) {
+ parser := tvParser2_1{
+ doc: &spdx.Document2_1{},
+ st: psFile2_1,
+ pkg: &spdx.Package2_1{PackageName: "test"},
+ file: &spdx.File2_1{FileName: "f1.txt"},
+ }
+ parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
+ parser.pkg.Files = append(parser.pkg.Files, parser.file)
+
+ err := parser.parsePair2_1("Annotator", "Person: John Doe ()")
+ if err != nil {
+ t.Errorf("got error when calling parsePair2_1: %v", err)
+ }
+ if parser.st != psFile2_1 {
+ t.Errorf("parser is in state %v, expected %v", parser.st, psFile2_1)
+ }
+
+ err = parser.parsePair2_1("AnnotationDate", "2018-09-15T00:36:00Z")
+ if err != nil {
+ t.Errorf("got error when calling parsePair2_1: %v", err)
+ }
+ if parser.st != psFile2_1 {
+ t.Errorf("parser is in state %v, expected %v", parser.st, psFile2_1)
+ }
+
+ err = parser.parsePair2_1("AnnotationType", "REVIEW")
+ if err != nil {
+ t.Errorf("got error when calling parsePair2_1: %v", err)
+ }
+ if parser.st != psFile2_1 {
+ t.Errorf("parser is in state %v, expected %v", parser.st, psFile2_1)
+ }
+
+ err = parser.parsePair2_1("SPDXREF", "SPDXRef-45")
+ if err != nil {
+ t.Errorf("got error when calling parsePair2_1: %v", err)
+ }
+ if parser.st != psFile2_1 {
+ t.Errorf("parser is in state %v, expected %v", parser.st, psFile2_1)
+ }
+
+ err = parser.parsePair2_1("AnnotationComment", "i guess i had something to say about this particular file")
+ if err != nil {
+ t.Errorf("got error when calling parsePair2_1: %v", err)
+ }
+ if parser.st != psFile2_1 {
+ t.Errorf("parser is in state %v, expected %v", parser.st, psFile2_1)
+ }
+}
+
+// ===== File data section tests =====
+func TestParser2_1CanParseFileTags(t *testing.T) {
+ parser := tvParser2_1{
+ doc: &spdx.Document2_1{},
+ st: psFile2_1,
+ pkg: &spdx.Package2_1{PackageName: "test"},
+ }
+ parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
+ parser.pkg.Files = append(parser.pkg.Files, parser.file)
+
+ // File Name
+ err := parser.parsePairFromFile2_1("FileName", "f1.txt")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ if parser.file.FileName != "f1.txt" {
+ t.Errorf("got %v for FileName", parser.file.FileName)
+ }
+
+ // File SPDX Identifier
+ err = parser.parsePairFromFile2_1("SPDXID", "SPDXRef-f1")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ if parser.file.FileSPDXIdentifier != "SPDXRef-f1" {
+ t.Errorf("got %v for FileSPDXIdentifier", parser.file.FileSPDXIdentifier)
+ }
+
+ // File Type
+ fileTypes := []string{
+ "TEXT",
+ "DOCUMENTATION",
+ }
+ for _, ty := range fileTypes {
+ err = parser.parsePairFromFile2_1("FileType", ty)
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ }
+ for _, typeWant := range fileTypes {
+ flagFound := false
+ for _, typeCheck := range parser.file.FileType {
+ if typeWant == typeCheck {
+ flagFound = true
+ }
+ }
+ if flagFound == false {
+ t.Errorf("didn't find %s in FileType", typeWant)
+ }
+ }
+ if len(fileTypes) != len(parser.file.FileType) {
+ t.Errorf("expected %d types in FileType, got %d", len(fileTypes),
+ len(parser.file.FileType))
+ }
+
+ // File Checksums
+ codeSha1 := "85ed0817af83a24ad8da68c2b5094de69833983c"
+ sumSha1 := "SHA1: 85ed0817af83a24ad8da68c2b5094de69833983c"
+ codeSha256 := "11b6d3ee554eedf79299905a98f9b9a04e498210b59f15094c916c91d150efcd"
+ sumSha256 := "SHA256: 11b6d3ee554eedf79299905a98f9b9a04e498210b59f15094c916c91d150efcd"
+ codeMd5 := "624c1abb3664f4b35547e7c73864ad24"
+ sumMd5 := "MD5: 624c1abb3664f4b35547e7c73864ad24"
+ err = parser.parsePairFromFile2_1("FileChecksum", sumSha1)
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ err = parser.parsePairFromFile2_1("FileChecksum", sumSha256)
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ err = parser.parsePairFromFile2_1("FileChecksum", sumMd5)
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ if parser.file.FileChecksumSHA1 != codeSha1 {
+ t.Errorf("expected %s for FileChecksumSHA1, got %s", codeSha1, parser.file.FileChecksumSHA1)
+ }
+ if parser.file.FileChecksumSHA256 != codeSha256 {
+ t.Errorf("expected %s for FileChecksumSHA256, got %s", codeSha256, parser.file.FileChecksumSHA256)
+ }
+ if parser.file.FileChecksumMD5 != codeMd5 {
+ t.Errorf("expected %s for FileChecksumMD5, got %s", codeMd5, parser.file.FileChecksumMD5)
+ }
+
+ // Concluded License
+ err = parser.parsePairFromFile2_1("LicenseConcluded", "Apache-2.0 OR GPL-2.0-or-later")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ if parser.file.LicenseConcluded != "Apache-2.0 OR GPL-2.0-or-later" {
+ t.Errorf("got %v for LicenseConcluded", parser.file.LicenseConcluded)
+ }
+
+ // License Information in File
+ lics := []string{
+ "Apache-2.0",
+ "GPL-2.0-or-later",
+ "CC0-1.0",
+ }
+ for _, lic := range lics {
+ err = parser.parsePairFromFile2_1("LicenseInfoInFile", lic)
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ }
+ for _, licWant := range lics {
+ flagFound := false
+ for _, licCheck := range parser.file.LicenseInfoInFile {
+ if licWant == licCheck {
+ flagFound = true
+ }
+ }
+ if flagFound == false {
+ t.Errorf("didn't find %s in LicenseInfoInFile", licWant)
+ }
+ }
+ if len(lics) != len(parser.file.LicenseInfoInFile) {
+ t.Errorf("expected %d licenses in LicenseInfoInFile, got %d", len(lics),
+ len(parser.file.LicenseInfoInFile))
+ }
+
+ // Comments on License
+ err = parser.parsePairFromFile2_1("LicenseComments", "this is a comment")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ if parser.file.LicenseComments != "this is a comment" {
+ t.Errorf("got %v for LicenseComments", parser.file.LicenseComments)
+ }
+
+ // Copyright Text
+ err = parser.parsePairFromFile2_1("FileCopyrightText", "copyright (c) me")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ if parser.file.FileCopyrightText != "copyright (c) me" {
+ t.Errorf("got %v for FileCopyrightText", parser.file.FileCopyrightText)
+ }
+
+ // Artifact of Projects: Name, HomePage and URI
+ // Artifact set 1
+ err = parser.parsePairFromFile2_1("ArtifactOfProjectName", "project1")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ err = parser.parsePairFromFile2_1("ArtifactOfProjectHomePage", "http://example.com/1/")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ err = parser.parsePairFromFile2_1("ArtifactOfProjectURI", "http://example.com/1/uri.whatever")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ // Artifact set 2 -- just name
+ err = parser.parsePairFromFile2_1("ArtifactOfProjectName", "project2")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ // Artifact set 3 -- just name and home page
+ err = parser.parsePairFromFile2_1("ArtifactOfProjectName", "project3")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ err = parser.parsePairFromFile2_1("ArtifactOfProjectHomePage", "http://example.com/3/")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ // Artifact set 4 -- just name and URI
+ err = parser.parsePairFromFile2_1("ArtifactOfProjectName", "project4")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ err = parser.parsePairFromFile2_1("ArtifactOfProjectURI", "http://example.com/4/uri.whatever")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+
+ if len(parser.file.ArtifactOfProjects) != 4 {
+ t.Fatalf("expected len %d, got %d", 4, len(parser.file.ArtifactOfProjects))
+ }
+
+ aop := parser.file.ArtifactOfProjects[0]
+ if aop.Name != "project1" {
+ t.Errorf("expected %v, got %v", "project1", aop.Name)
+ }
+ if aop.HomePage != "http://example.com/1/" {
+ t.Errorf("expected %v, got %v", "http://example.com/1/", aop.HomePage)
+ }
+ if aop.URI != "http://example.com/1/uri.whatever" {
+ t.Errorf("expected %v, got %v", "http://example.com/1/uri.whatever", aop.URI)
+ }
+
+ aop = parser.file.ArtifactOfProjects[1]
+ if aop.Name != "project2" {
+ t.Errorf("expected %v, got %v", "project2", aop.Name)
+ }
+ if aop.HomePage != "" {
+ t.Errorf("expected %v, got %v", "", aop.HomePage)
+ }
+ if aop.URI != "" {
+ t.Errorf("expected %v, got %v", "", aop.URI)
+ }
+
+ aop = parser.file.ArtifactOfProjects[2]
+ if aop.Name != "project3" {
+ t.Errorf("expected %v, got %v", "project3", aop.Name)
+ }
+ if aop.HomePage != "http://example.com/3/" {
+ t.Errorf("expected %v, got %v", "http://example.com/3/", aop.HomePage)
+ }
+ if aop.URI != "" {
+ t.Errorf("expected %v, got %v", "", aop.URI)
+ }
+
+ aop = parser.file.ArtifactOfProjects[3]
+ if aop.Name != "project4" {
+ t.Errorf("expected %v, got %v", "project4", aop.Name)
+ }
+ if aop.HomePage != "" {
+ t.Errorf("expected %v, got %v", "", aop.HomePage)
+ }
+ if aop.URI != "http://example.com/4/uri.whatever" {
+ t.Errorf("expected %v, got %v", "http://example.com/4/uri.whatever", aop.URI)
+ }
+
+ // File Comment
+ err = parser.parsePairFromFile2_1("FileComment", "this is a comment")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ if parser.file.FileComment != "this is a comment" {
+ t.Errorf("got %v for FileComment", parser.file.FileComment)
+ }
+
+ // File Notice
+ err = parser.parsePairFromFile2_1("FileNotice", "this is a Notice")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ if parser.file.FileNotice != "this is a Notice" {
+ t.Errorf("got %v for FileNotice", parser.file.FileNotice)
+ }
+
+ // File Contributor
+ contribs := []string{
+ "John Doe jdoe@example.com",
+ "EvilCorp",
+ }
+ for _, contrib := range contribs {
+ err = parser.parsePairFromFile2_1("FileContributor", contrib)
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ }
+ for _, contribWant := range contribs {
+ flagFound := false
+ for _, contribCheck := range parser.file.FileContributor {
+ if contribWant == contribCheck {
+ flagFound = true
+ }
+ }
+ if flagFound == false {
+ t.Errorf("didn't find %s in FileContributor", contribWant)
+ }
+ }
+ if len(contribs) != len(parser.file.FileContributor) {
+ t.Errorf("expected %d contribenses in FileContributor, got %d", len(contribs),
+ len(parser.file.FileContributor))
+ }
+
+ // File Dependencies
+ deps := []string{
+ "f-1.txt",
+ "g.txt",
+ }
+ for _, dep := range deps {
+ err = parser.parsePairFromFile2_1("FileDependency", dep)
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ }
+ for _, depWant := range deps {
+ flagFound := false
+ for _, depCheck := range parser.file.FileDependencies {
+ if depWant == depCheck {
+ flagFound = true
+ }
+ }
+ if flagFound == false {
+ t.Errorf("didn't find %s in FileDependency", depWant)
+ }
+ }
+ if len(deps) != len(parser.file.FileDependencies) {
+ t.Errorf("expected %d depenses in FileDependency, got %d", len(deps),
+ len(parser.file.FileDependencies))
+ }
+
+}
+
+func TestParser2_1FileCreatesRelationshipInDocument(t *testing.T) {
+ parser := tvParser2_1{
+ doc: &spdx.Document2_1{},
+ st: psFile2_1,
+ pkg: &spdx.Package2_1{PackageName: "test"},
+ file: &spdx.File2_1{FileName: "f1.txt"},
+ }
+ parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
+ parser.pkg.Files = append(parser.pkg.Files, parser.file)
+
+ err := parser.parsePair2_1("Relationship", "blah CONTAINS blah-whatever")
+ if err != nil {
+ t.Errorf("got error when calling parsePair2_1: %v", err)
+ }
+ if parser.rln == nil {
+ t.Fatalf("parser didn't create and point to Relationship struct")
+ }
+ if parser.rln != parser.doc.Relationships[0] {
+ t.Errorf("pointer to new Relationship doesn't match idx 0 for doc.Relationships[]")
+ }
+}
+
+func TestParser2_1FileCreatesAnnotationInDocument(t *testing.T) {
+ parser := tvParser2_1{
+ doc: &spdx.Document2_1{},
+ st: psFile2_1,
+ pkg: &spdx.Package2_1{PackageName: "test"},
+ file: &spdx.File2_1{FileName: "f1.txt"},
+ }
+ parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
+ parser.pkg.Files = append(parser.pkg.Files, parser.file)
+
+ err := parser.parsePair2_1("Annotator", "Person: John Doe ()")
+ if err != nil {
+ t.Errorf("got error when calling parsePair2_1: %v", err)
+ }
+ if parser.ann == nil {
+ t.Fatalf("parser didn't create and point to Annotation struct")
+ }
+ if parser.ann != parser.doc.Annotations[0] {
+ t.Errorf("pointer to new Annotation doesn't match idx 0 for doc.Annotations[]")
+ }
+}
+
+func TestParser2_1FileUnknownTagFails(t *testing.T) {
+ parser := tvParser2_1{
+ doc: &spdx.Document2_1{},
+ st: psFile2_1,
+ pkg: &spdx.Package2_1{PackageName: "test"},
+ file: &spdx.File2_1{FileName: "f1.txt"},
+ }
+ parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
+ parser.pkg.Files = append(parser.pkg.Files, parser.file)
+
+ err := parser.parsePairFromFile2_1("blah", "something")
+ if err == nil {
+ t.Errorf("expected error from parsing unknown tag")
+ }
+}
+
+func TestFileAOPPointerChangesAfterTags(t *testing.T) {
+ parser := tvParser2_1{
+ doc: &spdx.Document2_1{},
+ st: psFile2_1,
+ pkg: &spdx.Package2_1{PackageName: "test"},
+ file: &spdx.File2_1{FileName: "f1.txt"},
+ }
+ parser.doc.Packages = append(parser.doc.Packages, parser.pkg)
+ parser.pkg.Files = append(parser.pkg.Files, parser.file)
+
+ err := parser.parsePairFromFile2_1("ArtifactOfProjectName", "project1")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ if parser.fileAOP == nil {
+ t.Errorf("expected non-nil AOP pointer, got nil")
+ }
+ curPtr := parser.fileAOP
+
+ // now, a home page; pointer should stay
+ err = parser.parsePairFromFile2_1("ArtifactOfProjectHomePage", "http://example.com/1/")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ if parser.fileAOP != curPtr {
+ t.Errorf("expected no change in AOP pointer, was %v, got %v", curPtr, parser.fileAOP)
+ }
+
+ // a URI; pointer should stay
+ err = parser.parsePairFromFile2_1("ArtifactOfProjectURI", "http://example.com/1/uri.whatever")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ if parser.fileAOP != curPtr {
+ t.Errorf("expected no change in AOP pointer, was %v, got %v", curPtr, parser.fileAOP)
+ }
+
+ // now, another artifact name; pointer should change but be non-nil
+ // now, a home page; pointer should stay
+ err = parser.parsePairFromFile2_1("ArtifactOfProjectName", "project2")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ if parser.fileAOP == curPtr {
+ t.Errorf("expected change in AOP pointer, got no change")
+ }
+
+ // finally, an unrelated tag; pointer should go away
+ err = parser.parsePairFromFile2_1("FileComment", "whatever")
+ if err != nil {
+ t.Errorf("expected nil error, got %v", err)
+ }
+ if parser.fileAOP != nil {
+ t.Errorf("expected nil AOP pointer, got %v", parser.fileAOP)
+ }
+}