xref: /aosp_15_r20/external/spdx-tools/idsearcher/idsearcher_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 idsearcher
4*ba677afaSXin Li
5*ba677afaSXin Liimport (
6*ba677afaSXin Li	"testing"
7*ba677afaSXin Li)
8*ba677afaSXin Li
9*ba677afaSXin Li// ===== 2.1 Searcher top-level function tests =====
10*ba677afaSXin Lifunc Test2_1SearcherCanFillInIDs(t *testing.T) {
11*ba677afaSXin Li	packageName := "project2"
12*ba677afaSXin Li	dirRoot := "../testdata/project2/"
13*ba677afaSXin Li	config := &Config2_1{
14*ba677afaSXin Li		NamespacePrefix: "https://github.com/swinslow/spdx-docs/spdx-go/testdata-",
15*ba677afaSXin Li	}
16*ba677afaSXin Li
17*ba677afaSXin Li	doc, err := BuildIDsDocument2_1(packageName, dirRoot, config)
18*ba677afaSXin Li	if err != nil {
19*ba677afaSXin Li		t.Fatalf("expected nil error, got %v", err)
20*ba677afaSXin Li	}
21*ba677afaSXin Li	if doc == nil {
22*ba677afaSXin Li		t.Fatalf("expected non-nil Document, got nil")
23*ba677afaSXin Li	}
24*ba677afaSXin Li
25*ba677afaSXin Li	// not checking all contents of doc, see builder tests for those
26*ba677afaSXin Li
27*ba677afaSXin Li	// get the package and its files, checking size of each
28*ba677afaSXin Li	if doc.Packages == nil {
29*ba677afaSXin Li		t.Fatalf("expected non-nil Packages, got nil")
30*ba677afaSXin Li	}
31*ba677afaSXin Li	if len(doc.Packages) != 1 {
32*ba677afaSXin Li		t.Fatalf("expected Packages len to be 1, got %d", len(doc.Packages))
33*ba677afaSXin Li	}
34*ba677afaSXin Li	pkg := doc.Packages[0]
35*ba677afaSXin Li	if pkg == nil {
36*ba677afaSXin Li		t.Fatalf("expected non-nil pkg, got nil")
37*ba677afaSXin Li	}
38*ba677afaSXin Li
39*ba677afaSXin Li	if pkg.Files == nil {
40*ba677afaSXin Li		t.Fatalf("expected non-nil Files, got nil")
41*ba677afaSXin Li	}
42*ba677afaSXin Li	if len(pkg.Files) != 6 {
43*ba677afaSXin Li		t.Fatalf("expected Files len to be 6, got %d", len(pkg.Files))
44*ba677afaSXin Li	}
45*ba677afaSXin Li
46*ba677afaSXin Li	fileInFolder := pkg.Files[0]
47*ba677afaSXin Li	if fileInFolder.LicenseInfoInFiles == nil {
48*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
49*ba677afaSXin Li	}
50*ba677afaSXin Li	if len(fileInFolder.LicenseInfoInFiles) != 1 {
51*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileInFolder.LicenseInfoInFiles))
52*ba677afaSXin Li	}
53*ba677afaSXin Li	if fileInFolder.LicenseInfoInFiles[0] != "MIT" {
54*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", fileInFolder.LicenseInfoInFiles[0])
55*ba677afaSXin Li	}
56*ba677afaSXin Li	if fileInFolder.LicenseConcluded != "MIT" {
57*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", fileInFolder.LicenseConcluded)
58*ba677afaSXin Li	}
59*ba677afaSXin Li
60*ba677afaSXin Li	fileTrailingComment := pkg.Files[1]
61*ba677afaSXin Li	if fileTrailingComment.LicenseInfoInFiles == nil {
62*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
63*ba677afaSXin Li	}
64*ba677afaSXin Li	if len(fileTrailingComment.LicenseInfoInFiles) != 1 {
65*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileTrailingComment.LicenseInfoInFiles))
66*ba677afaSXin Li	}
67*ba677afaSXin Li	if fileTrailingComment.LicenseInfoInFiles[0] != "GPL-2.0-or-later" {
68*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileTrailingComment.LicenseInfoInFiles[0])
69*ba677afaSXin Li	}
70*ba677afaSXin Li	if fileTrailingComment.LicenseConcluded != "GPL-2.0-or-later" {
71*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileTrailingComment.LicenseConcluded)
72*ba677afaSXin Li	}
73*ba677afaSXin Li
74*ba677afaSXin Li	fileHasDuplicateID := pkg.Files[2]
75*ba677afaSXin Li	if fileHasDuplicateID.LicenseInfoInFiles == nil {
76*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
77*ba677afaSXin Li	}
78*ba677afaSXin Li	if len(fileHasDuplicateID.LicenseInfoInFiles) != 1 {
79*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileHasDuplicateID.LicenseInfoInFiles))
80*ba677afaSXin Li	}
81*ba677afaSXin Li	if fileHasDuplicateID.LicenseInfoInFiles[0] != "MIT" {
82*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", fileHasDuplicateID.LicenseInfoInFiles[0])
83*ba677afaSXin Li	}
84*ba677afaSXin Li	if fileHasDuplicateID.LicenseConcluded != "MIT" {
85*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", fileHasDuplicateID.LicenseConcluded)
86*ba677afaSXin Li	}
87*ba677afaSXin Li
88*ba677afaSXin Li	fileHasID := pkg.Files[3]
89*ba677afaSXin Li	if fileHasID.LicenseInfoInFiles == nil {
90*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
91*ba677afaSXin Li	}
92*ba677afaSXin Li	if len(fileHasID.LicenseInfoInFiles) != 2 {
93*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 2, got %d", len(fileHasID.LicenseInfoInFiles))
94*ba677afaSXin Li	}
95*ba677afaSXin Li	if fileHasID.LicenseInfoInFiles[0] != "Apache-2.0" {
96*ba677afaSXin Li		t.Errorf("expected %v, got %v", "Apache-2.0", fileHasID.LicenseInfoInFiles[0])
97*ba677afaSXin Li	}
98*ba677afaSXin Li	if fileHasID.LicenseInfoInFiles[1] != "GPL-2.0-or-later" {
99*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileHasID.LicenseInfoInFiles[1])
100*ba677afaSXin Li	}
101*ba677afaSXin Li	if fileHasID.LicenseConcluded != "Apache-2.0 OR GPL-2.0-or-later" {
102*ba677afaSXin Li		t.Errorf("expected %v, got %v", "Apache-2.0 OR GPL-2.0-or-later", fileHasID.LicenseConcluded)
103*ba677afaSXin Li	}
104*ba677afaSXin Li
105*ba677afaSXin Li	fileMultipleIDs := pkg.Files[4]
106*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles == nil {
107*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
108*ba677afaSXin Li	}
109*ba677afaSXin Li	if len(fileMultipleIDs.LicenseInfoInFiles) != 5 {
110*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 5, got %d", len(fileMultipleIDs.LicenseInfoInFiles))
111*ba677afaSXin Li	}
112*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles[0] != "BSD-2-Clause" {
113*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-2-Clause", fileMultipleIDs.LicenseInfoInFiles[0])
114*ba677afaSXin Li	}
115*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles[1] != "BSD-3-Clause" {
116*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-3-Clause", fileMultipleIDs.LicenseInfoInFiles[1])
117*ba677afaSXin Li	}
118*ba677afaSXin Li	// here, DO NOT keep the +
119*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles[2] != "EPL-1.0" {
120*ba677afaSXin Li		t.Errorf("expected %v, got %v", "EPL-1.0", fileMultipleIDs.LicenseInfoInFiles[2])
121*ba677afaSXin Li	}
122*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles[3] != "ISC" {
123*ba677afaSXin Li		t.Errorf("expected %v, got %v", "ISC", fileMultipleIDs.LicenseInfoInFiles[3])
124*ba677afaSXin Li	}
125*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles[4] != "MIT" {
126*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", fileMultipleIDs.LicenseInfoInFiles[4])
127*ba677afaSXin Li	}
128*ba677afaSXin Li	if fileMultipleIDs.LicenseConcluded != "((MIT AND BSD-3-Clause) OR ISC) AND BSD-2-Clause AND EPL-1.0+" {
129*ba677afaSXin Li		t.Errorf("expected %v, got %v", "((MIT AND BSD-3-Clause) OR ISC) AND BSD-2-Clause AND EPL-1.0+", fileMultipleIDs.LicenseConcluded)
130*ba677afaSXin Li	}
131*ba677afaSXin Li
132*ba677afaSXin Li	fileNoID := pkg.Files[5]
133*ba677afaSXin Li	if fileNoID.LicenseInfoInFiles == nil {
134*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
135*ba677afaSXin Li	}
136*ba677afaSXin Li	if len(fileNoID.LicenseInfoInFiles) != 1 {
137*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileNoID.LicenseInfoInFiles))
138*ba677afaSXin Li	}
139*ba677afaSXin Li	if fileNoID.LicenseInfoInFiles[0] != "NOASSERTION" {
140*ba677afaSXin Li		t.Errorf("expected %v, got %v", "NOASSERTION", fileNoID.LicenseInfoInFiles[0])
141*ba677afaSXin Li	}
142*ba677afaSXin Li	if fileNoID.LicenseConcluded != "NOASSERTION" {
143*ba677afaSXin Li		t.Errorf("expected %v, got %v", "NOASSERTION", fileNoID.LicenseConcluded)
144*ba677afaSXin Li	}
145*ba677afaSXin Li
146*ba677afaSXin Li	// and finally, the package should have all of these licenses
147*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles == nil {
148*ba677afaSXin Li		t.Fatalf("expected non-nil PackageLicenseInfoFromFiles, got nil")
149*ba677afaSXin Li	}
150*ba677afaSXin Li	if len(pkg.PackageLicenseInfoFromFiles) != 7 {
151*ba677afaSXin Li		t.Fatalf("expected PackageLicenseInfoFromFiles len to be 7, got %d", len(pkg.PackageLicenseInfoFromFiles))
152*ba677afaSXin Li	}
153*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[0] != "Apache-2.0" {
154*ba677afaSXin Li		t.Errorf("expected %v, got %v", "Apache-2.0", pkg.PackageLicenseInfoFromFiles[0])
155*ba677afaSXin Li	}
156*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[1] != "BSD-2-Clause" {
157*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-2-Clause", pkg.PackageLicenseInfoFromFiles[1])
158*ba677afaSXin Li	}
159*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[2] != "BSD-3-Clause" {
160*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-3-Clause", pkg.PackageLicenseInfoFromFiles[2])
161*ba677afaSXin Li	}
162*ba677afaSXin Li	// here, DO NOT keep the +
163*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[3] != "EPL-1.0" {
164*ba677afaSXin Li		t.Errorf("expected %v, got %v", "EPL-1.0", pkg.PackageLicenseInfoFromFiles[3])
165*ba677afaSXin Li	}
166*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[4] != "GPL-2.0-or-later" {
167*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-or-later", pkg.PackageLicenseInfoFromFiles[4])
168*ba677afaSXin Li	}
169*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[5] != "ISC" {
170*ba677afaSXin Li		t.Errorf("expected %v, got %v", "ISC", pkg.PackageLicenseInfoFromFiles[5])
171*ba677afaSXin Li	}
172*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[6] != "MIT" {
173*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", pkg.PackageLicenseInfoFromFiles[6])
174*ba677afaSXin Li	}
175*ba677afaSXin Li
176*ba677afaSXin Li}
177*ba677afaSXin Li
178*ba677afaSXin Lifunc Test2_1SearcherCanFillInIDsAndIgnorePaths(t *testing.T) {
179*ba677afaSXin Li	packageName := "project3"
180*ba677afaSXin Li	dirRoot := "../testdata/project3/"
181*ba677afaSXin Li	config := &Config2_1{
182*ba677afaSXin Li		NamespacePrefix: "https://github.com/swinslow/spdx-docs/spdx-go/testdata-",
183*ba677afaSXin Li		BuilderPathsIgnored: []string{
184*ba677afaSXin Li			"**/ignoredir/",
185*ba677afaSXin Li			"/excludedir/",
186*ba677afaSXin Li			"**/ignorefile.txt",
187*ba677afaSXin Li			"/alsoEXCLUDEthis.txt",
188*ba677afaSXin Li		},
189*ba677afaSXin Li		SearcherPathsIgnored: []string{
190*ba677afaSXin Li			"**/dontscan.txt",
191*ba677afaSXin Li		},
192*ba677afaSXin Li	}
193*ba677afaSXin Li
194*ba677afaSXin Li	doc, err := BuildIDsDocument2_1(packageName, dirRoot, config)
195*ba677afaSXin Li	if err != nil {
196*ba677afaSXin Li		t.Fatalf("expected nil error, got %v", err)
197*ba677afaSXin Li	}
198*ba677afaSXin Li	if doc == nil {
199*ba677afaSXin Li		t.Fatalf("expected non-nil Document, got nil")
200*ba677afaSXin Li	}
201*ba677afaSXin Li
202*ba677afaSXin Li	// not checking all contents of doc, see builder tests for those
203*ba677afaSXin Li
204*ba677afaSXin Li	// get the package and its files, checking licenses for each, and
205*ba677afaSXin Li	// confirming NOASSERTION for those that are skipped
206*ba677afaSXin Li	pkg := doc.Packages[0]
207*ba677afaSXin Li	if pkg == nil {
208*ba677afaSXin Li		t.Fatalf("expected non-nil pkg, got nil")
209*ba677afaSXin Li	}
210*ba677afaSXin Li	if len(pkg.Files) != 5 {
211*ba677afaSXin Li		t.Fatalf("expected len %d, got %d", 5, len(pkg.Files))
212*ba677afaSXin Li	}
213*ba677afaSXin Li
214*ba677afaSXin Li	f := pkg.Files[0]
215*ba677afaSXin Li	if f.FileName != "./dontscan.txt" {
216*ba677afaSXin Li		t.Errorf("expected %v, got %v", "./dontscan.txt", f.FileName)
217*ba677afaSXin Li	}
218*ba677afaSXin Li	if len(f.LicenseInfoInFiles) != 1 {
219*ba677afaSXin Li		t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
220*ba677afaSXin Li	}
221*ba677afaSXin Li	if f.LicenseInfoInFiles[0] != "NOASSERTION" {
222*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
223*ba677afaSXin Li	}
224*ba677afaSXin Li	if f.LicenseConcluded != "NOASSERTION" {
225*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
226*ba677afaSXin Li	}
227*ba677afaSXin Li
228*ba677afaSXin Li	f = pkg.Files[1]
229*ba677afaSXin Li	if f.FileName != "./keep/keep.txt" {
230*ba677afaSXin Li		t.Errorf("expected %v, got %v", "./keep/keep.txt", f.FileName)
231*ba677afaSXin Li	}
232*ba677afaSXin Li	if len(f.LicenseInfoInFiles) != 1 {
233*ba677afaSXin Li		t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
234*ba677afaSXin Li	}
235*ba677afaSXin Li	if f.LicenseInfoInFiles[0] != "MIT" {
236*ba677afaSXin Li		t.Errorf("expected %s, got %s", "MIT", f.LicenseInfoInFiles[0])
237*ba677afaSXin Li	}
238*ba677afaSXin Li	if f.LicenseConcluded != "MIT" {
239*ba677afaSXin Li		t.Errorf("expected %s, got %s", "MIT", f.LicenseConcluded)
240*ba677afaSXin Li	}
241*ba677afaSXin Li
242*ba677afaSXin Li	f = pkg.Files[2]
243*ba677afaSXin Li	if f.FileName != "./keep.txt" {
244*ba677afaSXin Li		t.Errorf("expected %v, got %v", "./keep.txt", f.FileName)
245*ba677afaSXin Li	}
246*ba677afaSXin Li	if len(f.LicenseInfoInFiles) != 1 {
247*ba677afaSXin Li		t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
248*ba677afaSXin Li	}
249*ba677afaSXin Li	if f.LicenseInfoInFiles[0] != "NOASSERTION" {
250*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
251*ba677afaSXin Li	}
252*ba677afaSXin Li	if f.LicenseConcluded != "NOASSERTION" {
253*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
254*ba677afaSXin Li	}
255*ba677afaSXin Li
256*ba677afaSXin Li	f = pkg.Files[3]
257*ba677afaSXin Li	if f.FileName != "./subdir/keep/dontscan.txt" {
258*ba677afaSXin Li		t.Errorf("expected %v, got %v", "./subdir/keep/dontscan.txt", f.FileName)
259*ba677afaSXin Li	}
260*ba677afaSXin Li	if len(f.LicenseInfoInFiles) != 1 {
261*ba677afaSXin Li		t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
262*ba677afaSXin Li	}
263*ba677afaSXin Li	if f.LicenseInfoInFiles[0] != "NOASSERTION" {
264*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
265*ba677afaSXin Li	}
266*ba677afaSXin Li	if f.LicenseConcluded != "NOASSERTION" {
267*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
268*ba677afaSXin Li	}
269*ba677afaSXin Li
270*ba677afaSXin Li	f = pkg.Files[4]
271*ba677afaSXin Li	if f.FileName != "./subdir/keep/keep.txt" {
272*ba677afaSXin Li		t.Errorf("expected %v, got %v", "./subdir/keep/keep.txt", f.FileName)
273*ba677afaSXin Li	}
274*ba677afaSXin Li	if len(f.LicenseInfoInFiles) != 1 {
275*ba677afaSXin Li		t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
276*ba677afaSXin Li	}
277*ba677afaSXin Li	if f.LicenseInfoInFiles[0] != "MIT" {
278*ba677afaSXin Li		t.Errorf("expected %s, got %s", "MIT", f.LicenseInfoInFiles[0])
279*ba677afaSXin Li	}
280*ba677afaSXin Li	if f.LicenseConcluded != "MIT" {
281*ba677afaSXin Li		t.Errorf("expected %s, got %s", "MIT", f.LicenseConcluded)
282*ba677afaSXin Li	}
283*ba677afaSXin Li}
284*ba677afaSXin Li
285*ba677afaSXin Lifunc Test2_1SearcherFailsWithInvalidPath(t *testing.T) {
286*ba677afaSXin Li	packageName := "project2"
287*ba677afaSXin Li	dirRoot := "./oops/invalid"
288*ba677afaSXin Li	config := &Config2_1{
289*ba677afaSXin Li		NamespacePrefix: "whatever",
290*ba677afaSXin Li	}
291*ba677afaSXin Li
292*ba677afaSXin Li	_, err := BuildIDsDocument2_1(packageName, dirRoot, config)
293*ba677afaSXin Li	if err == nil {
294*ba677afaSXin Li		t.Fatalf("expected non-nil error, got nil")
295*ba677afaSXin Li	}
296*ba677afaSXin Li}
297*ba677afaSXin Li
298*ba677afaSXin Li// ===== 2.2 Searcher top-level function tests =====
299*ba677afaSXin Lifunc Test2_2SearcherCanFillInIDs(t *testing.T) {
300*ba677afaSXin Li	packageName := "project2"
301*ba677afaSXin Li	dirRoot := "../testdata/project2/"
302*ba677afaSXin Li	config := &Config2_2{
303*ba677afaSXin Li		NamespacePrefix: "https://github.com/swinslow/spdx-docs/spdx-go/testdata-",
304*ba677afaSXin Li	}
305*ba677afaSXin Li
306*ba677afaSXin Li	doc, err := BuildIDsDocument2_2(packageName, dirRoot, config)
307*ba677afaSXin Li	if err != nil {
308*ba677afaSXin Li		t.Fatalf("expected nil error, got %v", err)
309*ba677afaSXin Li	}
310*ba677afaSXin Li	if doc == nil {
311*ba677afaSXin Li		t.Fatalf("expected non-nil Document, got nil")
312*ba677afaSXin Li	}
313*ba677afaSXin Li
314*ba677afaSXin Li	// not checking all contents of doc, see builder tests for those
315*ba677afaSXin Li
316*ba677afaSXin Li	// get the package and its files, checking size of each
317*ba677afaSXin Li	if doc.Packages == nil {
318*ba677afaSXin Li		t.Fatalf("expected non-nil Packages, got nil")
319*ba677afaSXin Li	}
320*ba677afaSXin Li	if len(doc.Packages) != 1 {
321*ba677afaSXin Li		t.Fatalf("expected Packages len to be 1, got %d", len(doc.Packages))
322*ba677afaSXin Li	}
323*ba677afaSXin Li	pkg := doc.Packages[0]
324*ba677afaSXin Li	if pkg == nil {
325*ba677afaSXin Li		t.Fatalf("expected non-nil pkg, got nil")
326*ba677afaSXin Li	}
327*ba677afaSXin Li
328*ba677afaSXin Li	if pkg.Files == nil {
329*ba677afaSXin Li		t.Fatalf("expected non-nil Files, got nil")
330*ba677afaSXin Li	}
331*ba677afaSXin Li	if len(pkg.Files) != 6 {
332*ba677afaSXin Li		t.Fatalf("expected Files len to be 6, got %d", len(pkg.Files))
333*ba677afaSXin Li	}
334*ba677afaSXin Li
335*ba677afaSXin Li	fileInFolder := pkg.Files[0]
336*ba677afaSXin Li	if fileInFolder.LicenseInfoInFiles == nil {
337*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
338*ba677afaSXin Li	}
339*ba677afaSXin Li	if len(fileInFolder.LicenseInfoInFiles) != 1 {
340*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileInFolder.LicenseInfoInFiles))
341*ba677afaSXin Li	}
342*ba677afaSXin Li	if fileInFolder.LicenseInfoInFiles[0] != "MIT" {
343*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", fileInFolder.LicenseInfoInFiles[0])
344*ba677afaSXin Li	}
345*ba677afaSXin Li	if fileInFolder.LicenseConcluded != "MIT" {
346*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", fileInFolder.LicenseConcluded)
347*ba677afaSXin Li	}
348*ba677afaSXin Li
349*ba677afaSXin Li	fileTrailingComment := pkg.Files[1]
350*ba677afaSXin Li	if fileTrailingComment.LicenseInfoInFiles == nil {
351*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
352*ba677afaSXin Li	}
353*ba677afaSXin Li	if len(fileTrailingComment.LicenseInfoInFiles) != 1 {
354*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileTrailingComment.LicenseInfoInFiles))
355*ba677afaSXin Li	}
356*ba677afaSXin Li	if fileTrailingComment.LicenseInfoInFiles[0] != "GPL-2.0-or-later" {
357*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileTrailingComment.LicenseInfoInFiles[0])
358*ba677afaSXin Li	}
359*ba677afaSXin Li	if fileTrailingComment.LicenseConcluded != "GPL-2.0-or-later" {
360*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileTrailingComment.LicenseConcluded)
361*ba677afaSXin Li	}
362*ba677afaSXin Li
363*ba677afaSXin Li	fileHasDuplicateID := pkg.Files[2]
364*ba677afaSXin Li	if fileHasDuplicateID.LicenseInfoInFiles == nil {
365*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
366*ba677afaSXin Li	}
367*ba677afaSXin Li	if len(fileHasDuplicateID.LicenseInfoInFiles) != 1 {
368*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileHasDuplicateID.LicenseInfoInFiles))
369*ba677afaSXin Li	}
370*ba677afaSXin Li	if fileHasDuplicateID.LicenseInfoInFiles[0] != "MIT" {
371*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", fileHasDuplicateID.LicenseInfoInFiles[0])
372*ba677afaSXin Li	}
373*ba677afaSXin Li	if fileHasDuplicateID.LicenseConcluded != "MIT" {
374*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", fileHasDuplicateID.LicenseConcluded)
375*ba677afaSXin Li	}
376*ba677afaSXin Li
377*ba677afaSXin Li	fileHasID := pkg.Files[3]
378*ba677afaSXin Li	if fileHasID.LicenseInfoInFiles == nil {
379*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
380*ba677afaSXin Li	}
381*ba677afaSXin Li	if len(fileHasID.LicenseInfoInFiles) != 2 {
382*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 2, got %d", len(fileHasID.LicenseInfoInFiles))
383*ba677afaSXin Li	}
384*ba677afaSXin Li	if fileHasID.LicenseInfoInFiles[0] != "Apache-2.0" {
385*ba677afaSXin Li		t.Errorf("expected %v, got %v", "Apache-2.0", fileHasID.LicenseInfoInFiles[0])
386*ba677afaSXin Li	}
387*ba677afaSXin Li	if fileHasID.LicenseInfoInFiles[1] != "GPL-2.0-or-later" {
388*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileHasID.LicenseInfoInFiles[1])
389*ba677afaSXin Li	}
390*ba677afaSXin Li	if fileHasID.LicenseConcluded != "Apache-2.0 OR GPL-2.0-or-later" {
391*ba677afaSXin Li		t.Errorf("expected %v, got %v", "Apache-2.0 OR GPL-2.0-or-later", fileHasID.LicenseConcluded)
392*ba677afaSXin Li	}
393*ba677afaSXin Li
394*ba677afaSXin Li	fileMultipleIDs := pkg.Files[4]
395*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles == nil {
396*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
397*ba677afaSXin Li	}
398*ba677afaSXin Li	if len(fileMultipleIDs.LicenseInfoInFiles) != 5 {
399*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 5, got %d", len(fileMultipleIDs.LicenseInfoInFiles))
400*ba677afaSXin Li	}
401*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles[0] != "BSD-2-Clause" {
402*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-2-Clause", fileMultipleIDs.LicenseInfoInFiles[0])
403*ba677afaSXin Li	}
404*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles[1] != "BSD-3-Clause" {
405*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-3-Clause", fileMultipleIDs.LicenseInfoInFiles[1])
406*ba677afaSXin Li	}
407*ba677afaSXin Li	// here, DO NOT keep the +
408*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles[2] != "EPL-1.0" {
409*ba677afaSXin Li		t.Errorf("expected %v, got %v", "EPL-1.0", fileMultipleIDs.LicenseInfoInFiles[2])
410*ba677afaSXin Li	}
411*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles[3] != "ISC" {
412*ba677afaSXin Li		t.Errorf("expected %v, got %v", "ISC", fileMultipleIDs.LicenseInfoInFiles[3])
413*ba677afaSXin Li	}
414*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles[4] != "MIT" {
415*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", fileMultipleIDs.LicenseInfoInFiles[4])
416*ba677afaSXin Li	}
417*ba677afaSXin Li	if fileMultipleIDs.LicenseConcluded != "((MIT AND BSD-3-Clause) OR ISC) AND BSD-2-Clause AND EPL-1.0+" {
418*ba677afaSXin Li		t.Errorf("expected %v, got %v", "((MIT AND BSD-3-Clause) OR ISC) AND BSD-2-Clause AND EPL-1.0+", fileMultipleIDs.LicenseConcluded)
419*ba677afaSXin Li	}
420*ba677afaSXin Li
421*ba677afaSXin Li	fileNoID := pkg.Files[5]
422*ba677afaSXin Li	if fileNoID.LicenseInfoInFiles == nil {
423*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
424*ba677afaSXin Li	}
425*ba677afaSXin Li	if len(fileNoID.LicenseInfoInFiles) != 1 {
426*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileNoID.LicenseInfoInFiles))
427*ba677afaSXin Li	}
428*ba677afaSXin Li	if fileNoID.LicenseInfoInFiles[0] != "NOASSERTION" {
429*ba677afaSXin Li		t.Errorf("expected %v, got %v", "NOASSERTION", fileNoID.LicenseInfoInFiles[0])
430*ba677afaSXin Li	}
431*ba677afaSXin Li	if fileNoID.LicenseConcluded != "NOASSERTION" {
432*ba677afaSXin Li		t.Errorf("expected %v, got %v", "NOASSERTION", fileNoID.LicenseConcluded)
433*ba677afaSXin Li	}
434*ba677afaSXin Li
435*ba677afaSXin Li	// and finally, the package should have all of these licenses
436*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles == nil {
437*ba677afaSXin Li		t.Fatalf("expected non-nil PackageLicenseInfoFromFiles, got nil")
438*ba677afaSXin Li	}
439*ba677afaSXin Li	if len(pkg.PackageLicenseInfoFromFiles) != 7 {
440*ba677afaSXin Li		t.Fatalf("expected PackageLicenseInfoFromFiles len to be 7, got %d", len(pkg.PackageLicenseInfoFromFiles))
441*ba677afaSXin Li	}
442*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[0] != "Apache-2.0" {
443*ba677afaSXin Li		t.Errorf("expected %v, got %v", "Apache-2.0", pkg.PackageLicenseInfoFromFiles[0])
444*ba677afaSXin Li	}
445*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[1] != "BSD-2-Clause" {
446*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-2-Clause", pkg.PackageLicenseInfoFromFiles[1])
447*ba677afaSXin Li	}
448*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[2] != "BSD-3-Clause" {
449*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-3-Clause", pkg.PackageLicenseInfoFromFiles[2])
450*ba677afaSXin Li	}
451*ba677afaSXin Li	// here, DO NOT keep the +
452*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[3] != "EPL-1.0" {
453*ba677afaSXin Li		t.Errorf("expected %v, got %v", "EPL-1.0", pkg.PackageLicenseInfoFromFiles[3])
454*ba677afaSXin Li	}
455*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[4] != "GPL-2.0-or-later" {
456*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-or-later", pkg.PackageLicenseInfoFromFiles[4])
457*ba677afaSXin Li	}
458*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[5] != "ISC" {
459*ba677afaSXin Li		t.Errorf("expected %v, got %v", "ISC", pkg.PackageLicenseInfoFromFiles[5])
460*ba677afaSXin Li	}
461*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[6] != "MIT" {
462*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", pkg.PackageLicenseInfoFromFiles[6])
463*ba677afaSXin Li	}
464*ba677afaSXin Li
465*ba677afaSXin Li}
466*ba677afaSXin Li
467*ba677afaSXin Lifunc Test2_2SearcherCanFillInIDsAndIgnorePaths(t *testing.T) {
468*ba677afaSXin Li	packageName := "project3"
469*ba677afaSXin Li	dirRoot := "../testdata/project3/"
470*ba677afaSXin Li	config := &Config2_2{
471*ba677afaSXin Li		NamespacePrefix: "https://github.com/swinslow/spdx-docs/spdx-go/testdata-",
472*ba677afaSXin Li		BuilderPathsIgnored: []string{
473*ba677afaSXin Li			"**/ignoredir/",
474*ba677afaSXin Li			"/excludedir/",
475*ba677afaSXin Li			"**/ignorefile.txt",
476*ba677afaSXin Li			"/alsoEXCLUDEthis.txt",
477*ba677afaSXin Li		},
478*ba677afaSXin Li		SearcherPathsIgnored: []string{
479*ba677afaSXin Li			"**/dontscan.txt",
480*ba677afaSXin Li		},
481*ba677afaSXin Li	}
482*ba677afaSXin Li
483*ba677afaSXin Li	doc, err := BuildIDsDocument2_2(packageName, dirRoot, config)
484*ba677afaSXin Li	if err != nil {
485*ba677afaSXin Li		t.Fatalf("expected nil error, got %v", err)
486*ba677afaSXin Li	}
487*ba677afaSXin Li	if doc == nil {
488*ba677afaSXin Li		t.Fatalf("expected non-nil Document, got nil")
489*ba677afaSXin Li	}
490*ba677afaSXin Li
491*ba677afaSXin Li	// not checking all contents of doc, see builder tests for those
492*ba677afaSXin Li
493*ba677afaSXin Li	// get the package and its files, checking licenses for each, and
494*ba677afaSXin Li	// confirming NOASSERTION for those that are skipped
495*ba677afaSXin Li	pkg := doc.Packages[0]
496*ba677afaSXin Li	if pkg == nil {
497*ba677afaSXin Li		t.Fatalf("expected non-nil pkg, got nil")
498*ba677afaSXin Li	}
499*ba677afaSXin Li	if len(pkg.Files) != 5 {
500*ba677afaSXin Li		t.Fatalf("expected len %d, got %d", 5, len(pkg.Files))
501*ba677afaSXin Li	}
502*ba677afaSXin Li
503*ba677afaSXin Li	f := pkg.Files[0]
504*ba677afaSXin Li	if f.FileName != "./dontscan.txt" {
505*ba677afaSXin Li		t.Errorf("expected %v, got %v", "./dontscan.txt", f.FileName)
506*ba677afaSXin Li	}
507*ba677afaSXin Li	if len(f.LicenseInfoInFiles) != 1 {
508*ba677afaSXin Li		t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
509*ba677afaSXin Li	}
510*ba677afaSXin Li	if f.LicenseInfoInFiles[0] != "NOASSERTION" {
511*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
512*ba677afaSXin Li	}
513*ba677afaSXin Li	if f.LicenseConcluded != "NOASSERTION" {
514*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
515*ba677afaSXin Li	}
516*ba677afaSXin Li
517*ba677afaSXin Li	f = pkg.Files[1]
518*ba677afaSXin Li	if f.FileName != "./keep/keep.txt" {
519*ba677afaSXin Li		t.Errorf("expected %v, got %v", "./keep/keep.txt", f.FileName)
520*ba677afaSXin Li	}
521*ba677afaSXin Li	if len(f.LicenseInfoInFiles) != 1 {
522*ba677afaSXin Li		t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
523*ba677afaSXin Li	}
524*ba677afaSXin Li	if f.LicenseInfoInFiles[0] != "MIT" {
525*ba677afaSXin Li		t.Errorf("expected %s, got %s", "MIT", f.LicenseInfoInFiles[0])
526*ba677afaSXin Li	}
527*ba677afaSXin Li	if f.LicenseConcluded != "MIT" {
528*ba677afaSXin Li		t.Errorf("expected %s, got %s", "MIT", f.LicenseConcluded)
529*ba677afaSXin Li	}
530*ba677afaSXin Li
531*ba677afaSXin Li	f = pkg.Files[2]
532*ba677afaSXin Li	if f.FileName != "./keep.txt" {
533*ba677afaSXin Li		t.Errorf("expected %v, got %v", "./keep.txt", f.FileName)
534*ba677afaSXin Li	}
535*ba677afaSXin Li	if len(f.LicenseInfoInFiles) != 1 {
536*ba677afaSXin Li		t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
537*ba677afaSXin Li	}
538*ba677afaSXin Li	if f.LicenseInfoInFiles[0] != "NOASSERTION" {
539*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
540*ba677afaSXin Li	}
541*ba677afaSXin Li	if f.LicenseConcluded != "NOASSERTION" {
542*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
543*ba677afaSXin Li	}
544*ba677afaSXin Li
545*ba677afaSXin Li	f = pkg.Files[3]
546*ba677afaSXin Li	if f.FileName != "./subdir/keep/dontscan.txt" {
547*ba677afaSXin Li		t.Errorf("expected %v, got %v", "./subdir/keep/dontscan.txt", f.FileName)
548*ba677afaSXin Li	}
549*ba677afaSXin Li	if len(f.LicenseInfoInFiles) != 1 {
550*ba677afaSXin Li		t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
551*ba677afaSXin Li	}
552*ba677afaSXin Li	if f.LicenseInfoInFiles[0] != "NOASSERTION" {
553*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
554*ba677afaSXin Li	}
555*ba677afaSXin Li	if f.LicenseConcluded != "NOASSERTION" {
556*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
557*ba677afaSXin Li	}
558*ba677afaSXin Li
559*ba677afaSXin Li	f = pkg.Files[4]
560*ba677afaSXin Li	if f.FileName != "./subdir/keep/keep.txt" {
561*ba677afaSXin Li		t.Errorf("expected %v, got %v", "./subdir/keep/keep.txt", f.FileName)
562*ba677afaSXin Li	}
563*ba677afaSXin Li	if len(f.LicenseInfoInFiles) != 1 {
564*ba677afaSXin Li		t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
565*ba677afaSXin Li	}
566*ba677afaSXin Li	if f.LicenseInfoInFiles[0] != "MIT" {
567*ba677afaSXin Li		t.Errorf("expected %s, got %s", "MIT", f.LicenseInfoInFiles[0])
568*ba677afaSXin Li	}
569*ba677afaSXin Li	if f.LicenseConcluded != "MIT" {
570*ba677afaSXin Li		t.Errorf("expected %s, got %s", "MIT", f.LicenseConcluded)
571*ba677afaSXin Li	}
572*ba677afaSXin Li}
573*ba677afaSXin Li
574*ba677afaSXin Lifunc Test2_2SearcherFailsWithInvalidPath(t *testing.T) {
575*ba677afaSXin Li	packageName := "project2"
576*ba677afaSXin Li	dirRoot := "./oops/invalid"
577*ba677afaSXin Li	config := &Config2_2{
578*ba677afaSXin Li		NamespacePrefix: "whatever",
579*ba677afaSXin Li	}
580*ba677afaSXin Li
581*ba677afaSXin Li	_, err := BuildIDsDocument2_2(packageName, dirRoot, config)
582*ba677afaSXin Li	if err == nil {
583*ba677afaSXin Li		t.Fatalf("expected non-nil error, got nil")
584*ba677afaSXin Li	}
585*ba677afaSXin Li}
586*ba677afaSXin Li
587*ba677afaSXin Li// ===== 2.3 Searcher top-level function tests =====
588*ba677afaSXin Lifunc Test2_3SearcherCanFillInIDs(t *testing.T) {
589*ba677afaSXin Li	packageName := "project2"
590*ba677afaSXin Li	dirRoot := "../testdata/project2/"
591*ba677afaSXin Li	config := &Config2_3{
592*ba677afaSXin Li		NamespacePrefix: "https://github.com/swinslow/spdx-docs/spdx-go/testdata-",
593*ba677afaSXin Li	}
594*ba677afaSXin Li
595*ba677afaSXin Li	doc, err := BuildIDsDocument2_3(packageName, dirRoot, config)
596*ba677afaSXin Li	if err != nil {
597*ba677afaSXin Li		t.Fatalf("expected nil error, got %v", err)
598*ba677afaSXin Li	}
599*ba677afaSXin Li	if doc == nil {
600*ba677afaSXin Li		t.Fatalf("expected non-nil Document, got nil")
601*ba677afaSXin Li	}
602*ba677afaSXin Li
603*ba677afaSXin Li	// not checking all contents of doc, see builder tests for those
604*ba677afaSXin Li
605*ba677afaSXin Li	// get the package and its files, checking size of each
606*ba677afaSXin Li	if doc.Packages == nil {
607*ba677afaSXin Li		t.Fatalf("expected non-nil Packages, got nil")
608*ba677afaSXin Li	}
609*ba677afaSXin Li	if len(doc.Packages) != 1 {
610*ba677afaSXin Li		t.Fatalf("expected Packages len to be 1, got %d", len(doc.Packages))
611*ba677afaSXin Li	}
612*ba677afaSXin Li	pkg := doc.Packages[0]
613*ba677afaSXin Li	if pkg == nil {
614*ba677afaSXin Li		t.Fatalf("expected non-nil pkg, got nil")
615*ba677afaSXin Li	}
616*ba677afaSXin Li
617*ba677afaSXin Li	if pkg.Files == nil {
618*ba677afaSXin Li		t.Fatalf("expected non-nil Files, got nil")
619*ba677afaSXin Li	}
620*ba677afaSXin Li	if len(pkg.Files) != 6 {
621*ba677afaSXin Li		t.Fatalf("expected Files len to be 6, got %d", len(pkg.Files))
622*ba677afaSXin Li	}
623*ba677afaSXin Li
624*ba677afaSXin Li	fileInFolder := pkg.Files[0]
625*ba677afaSXin Li	if fileInFolder.LicenseInfoInFiles == nil {
626*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
627*ba677afaSXin Li	}
628*ba677afaSXin Li	if len(fileInFolder.LicenseInfoInFiles) != 1 {
629*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileInFolder.LicenseInfoInFiles))
630*ba677afaSXin Li	}
631*ba677afaSXin Li	if fileInFolder.LicenseInfoInFiles[0] != "MIT" {
632*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", fileInFolder.LicenseInfoInFiles[0])
633*ba677afaSXin Li	}
634*ba677afaSXin Li	if fileInFolder.LicenseConcluded != "MIT" {
635*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", fileInFolder.LicenseConcluded)
636*ba677afaSXin Li	}
637*ba677afaSXin Li
638*ba677afaSXin Li	fileTrailingComment := pkg.Files[1]
639*ba677afaSXin Li	if fileTrailingComment.LicenseInfoInFiles == nil {
640*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
641*ba677afaSXin Li	}
642*ba677afaSXin Li	if len(fileTrailingComment.LicenseInfoInFiles) != 1 {
643*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileTrailingComment.LicenseInfoInFiles))
644*ba677afaSXin Li	}
645*ba677afaSXin Li	if fileTrailingComment.LicenseInfoInFiles[0] != "GPL-2.0-or-later" {
646*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileTrailingComment.LicenseInfoInFiles[0])
647*ba677afaSXin Li	}
648*ba677afaSXin Li	if fileTrailingComment.LicenseConcluded != "GPL-2.0-or-later" {
649*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileTrailingComment.LicenseConcluded)
650*ba677afaSXin Li	}
651*ba677afaSXin Li
652*ba677afaSXin Li	fileHasDuplicateID := pkg.Files[2]
653*ba677afaSXin Li	if fileHasDuplicateID.LicenseInfoInFiles == nil {
654*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
655*ba677afaSXin Li	}
656*ba677afaSXin Li	if len(fileHasDuplicateID.LicenseInfoInFiles) != 1 {
657*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileHasDuplicateID.LicenseInfoInFiles))
658*ba677afaSXin Li	}
659*ba677afaSXin Li	if fileHasDuplicateID.LicenseInfoInFiles[0] != "MIT" {
660*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", fileHasDuplicateID.LicenseInfoInFiles[0])
661*ba677afaSXin Li	}
662*ba677afaSXin Li	if fileHasDuplicateID.LicenseConcluded != "MIT" {
663*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", fileHasDuplicateID.LicenseConcluded)
664*ba677afaSXin Li	}
665*ba677afaSXin Li
666*ba677afaSXin Li	fileHasID := pkg.Files[3]
667*ba677afaSXin Li	if fileHasID.LicenseInfoInFiles == nil {
668*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
669*ba677afaSXin Li	}
670*ba677afaSXin Li	if len(fileHasID.LicenseInfoInFiles) != 2 {
671*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 2, got %d", len(fileHasID.LicenseInfoInFiles))
672*ba677afaSXin Li	}
673*ba677afaSXin Li	if fileHasID.LicenseInfoInFiles[0] != "Apache-2.0" {
674*ba677afaSXin Li		t.Errorf("expected %v, got %v", "Apache-2.0", fileHasID.LicenseInfoInFiles[0])
675*ba677afaSXin Li	}
676*ba677afaSXin Li	if fileHasID.LicenseInfoInFiles[1] != "GPL-2.0-or-later" {
677*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileHasID.LicenseInfoInFiles[1])
678*ba677afaSXin Li	}
679*ba677afaSXin Li	if fileHasID.LicenseConcluded != "Apache-2.0 OR GPL-2.0-or-later" {
680*ba677afaSXin Li		t.Errorf("expected %v, got %v", "Apache-2.0 OR GPL-2.0-or-later", fileHasID.LicenseConcluded)
681*ba677afaSXin Li	}
682*ba677afaSXin Li
683*ba677afaSXin Li	fileMultipleIDs := pkg.Files[4]
684*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles == nil {
685*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
686*ba677afaSXin Li	}
687*ba677afaSXin Li	if len(fileMultipleIDs.LicenseInfoInFiles) != 5 {
688*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 5, got %d", len(fileMultipleIDs.LicenseInfoInFiles))
689*ba677afaSXin Li	}
690*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles[0] != "BSD-2-Clause" {
691*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-2-Clause", fileMultipleIDs.LicenseInfoInFiles[0])
692*ba677afaSXin Li	}
693*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles[1] != "BSD-3-Clause" {
694*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-3-Clause", fileMultipleIDs.LicenseInfoInFiles[1])
695*ba677afaSXin Li	}
696*ba677afaSXin Li	// here, DO NOT keep the +
697*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles[2] != "EPL-1.0" {
698*ba677afaSXin Li		t.Errorf("expected %v, got %v", "EPL-1.0", fileMultipleIDs.LicenseInfoInFiles[2])
699*ba677afaSXin Li	}
700*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles[3] != "ISC" {
701*ba677afaSXin Li		t.Errorf("expected %v, got %v", "ISC", fileMultipleIDs.LicenseInfoInFiles[3])
702*ba677afaSXin Li	}
703*ba677afaSXin Li	if fileMultipleIDs.LicenseInfoInFiles[4] != "MIT" {
704*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", fileMultipleIDs.LicenseInfoInFiles[4])
705*ba677afaSXin Li	}
706*ba677afaSXin Li	if fileMultipleIDs.LicenseConcluded != "((MIT AND BSD-3-Clause) OR ISC) AND BSD-2-Clause AND EPL-1.0+" {
707*ba677afaSXin Li		t.Errorf("expected %v, got %v", "((MIT AND BSD-3-Clause) OR ISC) AND BSD-2-Clause AND EPL-1.0+", fileMultipleIDs.LicenseConcluded)
708*ba677afaSXin Li	}
709*ba677afaSXin Li
710*ba677afaSXin Li	fileNoID := pkg.Files[5]
711*ba677afaSXin Li	if fileNoID.LicenseInfoInFiles == nil {
712*ba677afaSXin Li		t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
713*ba677afaSXin Li	}
714*ba677afaSXin Li	if len(fileNoID.LicenseInfoInFiles) != 1 {
715*ba677afaSXin Li		t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileNoID.LicenseInfoInFiles))
716*ba677afaSXin Li	}
717*ba677afaSXin Li	if fileNoID.LicenseInfoInFiles[0] != "NOASSERTION" {
718*ba677afaSXin Li		t.Errorf("expected %v, got %v", "NOASSERTION", fileNoID.LicenseInfoInFiles[0])
719*ba677afaSXin Li	}
720*ba677afaSXin Li	if fileNoID.LicenseConcluded != "NOASSERTION" {
721*ba677afaSXin Li		t.Errorf("expected %v, got %v", "NOASSERTION", fileNoID.LicenseConcluded)
722*ba677afaSXin Li	}
723*ba677afaSXin Li
724*ba677afaSXin Li	// and finally, the package should have all of these licenses
725*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles == nil {
726*ba677afaSXin Li		t.Fatalf("expected non-nil PackageLicenseInfoFromFiles, got nil")
727*ba677afaSXin Li	}
728*ba677afaSXin Li	if len(pkg.PackageLicenseInfoFromFiles) != 7 {
729*ba677afaSXin Li		t.Fatalf("expected PackageLicenseInfoFromFiles len to be 7, got %d", len(pkg.PackageLicenseInfoFromFiles))
730*ba677afaSXin Li	}
731*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[0] != "Apache-2.0" {
732*ba677afaSXin Li		t.Errorf("expected %v, got %v", "Apache-2.0", pkg.PackageLicenseInfoFromFiles[0])
733*ba677afaSXin Li	}
734*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[1] != "BSD-2-Clause" {
735*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-2-Clause", pkg.PackageLicenseInfoFromFiles[1])
736*ba677afaSXin Li	}
737*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[2] != "BSD-3-Clause" {
738*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-3-Clause", pkg.PackageLicenseInfoFromFiles[2])
739*ba677afaSXin Li	}
740*ba677afaSXin Li	// here, DO NOT keep the +
741*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[3] != "EPL-1.0" {
742*ba677afaSXin Li		t.Errorf("expected %v, got %v", "EPL-1.0", pkg.PackageLicenseInfoFromFiles[3])
743*ba677afaSXin Li	}
744*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[4] != "GPL-2.0-or-later" {
745*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-or-later", pkg.PackageLicenseInfoFromFiles[4])
746*ba677afaSXin Li	}
747*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[5] != "ISC" {
748*ba677afaSXin Li		t.Errorf("expected %v, got %v", "ISC", pkg.PackageLicenseInfoFromFiles[5])
749*ba677afaSXin Li	}
750*ba677afaSXin Li	if pkg.PackageLicenseInfoFromFiles[6] != "MIT" {
751*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", pkg.PackageLicenseInfoFromFiles[6])
752*ba677afaSXin Li	}
753*ba677afaSXin Li
754*ba677afaSXin Li}
755*ba677afaSXin Li
756*ba677afaSXin Lifunc Test2_3SearcherCanFillInIDsAndIgnorePaths(t *testing.T) {
757*ba677afaSXin Li	packageName := "project3"
758*ba677afaSXin Li	dirRoot := "../testdata/project3/"
759*ba677afaSXin Li	config := &Config2_3{
760*ba677afaSXin Li		NamespacePrefix: "https://github.com/swinslow/spdx-docs/spdx-go/testdata-",
761*ba677afaSXin Li		BuilderPathsIgnored: []string{
762*ba677afaSXin Li			"**/ignoredir/",
763*ba677afaSXin Li			"/excludedir/",
764*ba677afaSXin Li			"**/ignorefile.txt",
765*ba677afaSXin Li			"/alsoEXCLUDEthis.txt",
766*ba677afaSXin Li		},
767*ba677afaSXin Li		SearcherPathsIgnored: []string{
768*ba677afaSXin Li			"**/dontscan.txt",
769*ba677afaSXin Li		},
770*ba677afaSXin Li	}
771*ba677afaSXin Li
772*ba677afaSXin Li	doc, err := BuildIDsDocument2_3(packageName, dirRoot, config)
773*ba677afaSXin Li	if err != nil {
774*ba677afaSXin Li		t.Fatalf("expected nil error, got %v", err)
775*ba677afaSXin Li	}
776*ba677afaSXin Li	if doc == nil {
777*ba677afaSXin Li		t.Fatalf("expected non-nil Document, got nil")
778*ba677afaSXin Li	}
779*ba677afaSXin Li
780*ba677afaSXin Li	// not checking all contents of doc, see builder tests for those
781*ba677afaSXin Li
782*ba677afaSXin Li	// get the package and its files, checking licenses for each, and
783*ba677afaSXin Li	// confirming NOASSERTION for those that are skipped
784*ba677afaSXin Li	pkg := doc.Packages[0]
785*ba677afaSXin Li	if pkg == nil {
786*ba677afaSXin Li		t.Fatalf("expected non-nil pkg, got nil")
787*ba677afaSXin Li	}
788*ba677afaSXin Li	if len(pkg.Files) != 5 {
789*ba677afaSXin Li		t.Fatalf("expected len %d, got %d", 5, len(pkg.Files))
790*ba677afaSXin Li	}
791*ba677afaSXin Li
792*ba677afaSXin Li	f := pkg.Files[0]
793*ba677afaSXin Li	if f.FileName != "./dontscan.txt" {
794*ba677afaSXin Li		t.Errorf("expected %v, got %v", "./dontscan.txt", f.FileName)
795*ba677afaSXin Li	}
796*ba677afaSXin Li	if len(f.LicenseInfoInFiles) != 1 {
797*ba677afaSXin Li		t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
798*ba677afaSXin Li	}
799*ba677afaSXin Li	if f.LicenseInfoInFiles[0] != "NOASSERTION" {
800*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
801*ba677afaSXin Li	}
802*ba677afaSXin Li	if f.LicenseConcluded != "NOASSERTION" {
803*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
804*ba677afaSXin Li	}
805*ba677afaSXin Li
806*ba677afaSXin Li	f = pkg.Files[1]
807*ba677afaSXin Li	if f.FileName != "./keep/keep.txt" {
808*ba677afaSXin Li		t.Errorf("expected %v, got %v", "./keep/keep.txt", f.FileName)
809*ba677afaSXin Li	}
810*ba677afaSXin Li	if len(f.LicenseInfoInFiles) != 1 {
811*ba677afaSXin Li		t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
812*ba677afaSXin Li	}
813*ba677afaSXin Li	if f.LicenseInfoInFiles[0] != "MIT" {
814*ba677afaSXin Li		t.Errorf("expected %s, got %s", "MIT", f.LicenseInfoInFiles[0])
815*ba677afaSXin Li	}
816*ba677afaSXin Li	if f.LicenseConcluded != "MIT" {
817*ba677afaSXin Li		t.Errorf("expected %s, got %s", "MIT", f.LicenseConcluded)
818*ba677afaSXin Li	}
819*ba677afaSXin Li
820*ba677afaSXin Li	f = pkg.Files[2]
821*ba677afaSXin Li	if f.FileName != "./keep.txt" {
822*ba677afaSXin Li		t.Errorf("expected %v, got %v", "./keep.txt", f.FileName)
823*ba677afaSXin Li	}
824*ba677afaSXin Li	if len(f.LicenseInfoInFiles) != 1 {
825*ba677afaSXin Li		t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
826*ba677afaSXin Li	}
827*ba677afaSXin Li	if f.LicenseInfoInFiles[0] != "NOASSERTION" {
828*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
829*ba677afaSXin Li	}
830*ba677afaSXin Li	if f.LicenseConcluded != "NOASSERTION" {
831*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
832*ba677afaSXin Li	}
833*ba677afaSXin Li
834*ba677afaSXin Li	f = pkg.Files[3]
835*ba677afaSXin Li	if f.FileName != "./subdir/keep/dontscan.txt" {
836*ba677afaSXin Li		t.Errorf("expected %v, got %v", "./subdir/keep/dontscan.txt", f.FileName)
837*ba677afaSXin Li	}
838*ba677afaSXin Li	if len(f.LicenseInfoInFiles) != 1 {
839*ba677afaSXin Li		t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
840*ba677afaSXin Li	}
841*ba677afaSXin Li	if f.LicenseInfoInFiles[0] != "NOASSERTION" {
842*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
843*ba677afaSXin Li	}
844*ba677afaSXin Li	if f.LicenseConcluded != "NOASSERTION" {
845*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
846*ba677afaSXin Li	}
847*ba677afaSXin Li
848*ba677afaSXin Li	f = pkg.Files[4]
849*ba677afaSXin Li	if f.FileName != "./subdir/keep/keep.txt" {
850*ba677afaSXin Li		t.Errorf("expected %v, got %v", "./subdir/keep/keep.txt", f.FileName)
851*ba677afaSXin Li	}
852*ba677afaSXin Li	if len(f.LicenseInfoInFiles) != 1 {
853*ba677afaSXin Li		t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
854*ba677afaSXin Li	}
855*ba677afaSXin Li	if f.LicenseInfoInFiles[0] != "MIT" {
856*ba677afaSXin Li		t.Errorf("expected %s, got %s", "MIT", f.LicenseInfoInFiles[0])
857*ba677afaSXin Li	}
858*ba677afaSXin Li	if f.LicenseConcluded != "MIT" {
859*ba677afaSXin Li		t.Errorf("expected %s, got %s", "MIT", f.LicenseConcluded)
860*ba677afaSXin Li	}
861*ba677afaSXin Li}
862*ba677afaSXin Li
863*ba677afaSXin Lifunc Test2_3SearcherFailsWithInvalidPath(t *testing.T) {
864*ba677afaSXin Li	packageName := "project2"
865*ba677afaSXin Li	dirRoot := "./oops/invalid"
866*ba677afaSXin Li	config := &Config2_3{
867*ba677afaSXin Li		NamespacePrefix: "whatever",
868*ba677afaSXin Li	}
869*ba677afaSXin Li
870*ba677afaSXin Li	_, err := BuildIDsDocument2_3(packageName, dirRoot, config)
871*ba677afaSXin Li	if err == nil {
872*ba677afaSXin Li		t.Fatalf("expected non-nil error, got nil")
873*ba677afaSXin Li	}
874*ba677afaSXin Li}
875*ba677afaSXin Li
876*ba677afaSXin Li// ===== Searcher utility tests =====
877*ba677afaSXin Lifunc TestCanFindShortFormIDWhenPresent(t *testing.T) {
878*ba677afaSXin Li	filePath := "../testdata/project2/has-id.txt"
879*ba677afaSXin Li
880*ba677afaSXin Li	ids, err := searchFileIDs(filePath)
881*ba677afaSXin Li	if err != nil {
882*ba677afaSXin Li		t.Fatalf("expected nil error, got %v", err)
883*ba677afaSXin Li	}
884*ba677afaSXin Li
885*ba677afaSXin Li	if len(ids) != 1 {
886*ba677afaSXin Li		t.Fatalf("expected len 1, got %d", len(ids))
887*ba677afaSXin Li	}
888*ba677afaSXin Li
889*ba677afaSXin Li	if ids[0] != "Apache-2.0 OR GPL-2.0-or-later" {
890*ba677afaSXin Li		t.Errorf("expected %v, got %v", "Apache-2.0 OR GPL-2.0-or-later", ids[0])
891*ba677afaSXin Li	}
892*ba677afaSXin Li}
893*ba677afaSXin Li
894*ba677afaSXin Lifunc TestCanFindMultipleShortFormIDsWhenPresent(t *testing.T) {
895*ba677afaSXin Li	filePath := "../testdata/project2/has-multiple-ids.txt"
896*ba677afaSXin Li
897*ba677afaSXin Li	ids, err := searchFileIDs(filePath)
898*ba677afaSXin Li	if err != nil {
899*ba677afaSXin Li		t.Fatalf("expected nil error, got %v", err)
900*ba677afaSXin Li	}
901*ba677afaSXin Li
902*ba677afaSXin Li	if len(ids) != 3 {
903*ba677afaSXin Li		t.Fatalf("expected len 3, got %d", len(ids))
904*ba677afaSXin Li	}
905*ba677afaSXin Li
906*ba677afaSXin Li	if ids[0] != "(MIT AND BSD-3-Clause) OR ISC" {
907*ba677afaSXin Li		t.Errorf("expected %v, got %v", "(MIT AND BSD-3-Clause) OR ISC", ids[0])
908*ba677afaSXin Li	}
909*ba677afaSXin Li	if ids[1] != "BSD-2-Clause" {
910*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-2-Clause", ids[1])
911*ba677afaSXin Li	}
912*ba677afaSXin Li	if ids[2] != "EPL-1.0+" {
913*ba677afaSXin Li		t.Errorf("expected %v, got %v", "EPL-1.0+", ids[2])
914*ba677afaSXin Li	}
915*ba677afaSXin Li}
916*ba677afaSXin Li
917*ba677afaSXin Lifunc TestCanCollapseDuplicateShortFormIDsWhenPresent(t *testing.T) {
918*ba677afaSXin Li	filePath := "../testdata/project2/has-duplicate-ids.txt"
919*ba677afaSXin Li
920*ba677afaSXin Li	ids, err := searchFileIDs(filePath)
921*ba677afaSXin Li	if err != nil {
922*ba677afaSXin Li		t.Fatalf("expected nil error, got %v", err)
923*ba677afaSXin Li	}
924*ba677afaSXin Li
925*ba677afaSXin Li	if len(ids) != 1 {
926*ba677afaSXin Li		t.Fatalf("expected len 1, got %d", len(ids))
927*ba677afaSXin Li	}
928*ba677afaSXin Li
929*ba677afaSXin Li	if ids[0] != "MIT" {
930*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", ids[0])
931*ba677afaSXin Li	}
932*ba677afaSXin Li}
933*ba677afaSXin Li
934*ba677afaSXin Lifunc TestCanStripTrailingStarSlash(t *testing.T) {
935*ba677afaSXin Li	filePath := "../testdata/project2/folder/has-trailing-comment-marker.c"
936*ba677afaSXin Li
937*ba677afaSXin Li	ids, err := searchFileIDs(filePath)
938*ba677afaSXin Li	if err != nil {
939*ba677afaSXin Li		t.Fatalf("expected nil error, got %v", err)
940*ba677afaSXin Li	}
941*ba677afaSXin Li
942*ba677afaSXin Li	if len(ids) != 1 {
943*ba677afaSXin Li		t.Fatalf("expected len 1, got %d", len(ids))
944*ba677afaSXin Li	}
945*ba677afaSXin Li
946*ba677afaSXin Li	if ids[0] != "GPL-2.0-or-later" {
947*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-or-later", ids[0])
948*ba677afaSXin Li	}
949*ba677afaSXin Li}
950*ba677afaSXin Li
951*ba677afaSXin Lifunc TestCanIgnoreShortFormIDWhenTooManyPrefixChars(t *testing.T) {
952*ba677afaSXin Li	filePath := "../testdata/project4/has-id-to-ignore.txt"
953*ba677afaSXin Li
954*ba677afaSXin Li	ids, err := searchFileIDs(filePath)
955*ba677afaSXin Li	if err != nil {
956*ba677afaSXin Li		t.Fatalf("expected nil error, got %v", err)
957*ba677afaSXin Li	}
958*ba677afaSXin Li
959*ba677afaSXin Li	if len(ids) != 0 {
960*ba677afaSXin Li		t.Fatalf("expected len 0, got %d", len(ids))
961*ba677afaSXin Li	}
962*ba677afaSXin Li}
963*ba677afaSXin Li
964*ba677afaSXin Lifunc TestCanPickJustTheRightID(t *testing.T) {
965*ba677afaSXin Li	filePath := "../testdata/project4/has-mix-of-ids.txt"
966*ba677afaSXin Li
967*ba677afaSXin Li	ids, err := searchFileIDs(filePath)
968*ba677afaSXin Li	if err != nil {
969*ba677afaSXin Li		t.Fatalf("expected nil error, got %v", err)
970*ba677afaSXin Li	}
971*ba677afaSXin Li
972*ba677afaSXin Li	if len(ids) != 1 {
973*ba677afaSXin Li		t.Fatalf("expected len 1, got %d", len(ids))
974*ba677afaSXin Li	}
975*ba677afaSXin Li
976*ba677afaSXin Li	if ids[0] != "MIT" {
977*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", ids[0])
978*ba677afaSXin Li	}
979*ba677afaSXin Li}
980*ba677afaSXin Li
981*ba677afaSXin Lifunc TestCannotFindShortFormIDWhenAbsent(t *testing.T) {
982*ba677afaSXin Li	filePath := "../testdata/project2/no-id.txt"
983*ba677afaSXin Li
984*ba677afaSXin Li	ids, err := searchFileIDs(filePath)
985*ba677afaSXin Li	if err != nil {
986*ba677afaSXin Li		t.Fatalf("expected nil error, got %v", err)
987*ba677afaSXin Li	}
988*ba677afaSXin Li
989*ba677afaSXin Li	if len(ids) != 0 {
990*ba677afaSXin Li		t.Fatalf("expected len 0, got %d", len(ids))
991*ba677afaSXin Li	}
992*ba677afaSXin Li}
993*ba677afaSXin Li
994*ba677afaSXin Lifunc TestCanExcludeTrashCharactersFromID(t *testing.T) {
995*ba677afaSXin Li	lid := "Apac\",he-2.0"
996*ba677afaSXin Li	want := "Apache-2.0"
997*ba677afaSXin Li	got := stripTrash(lid)
998*ba677afaSXin Li	if want != got {
999*ba677afaSXin Li		t.Errorf("expected %v, got %v", want, got)
1000*ba677afaSXin Li	}
1001*ba677afaSXin Li
1002*ba677afaSXin Li	lid = "Apache-2.0"
1003*ba677afaSXin Li	want = "Apache-2.0"
1004*ba677afaSXin Li	got = stripTrash(lid)
1005*ba677afaSXin Li	if want != got {
1006*ba677afaSXin Li		t.Errorf("expected %v, got %v", want, got)
1007*ba677afaSXin Li	}
1008*ba677afaSXin Li}
1009*ba677afaSXin Li
1010*ba677afaSXin Lifunc TestSearchFileIDsFailsWithInvalidFilePath(t *testing.T) {
1011*ba677afaSXin Li	filePath := "./oops/nm/invalid"
1012*ba677afaSXin Li
1013*ba677afaSXin Li	_, err := searchFileIDs(filePath)
1014*ba677afaSXin Li	if err == nil {
1015*ba677afaSXin Li		t.Fatalf("expected non-nil error, got nil")
1016*ba677afaSXin Li	}
1017*ba677afaSXin Li}
1018*ba677afaSXin Li
1019*ba677afaSXin Lifunc TestWillParenthesizeIfNeeded(t *testing.T) {
1020*ba677afaSXin Li	licID := "MIT OR BSD-3-Clause"
1021*ba677afaSXin Li	retval := makeElement(licID)
1022*ba677afaSXin Li	if retval != "(MIT OR BSD-3-Clause)" {
1023*ba677afaSXin Li		t.Errorf("expected %v, got %v", "(MIT OR BSD-3-Clause)", retval)
1024*ba677afaSXin Li	}
1025*ba677afaSXin Li
1026*ba677afaSXin Li	licID = "ISC AND HPND"
1027*ba677afaSXin Li	retval = makeElement(licID)
1028*ba677afaSXin Li	if retval != "(ISC AND HPND)" {
1029*ba677afaSXin Li		t.Errorf("expected %v, got %v", "(ISC AND HPND)", retval)
1030*ba677afaSXin Li	}
1031*ba677afaSXin Li}
1032*ba677afaSXin Li
1033*ba677afaSXin Lifunc TestWillNotParenthesizeIfNotNeeded(t *testing.T) {
1034*ba677afaSXin Li	lic := "MIT"
1035*ba677afaSXin Li	retval := makeElement(lic)
1036*ba677afaSXin Li	if retval != "MIT" {
1037*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", retval)
1038*ba677afaSXin Li	}
1039*ba677afaSXin Li
1040*ba677afaSXin Li	lic = "GPL-2.0-only WITH Classpath-exception-2.0"
1041*ba677afaSXin Li	retval = makeElement(lic)
1042*ba677afaSXin Li	if retval != "GPL-2.0-only WITH Classpath-exception-2.0" {
1043*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-only WITH Classpath-exception-2.0", retval)
1044*ba677afaSXin Li	}
1045*ba677afaSXin Li}
1046*ba677afaSXin Li
1047*ba677afaSXin Lifunc TestCanGetIndividualLicenses(t *testing.T) {
1048*ba677afaSXin Li	// single license
1049*ba677afaSXin Li	lic := "MIT"
1050*ba677afaSXin Li	lics := getIndividualLicenses(lic)
1051*ba677afaSXin Li	if lics == nil {
1052*ba677afaSXin Li		t.Fatalf("expected non-nil lics, got nil")
1053*ba677afaSXin Li	}
1054*ba677afaSXin Li	if len(lics) != 1 {
1055*ba677afaSXin Li		t.Fatalf("expected lics to have len 1, got %d", len(lics))
1056*ba677afaSXin Li	}
1057*ba677afaSXin Li	if lics[0] != "MIT" {
1058*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", lics[0])
1059*ba677afaSXin Li	}
1060*ba677afaSXin Li
1061*ba677afaSXin Li	// two-license combo
1062*ba677afaSXin Li	lic = "ISC AND BSD-3-Clause"
1063*ba677afaSXin Li	lics = getIndividualLicenses(lic)
1064*ba677afaSXin Li	if lics == nil {
1065*ba677afaSXin Li		t.Fatalf("expected non-nil lics, got nil")
1066*ba677afaSXin Li	}
1067*ba677afaSXin Li	if len(lics) != 2 {
1068*ba677afaSXin Li		t.Fatalf("expected lics to have len 2, got %d", len(lics))
1069*ba677afaSXin Li	}
1070*ba677afaSXin Li	// should be sorted alphabetically
1071*ba677afaSXin Li	if lics[0] != "BSD-3-Clause" {
1072*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-3-Clause", lics[0])
1073*ba677afaSXin Li	}
1074*ba677afaSXin Li	if lics[1] != "ISC" {
1075*ba677afaSXin Li		t.Errorf("expected %v, got %v", "ISC", lics[1])
1076*ba677afaSXin Li	}
1077*ba677afaSXin Li
1078*ba677afaSXin Li	// license WITH exception
1079*ba677afaSXin Li	lic = "GPL-2.0-only WITH Classpath-exception-2.0"
1080*ba677afaSXin Li	lics = getIndividualLicenses(lic)
1081*ba677afaSXin Li	if lics == nil {
1082*ba677afaSXin Li		t.Fatalf("expected non-nil lics, got nil")
1083*ba677afaSXin Li	}
1084*ba677afaSXin Li	if len(lics) != 2 {
1085*ba677afaSXin Li		t.Fatalf("expected lics to have len 2, got %d", len(lics))
1086*ba677afaSXin Li	}
1087*ba677afaSXin Li	// exception should be listed separately
1088*ba677afaSXin Li	if lics[0] != "Classpath-exception-2.0" {
1089*ba677afaSXin Li		t.Errorf("expected %v, got %v", "Classpath-exception-2.0", lics[0])
1090*ba677afaSXin Li	}
1091*ba677afaSXin Li	if lics[1] != "GPL-2.0-only" {
1092*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-only", lics[1])
1093*ba677afaSXin Li	}
1094*ba677afaSXin Li
1095*ba677afaSXin Li	// two-license combo with parens
1096*ba677afaSXin Li	lic = "(JSON OR BSD-2-Clause)"
1097*ba677afaSXin Li	lics = getIndividualLicenses(lic)
1098*ba677afaSXin Li	if lics == nil {
1099*ba677afaSXin Li		t.Fatalf("expected non-nil lics, got nil")
1100*ba677afaSXin Li	}
1101*ba677afaSXin Li	if len(lics) != 2 {
1102*ba677afaSXin Li		t.Fatalf("expected lics to have len 2, got %d", len(lics))
1103*ba677afaSXin Li	}
1104*ba677afaSXin Li	// parens should get dropped
1105*ba677afaSXin Li	if lics[0] != "BSD-2-Clause" {
1106*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-2-Clause", lics[0])
1107*ba677afaSXin Li	}
1108*ba677afaSXin Li	if lics[1] != "JSON" {
1109*ba677afaSXin Li		t.Errorf("expected %v, got %v", "JSON", lics[1])
1110*ba677afaSXin Li	}
1111*ba677afaSXin Li
1112*ba677afaSXin Li	// multi-license combo with nested parens
1113*ba677afaSXin Li	lic = "GPL-2.0-only AND ((EPL-1.0 AND BSD-4-Clause) OR MIT)"
1114*ba677afaSXin Li	lics = getIndividualLicenses(lic)
1115*ba677afaSXin Li	if lics == nil {
1116*ba677afaSXin Li		t.Fatalf("expected non-nil lics, got nil")
1117*ba677afaSXin Li	}
1118*ba677afaSXin Li	if len(lics) != 4 {
1119*ba677afaSXin Li		t.Fatalf("expected lics to have len 4, got %d", len(lics))
1120*ba677afaSXin Li	}
1121*ba677afaSXin Li	if lics[0] != "BSD-4-Clause" {
1122*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-4-Clause", lics[0])
1123*ba677afaSXin Li	}
1124*ba677afaSXin Li	if lics[1] != "EPL-1.0" {
1125*ba677afaSXin Li		t.Errorf("expected %v, got %v", "EPL-1.0", lics[1])
1126*ba677afaSXin Li	}
1127*ba677afaSXin Li	if lics[2] != "GPL-2.0-only" {
1128*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-only", lics[2])
1129*ba677afaSXin Li	}
1130*ba677afaSXin Li	if lics[3] != "MIT" {
1131*ba677afaSXin Li		t.Errorf("expected %v, got %v", "MIT", lics[3])
1132*ba677afaSXin Li	}
1133*ba677afaSXin Li}
1134*ba677afaSXin Li
1135*ba677afaSXin Lifunc TestCanGetIndividualLicensesIgnoringOperatorCase(t *testing.T) {
1136*ba677afaSXin Li	// two-license combo with lowercase 'and'
1137*ba677afaSXin Li	lic := "ISC and BSD-3-Clause"
1138*ba677afaSXin Li	lics := getIndividualLicenses(lic)
1139*ba677afaSXin Li	if lics == nil {
1140*ba677afaSXin Li		t.Fatalf("expected non-nil lics, got nil")
1141*ba677afaSXin Li	}
1142*ba677afaSXin Li	// should be sorted alphabetically; 'and' should not appear
1143*ba677afaSXin Li	if len(lics) != 2 {
1144*ba677afaSXin Li		t.Fatalf("expected lics to have len 2, got %d", len(lics))
1145*ba677afaSXin Li	}
1146*ba677afaSXin Li	if lics[0] != "BSD-3-Clause" {
1147*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-3-Clause", lics[0])
1148*ba677afaSXin Li	}
1149*ba677afaSXin Li	if lics[1] != "ISC" {
1150*ba677afaSXin Li		t.Errorf("expected %v, got %v", "ISC", lics[1])
1151*ba677afaSXin Li	}
1152*ba677afaSXin Li
1153*ba677afaSXin Li	// two-license combo with lowercase 'or'
1154*ba677afaSXin Li	lic = "ISC or BSD-3-Clause"
1155*ba677afaSXin Li	lics = getIndividualLicenses(lic)
1156*ba677afaSXin Li	if lics == nil {
1157*ba677afaSXin Li		t.Fatalf("expected non-nil lics, got nil")
1158*ba677afaSXin Li	}
1159*ba677afaSXin Li	// should be sorted alphabetically; 'or' should not appear
1160*ba677afaSXin Li	if len(lics) != 2 {
1161*ba677afaSXin Li		t.Fatalf("expected lics to have len 2, got %d", len(lics))
1162*ba677afaSXin Li	}
1163*ba677afaSXin Li	if lics[0] != "BSD-3-Clause" {
1164*ba677afaSXin Li		t.Errorf("expected %v, got %v", "BSD-3-Clause", lics[0])
1165*ba677afaSXin Li	}
1166*ba677afaSXin Li	if lics[1] != "ISC" {
1167*ba677afaSXin Li		t.Errorf("expected %v, got %v", "ISC", lics[1])
1168*ba677afaSXin Li	}
1169*ba677afaSXin Li
1170*ba677afaSXin Li	// two-license combo with lowercase 'with'
1171*ba677afaSXin Li	lic = "GPL-2.0-only with Classpath-exception-2.0"
1172*ba677afaSXin Li	lics = getIndividualLicenses(lic)
1173*ba677afaSXin Li	if lics == nil {
1174*ba677afaSXin Li		t.Fatalf("expected non-nil lics, got nil")
1175*ba677afaSXin Li	}
1176*ba677afaSXin Li	// should be sorted alphabetically; 'with' should not appear
1177*ba677afaSXin Li	if len(lics) != 2 {
1178*ba677afaSXin Li		t.Fatalf("expected lics to have len 2, got %d", len(lics))
1179*ba677afaSXin Li	}
1180*ba677afaSXin Li	if lics[0] != "Classpath-exception-2.0" {
1181*ba677afaSXin Li		t.Errorf("expected %v, got %v", "Classpath-exception-2.0", lics[0])
1182*ba677afaSXin Li	}
1183*ba677afaSXin Li	if lics[1] != "GPL-2.0-only" {
1184*ba677afaSXin Li		t.Errorf("expected %v, got %v", "GPL-2.0-only", lics[1])
1185*ba677afaSXin Li	}
1186*ba677afaSXin Li
1187*ba677afaSXin Li}
1188