// 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(` `) 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(` `) 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(` `) 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(` `) 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(` `) 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(` `) 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(` `) 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(` `) 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(` `) 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(` `) 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(` `) 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(` `) 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(` `) 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(` comment `) 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) } }