1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2*ba677afaSXin Li 3*ba677afaSXin Lipackage parser2v3 4*ba677afaSXin Li 5*ba677afaSXin Liimport ( 6*ba677afaSXin Li "reflect" 7*ba677afaSXin Li "testing" 8*ba677afaSXin Li 9*ba677afaSXin Li "github.com/spdx/gordf/rdfwriter" 10*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/common" 11*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/v2_3" 12*ba677afaSXin Li) 13*ba677afaSXin Li 14*ba677afaSXin Lifunc Test_getReferenceFromURI(t *testing.T) { 15*ba677afaSXin Li // TestCase 1: noassertion uri 16*ba677afaSXin Li ref, err := getReferenceFromURI(SPDX_NOASSERTION_CAPS) 17*ba677afaSXin Li if err != nil { 18*ba677afaSXin Li t.Errorf("unexpected error: %v", err) 19*ba677afaSXin Li } 20*ba677afaSXin Li if ref.DocumentRefID != "" { 21*ba677afaSXin Li t.Errorf("reference's documentRefID should've been empty, found %s", ref.DocumentRefID) 22*ba677afaSXin Li } 23*ba677afaSXin Li if ref.ElementRefID != "NOASSERTION" { 24*ba677afaSXin Li t.Errorf("mismatching elementRefID. Found %s, expected %s", ref.ElementRefID, "NOASSERTION") 25*ba677afaSXin Li } 26*ba677afaSXin Li 27*ba677afaSXin Li // TestCase 2: NONE uri 28*ba677afaSXin Li ref, err = getReferenceFromURI(SPDX_NONE_CAPS) 29*ba677afaSXin Li if err != nil { 30*ba677afaSXin Li t.Errorf("unexpected error: %v", err) 31*ba677afaSXin Li } 32*ba677afaSXin Li if ref.DocumentRefID != "" { 33*ba677afaSXin Li t.Errorf("reference's documentRefID should've been empty, found %s", ref.DocumentRefID) 34*ba677afaSXin Li } 35*ba677afaSXin Li if ref.ElementRefID != "NONE" { 36*ba677afaSXin Li t.Errorf("mismatching elementRefID. Found %s, expected %s", ref.ElementRefID, "NONE") 37*ba677afaSXin Li } 38*ba677afaSXin Li 39*ba677afaSXin Li // TestCase 3: Valid URI 40*ba677afaSXin Li ref, err = getReferenceFromURI(NS_SPDX + "SPDXRef-item1") 41*ba677afaSXin Li if err != nil { 42*ba677afaSXin Li t.Errorf("unexpected error: %v", err) 43*ba677afaSXin Li } 44*ba677afaSXin Li if ref.DocumentRefID != "" { 45*ba677afaSXin Li t.Errorf("reference's documentRefID should've been empty, found %s", ref.DocumentRefID) 46*ba677afaSXin Li } 47*ba677afaSXin Li if ref.ElementRefID != "item1" { 48*ba677afaSXin Li t.Errorf("mismatching elementRefID. Found %s, expected %s", ref.ElementRefID, "item1") 49*ba677afaSXin Li } 50*ba677afaSXin Li 51*ba677afaSXin Li // TestCase 3: Invalid URI 52*ba677afaSXin Li _, err = getReferenceFromURI(NS_SPDX + "item1") 53*ba677afaSXin Li if err == nil { 54*ba677afaSXin Li t.Errorf("should've raised an error for invalid input") 55*ba677afaSXin Li } 56*ba677afaSXin Li} 57*ba677afaSXin Li 58*ba677afaSXin Lifunc Test_getRelationshipTypeFromURI(t *testing.T) { 59*ba677afaSXin Li // TestCase 1: valid relationshipType 60*ba677afaSXin Li relnType := "expandedFromArchive" 61*ba677afaSXin Li op, err := getRelationshipTypeFromURI(NS_SPDX + "relationshipType_" + relnType) 62*ba677afaSXin Li if err != nil { 63*ba677afaSXin Li t.Errorf("error getting relationship type from a valid input") 64*ba677afaSXin Li } 65*ba677afaSXin Li if op != relnType { 66*ba677afaSXin Li t.Errorf("expected %s, found %s", relnType, op) 67*ba677afaSXin Li } 68*ba677afaSXin Li 69*ba677afaSXin Li // TestCase2: invalid relationshipType 70*ba677afaSXin Li relnType = "invalidRelationship" 71*ba677afaSXin Li _, err = getRelationshipTypeFromURI(NS_SPDX + "relationshipType_" + relnType) 72*ba677afaSXin Li if err == nil { 73*ba677afaSXin Li t.Errorf("should've raised an error for an invalid input(%s)", relnType) 74*ba677afaSXin Li } 75*ba677afaSXin Li} 76*ba677afaSXin Li 77*ba677afaSXin Lifunc Test_rdfParser2_3_parseRelatedElementFromTriple(t *testing.T) { 78*ba677afaSXin Li // TestCase 1: Package as a related element 79*ba677afaSXin Li parser, _ := parserFromBodyContent(` 80*ba677afaSXin Li <spdx:Relationship> 81*ba677afaSXin Li <spdx:relatedSpdxElement> 82*ba677afaSXin Li <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/> 83*ba677afaSXin Li </spdx:relatedSpdxElement> 84*ba677afaSXin Li </spdx:Relationship> 85*ba677afaSXin Li `) 86*ba677afaSXin Li reln := &v2_3.Relationship{} 87*ba677afaSXin Li triple := rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_PACKAGE)[0] 88*ba677afaSXin Li err := parser.parseRelatedElementFromTriple(reln, triple) 89*ba677afaSXin Li if err != nil { 90*ba677afaSXin Li t.Errorf("error parsing a valid example") 91*ba677afaSXin Li } 92*ba677afaSXin Li expectedRefA := common.DocElementID{ 93*ba677afaSXin Li DocumentRefID: "", 94*ba677afaSXin Li ElementRefID: "", 95*ba677afaSXin Li } 96*ba677afaSXin Li if !reflect.DeepEqual(expectedRefA, reln.RefA) { 97*ba677afaSXin Li t.Errorf("expected %+v, found %+v", expectedRefA, reln.RefA) 98*ba677afaSXin Li } 99*ba677afaSXin Li expectedRefB := common.DocElementID{ 100*ba677afaSXin Li DocumentRefID: "", 101*ba677afaSXin Li ElementRefID: "Saxon", 102*ba677afaSXin Li } 103*ba677afaSXin Li if !reflect.DeepEqual(expectedRefB, reln.RefB) { 104*ba677afaSXin Li t.Errorf("expected %+v, found %+v", expectedRefB, reln.RefB) 105*ba677afaSXin Li } 106*ba677afaSXin Li 107*ba677afaSXin Li // TestCase 3: invalid package as a relatedElement 108*ba677afaSXin Li parser, _ = parserFromBodyContent(` 109*ba677afaSXin Li <spdx:Relationship> 110*ba677afaSXin Li <spdx:relatedSpdxElement> 111*ba677afaSXin Li <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#Saxon"/> 112*ba677afaSXin Li </spdx:relatedSpdxElement> 113*ba677afaSXin Li </spdx:Relationship> 114*ba677afaSXin Li `) 115*ba677afaSXin Li reln = &v2_3.Relationship{} 116*ba677afaSXin Li triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_PACKAGE)[0] 117*ba677afaSXin Li err = parser.parseRelatedElementFromTriple(reln, triple) 118*ba677afaSXin Li if err == nil { 119*ba677afaSXin Li t.Errorf("expected an error due to invalid Package id, got %v", err) 120*ba677afaSXin Li } 121*ba677afaSXin Li 122*ba677afaSXin Li // TestCase 4: valid File as a related element 123*ba677afaSXin Li parser, _ = parserFromBodyContent(` 124*ba677afaSXin Li <spdx:Relationship> 125*ba677afaSXin Li <spdx:relatedSpdxElement> 126*ba677afaSXin Li <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/> 127*ba677afaSXin Li </spdx:relatedSpdxElement> 128*ba677afaSXin Li </spdx:Relationship> 129*ba677afaSXin Li `) 130*ba677afaSXin Li reln = &v2_3.Relationship{} 131*ba677afaSXin Li triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0] 132*ba677afaSXin Li err = parser.parseRelatedElementFromTriple(reln, triple) 133*ba677afaSXin Li if err != nil { 134*ba677afaSXin Li t.Errorf("error parsing a valid example") 135*ba677afaSXin Li } 136*ba677afaSXin Li expectedRefA = common.DocElementID{ 137*ba677afaSXin Li DocumentRefID: "", 138*ba677afaSXin Li ElementRefID: "", 139*ba677afaSXin Li } 140*ba677afaSXin Li if !reflect.DeepEqual(expectedRefA, reln.RefA) { 141*ba677afaSXin Li t.Errorf("expected %+v, found %+v", expectedRefA, reln.RefA) 142*ba677afaSXin Li } 143*ba677afaSXin Li expectedRefB = common.DocElementID{ 144*ba677afaSXin Li DocumentRefID: "", 145*ba677afaSXin Li ElementRefID: "Saxon", 146*ba677afaSXin Li } 147*ba677afaSXin Li if !reflect.DeepEqual(expectedRefB, reln.RefB) { 148*ba677afaSXin Li t.Errorf("expected %+v, found %+v", expectedRefB, reln.RefB) 149*ba677afaSXin Li } 150*ba677afaSXin Li 151*ba677afaSXin Li // TestCase 5: invalid File as a relatedElement 152*ba677afaSXin Li parser, _ = parserFromBodyContent(` 153*ba677afaSXin Li <spdx:Relationship> 154*ba677afaSXin Li <spdx:relatedSpdxElement> 155*ba677afaSXin Li <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#Saxon"/> 156*ba677afaSXin Li </spdx:relatedSpdxElement> 157*ba677afaSXin Li </spdx:Relationship> 158*ba677afaSXin Li `) 159*ba677afaSXin Li reln = &v2_3.Relationship{} 160*ba677afaSXin Li triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0] 161*ba677afaSXin Li err = parser.parseRelatedElementFromTriple(reln, triple) 162*ba677afaSXin Li if err == nil { 163*ba677afaSXin Li t.Errorf("expected an error while parsing an invalid File, got %v", err) 164*ba677afaSXin Li } 165*ba677afaSXin Li 166*ba677afaSXin Li // TestCase 6: valid SpdxElement as a related element 167*ba677afaSXin Li parser, _ = parserFromBodyContent(` 168*ba677afaSXin Li <spdx:Relationship> 169*ba677afaSXin Li <spdx:relatedSpdxElement> 170*ba677afaSXin Li <spdx:SpdxElement rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File"/> 171*ba677afaSXin Li </spdx:relatedSpdxElement> 172*ba677afaSXin Li </spdx:Relationship> 173*ba677afaSXin Li `) 174*ba677afaSXin Li reln = &v2_3.Relationship{} 175*ba677afaSXin Li triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_SPDX_ELEMENT)[0] 176*ba677afaSXin Li err = parser.parseRelatedElementFromTriple(reln, triple) 177*ba677afaSXin Li if err != nil { 178*ba677afaSXin Li t.Errorf("error parsing a valid example") 179*ba677afaSXin Li } 180*ba677afaSXin Li expectedRefA = common.DocElementID{ 181*ba677afaSXin Li DocumentRefID: "", 182*ba677afaSXin Li ElementRefID: "", 183*ba677afaSXin Li } 184*ba677afaSXin Li if !reflect.DeepEqual(expectedRefA, reln.RefA) { 185*ba677afaSXin Li t.Errorf("expected %+v, found %+v", expectedRefA, reln.RefA) 186*ba677afaSXin Li } 187*ba677afaSXin Li expectedRefB = common.DocElementID{ 188*ba677afaSXin Li DocumentRefID: "", 189*ba677afaSXin Li ElementRefID: "File", 190*ba677afaSXin Li } 191*ba677afaSXin Li if !reflect.DeepEqual(expectedRefB, reln.RefB) { 192*ba677afaSXin Li t.Errorf("expected %+v, found %+v", expectedRefB, reln.RefB) 193*ba677afaSXin Li } 194*ba677afaSXin Li 195*ba677afaSXin Li // TestCase 7: invalid SpdxElement as a related element 196*ba677afaSXin Li parser, _ = parserFromBodyContent(` 197*ba677afaSXin Li <spdx:Relationship> 198*ba677afaSXin Li <spdx:relatedSpdxElement> 199*ba677afaSXin Li <spdx:SpdxElement rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-:File"/> 200*ba677afaSXin Li </spdx:relatedSpdxElement> 201*ba677afaSXin Li </spdx:Relationship> 202*ba677afaSXin Li `) 203*ba677afaSXin Li reln = &v2_3.Relationship{} 204*ba677afaSXin Li triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_SPDX_ELEMENT)[0] 205*ba677afaSXin Li err = parser.parseRelatedElementFromTriple(reln, triple) 206*ba677afaSXin Li if err == nil { 207*ba677afaSXin Li t.Errorf("expected an error due to invalid documentId for SpdxElement, got %v", err) 208*ba677afaSXin Li } 209*ba677afaSXin Li} 210*ba677afaSXin Li 211*ba677afaSXin Lifunc Test_rdfParser2_3_parseRelationship(t *testing.T) { 212*ba677afaSXin Li // TestCase 1: invalid RefA 213*ba677afaSXin Li parser, _ := parserFromBodyContent(` 214*ba677afaSXin Li <spdx:File> 215*ba677afaSXin Li <spdx:relationship> 216*ba677afaSXin Li <spdx:Relationship> 217*ba677afaSXin Li <spdx:relatedSpdxElement> 218*ba677afaSXin Li <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/> 219*ba677afaSXin Li </spdx:relatedSpdxElement> 220*ba677afaSXin Li </spdx:Relationship> 221*ba677afaSXin Li </spdx:relationship> 222*ba677afaSXin Li </spdx:File> 223*ba677afaSXin Li `) 224*ba677afaSXin Li triple := rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0] 225*ba677afaSXin Li err := parser.parseRelationship(triple) 226*ba677afaSXin Li if err == nil { 227*ba677afaSXin Li t.Errorf("should've raised an error due to invalid RefA") 228*ba677afaSXin Li } 229*ba677afaSXin Li 230*ba677afaSXin Li // TestCase 3: invalid RefB 231*ba677afaSXin Li parser, _ = parserFromBodyContent(` 232*ba677afaSXin Li <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File"> 233*ba677afaSXin Li <spdx:relationship> 234*ba677afaSXin Li <spdx:Relationship> 235*ba677afaSXin Li <spdx:relatedSpdxElement> 236*ba677afaSXin Li <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#Saxon"/> 237*ba677afaSXin Li </spdx:relatedSpdxElement> 238*ba677afaSXin Li </spdx:Relationship> 239*ba677afaSXin Li </spdx:relationship> 240*ba677afaSXin Li </spdx:File> 241*ba677afaSXin Li `) 242*ba677afaSXin Li triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0] 243*ba677afaSXin Li err = parser.parseRelationship(triple) 244*ba677afaSXin Li if err == nil { 245*ba677afaSXin Li t.Errorf("should've raised an error due to invalid RefB") 246*ba677afaSXin Li } 247*ba677afaSXin Li 248*ba677afaSXin Li // TestCase 3: more than one typeTriple for relatedElement 249*ba677afaSXin Li parser, _ = parserFromBodyContent(` 250*ba677afaSXin Li <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File"> 251*ba677afaSXin Li <spdx:relationship> 252*ba677afaSXin Li <spdx:Relationship> 253*ba677afaSXin Li <spdx:relatedSpdxElement> 254*ba677afaSXin Li <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/> 255*ba677afaSXin Li </spdx:relatedSpdxElement> 256*ba677afaSXin Li <spdx:relatedSpdxElement> 257*ba677afaSXin Li <spdx:File/> 258*ba677afaSXin Li </spdx:relatedSpdxElement> 259*ba677afaSXin Li </spdx:Relationship> 260*ba677afaSXin Li </spdx:relationship> 261*ba677afaSXin Li </spdx:File> 262*ba677afaSXin Li `) 263*ba677afaSXin Li triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0] 264*ba677afaSXin Li err = parser.parseRelationship(triple) 265*ba677afaSXin Li if err == nil { 266*ba677afaSXin Li t.Errorf("should've raised an error due to more than one type triples") 267*ba677afaSXin Li } 268*ba677afaSXin Li 269*ba677afaSXin Li // TestCase 4: undefined relatedSpdxElement 270*ba677afaSXin Li parser, _ = parserFromBodyContent(` 271*ba677afaSXin Li <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File"> 272*ba677afaSXin Li <spdx:relationship> 273*ba677afaSXin Li <spdx:Relationship> 274*ba677afaSXin Li <spdx:relatedSpdxElement> 275*ba677afaSXin Li <spdx:Unknown rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/> 276*ba677afaSXin Li </spdx:relatedSpdxElement> 277*ba677afaSXin Li </spdx:Relationship> 278*ba677afaSXin Li </spdx:relationship> 279*ba677afaSXin Li </spdx:File> 280*ba677afaSXin Li `) 281*ba677afaSXin Li triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0] 282*ba677afaSXin Li err = parser.parseRelationship(triple) 283*ba677afaSXin Li if err == nil { 284*ba677afaSXin Li t.Errorf("should've raised an error due to unknown relatedElement, got %v", err) 285*ba677afaSXin Li } 286*ba677afaSXin Li 287*ba677afaSXin Li // TestCase 6: relatedElement associated with more than one type 288*ba677afaSXin Li parser, _ = parserFromBodyContent(` 289*ba677afaSXin Li <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File"> 290*ba677afaSXin Li <spdx:relationship> 291*ba677afaSXin Li <spdx:Relationship> 292*ba677afaSXin Li <spdx:relatedSpdxElement> 293*ba677afaSXin Li <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/> 294*ba677afaSXin Li </spdx:relatedSpdxElement> 295*ba677afaSXin Li </spdx:Relationship> 296*ba677afaSXin Li </spdx:relationship> 297*ba677afaSXin Li </spdx:File> 298*ba677afaSXin Li <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/> 299*ba677afaSXin Li `) 300*ba677afaSXin Li triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0] 301*ba677afaSXin Li err = parser.parseRelationship(triple) 302*ba677afaSXin Li if err == nil { 303*ba677afaSXin Li t.Errorf("expected an error due to invalid relatedElement, got %v", err) 304*ba677afaSXin Li } 305*ba677afaSXin Li 306*ba677afaSXin Li // TestCase 5: unknown predicate inside a relationship 307*ba677afaSXin Li parser, _ = parserFromBodyContent(` 308*ba677afaSXin Li <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File"> 309*ba677afaSXin Li <spdx:relationship> 310*ba677afaSXin Li <spdx:Relationship> 311*ba677afaSXin Li <spdx:relatedSpdxElement> 312*ba677afaSXin Li <spdx:Unknown rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/> 313*ba677afaSXin Li </spdx:relatedSpdxElement> 314*ba677afaSXin Li <spdx:unknownPredicate/> 315*ba677afaSXin Li </spdx:Relationship> 316*ba677afaSXin Li </spdx:relationship> 317*ba677afaSXin Li </spdx:File> 318*ba677afaSXin Li `) 319*ba677afaSXin Li triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0] 320*ba677afaSXin Li err = parser.parseRelationship(triple) 321*ba677afaSXin Li if err == nil { 322*ba677afaSXin Li t.Errorf("should've raised an error due to unknown predicate in a relationship") 323*ba677afaSXin Li } 324*ba677afaSXin Li 325*ba677afaSXin Li // TestCase 8: Recursive relationships mustn't raise any error: 326*ba677afaSXin Li parser, _ = parserFromBodyContent(` 327*ba677afaSXin Li <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File"> 328*ba677afaSXin Li <spdx:relationship> 329*ba677afaSXin Li <spdx:Relationship rdf:about="#SPDXRef-reln"> 330*ba677afaSXin Li <spdx:relationshipType rdf:resource="http://spdx.org/rdf/terms#relationshipType_describes"/> 331*ba677afaSXin Li <spdx:relatedSpdxElement> 332*ba677afaSXin Li <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"> 333*ba677afaSXin Li <spdx:relationship> 334*ba677afaSXin Li <spdx:Relationship rdf:about="#SPDXRef-reln"> 335*ba677afaSXin Li <spdx:relationshipType rdf:resource="http://spdx.org/rdf/terms#relationshipType_describes"/> 336*ba677afaSXin Li <spdx:relatedSpdxElement rdf:resource="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File"/> 337*ba677afaSXin Li </spdx:Relationship> 338*ba677afaSXin Li </spdx:relationship> 339*ba677afaSXin Li </spdx:Package> 340*ba677afaSXin Li </spdx:relatedSpdxElement> 341*ba677afaSXin Li </spdx:Relationship> 342*ba677afaSXin Li </spdx:relationship> 343*ba677afaSXin Li </spdx:File> 344*ba677afaSXin Li `) 345*ba677afaSXin Li triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0] 346*ba677afaSXin Li err = parser.parseRelationship(triple) 347*ba677afaSXin Li if err != nil { 348*ba677afaSXin Li t.Errorf("error parsing a valid example") 349*ba677afaSXin Li } 350*ba677afaSXin Li 351*ba677afaSXin Li // TestCase 7: completely valid example: 352*ba677afaSXin Li parser, _ = parserFromBodyContent(` 353*ba677afaSXin Li <spdx:File rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-File"> 354*ba677afaSXin Li <spdx:relationship> 355*ba677afaSXin Li <spdx:Relationship> 356*ba677afaSXin Li <spdx:relationshipType rdf:resource="http://spdx.org/rdf/terms#relationshipType_describes"/> 357*ba677afaSXin Li <spdx:relatedSpdxElement> 358*ba677afaSXin Li <spdx:Package rdf:about="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Saxon"/> 359*ba677afaSXin Li </spdx:relatedSpdxElement> 360*ba677afaSXin Li <rdfs:comment>comment</rdfs:comment> 361*ba677afaSXin Li </spdx:Relationship> 362*ba677afaSXin Li </spdx:relationship> 363*ba677afaSXin Li </spdx:File> 364*ba677afaSXin Li `) 365*ba677afaSXin Li triple = rdfwriter.FilterTriples(parser.gordfParserObj.Triples, nil, &SPDX_RELATIONSHIP, nil)[0] 366*ba677afaSXin Li err = parser.parseRelationship(triple) 367*ba677afaSXin Li if err != nil { 368*ba677afaSXin Li t.Errorf("unexpected error parsing a valid relationship: %v", err) 369*ba677afaSXin Li } 370*ba677afaSXin Li // validating parsed attributes 371*ba677afaSXin Li if len(parser.doc.Relationships) != 1 { 372*ba677afaSXin Li t.Errorf("after parsing a valid relationship, doc should've had 1 relationship, found %d", len(parser.doc.Relationships)) 373*ba677afaSXin Li } 374*ba677afaSXin Li reln := parser.doc.Relationships[0] 375*ba677afaSXin Li expectedRelnType := "describes" 376*ba677afaSXin Li if reln.Relationship != expectedRelnType { 377*ba677afaSXin Li t.Errorf("expected %s, found %s", expectedRelnType, reln.Relationship) 378*ba677afaSXin Li } 379*ba677afaSXin Li expectedRefA := common.DocElementID{ 380*ba677afaSXin Li DocumentRefID: "", 381*ba677afaSXin Li ElementRefID: "File", 382*ba677afaSXin Li } 383*ba677afaSXin Li if !reflect.DeepEqual(expectedRefA, reln.RefA) { 384*ba677afaSXin Li t.Errorf("expected %+v, found %+v", expectedRefA, reln.RefA) 385*ba677afaSXin Li } 386*ba677afaSXin Li expectedRefB := common.DocElementID{ 387*ba677afaSXin Li DocumentRefID: "", 388*ba677afaSXin Li ElementRefID: "Saxon", 389*ba677afaSXin Li } 390*ba677afaSXin Li if !reflect.DeepEqual(expectedRefB, reln.RefB) { 391*ba677afaSXin Li t.Errorf("expected %+v, found %+v", expectedRefB, reln.RefB) 392*ba677afaSXin Li } 393*ba677afaSXin Li expectedComment := "comment" 394*ba677afaSXin Li if reln.RelationshipComment != expectedComment { 395*ba677afaSXin Li t.Errorf("expected %v, found %v", expectedComment, reln.RelationshipComment) 396*ba677afaSXin Li } 397*ba677afaSXin Li} 398