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