aboutsummaryrefslogtreecommitdiff
path: root/rdfloader/parser2v2/parse_relationship_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'rdfloader/parser2v2/parse_relationship_test.go')
-rw-r--r--rdfloader/parser2v2/parse_relationship_test.go397
1 files changed, 397 insertions, 0 deletions
diff --git a/rdfloader/parser2v2/parse_relationship_test.go b/rdfloader/parser2v2/parse_relationship_test.go
new file mode 100644
index 0000000..fd66d14
--- /dev/null
+++ b/rdfloader/parser2v2/parse_relationship_test.go
@@ -0,0 +1,397 @@
+// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+
+package parser2v2
+
+import (
+ "reflect"
+ "testing"
+
+ "github.com/spdx/gordf/rdfwriter"
+ "github.com/spdx/tools-golang/spdx/common"
+ "github.com/spdx/tools-golang/spdx/v2_2"
+)
+
+func Test_getReferenceFromURI(t *testing.T) {
+ // TestCase 1: noassertion uri
+ ref, err := getReferenceFromURI(SPDX_NOASSERTION_CAPS)
+ if err != nil {
+ t.Errorf("unexpected error: %v", err)
+ }
+ if ref.DocumentRefID != "" {
+ t.Errorf("reference's documentRefID should've been empty, found %s", ref.DocumentRefID)
+ }
+ if ref.ElementRefID != "NOASSERTION" {
+ t.Errorf("mismatching elementRefID. Found %s, expected %s", ref.ElementRefID, "NOASSERTION")
+ }
+
+ // TestCase 2: NONE uri
+ ref, err = getReferenceFromURI(SPDX_NONE_CAPS)
+ if err != nil {
+ t.Errorf("unexpected error: %v", err)
+ }
+ if ref.DocumentRefID != "" {
+ t.Errorf("reference's documentRefID should've been empty, found %s", ref.DocumentRefID)
+ }
+ if ref.ElementRefID != "NONE" {
+ t.Errorf("mismatching elementRefID. Found %s, expected %s", ref.ElementRefID, "NONE")
+ }
+
+ // TestCase 3: Valid URI
+ ref, err = getReferenceFromURI(NS_SPDX + "SPDXRef-item1")
+ if err != nil {
+ t.Errorf("unexpected error: %v", err)
+ }
+ if ref.DocumentRefID != "" {
+ t.Errorf("reference's documentRefID should've been empty, found %s", ref.DocumentRefID)
+ }
+ if ref.ElementRefID != "item1" {
+ t.Errorf("mismatching elementRefID. Found %s, expected %s", ref.ElementRefID, "item1")
+ }
+
+ // TestCase 3: Invalid URI
+ _, err = getReferenceFromURI(NS_SPDX + "item1")
+ if err == nil {
+ t.Errorf("should've raised an error for invalid input")
+ }
+}
+
+func Test_getRelationshipTypeFromURI(t *testing.T) {
+ // TestCase 1: valid relationshipType
+ relnType := "expandedFromArchive"
+ op, err := getRelationshipTypeFromURI(NS_SPDX + "relationshipType_" + relnType)
+ if err != nil {
+ t.Errorf("error getting relationship type from a valid input")
+ }
+ if op != relnType {
+ t.Errorf("expected %s, found %s", relnType, op)
+ }
+
+ // TestCase2: invalid relationshipType
+ relnType = "invalidRelationship"
+ _, err = getRelationshipTypeFromURI(NS_SPDX + "relationshipType_" + relnType)
+ if err == nil {
+ t.Errorf("should've raised an error for an invalid input(%s)", relnType)
+ }
+}
+
+func Test_rdfParser2_2_parseRelatedElementFromTriple(t *testing.T) {
+ // TestCase 1: Package as a related element
+ parser, _ := parserFromBodyContent(`
+ <spdx:Relationship>
+ <spdx:relatedSpdxElement>
+ <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/>
+ </spdx:relatedSpdxElement>
+ </spdx:Relationship>
+ `)
+ reln := &v2_2.Relationship{}
+ triple := rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_PACKAGE)[0]
+ err := parser.parseRelatedElementFromTriple(reln, triple)
+ if err != nil {
+ t.Errorf("error parsing a valid example")
+ }
+ expectedRefA := common.DocElementID{
+ DocumentRefID: "",
+ ElementRefID: "",
+ }
+ if !reflect.DeepEqual(expectedRefA, reln.RefA) {
+ t.Errorf("expected %+v, found %+v", expectedRefA, reln.RefA)
+ }
+ expectedRefB := common.DocElementID{
+ DocumentRefID: "",
+ ElementRefID: "Saxon",
+ }
+ if !reflect.DeepEqual(expectedRefB, reln.RefB) {
+ t.Errorf("expected %+v, found %+v", expectedRefB, reln.RefB)
+ }
+
+ // TestCase 3: invalid package as a relatedElement
+ parser, _ = parserFromBodyContent(`
+ <spdx:Relationship>
+ <spdx:relatedSpdxElement>
+ <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#Saxon"/>
+ </spdx:relatedSpdxElement>
+ </spdx:Relationship>
+ `)
+ reln = &v2_2.Relationship{}
+ triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_PACKAGE)[0]
+ err = parser.parseRelatedElementFromTriple(reln, triple)
+ if err == nil {
+ t.Errorf("expected an error due to invalid Package id, got %v", err)
+ }
+
+ // TestCase 4: valid File as a related element
+ parser, _ = parserFromBodyContent(`
+ <spdx:Relationship>
+ <spdx:relatedSpdxElement>
+ <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/>
+ </spdx:relatedSpdxElement>
+ </spdx:Relationship>
+ `)
+ reln = &v2_2.Relationship{}
+ triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0]
+ err = parser.parseRelatedElementFromTriple(reln, triple)
+ if err != nil {
+ t.Errorf("error parsing a valid example")
+ }
+ expectedRefA = common.DocElementID{
+ DocumentRefID: "",
+ ElementRefID: "",
+ }
+ if !reflect.DeepEqual(expectedRefA, reln.RefA) {
+ t.Errorf("expected %+v, found %+v", expectedRefA, reln.RefA)
+ }
+ expectedRefB = common.DocElementID{
+ DocumentRefID: "",
+ ElementRefID: "Saxon",
+ }
+ if !reflect.DeepEqual(expectedRefB, reln.RefB) {
+ t.Errorf("expected %+v, found %+v", expectedRefB, reln.RefB)
+ }
+
+ // TestCase 5: invalid File as a relatedElement
+ parser, _ = parserFromBodyContent(`
+ <spdx:Relationship>
+ <spdx:relatedSpdxElement>
+ <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#Saxon"/>
+ </spdx:relatedSpdxElement>
+ </spdx:Relationship>
+ `)
+ reln = &v2_2.Relationship{}
+ triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0]
+ err = parser.parseRelatedElementFromTriple(reln, triple)
+ if err == nil {
+ t.Errorf("expected an error while parsing an invalid File, got %v", err)
+ }
+
+ // TestCase 6: valid SpdxElement as a related element
+ parser, _ = parserFromBodyContent(`
+ <spdx:Relationship>
+ <spdx:relatedSpdxElement>
+ <spdx:SpdxElement rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File"/>
+ </spdx:relatedSpdxElement>
+ </spdx:Relationship>
+ `)
+ reln = &v2_2.Relationship{}
+ triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_SPDX_ELEMENT)[0]
+ err = parser.parseRelatedElementFromTriple(reln, triple)
+ if err != nil {
+ t.Errorf("error parsing a valid example")
+ }
+ expectedRefA = common.DocElementID{
+ DocumentRefID: "",
+ ElementRefID: "",
+ }
+ if !reflect.DeepEqual(expectedRefA, reln.RefA) {
+ t.Errorf("expected %+v, found %+v", expectedRefA, reln.RefA)
+ }
+ expectedRefB = common.DocElementID{
+ DocumentRefID: "",
+ ElementRefID: "File",
+ }
+ if !reflect.DeepEqual(expectedRefB, reln.RefB) {
+ t.Errorf("expected %+v, found %+v", expectedRefB, reln.RefB)
+ }
+
+ // TestCase 7: invalid SpdxElement as a related element
+ parser, _ = parserFromBodyContent(`
+ <spdx:Relationship>
+ <spdx:relatedSpdxElement>
+ <spdx:SpdxElement rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-:File"/>
+ </spdx:relatedSpdxElement>
+ </spdx:Relationship>
+ `)
+ reln = &v2_2.Relationship{}
+ triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_SPDX_ELEMENT)[0]
+ err = parser.parseRelatedElementFromTriple(reln, triple)
+ if err == nil {
+ t.Errorf("expected an error due to invalid documentId for SpdxElement, got %v", err)
+ }
+}
+
+func Test_rdfParser2_2_parseRelationship(t *testing.T) {
+ // TestCase 1: invalid RefA
+ parser, _ := parserFromBodyContent(`
+ <spdx:File>
+ <spdx:relationship>
+ <spdx:Relationship>
+ <spdx:relatedSpdxElement>
+ <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/>
+ </spdx:relatedSpdxElement>
+ </spdx:Relationship>
+ </spdx:relationship>
+ </spdx:File>
+ `)
+ triple := rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0]
+ err := parser.parseRelationship(triple)
+ if err == nil {
+ t.Errorf("should've raised an error due to invalid RefA")
+ }
+
+ // TestCase 3: invalid RefB
+ parser, _ = parserFromBodyContent(`
+ <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File">
+ <spdx:relationship>
+ <spdx:Relationship>
+ <spdx:relatedSpdxElement>
+ <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#Saxon"/>
+ </spdx:relatedSpdxElement>
+ </spdx:Relationship>
+ </spdx:relationship>
+ </spdx:File>
+ `)
+ triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0]
+ err = parser.parseRelationship(triple)
+ if err == nil {
+ t.Errorf("should've raised an error due to invalid RefB")
+ }
+
+ // TestCase 3: more than one typeTriple for relatedElement
+ parser, _ = parserFromBodyContent(`
+ <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File">
+ <spdx:relationship>
+ <spdx:Relationship>
+ <spdx:relatedSpdxElement>
+ <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/>
+ </spdx:relatedSpdxElement>
+ <spdx:relatedSpdxElement>
+ <spdx:File/>
+ </spdx:relatedSpdxElement>
+ </spdx:Relationship>
+ </spdx:relationship>
+ </spdx:File>
+ `)
+ triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0]
+ err = parser.parseRelationship(triple)
+ if err == nil {
+ t.Errorf("should've raised an error due to more than one type triples")
+ }
+
+ // TestCase 4: undefined relatedSpdxElement
+ parser, _ = parserFromBodyContent(`
+ <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File">
+ <spdx:relationship>
+ <spdx:Relationship>
+ <spdx:relatedSpdxElement>
+ <spdx:Unknown rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/>
+ </spdx:relatedSpdxElement>
+ </spdx:Relationship>
+ </spdx:relationship>
+ </spdx:File>
+ `)
+ triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0]
+ err = parser.parseRelationship(triple)
+ if err == nil {
+ t.Errorf("should've raised an error due to unknown relatedElement, got %v", err)
+ }
+
+ // TestCase 6: relatedElement associated with more than one type
+ parser, _ = parserFromBodyContent(`
+ <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File">
+ <spdx:relationship>
+ <spdx:Relationship>
+ <spdx:relatedSpdxElement>
+ <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/>
+ </spdx:relatedSpdxElement>
+ </spdx:Relationship>
+ </spdx:relationship>
+ </spdx:File>
+ <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/>
+ `)
+ triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0]
+ err = parser.parseRelationship(triple)
+ if err == nil {
+ t.Errorf("expected an error due to invalid relatedElement, got %v", err)
+ }
+
+ // TestCase 5: unknown predicate inside a relationship
+ parser, _ = parserFromBodyContent(`
+ <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File">
+ <spdx:relationship>
+ <spdx:Relationship>
+ <spdx:relatedSpdxElement>
+ <spdx:Unknown rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/>
+ </spdx:relatedSpdxElement>
+ <spdx:unknownPredicate/>
+ </spdx:Relationship>
+ </spdx:relationship>
+ </spdx:File>
+ `)
+ triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0]
+ err = parser.parseRelationship(triple)
+ if err == nil {
+ t.Errorf("should've raised an error due to unknown predicate in a relationship")
+ }
+
+ // TestCase 8: Recursive relationships mustn't raise any error:
+ parser, _ = parserFromBodyContent(`
+ <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File">
+ <spdx:relationship>
+ <spdx:Relationship rdf:about="#SPDXRef-reln">
+ <spdx:relationshipType rdf:resource="http://spdx.org/rdf/terms#relationshipType_describes"/>
+ <spdx:relatedSpdxElement>
+ <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon">
+ <spdx:relationship>
+ <spdx:Relationship rdf:about="#SPDXRef-reln">
+ <spdx:relationshipType rdf:resource="http://spdx.org/rdf/terms#relationshipType_describes"/>
+ <spdx:relatedSpdxElement rdf:resource="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File"/>
+ </spdx:Relationship>
+ </spdx:relationship>
+ </spdx:Package>
+ </spdx:relatedSpdxElement>
+ </spdx:Relationship>
+ </spdx:relationship>
+ </spdx:File>
+ `)
+ triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0]
+ err = parser.parseRelationship(triple)
+ if err != nil {
+ t.Errorf("error parsing a valid example")
+ }
+
+ // TestCase 7: completely valid example:
+ parser, _ = parserFromBodyContent(`
+ <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File">
+ <spdx:relationship>
+ <spdx:Relationship>
+ <spdx:relationshipType rdf:resource="http://spdx.org/rdf/terms#relationshipType_describes"/>
+ <spdx:relatedSpdxElement>
+ <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/>
+ </spdx:relatedSpdxElement>
+ <rdfs:comment>comment</rdfs:comment>
+ </spdx:Relationship>
+ </spdx:relationship>
+ </spdx:File>
+ `)
+ triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0]
+ err = parser.parseRelationship(triple)
+ if err != nil {
+ t.Errorf("unexpected error parsing a valid relationship: %v", err)
+ }
+ // validating parsed attributes
+ if len(parser.doc.Relationships) != 1 {
+ t.Errorf("after parsing a valid relationship, doc should've had 1 relationship, found %d", len(parser.doc.Relationships))
+ }
+ reln := parser.doc.Relationships[0]
+ expectedRelnType := "describes"
+ if reln.Relationship != expectedRelnType {
+ t.Errorf("expected %s, found %s", expectedRelnType, reln.Relationship)
+ }
+ expectedRefA := common.DocElementID{
+ DocumentRefID: "",
+ ElementRefID: "File",
+ }
+ if !reflect.DeepEqual(expectedRefA, reln.RefA) {
+ t.Errorf("expected %+v, found %+v", expectedRefA, reln.RefA)
+ }
+ expectedRefB := common.DocElementID{
+ DocumentRefID: "",
+ ElementRefID: "Saxon",
+ }
+ if !reflect.DeepEqual(expectedRefB, reln.RefB) {
+ t.Errorf("expected %+v, found %+v", expectedRefB, reln.RefB)
+ }
+ expectedComment := "comment"
+ if reln.RelationshipComment != expectedComment {
+ t.Errorf("expected %v, found %v", expectedComment, reln.RelationshipComment)
+ }
+}