From 302f983e7b61d30e81294efb1637e82056e81732 Mon Sep 17 00:00:00 2001 From: Rishabh Bhatnagar Date: Sun, 15 Nov 2020 16:35:55 +0530 Subject: Allow Multipart Declaration for File and Package - Files and Packages can now be declared in several parts in different parent tags Signed-off-by: Rishabh Bhatnagar --- rdfloader/parser2v2/parse_file.go | 4 ++ rdfloader/parser2v2/parse_file_test.go | 65 ++++++++++++++++++++++++++++--- rdfloader/parser2v2/parse_package.go | 5 +++ rdfloader/parser2v2/parse_package_test.go | 43 +++++++++++++++++++- rdfloader/parser2v2/parse_relationship.go | 1 - 5 files changed, 110 insertions(+), 8 deletions(-) (limited to 'rdfloader') diff --git a/rdfloader/parser2v2/parse_file.go b/rdfloader/parser2v2/parse_file.go index 9fbf3b4..38a95ea 100644 --- a/rdfloader/parser2v2/parse_file.go +++ b/rdfloader/parser2v2/parse_file.go @@ -18,6 +18,10 @@ func (parser *rdfParser2_2) getFileFromNode(fileNode *gordfParser.Node) (file *s return nil, err } + if existingFile := parser.files[file.FileSPDXIdentifier]; existingFile != nil { + file = existingFile + } + for _, subTriple := range parser.nodeToTriples(fileNode) { switch subTriple.Predicate.ID { case SPDX_FILE_NAME: // 4.1 diff --git a/rdfloader/parser2v2/parse_file_test.go b/rdfloader/parser2v2/parse_file_test.go index 27c8fb4..48db28f 100644 --- a/rdfloader/parser2v2/parse_file_test.go +++ b/rdfloader/parser2v2/parse_file_test.go @@ -441,7 +441,60 @@ func Test_rdfParser2_2_getFileFromNode(t *testing.T) { t.Error("should've raised an error stating invalid licenseInfoInFile for a file") } - // TestCase 10: all valid attribute and it's values. + // TestCase 10: Splitting of File definition into parents of different tags mustn't create new file objects. + fileDefinitions := []string{ + ` + + + time-1.9/ChangeLog + + + + `, + ` + + + + + + + `, + } + parser, _ = parserFromBodyContent(strings.Join(fileDefinitions, "")) + + var file *spdx.File2_2 + packageTypeTriples := gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_PACKAGE) + for _, typeTriple := range packageTypeTriples { + pkg, err := parser.getPackageFromNode(typeTriple.Subject) + if err != nil { + t.Errorf("unexpected error parsing a valid package: %v", err) + } + if n := len(pkg.Files); n != 1 { + t.Errorf("expected package to contain exactly 1 file. Found %d files", n) + } + for _, file = range pkg.Files { + } + } + + // checking if all the attributes that spanned over a several tags are set in the same variable. + expectedFileName := "time-1.9/ChangeLog" + if file.FileName != expectedFileName { + t.Errorf("expected %s, found %s", expectedFileName, file.FileName) + } + expectedLicenseConcluded := "NOASSERTION" + if file.LicenseConcluded != expectedLicenseConcluded { + t.Errorf("expected %s, found %s", expectedLicenseConcluded, file.LicenseConcluded) + } + expectedFileType := "source" + if file.FileType[0] != expectedFileType { + t.Errorf("expected %s, found %s", expectedFileType, file.FileType) + } + expectedLicenseInfoInFile := "NOASSERTION" + if file.LicenseInfoInFile[0] != expectedLicenseInfoInFile { + t.Errorf("expected %s, found %s", expectedLicenseInfoInFile, file.LicenseInfoInFile[0]) + } + + // TestCase 11: all valid attribute and it's values. parser, _ = parserFromBodyContent(` time-1.9/ChangeLog @@ -485,14 +538,14 @@ func Test_rdfParser2_2_getFileFromNode(t *testing.T) { `) fileNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0].Subject - file, err := parser.getFileFromNode(fileNode) + file, err = parser.getFileFromNode(fileNode) if err != nil { t.Errorf("unexpected error parsing a valid file: %v", err) } // checking each and every attribute of the obtained file. - expectedFileName := "time-1.9/ChangeLog" + expectedFileName = "time-1.9/ChangeLog" if file.FileName != expectedFileName { t.Errorf("expected %s, found %s", expectedFileName, file.FileName) } @@ -500,7 +553,7 @@ func Test_rdfParser2_2_getFileFromNode(t *testing.T) { if len(file.FileType) != 1 { t.Errorf("given file should have 1 fileType attribute. found %d", len(file.FileType)) } - expectedFileType := "source" + expectedFileType = "source" if file.FileType[0] != expectedFileType { t.Errorf("expected %s, found %s", expectedFileType, file.FileType) } @@ -510,7 +563,7 @@ func Test_rdfParser2_2_getFileFromNode(t *testing.T) { t.Errorf("expected %s, found %s", expectedChecksum, file.FileChecksumSHA1) } - expectedLicenseConcluded := "NOASSERTION" + expectedLicenseConcluded = "NOASSERTION" if file.LicenseConcluded != expectedLicenseConcluded { t.Errorf("expected %s, found %s", expectedLicenseConcluded, file.LicenseConcluded) } @@ -518,7 +571,7 @@ func Test_rdfParser2_2_getFileFromNode(t *testing.T) { if len(file.LicenseInfoInFile) != 1 { t.Errorf("given file should have 1 licenseInfoInFile attribute. found %d", len(file.LicenseInfoInFile)) } - expectedLicenseInfoInFile := "NOASSERTION" + expectedLicenseInfoInFile = "NOASSERTION" if file.LicenseInfoInFile[0] != expectedLicenseInfoInFile { t.Errorf("expected %s, found %s", expectedLicenseInfoInFile, file.LicenseInfoInFile[0]) } diff --git a/rdfloader/parser2v2/parse_package.go b/rdfloader/parser2v2/parse_package.go index 20047a6..5be9631 100644 --- a/rdfloader/parser2v2/parse_package.go +++ b/rdfloader/parser2v2/parse_package.go @@ -19,6 +19,10 @@ func (parser *rdfParser2_2) getPackageFromNode(packageNode *gordfParser.Node) (p } pkg.PackageSPDXIdentifier = eId // 3.2 + if existingPkg := parser.doc.Packages[eId]; existingPkg != nil { + pkg = existingPkg + } + // iterate over all the triples associated with the provided package packageNode. for _, subTriple := range parser.nodeToTriples(packageNode) { switch subTriple.Predicate.ID { @@ -125,6 +129,7 @@ func (parser *rdfParser2_2) getPackageFromNode(packageNode *gordfParser.Node) (p } } + parser.doc.Packages[pkg.PackageSPDXIdentifier] = pkg return pkg, nil } diff --git a/rdfloader/parser2v2/parse_package_test.go b/rdfloader/parser2v2/parse_package_test.go index a5f77a8..35a67dc 100644 --- a/rdfloader/parser2v2/parse_package_test.go +++ b/rdfloader/parser2v2/parse_package_test.go @@ -418,7 +418,48 @@ func Test_rdfParser2_2_getPackageFromNode(t *testing.T) { t.Errorf("expected an error(invalid homepage uri), found %v", err) } - // TestCase 7: everything valid + // TestCase 7: Package tag declared more than once should be parsed into a single object's definition + parser, _ = parserFromBodyContent(` + + Test Package + + `) + node = parser.gordfParserObj.Triples[0].Subject + _, err = parser.getPackageFromNode(node) + if err != nil { + t.Errorf("error parsing a valid package: %v", err) + } + yetAnotherPkgTriple := gordfParser.Triple{ + Subject: node, + Predicate: &gordfParser.Node{ + NodeType: gordfParser.IRI, + ID: SPDX_PACKAGE_FILE_NAME, + }, + Object: &gordfParser.Node{ + NodeType: gordfParser.LITERAL, + ID: "packageFileName", + }, + } + parser.nodeStringToTriples[node.String()] = append(parser.nodeStringToTriples[node.String()], &yetAnotherPkgTriple) + pkg, err := parser.getPackageFromNode(node) + if err != nil { + t.Errorf("error parsing a valid package: %v", err) + } + // validating if all the attributes that spanned over two tags are included in the parsed package. + expectedID := "upload2" + if string(pkg.PackageSPDXIdentifier) != expectedID { + t.Errorf("expected package id: %s, got %s", expectedID, pkg.PackageSPDXIdentifier) + } + expectedPkgFileName := "packageFileName" + if expectedPkgFileName != pkg.PackageFileName { + t.Errorf("expected package file name: %s, got %s", expectedPkgFileName, pkg.PackageFileName) + } + expectedName := "Test Package" + if pkg.PackageName != expectedName { + t.Errorf("expected package name: %s, got %s", expectedPkgFileName, pkg.PackageName) + } + + // TestCase 8: everything valid parser, _ = parserFromBodyContent(` Test Package diff --git a/rdfloader/parser2v2/parse_relationship.go b/rdfloader/parser2v2/parse_relationship.go index 3ef9c61..beba838 100644 --- a/rdfloader/parser2v2/parse_relationship.go +++ b/rdfloader/parser2v2/parse_relationship.go @@ -88,7 +88,6 @@ func (parser *rdfParser2_2) parseRelatedElementFromTriple(reln *spdx.Relationshi DocumentRefID: "", ElementRefID: pkg.PackageSPDXIdentifier, } - parser.doc.Packages[pkg.PackageSPDXIdentifier] = pkg case SPDX_SPDX_ELEMENT: // it shouldn't be associated with any other triple. -- cgit v1.2.3