xref: /aosp_15_r20/external/spdx-tools/spdx/common/identifier_test.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
1*ba677afaSXin Lipackage common
2*ba677afaSXin Li
3*ba677afaSXin Liimport (
4*ba677afaSXin Li	"encoding/json"
5*ba677afaSXin Li	"fmt"
6*ba677afaSXin Li	"reflect"
7*ba677afaSXin Li	"strings"
8*ba677afaSXin Li	"testing"
9*ba677afaSXin Li)
10*ba677afaSXin Li
11*ba677afaSXin Lifunc Test_DocElementIDEncoding(t *testing.T) {
12*ba677afaSXin Li	tests := []struct {
13*ba677afaSXin Li		name     string
14*ba677afaSXin Li		value    DocElementID
15*ba677afaSXin Li		expected string
16*ba677afaSXin Li		err      bool
17*ba677afaSXin Li	}{
18*ba677afaSXin Li		{
19*ba677afaSXin Li			name: "ElementRefID",
20*ba677afaSXin Li			value: DocElementID{
21*ba677afaSXin Li				ElementRefID: "some-id",
22*ba677afaSXin Li			},
23*ba677afaSXin Li			expected: "SPDXRef-some-id",
24*ba677afaSXin Li		},
25*ba677afaSXin Li		{
26*ba677afaSXin Li			name: "DocumentRefID:ElementRefID",
27*ba677afaSXin Li			value: DocElementID{
28*ba677afaSXin Li				DocumentRefID: "a-doc",
29*ba677afaSXin Li				ElementRefID:  "some-id",
30*ba677afaSXin Li			},
31*ba677afaSXin Li			expected: "DocumentRef-a-doc:SPDXRef-some-id",
32*ba677afaSXin Li		},
33*ba677afaSXin Li		{
34*ba677afaSXin Li			name: "DocumentRefID no ElementRefID",
35*ba677afaSXin Li			value: DocElementID{
36*ba677afaSXin Li				DocumentRefID: "a-doc",
37*ba677afaSXin Li			},
38*ba677afaSXin Li			err: true,
39*ba677afaSXin Li		},
40*ba677afaSXin Li		{
41*ba677afaSXin Li			name: "SpecialID",
42*ba677afaSXin Li			value: DocElementID{
43*ba677afaSXin Li				SpecialID: "special-id",
44*ba677afaSXin Li			},
45*ba677afaSXin Li			expected: "special-id",
46*ba677afaSXin Li		},
47*ba677afaSXin Li	}
48*ba677afaSXin Li
49*ba677afaSXin Li	for _, test := range tests {
50*ba677afaSXin Li		t.Run(test.name, func(t *testing.T) {
51*ba677afaSXin Li			result, err := json.Marshal(test.value)
52*ba677afaSXin Li			switch {
53*ba677afaSXin Li			case !test.err && err != nil:
54*ba677afaSXin Li				t.Fatalf("unexpected error: %v", err)
55*ba677afaSXin Li			case test.err && err == nil:
56*ba677afaSXin Li				t.Fatalf("expected error but got none")
57*ba677afaSXin Li			case test.err:
58*ba677afaSXin Li				return
59*ba677afaSXin Li			}
60*ba677afaSXin Li			s := string(result)
61*ba677afaSXin Li			if !strings.HasPrefix(s, `"`) || !strings.HasSuffix(s, `"`) {
62*ba677afaSXin Li				t.Fatalf("string was not returned: %s", s)
63*ba677afaSXin Li			}
64*ba677afaSXin Li			s = strings.Trim(s, `"`)
65*ba677afaSXin Li			if test.expected != s {
66*ba677afaSXin Li				t.Fatalf("%s != %s", test.expected, s)
67*ba677afaSXin Li			}
68*ba677afaSXin Li		})
69*ba677afaSXin Li	}
70*ba677afaSXin Li}
71*ba677afaSXin Li
72*ba677afaSXin Lifunc Test_DocElementIDDecoding(t *testing.T) {
73*ba677afaSXin Li	tests := []struct {
74*ba677afaSXin Li		name     string
75*ba677afaSXin Li		value    string
76*ba677afaSXin Li		expected DocElementID
77*ba677afaSXin Li		err      bool
78*ba677afaSXin Li	}{
79*ba677afaSXin Li		{
80*ba677afaSXin Li			name:  "ElementRefID",
81*ba677afaSXin Li			value: "SPDXRef-some-id",
82*ba677afaSXin Li			expected: DocElementID{
83*ba677afaSXin Li				ElementRefID: "some-id",
84*ba677afaSXin Li			},
85*ba677afaSXin Li		},
86*ba677afaSXin Li		{
87*ba677afaSXin Li			name:  "DocumentRefID:ElementRefID",
88*ba677afaSXin Li			value: "DocumentRef-a-doc:SPDXRef-some-id",
89*ba677afaSXin Li			expected: DocElementID{
90*ba677afaSXin Li				DocumentRefID: "a-doc",
91*ba677afaSXin Li				ElementRefID:  "some-id",
92*ba677afaSXin Li			},
93*ba677afaSXin Li		},
94*ba677afaSXin Li		{
95*ba677afaSXin Li			name:  "DocumentRefID no ElementRefID",
96*ba677afaSXin Li			value: "DocumentRef-a-doc",
97*ba677afaSXin Li			expected: DocElementID{
98*ba677afaSXin Li				DocumentRefID: "a-doc",
99*ba677afaSXin Li			},
100*ba677afaSXin Li		},
101*ba677afaSXin Li		{
102*ba677afaSXin Li			name:  "DocumentRefID invalid ElementRefID",
103*ba677afaSXin Li			value: "DocumentRef-a-doc:invalid",
104*ba677afaSXin Li			err:   true,
105*ba677afaSXin Li		},
106*ba677afaSXin Li		{
107*ba677afaSXin Li			name:  "invalid format",
108*ba677afaSXin Li			value: "some-id-without-spdxref",
109*ba677afaSXin Li			err:   true,
110*ba677afaSXin Li		},
111*ba677afaSXin Li		{
112*ba677afaSXin Li			name:  "SpecialID NONE",
113*ba677afaSXin Li			value: "NONE",
114*ba677afaSXin Li			expected: DocElementID{
115*ba677afaSXin Li				SpecialID: "NONE",
116*ba677afaSXin Li			},
117*ba677afaSXin Li		},
118*ba677afaSXin Li		{
119*ba677afaSXin Li			name:  "SpecialID NOASSERTION",
120*ba677afaSXin Li			value: "NOASSERTION",
121*ba677afaSXin Li			expected: DocElementID{
122*ba677afaSXin Li				SpecialID: "NOASSERTION",
123*ba677afaSXin Li			},
124*ba677afaSXin Li		},
125*ba677afaSXin Li	}
126*ba677afaSXin Li
127*ba677afaSXin Li	for _, test := range tests {
128*ba677afaSXin Li		t.Run(test.name, func(t *testing.T) {
129*ba677afaSXin Li			out := DocElementID{}
130*ba677afaSXin Li			s := fmt.Sprintf(`"%s"`, test.value)
131*ba677afaSXin Li			err := json.Unmarshal([]byte(s), &out)
132*ba677afaSXin Li			switch {
133*ba677afaSXin Li			case !test.err && err != nil:
134*ba677afaSXin Li				t.Fatalf("unexpected error: %v", err)
135*ba677afaSXin Li			case test.err && err == nil:
136*ba677afaSXin Li				t.Fatalf("expected error but got none")
137*ba677afaSXin Li			case test.err:
138*ba677afaSXin Li				return
139*ba677afaSXin Li			}
140*ba677afaSXin Li			if !reflect.DeepEqual(test.expected, out) {
141*ba677afaSXin Li				t.Fatalf("unexpected value: %v != %v", test.expected, out)
142*ba677afaSXin Li			}
143*ba677afaSXin Li		})
144*ba677afaSXin Li	}
145*ba677afaSXin Li}
146*ba677afaSXin Li
147*ba677afaSXin Lifunc Test_ElementIDEncoding(t *testing.T) {
148*ba677afaSXin Li	tests := []struct {
149*ba677afaSXin Li		name     string
150*ba677afaSXin Li		value    ElementID
151*ba677afaSXin Li		expected string
152*ba677afaSXin Li		err      bool
153*ba677afaSXin Li	}{
154*ba677afaSXin Li		{
155*ba677afaSXin Li			name:     "appends spdxref",
156*ba677afaSXin Li			value:    ElementID("some-id"),
157*ba677afaSXin Li			expected: "SPDXRef-some-id",
158*ba677afaSXin Li		},
159*ba677afaSXin Li		{
160*ba677afaSXin Li			name:     "appends spdxref",
161*ba677afaSXin Li			value:    ElementID("SPDXRef-some-id"),
162*ba677afaSXin Li			expected: "SPDXRef-some-id",
163*ba677afaSXin Li		},
164*ba677afaSXin Li	}
165*ba677afaSXin Li
166*ba677afaSXin Li	for _, test := range tests {
167*ba677afaSXin Li		t.Run(test.name, func(t *testing.T) {
168*ba677afaSXin Li			result, err := json.Marshal(test.value)
169*ba677afaSXin Li			switch {
170*ba677afaSXin Li			case !test.err && err != nil:
171*ba677afaSXin Li				t.Fatalf("unexpected error: %v", err)
172*ba677afaSXin Li			case test.err && err == nil:
173*ba677afaSXin Li				t.Fatalf("expected error but got none")
174*ba677afaSXin Li			case test.err:
175*ba677afaSXin Li				return
176*ba677afaSXin Li			}
177*ba677afaSXin Li			s := string(result)
178*ba677afaSXin Li			if !strings.HasPrefix(s, `"`) || !strings.HasSuffix(s, `"`) {
179*ba677afaSXin Li				t.Fatalf("string was not returned: %s", s)
180*ba677afaSXin Li			}
181*ba677afaSXin Li			s = strings.Trim(s, `"`)
182*ba677afaSXin Li			if test.expected != s {
183*ba677afaSXin Li				t.Fatalf("%s != %s", test.expected, s)
184*ba677afaSXin Li			}
185*ba677afaSXin Li		})
186*ba677afaSXin Li	}
187*ba677afaSXin Li}
188*ba677afaSXin Li
189*ba677afaSXin Lifunc Test_ElementIDDecoding(t *testing.T) {
190*ba677afaSXin Li	tests := []struct {
191*ba677afaSXin Li		name     string
192*ba677afaSXin Li		value    string
193*ba677afaSXin Li		expected ElementID
194*ba677afaSXin Li		err      bool
195*ba677afaSXin Li	}{
196*ba677afaSXin Li		{
197*ba677afaSXin Li			name:     "valid id",
198*ba677afaSXin Li			value:    "SPDXRef-some-id",
199*ba677afaSXin Li			expected: ElementID("some-id"),
200*ba677afaSXin Li		},
201*ba677afaSXin Li		{
202*ba677afaSXin Li			name:  "invalid format",
203*ba677afaSXin Li			value: "some-id-without-spdxref",
204*ba677afaSXin Li			err:   true,
205*ba677afaSXin Li		},
206*ba677afaSXin Li	}
207*ba677afaSXin Li
208*ba677afaSXin Li	for _, test := range tests {
209*ba677afaSXin Li		t.Run(test.name, func(t *testing.T) {
210*ba677afaSXin Li			var out ElementID
211*ba677afaSXin Li			s := fmt.Sprintf(`"%s"`, test.value)
212*ba677afaSXin Li			err := json.Unmarshal([]byte(s), &out)
213*ba677afaSXin Li			switch {
214*ba677afaSXin Li			case !test.err && err != nil:
215*ba677afaSXin Li				t.Fatalf("unexpected error: %v", err)
216*ba677afaSXin Li			case test.err && err == nil:
217*ba677afaSXin Li				t.Fatalf("expected error but got none")
218*ba677afaSXin Li			case test.err:
219*ba677afaSXin Li				return
220*ba677afaSXin Li			}
221*ba677afaSXin Li			if !reflect.DeepEqual(test.expected, out) {
222*ba677afaSXin Li				t.Fatalf("unexpected value: %v != %v", test.expected, out)
223*ba677afaSXin Li			}
224*ba677afaSXin Li		})
225*ba677afaSXin Li	}
226*ba677afaSXin Li}
227*ba677afaSXin Li
228*ba677afaSXin Lifunc Test_ElementIDStructEncoding(t *testing.T) {
229*ba677afaSXin Li	type typ struct {
230*ba677afaSXin Li		Id ElementID `json:"id"`
231*ba677afaSXin Li	}
232*ba677afaSXin Li	tests := []struct {
233*ba677afaSXin Li		name     string
234*ba677afaSXin Li		value    typ
235*ba677afaSXin Li		expected string
236*ba677afaSXin Li		err      bool
237*ba677afaSXin Li	}{
238*ba677afaSXin Li		{
239*ba677afaSXin Li			name: "appends spdxref",
240*ba677afaSXin Li			value: typ{
241*ba677afaSXin Li				Id: ElementID("some-id"),
242*ba677afaSXin Li			},
243*ba677afaSXin Li			expected: `{"id":"SPDXRef-some-id"}`,
244*ba677afaSXin Li		},
245*ba677afaSXin Li		{
246*ba677afaSXin Li			name: "appends spdxref",
247*ba677afaSXin Li			value: typ{
248*ba677afaSXin Li				Id: ElementID("SPDXRef-some-id"),
249*ba677afaSXin Li			},
250*ba677afaSXin Li			expected: `{"id":"SPDXRef-some-id"}`,
251*ba677afaSXin Li		},
252*ba677afaSXin Li	}
253*ba677afaSXin Li
254*ba677afaSXin Li	for _, test := range tests {
255*ba677afaSXin Li		t.Run(test.name, func(t *testing.T) {
256*ba677afaSXin Li			result, err := json.Marshal(test.value)
257*ba677afaSXin Li			switch {
258*ba677afaSXin Li			case !test.err && err != nil:
259*ba677afaSXin Li				t.Fatalf("unexpected error: %v", err)
260*ba677afaSXin Li			case test.err && err == nil:
261*ba677afaSXin Li				t.Fatalf("expected error but got none")
262*ba677afaSXin Li			case test.err:
263*ba677afaSXin Li				return
264*ba677afaSXin Li			}
265*ba677afaSXin Li			s := string(result)
266*ba677afaSXin Li			if test.expected != s {
267*ba677afaSXin Li				t.Fatalf("%s != %s", test.expected, s)
268*ba677afaSXin Li			}
269*ba677afaSXin Li		})
270*ba677afaSXin Li	}
271*ba677afaSXin Li}
272*ba677afaSXin Li
273*ba677afaSXin Lifunc Test_ElementIDStructDecoding(t *testing.T) {
274*ba677afaSXin Li	type typ struct {
275*ba677afaSXin Li		Id ElementID `json:"id"`
276*ba677afaSXin Li	}
277*ba677afaSXin Li	tests := []struct {
278*ba677afaSXin Li		name     string
279*ba677afaSXin Li		value    string
280*ba677afaSXin Li		expected typ
281*ba677afaSXin Li		err      bool
282*ba677afaSXin Li	}{
283*ba677afaSXin Li		{
284*ba677afaSXin Li			name: "valid id",
285*ba677afaSXin Li			expected: typ{
286*ba677afaSXin Li				Id: ElementID("some-id"),
287*ba677afaSXin Li			},
288*ba677afaSXin Li			value: `{"id":"SPDXRef-some-id"}`,
289*ba677afaSXin Li		},
290*ba677afaSXin Li		{
291*ba677afaSXin Li			name:  "invalid format",
292*ba677afaSXin Li			value: `{"id":"some-id"}`,
293*ba677afaSXin Li			err:   true,
294*ba677afaSXin Li		},
295*ba677afaSXin Li	}
296*ba677afaSXin Li
297*ba677afaSXin Li	for _, test := range tests {
298*ba677afaSXin Li		t.Run(test.name, func(t *testing.T) {
299*ba677afaSXin Li			out := typ{}
300*ba677afaSXin Li			err := json.Unmarshal([]byte(test.value), &out)
301*ba677afaSXin Li			switch {
302*ba677afaSXin Li			case !test.err && err != nil:
303*ba677afaSXin Li				t.Fatalf("unexpected error: %v", err)
304*ba677afaSXin Li			case test.err && err == nil:
305*ba677afaSXin Li				t.Fatalf("expected error but got none")
306*ba677afaSXin Li			case test.err:
307*ba677afaSXin Li				return
308*ba677afaSXin Li			}
309*ba677afaSXin Li			if !reflect.DeepEqual(test.expected, out) {
310*ba677afaSXin Li				t.Fatalf("unexpected value: %v != %v", test.expected, out)
311*ba677afaSXin Li			}
312*ba677afaSXin Li		})
313*ba677afaSXin Li	}
314*ba677afaSXin Li}
315