aboutsummaryrefslogtreecommitdiff
path: root/rdfloader
diff options
context:
space:
mode:
authorRishabh Bhatnagar <bhatnagarrishabh4@gmail.com>2020-11-15 16:35:55 +0530
committerRishabh Bhatnagar <bhatnagarrishabh4@gmail.com>2020-11-15 16:39:04 +0530
commit302f983e7b61d30e81294efb1637e82056e81732 (patch)
treeb56303f20b3bfb93a23537f7dee9a72880f4b508 /rdfloader
parent2ddb287ddc7219c0542a5d955380680c42de3099 (diff)
downloadspdx-tools-302f983e7b61d30e81294efb1637e82056e81732.tar.gz
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 <bhatnagarrishabh4@gmail.com>
Diffstat (limited to 'rdfloader')
-rw-r--r--rdfloader/parser2v2/parse_file.go4
-rw-r--r--rdfloader/parser2v2/parse_file_test.go65
-rw-r--r--rdfloader/parser2v2/parse_package.go5
-rw-r--r--rdfloader/parser2v2/parse_package_test.go43
-rw-r--r--rdfloader/parser2v2/parse_relationship.go1
5 files changed, 110 insertions, 8 deletions
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{
+ `<spdx:Package rdf:about="#SPDXRef-Package1">
+ <spdx:hasFile>
+ <spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gz_1535120734-spdx.rdf#SPDXRef-item177">
+ <spdx:fileName>time-1.9/ChangeLog</spdx:fileName>
+ <spdx:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/>
+ </spdx:File>
+ </spdx:hasFile>
+ </spdx:Package>`,
+ `<spdx:Package rdf:about="#SPDXRef-Package2">
+ <spdx:hasFile>
+ <spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gz_1535120734-spdx.rdf#SPDXRef-item177">
+ <spdx:licenseConcluded rdf:resource="http://spdx.org/rdf/terms#noassertion" />
+ <spdx:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#NOASSERTION" />
+ </spdx:File>
+ </spdx:hasFile>
+ </spdx:Package>`,
+ }
+ 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(`
<spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gz_1535120734-spdx.rdf#SPDXRef-item177">
<spdx:fileName>time-1.9/ChangeLog</spdx:fileName>
@@ -485,14 +538,14 @@ func Test_rdfParser2_2_getFileFromNode(t *testing.T) {
</spdx:File>
`)
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(`
+ <spdx:Package rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9#SPDXRef-upload2">
+ <spdx:name>Test Package</spdx:name>
+ </spdx: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(`
<spdx:Package rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9#SPDXRef-upload2">
<spdx:name>Test Package</spdx:name>
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.