xref: /aosp_15_r20/external/spdx-tools/licensediff/licensediff_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 licensediff
4*ba677afaSXin Li
5*ba677afaSXin Liimport (
6*ba677afaSXin Li	"testing"
7*ba677afaSXin Li
8*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/common"
9*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/v2_1"
10*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/v2_2"
11*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/v2_3"
12*ba677afaSXin Li)
13*ba677afaSXin Li
14*ba677afaSXin Li// ===== 2.1 License diff top-level function tests =====
15*ba677afaSXin Lifunc Test2_1DifferCanCreateDiffPairs(t *testing.T) {
16*ba677afaSXin Li	// create files to be used in diff
17*ba677afaSXin Li	// f1 will be identical in both
18*ba677afaSXin Li	f1 := &v2_1.File{
19*ba677afaSXin Li		FileName:           "/project/file1.txt",
20*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File561"),
21*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", Algorithm: common.SHA1}},
22*ba677afaSXin Li		LicenseConcluded:   "Apache-2.0",
23*ba677afaSXin Li		LicenseInfoInFiles: []string{
24*ba677afaSXin Li			"LicenseRef-We-will-ignore-LicenseInfoInFiles",
25*ba677afaSXin Li		},
26*ba677afaSXin Li		FileCopyrightText: "We'll ignore copyright values",
27*ba677afaSXin Li	}
28*ba677afaSXin Li
29*ba677afaSXin Li	// f2 will only appear in the first Package
30*ba677afaSXin Li	f2 := &v2_1.File{
31*ba677afaSXin Li		FileName:           "/project/file2.txt",
32*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File562"),
33*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "066c5139bd9a43d15812ec1a1755b08ccf199824", Algorithm: common.SHA1}},
34*ba677afaSXin Li		LicenseConcluded:   "GPL-2.0-or-later",
35*ba677afaSXin Li		LicenseInfoInFiles: []string{
36*ba677afaSXin Li			"NOASSERTION",
37*ba677afaSXin Li		},
38*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
39*ba677afaSXin Li	}
40*ba677afaSXin Li
41*ba677afaSXin Li	// f3 will only appear in the second Package
42*ba677afaSXin Li	f3 := &v2_1.File{
43*ba677afaSXin Li		FileName:           "/project/file3.txt",
44*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File563"),
45*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "bd0f4863b15fad2b79b35303af54fcb5baaf7c68", Algorithm: common.SHA1}},
46*ba677afaSXin Li		LicenseConcluded:   "MPL-2.0",
47*ba677afaSXin Li		LicenseInfoInFiles: []string{
48*ba677afaSXin Li			"NOASSERTION",
49*ba677afaSXin Li		},
50*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
51*ba677afaSXin Li	}
52*ba677afaSXin Li
53*ba677afaSXin Li	// f4_1 and f4_2 will appear in first and second,
54*ba677afaSXin Li	// with same name, same hash and different license
55*ba677afaSXin Li	f4_1 := &v2_1.File{
56*ba677afaSXin Li		FileName:           "/project/file4.txt",
57*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File564"),
58*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "bc417a575ceae93435bcb7bfd382ac28cbdaa8b5", Algorithm: common.SHA1}},
59*ba677afaSXin Li		LicenseConcluded:   "MIT",
60*ba677afaSXin Li		LicenseInfoInFiles: []string{
61*ba677afaSXin Li			"NOASSERTION",
62*ba677afaSXin Li		},
63*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
64*ba677afaSXin Li	}
65*ba677afaSXin Li	f4_2 := &v2_1.File{
66*ba677afaSXin Li		FileName:           "/project/file4.txt",
67*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File564"),
68*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "bc417a575ceae93435bcb7bfd382ac28cbdaa8b5", Algorithm: common.SHA1}},
69*ba677afaSXin Li		LicenseConcluded:   "Apache-2.0 AND MIT",
70*ba677afaSXin Li		LicenseInfoInFiles: []string{
71*ba677afaSXin Li			"NOASSERTION",
72*ba677afaSXin Li		},
73*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
74*ba677afaSXin Li	}
75*ba677afaSXin Li
76*ba677afaSXin Li	// f5_1 and f5_2 will appear in first and second,
77*ba677afaSXin Li	// with same name, different hash and same license
78*ba677afaSXin Li	f5_1 := &v2_1.File{
79*ba677afaSXin Li		FileName:           "/project/file5.txt",
80*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File565"),
81*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "ba226db943bbbf455da77afab6f16dbab156d000", Algorithm: common.SHA1}},
82*ba677afaSXin Li		LicenseConcluded:   "BSD-3-Clause",
83*ba677afaSXin Li		LicenseInfoInFiles: []string{
84*ba677afaSXin Li			"NOASSERTION",
85*ba677afaSXin Li		},
86*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
87*ba677afaSXin Li	}
88*ba677afaSXin Li	f5_2 := &v2_1.File{
89*ba677afaSXin Li		FileName:           "/project/file5.txt",
90*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File565"),
91*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "b6e0ec7d085c5699b46f6f8d425413702652874d", Algorithm: common.SHA1}},
92*ba677afaSXin Li		LicenseConcluded:   "BSD-3-Clause",
93*ba677afaSXin Li		LicenseInfoInFiles: []string{
94*ba677afaSXin Li			"NOASSERTION",
95*ba677afaSXin Li		},
96*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
97*ba677afaSXin Li	}
98*ba677afaSXin Li
99*ba677afaSXin Li	// f6_1 and f6_2 will appear in first and second,
100*ba677afaSXin Li	// with same name, different hash and different license
101*ba677afaSXin Li	f6_1 := &v2_1.File{
102*ba677afaSXin Li		FileName:           "/project/file6.txt",
103*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File566"),
104*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "ba226db943bbbf455da77afab6f16dbab156d000", Algorithm: common.SHA1}},
105*ba677afaSXin Li		LicenseConcluded:   "CC0-1.0",
106*ba677afaSXin Li		LicenseInfoInFiles: []string{
107*ba677afaSXin Li			"NOASSERTION",
108*ba677afaSXin Li		},
109*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
110*ba677afaSXin Li	}
111*ba677afaSXin Li	f6_2 := &v2_1.File{
112*ba677afaSXin Li		FileName:           "/project/file6.txt",
113*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File566"),
114*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "b6e0ec7d085c5699b46f6f8d425413702652874d", Algorithm: common.SHA1}},
115*ba677afaSXin Li		LicenseConcluded:   "Unlicense",
116*ba677afaSXin Li		LicenseInfoInFiles: []string{
117*ba677afaSXin Li			"NOASSERTION",
118*ba677afaSXin Li		},
119*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
120*ba677afaSXin Li	}
121*ba677afaSXin Li
122*ba677afaSXin Li	// create Packages
123*ba677afaSXin Li	p1 := &v2_1.Package{
124*ba677afaSXin Li		PackageName:               "p1",
125*ba677afaSXin Li		PackageSPDXIdentifier:     common.ElementID("p1"),
126*ba677afaSXin Li		PackageDownloadLocation:   "NOASSERTION",
127*ba677afaSXin Li		FilesAnalyzed:             true,
128*ba677afaSXin Li		IsFilesAnalyzedTagPresent: true,
129*ba677afaSXin Li		// fake the verification code for present purposes
130*ba677afaSXin Li		PackageVerificationCode: common.PackageVerificationCode{Value: "abc123abc123"},
131*ba677afaSXin Li		PackageLicenseConcluded: "NOASSERTION",
132*ba677afaSXin Li		PackageLicenseInfoFromFiles: []string{
133*ba677afaSXin Li			"NOASSERTION",
134*ba677afaSXin Li		},
135*ba677afaSXin Li		PackageLicenseDeclared: "NOASSERTION",
136*ba677afaSXin Li		PackageCopyrightText:   "NOASSERTION",
137*ba677afaSXin Li		Files: []*v2_1.File{
138*ba677afaSXin Li			f1,
139*ba677afaSXin Li			f2,
140*ba677afaSXin Li			f4_1,
141*ba677afaSXin Li			f5_1,
142*ba677afaSXin Li			f6_1,
143*ba677afaSXin Li		},
144*ba677afaSXin Li	}
145*ba677afaSXin Li	p2 := &v2_1.Package{
146*ba677afaSXin Li		PackageName:               "p2",
147*ba677afaSXin Li		PackageSPDXIdentifier:     common.ElementID("p2"),
148*ba677afaSXin Li		PackageDownloadLocation:   "NOASSERTION",
149*ba677afaSXin Li		FilesAnalyzed:             true,
150*ba677afaSXin Li		IsFilesAnalyzedTagPresent: true,
151*ba677afaSXin Li		// fake the verification code for present purposes
152*ba677afaSXin Li		PackageVerificationCode: common.PackageVerificationCode{Value: "def456def456"},
153*ba677afaSXin Li		PackageLicenseConcluded: "NOASSERTION",
154*ba677afaSXin Li		PackageLicenseInfoFromFiles: []string{
155*ba677afaSXin Li			"NOASSERTION",
156*ba677afaSXin Li		},
157*ba677afaSXin Li		PackageLicenseDeclared: "NOASSERTION",
158*ba677afaSXin Li		PackageCopyrightText:   "NOASSERTION",
159*ba677afaSXin Li		Files: []*v2_1.File{
160*ba677afaSXin Li			f1,
161*ba677afaSXin Li			f3,
162*ba677afaSXin Li			f4_2,
163*ba677afaSXin Li			f5_2,
164*ba677afaSXin Li			f6_2,
165*ba677afaSXin Li		},
166*ba677afaSXin Li	}
167*ba677afaSXin Li
168*ba677afaSXin Li	// run the diff between the two packages
169*ba677afaSXin Li	diffMap, err := MakePairs2_1(p1, p2)
170*ba677afaSXin Li	if err != nil {
171*ba677afaSXin Li		t.Fatalf("Expected nil error, got %v", err)
172*ba677afaSXin Li	}
173*ba677afaSXin Li
174*ba677afaSXin Li	// check that the diff results are what we expect
175*ba677afaSXin Li	// there should be 6 entries, one for each unique filename
176*ba677afaSXin Li	if len(diffMap) != 6 {
177*ba677afaSXin Li		t.Fatalf("Expected %d, got %d", 6, len(diffMap))
178*ba677afaSXin Li	}
179*ba677afaSXin Li
180*ba677afaSXin Li	// check each filename is present, and check its pair
181*ba677afaSXin Li	// pair 1 -- same in both
182*ba677afaSXin Li	pair1, ok := diffMap["/project/file1.txt"]
183*ba677afaSXin Li	if !ok {
184*ba677afaSXin Li		t.Fatalf("Couldn't get pair1")
185*ba677afaSXin Li	}
186*ba677afaSXin Li	if pair1.First != f1.LicenseConcluded {
187*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f1.LicenseConcluded, pair1.First)
188*ba677afaSXin Li	}
189*ba677afaSXin Li	if pair1.Second != f1.LicenseConcluded {
190*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f2.LicenseConcluded, pair1.Second)
191*ba677afaSXin Li	}
192*ba677afaSXin Li
193*ba677afaSXin Li	// pair 2 -- only in first
194*ba677afaSXin Li	pair2, ok := diffMap["/project/file2.txt"]
195*ba677afaSXin Li	if !ok {
196*ba677afaSXin Li		t.Fatalf("Couldn't get pair2")
197*ba677afaSXin Li	}
198*ba677afaSXin Li	if pair2.First != f2.LicenseConcluded {
199*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f2.LicenseConcluded, pair2.First)
200*ba677afaSXin Li	}
201*ba677afaSXin Li	if pair2.Second != "" {
202*ba677afaSXin Li		t.Errorf("Expected %s, got %s", "", pair2.Second)
203*ba677afaSXin Li	}
204*ba677afaSXin Li
205*ba677afaSXin Li	// pair 3 -- only in second
206*ba677afaSXin Li	pair3, ok := diffMap["/project/file3.txt"]
207*ba677afaSXin Li	if !ok {
208*ba677afaSXin Li		t.Fatalf("Couldn't get pair3")
209*ba677afaSXin Li	}
210*ba677afaSXin Li	if pair3.First != "" {
211*ba677afaSXin Li		t.Errorf("Expected %s, got %s", "", pair3.First)
212*ba677afaSXin Li	}
213*ba677afaSXin Li	if pair3.Second != f3.LicenseConcluded {
214*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f3.LicenseConcluded, pair3.Second)
215*ba677afaSXin Li	}
216*ba677afaSXin Li
217*ba677afaSXin Li	// pair 4 -- in both but different license
218*ba677afaSXin Li	pair4, ok := diffMap["/project/file4.txt"]
219*ba677afaSXin Li	if !ok {
220*ba677afaSXin Li		t.Fatalf("Couldn't get pair4")
221*ba677afaSXin Li	}
222*ba677afaSXin Li	if pair4.First != f4_1.LicenseConcluded {
223*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f4_1.LicenseConcluded, pair4.First)
224*ba677afaSXin Li	}
225*ba677afaSXin Li	if pair4.Second != f4_2.LicenseConcluded {
226*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f4_2.LicenseConcluded, pair4.Second)
227*ba677afaSXin Li	}
228*ba677afaSXin Li
229*ba677afaSXin Li	// pair 5 -- in both but different hash, same license
230*ba677afaSXin Li	pair5, ok := diffMap["/project/file5.txt"]
231*ba677afaSXin Li	if !ok {
232*ba677afaSXin Li		t.Fatalf("Couldn't get pair5")
233*ba677afaSXin Li	}
234*ba677afaSXin Li	if pair5.First != f5_1.LicenseConcluded {
235*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f5_1.LicenseConcluded, pair5.First)
236*ba677afaSXin Li	}
237*ba677afaSXin Li	if pair5.Second != f5_2.LicenseConcluded {
238*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f5_2.LicenseConcluded, pair5.Second)
239*ba677afaSXin Li	}
240*ba677afaSXin Li
241*ba677afaSXin Li	// pair 6 -- in both but different hash, different license
242*ba677afaSXin Li	pair6, ok := diffMap["/project/file6.txt"]
243*ba677afaSXin Li	if !ok {
244*ba677afaSXin Li		t.Fatalf("Couldn't get pair6")
245*ba677afaSXin Li	}
246*ba677afaSXin Li	if pair6.First != f6_1.LicenseConcluded {
247*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f6_1.LicenseConcluded, pair6.First)
248*ba677afaSXin Li	}
249*ba677afaSXin Li	if pair6.Second != f6_2.LicenseConcluded {
250*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f6_2.LicenseConcluded, pair6.Second)
251*ba677afaSXin Li	}
252*ba677afaSXin Li}
253*ba677afaSXin Li
254*ba677afaSXin Lifunc Test2_1DifferCanCreateDiffStructuredResults(t *testing.T) {
255*ba677afaSXin Li	// create files to be used in diff
256*ba677afaSXin Li	// f1 will be identical in both
257*ba677afaSXin Li	f1 := &v2_1.File{
258*ba677afaSXin Li		FileName:           "/project/file1.txt",
259*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File561"),
260*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", Algorithm: common.SHA1}},
261*ba677afaSXin Li		LicenseConcluded:   "Apache-2.0",
262*ba677afaSXin Li		LicenseInfoInFiles: []string{
263*ba677afaSXin Li			"LicenseRef-We-will-ignore-LicenseInfoInFiles",
264*ba677afaSXin Li		},
265*ba677afaSXin Li		FileCopyrightText: "We'll ignore copyright values",
266*ba677afaSXin Li	}
267*ba677afaSXin Li
268*ba677afaSXin Li	// f2 will only appear in the first Package
269*ba677afaSXin Li	f2 := &v2_1.File{
270*ba677afaSXin Li		FileName:           "/project/file2.txt",
271*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File562"),
272*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "066c5139bd9a43d15812ec1a1755b08ccf199824", Algorithm: common.SHA1}},
273*ba677afaSXin Li		LicenseConcluded:   "GPL-2.0-or-later",
274*ba677afaSXin Li		LicenseInfoInFiles: []string{
275*ba677afaSXin Li			"NOASSERTION",
276*ba677afaSXin Li		},
277*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
278*ba677afaSXin Li	}
279*ba677afaSXin Li
280*ba677afaSXin Li	// f3 will only appear in the second Package
281*ba677afaSXin Li	f3 := &v2_1.File{
282*ba677afaSXin Li		FileName:           "/project/file3.txt",
283*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File563"),
284*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "bd0f4863b15fad2b79b35303af54fcb5baaf7c68", Algorithm: common.SHA1}},
285*ba677afaSXin Li		LicenseConcluded:   "MPL-2.0",
286*ba677afaSXin Li		LicenseInfoInFiles: []string{
287*ba677afaSXin Li			"NOASSERTION",
288*ba677afaSXin Li		},
289*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
290*ba677afaSXin Li	}
291*ba677afaSXin Li
292*ba677afaSXin Li	// f4_1 and f4_2 will appear in first and second,
293*ba677afaSXin Li	// with same name, same hash and different license
294*ba677afaSXin Li	f4_1 := &v2_1.File{
295*ba677afaSXin Li		FileName:           "/project/file4.txt",
296*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File564"),
297*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "bc417a575ceae93435bcb7bfd382ac28cbdaa8b5", Algorithm: common.SHA1}},
298*ba677afaSXin Li		LicenseConcluded:   "MIT",
299*ba677afaSXin Li		LicenseInfoInFiles: []string{
300*ba677afaSXin Li			"NOASSERTION",
301*ba677afaSXin Li		},
302*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
303*ba677afaSXin Li	}
304*ba677afaSXin Li	f4_2 := &v2_1.File{
305*ba677afaSXin Li		FileName:           "/project/file4.txt",
306*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File564"),
307*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "bc417a575ceae93435bcb7bfd382ac28cbdaa8b5", Algorithm: common.SHA1}},
308*ba677afaSXin Li		LicenseConcluded:   "Apache-2.0 AND MIT",
309*ba677afaSXin Li		LicenseInfoInFiles: []string{
310*ba677afaSXin Li			"NOASSERTION",
311*ba677afaSXin Li		},
312*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
313*ba677afaSXin Li	}
314*ba677afaSXin Li
315*ba677afaSXin Li	// f5_1 and f5_2 will appear in first and second,
316*ba677afaSXin Li	// with same name, different hash and same license
317*ba677afaSXin Li	f5_1 := &v2_1.File{
318*ba677afaSXin Li		FileName:           "/project/file5.txt",
319*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File565"),
320*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "ba226db943bbbf455da77afab6f16dbab156d000", Algorithm: common.SHA1}},
321*ba677afaSXin Li		LicenseConcluded:   "BSD-3-Clause",
322*ba677afaSXin Li		LicenseInfoInFiles: []string{
323*ba677afaSXin Li			"NOASSERTION",
324*ba677afaSXin Li		},
325*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
326*ba677afaSXin Li	}
327*ba677afaSXin Li	f5_2 := &v2_1.File{
328*ba677afaSXin Li		FileName:           "/project/file5.txt",
329*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File565"),
330*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "b6e0ec7d085c5699b46f6f8d425413702652874d", Algorithm: common.SHA1}},
331*ba677afaSXin Li		LicenseConcluded:   "BSD-3-Clause",
332*ba677afaSXin Li		LicenseInfoInFiles: []string{
333*ba677afaSXin Li			"NOASSERTION",
334*ba677afaSXin Li		},
335*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
336*ba677afaSXin Li	}
337*ba677afaSXin Li
338*ba677afaSXin Li	// f6_1 and f6_2 will appear in first and second,
339*ba677afaSXin Li	// with same name, different hash and different license
340*ba677afaSXin Li	f6_1 := &v2_1.File{
341*ba677afaSXin Li		FileName:           "/project/file6.txt",
342*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File566"),
343*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "ba226db943bbbf455da77afab6f16dbab156d000", Algorithm: common.SHA1}},
344*ba677afaSXin Li		LicenseConcluded:   "CC0-1.0",
345*ba677afaSXin Li		LicenseInfoInFiles: []string{
346*ba677afaSXin Li			"NOASSERTION",
347*ba677afaSXin Li		},
348*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
349*ba677afaSXin Li	}
350*ba677afaSXin Li	f6_2 := &v2_1.File{
351*ba677afaSXin Li		FileName:           "/project/file6.txt",
352*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File566"),
353*ba677afaSXin Li		Checksums:          []common.Checksum{{Value: "b6e0ec7d085c5699b46f6f8d425413702652874d", Algorithm: common.SHA1}},
354*ba677afaSXin Li		LicenseConcluded:   "Unlicense",
355*ba677afaSXin Li		LicenseInfoInFiles: []string{
356*ba677afaSXin Li			"NOASSERTION",
357*ba677afaSXin Li		},
358*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
359*ba677afaSXin Li	}
360*ba677afaSXin Li
361*ba677afaSXin Li	// create Packages
362*ba677afaSXin Li	p1 := &v2_1.Package{
363*ba677afaSXin Li		PackageName:               "p1",
364*ba677afaSXin Li		PackageSPDXIdentifier:     common.ElementID("p1"),
365*ba677afaSXin Li		PackageDownloadLocation:   "NOASSERTION",
366*ba677afaSXin Li		FilesAnalyzed:             true,
367*ba677afaSXin Li		IsFilesAnalyzedTagPresent: true,
368*ba677afaSXin Li		// fake the verification code for present purposes
369*ba677afaSXin Li		PackageVerificationCode: common.PackageVerificationCode{Value: "abc123abc123"},
370*ba677afaSXin Li		PackageLicenseConcluded: "NOASSERTION",
371*ba677afaSXin Li		PackageLicenseInfoFromFiles: []string{
372*ba677afaSXin Li			"NOASSERTION",
373*ba677afaSXin Li		},
374*ba677afaSXin Li		PackageLicenseDeclared: "NOASSERTION",
375*ba677afaSXin Li		PackageCopyrightText:   "NOASSERTION",
376*ba677afaSXin Li		Files: []*v2_1.File{
377*ba677afaSXin Li			f1,
378*ba677afaSXin Li			f2,
379*ba677afaSXin Li			f4_1,
380*ba677afaSXin Li			f5_1,
381*ba677afaSXin Li			f6_1,
382*ba677afaSXin Li		},
383*ba677afaSXin Li	}
384*ba677afaSXin Li	p2 := &v2_1.Package{
385*ba677afaSXin Li		PackageName:               "p2",
386*ba677afaSXin Li		PackageSPDXIdentifier:     common.ElementID("p2"),
387*ba677afaSXin Li		PackageDownloadLocation:   "NOASSERTION",
388*ba677afaSXin Li		FilesAnalyzed:             true,
389*ba677afaSXin Li		IsFilesAnalyzedTagPresent: true,
390*ba677afaSXin Li		// fake the verification code for present purposes
391*ba677afaSXin Li		PackageVerificationCode: common.PackageVerificationCode{Value: "def456def456"},
392*ba677afaSXin Li		PackageLicenseConcluded: "NOASSERTION",
393*ba677afaSXin Li		PackageLicenseInfoFromFiles: []string{
394*ba677afaSXin Li			"NOASSERTION",
395*ba677afaSXin Li		},
396*ba677afaSXin Li		PackageLicenseDeclared: "NOASSERTION",
397*ba677afaSXin Li		PackageCopyrightText:   "NOASSERTION",
398*ba677afaSXin Li		Files: []*v2_1.File{
399*ba677afaSXin Li			f1,
400*ba677afaSXin Li			f3,
401*ba677afaSXin Li			f4_2,
402*ba677afaSXin Li			f5_2,
403*ba677afaSXin Li			f6_2,
404*ba677afaSXin Li		},
405*ba677afaSXin Li	}
406*ba677afaSXin Li
407*ba677afaSXin Li	// run the diff between the two packages
408*ba677afaSXin Li	diffMap, err := MakePairs2_1(p1, p2)
409*ba677afaSXin Li	if err != nil {
410*ba677afaSXin Li		t.Fatalf("Expected nil error, got %v", err)
411*ba677afaSXin Li	}
412*ba677afaSXin Li
413*ba677afaSXin Li	// now, create the LicenseDiff structured results from the pairs
414*ba677afaSXin Li	diffResults, err := MakeResults(diffMap)
415*ba677afaSXin Li	if err != nil {
416*ba677afaSXin Li		t.Fatalf("Expected nil error, got %v", err)
417*ba677afaSXin Li	}
418*ba677afaSXin Li
419*ba677afaSXin Li	// check that the diff results are the expected lengths
420*ba677afaSXin Li	if len(diffResults.InBothChanged) != 2 {
421*ba677afaSXin Li		t.Fatalf("Expected %d, got %d", 2, len(diffResults.InBothChanged))
422*ba677afaSXin Li	}
423*ba677afaSXin Li	if len(diffResults.InBothSame) != 2 {
424*ba677afaSXin Li		t.Fatalf("Expected %d, got %d", 2, len(diffResults.InBothSame))
425*ba677afaSXin Li	}
426*ba677afaSXin Li	if len(diffResults.InFirstOnly) != 1 {
427*ba677afaSXin Li		t.Fatalf("Expected %d, got %d", 1, len(diffResults.InFirstOnly))
428*ba677afaSXin Li	}
429*ba677afaSXin Li	if len(diffResults.InSecondOnly) != 1 {
430*ba677afaSXin Li		t.Fatalf("Expected %d, got %d", 1, len(diffResults.InSecondOnly))
431*ba677afaSXin Li	}
432*ba677afaSXin Li
433*ba677afaSXin Li	// check each filename is present where it belongs, and check license(s)
434*ba677afaSXin Li
435*ba677afaSXin Li	// in both and different license: f4 and f6
436*ba677afaSXin Li	// filename will map to a LicensePair
437*ba677afaSXin Li	check4, ok := diffResults.InBothChanged["/project/file4.txt"]
438*ba677afaSXin Li	if !ok {
439*ba677afaSXin Li		t.Fatalf("Couldn't get check4")
440*ba677afaSXin Li	}
441*ba677afaSXin Li	if check4.First != f4_1.LicenseConcluded {
442*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f4_1.LicenseConcluded, check4.First)
443*ba677afaSXin Li	}
444*ba677afaSXin Li	if check4.Second != f4_2.LicenseConcluded {
445*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f4_2.LicenseConcluded, check4.Second)
446*ba677afaSXin Li	}
447*ba677afaSXin Li	check6, ok := diffResults.InBothChanged["/project/file6.txt"]
448*ba677afaSXin Li	if !ok {
449*ba677afaSXin Li		t.Fatalf("Couldn't get check6")
450*ba677afaSXin Li	}
451*ba677afaSXin Li	if check6.First != f6_1.LicenseConcluded {
452*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f6_1.LicenseConcluded, check6.First)
453*ba677afaSXin Li	}
454*ba677afaSXin Li	if check6.Second != f6_2.LicenseConcluded {
455*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f6_2.LicenseConcluded, check6.Second)
456*ba677afaSXin Li	}
457*ba677afaSXin Li
458*ba677afaSXin Li	// in both and same license: f1 and f5
459*ba677afaSXin Li	// filename will map to a string
460*ba677afaSXin Li	check1, ok := diffResults.InBothSame["/project/file1.txt"]
461*ba677afaSXin Li	if !ok {
462*ba677afaSXin Li		t.Fatalf("Couldn't get check1")
463*ba677afaSXin Li	}
464*ba677afaSXin Li	if check1 != f1.LicenseConcluded {
465*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f1.LicenseConcluded, check1)
466*ba677afaSXin Li	}
467*ba677afaSXin Li	check5, ok := diffResults.InBothSame["/project/file5.txt"]
468*ba677afaSXin Li	if !ok {
469*ba677afaSXin Li		t.Fatalf("Couldn't get check5")
470*ba677afaSXin Li	}
471*ba677afaSXin Li	if check5 != f5_1.LicenseConcluded {
472*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f5_1.LicenseConcluded, check5)
473*ba677afaSXin Li	}
474*ba677afaSXin Li	if check5 != f5_2.LicenseConcluded {
475*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f5_2.LicenseConcluded, check5)
476*ba677afaSXin Li	}
477*ba677afaSXin Li
478*ba677afaSXin Li	// in first only: f2
479*ba677afaSXin Li	// filename will map to a string
480*ba677afaSXin Li	check2, ok := diffResults.InFirstOnly["/project/file2.txt"]
481*ba677afaSXin Li	if !ok {
482*ba677afaSXin Li		t.Fatalf("Couldn't get check2")
483*ba677afaSXin Li	}
484*ba677afaSXin Li	if check2 != f2.LicenseConcluded {
485*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f2.LicenseConcluded, check2)
486*ba677afaSXin Li	}
487*ba677afaSXin Li
488*ba677afaSXin Li	// in second only: f3
489*ba677afaSXin Li	// filename will map to a string
490*ba677afaSXin Li	check3, ok := diffResults.InSecondOnly["/project/file3.txt"]
491*ba677afaSXin Li	if !ok {
492*ba677afaSXin Li		t.Fatalf("Couldn't get check3")
493*ba677afaSXin Li	}
494*ba677afaSXin Li	if check3 != f3.LicenseConcluded {
495*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f3.LicenseConcluded, check2)
496*ba677afaSXin Li	}
497*ba677afaSXin Li
498*ba677afaSXin Li}
499*ba677afaSXin Li
500*ba677afaSXin Li// ===== 2.2 License diff top-level function tests =====
501*ba677afaSXin Lifunc Test2_2DifferCanCreateDiffPairs(t *testing.T) {
502*ba677afaSXin Li	// create files to be used in diff
503*ba677afaSXin Li	// f1 will be identical in both
504*ba677afaSXin Li	f1 := &v2_2.File{
505*ba677afaSXin Li		FileName:           "/project/file1.txt",
506*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File561"),
507*ba677afaSXin Li		Checksums: []common.Checksum{{
508*ba677afaSXin Li			Algorithm: common.SHA1,
509*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
510*ba677afaSXin Li		},
511*ba677afaSXin Li		},
512*ba677afaSXin Li		LicenseConcluded: "Apache-2.0",
513*ba677afaSXin Li		LicenseInfoInFiles: []string{
514*ba677afaSXin Li			"LicenseRef-We-will-ignore-LicenseInfoInFiles",
515*ba677afaSXin Li		},
516*ba677afaSXin Li		FileCopyrightText: "We'll ignore copyright values",
517*ba677afaSXin Li	}
518*ba677afaSXin Li
519*ba677afaSXin Li	// f2 will only appear in the first Package
520*ba677afaSXin Li	f2 := &v2_2.File{
521*ba677afaSXin Li		FileName:           "/project/file2.txt",
522*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File562"),
523*ba677afaSXin Li		Checksums: []common.Checksum{{
524*ba677afaSXin Li			Algorithm: common.SHA1,
525*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
526*ba677afaSXin Li		},
527*ba677afaSXin Li		},
528*ba677afaSXin Li		LicenseConcluded: "GPL-2.0-or-later",
529*ba677afaSXin Li		LicenseInfoInFiles: []string{
530*ba677afaSXin Li			"NOASSERTION",
531*ba677afaSXin Li		},
532*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
533*ba677afaSXin Li	}
534*ba677afaSXin Li
535*ba677afaSXin Li	// f3 will only appear in the second Package
536*ba677afaSXin Li	f3 := &v2_2.File{
537*ba677afaSXin Li		FileName:           "/project/file3.txt",
538*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File563"),
539*ba677afaSXin Li		Checksums: []common.Checksum{{
540*ba677afaSXin Li			Algorithm: common.SHA1,
541*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
542*ba677afaSXin Li		},
543*ba677afaSXin Li		},
544*ba677afaSXin Li		LicenseConcluded: "MPL-2.0",
545*ba677afaSXin Li		LicenseInfoInFiles: []string{
546*ba677afaSXin Li			"NOASSERTION",
547*ba677afaSXin Li		},
548*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
549*ba677afaSXin Li	}
550*ba677afaSXin Li
551*ba677afaSXin Li	// f4_1 and f4_2 will appear in first and second,
552*ba677afaSXin Li	// with same name, same hash and different license
553*ba677afaSXin Li	f4_1 := &v2_2.File{
554*ba677afaSXin Li		FileName:           "/project/file4.txt",
555*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File564"),
556*ba677afaSXin Li		Checksums: []common.Checksum{{
557*ba677afaSXin Li			Algorithm: common.SHA1,
558*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
559*ba677afaSXin Li		},
560*ba677afaSXin Li		},
561*ba677afaSXin Li		LicenseConcluded: "MIT",
562*ba677afaSXin Li		LicenseInfoInFiles: []string{
563*ba677afaSXin Li			"NOASSERTION",
564*ba677afaSXin Li		},
565*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
566*ba677afaSXin Li	}
567*ba677afaSXin Li	f4_2 := &v2_2.File{
568*ba677afaSXin Li		FileName:           "/project/file4.txt",
569*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File564"),
570*ba677afaSXin Li		Checksums: []common.Checksum{{
571*ba677afaSXin Li			Algorithm: common.SHA1,
572*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
573*ba677afaSXin Li		},
574*ba677afaSXin Li		},
575*ba677afaSXin Li		LicenseConcluded: "Apache-2.0 AND MIT",
576*ba677afaSXin Li		LicenseInfoInFiles: []string{
577*ba677afaSXin Li			"NOASSERTION",
578*ba677afaSXin Li		},
579*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
580*ba677afaSXin Li	}
581*ba677afaSXin Li
582*ba677afaSXin Li	// f5_1 and f5_2 will appear in first and second,
583*ba677afaSXin Li	// with same name, different hash and same license
584*ba677afaSXin Li	f5_1 := &v2_2.File{
585*ba677afaSXin Li		FileName:           "/project/file5.txt",
586*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File565"),
587*ba677afaSXin Li		Checksums: []common.Checksum{{
588*ba677afaSXin Li			Algorithm: common.SHA1,
589*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
590*ba677afaSXin Li		},
591*ba677afaSXin Li		},
592*ba677afaSXin Li		LicenseConcluded: "BSD-3-Clause",
593*ba677afaSXin Li		LicenseInfoInFiles: []string{
594*ba677afaSXin Li			"NOASSERTION",
595*ba677afaSXin Li		},
596*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
597*ba677afaSXin Li	}
598*ba677afaSXin Li	f5_2 := &v2_2.File{
599*ba677afaSXin Li		FileName:           "/project/file5.txt",
600*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File565"),
601*ba677afaSXin Li		Checksums: []common.Checksum{{
602*ba677afaSXin Li			Algorithm: common.SHA1,
603*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
604*ba677afaSXin Li		},
605*ba677afaSXin Li		},
606*ba677afaSXin Li		LicenseConcluded: "BSD-3-Clause",
607*ba677afaSXin Li		LicenseInfoInFiles: []string{
608*ba677afaSXin Li			"NOASSERTION",
609*ba677afaSXin Li		},
610*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
611*ba677afaSXin Li	}
612*ba677afaSXin Li
613*ba677afaSXin Li	// f6_1 and f6_2 will appear in first and second,
614*ba677afaSXin Li	// with same name, different hash and different license
615*ba677afaSXin Li	f6_1 := &v2_2.File{
616*ba677afaSXin Li		FileName:           "/project/file6.txt",
617*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File566"),
618*ba677afaSXin Li		Checksums: []common.Checksum{{
619*ba677afaSXin Li			Algorithm: common.SHA1,
620*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
621*ba677afaSXin Li		},
622*ba677afaSXin Li		},
623*ba677afaSXin Li		LicenseConcluded: "CC0-1.0",
624*ba677afaSXin Li		LicenseInfoInFiles: []string{
625*ba677afaSXin Li			"NOASSERTION",
626*ba677afaSXin Li		},
627*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
628*ba677afaSXin Li	}
629*ba677afaSXin Li	f6_2 := &v2_2.File{
630*ba677afaSXin Li		FileName:           "/project/file6.txt",
631*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File566"),
632*ba677afaSXin Li		Checksums: []common.Checksum{{
633*ba677afaSXin Li			Algorithm: common.SHA1,
634*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
635*ba677afaSXin Li		},
636*ba677afaSXin Li		},
637*ba677afaSXin Li		LicenseConcluded: "Unlicense",
638*ba677afaSXin Li		LicenseInfoInFiles: []string{
639*ba677afaSXin Li			"NOASSERTION",
640*ba677afaSXin Li		},
641*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
642*ba677afaSXin Li	}
643*ba677afaSXin Li
644*ba677afaSXin Li	// create Packages
645*ba677afaSXin Li	p1 := &v2_2.Package{
646*ba677afaSXin Li		PackageName:               "p1",
647*ba677afaSXin Li		PackageSPDXIdentifier:     common.ElementID("p1"),
648*ba677afaSXin Li		PackageDownloadLocation:   "NOASSERTION",
649*ba677afaSXin Li		FilesAnalyzed:             true,
650*ba677afaSXin Li		IsFilesAnalyzedTagPresent: true,
651*ba677afaSXin Li		// fake the verification code for present purposes
652*ba677afaSXin Li		PackageVerificationCode: common.PackageVerificationCode{Value: "abc123abc123"},
653*ba677afaSXin Li		PackageLicenseConcluded: "NOASSERTION",
654*ba677afaSXin Li		PackageLicenseInfoFromFiles: []string{
655*ba677afaSXin Li			"NOASSERTION",
656*ba677afaSXin Li		},
657*ba677afaSXin Li		PackageLicenseDeclared: "NOASSERTION",
658*ba677afaSXin Li		PackageCopyrightText:   "NOASSERTION",
659*ba677afaSXin Li		Files: []*v2_2.File{
660*ba677afaSXin Li			f1,
661*ba677afaSXin Li			f2,
662*ba677afaSXin Li			f4_1,
663*ba677afaSXin Li			f5_1,
664*ba677afaSXin Li			f6_1,
665*ba677afaSXin Li		},
666*ba677afaSXin Li	}
667*ba677afaSXin Li	p2 := &v2_2.Package{
668*ba677afaSXin Li		PackageName:               "p2",
669*ba677afaSXin Li		PackageSPDXIdentifier:     common.ElementID("p2"),
670*ba677afaSXin Li		PackageDownloadLocation:   "NOASSERTION",
671*ba677afaSXin Li		FilesAnalyzed:             true,
672*ba677afaSXin Li		IsFilesAnalyzedTagPresent: true,
673*ba677afaSXin Li		// fake the verification code for present purposes
674*ba677afaSXin Li		PackageVerificationCode: common.PackageVerificationCode{Value: "def456def456"},
675*ba677afaSXin Li		PackageLicenseConcluded: "NOASSERTION",
676*ba677afaSXin Li		PackageLicenseInfoFromFiles: []string{
677*ba677afaSXin Li			"NOASSERTION",
678*ba677afaSXin Li		},
679*ba677afaSXin Li		PackageLicenseDeclared: "NOASSERTION",
680*ba677afaSXin Li		PackageCopyrightText:   "NOASSERTION",
681*ba677afaSXin Li		Files: []*v2_2.File{
682*ba677afaSXin Li			f1,
683*ba677afaSXin Li			f3,
684*ba677afaSXin Li			f4_2,
685*ba677afaSXin Li			f5_2,
686*ba677afaSXin Li			f6_2,
687*ba677afaSXin Li		},
688*ba677afaSXin Li	}
689*ba677afaSXin Li
690*ba677afaSXin Li	// run the diff between the two packages
691*ba677afaSXin Li	diffMap, err := MakePairs2_2(p1, p2)
692*ba677afaSXin Li	if err != nil {
693*ba677afaSXin Li		t.Fatalf("Expected nil error, got %v", err)
694*ba677afaSXin Li	}
695*ba677afaSXin Li
696*ba677afaSXin Li	// check that the diff results are what we expect
697*ba677afaSXin Li	// there should be 6 entries, one for each unique filename
698*ba677afaSXin Li	if len(diffMap) != 6 {
699*ba677afaSXin Li		t.Fatalf("Expected %d, got %d", 6, len(diffMap))
700*ba677afaSXin Li	}
701*ba677afaSXin Li
702*ba677afaSXin Li	// check each filename is present, and check its pair
703*ba677afaSXin Li	// pair 1 -- same in both
704*ba677afaSXin Li	pair1, ok := diffMap["/project/file1.txt"]
705*ba677afaSXin Li	if !ok {
706*ba677afaSXin Li		t.Fatalf("Couldn't get pair1")
707*ba677afaSXin Li	}
708*ba677afaSXin Li	if pair1.First != f1.LicenseConcluded {
709*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f1.LicenseConcluded, pair1.First)
710*ba677afaSXin Li	}
711*ba677afaSXin Li	if pair1.Second != f1.LicenseConcluded {
712*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f2.LicenseConcluded, pair1.Second)
713*ba677afaSXin Li	}
714*ba677afaSXin Li
715*ba677afaSXin Li	// pair 2 -- only in first
716*ba677afaSXin Li	pair2, ok := diffMap["/project/file2.txt"]
717*ba677afaSXin Li	if !ok {
718*ba677afaSXin Li		t.Fatalf("Couldn't get pair2")
719*ba677afaSXin Li	}
720*ba677afaSXin Li	if pair2.First != f2.LicenseConcluded {
721*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f2.LicenseConcluded, pair2.First)
722*ba677afaSXin Li	}
723*ba677afaSXin Li	if pair2.Second != "" {
724*ba677afaSXin Li		t.Errorf("Expected %s, got %s", "", pair2.Second)
725*ba677afaSXin Li	}
726*ba677afaSXin Li
727*ba677afaSXin Li	// pair 3 -- only in second
728*ba677afaSXin Li	pair3, ok := diffMap["/project/file3.txt"]
729*ba677afaSXin Li	if !ok {
730*ba677afaSXin Li		t.Fatalf("Couldn't get pair3")
731*ba677afaSXin Li	}
732*ba677afaSXin Li	if pair3.First != "" {
733*ba677afaSXin Li		t.Errorf("Expected %s, got %s", "", pair3.First)
734*ba677afaSXin Li	}
735*ba677afaSXin Li	if pair3.Second != f3.LicenseConcluded {
736*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f3.LicenseConcluded, pair3.Second)
737*ba677afaSXin Li	}
738*ba677afaSXin Li
739*ba677afaSXin Li	// pair 4 -- in both but different license
740*ba677afaSXin Li	pair4, ok := diffMap["/project/file4.txt"]
741*ba677afaSXin Li	if !ok {
742*ba677afaSXin Li		t.Fatalf("Couldn't get pair4")
743*ba677afaSXin Li	}
744*ba677afaSXin Li	if pair4.First != f4_1.LicenseConcluded {
745*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f4_1.LicenseConcluded, pair4.First)
746*ba677afaSXin Li	}
747*ba677afaSXin Li	if pair4.Second != f4_2.LicenseConcluded {
748*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f4_2.LicenseConcluded, pair4.Second)
749*ba677afaSXin Li	}
750*ba677afaSXin Li
751*ba677afaSXin Li	// pair 5 -- in both but different hash, same license
752*ba677afaSXin Li	pair5, ok := diffMap["/project/file5.txt"]
753*ba677afaSXin Li	if !ok {
754*ba677afaSXin Li		t.Fatalf("Couldn't get pair5")
755*ba677afaSXin Li	}
756*ba677afaSXin Li	if pair5.First != f5_1.LicenseConcluded {
757*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f5_1.LicenseConcluded, pair5.First)
758*ba677afaSXin Li	}
759*ba677afaSXin Li	if pair5.Second != f5_2.LicenseConcluded {
760*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f5_2.LicenseConcluded, pair5.Second)
761*ba677afaSXin Li	}
762*ba677afaSXin Li
763*ba677afaSXin Li	// pair 6 -- in both but different hash, different license
764*ba677afaSXin Li	pair6, ok := diffMap["/project/file6.txt"]
765*ba677afaSXin Li	if !ok {
766*ba677afaSXin Li		t.Fatalf("Couldn't get pair6")
767*ba677afaSXin Li	}
768*ba677afaSXin Li	if pair6.First != f6_1.LicenseConcluded {
769*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f6_1.LicenseConcluded, pair6.First)
770*ba677afaSXin Li	}
771*ba677afaSXin Li	if pair6.Second != f6_2.LicenseConcluded {
772*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f6_2.LicenseConcluded, pair6.Second)
773*ba677afaSXin Li	}
774*ba677afaSXin Li}
775*ba677afaSXin Li
776*ba677afaSXin Lifunc Test2_2DifferCanCreateDiffStructuredResults(t *testing.T) {
777*ba677afaSXin Li	// create files to be used in diff
778*ba677afaSXin Li	// f1 will be identical in both
779*ba677afaSXin Li	f1 := &v2_2.File{
780*ba677afaSXin Li		FileName:           "/project/file1.txt",
781*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File561"),
782*ba677afaSXin Li		Checksums: []common.Checksum{{
783*ba677afaSXin Li			Algorithm: common.SHA1,
784*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
785*ba677afaSXin Li		},
786*ba677afaSXin Li		},
787*ba677afaSXin Li		LicenseConcluded: "Apache-2.0",
788*ba677afaSXin Li		LicenseInfoInFiles: []string{
789*ba677afaSXin Li			"LicenseRef-We-will-ignore-LicenseInfoInFiles",
790*ba677afaSXin Li		},
791*ba677afaSXin Li		FileCopyrightText: "We'll ignore copyright values",
792*ba677afaSXin Li	}
793*ba677afaSXin Li
794*ba677afaSXin Li	// f2 will only appear in the first Package
795*ba677afaSXin Li	f2 := &v2_2.File{
796*ba677afaSXin Li		FileName:           "/project/file2.txt",
797*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File562"),
798*ba677afaSXin Li		Checksums: []common.Checksum{{
799*ba677afaSXin Li			Algorithm: common.SHA1,
800*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
801*ba677afaSXin Li		},
802*ba677afaSXin Li		},
803*ba677afaSXin Li		LicenseConcluded: "GPL-2.0-or-later",
804*ba677afaSXin Li		LicenseInfoInFiles: []string{
805*ba677afaSXin Li			"NOASSERTION",
806*ba677afaSXin Li		},
807*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
808*ba677afaSXin Li	}
809*ba677afaSXin Li
810*ba677afaSXin Li	// f3 will only appear in the second Package
811*ba677afaSXin Li	f3 := &v2_2.File{
812*ba677afaSXin Li		FileName:           "/project/file3.txt",
813*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File563"),
814*ba677afaSXin Li		Checksums: []common.Checksum{{
815*ba677afaSXin Li			Algorithm: common.SHA1,
816*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
817*ba677afaSXin Li		},
818*ba677afaSXin Li		},
819*ba677afaSXin Li		LicenseConcluded: "MPL-2.0",
820*ba677afaSXin Li		LicenseInfoInFiles: []string{
821*ba677afaSXin Li			"NOASSERTION",
822*ba677afaSXin Li		},
823*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
824*ba677afaSXin Li	}
825*ba677afaSXin Li
826*ba677afaSXin Li	// f4_1 and f4_2 will appear in first and second,
827*ba677afaSXin Li	// with same name, same hash and different license
828*ba677afaSXin Li	f4_1 := &v2_2.File{
829*ba677afaSXin Li		FileName:           "/project/file4.txt",
830*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File564"),
831*ba677afaSXin Li		Checksums: []common.Checksum{{
832*ba677afaSXin Li			Algorithm: common.SHA1,
833*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
834*ba677afaSXin Li		},
835*ba677afaSXin Li		},
836*ba677afaSXin Li		LicenseConcluded: "MIT",
837*ba677afaSXin Li		LicenseInfoInFiles: []string{
838*ba677afaSXin Li			"NOASSERTION",
839*ba677afaSXin Li		},
840*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
841*ba677afaSXin Li	}
842*ba677afaSXin Li	f4_2 := &v2_2.File{
843*ba677afaSXin Li		FileName:           "/project/file4.txt",
844*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File564"),
845*ba677afaSXin Li		Checksums: []common.Checksum{{
846*ba677afaSXin Li			Algorithm: common.SHA1,
847*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
848*ba677afaSXin Li		},
849*ba677afaSXin Li		},
850*ba677afaSXin Li		LicenseConcluded: "Apache-2.0 AND MIT",
851*ba677afaSXin Li		LicenseInfoInFiles: []string{
852*ba677afaSXin Li			"NOASSERTION",
853*ba677afaSXin Li		},
854*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
855*ba677afaSXin Li	}
856*ba677afaSXin Li
857*ba677afaSXin Li	// f5_1 and f5_2 will appear in first and second,
858*ba677afaSXin Li	// with same name, different hash and same license
859*ba677afaSXin Li	f5_1 := &v2_2.File{
860*ba677afaSXin Li		FileName:           "/project/file5.txt",
861*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File565"),
862*ba677afaSXin Li		LicenseConcluded:   "BSD-3-Clause",
863*ba677afaSXin Li		LicenseInfoInFiles: []string{
864*ba677afaSXin Li			"NOASSERTION",
865*ba677afaSXin Li		},
866*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
867*ba677afaSXin Li	}
868*ba677afaSXin Li	f5_2 := &v2_2.File{
869*ba677afaSXin Li		FileName:           "/project/file5.txt",
870*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File565"),
871*ba677afaSXin Li		Checksums: []common.Checksum{{
872*ba677afaSXin Li			Algorithm: common.SHA1,
873*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
874*ba677afaSXin Li		},
875*ba677afaSXin Li		},
876*ba677afaSXin Li
877*ba677afaSXin Li		LicenseConcluded: "BSD-3-Clause",
878*ba677afaSXin Li		LicenseInfoInFiles: []string{
879*ba677afaSXin Li			"NOASSERTION",
880*ba677afaSXin Li		},
881*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
882*ba677afaSXin Li	}
883*ba677afaSXin Li
884*ba677afaSXin Li	// f6_1 and f6_2 will appear in first and second,
885*ba677afaSXin Li	// with same name, different hash and different license
886*ba677afaSXin Li	f6_1 := &v2_2.File{
887*ba677afaSXin Li		FileName:           "/project/file6.txt",
888*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File566"),
889*ba677afaSXin Li		Checksums: []common.Checksum{{
890*ba677afaSXin Li			Algorithm: common.SHA1,
891*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
892*ba677afaSXin Li		},
893*ba677afaSXin Li		},
894*ba677afaSXin Li		LicenseConcluded: "CC0-1.0",
895*ba677afaSXin Li		LicenseInfoInFiles: []string{
896*ba677afaSXin Li			"NOASSERTION",
897*ba677afaSXin Li		},
898*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
899*ba677afaSXin Li	}
900*ba677afaSXin Li	f6_2 := &v2_2.File{
901*ba677afaSXin Li		FileName:           "/project/file6.txt",
902*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File566"),
903*ba677afaSXin Li		Checksums: []common.Checksum{{
904*ba677afaSXin Li			Algorithm: common.SHA1,
905*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
906*ba677afaSXin Li		},
907*ba677afaSXin Li		},
908*ba677afaSXin Li		LicenseConcluded: "Unlicense",
909*ba677afaSXin Li		LicenseInfoInFiles: []string{
910*ba677afaSXin Li			"NOASSERTION",
911*ba677afaSXin Li		},
912*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
913*ba677afaSXin Li	}
914*ba677afaSXin Li
915*ba677afaSXin Li	// create Packages
916*ba677afaSXin Li	p1 := &v2_2.Package{
917*ba677afaSXin Li		PackageName:               "p1",
918*ba677afaSXin Li		PackageSPDXIdentifier:     common.ElementID("p1"),
919*ba677afaSXin Li		PackageDownloadLocation:   "NOASSERTION",
920*ba677afaSXin Li		FilesAnalyzed:             true,
921*ba677afaSXin Li		IsFilesAnalyzedTagPresent: true,
922*ba677afaSXin Li		// fake the verification code for present purposes
923*ba677afaSXin Li		PackageVerificationCode: common.PackageVerificationCode{Value: "abc123abc123"},
924*ba677afaSXin Li		PackageLicenseConcluded: "NOASSERTION",
925*ba677afaSXin Li		PackageLicenseInfoFromFiles: []string{
926*ba677afaSXin Li			"NOASSERTION",
927*ba677afaSXin Li		},
928*ba677afaSXin Li		PackageLicenseDeclared: "NOASSERTION",
929*ba677afaSXin Li		PackageCopyrightText:   "NOASSERTION",
930*ba677afaSXin Li		Files: []*v2_2.File{
931*ba677afaSXin Li			f1,
932*ba677afaSXin Li			f2,
933*ba677afaSXin Li			f4_1,
934*ba677afaSXin Li			f5_1,
935*ba677afaSXin Li			f6_1,
936*ba677afaSXin Li		},
937*ba677afaSXin Li	}
938*ba677afaSXin Li	p2 := &v2_2.Package{
939*ba677afaSXin Li		PackageName:               "p2",
940*ba677afaSXin Li		PackageSPDXIdentifier:     common.ElementID("p2"),
941*ba677afaSXin Li		PackageDownloadLocation:   "NOASSERTION",
942*ba677afaSXin Li		FilesAnalyzed:             true,
943*ba677afaSXin Li		IsFilesAnalyzedTagPresent: true,
944*ba677afaSXin Li		// fake the verification code for present purposes
945*ba677afaSXin Li		PackageVerificationCode: common.PackageVerificationCode{Value: "def456def456"},
946*ba677afaSXin Li		PackageLicenseConcluded: "NOASSERTION",
947*ba677afaSXin Li		PackageLicenseInfoFromFiles: []string{
948*ba677afaSXin Li			"NOASSERTION",
949*ba677afaSXin Li		},
950*ba677afaSXin Li		PackageLicenseDeclared: "NOASSERTION",
951*ba677afaSXin Li		PackageCopyrightText:   "NOASSERTION",
952*ba677afaSXin Li		Files: []*v2_2.File{
953*ba677afaSXin Li			f1,
954*ba677afaSXin Li			f3,
955*ba677afaSXin Li			f4_2,
956*ba677afaSXin Li			f5_2,
957*ba677afaSXin Li			f6_2,
958*ba677afaSXin Li		},
959*ba677afaSXin Li	}
960*ba677afaSXin Li
961*ba677afaSXin Li	// run the diff between the two packages
962*ba677afaSXin Li	diffMap, err := MakePairs2_2(p1, p2)
963*ba677afaSXin Li	if err != nil {
964*ba677afaSXin Li		t.Fatalf("Expected nil error, got %v", err)
965*ba677afaSXin Li	}
966*ba677afaSXin Li
967*ba677afaSXin Li	// now, create the LicenseDiff structured results from the pairs
968*ba677afaSXin Li	diffResults, err := MakeResults(diffMap)
969*ba677afaSXin Li	if err != nil {
970*ba677afaSXin Li		t.Fatalf("Expected nil error, got %v", err)
971*ba677afaSXin Li	}
972*ba677afaSXin Li
973*ba677afaSXin Li	// check that the diff results are the expected lengths
974*ba677afaSXin Li	if len(diffResults.InBothChanged) != 2 {
975*ba677afaSXin Li		t.Fatalf("Expected %d, got %d", 2, len(diffResults.InBothChanged))
976*ba677afaSXin Li	}
977*ba677afaSXin Li	if len(diffResults.InBothSame) != 2 {
978*ba677afaSXin Li		t.Fatalf("Expected %d, got %d", 2, len(diffResults.InBothSame))
979*ba677afaSXin Li	}
980*ba677afaSXin Li	if len(diffResults.InFirstOnly) != 1 {
981*ba677afaSXin Li		t.Fatalf("Expected %d, got %d", 1, len(diffResults.InFirstOnly))
982*ba677afaSXin Li	}
983*ba677afaSXin Li	if len(diffResults.InSecondOnly) != 1 {
984*ba677afaSXin Li		t.Fatalf("Expected %d, got %d", 1, len(diffResults.InSecondOnly))
985*ba677afaSXin Li	}
986*ba677afaSXin Li
987*ba677afaSXin Li	// check each filename is present where it belongs, and check license(s)
988*ba677afaSXin Li
989*ba677afaSXin Li	// in both and different license: f4 and f6
990*ba677afaSXin Li	// filename will map to a LicensePair
991*ba677afaSXin Li	check4, ok := diffResults.InBothChanged["/project/file4.txt"]
992*ba677afaSXin Li	if !ok {
993*ba677afaSXin Li		t.Fatalf("Couldn't get check4")
994*ba677afaSXin Li	}
995*ba677afaSXin Li	if check4.First != f4_1.LicenseConcluded {
996*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f4_1.LicenseConcluded, check4.First)
997*ba677afaSXin Li	}
998*ba677afaSXin Li	if check4.Second != f4_2.LicenseConcluded {
999*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f4_2.LicenseConcluded, check4.Second)
1000*ba677afaSXin Li	}
1001*ba677afaSXin Li	check6, ok := diffResults.InBothChanged["/project/file6.txt"]
1002*ba677afaSXin Li	if !ok {
1003*ba677afaSXin Li		t.Fatalf("Couldn't get check6")
1004*ba677afaSXin Li	}
1005*ba677afaSXin Li	if check6.First != f6_1.LicenseConcluded {
1006*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f6_1.LicenseConcluded, check6.First)
1007*ba677afaSXin Li	}
1008*ba677afaSXin Li	if check6.Second != f6_2.LicenseConcluded {
1009*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f6_2.LicenseConcluded, check6.Second)
1010*ba677afaSXin Li	}
1011*ba677afaSXin Li
1012*ba677afaSXin Li	// in both and same license: f1 and f5
1013*ba677afaSXin Li	// filename will map to a string
1014*ba677afaSXin Li	check1, ok := diffResults.InBothSame["/project/file1.txt"]
1015*ba677afaSXin Li	if !ok {
1016*ba677afaSXin Li		t.Fatalf("Couldn't get check1")
1017*ba677afaSXin Li	}
1018*ba677afaSXin Li	if check1 != f1.LicenseConcluded {
1019*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f1.LicenseConcluded, check1)
1020*ba677afaSXin Li	}
1021*ba677afaSXin Li	check5, ok := diffResults.InBothSame["/project/file5.txt"]
1022*ba677afaSXin Li	if !ok {
1023*ba677afaSXin Li		t.Fatalf("Couldn't get check5")
1024*ba677afaSXin Li	}
1025*ba677afaSXin Li	if check5 != f5_1.LicenseConcluded {
1026*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f5_1.LicenseConcluded, check5)
1027*ba677afaSXin Li	}
1028*ba677afaSXin Li	if check5 != f5_2.LicenseConcluded {
1029*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f5_2.LicenseConcluded, check5)
1030*ba677afaSXin Li	}
1031*ba677afaSXin Li
1032*ba677afaSXin Li	// in first only: f2
1033*ba677afaSXin Li	// filename will map to a string
1034*ba677afaSXin Li	check2, ok := diffResults.InFirstOnly["/project/file2.txt"]
1035*ba677afaSXin Li	if !ok {
1036*ba677afaSXin Li		t.Fatalf("Couldn't get check2")
1037*ba677afaSXin Li	}
1038*ba677afaSXin Li	if check2 != f2.LicenseConcluded {
1039*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f2.LicenseConcluded, check2)
1040*ba677afaSXin Li	}
1041*ba677afaSXin Li
1042*ba677afaSXin Li	// in second only: f3
1043*ba677afaSXin Li	// filename will map to a string
1044*ba677afaSXin Li	check3, ok := diffResults.InSecondOnly["/project/file3.txt"]
1045*ba677afaSXin Li	if !ok {
1046*ba677afaSXin Li		t.Fatalf("Couldn't get check3")
1047*ba677afaSXin Li	}
1048*ba677afaSXin Li	if check3 != f3.LicenseConcluded {
1049*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f3.LicenseConcluded, check2)
1050*ba677afaSXin Li	}
1051*ba677afaSXin Li
1052*ba677afaSXin Li}
1053*ba677afaSXin Li
1054*ba677afaSXin Li// ===== 2.3 License diff top-level function tests =====
1055*ba677afaSXin Lifunc Test2_3DifferCanCreateDiffPairs(t *testing.T) {
1056*ba677afaSXin Li	// create files to be used in diff
1057*ba677afaSXin Li	// f1 will be identical in both
1058*ba677afaSXin Li	f1 := &v2_3.File{
1059*ba677afaSXin Li		FileName:           "/project/file1.txt",
1060*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File561"),
1061*ba677afaSXin Li		Checksums: []common.Checksum{{
1062*ba677afaSXin Li			Algorithm: common.SHA1,
1063*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1064*ba677afaSXin Li		},
1065*ba677afaSXin Li		},
1066*ba677afaSXin Li		LicenseConcluded: "Apache-2.0",
1067*ba677afaSXin Li		LicenseInfoInFiles: []string{
1068*ba677afaSXin Li			"LicenseRef-We-will-ignore-LicenseInfoInFiles",
1069*ba677afaSXin Li		},
1070*ba677afaSXin Li		FileCopyrightText: "We'll ignore copyright values",
1071*ba677afaSXin Li	}
1072*ba677afaSXin Li
1073*ba677afaSXin Li	// f2 will only appear in the first Package
1074*ba677afaSXin Li	f2 := &v2_3.File{
1075*ba677afaSXin Li		FileName:           "/project/file2.txt",
1076*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File562"),
1077*ba677afaSXin Li		Checksums: []common.Checksum{{
1078*ba677afaSXin Li			Algorithm: common.SHA1,
1079*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1080*ba677afaSXin Li		},
1081*ba677afaSXin Li		},
1082*ba677afaSXin Li		LicenseConcluded: "GPL-2.0-or-later",
1083*ba677afaSXin Li		LicenseInfoInFiles: []string{
1084*ba677afaSXin Li			"NOASSERTION",
1085*ba677afaSXin Li		},
1086*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1087*ba677afaSXin Li	}
1088*ba677afaSXin Li
1089*ba677afaSXin Li	// f3 will only appear in the second Package
1090*ba677afaSXin Li	f3 := &v2_3.File{
1091*ba677afaSXin Li		FileName:           "/project/file3.txt",
1092*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File563"),
1093*ba677afaSXin Li		Checksums: []common.Checksum{{
1094*ba677afaSXin Li			Algorithm: common.SHA1,
1095*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1096*ba677afaSXin Li		},
1097*ba677afaSXin Li		},
1098*ba677afaSXin Li		LicenseConcluded: "MPL-2.0",
1099*ba677afaSXin Li		LicenseInfoInFiles: []string{
1100*ba677afaSXin Li			"NOASSERTION",
1101*ba677afaSXin Li		},
1102*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1103*ba677afaSXin Li	}
1104*ba677afaSXin Li
1105*ba677afaSXin Li	// f4_1 and f4_2 will appear in first and second,
1106*ba677afaSXin Li	// with same name, same hash and different license
1107*ba677afaSXin Li	f4_1 := &v2_3.File{
1108*ba677afaSXin Li		FileName:           "/project/file4.txt",
1109*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File564"),
1110*ba677afaSXin Li		Checksums: []common.Checksum{{
1111*ba677afaSXin Li			Algorithm: common.SHA1,
1112*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1113*ba677afaSXin Li		},
1114*ba677afaSXin Li		},
1115*ba677afaSXin Li		LicenseConcluded: "MIT",
1116*ba677afaSXin Li		LicenseInfoInFiles: []string{
1117*ba677afaSXin Li			"NOASSERTION",
1118*ba677afaSXin Li		},
1119*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1120*ba677afaSXin Li	}
1121*ba677afaSXin Li	f4_2 := &v2_3.File{
1122*ba677afaSXin Li		FileName:           "/project/file4.txt",
1123*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File564"),
1124*ba677afaSXin Li		Checksums: []common.Checksum{{
1125*ba677afaSXin Li			Algorithm: common.SHA1,
1126*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1127*ba677afaSXin Li		},
1128*ba677afaSXin Li		},
1129*ba677afaSXin Li		LicenseConcluded: "Apache-2.0 AND MIT",
1130*ba677afaSXin Li		LicenseInfoInFiles: []string{
1131*ba677afaSXin Li			"NOASSERTION",
1132*ba677afaSXin Li		},
1133*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1134*ba677afaSXin Li	}
1135*ba677afaSXin Li
1136*ba677afaSXin Li	// f5_1 and f5_2 will appear in first and second,
1137*ba677afaSXin Li	// with same name, different hash and same license
1138*ba677afaSXin Li	f5_1 := &v2_3.File{
1139*ba677afaSXin Li		FileName:           "/project/file5.txt",
1140*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File565"),
1141*ba677afaSXin Li		Checksums: []common.Checksum{{
1142*ba677afaSXin Li			Algorithm: common.SHA1,
1143*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1144*ba677afaSXin Li		},
1145*ba677afaSXin Li		},
1146*ba677afaSXin Li		LicenseConcluded: "BSD-3-Clause",
1147*ba677afaSXin Li		LicenseInfoInFiles: []string{
1148*ba677afaSXin Li			"NOASSERTION",
1149*ba677afaSXin Li		},
1150*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1151*ba677afaSXin Li	}
1152*ba677afaSXin Li	f5_2 := &v2_3.File{
1153*ba677afaSXin Li		FileName:           "/project/file5.txt",
1154*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File565"),
1155*ba677afaSXin Li		Checksums: []common.Checksum{{
1156*ba677afaSXin Li			Algorithm: common.SHA1,
1157*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1158*ba677afaSXin Li		},
1159*ba677afaSXin Li		},
1160*ba677afaSXin Li		LicenseConcluded: "BSD-3-Clause",
1161*ba677afaSXin Li		LicenseInfoInFiles: []string{
1162*ba677afaSXin Li			"NOASSERTION",
1163*ba677afaSXin Li		},
1164*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1165*ba677afaSXin Li	}
1166*ba677afaSXin Li
1167*ba677afaSXin Li	// f6_1 and f6_2 will appear in first and second,
1168*ba677afaSXin Li	// with same name, different hash and different license
1169*ba677afaSXin Li	f6_1 := &v2_3.File{
1170*ba677afaSXin Li		FileName:           "/project/file6.txt",
1171*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File566"),
1172*ba677afaSXin Li		Checksums: []common.Checksum{{
1173*ba677afaSXin Li			Algorithm: common.SHA1,
1174*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1175*ba677afaSXin Li		},
1176*ba677afaSXin Li		},
1177*ba677afaSXin Li		LicenseConcluded: "CC0-1.0",
1178*ba677afaSXin Li		LicenseInfoInFiles: []string{
1179*ba677afaSXin Li			"NOASSERTION",
1180*ba677afaSXin Li		},
1181*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1182*ba677afaSXin Li	}
1183*ba677afaSXin Li	f6_2 := &v2_3.File{
1184*ba677afaSXin Li		FileName:           "/project/file6.txt",
1185*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File566"),
1186*ba677afaSXin Li		Checksums: []common.Checksum{{
1187*ba677afaSXin Li			Algorithm: common.SHA1,
1188*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1189*ba677afaSXin Li		},
1190*ba677afaSXin Li		},
1191*ba677afaSXin Li		LicenseConcluded: "Unlicense",
1192*ba677afaSXin Li		LicenseInfoInFiles: []string{
1193*ba677afaSXin Li			"NOASSERTION",
1194*ba677afaSXin Li		},
1195*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1196*ba677afaSXin Li	}
1197*ba677afaSXin Li
1198*ba677afaSXin Li	// create Packages
1199*ba677afaSXin Li	p1 := &v2_3.Package{
1200*ba677afaSXin Li		PackageName:               "p1",
1201*ba677afaSXin Li		PackageSPDXIdentifier:     common.ElementID("p1"),
1202*ba677afaSXin Li		PackageDownloadLocation:   "NOASSERTION",
1203*ba677afaSXin Li		FilesAnalyzed:             true,
1204*ba677afaSXin Li		IsFilesAnalyzedTagPresent: true,
1205*ba677afaSXin Li		// fake the verification code for present purposes
1206*ba677afaSXin Li		PackageVerificationCode: &common.PackageVerificationCode{Value: "abc123abc123"},
1207*ba677afaSXin Li		PackageLicenseConcluded: "NOASSERTION",
1208*ba677afaSXin Li		PackageLicenseInfoFromFiles: []string{
1209*ba677afaSXin Li			"NOASSERTION",
1210*ba677afaSXin Li		},
1211*ba677afaSXin Li		PackageLicenseDeclared: "NOASSERTION",
1212*ba677afaSXin Li		PackageCopyrightText:   "NOASSERTION",
1213*ba677afaSXin Li		Files: []*v2_3.File{
1214*ba677afaSXin Li			f1,
1215*ba677afaSXin Li			f2,
1216*ba677afaSXin Li			f4_1,
1217*ba677afaSXin Li			f5_1,
1218*ba677afaSXin Li			f6_1,
1219*ba677afaSXin Li		},
1220*ba677afaSXin Li	}
1221*ba677afaSXin Li	p2 := &v2_3.Package{
1222*ba677afaSXin Li		PackageName:               "p2",
1223*ba677afaSXin Li		PackageSPDXIdentifier:     common.ElementID("p2"),
1224*ba677afaSXin Li		PackageDownloadLocation:   "NOASSERTION",
1225*ba677afaSXin Li		FilesAnalyzed:             true,
1226*ba677afaSXin Li		IsFilesAnalyzedTagPresent: true,
1227*ba677afaSXin Li		// fake the verification code for present purposes
1228*ba677afaSXin Li		PackageVerificationCode: &common.PackageVerificationCode{Value: "def456def456"},
1229*ba677afaSXin Li		PackageLicenseConcluded: "NOASSERTION",
1230*ba677afaSXin Li		PackageLicenseInfoFromFiles: []string{
1231*ba677afaSXin Li			"NOASSERTION",
1232*ba677afaSXin Li		},
1233*ba677afaSXin Li		PackageLicenseDeclared: "NOASSERTION",
1234*ba677afaSXin Li		PackageCopyrightText:   "NOASSERTION",
1235*ba677afaSXin Li		Files: []*v2_3.File{
1236*ba677afaSXin Li			f1,
1237*ba677afaSXin Li			f3,
1238*ba677afaSXin Li			f4_2,
1239*ba677afaSXin Li			f5_2,
1240*ba677afaSXin Li			f6_2,
1241*ba677afaSXin Li		},
1242*ba677afaSXin Li	}
1243*ba677afaSXin Li
1244*ba677afaSXin Li	// run the diff between the two packages
1245*ba677afaSXin Li	diffMap, err := MakePairs2_3(p1, p2)
1246*ba677afaSXin Li	if err != nil {
1247*ba677afaSXin Li		t.Fatalf("Expected nil error, got %v", err)
1248*ba677afaSXin Li	}
1249*ba677afaSXin Li
1250*ba677afaSXin Li	// check that the diff results are what we expect
1251*ba677afaSXin Li	// there should be 6 entries, one for each unique filename
1252*ba677afaSXin Li	if len(diffMap) != 6 {
1253*ba677afaSXin Li		t.Fatalf("Expected %d, got %d", 6, len(diffMap))
1254*ba677afaSXin Li	}
1255*ba677afaSXin Li
1256*ba677afaSXin Li	// check each filename is present, and check its pair
1257*ba677afaSXin Li	// pair 1 -- same in both
1258*ba677afaSXin Li	pair1, ok := diffMap["/project/file1.txt"]
1259*ba677afaSXin Li	if !ok {
1260*ba677afaSXin Li		t.Fatalf("Couldn't get pair1")
1261*ba677afaSXin Li	}
1262*ba677afaSXin Li	if pair1.First != f1.LicenseConcluded {
1263*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f1.LicenseConcluded, pair1.First)
1264*ba677afaSXin Li	}
1265*ba677afaSXin Li	if pair1.Second != f1.LicenseConcluded {
1266*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f2.LicenseConcluded, pair1.Second)
1267*ba677afaSXin Li	}
1268*ba677afaSXin Li
1269*ba677afaSXin Li	// pair 2 -- only in first
1270*ba677afaSXin Li	pair2, ok := diffMap["/project/file2.txt"]
1271*ba677afaSXin Li	if !ok {
1272*ba677afaSXin Li		t.Fatalf("Couldn't get pair2")
1273*ba677afaSXin Li	}
1274*ba677afaSXin Li	if pair2.First != f2.LicenseConcluded {
1275*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f2.LicenseConcluded, pair2.First)
1276*ba677afaSXin Li	}
1277*ba677afaSXin Li	if pair2.Second != "" {
1278*ba677afaSXin Li		t.Errorf("Expected %s, got %s", "", pair2.Second)
1279*ba677afaSXin Li	}
1280*ba677afaSXin Li
1281*ba677afaSXin Li	// pair 3 -- only in second
1282*ba677afaSXin Li	pair3, ok := diffMap["/project/file3.txt"]
1283*ba677afaSXin Li	if !ok {
1284*ba677afaSXin Li		t.Fatalf("Couldn't get pair3")
1285*ba677afaSXin Li	}
1286*ba677afaSXin Li	if pair3.First != "" {
1287*ba677afaSXin Li		t.Errorf("Expected %s, got %s", "", pair3.First)
1288*ba677afaSXin Li	}
1289*ba677afaSXin Li	if pair3.Second != f3.LicenseConcluded {
1290*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f3.LicenseConcluded, pair3.Second)
1291*ba677afaSXin Li	}
1292*ba677afaSXin Li
1293*ba677afaSXin Li	// pair 4 -- in both but different license
1294*ba677afaSXin Li	pair4, ok := diffMap["/project/file4.txt"]
1295*ba677afaSXin Li	if !ok {
1296*ba677afaSXin Li		t.Fatalf("Couldn't get pair4")
1297*ba677afaSXin Li	}
1298*ba677afaSXin Li	if pair4.First != f4_1.LicenseConcluded {
1299*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f4_1.LicenseConcluded, pair4.First)
1300*ba677afaSXin Li	}
1301*ba677afaSXin Li	if pair4.Second != f4_2.LicenseConcluded {
1302*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f4_2.LicenseConcluded, pair4.Second)
1303*ba677afaSXin Li	}
1304*ba677afaSXin Li
1305*ba677afaSXin Li	// pair 5 -- in both but different hash, same license
1306*ba677afaSXin Li	pair5, ok := diffMap["/project/file5.txt"]
1307*ba677afaSXin Li	if !ok {
1308*ba677afaSXin Li		t.Fatalf("Couldn't get pair5")
1309*ba677afaSXin Li	}
1310*ba677afaSXin Li	if pair5.First != f5_1.LicenseConcluded {
1311*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f5_1.LicenseConcluded, pair5.First)
1312*ba677afaSXin Li	}
1313*ba677afaSXin Li	if pair5.Second != f5_2.LicenseConcluded {
1314*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f5_2.LicenseConcluded, pair5.Second)
1315*ba677afaSXin Li	}
1316*ba677afaSXin Li
1317*ba677afaSXin Li	// pair 6 -- in both but different hash, different license
1318*ba677afaSXin Li	pair6, ok := diffMap["/project/file6.txt"]
1319*ba677afaSXin Li	if !ok {
1320*ba677afaSXin Li		t.Fatalf("Couldn't get pair6")
1321*ba677afaSXin Li	}
1322*ba677afaSXin Li	if pair6.First != f6_1.LicenseConcluded {
1323*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f6_1.LicenseConcluded, pair6.First)
1324*ba677afaSXin Li	}
1325*ba677afaSXin Li	if pair6.Second != f6_2.LicenseConcluded {
1326*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f6_2.LicenseConcluded, pair6.Second)
1327*ba677afaSXin Li	}
1328*ba677afaSXin Li}
1329*ba677afaSXin Li
1330*ba677afaSXin Lifunc Test2_3DifferCanCreateDiffStructuredResults(t *testing.T) {
1331*ba677afaSXin Li	// create files to be used in diff
1332*ba677afaSXin Li	// f1 will be identical in both
1333*ba677afaSXin Li	f1 := &v2_3.File{
1334*ba677afaSXin Li		FileName:           "/project/file1.txt",
1335*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File561"),
1336*ba677afaSXin Li		Checksums: []common.Checksum{{
1337*ba677afaSXin Li			Algorithm: common.SHA1,
1338*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1339*ba677afaSXin Li		},
1340*ba677afaSXin Li		},
1341*ba677afaSXin Li		LicenseConcluded: "Apache-2.0",
1342*ba677afaSXin Li		LicenseInfoInFiles: []string{
1343*ba677afaSXin Li			"LicenseRef-We-will-ignore-LicenseInfoInFiles",
1344*ba677afaSXin Li		},
1345*ba677afaSXin Li		FileCopyrightText: "We'll ignore copyright values",
1346*ba677afaSXin Li	}
1347*ba677afaSXin Li
1348*ba677afaSXin Li	// f2 will only appear in the first Package
1349*ba677afaSXin Li	f2 := &v2_3.File{
1350*ba677afaSXin Li		FileName:           "/project/file2.txt",
1351*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File562"),
1352*ba677afaSXin Li		Checksums: []common.Checksum{{
1353*ba677afaSXin Li			Algorithm: common.SHA1,
1354*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1355*ba677afaSXin Li		},
1356*ba677afaSXin Li		},
1357*ba677afaSXin Li		LicenseConcluded: "GPL-2.0-or-later",
1358*ba677afaSXin Li		LicenseInfoInFiles: []string{
1359*ba677afaSXin Li			"NOASSERTION",
1360*ba677afaSXin Li		},
1361*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1362*ba677afaSXin Li	}
1363*ba677afaSXin Li
1364*ba677afaSXin Li	// f3 will only appear in the second Package
1365*ba677afaSXin Li	f3 := &v2_3.File{
1366*ba677afaSXin Li		FileName:           "/project/file3.txt",
1367*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File563"),
1368*ba677afaSXin Li		Checksums: []common.Checksum{{
1369*ba677afaSXin Li			Algorithm: common.SHA1,
1370*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1371*ba677afaSXin Li		},
1372*ba677afaSXin Li		},
1373*ba677afaSXin Li		LicenseConcluded: "MPL-2.0",
1374*ba677afaSXin Li		LicenseInfoInFiles: []string{
1375*ba677afaSXin Li			"NOASSERTION",
1376*ba677afaSXin Li		},
1377*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1378*ba677afaSXin Li	}
1379*ba677afaSXin Li
1380*ba677afaSXin Li	// f4_1 and f4_2 will appear in first and second,
1381*ba677afaSXin Li	// with same name, same hash and different license
1382*ba677afaSXin Li	f4_1 := &v2_3.File{
1383*ba677afaSXin Li		FileName:           "/project/file4.txt",
1384*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File564"),
1385*ba677afaSXin Li		Checksums: []common.Checksum{{
1386*ba677afaSXin Li			Algorithm: common.SHA1,
1387*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1388*ba677afaSXin Li		},
1389*ba677afaSXin Li		},
1390*ba677afaSXin Li		LicenseConcluded: "MIT",
1391*ba677afaSXin Li		LicenseInfoInFiles: []string{
1392*ba677afaSXin Li			"NOASSERTION",
1393*ba677afaSXin Li		},
1394*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1395*ba677afaSXin Li	}
1396*ba677afaSXin Li	f4_2 := &v2_3.File{
1397*ba677afaSXin Li		FileName:           "/project/file4.txt",
1398*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File564"),
1399*ba677afaSXin Li		Checksums: []common.Checksum{{
1400*ba677afaSXin Li			Algorithm: common.SHA1,
1401*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1402*ba677afaSXin Li		},
1403*ba677afaSXin Li		},
1404*ba677afaSXin Li		LicenseConcluded: "Apache-2.0 AND MIT",
1405*ba677afaSXin Li		LicenseInfoInFiles: []string{
1406*ba677afaSXin Li			"NOASSERTION",
1407*ba677afaSXin Li		},
1408*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1409*ba677afaSXin Li	}
1410*ba677afaSXin Li
1411*ba677afaSXin Li	// f5_1 and f5_2 will appear in first and second,
1412*ba677afaSXin Li	// with same name, different hash and same license
1413*ba677afaSXin Li	f5_1 := &v2_3.File{
1414*ba677afaSXin Li		FileName:           "/project/file5.txt",
1415*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File565"),
1416*ba677afaSXin Li		LicenseConcluded:   "BSD-3-Clause",
1417*ba677afaSXin Li		LicenseInfoInFiles: []string{
1418*ba677afaSXin Li			"NOASSERTION",
1419*ba677afaSXin Li		},
1420*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1421*ba677afaSXin Li	}
1422*ba677afaSXin Li	f5_2 := &v2_3.File{
1423*ba677afaSXin Li		FileName:           "/project/file5.txt",
1424*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File565"),
1425*ba677afaSXin Li		Checksums: []common.Checksum{{
1426*ba677afaSXin Li			Algorithm: common.SHA1,
1427*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1428*ba677afaSXin Li		},
1429*ba677afaSXin Li		},
1430*ba677afaSXin Li
1431*ba677afaSXin Li		LicenseConcluded: "BSD-3-Clause",
1432*ba677afaSXin Li		LicenseInfoInFiles: []string{
1433*ba677afaSXin Li			"NOASSERTION",
1434*ba677afaSXin Li		},
1435*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1436*ba677afaSXin Li	}
1437*ba677afaSXin Li
1438*ba677afaSXin Li	// f6_1 and f6_2 will appear in first and second,
1439*ba677afaSXin Li	// with same name, different hash and different license
1440*ba677afaSXin Li	f6_1 := &v2_3.File{
1441*ba677afaSXin Li		FileName:           "/project/file6.txt",
1442*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File566"),
1443*ba677afaSXin Li		Checksums: []common.Checksum{{
1444*ba677afaSXin Li			Algorithm: common.SHA1,
1445*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1446*ba677afaSXin Li		},
1447*ba677afaSXin Li		},
1448*ba677afaSXin Li		LicenseConcluded: "CC0-1.0",
1449*ba677afaSXin Li		LicenseInfoInFiles: []string{
1450*ba677afaSXin Li			"NOASSERTION",
1451*ba677afaSXin Li		},
1452*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1453*ba677afaSXin Li	}
1454*ba677afaSXin Li	f6_2 := &v2_3.File{
1455*ba677afaSXin Li		FileName:           "/project/file6.txt",
1456*ba677afaSXin Li		FileSPDXIdentifier: common.ElementID("File566"),
1457*ba677afaSXin Li		Checksums: []common.Checksum{{
1458*ba677afaSXin Li			Algorithm: common.SHA1,
1459*ba677afaSXin Li			Value:     "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3",
1460*ba677afaSXin Li		},
1461*ba677afaSXin Li		},
1462*ba677afaSXin Li		LicenseConcluded: "Unlicense",
1463*ba677afaSXin Li		LicenseInfoInFiles: []string{
1464*ba677afaSXin Li			"NOASSERTION",
1465*ba677afaSXin Li		},
1466*ba677afaSXin Li		FileCopyrightText: "NOASSERTION",
1467*ba677afaSXin Li	}
1468*ba677afaSXin Li
1469*ba677afaSXin Li	// create Packages
1470*ba677afaSXin Li	p1 := &v2_3.Package{
1471*ba677afaSXin Li		PackageName:               "p1",
1472*ba677afaSXin Li		PackageSPDXIdentifier:     common.ElementID("p1"),
1473*ba677afaSXin Li		PackageDownloadLocation:   "NOASSERTION",
1474*ba677afaSXin Li		FilesAnalyzed:             true,
1475*ba677afaSXin Li		IsFilesAnalyzedTagPresent: true,
1476*ba677afaSXin Li		// fake the verification code for present purposes
1477*ba677afaSXin Li		PackageVerificationCode: &common.PackageVerificationCode{Value: "abc123abc123"},
1478*ba677afaSXin Li		PackageLicenseConcluded: "NOASSERTION",
1479*ba677afaSXin Li		PackageLicenseInfoFromFiles: []string{
1480*ba677afaSXin Li			"NOASSERTION",
1481*ba677afaSXin Li		},
1482*ba677afaSXin Li		PackageLicenseDeclared: "NOASSERTION",
1483*ba677afaSXin Li		PackageCopyrightText:   "NOASSERTION",
1484*ba677afaSXin Li		Files: []*v2_3.File{
1485*ba677afaSXin Li			f1,
1486*ba677afaSXin Li			f2,
1487*ba677afaSXin Li			f4_1,
1488*ba677afaSXin Li			f5_1,
1489*ba677afaSXin Li			f6_1,
1490*ba677afaSXin Li		},
1491*ba677afaSXin Li	}
1492*ba677afaSXin Li	p2 := &v2_3.Package{
1493*ba677afaSXin Li		PackageName:               "p2",
1494*ba677afaSXin Li		PackageSPDXIdentifier:     common.ElementID("p2"),
1495*ba677afaSXin Li		PackageDownloadLocation:   "NOASSERTION",
1496*ba677afaSXin Li		FilesAnalyzed:             true,
1497*ba677afaSXin Li		IsFilesAnalyzedTagPresent: true,
1498*ba677afaSXin Li		// fake the verification code for present purposes
1499*ba677afaSXin Li		PackageVerificationCode: &common.PackageVerificationCode{Value: "def456def456"},
1500*ba677afaSXin Li		PackageLicenseConcluded: "NOASSERTION",
1501*ba677afaSXin Li		PackageLicenseInfoFromFiles: []string{
1502*ba677afaSXin Li			"NOASSERTION",
1503*ba677afaSXin Li		},
1504*ba677afaSXin Li		PackageLicenseDeclared: "NOASSERTION",
1505*ba677afaSXin Li		PackageCopyrightText:   "NOASSERTION",
1506*ba677afaSXin Li		Files: []*v2_3.File{
1507*ba677afaSXin Li			f1,
1508*ba677afaSXin Li			f3,
1509*ba677afaSXin Li			f4_2,
1510*ba677afaSXin Li			f5_2,
1511*ba677afaSXin Li			f6_2,
1512*ba677afaSXin Li		},
1513*ba677afaSXin Li	}
1514*ba677afaSXin Li
1515*ba677afaSXin Li	// run the diff between the two packages
1516*ba677afaSXin Li	diffMap, err := MakePairs2_3(p1, p2)
1517*ba677afaSXin Li	if err != nil {
1518*ba677afaSXin Li		t.Fatalf("Expected nil error, got %v", err)
1519*ba677afaSXin Li	}
1520*ba677afaSXin Li
1521*ba677afaSXin Li	// now, create the LicenseDiff structured results from the pairs
1522*ba677afaSXin Li	diffResults, err := MakeResults(diffMap)
1523*ba677afaSXin Li	if err != nil {
1524*ba677afaSXin Li		t.Fatalf("Expected nil error, got %v", err)
1525*ba677afaSXin Li	}
1526*ba677afaSXin Li
1527*ba677afaSXin Li	// check that the diff results are the expected lengths
1528*ba677afaSXin Li	if len(diffResults.InBothChanged) != 2 {
1529*ba677afaSXin Li		t.Fatalf("Expected %d, got %d", 2, len(diffResults.InBothChanged))
1530*ba677afaSXin Li	}
1531*ba677afaSXin Li	if len(diffResults.InBothSame) != 2 {
1532*ba677afaSXin Li		t.Fatalf("Expected %d, got %d", 2, len(diffResults.InBothSame))
1533*ba677afaSXin Li	}
1534*ba677afaSXin Li	if len(diffResults.InFirstOnly) != 1 {
1535*ba677afaSXin Li		t.Fatalf("Expected %d, got %d", 1, len(diffResults.InFirstOnly))
1536*ba677afaSXin Li	}
1537*ba677afaSXin Li	if len(diffResults.InSecondOnly) != 1 {
1538*ba677afaSXin Li		t.Fatalf("Expected %d, got %d", 1, len(diffResults.InSecondOnly))
1539*ba677afaSXin Li	}
1540*ba677afaSXin Li
1541*ba677afaSXin Li	// check each filename is present where it belongs, and check license(s)
1542*ba677afaSXin Li
1543*ba677afaSXin Li	// in both and different license: f4 and f6
1544*ba677afaSXin Li	// filename will map to a LicensePair
1545*ba677afaSXin Li	check4, ok := diffResults.InBothChanged["/project/file4.txt"]
1546*ba677afaSXin Li	if !ok {
1547*ba677afaSXin Li		t.Fatalf("Couldn't get check4")
1548*ba677afaSXin Li	}
1549*ba677afaSXin Li	if check4.First != f4_1.LicenseConcluded {
1550*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f4_1.LicenseConcluded, check4.First)
1551*ba677afaSXin Li	}
1552*ba677afaSXin Li	if check4.Second != f4_2.LicenseConcluded {
1553*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f4_2.LicenseConcluded, check4.Second)
1554*ba677afaSXin Li	}
1555*ba677afaSXin Li	check6, ok := diffResults.InBothChanged["/project/file6.txt"]
1556*ba677afaSXin Li	if !ok {
1557*ba677afaSXin Li		t.Fatalf("Couldn't get check6")
1558*ba677afaSXin Li	}
1559*ba677afaSXin Li	if check6.First != f6_1.LicenseConcluded {
1560*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f6_1.LicenseConcluded, check6.First)
1561*ba677afaSXin Li	}
1562*ba677afaSXin Li	if check6.Second != f6_2.LicenseConcluded {
1563*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f6_2.LicenseConcluded, check6.Second)
1564*ba677afaSXin Li	}
1565*ba677afaSXin Li
1566*ba677afaSXin Li	// in both and same license: f1 and f5
1567*ba677afaSXin Li	// filename will map to a string
1568*ba677afaSXin Li	check1, ok := diffResults.InBothSame["/project/file1.txt"]
1569*ba677afaSXin Li	if !ok {
1570*ba677afaSXin Li		t.Fatalf("Couldn't get check1")
1571*ba677afaSXin Li	}
1572*ba677afaSXin Li	if check1 != f1.LicenseConcluded {
1573*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f1.LicenseConcluded, check1)
1574*ba677afaSXin Li	}
1575*ba677afaSXin Li	check5, ok := diffResults.InBothSame["/project/file5.txt"]
1576*ba677afaSXin Li	if !ok {
1577*ba677afaSXin Li		t.Fatalf("Couldn't get check5")
1578*ba677afaSXin Li	}
1579*ba677afaSXin Li	if check5 != f5_1.LicenseConcluded {
1580*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f5_1.LicenseConcluded, check5)
1581*ba677afaSXin Li	}
1582*ba677afaSXin Li	if check5 != f5_2.LicenseConcluded {
1583*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f5_2.LicenseConcluded, check5)
1584*ba677afaSXin Li	}
1585*ba677afaSXin Li
1586*ba677afaSXin Li	// in first only: f2
1587*ba677afaSXin Li	// filename will map to a string
1588*ba677afaSXin Li	check2, ok := diffResults.InFirstOnly["/project/file2.txt"]
1589*ba677afaSXin Li	if !ok {
1590*ba677afaSXin Li		t.Fatalf("Couldn't get check2")
1591*ba677afaSXin Li	}
1592*ba677afaSXin Li	if check2 != f2.LicenseConcluded {
1593*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f2.LicenseConcluded, check2)
1594*ba677afaSXin Li	}
1595*ba677afaSXin Li
1596*ba677afaSXin Li	// in second only: f3
1597*ba677afaSXin Li	// filename will map to a string
1598*ba677afaSXin Li	check3, ok := diffResults.InSecondOnly["/project/file3.txt"]
1599*ba677afaSXin Li	if !ok {
1600*ba677afaSXin Li		t.Fatalf("Couldn't get check3")
1601*ba677afaSXin Li	}
1602*ba677afaSXin Li	if check3 != f3.LicenseConcluded {
1603*ba677afaSXin Li		t.Errorf("Expected %s, got %s", f3.LicenseConcluded, check2)
1604*ba677afaSXin Li	}
1605*ba677afaSXin Li
1606*ba677afaSXin Li}
1607