1188 lines
38 KiB
Go
1188 lines
38 KiB
Go
|
|
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
|
||
|
|
|
||
|
|
package idsearcher
|
||
|
|
|
||
|
|
import (
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
// ===== 2.1 Searcher top-level function tests =====
|
||
|
|
func Test2_1SearcherCanFillInIDs(t *testing.T) {
|
||
|
|
packageName := "project2"
|
||
|
|
dirRoot := "../testdata/project2/"
|
||
|
|
config := &Config2_1{
|
||
|
|
NamespacePrefix: "https://github.com/swinslow/spdx-docs/spdx-go/testdata-",
|
||
|
|
}
|
||
|
|
|
||
|
|
doc, err := BuildIDsDocument2_1(packageName, dirRoot, config)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("expected nil error, got %v", err)
|
||
|
|
}
|
||
|
|
if doc == nil {
|
||
|
|
t.Fatalf("expected non-nil Document, got nil")
|
||
|
|
}
|
||
|
|
|
||
|
|
// not checking all contents of doc, see builder tests for those
|
||
|
|
|
||
|
|
// get the package and its files, checking size of each
|
||
|
|
if doc.Packages == nil {
|
||
|
|
t.Fatalf("expected non-nil Packages, got nil")
|
||
|
|
}
|
||
|
|
if len(doc.Packages) != 1 {
|
||
|
|
t.Fatalf("expected Packages len to be 1, got %d", len(doc.Packages))
|
||
|
|
}
|
||
|
|
pkg := doc.Packages[0]
|
||
|
|
if pkg == nil {
|
||
|
|
t.Fatalf("expected non-nil pkg, got nil")
|
||
|
|
}
|
||
|
|
|
||
|
|
if pkg.Files == nil {
|
||
|
|
t.Fatalf("expected non-nil Files, got nil")
|
||
|
|
}
|
||
|
|
if len(pkg.Files) != 6 {
|
||
|
|
t.Fatalf("expected Files len to be 6, got %d", len(pkg.Files))
|
||
|
|
}
|
||
|
|
|
||
|
|
fileInFolder := pkg.Files[0]
|
||
|
|
if fileInFolder.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileInFolder.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileInFolder.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileInFolder.LicenseInfoInFiles[0] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", fileInFolder.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileInFolder.LicenseConcluded != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", fileInFolder.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
fileTrailingComment := pkg.Files[1]
|
||
|
|
if fileTrailingComment.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileTrailingComment.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileTrailingComment.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileTrailingComment.LicenseInfoInFiles[0] != "GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileTrailingComment.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileTrailingComment.LicenseConcluded != "GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileTrailingComment.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
fileHasDuplicateID := pkg.Files[2]
|
||
|
|
if fileHasDuplicateID.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileHasDuplicateID.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileHasDuplicateID.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileHasDuplicateID.LicenseInfoInFiles[0] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", fileHasDuplicateID.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileHasDuplicateID.LicenseConcluded != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", fileHasDuplicateID.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
fileHasID := pkg.Files[3]
|
||
|
|
if fileHasID.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileHasID.LicenseInfoInFiles) != 2 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 2, got %d", len(fileHasID.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileHasID.LicenseInfoInFiles[0] != "Apache-2.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "Apache-2.0", fileHasID.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileHasID.LicenseInfoInFiles[1] != "GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileHasID.LicenseInfoInFiles[1])
|
||
|
|
}
|
||
|
|
if fileHasID.LicenseConcluded != "Apache-2.0 OR GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "Apache-2.0 OR GPL-2.0-or-later", fileHasID.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
fileMultipleIDs := pkg.Files[4]
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileMultipleIDs.LicenseInfoInFiles) != 5 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 5, got %d", len(fileMultipleIDs.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles[0] != "BSD-2-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-2-Clause", fileMultipleIDs.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles[1] != "BSD-3-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-3-Clause", fileMultipleIDs.LicenseInfoInFiles[1])
|
||
|
|
}
|
||
|
|
// here, DO NOT keep the +
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles[2] != "EPL-1.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "EPL-1.0", fileMultipleIDs.LicenseInfoInFiles[2])
|
||
|
|
}
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles[3] != "ISC" {
|
||
|
|
t.Errorf("expected %v, got %v", "ISC", fileMultipleIDs.LicenseInfoInFiles[3])
|
||
|
|
}
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles[4] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", fileMultipleIDs.LicenseInfoInFiles[4])
|
||
|
|
}
|
||
|
|
if fileMultipleIDs.LicenseConcluded != "((MIT AND BSD-3-Clause) OR ISC) AND BSD-2-Clause AND EPL-1.0+" {
|
||
|
|
t.Errorf("expected %v, got %v", "((MIT AND BSD-3-Clause) OR ISC) AND BSD-2-Clause AND EPL-1.0+", fileMultipleIDs.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
fileNoID := pkg.Files[5]
|
||
|
|
if fileNoID.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileNoID.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileNoID.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileNoID.LicenseInfoInFiles[0] != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %v, got %v", "NOASSERTION", fileNoID.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileNoID.LicenseConcluded != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %v, got %v", "NOASSERTION", fileNoID.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
// and finally, the package should have all of these licenses
|
||
|
|
if pkg.PackageLicenseInfoFromFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil PackageLicenseInfoFromFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(pkg.PackageLicenseInfoFromFiles) != 7 {
|
||
|
|
t.Fatalf("expected PackageLicenseInfoFromFiles len to be 7, got %d", len(pkg.PackageLicenseInfoFromFiles))
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[0] != "Apache-2.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "Apache-2.0", pkg.PackageLicenseInfoFromFiles[0])
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[1] != "BSD-2-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-2-Clause", pkg.PackageLicenseInfoFromFiles[1])
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[2] != "BSD-3-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-3-Clause", pkg.PackageLicenseInfoFromFiles[2])
|
||
|
|
}
|
||
|
|
// here, DO NOT keep the +
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[3] != "EPL-1.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "EPL-1.0", pkg.PackageLicenseInfoFromFiles[3])
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[4] != "GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-or-later", pkg.PackageLicenseInfoFromFiles[4])
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[5] != "ISC" {
|
||
|
|
t.Errorf("expected %v, got %v", "ISC", pkg.PackageLicenseInfoFromFiles[5])
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[6] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", pkg.PackageLicenseInfoFromFiles[6])
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
func Test2_1SearcherCanFillInIDsAndIgnorePaths(t *testing.T) {
|
||
|
|
packageName := "project3"
|
||
|
|
dirRoot := "../testdata/project3/"
|
||
|
|
config := &Config2_1{
|
||
|
|
NamespacePrefix: "https://github.com/swinslow/spdx-docs/spdx-go/testdata-",
|
||
|
|
BuilderPathsIgnored: []string{
|
||
|
|
"**/ignoredir/",
|
||
|
|
"/excludedir/",
|
||
|
|
"**/ignorefile.txt",
|
||
|
|
"/alsoEXCLUDEthis.txt",
|
||
|
|
},
|
||
|
|
SearcherPathsIgnored: []string{
|
||
|
|
"**/dontscan.txt",
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
doc, err := BuildIDsDocument2_1(packageName, dirRoot, config)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("expected nil error, got %v", err)
|
||
|
|
}
|
||
|
|
if doc == nil {
|
||
|
|
t.Fatalf("expected non-nil Document, got nil")
|
||
|
|
}
|
||
|
|
|
||
|
|
// not checking all contents of doc, see builder tests for those
|
||
|
|
|
||
|
|
// get the package and its files, checking licenses for each, and
|
||
|
|
// confirming NOASSERTION for those that are skipped
|
||
|
|
pkg := doc.Packages[0]
|
||
|
|
if pkg == nil {
|
||
|
|
t.Fatalf("expected non-nil pkg, got nil")
|
||
|
|
}
|
||
|
|
if len(pkg.Files) != 5 {
|
||
|
|
t.Fatalf("expected len %d, got %d", 5, len(pkg.Files))
|
||
|
|
}
|
||
|
|
|
||
|
|
f := pkg.Files[0]
|
||
|
|
if f.FileName != "./dontscan.txt" {
|
||
|
|
t.Errorf("expected %v, got %v", "./dontscan.txt", f.FileName)
|
||
|
|
}
|
||
|
|
if len(f.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if f.LicenseInfoInFiles[0] != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if f.LicenseConcluded != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
f = pkg.Files[1]
|
||
|
|
if f.FileName != "./keep/keep.txt" {
|
||
|
|
t.Errorf("expected %v, got %v", "./keep/keep.txt", f.FileName)
|
||
|
|
}
|
||
|
|
if len(f.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if f.LicenseInfoInFiles[0] != "MIT" {
|
||
|
|
t.Errorf("expected %s, got %s", "MIT", f.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if f.LicenseConcluded != "MIT" {
|
||
|
|
t.Errorf("expected %s, got %s", "MIT", f.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
f = pkg.Files[2]
|
||
|
|
if f.FileName != "./keep.txt" {
|
||
|
|
t.Errorf("expected %v, got %v", "./keep.txt", f.FileName)
|
||
|
|
}
|
||
|
|
if len(f.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if f.LicenseInfoInFiles[0] != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if f.LicenseConcluded != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
f = pkg.Files[3]
|
||
|
|
if f.FileName != "./subdir/keep/dontscan.txt" {
|
||
|
|
t.Errorf("expected %v, got %v", "./subdir/keep/dontscan.txt", f.FileName)
|
||
|
|
}
|
||
|
|
if len(f.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if f.LicenseInfoInFiles[0] != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if f.LicenseConcluded != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
f = pkg.Files[4]
|
||
|
|
if f.FileName != "./subdir/keep/keep.txt" {
|
||
|
|
t.Errorf("expected %v, got %v", "./subdir/keep/keep.txt", f.FileName)
|
||
|
|
}
|
||
|
|
if len(f.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if f.LicenseInfoInFiles[0] != "MIT" {
|
||
|
|
t.Errorf("expected %s, got %s", "MIT", f.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if f.LicenseConcluded != "MIT" {
|
||
|
|
t.Errorf("expected %s, got %s", "MIT", f.LicenseConcluded)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func Test2_1SearcherFailsWithInvalidPath(t *testing.T) {
|
||
|
|
packageName := "project2"
|
||
|
|
dirRoot := "./oops/invalid"
|
||
|
|
config := &Config2_1{
|
||
|
|
NamespacePrefix: "whatever",
|
||
|
|
}
|
||
|
|
|
||
|
|
_, err := BuildIDsDocument2_1(packageName, dirRoot, config)
|
||
|
|
if err == nil {
|
||
|
|
t.Fatalf("expected non-nil error, got nil")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// ===== 2.2 Searcher top-level function tests =====
|
||
|
|
func Test2_2SearcherCanFillInIDs(t *testing.T) {
|
||
|
|
packageName := "project2"
|
||
|
|
dirRoot := "../testdata/project2/"
|
||
|
|
config := &Config2_2{
|
||
|
|
NamespacePrefix: "https://github.com/swinslow/spdx-docs/spdx-go/testdata-",
|
||
|
|
}
|
||
|
|
|
||
|
|
doc, err := BuildIDsDocument2_2(packageName, dirRoot, config)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("expected nil error, got %v", err)
|
||
|
|
}
|
||
|
|
if doc == nil {
|
||
|
|
t.Fatalf("expected non-nil Document, got nil")
|
||
|
|
}
|
||
|
|
|
||
|
|
// not checking all contents of doc, see builder tests for those
|
||
|
|
|
||
|
|
// get the package and its files, checking size of each
|
||
|
|
if doc.Packages == nil {
|
||
|
|
t.Fatalf("expected non-nil Packages, got nil")
|
||
|
|
}
|
||
|
|
if len(doc.Packages) != 1 {
|
||
|
|
t.Fatalf("expected Packages len to be 1, got %d", len(doc.Packages))
|
||
|
|
}
|
||
|
|
pkg := doc.Packages[0]
|
||
|
|
if pkg == nil {
|
||
|
|
t.Fatalf("expected non-nil pkg, got nil")
|
||
|
|
}
|
||
|
|
|
||
|
|
if pkg.Files == nil {
|
||
|
|
t.Fatalf("expected non-nil Files, got nil")
|
||
|
|
}
|
||
|
|
if len(pkg.Files) != 6 {
|
||
|
|
t.Fatalf("expected Files len to be 6, got %d", len(pkg.Files))
|
||
|
|
}
|
||
|
|
|
||
|
|
fileInFolder := pkg.Files[0]
|
||
|
|
if fileInFolder.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileInFolder.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileInFolder.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileInFolder.LicenseInfoInFiles[0] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", fileInFolder.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileInFolder.LicenseConcluded != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", fileInFolder.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
fileTrailingComment := pkg.Files[1]
|
||
|
|
if fileTrailingComment.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileTrailingComment.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileTrailingComment.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileTrailingComment.LicenseInfoInFiles[0] != "GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileTrailingComment.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileTrailingComment.LicenseConcluded != "GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileTrailingComment.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
fileHasDuplicateID := pkg.Files[2]
|
||
|
|
if fileHasDuplicateID.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileHasDuplicateID.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileHasDuplicateID.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileHasDuplicateID.LicenseInfoInFiles[0] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", fileHasDuplicateID.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileHasDuplicateID.LicenseConcluded != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", fileHasDuplicateID.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
fileHasID := pkg.Files[3]
|
||
|
|
if fileHasID.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileHasID.LicenseInfoInFiles) != 2 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 2, got %d", len(fileHasID.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileHasID.LicenseInfoInFiles[0] != "Apache-2.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "Apache-2.0", fileHasID.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileHasID.LicenseInfoInFiles[1] != "GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileHasID.LicenseInfoInFiles[1])
|
||
|
|
}
|
||
|
|
if fileHasID.LicenseConcluded != "Apache-2.0 OR GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "Apache-2.0 OR GPL-2.0-or-later", fileHasID.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
fileMultipleIDs := pkg.Files[4]
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileMultipleIDs.LicenseInfoInFiles) != 5 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 5, got %d", len(fileMultipleIDs.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles[0] != "BSD-2-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-2-Clause", fileMultipleIDs.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles[1] != "BSD-3-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-3-Clause", fileMultipleIDs.LicenseInfoInFiles[1])
|
||
|
|
}
|
||
|
|
// here, DO NOT keep the +
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles[2] != "EPL-1.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "EPL-1.0", fileMultipleIDs.LicenseInfoInFiles[2])
|
||
|
|
}
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles[3] != "ISC" {
|
||
|
|
t.Errorf("expected %v, got %v", "ISC", fileMultipleIDs.LicenseInfoInFiles[3])
|
||
|
|
}
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles[4] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", fileMultipleIDs.LicenseInfoInFiles[4])
|
||
|
|
}
|
||
|
|
if fileMultipleIDs.LicenseConcluded != "((MIT AND BSD-3-Clause) OR ISC) AND BSD-2-Clause AND EPL-1.0+" {
|
||
|
|
t.Errorf("expected %v, got %v", "((MIT AND BSD-3-Clause) OR ISC) AND BSD-2-Clause AND EPL-1.0+", fileMultipleIDs.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
fileNoID := pkg.Files[5]
|
||
|
|
if fileNoID.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileNoID.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileNoID.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileNoID.LicenseInfoInFiles[0] != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %v, got %v", "NOASSERTION", fileNoID.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileNoID.LicenseConcluded != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %v, got %v", "NOASSERTION", fileNoID.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
// and finally, the package should have all of these licenses
|
||
|
|
if pkg.PackageLicenseInfoFromFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil PackageLicenseInfoFromFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(pkg.PackageLicenseInfoFromFiles) != 7 {
|
||
|
|
t.Fatalf("expected PackageLicenseInfoFromFiles len to be 7, got %d", len(pkg.PackageLicenseInfoFromFiles))
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[0] != "Apache-2.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "Apache-2.0", pkg.PackageLicenseInfoFromFiles[0])
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[1] != "BSD-2-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-2-Clause", pkg.PackageLicenseInfoFromFiles[1])
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[2] != "BSD-3-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-3-Clause", pkg.PackageLicenseInfoFromFiles[2])
|
||
|
|
}
|
||
|
|
// here, DO NOT keep the +
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[3] != "EPL-1.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "EPL-1.0", pkg.PackageLicenseInfoFromFiles[3])
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[4] != "GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-or-later", pkg.PackageLicenseInfoFromFiles[4])
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[5] != "ISC" {
|
||
|
|
t.Errorf("expected %v, got %v", "ISC", pkg.PackageLicenseInfoFromFiles[5])
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[6] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", pkg.PackageLicenseInfoFromFiles[6])
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
func Test2_2SearcherCanFillInIDsAndIgnorePaths(t *testing.T) {
|
||
|
|
packageName := "project3"
|
||
|
|
dirRoot := "../testdata/project3/"
|
||
|
|
config := &Config2_2{
|
||
|
|
NamespacePrefix: "https://github.com/swinslow/spdx-docs/spdx-go/testdata-",
|
||
|
|
BuilderPathsIgnored: []string{
|
||
|
|
"**/ignoredir/",
|
||
|
|
"/excludedir/",
|
||
|
|
"**/ignorefile.txt",
|
||
|
|
"/alsoEXCLUDEthis.txt",
|
||
|
|
},
|
||
|
|
SearcherPathsIgnored: []string{
|
||
|
|
"**/dontscan.txt",
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
doc, err := BuildIDsDocument2_2(packageName, dirRoot, config)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("expected nil error, got %v", err)
|
||
|
|
}
|
||
|
|
if doc == nil {
|
||
|
|
t.Fatalf("expected non-nil Document, got nil")
|
||
|
|
}
|
||
|
|
|
||
|
|
// not checking all contents of doc, see builder tests for those
|
||
|
|
|
||
|
|
// get the package and its files, checking licenses for each, and
|
||
|
|
// confirming NOASSERTION for those that are skipped
|
||
|
|
pkg := doc.Packages[0]
|
||
|
|
if pkg == nil {
|
||
|
|
t.Fatalf("expected non-nil pkg, got nil")
|
||
|
|
}
|
||
|
|
if len(pkg.Files) != 5 {
|
||
|
|
t.Fatalf("expected len %d, got %d", 5, len(pkg.Files))
|
||
|
|
}
|
||
|
|
|
||
|
|
f := pkg.Files[0]
|
||
|
|
if f.FileName != "./dontscan.txt" {
|
||
|
|
t.Errorf("expected %v, got %v", "./dontscan.txt", f.FileName)
|
||
|
|
}
|
||
|
|
if len(f.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if f.LicenseInfoInFiles[0] != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if f.LicenseConcluded != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
f = pkg.Files[1]
|
||
|
|
if f.FileName != "./keep/keep.txt" {
|
||
|
|
t.Errorf("expected %v, got %v", "./keep/keep.txt", f.FileName)
|
||
|
|
}
|
||
|
|
if len(f.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if f.LicenseInfoInFiles[0] != "MIT" {
|
||
|
|
t.Errorf("expected %s, got %s", "MIT", f.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if f.LicenseConcluded != "MIT" {
|
||
|
|
t.Errorf("expected %s, got %s", "MIT", f.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
f = pkg.Files[2]
|
||
|
|
if f.FileName != "./keep.txt" {
|
||
|
|
t.Errorf("expected %v, got %v", "./keep.txt", f.FileName)
|
||
|
|
}
|
||
|
|
if len(f.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if f.LicenseInfoInFiles[0] != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if f.LicenseConcluded != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
f = pkg.Files[3]
|
||
|
|
if f.FileName != "./subdir/keep/dontscan.txt" {
|
||
|
|
t.Errorf("expected %v, got %v", "./subdir/keep/dontscan.txt", f.FileName)
|
||
|
|
}
|
||
|
|
if len(f.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if f.LicenseInfoInFiles[0] != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if f.LicenseConcluded != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
f = pkg.Files[4]
|
||
|
|
if f.FileName != "./subdir/keep/keep.txt" {
|
||
|
|
t.Errorf("expected %v, got %v", "./subdir/keep/keep.txt", f.FileName)
|
||
|
|
}
|
||
|
|
if len(f.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if f.LicenseInfoInFiles[0] != "MIT" {
|
||
|
|
t.Errorf("expected %s, got %s", "MIT", f.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if f.LicenseConcluded != "MIT" {
|
||
|
|
t.Errorf("expected %s, got %s", "MIT", f.LicenseConcluded)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func Test2_2SearcherFailsWithInvalidPath(t *testing.T) {
|
||
|
|
packageName := "project2"
|
||
|
|
dirRoot := "./oops/invalid"
|
||
|
|
config := &Config2_2{
|
||
|
|
NamespacePrefix: "whatever",
|
||
|
|
}
|
||
|
|
|
||
|
|
_, err := BuildIDsDocument2_2(packageName, dirRoot, config)
|
||
|
|
if err == nil {
|
||
|
|
t.Fatalf("expected non-nil error, got nil")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// ===== 2.3 Searcher top-level function tests =====
|
||
|
|
func Test2_3SearcherCanFillInIDs(t *testing.T) {
|
||
|
|
packageName := "project2"
|
||
|
|
dirRoot := "../testdata/project2/"
|
||
|
|
config := &Config2_3{
|
||
|
|
NamespacePrefix: "https://github.com/swinslow/spdx-docs/spdx-go/testdata-",
|
||
|
|
}
|
||
|
|
|
||
|
|
doc, err := BuildIDsDocument2_3(packageName, dirRoot, config)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("expected nil error, got %v", err)
|
||
|
|
}
|
||
|
|
if doc == nil {
|
||
|
|
t.Fatalf("expected non-nil Document, got nil")
|
||
|
|
}
|
||
|
|
|
||
|
|
// not checking all contents of doc, see builder tests for those
|
||
|
|
|
||
|
|
// get the package and its files, checking size of each
|
||
|
|
if doc.Packages == nil {
|
||
|
|
t.Fatalf("expected non-nil Packages, got nil")
|
||
|
|
}
|
||
|
|
if len(doc.Packages) != 1 {
|
||
|
|
t.Fatalf("expected Packages len to be 1, got %d", len(doc.Packages))
|
||
|
|
}
|
||
|
|
pkg := doc.Packages[0]
|
||
|
|
if pkg == nil {
|
||
|
|
t.Fatalf("expected non-nil pkg, got nil")
|
||
|
|
}
|
||
|
|
|
||
|
|
if pkg.Files == nil {
|
||
|
|
t.Fatalf("expected non-nil Files, got nil")
|
||
|
|
}
|
||
|
|
if len(pkg.Files) != 6 {
|
||
|
|
t.Fatalf("expected Files len to be 6, got %d", len(pkg.Files))
|
||
|
|
}
|
||
|
|
|
||
|
|
fileInFolder := pkg.Files[0]
|
||
|
|
if fileInFolder.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileInFolder.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileInFolder.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileInFolder.LicenseInfoInFiles[0] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", fileInFolder.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileInFolder.LicenseConcluded != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", fileInFolder.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
fileTrailingComment := pkg.Files[1]
|
||
|
|
if fileTrailingComment.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileTrailingComment.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileTrailingComment.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileTrailingComment.LicenseInfoInFiles[0] != "GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileTrailingComment.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileTrailingComment.LicenseConcluded != "GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileTrailingComment.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
fileHasDuplicateID := pkg.Files[2]
|
||
|
|
if fileHasDuplicateID.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileHasDuplicateID.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileHasDuplicateID.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileHasDuplicateID.LicenseInfoInFiles[0] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", fileHasDuplicateID.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileHasDuplicateID.LicenseConcluded != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", fileHasDuplicateID.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
fileHasID := pkg.Files[3]
|
||
|
|
if fileHasID.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileHasID.LicenseInfoInFiles) != 2 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 2, got %d", len(fileHasID.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileHasID.LicenseInfoInFiles[0] != "Apache-2.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "Apache-2.0", fileHasID.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileHasID.LicenseInfoInFiles[1] != "GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-or-later", fileHasID.LicenseInfoInFiles[1])
|
||
|
|
}
|
||
|
|
if fileHasID.LicenseConcluded != "Apache-2.0 OR GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "Apache-2.0 OR GPL-2.0-or-later", fileHasID.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
fileMultipleIDs := pkg.Files[4]
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileMultipleIDs.LicenseInfoInFiles) != 5 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 5, got %d", len(fileMultipleIDs.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles[0] != "BSD-2-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-2-Clause", fileMultipleIDs.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles[1] != "BSD-3-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-3-Clause", fileMultipleIDs.LicenseInfoInFiles[1])
|
||
|
|
}
|
||
|
|
// here, DO NOT keep the +
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles[2] != "EPL-1.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "EPL-1.0", fileMultipleIDs.LicenseInfoInFiles[2])
|
||
|
|
}
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles[3] != "ISC" {
|
||
|
|
t.Errorf("expected %v, got %v", "ISC", fileMultipleIDs.LicenseInfoInFiles[3])
|
||
|
|
}
|
||
|
|
if fileMultipleIDs.LicenseInfoInFiles[4] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", fileMultipleIDs.LicenseInfoInFiles[4])
|
||
|
|
}
|
||
|
|
if fileMultipleIDs.LicenseConcluded != "((MIT AND BSD-3-Clause) OR ISC) AND BSD-2-Clause AND EPL-1.0+" {
|
||
|
|
t.Errorf("expected %v, got %v", "((MIT AND BSD-3-Clause) OR ISC) AND BSD-2-Clause AND EPL-1.0+", fileMultipleIDs.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
fileNoID := pkg.Files[5]
|
||
|
|
if fileNoID.LicenseInfoInFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil LicenseInfoInFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(fileNoID.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Fatalf("expected LicenseInfoInFiles len to be 1, got %d", len(fileNoID.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if fileNoID.LicenseInfoInFiles[0] != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %v, got %v", "NOASSERTION", fileNoID.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if fileNoID.LicenseConcluded != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %v, got %v", "NOASSERTION", fileNoID.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
// and finally, the package should have all of these licenses
|
||
|
|
if pkg.PackageLicenseInfoFromFiles == nil {
|
||
|
|
t.Fatalf("expected non-nil PackageLicenseInfoFromFiles, got nil")
|
||
|
|
}
|
||
|
|
if len(pkg.PackageLicenseInfoFromFiles) != 7 {
|
||
|
|
t.Fatalf("expected PackageLicenseInfoFromFiles len to be 7, got %d", len(pkg.PackageLicenseInfoFromFiles))
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[0] != "Apache-2.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "Apache-2.0", pkg.PackageLicenseInfoFromFiles[0])
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[1] != "BSD-2-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-2-Clause", pkg.PackageLicenseInfoFromFiles[1])
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[2] != "BSD-3-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-3-Clause", pkg.PackageLicenseInfoFromFiles[2])
|
||
|
|
}
|
||
|
|
// here, DO NOT keep the +
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[3] != "EPL-1.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "EPL-1.0", pkg.PackageLicenseInfoFromFiles[3])
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[4] != "GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-or-later", pkg.PackageLicenseInfoFromFiles[4])
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[5] != "ISC" {
|
||
|
|
t.Errorf("expected %v, got %v", "ISC", pkg.PackageLicenseInfoFromFiles[5])
|
||
|
|
}
|
||
|
|
if pkg.PackageLicenseInfoFromFiles[6] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", pkg.PackageLicenseInfoFromFiles[6])
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
func Test2_3SearcherCanFillInIDsAndIgnorePaths(t *testing.T) {
|
||
|
|
packageName := "project3"
|
||
|
|
dirRoot := "../testdata/project3/"
|
||
|
|
config := &Config2_3{
|
||
|
|
NamespacePrefix: "https://github.com/swinslow/spdx-docs/spdx-go/testdata-",
|
||
|
|
BuilderPathsIgnored: []string{
|
||
|
|
"**/ignoredir/",
|
||
|
|
"/excludedir/",
|
||
|
|
"**/ignorefile.txt",
|
||
|
|
"/alsoEXCLUDEthis.txt",
|
||
|
|
},
|
||
|
|
SearcherPathsIgnored: []string{
|
||
|
|
"**/dontscan.txt",
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
doc, err := BuildIDsDocument2_3(packageName, dirRoot, config)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("expected nil error, got %v", err)
|
||
|
|
}
|
||
|
|
if doc == nil {
|
||
|
|
t.Fatalf("expected non-nil Document, got nil")
|
||
|
|
}
|
||
|
|
|
||
|
|
// not checking all contents of doc, see builder tests for those
|
||
|
|
|
||
|
|
// get the package and its files, checking licenses for each, and
|
||
|
|
// confirming NOASSERTION for those that are skipped
|
||
|
|
pkg := doc.Packages[0]
|
||
|
|
if pkg == nil {
|
||
|
|
t.Fatalf("expected non-nil pkg, got nil")
|
||
|
|
}
|
||
|
|
if len(pkg.Files) != 5 {
|
||
|
|
t.Fatalf("expected len %d, got %d", 5, len(pkg.Files))
|
||
|
|
}
|
||
|
|
|
||
|
|
f := pkg.Files[0]
|
||
|
|
if f.FileName != "./dontscan.txt" {
|
||
|
|
t.Errorf("expected %v, got %v", "./dontscan.txt", f.FileName)
|
||
|
|
}
|
||
|
|
if len(f.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if f.LicenseInfoInFiles[0] != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if f.LicenseConcluded != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
f = pkg.Files[1]
|
||
|
|
if f.FileName != "./keep/keep.txt" {
|
||
|
|
t.Errorf("expected %v, got %v", "./keep/keep.txt", f.FileName)
|
||
|
|
}
|
||
|
|
if len(f.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if f.LicenseInfoInFiles[0] != "MIT" {
|
||
|
|
t.Errorf("expected %s, got %s", "MIT", f.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if f.LicenseConcluded != "MIT" {
|
||
|
|
t.Errorf("expected %s, got %s", "MIT", f.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
f = pkg.Files[2]
|
||
|
|
if f.FileName != "./keep.txt" {
|
||
|
|
t.Errorf("expected %v, got %v", "./keep.txt", f.FileName)
|
||
|
|
}
|
||
|
|
if len(f.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if f.LicenseInfoInFiles[0] != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if f.LicenseConcluded != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
f = pkg.Files[3]
|
||
|
|
if f.FileName != "./subdir/keep/dontscan.txt" {
|
||
|
|
t.Errorf("expected %v, got %v", "./subdir/keep/dontscan.txt", f.FileName)
|
||
|
|
}
|
||
|
|
if len(f.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if f.LicenseInfoInFiles[0] != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if f.LicenseConcluded != "NOASSERTION" {
|
||
|
|
t.Errorf("expected %s, got %s", "NOASSERTION", f.LicenseConcluded)
|
||
|
|
}
|
||
|
|
|
||
|
|
f = pkg.Files[4]
|
||
|
|
if f.FileName != "./subdir/keep/keep.txt" {
|
||
|
|
t.Errorf("expected %v, got %v", "./subdir/keep/keep.txt", f.FileName)
|
||
|
|
}
|
||
|
|
if len(f.LicenseInfoInFiles) != 1 {
|
||
|
|
t.Errorf("expected len to be %d, got %d", 1, len(f.LicenseInfoInFiles))
|
||
|
|
}
|
||
|
|
if f.LicenseInfoInFiles[0] != "MIT" {
|
||
|
|
t.Errorf("expected %s, got %s", "MIT", f.LicenseInfoInFiles[0])
|
||
|
|
}
|
||
|
|
if f.LicenseConcluded != "MIT" {
|
||
|
|
t.Errorf("expected %s, got %s", "MIT", f.LicenseConcluded)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func Test2_3SearcherFailsWithInvalidPath(t *testing.T) {
|
||
|
|
packageName := "project2"
|
||
|
|
dirRoot := "./oops/invalid"
|
||
|
|
config := &Config2_3{
|
||
|
|
NamespacePrefix: "whatever",
|
||
|
|
}
|
||
|
|
|
||
|
|
_, err := BuildIDsDocument2_3(packageName, dirRoot, config)
|
||
|
|
if err == nil {
|
||
|
|
t.Fatalf("expected non-nil error, got nil")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// ===== Searcher utility tests =====
|
||
|
|
func TestCanFindShortFormIDWhenPresent(t *testing.T) {
|
||
|
|
filePath := "../testdata/project2/has-id.txt"
|
||
|
|
|
||
|
|
ids, err := searchFileIDs(filePath)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("expected nil error, got %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
if len(ids) != 1 {
|
||
|
|
t.Fatalf("expected len 1, got %d", len(ids))
|
||
|
|
}
|
||
|
|
|
||
|
|
if ids[0] != "Apache-2.0 OR GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "Apache-2.0 OR GPL-2.0-or-later", ids[0])
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCanFindMultipleShortFormIDsWhenPresent(t *testing.T) {
|
||
|
|
filePath := "../testdata/project2/has-multiple-ids.txt"
|
||
|
|
|
||
|
|
ids, err := searchFileIDs(filePath)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("expected nil error, got %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
if len(ids) != 3 {
|
||
|
|
t.Fatalf("expected len 3, got %d", len(ids))
|
||
|
|
}
|
||
|
|
|
||
|
|
if ids[0] != "(MIT AND BSD-3-Clause) OR ISC" {
|
||
|
|
t.Errorf("expected %v, got %v", "(MIT AND BSD-3-Clause) OR ISC", ids[0])
|
||
|
|
}
|
||
|
|
if ids[1] != "BSD-2-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-2-Clause", ids[1])
|
||
|
|
}
|
||
|
|
if ids[2] != "EPL-1.0+" {
|
||
|
|
t.Errorf("expected %v, got %v", "EPL-1.0+", ids[2])
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCanCollapseDuplicateShortFormIDsWhenPresent(t *testing.T) {
|
||
|
|
filePath := "../testdata/project2/has-duplicate-ids.txt"
|
||
|
|
|
||
|
|
ids, err := searchFileIDs(filePath)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("expected nil error, got %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
if len(ids) != 1 {
|
||
|
|
t.Fatalf("expected len 1, got %d", len(ids))
|
||
|
|
}
|
||
|
|
|
||
|
|
if ids[0] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", ids[0])
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCanStripTrailingStarSlash(t *testing.T) {
|
||
|
|
filePath := "../testdata/project2/folder/has-trailing-comment-marker.c"
|
||
|
|
|
||
|
|
ids, err := searchFileIDs(filePath)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("expected nil error, got %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
if len(ids) != 1 {
|
||
|
|
t.Fatalf("expected len 1, got %d", len(ids))
|
||
|
|
}
|
||
|
|
|
||
|
|
if ids[0] != "GPL-2.0-or-later" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-or-later", ids[0])
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCanIgnoreShortFormIDWhenTooManyPrefixChars(t *testing.T) {
|
||
|
|
filePath := "../testdata/project4/has-id-to-ignore.txt"
|
||
|
|
|
||
|
|
ids, err := searchFileIDs(filePath)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("expected nil error, got %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
if len(ids) != 0 {
|
||
|
|
t.Fatalf("expected len 0, got %d", len(ids))
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCanPickJustTheRightID(t *testing.T) {
|
||
|
|
filePath := "../testdata/project4/has-mix-of-ids.txt"
|
||
|
|
|
||
|
|
ids, err := searchFileIDs(filePath)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("expected nil error, got %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
if len(ids) != 1 {
|
||
|
|
t.Fatalf("expected len 1, got %d", len(ids))
|
||
|
|
}
|
||
|
|
|
||
|
|
if ids[0] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", ids[0])
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCannotFindShortFormIDWhenAbsent(t *testing.T) {
|
||
|
|
filePath := "../testdata/project2/no-id.txt"
|
||
|
|
|
||
|
|
ids, err := searchFileIDs(filePath)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("expected nil error, got %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
if len(ids) != 0 {
|
||
|
|
t.Fatalf("expected len 0, got %d", len(ids))
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCanExcludeTrashCharactersFromID(t *testing.T) {
|
||
|
|
lid := "Apac\",he-2.0"
|
||
|
|
want := "Apache-2.0"
|
||
|
|
got := stripTrash(lid)
|
||
|
|
if want != got {
|
||
|
|
t.Errorf("expected %v, got %v", want, got)
|
||
|
|
}
|
||
|
|
|
||
|
|
lid = "Apache-2.0"
|
||
|
|
want = "Apache-2.0"
|
||
|
|
got = stripTrash(lid)
|
||
|
|
if want != got {
|
||
|
|
t.Errorf("expected %v, got %v", want, got)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestSearchFileIDsFailsWithInvalidFilePath(t *testing.T) {
|
||
|
|
filePath := "./oops/nm/invalid"
|
||
|
|
|
||
|
|
_, err := searchFileIDs(filePath)
|
||
|
|
if err == nil {
|
||
|
|
t.Fatalf("expected non-nil error, got nil")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestWillParenthesizeIfNeeded(t *testing.T) {
|
||
|
|
licID := "MIT OR BSD-3-Clause"
|
||
|
|
retval := makeElement(licID)
|
||
|
|
if retval != "(MIT OR BSD-3-Clause)" {
|
||
|
|
t.Errorf("expected %v, got %v", "(MIT OR BSD-3-Clause)", retval)
|
||
|
|
}
|
||
|
|
|
||
|
|
licID = "ISC AND HPND"
|
||
|
|
retval = makeElement(licID)
|
||
|
|
if retval != "(ISC AND HPND)" {
|
||
|
|
t.Errorf("expected %v, got %v", "(ISC AND HPND)", retval)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestWillNotParenthesizeIfNotNeeded(t *testing.T) {
|
||
|
|
lic := "MIT"
|
||
|
|
retval := makeElement(lic)
|
||
|
|
if retval != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", retval)
|
||
|
|
}
|
||
|
|
|
||
|
|
lic = "GPL-2.0-only WITH Classpath-exception-2.0"
|
||
|
|
retval = makeElement(lic)
|
||
|
|
if retval != "GPL-2.0-only WITH Classpath-exception-2.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-only WITH Classpath-exception-2.0", retval)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCanGetIndividualLicenses(t *testing.T) {
|
||
|
|
// single license
|
||
|
|
lic := "MIT"
|
||
|
|
lics := getIndividualLicenses(lic)
|
||
|
|
if lics == nil {
|
||
|
|
t.Fatalf("expected non-nil lics, got nil")
|
||
|
|
}
|
||
|
|
if len(lics) != 1 {
|
||
|
|
t.Fatalf("expected lics to have len 1, got %d", len(lics))
|
||
|
|
}
|
||
|
|
if lics[0] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", lics[0])
|
||
|
|
}
|
||
|
|
|
||
|
|
// two-license combo
|
||
|
|
lic = "ISC AND BSD-3-Clause"
|
||
|
|
lics = getIndividualLicenses(lic)
|
||
|
|
if lics == nil {
|
||
|
|
t.Fatalf("expected non-nil lics, got nil")
|
||
|
|
}
|
||
|
|
if len(lics) != 2 {
|
||
|
|
t.Fatalf("expected lics to have len 2, got %d", len(lics))
|
||
|
|
}
|
||
|
|
// should be sorted alphabetically
|
||
|
|
if lics[0] != "BSD-3-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-3-Clause", lics[0])
|
||
|
|
}
|
||
|
|
if lics[1] != "ISC" {
|
||
|
|
t.Errorf("expected %v, got %v", "ISC", lics[1])
|
||
|
|
}
|
||
|
|
|
||
|
|
// license WITH exception
|
||
|
|
lic = "GPL-2.0-only WITH Classpath-exception-2.0"
|
||
|
|
lics = getIndividualLicenses(lic)
|
||
|
|
if lics == nil {
|
||
|
|
t.Fatalf("expected non-nil lics, got nil")
|
||
|
|
}
|
||
|
|
if len(lics) != 2 {
|
||
|
|
t.Fatalf("expected lics to have len 2, got %d", len(lics))
|
||
|
|
}
|
||
|
|
// exception should be listed separately
|
||
|
|
if lics[0] != "Classpath-exception-2.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "Classpath-exception-2.0", lics[0])
|
||
|
|
}
|
||
|
|
if lics[1] != "GPL-2.0-only" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-only", lics[1])
|
||
|
|
}
|
||
|
|
|
||
|
|
// two-license combo with parens
|
||
|
|
lic = "(JSON OR BSD-2-Clause)"
|
||
|
|
lics = getIndividualLicenses(lic)
|
||
|
|
if lics == nil {
|
||
|
|
t.Fatalf("expected non-nil lics, got nil")
|
||
|
|
}
|
||
|
|
if len(lics) != 2 {
|
||
|
|
t.Fatalf("expected lics to have len 2, got %d", len(lics))
|
||
|
|
}
|
||
|
|
// parens should get dropped
|
||
|
|
if lics[0] != "BSD-2-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-2-Clause", lics[0])
|
||
|
|
}
|
||
|
|
if lics[1] != "JSON" {
|
||
|
|
t.Errorf("expected %v, got %v", "JSON", lics[1])
|
||
|
|
}
|
||
|
|
|
||
|
|
// multi-license combo with nested parens
|
||
|
|
lic = "GPL-2.0-only AND ((EPL-1.0 AND BSD-4-Clause) OR MIT)"
|
||
|
|
lics = getIndividualLicenses(lic)
|
||
|
|
if lics == nil {
|
||
|
|
t.Fatalf("expected non-nil lics, got nil")
|
||
|
|
}
|
||
|
|
if len(lics) != 4 {
|
||
|
|
t.Fatalf("expected lics to have len 4, got %d", len(lics))
|
||
|
|
}
|
||
|
|
if lics[0] != "BSD-4-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-4-Clause", lics[0])
|
||
|
|
}
|
||
|
|
if lics[1] != "EPL-1.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "EPL-1.0", lics[1])
|
||
|
|
}
|
||
|
|
if lics[2] != "GPL-2.0-only" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-only", lics[2])
|
||
|
|
}
|
||
|
|
if lics[3] != "MIT" {
|
||
|
|
t.Errorf("expected %v, got %v", "MIT", lics[3])
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCanGetIndividualLicensesIgnoringOperatorCase(t *testing.T) {
|
||
|
|
// two-license combo with lowercase 'and'
|
||
|
|
lic := "ISC and BSD-3-Clause"
|
||
|
|
lics := getIndividualLicenses(lic)
|
||
|
|
if lics == nil {
|
||
|
|
t.Fatalf("expected non-nil lics, got nil")
|
||
|
|
}
|
||
|
|
// should be sorted alphabetically; 'and' should not appear
|
||
|
|
if len(lics) != 2 {
|
||
|
|
t.Fatalf("expected lics to have len 2, got %d", len(lics))
|
||
|
|
}
|
||
|
|
if lics[0] != "BSD-3-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-3-Clause", lics[0])
|
||
|
|
}
|
||
|
|
if lics[1] != "ISC" {
|
||
|
|
t.Errorf("expected %v, got %v", "ISC", lics[1])
|
||
|
|
}
|
||
|
|
|
||
|
|
// two-license combo with lowercase 'or'
|
||
|
|
lic = "ISC or BSD-3-Clause"
|
||
|
|
lics = getIndividualLicenses(lic)
|
||
|
|
if lics == nil {
|
||
|
|
t.Fatalf("expected non-nil lics, got nil")
|
||
|
|
}
|
||
|
|
// should be sorted alphabetically; 'or' should not appear
|
||
|
|
if len(lics) != 2 {
|
||
|
|
t.Fatalf("expected lics to have len 2, got %d", len(lics))
|
||
|
|
}
|
||
|
|
if lics[0] != "BSD-3-Clause" {
|
||
|
|
t.Errorf("expected %v, got %v", "BSD-3-Clause", lics[0])
|
||
|
|
}
|
||
|
|
if lics[1] != "ISC" {
|
||
|
|
t.Errorf("expected %v, got %v", "ISC", lics[1])
|
||
|
|
}
|
||
|
|
|
||
|
|
// two-license combo with lowercase 'with'
|
||
|
|
lic = "GPL-2.0-only with Classpath-exception-2.0"
|
||
|
|
lics = getIndividualLicenses(lic)
|
||
|
|
if lics == nil {
|
||
|
|
t.Fatalf("expected non-nil lics, got nil")
|
||
|
|
}
|
||
|
|
// should be sorted alphabetically; 'with' should not appear
|
||
|
|
if len(lics) != 2 {
|
||
|
|
t.Fatalf("expected lics to have len 2, got %d", len(lics))
|
||
|
|
}
|
||
|
|
if lics[0] != "Classpath-exception-2.0" {
|
||
|
|
t.Errorf("expected %v, got %v", "Classpath-exception-2.0", lics[0])
|
||
|
|
}
|
||
|
|
if lics[1] != "GPL-2.0-only" {
|
||
|
|
t.Errorf("expected %v, got %v", "GPL-2.0-only", lics[1])
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|