xref: /aosp_15_r20/external/spdx-tools/tvloader/parser2v2/parse_relationship_test.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
2*ba677afaSXin Lipackage parser2v2
3*ba677afaSXin Li
4*ba677afaSXin Liimport (
5*ba677afaSXin Li	"testing"
6*ba677afaSXin Li
7*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/v2_2"
8*ba677afaSXin Li)
9*ba677afaSXin Li
10*ba677afaSXin Li// ===== Relationship section tests =====
11*ba677afaSXin Lifunc TestParser2_2FailsIfRelationshipNotSet(t *testing.T) {
12*ba677afaSXin Li	parser := tvParser2_2{
13*ba677afaSXin Li		doc: &v2_2.Document{},
14*ba677afaSXin Li		st:  psCreationInfo2_2,
15*ba677afaSXin Li	}
16*ba677afaSXin Li	err := parser.parsePairForRelationship2_2("Relationship", "SPDXRef-A CONTAINS SPDXRef-B")
17*ba677afaSXin Li	if err == nil {
18*ba677afaSXin Li		t.Errorf("expected error when calling parsePairFromRelationship2_2 without setting rln pointer")
19*ba677afaSXin Li	}
20*ba677afaSXin Li}
21*ba677afaSXin Li
22*ba677afaSXin Lifunc TestParser2_2FailsIfRelationshipCommentWithoutRelationship(t *testing.T) {
23*ba677afaSXin Li	parser := tvParser2_2{
24*ba677afaSXin Li		doc: &v2_2.Document{},
25*ba677afaSXin Li		st:  psCreationInfo2_2,
26*ba677afaSXin Li	}
27*ba677afaSXin Li	err := parser.parsePair2_2("RelationshipComment", "comment whatever")
28*ba677afaSXin Li	if err == nil {
29*ba677afaSXin Li		t.Errorf("expected error when calling parsePair2_2 for RelationshipComment without Relationship first")
30*ba677afaSXin Li	}
31*ba677afaSXin Li}
32*ba677afaSXin Li
33*ba677afaSXin Lifunc TestParser2_2CanParseRelationshipTags(t *testing.T) {
34*ba677afaSXin Li	parser := tvParser2_2{
35*ba677afaSXin Li		doc: &v2_2.Document{},
36*ba677afaSXin Li		st:  psCreationInfo2_2,
37*ba677afaSXin Li	}
38*ba677afaSXin Li
39*ba677afaSXin Li	// Relationship
40*ba677afaSXin Li	err := parser.parsePair2_2("Relationship", "SPDXRef-something CONTAINS DocumentRef-otherdoc:SPDXRef-something-else")
41*ba677afaSXin Li	if err != nil {
42*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
43*ba677afaSXin Li	}
44*ba677afaSXin Li	if parser.rln.RefA.DocumentRefID != "" || parser.rln.RefA.ElementRefID != "something" {
45*ba677afaSXin Li		t.Errorf("got %v for first part of Relationship, expected something", parser.rln.RefA)
46*ba677afaSXin Li	}
47*ba677afaSXin Li	if parser.rln.RefB.DocumentRefID != "otherdoc" || parser.rln.RefB.ElementRefID != "something-else" {
48*ba677afaSXin Li		t.Errorf("got %v for second part of Relationship, expected otherdoc:something-else", parser.rln.RefB)
49*ba677afaSXin Li	}
50*ba677afaSXin Li	if parser.rln.Relationship != "CONTAINS" {
51*ba677afaSXin Li		t.Errorf("got %v for Relationship type, expected CONTAINS", parser.rln.Relationship)
52*ba677afaSXin Li	}
53*ba677afaSXin Li
54*ba677afaSXin Li	// Relationship Comment
55*ba677afaSXin Li	cmt := "this is a comment"
56*ba677afaSXin Li	err = parser.parsePair2_2("RelationshipComment", cmt)
57*ba677afaSXin Li	if err != nil {
58*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
59*ba677afaSXin Li	}
60*ba677afaSXin Li	if parser.rln.RelationshipComment != cmt {
61*ba677afaSXin Li		t.Errorf("got %v for RelationshipComment, expected %v", parser.rln.RelationshipComment, cmt)
62*ba677afaSXin Li	}
63*ba677afaSXin Li}
64*ba677afaSXin Li
65*ba677afaSXin Lifunc TestParser2_2InvalidRelationshipTagsNoValueFail(t *testing.T) {
66*ba677afaSXin Li	parser := tvParser2_2{
67*ba677afaSXin Li		doc: &v2_2.Document{},
68*ba677afaSXin Li		st:  psCreationInfo2_2,
69*ba677afaSXin Li	}
70*ba677afaSXin Li
71*ba677afaSXin Li	// no items
72*ba677afaSXin Li	parser.rln = nil
73*ba677afaSXin Li	err := parser.parsePair2_2("Relationship", "")
74*ba677afaSXin Li	if err == nil {
75*ba677afaSXin Li		t.Errorf("expected error for empty items in relationship, got nil")
76*ba677afaSXin Li	}
77*ba677afaSXin Li}
78*ba677afaSXin Li
79*ba677afaSXin Lifunc TestParser2_2InvalidRelationshipTagsOneValueFail(t *testing.T) {
80*ba677afaSXin Li	parser := tvParser2_2{
81*ba677afaSXin Li		doc: &v2_2.Document{},
82*ba677afaSXin Li		st:  psCreationInfo2_2,
83*ba677afaSXin Li	}
84*ba677afaSXin Li
85*ba677afaSXin Li	// one item
86*ba677afaSXin Li	parser.rln = nil
87*ba677afaSXin Li	err := parser.parsePair2_2("Relationship", "DESCRIBES")
88*ba677afaSXin Li	if err == nil {
89*ba677afaSXin Li		t.Errorf("expected error for only one item in relationship, got nil")
90*ba677afaSXin Li	}
91*ba677afaSXin Li}
92*ba677afaSXin Li
93*ba677afaSXin Lifunc TestParser2_2InvalidRelationshipTagsTwoValuesFail(t *testing.T) {
94*ba677afaSXin Li	parser := tvParser2_2{
95*ba677afaSXin Li		doc: &v2_2.Document{},
96*ba677afaSXin Li		st:  psCreationInfo2_2,
97*ba677afaSXin Li	}
98*ba677afaSXin Li
99*ba677afaSXin Li	// two items
100*ba677afaSXin Li	parser.rln = nil
101*ba677afaSXin Li	err := parser.parsePair2_2("Relationship", "SPDXRef-DOCUMENT DESCRIBES")
102*ba677afaSXin Li	if err == nil {
103*ba677afaSXin Li		t.Errorf("expected error for only two items in relationship, got nil")
104*ba677afaSXin Li	}
105*ba677afaSXin Li}
106*ba677afaSXin Li
107*ba677afaSXin Lifunc TestParser2_2InvalidRelationshipTagsThreeValuesSucceed(t *testing.T) {
108*ba677afaSXin Li	parser := tvParser2_2{
109*ba677afaSXin Li		doc: &v2_2.Document{},
110*ba677afaSXin Li		st:  psCreationInfo2_2,
111*ba677afaSXin Li	}
112*ba677afaSXin Li
113*ba677afaSXin Li	// three items but with interspersed additional whitespace
114*ba677afaSXin Li	parser.rln = nil
115*ba677afaSXin Li	err := parser.parsePair2_2("Relationship", "  SPDXRef-DOCUMENT \t   DESCRIBES  SPDXRef-something-else    ")
116*ba677afaSXin Li	if err != nil {
117*ba677afaSXin Li		t.Errorf("expected pass for three items in relationship w/ extra whitespace, got: %v", err)
118*ba677afaSXin Li	}
119*ba677afaSXin Li}
120*ba677afaSXin Li
121*ba677afaSXin Lifunc TestParser2_2InvalidRelationshipTagsFourValuesFail(t *testing.T) {
122*ba677afaSXin Li	parser := tvParser2_2{
123*ba677afaSXin Li		doc: &v2_2.Document{},
124*ba677afaSXin Li		st:  psCreationInfo2_2,
125*ba677afaSXin Li	}
126*ba677afaSXin Li
127*ba677afaSXin Li	// four items
128*ba677afaSXin Li	parser.rln = nil
129*ba677afaSXin Li	err := parser.parsePair2_2("Relationship", "SPDXRef-a DESCRIBES SPDXRef-b SPDXRef-c")
130*ba677afaSXin Li	if err == nil {
131*ba677afaSXin Li		t.Errorf("expected error for more than three items in relationship, got nil")
132*ba677afaSXin Li	}
133*ba677afaSXin Li}
134*ba677afaSXin Li
135*ba677afaSXin Lifunc TestParser2_2InvalidRelationshipTagsInvalidRefIDs(t *testing.T) {
136*ba677afaSXin Li	parser := tvParser2_2{
137*ba677afaSXin Li		doc: &v2_2.Document{},
138*ba677afaSXin Li		st:  psCreationInfo2_2,
139*ba677afaSXin Li	}
140*ba677afaSXin Li
141*ba677afaSXin Li	// four items
142*ba677afaSXin Li	parser.rln = nil
143*ba677afaSXin Li	err := parser.parsePair2_2("Relationship", "SPDXRef-a DESCRIBES b")
144*ba677afaSXin Li	if err == nil {
145*ba677afaSXin Li		t.Errorf("expected error for missing SPDXRef- prefix, got nil")
146*ba677afaSXin Li	}
147*ba677afaSXin Li
148*ba677afaSXin Li	parser.rln = nil
149*ba677afaSXin Li	err = parser.parsePair2_2("Relationship", "a DESCRIBES SPDXRef-b")
150*ba677afaSXin Li	if err == nil {
151*ba677afaSXin Li		t.Errorf("expected error for missing SPDXRef- prefix, got nil")
152*ba677afaSXin Li	}
153*ba677afaSXin Li}
154*ba677afaSXin Li
155*ba677afaSXin Lifunc TestParser2_2SpecialValuesValidForRightSideOfRelationship(t *testing.T) {
156*ba677afaSXin Li	parser := tvParser2_2{
157*ba677afaSXin Li		doc: &v2_2.Document{},
158*ba677afaSXin Li		st:  psCreationInfo2_2,
159*ba677afaSXin Li	}
160*ba677afaSXin Li
161*ba677afaSXin Li	// NONE in right side of relationship should pass
162*ba677afaSXin Li	err := parser.parsePair2_2("Relationship", "SPDXRef-a CONTAINS NONE")
163*ba677afaSXin Li	if err != nil {
164*ba677afaSXin Li		t.Errorf("expected nil error for CONTAINS NONE, got %v", err)
165*ba677afaSXin Li	}
166*ba677afaSXin Li
167*ba677afaSXin Li	// NOASSERTION in right side of relationship should pass
168*ba677afaSXin Li	err = parser.parsePair2_2("Relationship", "SPDXRef-a CONTAINS NOASSERTION")
169*ba677afaSXin Li	if err != nil {
170*ba677afaSXin Li		t.Errorf("expected nil error for CONTAINS NOASSERTION, got %v", err)
171*ba677afaSXin Li	}
172*ba677afaSXin Li
173*ba677afaSXin Li	// NONE in left side of relationship should fail
174*ba677afaSXin Li	err = parser.parsePair2_2("Relationship", "NONE CONTAINS SPDXRef-a")
175*ba677afaSXin Li	if err == nil {
176*ba677afaSXin Li		t.Errorf("expected non-nil error for NONE CONTAINS, got nil")
177*ba677afaSXin Li	}
178*ba677afaSXin Li
179*ba677afaSXin Li	// NOASSERTION in left side of relationship should fail
180*ba677afaSXin Li	err = parser.parsePair2_2("Relationship", "NOASSERTION CONTAINS SPDXRef-a")
181*ba677afaSXin Li	if err == nil {
182*ba677afaSXin Li		t.Errorf("expected non-nil error for NOASSERTION CONTAINS, got nil")
183*ba677afaSXin Li	}
184*ba677afaSXin Li}
185*ba677afaSXin Li
186*ba677afaSXin Lifunc TestParser2_2FailsToParseUnknownTagInRelationshipSection(t *testing.T) {
187*ba677afaSXin Li	parser := tvParser2_2{
188*ba677afaSXin Li		doc: &v2_2.Document{},
189*ba677afaSXin Li		st:  psCreationInfo2_2,
190*ba677afaSXin Li	}
191*ba677afaSXin Li
192*ba677afaSXin Li	// Relationship
193*ba677afaSXin Li	err := parser.parsePair2_2("Relationship", "SPDXRef-something CONTAINS DocumentRef-otherdoc:SPDXRef-something-else")
194*ba677afaSXin Li	if err != nil {
195*ba677afaSXin Li		t.Errorf("expected nil error, got %v", err)
196*ba677afaSXin Li	}
197*ba677afaSXin Li	// invalid tag
198*ba677afaSXin Li	err = parser.parsePairForRelationship2_2("blah", "whoops")
199*ba677afaSXin Li	if err == nil {
200*ba677afaSXin Li		t.Errorf("expected non-nil error, got nil")
201*ba677afaSXin Li	}
202*ba677afaSXin Li}
203