1607 lines
46 KiB
Go
1607 lines
46 KiB
Go
// 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)
|
|
}
|
|
|
|
}
|