Skip to content

Commit

Permalink
Add Tests And Bug Fixes For Remaining Files
Browse files Browse the repository at this point in the history
 - setting file referenced in the range to parser files instead of the Unpackaged Files.
 - externalReference now requires just a node rather than a triple.
 - tidied and DRYed parsing of Snippet range.
 - allow licenseInfoInFile of File to be AnyLicenseInfo instead of SimpleLicensingInfo.
 - change signature of getSnippetInformation from Triple To Node.
 - add simpleLicensingInfo switch in the anyLicensingInfo switch.
 - change input of getExternaelDocumentRef from triples to Node for easier prototyping.
 - remove unused methods in utils
 - remove parser association from utils functions.

Signed-off-by: Rishabh Bhatnagar <bhatnagarrishabh4@gmail.com>
  • Loading branch information
RishabhBhatnagar committed Sep 4, 2020
1 parent 84fab30 commit 87e6ef7
Show file tree
Hide file tree
Showing 18 changed files with 1,857 additions and 275 deletions.
1 change: 1 addition & 0 deletions rdfloader/parser2v2/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ var (
SPDX_DISJUNCTIVE_LICENSE_SET = NS_SPDX + "DisjunctiveLicenseSet"
SPDX_CONJUNCTIVE_LICENSE_SET = NS_SPDX + "ConjunctiveLicenseSet"
SPDX_EXTRACTED_LICENSING_INFO = NS_SPDX + "ExtractedLicensingInfo"
SPDX_SIMPLE_LICENSING_INFO = NS_SPDX + "SimpleLicensingInfo"
SPDX_NONE_CAPS = NS_SPDX + "NONE"
SPDX_NOASSERTION_CAPS = NS_SPDX + "NOASSERTION"
SPDX_NONE_SMALL = NS_SPDX + "none"
Expand Down
2 changes: 1 addition & 1 deletion rdfloader/parser2v2/parse_creation_info_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,4 +104,4 @@ func Test_rdfParser2_2_parseCreationInfoFromNode(t *testing.T) {
if ci.CreatorComment != expectedComment {
t.Errorf("expected %s, found %s", expectedComment, ci.CreatorComment)
}
}
}
21 changes: 1 addition & 20 deletions rdfloader/parser2v2/parse_file.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func (parser *rdfParser2_2) getFileFromNode(fileNode *gordfParser.Node) (file *s
file.LicenseConcluded = anyLicense.ToLicenseString()
case SPDX_LICENSE_INFO_IN_FILE: // 4.6
// cardinality: min 1
lic, err := parser.getLicenseInfoInFileFromNode(subTriple.Object)
lic, err := parser.getAnyLicenseFromNode(subTriple.Object)
if err != nil {
return nil, fmt.Errorf("error parsing licenseInfoInFile: %v", err)
}
Expand Down Expand Up @@ -181,22 +181,3 @@ func getNoticeTextFromNode(node *gordfParser.Node) string {
return node.ID
}
}

func (parser *rdfParser2_2) getLicenseInfoInFileFromNode(node *gordfParser.Node) (AnyLicenseInfo, error) {
// LicenseInfoInFile can either be NONE | NOASSERTION | SimpleLicensingInfo
// return type is kept as AnyLicenseInfo because, we can have
// either SpecialLicense or SimpleLicensingInfo as the output
switch node.ID {
case SPDX_NOASSERTION_CAPS, SPDX_NOASSERTION_SMALL:
return SpecialLicense{
value: NOASSERTION,
}, nil
case SPDX_NONE_CAPS, SPDX_NONE_SMALL:
return SpecialLicense{
value: NONE,
}, nil
}

// the license must be a SimpleLicense
return parser.getSimpleLicensingInfoFromNode(node)
}
50 changes: 0 additions & 50 deletions rdfloader/parser2v2/parse_file_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -649,53 +649,3 @@ func Test_getNoticeTextFromNode(t *testing.T) {
t.Errorf("expected text, found %s", output)
}
}

func Test_rdfParser2_2_getLicenseInfoInFileFromNode(t *testing.T) {
parser, _ := parserFromBodyContent(``)

// TestCase 1: noassertion License
lic, err := parser.getLicenseInfoInFileFromNode(&gordfParser.Node{
NodeType: gordfParser.RESOURCELITERAL,
ID: SPDX_NOASSERTION_CAPS,
})
if err != nil {
t.Errorf("error parsing a valid license")
}
if lic.ToLicenseString() != "NOASSERTION" {
t.Errorf("expected %s, found %s", "NOASSERTION", lic.ToLicenseString())
}

// TestCase 2: none License
lic, err = parser.getLicenseInfoInFileFromNode(&gordfParser.Node{
NodeType: gordfParser.RESOURCELITERAL,
ID: SPDX_NONE_CAPS,
})
if err != nil {
t.Errorf("error parsing a valid license")
}
if lic.ToLicenseString() != "NONE" {
t.Errorf("expected %s, found %s", "NONE", lic.ToLicenseString())
}

// TestCase 3: invalid license
// TestCase 1: noassertion License
node := &gordfParser.Node{
NodeType: gordfParser.BLANK,
ID: "N0",
}
parser.gordfParserObj.Triples = append(parser.gordfParserObj.Triples, &gordfParser.Triple{
Subject: node,
Predicate: &gordfParser.Node{
NodeType: gordfParser.IRI,
ID: NS_SPDX + "invalidAttribute",
},
Object: &gordfParser.Node{
NodeType: gordfParser.IRI,
ID: NS_SPDX + "weirdLicense",
},
})
lic, err = parser.getLicenseInfoInFileFromNode(node)
if err == nil {
t.Errorf("should've raised an error parsing an invalid license")
}
}
4 changes: 3 additions & 1 deletion rdfloader/parser2v2/parse_license.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func (parser *rdfParser2_2) getAnyLicenseFromNode(node *gordfParser.Node) (AnyLi
}

// we have some attributes associated with the license node.
nodeType, err := parser.getNodeTypeFromTriples(associatedTriples, node)
nodeType, err := getNodeTypeFromTriples(associatedTriples, node)
if err != nil {
return nil, fmt.Errorf("error parsing license triple: %v", err)
}
Expand All @@ -40,6 +40,8 @@ func (parser *rdfParser2_2) getAnyLicenseFromNode(node *gordfParser.Node) (AnyLi
return parser.getWithExceptionOperatorFromNode(node)
case SPDX_OR_LATER_OPERATOR:
return parser.getOrLaterOperatorFromNode(node)
case SPDX_SIMPLE_LICENSING_INFO:
return parser.getSimpleLicensingInfoFromNode(node)
}
return nil, fmt.Errorf("Unknown subTag (%s) found while parsing AnyLicense", nodeType)
}
Expand Down
75 changes: 26 additions & 49 deletions rdfloader/parser2v2/parse_package.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,33 +37,21 @@ func (parser *rdfParser2_2) getPackageFromNode(packageNode *gordfParser.Node) (p
case SPDX_SUPPLIER: // 3.5
// cardinality: max 1
err = setPackageSupplier(pkg, subTriple.Object.ID)
if err != nil {
return nil, err
}
case SPDX_ORIGINATOR: // 3.6
// cardinality: max 1
err = setPackageOriginator(pkg, subTriple.Object.ID)
if err != nil {
return nil, err
}
case SPDX_DOWNLOAD_LOCATION: // 3.7
// cardinality: exactly 1
err = setDocumentLocationFromURI(subTriple.Object.ID, pkg)
if err != nil {
return nil, err
}
err = setDocumentLocationFromURI(pkg, subTriple.Object.ID)
case SPDX_FILES_ANALYZED: // 3.8
// cardinality: max 1
err = setFilesAnalyzed(subTriple.Object.ID, pkg)
if err != nil {
err = fmt.Errorf("error setting a filesAnalyzed attribute of a package: %v", err)
}
err = setFilesAnalyzed(pkg, subTriple.Object.ID)
case SPDX_PACKAGE_VERIFICATION_CODE: // 3.9
// cardinality: max 1
err = parser.setPackageVerificationCode(pkg, subTriple.Object)
case SPDX_CHECKSUM: // 3.10
// cardinality: min 0
err = setPackageChecksum(parser, pkg, subTriple.Object)
err = parser.setPackageChecksum(pkg, subTriple.Object)
case DOAP_HOMEPAGE: // 3.11
// cardinality: max 1
// homepage must be a valid Uri
Expand Down Expand Up @@ -108,33 +96,27 @@ func (parser *rdfParser2_2) getPackageFromNode(packageNode *gordfParser.Node) (p
pkg.PackageComment = subTriple.Object.ID
case SPDX_EXTERNAL_REF: // 3.21
// cardinality: min 0
externalDocRef, err := parser.getPackageExternalRef(subTriple)
externalDocRef, err := parser.getPackageExternalRef(subTriple.Object)
if err != nil {
return nil, err
return nil, fmt.Errorf("error parsing externalRef of a package: %v", err)
}
pkg.PackageExternalReferences = append(pkg.PackageExternalReferences, externalDocRef)
case SPDX_HAS_FILE: // 3.22
// cardinality: min 0
file, err := parser.getFileFromNode(subTriple.Object)
if err != nil {
return nil, err
return nil, fmt.Errorf("error setting file inside a package: %v", err)
}
parser.setFileToPackage(pkg, file)
case SPDX_RELATIONSHIP:
// cardinality: min 0
err := parser.parseRelationship(subTriple)
if err != nil {
return nil, err
}
err = parser.parseRelationship(subTriple)
case SPDX_ATTRIBUTION_TEXT:
// cardinality: min 0
pkg.PackageAttributionTexts = append(pkg.PackageAttributionTexts, subTriple.Object.ID)
case SPDX_ANNOTATION:
// cardinality: min 0
err := parser.parseAnnotationFromNode(subTriple.Object)
if err != nil {
return nil, err
}
err = parser.parseAnnotationFromNode(subTriple.Object)
default:
return nil, fmt.Errorf("unknown predicate id %s while parsing a package", subTriple.Predicate.ID)
}
Expand All @@ -147,21 +129,21 @@ func (parser *rdfParser2_2) getPackageFromNode(packageNode *gordfParser.Node) (p
}

// parses externalReference found in the package by the associated triple.
func (parser *rdfParser2_2) getPackageExternalRef(triple *gordfParser.Triple) (externalDocRef *spdx.PackageExternalReference2_2, err error) {
func (parser *rdfParser2_2) getPackageExternalRef(node *gordfParser.Node) (externalDocRef *spdx.PackageExternalReference2_2, err error) {
externalDocRef = &spdx.PackageExternalReference2_2{}
for _, subTriple := range parser.nodeToTriples(triple.Object) {
switch subTriple.Predicate.ID {
for _, triple := range parser.nodeToTriples(node) {
switch triple.Predicate.ID {
case SPDX_REFERENCE_CATEGORY:
// cardinality: exactly 1
switch subTriple.Object.ID {
switch triple.Object.ID {
case SPDX_REFERENCE_CATEGORY_SECURITY:
externalDocRef.Category = "SECURITY"
case SPDX_REFERENCE_CATEGORY_PACKAGE_MANAGER:
externalDocRef.Category = "PACKAGE-MANAGER"
case SPDX_REFERENCE_CATEGORY_OTHER:
externalDocRef.Category = "OTHER"
default:
return nil, fmt.Errorf("unknown packageManager predicate uri %s", subTriple.Predicate.ID)
return nil, fmt.Errorf("unknown packageManager uri %s", triple.Predicate.ID)
}
case RDF_TYPE:
continue
Expand All @@ -172,15 +154,15 @@ func (parser *rdfParser2_2) getPackageExternalRef(triple *gordfParser.Triple) (e
// 1. contextualExample,
// 2. documentation and,
// 3. externalReferenceSite
externalDocRef.RefType = subTriple.Object.ID
externalDocRef.RefType = triple.Object.ID
case SPDX_REFERENCE_LOCATOR:
// cardinality: exactly 1
externalDocRef.Locator = subTriple.Object.ID
externalDocRef.Locator = triple.Object.ID
case RDFS_COMMENT:
// cardinality: max 1
externalDocRef.ExternalRefComment = subTriple.Object.ID
externalDocRef.ExternalRefComment = triple.Object.ID
default:
return nil, fmt.Errorf("unknown package external reference predicate id %s", subTriple.Predicate.ID)
return nil, fmt.Errorf("unknown package external reference predicate id %s", triple.Predicate.ID)
}
}
return
Expand All @@ -205,6 +187,8 @@ func (parser *rdfParser2_2) setPackageVerificationCode(pkg *spdx.Package2_2, nod
return nil
}

// appends the file to the package and also sets the assocWithPackage for the
// file to indicate the file is associated with a package
func (parser *rdfParser2_2) setFileToPackage(pkg *spdx.Package2_2, file *spdx.File2_2) {
if pkg.Files == nil {
pkg.Files = map[spdx.ElementID]*spdx.File2_2{}
Expand Down Expand Up @@ -263,9 +247,9 @@ func setPackageOriginator(pkg *spdx.Package2_2, value string) error {
}

// validates the uri and sets the location if it is valid
func setDocumentLocationFromURI(locationURI string, pkg *spdx.Package2_2) error {
func setDocumentLocationFromURI(pkg *spdx.Package2_2, locationURI string) error {
switch locationURI {
case SPDX_NOASSERTION_CAPS, SPDX_NOASSERTION_CAPS:
case SPDX_NOASSERTION_CAPS, SPDX_NOASSERTION_SMALL:
pkg.PackageDownloadLocation = "NOASSERTION"
case SPDX_NONE_CAPS, SPDX_NONE_SMALL:
pkg.PackageDownloadLocation = "NONE"
Expand All @@ -280,23 +264,16 @@ func setDocumentLocationFromURI(locationURI string, pkg *spdx.Package2_2) error

// sets the FilesAnalyzed attribute to the given package
// boolValue is a string of type "true" or "false"
func setFilesAnalyzed(boolValue string, pkg *spdx.Package2_2) error {
func setFilesAnalyzed(pkg *spdx.Package2_2, boolValue string) (err error) {
pkg.IsFilesAnalyzedTagPresent = true
switch strings.TrimSpace(boolValue) {
case "true":
pkg.FilesAnalyzed = true
case "false":
pkg.FilesAnalyzed = false
default:
return fmt.Errorf("filesAnalyzed can be either true/false. found %s", boolValue)
}
return nil
pkg.FilesAnalyzed, err = boolFromString(boolValue)
return err
}

func setPackageChecksum(parser *rdfParser2_2, pkg *spdx.Package2_2, node *gordfParser.Node) error {
func (parser *rdfParser2_2) setPackageChecksum(pkg *spdx.Package2_2, node *gordfParser.Node) error {
checksumAlgorithm, checksumValue, err := parser.getChecksumFromNode(node)
if err != nil {
return err
return fmt.Errorf("error getting checksum algorithm and value from %v", node)
}
switch checksumAlgorithm {
case "MD5":
Expand Down

0 comments on commit 87e6ef7

Please sign in to comment.