Skip to content

Commit

Permalink
Merge pull request #54 from RishabhBhatnagar/master
Browse files Browse the repository at this point in the history
Fixes #51
  • Loading branch information
swinslow committed Nov 15, 2020
2 parents cb390d3 + 302f983 commit b584a7d
Show file tree
Hide file tree
Showing 9 changed files with 113 additions and 23 deletions.
6 changes: 5 additions & 1 deletion rdfloader/parser2v2/parse_file.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -81,7 +85,6 @@ func (parser *rdfParser2_2) getFileFromNode(fileNode *gordfParser.Node) (file *s
return nil, fmt.Errorf("error setting a file dependency in a file: %v", err)
}
file.FileDependencies = append(file.FileDependencies, string(newFile.FileSPDXIdentifier))
parser.files[file.FileSPDXIdentifier] = file
case SPDX_ATTRIBUTION_TEXT:
// cardinality: min 0
file.FileAttributionTexts = append(file.FileAttributionTexts, subTriple.Object.ID)
Expand All @@ -98,6 +101,7 @@ func (parser *rdfParser2_2) getFileFromNode(fileNode *gordfParser.Node) (file *s
return nil, err
}
}
parser.files[file.FileSPDXIdentifier] = file
return file, nil
}

Expand Down
65 changes: 59 additions & 6 deletions rdfloader/parser2v2/parse_file_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -485,22 +538,22 @@ 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)
}

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)
}
Expand All @@ -510,15 +563,15 @@ 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)
}

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])
}
Expand Down
5 changes: 5 additions & 0 deletions rdfloader/parser2v2/parse_package.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -125,6 +129,7 @@ func (parser *rdfParser2_2) getPackageFromNode(packageNode *gordfParser.Node) (p
}
}

parser.doc.Packages[pkg.PackageSPDXIdentifier] = pkg
return pkg, nil
}

Expand Down
43 changes: 42 additions & 1 deletion rdfloader/parser2v2/parse_package_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
2 changes: 0 additions & 2 deletions rdfloader/parser2v2/parse_relationship.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ func (parser *rdfParser2_2) parseRelatedElementFromTriple(reln *spdx.Relationshi
DocumentRefID: "",
ElementRefID: file.FileSPDXIdentifier,
}
parser.files[file.FileSPDXIdentifier] = file

case SPDX_PACKAGE:
pkg, err := parser.getPackageFromNode(triple.Subject)
Expand All @@ -89,7 +88,6 @@ func (parser *rdfParser2_2) parseRelatedElementFromTriple(reln *spdx.Relationshi
DocumentRefID: "",
ElementRefID: pkg.PackageSPDXIdentifier,
}
parser.packages[pkg.PackageSPDXIdentifier] = pkg

case SPDX_SPDX_ELEMENT:
// it shouldn't be associated with any other triple.
Expand Down
10 changes: 2 additions & 8 deletions rdfloader/parser2v2/parse_snippet_info.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,11 @@ func (parser *rdfParser2_2) getSnippetInformationFromNode2_2(node *gordfParser.N
case SPDX_SNIPPET_FROM_FILE:
// cardinality: exactly 1
// file which is associated with the snippet
file, err := parser.getFileFromNode(siTriple.Object)
_, err := parser.getFileFromNode(siTriple.Object)
if err != nil {
return nil, err
}
si.SnippetFromFileSPDXIdentifier, err = ExtractDocElementID(getLastPartOfURI(siTriple.Object.ID))
parser.files[file.FileSPDXIdentifier] = file
case SPDX_RANGE:
// cardinality: min 1
err = parser.setSnippetRangeFromNode(siTriple.Object, si)
Expand Down Expand Up @@ -175,15 +174,10 @@ func (parser *rdfParser2_2) parseRangeReference(node *gordfParser.Node, snippet
if len(associatedTriples) == 0 {
return nil
}
file, err := parser.getFileFromNode(node)
_, err := parser.getFileFromNode(node)
if err != nil {
return fmt.Errorf("error parsing a new file in a reference: %v", err)
}

// setting the file to the parser. We cannot say if it is unpackaged
// because it is quite possible that the range references a file which
// belongs to another package.
parser.files[file.FileSPDXIdentifier] = file
return nil
}

Expand Down
1 change: 0 additions & 1 deletion rdfloader/parser2v2/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ func NewParser2_2(gordfParserObj *gordfParser.Parser, nodeToTriples map[string][
Reviews: []*spdx.Review2_2{},
},
files: map[spdx.ElementID]*spdx.File2_2{},
packages: map[spdx.ElementID]*spdx.Package2_2{},
assocWithPackage: map[spdx.ElementID]bool{},
}
return &parser
Expand Down
3 changes: 0 additions & 3 deletions rdfloader/parser2v2/parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@ func TestNewParser2_2(t *testing.T) {
if parser.files == nil {
t.Errorf("files should've been initialised, got %v", parser.files)
}
if parser.packages == nil {
t.Errorf("packages should've been initialised, got %v", parser.packages)
}
if parser.assocWithPackage == nil {
t.Errorf("assocWithPackage should've been initialised, got %v", parser.assocWithPackage)
}
Expand Down
1 change: 0 additions & 1 deletion rdfloader/parser2v2/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ type rdfParser2_2 struct {
// map of packages and files.
files map[spdx.ElementID]*spdx.File2_2
assocWithPackage map[spdx.ElementID]bool
packages map[spdx.ElementID]*spdx.Package2_2

// mapping of nodeStrings to parsed object to save double computation.
cache map[string]interface{}
Expand Down

0 comments on commit b584a7d

Please sign in to comment.