xref: /aosp_15_r20/external/spdx-tools/rdfloader/parser2v3/parse_relationship_test.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
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