diff options
Diffstat (limited to 'licensediff/licensediff_test.go')
-rw-r--r-- | licensediff/licensediff_test.go | 1606 |
1 files changed, 1606 insertions, 0 deletions
diff --git a/licensediff/licensediff_test.go b/licensediff/licensediff_test.go new file mode 100644 index 0000000..226ad51 --- /dev/null +++ b/licensediff/licensediff_test.go @@ -0,0 +1,1606 @@ +// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + +package licensediff + +import ( + "testing" + + "github.com/spdx/tools-golang/spdx/common" + "github.com/spdx/tools-golang/spdx/v2_1" + "github.com/spdx/tools-golang/spdx/v2_2" + "github.com/spdx/tools-golang/spdx/v2_3" +) + +// ===== 2.1 License diff top-level function tests ===== +func Test2_1DifferCanCreateDiffPairs(t *testing.T) { + // create files to be used in diff + // f1 will be identical in both + f1 := &v2_1.File{ + FileName: "/project/file1.txt", + FileSPDXIdentifier: common.ElementID("File561"), + Checksums: []common.Checksum{{Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", Algorithm: common.SHA1}}, + LicenseConcluded: "Apache-2.0", + LicenseInfoInFiles: []string{ + "LicenseRef-We-will-ignore-LicenseInfoInFiles", + }, + FileCopyrightText: "We'll ignore copyright values", + } + + // f2 will only appear in the first Package + f2 := &v2_1.File{ + FileName: "/project/file2.txt", + FileSPDXIdentifier: common.ElementID("File562"), + Checksums: []common.Checksum{{Value: "066c5139bd9a43d15812ec1a1755b08ccf199824", Algorithm: common.SHA1}}, + LicenseConcluded: "GPL-2.0-or-later", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f3 will only appear in the second Package + f3 := &v2_1.File{ + FileName: "/project/file3.txt", + FileSPDXIdentifier: common.ElementID("File563"), + Checksums: []common.Checksum{{Value: "bd0f4863b15fad2b79b35303af54fcb5baaf7c68", Algorithm: common.SHA1}}, + LicenseConcluded: "MPL-2.0", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f4_1 and f4_2 will appear in first and second, + // with same name, same hash and different license + f4_1 := &v2_1.File{ + FileName: "/project/file4.txt", + FileSPDXIdentifier: common.ElementID("File564"), + Checksums: []common.Checksum{{Value: "bc417a575ceae93435bcb7bfd382ac28cbdaa8b5", Algorithm: common.SHA1}}, + LicenseConcluded: "MIT", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f4_2 := &v2_1.File{ + FileName: "/project/file4.txt", + FileSPDXIdentifier: common.ElementID("File564"), + Checksums: []common.Checksum{{Value: "bc417a575ceae93435bcb7bfd382ac28cbdaa8b5", Algorithm: common.SHA1}}, + LicenseConcluded: "Apache-2.0 AND MIT", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f5_1 and f5_2 will appear in first and second, + // with same name, different hash and same license + f5_1 := &v2_1.File{ + FileName: "/project/file5.txt", + FileSPDXIdentifier: common.ElementID("File565"), + Checksums: []common.Checksum{{Value: "ba226db943bbbf455da77afab6f16dbab156d000", Algorithm: common.SHA1}}, + LicenseConcluded: "BSD-3-Clause", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f5_2 := &v2_1.File{ + FileName: "/project/file5.txt", + FileSPDXIdentifier: common.ElementID("File565"), + Checksums: []common.Checksum{{Value: "b6e0ec7d085c5699b46f6f8d425413702652874d", Algorithm: common.SHA1}}, + LicenseConcluded: "BSD-3-Clause", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f6_1 and f6_2 will appear in first and second, + // with same name, different hash and different license + f6_1 := &v2_1.File{ + FileName: "/project/file6.txt", + FileSPDXIdentifier: common.ElementID("File566"), + Checksums: []common.Checksum{{Value: "ba226db943bbbf455da77afab6f16dbab156d000", Algorithm: common.SHA1}}, + LicenseConcluded: "CC0-1.0", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f6_2 := &v2_1.File{ + FileName: "/project/file6.txt", + FileSPDXIdentifier: common.ElementID("File566"), + Checksums: []common.Checksum{{Value: "b6e0ec7d085c5699b46f6f8d425413702652874d", Algorithm: common.SHA1}}, + LicenseConcluded: "Unlicense", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // create Packages + p1 := &v2_1.Package{ + PackageName: "p1", + PackageSPDXIdentifier: common.ElementID("p1"), + PackageDownloadLocation: "NOASSERTION", + FilesAnalyzed: true, + IsFilesAnalyzedTagPresent: true, + // fake the verification code for present purposes + PackageVerificationCode: common.PackageVerificationCode{Value: "abc123abc123"}, + PackageLicenseConcluded: "NOASSERTION", + PackageLicenseInfoFromFiles: []string{ + "NOASSERTION", + }, + PackageLicenseDeclared: "NOASSERTION", + PackageCopyrightText: "NOASSERTION", + Files: []*v2_1.File{ + f1, + f2, + f4_1, + f5_1, + f6_1, + }, + } + p2 := &v2_1.Package{ + PackageName: "p2", + PackageSPDXIdentifier: common.ElementID("p2"), + PackageDownloadLocation: "NOASSERTION", + FilesAnalyzed: true, + IsFilesAnalyzedTagPresent: true, + // fake the verification code for present purposes + PackageVerificationCode: common.PackageVerificationCode{Value: "def456def456"}, + PackageLicenseConcluded: "NOASSERTION", + PackageLicenseInfoFromFiles: []string{ + "NOASSERTION", + }, + PackageLicenseDeclared: "NOASSERTION", + PackageCopyrightText: "NOASSERTION", + Files: []*v2_1.File{ + f1, + f3, + f4_2, + f5_2, + f6_2, + }, + } + + // run the diff between the two packages + diffMap, err := MakePairs2_1(p1, p2) + if err != nil { + t.Fatalf("Expected nil error, got %v", err) + } + + // check that the diff results are what we expect + // there should be 6 entries, one for each unique filename + if len(diffMap) != 6 { + t.Fatalf("Expected %d, got %d", 6, len(diffMap)) + } + + // check each filename is present, and check its pair + // pair 1 -- same in both + pair1, ok := diffMap["/project/file1.txt"] + if !ok { + t.Fatalf("Couldn't get pair1") + } + if pair1.First != f1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f1.LicenseConcluded, pair1.First) + } + if pair1.Second != f1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f2.LicenseConcluded, pair1.Second) + } + + // pair 2 -- only in first + pair2, ok := diffMap["/project/file2.txt"] + if !ok { + t.Fatalf("Couldn't get pair2") + } + if pair2.First != f2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f2.LicenseConcluded, pair2.First) + } + if pair2.Second != "" { + t.Errorf("Expected %s, got %s", "", pair2.Second) + } + + // pair 3 -- only in second + pair3, ok := diffMap["/project/file3.txt"] + if !ok { + t.Fatalf("Couldn't get pair3") + } + if pair3.First != "" { + t.Errorf("Expected %s, got %s", "", pair3.First) + } + if pair3.Second != f3.LicenseConcluded { + t.Errorf("Expected %s, got %s", f3.LicenseConcluded, pair3.Second) + } + + // pair 4 -- in both but different license + pair4, ok := diffMap["/project/file4.txt"] + if !ok { + t.Fatalf("Couldn't get pair4") + } + if pair4.First != f4_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f4_1.LicenseConcluded, pair4.First) + } + if pair4.Second != f4_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f4_2.LicenseConcluded, pair4.Second) + } + + // pair 5 -- in both but different hash, same license + pair5, ok := diffMap["/project/file5.txt"] + if !ok { + t.Fatalf("Couldn't get pair5") + } + if pair5.First != f5_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f5_1.LicenseConcluded, pair5.First) + } + if pair5.Second != f5_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f5_2.LicenseConcluded, pair5.Second) + } + + // pair 6 -- in both but different hash, different license + pair6, ok := diffMap["/project/file6.txt"] + if !ok { + t.Fatalf("Couldn't get pair6") + } + if pair6.First != f6_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f6_1.LicenseConcluded, pair6.First) + } + if pair6.Second != f6_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f6_2.LicenseConcluded, pair6.Second) + } +} + +func Test2_1DifferCanCreateDiffStructuredResults(t *testing.T) { + // create files to be used in diff + // f1 will be identical in both + f1 := &v2_1.File{ + FileName: "/project/file1.txt", + FileSPDXIdentifier: common.ElementID("File561"), + Checksums: []common.Checksum{{Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", Algorithm: common.SHA1}}, + LicenseConcluded: "Apache-2.0", + LicenseInfoInFiles: []string{ + "LicenseRef-We-will-ignore-LicenseInfoInFiles", + }, + FileCopyrightText: "We'll ignore copyright values", + } + + // f2 will only appear in the first Package + f2 := &v2_1.File{ + FileName: "/project/file2.txt", + FileSPDXIdentifier: common.ElementID("File562"), + Checksums: []common.Checksum{{Value: "066c5139bd9a43d15812ec1a1755b08ccf199824", Algorithm: common.SHA1}}, + LicenseConcluded: "GPL-2.0-or-later", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f3 will only appear in the second Package + f3 := &v2_1.File{ + FileName: "/project/file3.txt", + FileSPDXIdentifier: common.ElementID("File563"), + Checksums: []common.Checksum{{Value: "bd0f4863b15fad2b79b35303af54fcb5baaf7c68", Algorithm: common.SHA1}}, + LicenseConcluded: "MPL-2.0", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f4_1 and f4_2 will appear in first and second, + // with same name, same hash and different license + f4_1 := &v2_1.File{ + FileName: "/project/file4.txt", + FileSPDXIdentifier: common.ElementID("File564"), + Checksums: []common.Checksum{{Value: "bc417a575ceae93435bcb7bfd382ac28cbdaa8b5", Algorithm: common.SHA1}}, + LicenseConcluded: "MIT", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f4_2 := &v2_1.File{ + FileName: "/project/file4.txt", + FileSPDXIdentifier: common.ElementID("File564"), + Checksums: []common.Checksum{{Value: "bc417a575ceae93435bcb7bfd382ac28cbdaa8b5", Algorithm: common.SHA1}}, + LicenseConcluded: "Apache-2.0 AND MIT", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f5_1 and f5_2 will appear in first and second, + // with same name, different hash and same license + f5_1 := &v2_1.File{ + FileName: "/project/file5.txt", + FileSPDXIdentifier: common.ElementID("File565"), + Checksums: []common.Checksum{{Value: "ba226db943bbbf455da77afab6f16dbab156d000", Algorithm: common.SHA1}}, + LicenseConcluded: "BSD-3-Clause", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f5_2 := &v2_1.File{ + FileName: "/project/file5.txt", + FileSPDXIdentifier: common.ElementID("File565"), + Checksums: []common.Checksum{{Value: "b6e0ec7d085c5699b46f6f8d425413702652874d", Algorithm: common.SHA1}}, + LicenseConcluded: "BSD-3-Clause", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f6_1 and f6_2 will appear in first and second, + // with same name, different hash and different license + f6_1 := &v2_1.File{ + FileName: "/project/file6.txt", + FileSPDXIdentifier: common.ElementID("File566"), + Checksums: []common.Checksum{{Value: "ba226db943bbbf455da77afab6f16dbab156d000", Algorithm: common.SHA1}}, + LicenseConcluded: "CC0-1.0", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f6_2 := &v2_1.File{ + FileName: "/project/file6.txt", + FileSPDXIdentifier: common.ElementID("File566"), + Checksums: []common.Checksum{{Value: "b6e0ec7d085c5699b46f6f8d425413702652874d", Algorithm: common.SHA1}}, + LicenseConcluded: "Unlicense", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // create Packages + p1 := &v2_1.Package{ + PackageName: "p1", + PackageSPDXIdentifier: common.ElementID("p1"), + PackageDownloadLocation: "NOASSERTION", + FilesAnalyzed: true, + IsFilesAnalyzedTagPresent: true, + // fake the verification code for present purposes + PackageVerificationCode: common.PackageVerificationCode{Value: "abc123abc123"}, + PackageLicenseConcluded: "NOASSERTION", + PackageLicenseInfoFromFiles: []string{ + "NOASSERTION", + }, + PackageLicenseDeclared: "NOASSERTION", + PackageCopyrightText: "NOASSERTION", + Files: []*v2_1.File{ + f1, + f2, + f4_1, + f5_1, + f6_1, + }, + } + p2 := &v2_1.Package{ + PackageName: "p2", + PackageSPDXIdentifier: common.ElementID("p2"), + PackageDownloadLocation: "NOASSERTION", + FilesAnalyzed: true, + IsFilesAnalyzedTagPresent: true, + // fake the verification code for present purposes + PackageVerificationCode: common.PackageVerificationCode{Value: "def456def456"}, + PackageLicenseConcluded: "NOASSERTION", + PackageLicenseInfoFromFiles: []string{ + "NOASSERTION", + }, + PackageLicenseDeclared: "NOASSERTION", + PackageCopyrightText: "NOASSERTION", + Files: []*v2_1.File{ + f1, + f3, + f4_2, + f5_2, + f6_2, + }, + } + + // run the diff between the two packages + diffMap, err := MakePairs2_1(p1, p2) + if err != nil { + t.Fatalf("Expected nil error, got %v", err) + } + + // now, create the LicenseDiff structured results from the pairs + diffResults, err := MakeResults(diffMap) + if err != nil { + t.Fatalf("Expected nil error, got %v", err) + } + + // check that the diff results are the expected lengths + if len(diffResults.InBothChanged) != 2 { + t.Fatalf("Expected %d, got %d", 2, len(diffResults.InBothChanged)) + } + if len(diffResults.InBothSame) != 2 { + t.Fatalf("Expected %d, got %d", 2, len(diffResults.InBothSame)) + } + if len(diffResults.InFirstOnly) != 1 { + t.Fatalf("Expected %d, got %d", 1, len(diffResults.InFirstOnly)) + } + if len(diffResults.InSecondOnly) != 1 { + t.Fatalf("Expected %d, got %d", 1, len(diffResults.InSecondOnly)) + } + + // check each filename is present where it belongs, and check license(s) + + // in both and different license: f4 and f6 + // filename will map to a LicensePair + check4, ok := diffResults.InBothChanged["/project/file4.txt"] + if !ok { + t.Fatalf("Couldn't get check4") + } + if check4.First != f4_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f4_1.LicenseConcluded, check4.First) + } + if check4.Second != f4_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f4_2.LicenseConcluded, check4.Second) + } + check6, ok := diffResults.InBothChanged["/project/file6.txt"] + if !ok { + t.Fatalf("Couldn't get check6") + } + if check6.First != f6_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f6_1.LicenseConcluded, check6.First) + } + if check6.Second != f6_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f6_2.LicenseConcluded, check6.Second) + } + + // in both and same license: f1 and f5 + // filename will map to a string + check1, ok := diffResults.InBothSame["/project/file1.txt"] + if !ok { + t.Fatalf("Couldn't get check1") + } + if check1 != f1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f1.LicenseConcluded, check1) + } + check5, ok := diffResults.InBothSame["/project/file5.txt"] + if !ok { + t.Fatalf("Couldn't get check5") + } + if check5 != f5_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f5_1.LicenseConcluded, check5) + } + if check5 != f5_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f5_2.LicenseConcluded, check5) + } + + // in first only: f2 + // filename will map to a string + check2, ok := diffResults.InFirstOnly["/project/file2.txt"] + if !ok { + t.Fatalf("Couldn't get check2") + } + if check2 != f2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f2.LicenseConcluded, check2) + } + + // in second only: f3 + // filename will map to a string + check3, ok := diffResults.InSecondOnly["/project/file3.txt"] + if !ok { + t.Fatalf("Couldn't get check3") + } + if check3 != f3.LicenseConcluded { + t.Errorf("Expected %s, got %s", f3.LicenseConcluded, check2) + } + +} + +// ===== 2.2 License diff top-level function tests ===== +func Test2_2DifferCanCreateDiffPairs(t *testing.T) { + // create files to be used in diff + // f1 will be identical in both + f1 := &v2_2.File{ + FileName: "/project/file1.txt", + FileSPDXIdentifier: common.ElementID("File561"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "Apache-2.0", + LicenseInfoInFiles: []string{ + "LicenseRef-We-will-ignore-LicenseInfoInFiles", + }, + FileCopyrightText: "We'll ignore copyright values", + } + + // f2 will only appear in the first Package + f2 := &v2_2.File{ + FileName: "/project/file2.txt", + FileSPDXIdentifier: common.ElementID("File562"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "GPL-2.0-or-later", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f3 will only appear in the second Package + f3 := &v2_2.File{ + FileName: "/project/file3.txt", + FileSPDXIdentifier: common.ElementID("File563"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "MPL-2.0", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f4_1 and f4_2 will appear in first and second, + // with same name, same hash and different license + f4_1 := &v2_2.File{ + FileName: "/project/file4.txt", + FileSPDXIdentifier: common.ElementID("File564"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "MIT", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f4_2 := &v2_2.File{ + FileName: "/project/file4.txt", + FileSPDXIdentifier: common.ElementID("File564"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "Apache-2.0 AND MIT", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f5_1 and f5_2 will appear in first and second, + // with same name, different hash and same license + f5_1 := &v2_2.File{ + FileName: "/project/file5.txt", + FileSPDXIdentifier: common.ElementID("File565"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "BSD-3-Clause", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f5_2 := &v2_2.File{ + FileName: "/project/file5.txt", + FileSPDXIdentifier: common.ElementID("File565"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "BSD-3-Clause", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f6_1 and f6_2 will appear in first and second, + // with same name, different hash and different license + f6_1 := &v2_2.File{ + FileName: "/project/file6.txt", + FileSPDXIdentifier: common.ElementID("File566"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "CC0-1.0", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f6_2 := &v2_2.File{ + FileName: "/project/file6.txt", + FileSPDXIdentifier: common.ElementID("File566"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "Unlicense", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // create Packages + p1 := &v2_2.Package{ + PackageName: "p1", + PackageSPDXIdentifier: common.ElementID("p1"), + PackageDownloadLocation: "NOASSERTION", + FilesAnalyzed: true, + IsFilesAnalyzedTagPresent: true, + // fake the verification code for present purposes + PackageVerificationCode: common.PackageVerificationCode{Value: "abc123abc123"}, + PackageLicenseConcluded: "NOASSERTION", + PackageLicenseInfoFromFiles: []string{ + "NOASSERTION", + }, + PackageLicenseDeclared: "NOASSERTION", + PackageCopyrightText: "NOASSERTION", + Files: []*v2_2.File{ + f1, + f2, + f4_1, + f5_1, + f6_1, + }, + } + p2 := &v2_2.Package{ + PackageName: "p2", + PackageSPDXIdentifier: common.ElementID("p2"), + PackageDownloadLocation: "NOASSERTION", + FilesAnalyzed: true, + IsFilesAnalyzedTagPresent: true, + // fake the verification code for present purposes + PackageVerificationCode: common.PackageVerificationCode{Value: "def456def456"}, + PackageLicenseConcluded: "NOASSERTION", + PackageLicenseInfoFromFiles: []string{ + "NOASSERTION", + }, + PackageLicenseDeclared: "NOASSERTION", + PackageCopyrightText: "NOASSERTION", + Files: []*v2_2.File{ + f1, + f3, + f4_2, + f5_2, + f6_2, + }, + } + + // run the diff between the two packages + diffMap, err := MakePairs2_2(p1, p2) + if err != nil { + t.Fatalf("Expected nil error, got %v", err) + } + + // check that the diff results are what we expect + // there should be 6 entries, one for each unique filename + if len(diffMap) != 6 { + t.Fatalf("Expected %d, got %d", 6, len(diffMap)) + } + + // check each filename is present, and check its pair + // pair 1 -- same in both + pair1, ok := diffMap["/project/file1.txt"] + if !ok { + t.Fatalf("Couldn't get pair1") + } + if pair1.First != f1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f1.LicenseConcluded, pair1.First) + } + if pair1.Second != f1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f2.LicenseConcluded, pair1.Second) + } + + // pair 2 -- only in first + pair2, ok := diffMap["/project/file2.txt"] + if !ok { + t.Fatalf("Couldn't get pair2") + } + if pair2.First != f2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f2.LicenseConcluded, pair2.First) + } + if pair2.Second != "" { + t.Errorf("Expected %s, got %s", "", pair2.Second) + } + + // pair 3 -- only in second + pair3, ok := diffMap["/project/file3.txt"] + if !ok { + t.Fatalf("Couldn't get pair3") + } + if pair3.First != "" { + t.Errorf("Expected %s, got %s", "", pair3.First) + } + if pair3.Second != f3.LicenseConcluded { + t.Errorf("Expected %s, got %s", f3.LicenseConcluded, pair3.Second) + } + + // pair 4 -- in both but different license + pair4, ok := diffMap["/project/file4.txt"] + if !ok { + t.Fatalf("Couldn't get pair4") + } + if pair4.First != f4_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f4_1.LicenseConcluded, pair4.First) + } + if pair4.Second != f4_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f4_2.LicenseConcluded, pair4.Second) + } + + // pair 5 -- in both but different hash, same license + pair5, ok := diffMap["/project/file5.txt"] + if !ok { + t.Fatalf("Couldn't get pair5") + } + if pair5.First != f5_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f5_1.LicenseConcluded, pair5.First) + } + if pair5.Second != f5_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f5_2.LicenseConcluded, pair5.Second) + } + + // pair 6 -- in both but different hash, different license + pair6, ok := diffMap["/project/file6.txt"] + if !ok { + t.Fatalf("Couldn't get pair6") + } + if pair6.First != f6_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f6_1.LicenseConcluded, pair6.First) + } + if pair6.Second != f6_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f6_2.LicenseConcluded, pair6.Second) + } +} + +func Test2_2DifferCanCreateDiffStructuredResults(t *testing.T) { + // create files to be used in diff + // f1 will be identical in both + f1 := &v2_2.File{ + FileName: "/project/file1.txt", + FileSPDXIdentifier: common.ElementID("File561"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "Apache-2.0", + LicenseInfoInFiles: []string{ + "LicenseRef-We-will-ignore-LicenseInfoInFiles", + }, + FileCopyrightText: "We'll ignore copyright values", + } + + // f2 will only appear in the first Package + f2 := &v2_2.File{ + FileName: "/project/file2.txt", + FileSPDXIdentifier: common.ElementID("File562"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "GPL-2.0-or-later", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f3 will only appear in the second Package + f3 := &v2_2.File{ + FileName: "/project/file3.txt", + FileSPDXIdentifier: common.ElementID("File563"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "MPL-2.0", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f4_1 and f4_2 will appear in first and second, + // with same name, same hash and different license + f4_1 := &v2_2.File{ + FileName: "/project/file4.txt", + FileSPDXIdentifier: common.ElementID("File564"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "MIT", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f4_2 := &v2_2.File{ + FileName: "/project/file4.txt", + FileSPDXIdentifier: common.ElementID("File564"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "Apache-2.0 AND MIT", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f5_1 and f5_2 will appear in first and second, + // with same name, different hash and same license + f5_1 := &v2_2.File{ + FileName: "/project/file5.txt", + FileSPDXIdentifier: common.ElementID("File565"), + LicenseConcluded: "BSD-3-Clause", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f5_2 := &v2_2.File{ + FileName: "/project/file5.txt", + FileSPDXIdentifier: common.ElementID("File565"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + + LicenseConcluded: "BSD-3-Clause", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f6_1 and f6_2 will appear in first and second, + // with same name, different hash and different license + f6_1 := &v2_2.File{ + FileName: "/project/file6.txt", + FileSPDXIdentifier: common.ElementID("File566"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "CC0-1.0", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f6_2 := &v2_2.File{ + FileName: "/project/file6.txt", + FileSPDXIdentifier: common.ElementID("File566"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "Unlicense", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // create Packages + p1 := &v2_2.Package{ + PackageName: "p1", + PackageSPDXIdentifier: common.ElementID("p1"), + PackageDownloadLocation: "NOASSERTION", + FilesAnalyzed: true, + IsFilesAnalyzedTagPresent: true, + // fake the verification code for present purposes + PackageVerificationCode: common.PackageVerificationCode{Value: "abc123abc123"}, + PackageLicenseConcluded: "NOASSERTION", + PackageLicenseInfoFromFiles: []string{ + "NOASSERTION", + }, + PackageLicenseDeclared: "NOASSERTION", + PackageCopyrightText: "NOASSERTION", + Files: []*v2_2.File{ + f1, + f2, + f4_1, + f5_1, + f6_1, + }, + } + p2 := &v2_2.Package{ + PackageName: "p2", + PackageSPDXIdentifier: common.ElementID("p2"), + PackageDownloadLocation: "NOASSERTION", + FilesAnalyzed: true, + IsFilesAnalyzedTagPresent: true, + // fake the verification code for present purposes + PackageVerificationCode: common.PackageVerificationCode{Value: "def456def456"}, + PackageLicenseConcluded: "NOASSERTION", + PackageLicenseInfoFromFiles: []string{ + "NOASSERTION", + }, + PackageLicenseDeclared: "NOASSERTION", + PackageCopyrightText: "NOASSERTION", + Files: []*v2_2.File{ + f1, + f3, + f4_2, + f5_2, + f6_2, + }, + } + + // run the diff between the two packages + diffMap, err := MakePairs2_2(p1, p2) + if err != nil { + t.Fatalf("Expected nil error, got %v", err) + } + + // now, create the LicenseDiff structured results from the pairs + diffResults, err := MakeResults(diffMap) + if err != nil { + t.Fatalf("Expected nil error, got %v", err) + } + + // check that the diff results are the expected lengths + if len(diffResults.InBothChanged) != 2 { + t.Fatalf("Expected %d, got %d", 2, len(diffResults.InBothChanged)) + } + if len(diffResults.InBothSame) != 2 { + t.Fatalf("Expected %d, got %d", 2, len(diffResults.InBothSame)) + } + if len(diffResults.InFirstOnly) != 1 { + t.Fatalf("Expected %d, got %d", 1, len(diffResults.InFirstOnly)) + } + if len(diffResults.InSecondOnly) != 1 { + t.Fatalf("Expected %d, got %d", 1, len(diffResults.InSecondOnly)) + } + + // check each filename is present where it belongs, and check license(s) + + // in both and different license: f4 and f6 + // filename will map to a LicensePair + check4, ok := diffResults.InBothChanged["/project/file4.txt"] + if !ok { + t.Fatalf("Couldn't get check4") + } + if check4.First != f4_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f4_1.LicenseConcluded, check4.First) + } + if check4.Second != f4_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f4_2.LicenseConcluded, check4.Second) + } + check6, ok := diffResults.InBothChanged["/project/file6.txt"] + if !ok { + t.Fatalf("Couldn't get check6") + } + if check6.First != f6_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f6_1.LicenseConcluded, check6.First) + } + if check6.Second != f6_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f6_2.LicenseConcluded, check6.Second) + } + + // in both and same license: f1 and f5 + // filename will map to a string + check1, ok := diffResults.InBothSame["/project/file1.txt"] + if !ok { + t.Fatalf("Couldn't get check1") + } + if check1 != f1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f1.LicenseConcluded, check1) + } + check5, ok := diffResults.InBothSame["/project/file5.txt"] + if !ok { + t.Fatalf("Couldn't get check5") + } + if check5 != f5_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f5_1.LicenseConcluded, check5) + } + if check5 != f5_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f5_2.LicenseConcluded, check5) + } + + // in first only: f2 + // filename will map to a string + check2, ok := diffResults.InFirstOnly["/project/file2.txt"] + if !ok { + t.Fatalf("Couldn't get check2") + } + if check2 != f2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f2.LicenseConcluded, check2) + } + + // in second only: f3 + // filename will map to a string + check3, ok := diffResults.InSecondOnly["/project/file3.txt"] + if !ok { + t.Fatalf("Couldn't get check3") + } + if check3 != f3.LicenseConcluded { + t.Errorf("Expected %s, got %s", f3.LicenseConcluded, check2) + } + +} + +// ===== 2.3 License diff top-level function tests ===== +func Test2_3DifferCanCreateDiffPairs(t *testing.T) { + // create files to be used in diff + // f1 will be identical in both + f1 := &v2_3.File{ + FileName: "/project/file1.txt", + FileSPDXIdentifier: common.ElementID("File561"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "Apache-2.0", + LicenseInfoInFiles: []string{ + "LicenseRef-We-will-ignore-LicenseInfoInFiles", + }, + FileCopyrightText: "We'll ignore copyright values", + } + + // f2 will only appear in the first Package + f2 := &v2_3.File{ + FileName: "/project/file2.txt", + FileSPDXIdentifier: common.ElementID("File562"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "GPL-2.0-or-later", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f3 will only appear in the second Package + f3 := &v2_3.File{ + FileName: "/project/file3.txt", + FileSPDXIdentifier: common.ElementID("File563"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "MPL-2.0", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f4_1 and f4_2 will appear in first and second, + // with same name, same hash and different license + f4_1 := &v2_3.File{ + FileName: "/project/file4.txt", + FileSPDXIdentifier: common.ElementID("File564"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "MIT", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f4_2 := &v2_3.File{ + FileName: "/project/file4.txt", + FileSPDXIdentifier: common.ElementID("File564"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "Apache-2.0 AND MIT", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f5_1 and f5_2 will appear in first and second, + // with same name, different hash and same license + f5_1 := &v2_3.File{ + FileName: "/project/file5.txt", + FileSPDXIdentifier: common.ElementID("File565"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "BSD-3-Clause", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f5_2 := &v2_3.File{ + FileName: "/project/file5.txt", + FileSPDXIdentifier: common.ElementID("File565"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "BSD-3-Clause", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f6_1 and f6_2 will appear in first and second, + // with same name, different hash and different license + f6_1 := &v2_3.File{ + FileName: "/project/file6.txt", + FileSPDXIdentifier: common.ElementID("File566"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "CC0-1.0", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f6_2 := &v2_3.File{ + FileName: "/project/file6.txt", + FileSPDXIdentifier: common.ElementID("File566"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "Unlicense", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // create Packages + p1 := &v2_3.Package{ + PackageName: "p1", + PackageSPDXIdentifier: common.ElementID("p1"), + PackageDownloadLocation: "NOASSERTION", + FilesAnalyzed: true, + IsFilesAnalyzedTagPresent: true, + // fake the verification code for present purposes + PackageVerificationCode: &common.PackageVerificationCode{Value: "abc123abc123"}, + PackageLicenseConcluded: "NOASSERTION", + PackageLicenseInfoFromFiles: []string{ + "NOASSERTION", + }, + PackageLicenseDeclared: "NOASSERTION", + PackageCopyrightText: "NOASSERTION", + Files: []*v2_3.File{ + f1, + f2, + f4_1, + f5_1, + f6_1, + }, + } + p2 := &v2_3.Package{ + PackageName: "p2", + PackageSPDXIdentifier: common.ElementID("p2"), + PackageDownloadLocation: "NOASSERTION", + FilesAnalyzed: true, + IsFilesAnalyzedTagPresent: true, + // fake the verification code for present purposes + PackageVerificationCode: &common.PackageVerificationCode{Value: "def456def456"}, + PackageLicenseConcluded: "NOASSERTION", + PackageLicenseInfoFromFiles: []string{ + "NOASSERTION", + }, + PackageLicenseDeclared: "NOASSERTION", + PackageCopyrightText: "NOASSERTION", + Files: []*v2_3.File{ + f1, + f3, + f4_2, + f5_2, + f6_2, + }, + } + + // run the diff between the two packages + diffMap, err := MakePairs2_3(p1, p2) + if err != nil { + t.Fatalf("Expected nil error, got %v", err) + } + + // check that the diff results are what we expect + // there should be 6 entries, one for each unique filename + if len(diffMap) != 6 { + t.Fatalf("Expected %d, got %d", 6, len(diffMap)) + } + + // check each filename is present, and check its pair + // pair 1 -- same in both + pair1, ok := diffMap["/project/file1.txt"] + if !ok { + t.Fatalf("Couldn't get pair1") + } + if pair1.First != f1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f1.LicenseConcluded, pair1.First) + } + if pair1.Second != f1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f2.LicenseConcluded, pair1.Second) + } + + // pair 2 -- only in first + pair2, ok := diffMap["/project/file2.txt"] + if !ok { + t.Fatalf("Couldn't get pair2") + } + if pair2.First != f2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f2.LicenseConcluded, pair2.First) + } + if pair2.Second != "" { + t.Errorf("Expected %s, got %s", "", pair2.Second) + } + + // pair 3 -- only in second + pair3, ok := diffMap["/project/file3.txt"] + if !ok { + t.Fatalf("Couldn't get pair3") + } + if pair3.First != "" { + t.Errorf("Expected %s, got %s", "", pair3.First) + } + if pair3.Second != f3.LicenseConcluded { + t.Errorf("Expected %s, got %s", f3.LicenseConcluded, pair3.Second) + } + + // pair 4 -- in both but different license + pair4, ok := diffMap["/project/file4.txt"] + if !ok { + t.Fatalf("Couldn't get pair4") + } + if pair4.First != f4_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f4_1.LicenseConcluded, pair4.First) + } + if pair4.Second != f4_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f4_2.LicenseConcluded, pair4.Second) + } + + // pair 5 -- in both but different hash, same license + pair5, ok := diffMap["/project/file5.txt"] + if !ok { + t.Fatalf("Couldn't get pair5") + } + if pair5.First != f5_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f5_1.LicenseConcluded, pair5.First) + } + if pair5.Second != f5_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f5_2.LicenseConcluded, pair5.Second) + } + + // pair 6 -- in both but different hash, different license + pair6, ok := diffMap["/project/file6.txt"] + if !ok { + t.Fatalf("Couldn't get pair6") + } + if pair6.First != f6_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f6_1.LicenseConcluded, pair6.First) + } + if pair6.Second != f6_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f6_2.LicenseConcluded, pair6.Second) + } +} + +func Test2_3DifferCanCreateDiffStructuredResults(t *testing.T) { + // create files to be used in diff + // f1 will be identical in both + f1 := &v2_3.File{ + FileName: "/project/file1.txt", + FileSPDXIdentifier: common.ElementID("File561"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "Apache-2.0", + LicenseInfoInFiles: []string{ + "LicenseRef-We-will-ignore-LicenseInfoInFiles", + }, + FileCopyrightText: "We'll ignore copyright values", + } + + // f2 will only appear in the first Package + f2 := &v2_3.File{ + FileName: "/project/file2.txt", + FileSPDXIdentifier: common.ElementID("File562"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "GPL-2.0-or-later", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f3 will only appear in the second Package + f3 := &v2_3.File{ + FileName: "/project/file3.txt", + FileSPDXIdentifier: common.ElementID("File563"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "MPL-2.0", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f4_1 and f4_2 will appear in first and second, + // with same name, same hash and different license + f4_1 := &v2_3.File{ + FileName: "/project/file4.txt", + FileSPDXIdentifier: common.ElementID("File564"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "MIT", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f4_2 := &v2_3.File{ + FileName: "/project/file4.txt", + FileSPDXIdentifier: common.ElementID("File564"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "Apache-2.0 AND MIT", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f5_1 and f5_2 will appear in first and second, + // with same name, different hash and same license + f5_1 := &v2_3.File{ + FileName: "/project/file5.txt", + FileSPDXIdentifier: common.ElementID("File565"), + LicenseConcluded: "BSD-3-Clause", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f5_2 := &v2_3.File{ + FileName: "/project/file5.txt", + FileSPDXIdentifier: common.ElementID("File565"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + + LicenseConcluded: "BSD-3-Clause", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // f6_1 and f6_2 will appear in first and second, + // with same name, different hash and different license + f6_1 := &v2_3.File{ + FileName: "/project/file6.txt", + FileSPDXIdentifier: common.ElementID("File566"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "CC0-1.0", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + f6_2 := &v2_3.File{ + FileName: "/project/file6.txt", + FileSPDXIdentifier: common.ElementID("File566"), + Checksums: []common.Checksum{{ + Algorithm: common.SHA1, + Value: "6c92dc8bc462b6889d9b1c0bc16c54d19a2cbdd3", + }, + }, + LicenseConcluded: "Unlicense", + LicenseInfoInFiles: []string{ + "NOASSERTION", + }, + FileCopyrightText: "NOASSERTION", + } + + // create Packages + p1 := &v2_3.Package{ + PackageName: "p1", + PackageSPDXIdentifier: common.ElementID("p1"), + PackageDownloadLocation: "NOASSERTION", + FilesAnalyzed: true, + IsFilesAnalyzedTagPresent: true, + // fake the verification code for present purposes + PackageVerificationCode: &common.PackageVerificationCode{Value: "abc123abc123"}, + PackageLicenseConcluded: "NOASSERTION", + PackageLicenseInfoFromFiles: []string{ + "NOASSERTION", + }, + PackageLicenseDeclared: "NOASSERTION", + PackageCopyrightText: "NOASSERTION", + Files: []*v2_3.File{ + f1, + f2, + f4_1, + f5_1, + f6_1, + }, + } + p2 := &v2_3.Package{ + PackageName: "p2", + PackageSPDXIdentifier: common.ElementID("p2"), + PackageDownloadLocation: "NOASSERTION", + FilesAnalyzed: true, + IsFilesAnalyzedTagPresent: true, + // fake the verification code for present purposes + PackageVerificationCode: &common.PackageVerificationCode{Value: "def456def456"}, + PackageLicenseConcluded: "NOASSERTION", + PackageLicenseInfoFromFiles: []string{ + "NOASSERTION", + }, + PackageLicenseDeclared: "NOASSERTION", + PackageCopyrightText: "NOASSERTION", + Files: []*v2_3.File{ + f1, + f3, + f4_2, + f5_2, + f6_2, + }, + } + + // run the diff between the two packages + diffMap, err := MakePairs2_3(p1, p2) + if err != nil { + t.Fatalf("Expected nil error, got %v", err) + } + + // now, create the LicenseDiff structured results from the pairs + diffResults, err := MakeResults(diffMap) + if err != nil { + t.Fatalf("Expected nil error, got %v", err) + } + + // check that the diff results are the expected lengths + if len(diffResults.InBothChanged) != 2 { + t.Fatalf("Expected %d, got %d", 2, len(diffResults.InBothChanged)) + } + if len(diffResults.InBothSame) != 2 { + t.Fatalf("Expected %d, got %d", 2, len(diffResults.InBothSame)) + } + if len(diffResults.InFirstOnly) != 1 { + t.Fatalf("Expected %d, got %d", 1, len(diffResults.InFirstOnly)) + } + if len(diffResults.InSecondOnly) != 1 { + t.Fatalf("Expected %d, got %d", 1, len(diffResults.InSecondOnly)) + } + + // check each filename is present where it belongs, and check license(s) + + // in both and different license: f4 and f6 + // filename will map to a LicensePair + check4, ok := diffResults.InBothChanged["/project/file4.txt"] + if !ok { + t.Fatalf("Couldn't get check4") + } + if check4.First != f4_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f4_1.LicenseConcluded, check4.First) + } + if check4.Second != f4_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f4_2.LicenseConcluded, check4.Second) + } + check6, ok := diffResults.InBothChanged["/project/file6.txt"] + if !ok { + t.Fatalf("Couldn't get check6") + } + if check6.First != f6_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f6_1.LicenseConcluded, check6.First) + } + if check6.Second != f6_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f6_2.LicenseConcluded, check6.Second) + } + + // in both and same license: f1 and f5 + // filename will map to a string + check1, ok := diffResults.InBothSame["/project/file1.txt"] + if !ok { + t.Fatalf("Couldn't get check1") + } + if check1 != f1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f1.LicenseConcluded, check1) + } + check5, ok := diffResults.InBothSame["/project/file5.txt"] + if !ok { + t.Fatalf("Couldn't get check5") + } + if check5 != f5_1.LicenseConcluded { + t.Errorf("Expected %s, got %s", f5_1.LicenseConcluded, check5) + } + if check5 != f5_2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f5_2.LicenseConcluded, check5) + } + + // in first only: f2 + // filename will map to a string + check2, ok := diffResults.InFirstOnly["/project/file2.txt"] + if !ok { + t.Fatalf("Couldn't get check2") + } + if check2 != f2.LicenseConcluded { + t.Errorf("Expected %s, got %s", f2.LicenseConcluded, check2) + } + + // in second only: f3 + // filename will map to a string + check3, ok := diffResults.InSecondOnly["/project/file3.txt"] + if !ok { + t.Fatalf("Couldn't get check3") + } + if check3 != f3.LicenseConcluded { + t.Errorf("Expected %s, got %s", f3.LicenseConcluded, check2) + } + +} |