From e97adc5db9237744a72600c9a1606b94a34fd581 Mon Sep 17 00:00:00 2001 From: Ibrahim Kanouche Date: Mon, 20 Mar 2023 16:42:09 +0000 Subject: [PATCH] Updated SBOM generator module to generate JSON spdx utility bill of material Test: m compliance_sbom Bug: 265472710 Change-Id: Iad9ddbd2abf17ff0b034f1410c55dd99051f7127 --- tools/compliance/Android.bp | 4 + tools/compliance/cmd/sbom/sbom.go | 144 +- tools/compliance/cmd/sbom/sbom_test.go | 3202 ++++++++++++++---------- 3 files changed, 1990 insertions(+), 1360 deletions(-) diff --git a/tools/compliance/Android.bp b/tools/compliance/Android.bp index 8e13f2f661..f85a46f6c2 100644 --- a/tools/compliance/Android.bp +++ b/tools/compliance/Android.bp @@ -138,6 +138,10 @@ blueprint_go_binary { "compliance-module", "blueprint-deptools", "soong-response", + "spdx-tools-spdxv2_2", + "spdx-tools-builder2v2", + "spdx-tools-spdxcommon", + "spdx-tools-spdx-json", ], testSrcs: ["cmd/sbom/sbom_test.go"], } diff --git a/tools/compliance/cmd/sbom/sbom.go b/tools/compliance/cmd/sbom/sbom.go index 0f8a876f24..eddcd8b71b 100644 --- a/tools/compliance/cmd/sbom/sbom.go +++ b/tools/compliance/cmd/sbom/sbom.go @@ -31,13 +31,21 @@ import ( "android/soong/tools/compliance/projectmetadata" "github.com/google/blueprint/deptools" + + "github.com/spdx/tools-golang/builder/builder2v2" + "github.com/spdx/tools-golang/json" + "github.com/spdx/tools-golang/spdx/common" + spdx "github.com/spdx/tools-golang/spdx/v2_2" ) var ( failNoneRequested = fmt.Errorf("\nNo license metadata files requested") failNoLicenses = fmt.Errorf("No licenses found") + mainPkgName = flag.String("main_package_name", "", "The name of the first target node in the licensegraph") ) +const NOASSERTION = "NOASSERTION" + type context struct { stdout io.Writer stderr io.Writer @@ -154,7 +162,8 @@ Options: ctx := &context{ofile, os.Stderr, compliance.FS, *product, *stripPrefix, actualTime} - deps, err := sbomGenerator(ctx, flags.Args()...) + spdxDoc, deps, err := sbomGenerator(ctx, flags.Args()...) + if err != nil { if err == failNoneRequested { flags.Usage() @@ -163,6 +172,11 @@ Options: os.Exit(1) } + if err := spdx_json.Save2_2(spdxDoc, ofile); err != nil { + fmt.Fprintf(os.Stderr, "failed to write document to %v: %v", *outputFile, err) + os.Exit(1) + } + if *outputFile != "-" { err := os.WriteFile(*outputFile, obuf.Bytes(), 0666) if err != nil { @@ -218,17 +232,17 @@ func getDocumentName(ctx *context, tn *compliance.TargetNode, pm *projectmetadat // or NOASSERTION if not available, none determined or ambiguous func getDownloadUrl(_ *context, pm *projectmetadata.ProjectMetadata) string { if pm == nil { - return "NOASSERTION" + return NOASSERTION } urlsByTypeName := pm.UrlsByTypeName() if urlsByTypeName == nil { - return "NOASSERTION" + return NOASSERTION } url := urlsByTypeName.DownloadUrl() if url == "" { - return "NOASSERTION" + return NOASSERTION } return url } @@ -274,7 +288,7 @@ func getProjectMetadata(_ *context, pmix *projectmetadata.Index, // inputFiles returns the complete list of files read func inputFiles(lg *compliance.LicenseGraph, pmix *projectmetadata.Index, licenseTexts []string) []string { projectMeta := pmix.AllMetadataFiles() - targets := lg.TargetNames() + targets := lg.TargetNames() files := make([]string, 0, len(licenseTexts)+len(targets)+len(projectMeta)) files = append(files, licenseTexts...) files = append(files, targets...) @@ -289,10 +303,10 @@ func inputFiles(lg *compliance.LicenseGraph, pmix *projectmetadata.Index, licens // sbomGenerator uses the SPDX standard, see the SPDX specification (https://spdx.github.io/spdx-spec/) // sbomGenerator is also following the internal google SBOM styleguide (http://goto.google.com/spdx-style-guide) -func sbomGenerator(ctx *context, files ...string) ([]string, error) { +func sbomGenerator(ctx *context, files ...string) (*spdx.Document, []string, error) { // Must be at least one root file. if len(files) < 1 { - return nil, failNoneRequested + return nil, nil, failNoneRequested } pmix := projectmetadata.NewIndex(ctx.rootFS) @@ -300,9 +314,18 @@ func sbomGenerator(ctx *context, files ...string) ([]string, error) { lg, err := compliance.ReadLicenseGraph(ctx.rootFS, ctx.stderr, files) if err != nil { - return nil, fmt.Errorf("Unable to read license text file(s) for %q: %v\n", files, err) + return nil, nil, fmt.Errorf("Unable to read license text file(s) for %q: %v\n", files, err) } + // creating the packages section + pkgs := []*spdx.Package{} + + // creating the relationship section + relationships := []*spdx.Relationship{} + + // creating the license section + otherLicenses := []*spdx.OtherLicense{} + // implementing the licenses references for the packages licenses := make(map[string]string) concludedLicenses := func(licenseTexts []string) string { @@ -325,7 +348,6 @@ func sbomGenerator(ctx *context, files ...string) ([]string, error) { } isMainPackage := true - var mainPackage string visitedNodes := make(map[*compliance.TargetNode]struct{}) // performing a Breadth-first top down walk of licensegraph and building package information @@ -341,45 +363,50 @@ func sbomGenerator(ctx *context, files ...string) ([]string, error) { } if isMainPackage { - mainPackage = getDocumentName(ctx, tn, pm) - fmt.Fprintf(ctx.stdout, "SPDXVersion: SPDX-2.2\n") - fmt.Fprintf(ctx.stdout, "DataLicense: CC0-1.0\n") - fmt.Fprintf(ctx.stdout, "DocumentName: %s\n", mainPackage) - fmt.Fprintf(ctx.stdout, "SPDXID: SPDXRef-DOCUMENT\n") - fmt.Fprintf(ctx.stdout, "DocumentNamespace: Android\n") - fmt.Fprintf(ctx.stdout, "Creator: Organization: Google LLC\n") - fmt.Fprintf(ctx.stdout, "Created: %s\n", ctx.creationTime().Format("2006-01-02T15:04:05Z")) + *mainPkgName = replaceSlashes(getPackageName(ctx, tn)) isMainPackage = false } - relationships := make([]string, 0, 1) - defer func() { - if r := recover(); r != nil { - panic(r) - } - for _, relationship := range relationships { - fmt.Fprintln(ctx.stdout, relationship) - } - }() if len(path) == 0 { - relationships = append(relationships, - fmt.Sprintf("Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-Package-%s", - getPackageName(ctx, tn))) + // Add the describe relationship for the main package + rln := &spdx.Relationship{ + RefA: common.MakeDocElementID("" /* this document */, "DOCUMENT"), + RefB: common.MakeDocElementID("", *mainPkgName), + Relationship: "DESCRIBES", + } + relationships = append(relationships, rln) + } else { // Check parent and identify annotation parent := path[len(path)-1] targetEdge := parent.Edge() if targetEdge.IsRuntimeDependency() { // Adding the dynamic link annotation RUNTIME_DEPENDENCY_OF relationship - relationships = append(relationships, fmt.Sprintf("Relationship: SPDXRef-Package-%s RUNTIME_DEPENDENCY_OF SPDXRef-Package-%s", getPackageName(ctx, tn), getPackageName(ctx, targetEdge.Target()))) + rln := &spdx.Relationship{ + RefA: common.MakeDocElementID("", replaceSlashes(getPackageName(ctx, tn))), + RefB: common.MakeDocElementID("", replaceSlashes(getPackageName(ctx, targetEdge.Target()))), + Relationship: "RUNTIME_DEPENDENCY_OF", + } + relationships = append(relationships, rln) } else if targetEdge.IsDerivation() { // Adding the derivation annotation as a CONTAINS relationship - relationships = append(relationships, fmt.Sprintf("Relationship: SPDXRef-Package-%s CONTAINS SPDXRef-Package-%s", getPackageName(ctx, targetEdge.Target()), getPackageName(ctx, tn))) + rln := &spdx.Relationship{ + RefA: common.MakeDocElementID("", replaceSlashes(getPackageName(ctx, targetEdge.Target()))), + RefB: common.MakeDocElementID("", replaceSlashes(getPackageName(ctx, tn))), + Relationship: "CONTAINS", + } + relationships = append(relationships, rln) } else if targetEdge.IsBuildTool() { // Adding the toolchain annotation as a BUILD_TOOL_OF relationship - relationships = append(relationships, fmt.Sprintf("Relationship: SPDXRef-Package-%s BUILD_TOOL_OF SPDXRef-Package-%s", getPackageName(ctx, tn), getPackageName(ctx, targetEdge.Target()))) + rln := &spdx.Relationship{ + RefA: common.MakeDocElementID("", replaceSlashes(getPackageName(ctx, tn))), + RefB: common.MakeDocElementID("", replaceSlashes(getPackageName(ctx, targetEdge.Target()))), + Relationship: "BUILD_TOOL_OF", + } + relationships = append(relationships, rln) + } else { panic(fmt.Errorf("Unknown dependency type: %v", targetEdge.Annotations())) } @@ -390,18 +417,27 @@ func sbomGenerator(ctx *context, files ...string) ([]string, error) { } visitedNodes[tn] = struct{}{} pkgName := getPackageName(ctx, tn) - fmt.Fprintf(ctx.stdout, "##### Package: %s\n", strings.Replace(pkgName, "-", "/", -2)) - fmt.Fprintf(ctx.stdout, "PackageName: %s\n", pkgName) - if pm != nil && pm.Version() != "" { - fmt.Fprintf(ctx.stdout, "PackageVersion: %s\n", pm.Version()) + + // Making an spdx package and adding it to pkgs + pkg := &spdx.Package{ + PackageName: replaceSlashes(pkgName), + PackageDownloadLocation: getDownloadUrl(ctx, pm), + PackageSPDXIdentifier: common.ElementID(replaceSlashes(pkgName)), + PackageLicenseConcluded: concludedLicenses(tn.LicenseTexts()), } - fmt.Fprintf(ctx.stdout, "SPDXID: SPDXRef-Package-%s\n", pkgName) - fmt.Fprintf(ctx.stdout, "PackageDownloadLocation: %s\n", getDownloadUrl(ctx, pm)) - fmt.Fprintf(ctx.stdout, "PackageLicenseConcluded: %s\n", concludedLicenses(tn.LicenseTexts())) + + if pm != nil && pm.Version() != "" { + pkg.PackageVersion = pm.Version() + } else { + pkg.PackageVersion = NOASSERTION + } + + pkgs = append(pkgs, pkg) + return true }) - fmt.Fprintf(ctx.stdout, "##### Non-standard license:\n") + // Adding Non-standard licenses licenseTexts := make([]string, 0, len(licenses)) @@ -412,23 +448,39 @@ func sbomGenerator(ctx *context, files ...string) ([]string, error) { sort.Strings(licenseTexts) for _, licenseText := range licenseTexts { - fmt.Fprintf(ctx.stdout, "LicenseID: %s\n", licenses[licenseText]) // open the file f, err := ctx.rootFS.Open(filepath.Clean(licenseText)) if err != nil { - return nil, fmt.Errorf("error opening license text file %q: %w", licenseText, err) + return nil, nil, fmt.Errorf("error opening license text file %q: %w", licenseText, err) } // read the file text, err := io.ReadAll(f) if err != nil { - return nil, fmt.Errorf("error reading license text file %q: %w", licenseText, err) + return nil, nil, fmt.Errorf("error reading license text file %q: %w", licenseText, err) } - // adding the extracted license text - fmt.Fprintf(ctx.stdout, "ExtractedText: %v\n", string(text)) + // Making an spdx License and adding it to otherLicenses + otherLicenses = append(otherLicenses, &spdx.OtherLicense{ + LicenseName: strings.Replace(licenses[licenseText], "LicenseRef-", "", -1), + LicenseIdentifier: string(licenses[licenseText]), + ExtractedText: string(text), + }) } deps := inputFiles(lg, pmix, licenseTexts) sort.Strings(deps) - return deps, nil + + // Making the SPDX doc + ci, err := builder2v2.BuildCreationInfoSection2_2("Organization", "Google LLC", nil) + if err != nil { + return nil, nil, fmt.Errorf("Unable to build creation info section for SPDX doc: %v\n", err) + } + + return &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: ci, + Packages: pkgs, + Relationships: relationships, + OtherLicenses: otherLicenses, + }, deps, nil } diff --git a/tools/compliance/cmd/sbom/sbom_test.go b/tools/compliance/cmd/sbom/sbom_test.go index 6df74e2dcc..cc8805f927 100644 --- a/tools/compliance/cmd/sbom/sbom_test.go +++ b/tools/compliance/cmd/sbom/sbom_test.go @@ -15,37 +15,19 @@ package main import ( - "bufio" "bytes" + "encoding/json" "fmt" "os" "reflect" - "regexp" "strings" "testing" "time" "android/soong/tools/compliance" -) - -var ( - spdxVersionTag = regexp.MustCompile(`^\s*SPDXVersion: SPDX-2.2\s*$`) - spdxDataLicenseTag = regexp.MustCompile(`^\s*DataLicense: CC0-1.0\s*$`) - spdxDocumentNameTag = regexp.MustCompile(`^\s*DocumentName:\s*Android*\s*$`) - spdxIDTag = regexp.MustCompile(`^\s*SPDXID:\s*SPDXRef-DOCUMENT\s*$`) - spdxDocumentNameSpaceTag = regexp.MustCompile(`^\s*DocumentNamespace:\s*Android\s*$`) - spdxCreatorOrganizationTag = regexp.MustCompile(`^\s*Creator:\s*Organization:\s*Google LLC\s*$`) - spdxCreatedTimeTag = regexp.MustCompile(`^\s*Created: 1970-01-01T00:00:00Z\s*$`) - spdxPackageTag = regexp.MustCompile(`^\s*#####\s*Package:\s*(.*)\s*$`) - spdxPackageNameTag = regexp.MustCompile(`^\s*PackageName:\s*(.*)\s*$`) - spdxPkgIDTag = regexp.MustCompile(`^\s*SPDXID:\s*SPDXRef-Package-(.*)\s*$`) - spdxPkgDownloadLocationTag = regexp.MustCompile(`^\s*PackageDownloadLocation:\s*NOASSERTION\s*$`) - spdxPkgLicenseDeclaredTag = regexp.MustCompile(`^\s*PackageLicenseConcluded:\s*LicenseRef-(.*)\s*$`) - spdxRelationshipTag = regexp.MustCompile(`^\s*Relationship:\s*SPDXRef-(.*)\s*(DESCRIBES|CONTAINS|BUILD_TOOL_OF|RUNTIME_DEPENDENCY_OF)\s*SPDXRef-Package-(.*)\s*$`) - spdxLicenseTag = regexp.MustCompile(`^\s*##### Non-standard license:\s*$`) - spdxLicenseIDTag = regexp.MustCompile(`^\s*LicenseID: LicenseRef-(.*)\s*$`) - spdxExtractedTextTag = regexp.MustCompile(`^\s*ExtractedText:\s*(.*)\s*$`) - spdxExtractedClosingTextTag = regexp.MustCompile(`^\s*\s*$`) + "github.com/spdx/tools-golang/builder/builder2v2" + "github.com/spdx/tools-golang/spdx/common" + spdx "github.com/spdx/tools-golang/spdx/v2_2" ) func TestMain(m *testing.M) { @@ -65,69 +47,121 @@ func Test(t *testing.T) { outDir string roots []string stripPrefix string - expectedOut []matcher + expectedOut *spdx.Document expectedDeps []string }{ { condition: "firstparty", name: "apex", roots: []string{"highest.apex.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/firstparty/highest.apex.meta_lic"}, - packageName{"testdata/firstparty/highest.apex.meta_lic"}, - spdxPkgID{"testdata/firstparty/highest.apex.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata-firstparty-highest.apex.meta_lic", "DESCRIBES"}, - packageTag{"testdata/firstparty/bin/bin1.meta_lic"}, - packageName{"testdata/firstparty/bin/bin1.meta_lic"}, - spdxPkgID{"testdata/firstparty/bin/bin1.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/highest.apex.meta_lic ", "testdata/firstparty/bin/bin1.meta_lic", "CONTAINS"}, - packageTag{"testdata/firstparty/bin/bin2.meta_lic"}, - packageName{"testdata/firstparty/bin/bin2.meta_lic"}, - spdxPkgID{"testdata/firstparty/bin/bin2.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/highest.apex.meta_lic ", "testdata-firstparty-bin-bin2.meta_lic", "CONTAINS"}, - packageTag{"testdata/firstparty/lib/liba.so.meta_lic"}, - packageName{"testdata/firstparty/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/firstparty/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/highest.apex.meta_lic ", "testdata/firstparty/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/firstparty/lib/libb.so.meta_lic"}, - packageName{"testdata/firstparty/lib/libb.so.meta_lic"}, - spdxPkgID{"testdata/firstparty/lib/libb.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/highest.apex.meta_lic ", "testdata/firstparty/lib/libb.so.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/firstparty/bin/bin1.meta_lic ", "testdata/firstparty/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/firstparty/lib/libc.a.meta_lic"}, - packageName{"testdata/firstparty/lib/libc.a.meta_lic"}, - spdxPkgID{"testdata/firstparty/lib/libc.a.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata-firstparty-bin-bin1.meta_lic ", "testdata/firstparty/lib/libc.a.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/firstparty/lib/libb.so.meta_lic ", "testdata/firstparty/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - packageTag{"testdata/firstparty/lib/libd.so.meta_lic"}, - packageName{"testdata/firstparty/lib/libd.so.meta_lic"}, - spdxPkgID{"testdata/firstparty/lib/libd.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/lib/libd.so.meta_lic ", "testdata/firstparty/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-firstparty-highest.apex.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-highest.apex.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-bin-bin1.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-bin-bin1.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-bin-bin2.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-bin-bin2.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-lib-libb.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-lib-libb.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-lib-libc.a.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-lib-libc.a.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-lib-libd.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-lib-libd.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-firstparty-highest.apex.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-bin-bin1.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-bin-bin2.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-lib-libb.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-lib-libc.a.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-lib-libb.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-lib-libd.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -144,42 +178,68 @@ func Test(t *testing.T) { condition: "firstparty", name: "application", roots: []string{"application.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/firstparty/application.meta_lic"}, - packageName{"testdata/firstparty/application.meta_lic"}, - spdxPkgID{"testdata/firstparty/application.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/firstparty/application.meta_lic", "DESCRIBES"}, - packageTag{"testdata/firstparty/bin/bin3.meta_lic"}, - packageName{"testdata/firstparty/bin/bin3.meta_lic"}, - spdxPkgID{"testdata/firstparty/bin/bin3.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/bin/bin3.meta_lic ", "testdata-firstparty-application.meta_lic", "BUILD_TOOL_OF"}, - packageTag{"testdata/firstparty/lib/liba.so.meta_lic"}, - packageName{"testdata/firstparty/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/firstparty/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/application.meta_lic ", "testdata/firstparty/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/firstparty/lib/libb.so.meta_lic"}, - packageName{"testdata/firstparty/lib/libb.so.meta_lic"}, - spdxPkgID{"testdata/firstparty/lib/libb.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/lib/libb.so.meta_lic ", "testdata-firstparty-application.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-firstparty-application.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-application.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-bin-bin3.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-bin-bin3.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-lib-libb.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-lib-libb.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-firstparty-application.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-bin-bin3.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-application.meta_lic"), + Relationship: "BUILD_TOOL_OF", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-application.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-lib-libb.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-application.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -193,62 +253,114 @@ func Test(t *testing.T) { condition: "firstparty", name: "container", roots: []string{"container.zip.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/firstparty/container.zip.meta_lic"}, - packageName{"testdata/firstparty/container.zip.meta_lic"}, - spdxPkgID{"testdata/firstparty/container.zip.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/firstparty/container.zip.meta_lic", "DESCRIBES"}, - packageTag{"testdata/firstparty/bin/bin1.meta_lic"}, - packageName{"testdata/firstparty/bin/bin1.meta_lic"}, - spdxPkgID{"testdata/firstparty/bin/bin1.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/container.zip.meta_lic ", "testdata/firstparty/bin/bin1.meta_lic", "CONTAINS"}, - packageTag{"testdata/firstparty/bin/bin2.meta_lic"}, - packageName{"testdata/firstparty/bin/bin2.meta_lic"}, - spdxPkgID{"testdata/firstparty/bin/bin2.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/container.zip.meta_lic ", "testdata/firstparty/bin/bin2.meta_lic", "CONTAINS"}, - packageTag{"testdata/firstparty/lib/liba.so.meta_lic"}, - packageName{"testdata/firstparty/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/firstparty/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/container.zip.meta_lic ", "testdata/firstparty/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/firstparty/lib/libb.so.meta_lic"}, - packageName{"testdata/firstparty/lib/libb.so.meta_lic"}, - spdxPkgID{"testdata/firstparty/lib/libb.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/container.zip.meta_lic ", "testdata/firstparty/lib/libb.so.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/firstparty/bin/bin1.meta_lic ", "testdata/firstparty/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/firstparty/lib/libc.a.meta_lic"}, - packageName{"testdata/firstparty/lib/libc.a.meta_lic"}, - spdxPkgID{"testdata/firstparty/lib/libc.a.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/bin/bin1.meta_lic ", "testdata/firstparty/lib/libc.a.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/firstparty/lib/libb.so.meta_lic ", "testdata/firstparty/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - packageTag{"testdata/firstparty/lib/libd.so.meta_lic"}, - packageName{"testdata/firstparty/lib/libd.so.meta_lic"}, - spdxPkgID{"testdata/firstparty/lib/libd.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/lib/libd.so.meta_lic ", "testdata/firstparty/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-firstparty-container.zip.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-container.zip.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-bin-bin1.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-bin-bin1.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-bin-bin2.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-bin-bin2.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-lib-libb.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-lib-libb.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-lib-libc.a.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-lib-libc.a.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-lib-libd.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-lib-libd.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-firstparty-container.zip.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-bin-bin1.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-bin-bin2.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-lib-libb.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-lib-libc.a.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-lib-libb.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-lib-libd.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -265,36 +377,56 @@ func Test(t *testing.T) { condition: "firstparty", name: "binary", roots: []string{"bin/bin1.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/firstparty/bin/bin1.meta_lic"}, - packageName{"testdata/firstparty/bin/bin1.meta_lic"}, - spdxPkgID{"testdata/firstparty/bin/bin1.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/firstparty/bin/bin1.meta_lic", "DESCRIBES"}, - packageTag{"testdata/firstparty/lib/liba.so.meta_lic"}, - packageName{"testdata/firstparty/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/firstparty/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/bin/bin1.meta_lic ", "testdata/firstparty/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/firstparty/lib/libc.a.meta_lic"}, - packageName{"testdata/firstparty/lib/libc.a.meta_lic"}, - spdxPkgID{"testdata/firstparty/lib/libc.a.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/firstparty/bin/bin1.meta_lic ", "testdata/firstparty/lib/libc.a.meta_lic", "CONTAINS"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-firstparty-bin-bin1.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-bin-bin1.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-firstparty-lib-libc.a.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-lib-libc.a.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-firstparty-bin-bin1.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-firstparty-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-firstparty-lib-libc.a.meta_lic"), + Relationship: "CONTAINS", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -307,24 +439,32 @@ func Test(t *testing.T) { condition: "firstparty", name: "library", roots: []string{"lib/libd.so.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/firstparty/lib/libd.so.meta_lic"}, - packageName{"testdata/firstparty/lib/libd.so.meta_lic"}, - spdxPkgID{"testdata/firstparty/lib/libd.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/firstparty/lib/libd.so.meta_lic", "DESCRIBES"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-firstparty-lib-libd.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-firstparty-lib-libd.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-firstparty-lib-libd.so.meta_lic"), + Relationship: "DESCRIBES", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -335,65 +475,119 @@ func Test(t *testing.T) { condition: "notice", name: "apex", roots: []string{"highest.apex.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/notice/highest.apex.meta_lic"}, - packageName{"testdata/notice/highest.apex.meta_lic"}, - spdxPkgID{"testdata/notice/highest.apex.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/notice/highest.apex.meta_lic", "DESCRIBES"}, - packageTag{"testdata/notice/bin/bin1.meta_lic"}, - packageName{"testdata/notice/bin/bin1.meta_lic"}, - spdxPkgID{"testdata/notice/bin/bin1.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/notice/highest.apex.meta_lic ", "testdata/notice/bin/bin1.meta_lic", "CONTAINS"}, - packageTag{"testdata/notice/bin/bin2.meta_lic"}, - packageName{"testdata/notice/bin/bin2.meta_lic"}, - spdxPkgID{"testdata/notice/bin/bin2.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/notice/highest.apex.meta_lic ", "testdata/notice/bin/bin2.meta_lic", "CONTAINS"}, - packageTag{"testdata/notice/lib/liba.so.meta_lic"}, - packageName{"testdata/notice/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/notice/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata/notice/highest.apex.meta_lic ", "testdata/notice/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/notice/lib/libb.so.meta_lic"}, - packageName{"testdata/notice/lib/libb.so.meta_lic"}, - spdxPkgID{"testdata/notice/lib/libb.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/notice/highest.apex.meta_lic ", "testdata/notice/lib/libb.so.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/notice/bin/bin1.meta_lic ", "testdata/notice/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/notice/lib/libc.a.meta_lic"}, - packageName{"testdata/notice/lib/libc.a.meta_lic"}, - spdxPkgID{"testdata/notice/lib/libc.a.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata/notice/bin/bin1.meta_lic ", "testdata/notice/lib/libc.a.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/notice/lib/libb.so.meta_lic ", "testdata/notice/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - packageTag{"testdata/notice/lib/libd.so.meta_lic"}, - packageName{"testdata/notice/lib/libd.so.meta_lic"}, - spdxPkgID{"testdata/notice/lib/libd.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata/notice/lib/libd.so.meta_lic ", "testdata/notice/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-notice-NOTICE_LICENSE"}, - spdxExtractedText{"%%%Notice License%%%"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-notice-highest.apex.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-highest.apex.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-notice-bin-bin1.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-bin-bin1.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-notice-bin-bin2.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-bin-bin2.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-notice-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + { + PackageName: "testdata-notice-lib-libb.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-lib-libb.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-notice-lib-libc.a.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-lib-libc.a.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + { + PackageName: "testdata-notice-lib-libd.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-lib-libd.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-notice-highest.apex.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-bin-bin1.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-bin-bin2.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-lib-libb.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-lib-libc.a.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-lib-libb.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-lib-libd.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-notice-NOTICE_LICENSE", + ExtractedText: "%%%Notice License%%%\n", + LicenseName: "testdata-notice-NOTICE_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -411,65 +605,119 @@ func Test(t *testing.T) { condition: "notice", name: "container", roots: []string{"container.zip.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/notice/container.zip.meta_lic"}, - packageName{"testdata/notice/container.zip.meta_lic"}, - spdxPkgID{"testdata/notice/container.zip.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/notice/container.zip.meta_lic", "DESCRIBES"}, - packageTag{"testdata/notice/bin/bin1.meta_lic"}, - packageName{"testdata/notice/bin/bin1.meta_lic"}, - spdxPkgID{"testdata/notice/bin/bin1.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/notice/container.zip.meta_lic ", "testdata/notice/bin/bin1.meta_lic", "CONTAINS"}, - packageTag{"testdata/notice/bin/bin2.meta_lic"}, - packageName{"testdata/notice/bin/bin2.meta_lic"}, - spdxPkgID{"testdata/notice/bin/bin2.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/notice/container.zip.meta_lic ", "testdata/notice/bin/bin2.meta_lic", "CONTAINS"}, - packageTag{"testdata/notice/lib/liba.so.meta_lic"}, - packageName{"testdata/notice/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/notice/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata/notice/container.zip.meta_lic ", "testdata/notice/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/notice/lib/libb.so.meta_lic"}, - packageName{"testdata/notice/lib/libb.so.meta_lic"}, - spdxPkgID{"testdata/notice/lib/libb.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/notice/container.zip.meta_lic ", "testdata/notice/lib/libb.so.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/notice/bin/bin1.meta_lic ", "testdata/notice/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/notice/lib/libc.a.meta_lic"}, - packageName{"testdata/notice/lib/libc.a.meta_lic"}, - spdxPkgID{"testdata/notice/lib/libc.a.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata/notice/bin/bin1.meta_lic ", "testdata/notice/lib/libc.a.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/notice/lib/libb.so.meta_lic ", "testdata/notice/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - packageTag{"testdata/notice/lib/libd.so.meta_lic"}, - packageName{"testdata/notice/lib/libd.so.meta_lic"}, - spdxPkgID{"testdata/notice/lib/libd.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata/notice/lib/libd.so.meta_lic ", "testdata/notice/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-notice-NOTICE_LICENSE"}, - spdxExtractedText{"%%%Notice License%%%"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-notice-container.zip.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-container.zip.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-notice-bin-bin1.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-bin-bin1.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-notice-bin-bin2.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-bin-bin2.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-notice-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + { + PackageName: "testdata-notice-lib-libb.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-lib-libb.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-notice-lib-libc.a.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-lib-libc.a.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + { + PackageName: "testdata-notice-lib-libd.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-lib-libd.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-notice-container.zip.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-bin-bin1.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-bin-bin2.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-lib-libb.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-lib-libc.a.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-lib-libb.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-lib-libd.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-notice-NOTICE_LICENSE", + ExtractedText: "%%%Notice License%%%\n", + LicenseName: "testdata-notice-NOTICE_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -487,45 +735,73 @@ func Test(t *testing.T) { condition: "notice", name: "application", roots: []string{"application.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/notice/application.meta_lic"}, - packageName{"testdata/notice/application.meta_lic"}, - spdxPkgID{"testdata/notice/application.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata-notice-application.meta_lic", "DESCRIBES"}, - packageTag{"testdata/notice/bin/bin3.meta_lic"}, - packageName{"testdata/notice/bin/bin3.meta_lic"}, - spdxPkgID{"testdata/notice/bin/bin3.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata-notice-bin-bin3.meta_lic ", "testdata/notice/application.meta_lic", "BUILD_TOOL_OF"}, - packageTag{"testdata/notice/lib/liba.so.meta_lic"}, - packageName{"testdata/notice/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/notice/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata/notice/application.meta_lic ", "testdata-notice-lib-liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/notice/lib/libb.so.meta_lic"}, - packageName{"testdata/notice/lib/libb.so.meta_lic"}, - spdxPkgID{"testdata/notice/lib/libb.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata-notice-lib-libb.so.meta_lic ", "testdata/notice/application.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-notice-NOTICE_LICENSE"}, - spdxExtractedText{"%%%Notice License%%%"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-notice-application.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-application.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-notice-bin-bin3.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-bin-bin3.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + { + PackageName: "testdata-notice-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + { + PackageName: "testdata-notice-lib-libb.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-lib-libb.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-notice-application.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-bin-bin3.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-application.meta_lic"), + Relationship: "BUILD_TOOL_OF", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-application.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-lib-libb.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-application.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-notice-NOTICE_LICENSE", + ExtractedText: "%%%Notice License%%%\n", + LicenseName: "testdata-notice-NOTICE_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -540,39 +816,61 @@ func Test(t *testing.T) { condition: "notice", name: "binary", roots: []string{"bin/bin1.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/notice/bin/bin1.meta_lic"}, - packageName{"testdata/notice/bin/bin1.meta_lic"}, - spdxPkgID{"testdata/notice/bin/bin1.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/notice/bin/bin1.meta_lic", "DESCRIBES"}, - packageTag{"testdata/notice/lib/liba.so.meta_lic"}, - packageName{"testdata/notice/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/notice/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata/notice/bin/bin1.meta_lic ", "testdata/notice/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/notice/lib/libc.a.meta_lic"}, - packageName{"testdata/notice/lib/libc.a.meta_lic"}, - spdxPkgID{"testdata/notice/lib/libc.a.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata/notice/bin/bin1.meta_lic ", "testdata/notice/lib/libc.a.meta_lic", "CONTAINS"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-notice-NOTICE_LICENSE"}, - spdxExtractedText{"%%%Notice License%%%"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-notice-bin-bin1.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-bin-bin1.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-notice-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + { + PackageName: "testdata-notice-lib-libc.a.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-lib-libc.a.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-notice-bin-bin1.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-notice-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-notice-lib-libc.a.meta_lic"), + Relationship: "CONTAINS", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-notice-NOTICE_LICENSE", + ExtractedText: "%%%Notice License%%%\n", + LicenseName: "testdata-notice-NOTICE_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -586,24 +884,32 @@ func Test(t *testing.T) { condition: "notice", name: "library", roots: []string{"lib/libd.so.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/notice/lib/libd.so.meta_lic"}, - packageName{"testdata/notice/lib/libd.so.meta_lic"}, - spdxPkgID{"testdata/notice/lib/libd.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/notice/lib/libd.so.meta_lic", "DESCRIBES"}, - spdxLicense{}, - spdxLicenseID{"testdata-notice-NOTICE_LICENSE"}, - spdxExtractedText{"%%%Notice License%%%"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-notice-lib-libd.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-notice-lib-libd.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-notice-lib-libd.so.meta_lic"), + Relationship: "DESCRIBES", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-notice-NOTICE_LICENSE", + ExtractedText: "%%%Notice License%%%\n", + LicenseName: "testdata-notice-NOTICE_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/notice/NOTICE_LICENSE", @@ -614,68 +920,124 @@ func Test(t *testing.T) { condition: "reciprocal", name: "apex", roots: []string{"highest.apex.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/reciprocal/highest.apex.meta_lic"}, - packageName{"testdata/reciprocal/highest.apex.meta_lic"}, - spdxPkgID{"testdata/reciprocal/highest.apex.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/reciprocal/highest.apex.meta_lic", "DESCRIBES"}, - packageTag{"testdata/reciprocal/bin/bin1.meta_lic"}, - packageName{"testdata/reciprocal/bin/bin1.meta_lic"}, - spdxPkgID{"testdata/reciprocal/bin/bin1.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/highest.apex.meta_lic ", "testdata-reciprocal-bin-bin1.meta_lic", "CONTAINS"}, - packageTag{"testdata/reciprocal/bin/bin2.meta_lic"}, - packageName{"testdata/reciprocal/bin/bin2.meta_lic"}, - spdxPkgID{"testdata/reciprocal/bin/bin2.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/highest.apex.meta_lic ", "testdata-reciprocal-bin-bin2.meta_lic", "CONTAINS"}, - packageTag{"testdata/reciprocal/lib/liba.so.meta_lic"}, - packageName{"testdata/reciprocal/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/reciprocal/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/highest.apex.meta_lic ", "testdata/reciprocal/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/reciprocal/lib/libb.so.meta_lic"}, - packageName{"testdata/reciprocal/lib/libb.so.meta_lic"}, - spdxPkgID{"testdata/reciprocal/lib/libb.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/highest.apex.meta_lic ", "testdata/reciprocal/lib/libb.so.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/reciprocal/bin/bin1.meta_lic ", "testdata/reciprocal/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/reciprocal/lib/libc.a.meta_lic"}, - packageName{"testdata/reciprocal/lib/libc.a.meta_lic"}, - spdxPkgID{"testdata/reciprocal/lib/libc.a.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/bin/bin1.meta_lic ", "testdata/reciprocal/lib/libc.a.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/reciprocal/lib/libb.so.meta_lic ", "testdata/reciprocal/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - packageTag{"testdata/reciprocal/lib/libd.so.meta_lic"}, - packageName{"testdata/reciprocal/lib/libd.so.meta_lic"}, - spdxPkgID{"testdata/reciprocal/lib/libd.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/lib/libd.so.meta_lic ", "testdata/reciprocal/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-notice-NOTICE_LICENSE"}, - spdxExtractedText{"%%%Notice License%%%"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxExtractedText{"$$$Reciprocal License$$$"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-reciprocal-highest.apex.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-reciprocal-highest.apex.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-reciprocal-bin-bin1.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-reciprocal-bin-bin1.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-reciprocal-bin-bin2.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-reciprocal-bin-bin2.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-reciprocal-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-reciprocal-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-reciprocal-RECIPROCAL_LICENSE", + }, + { + PackageName: "testdata-reciprocal-lib-libb.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-reciprocal-lib-libb.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-reciprocal-lib-libc.a.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-reciprocal-lib-libc.a.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-reciprocal-RECIPROCAL_LICENSE", + }, + { + PackageName: "testdata-reciprocal-lib-libd.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-reciprocal-lib-libd.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-highest.apex.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-reciprocal-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-bin-bin1.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-reciprocal-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-bin-bin2.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-reciprocal-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-reciprocal-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-lib-libb.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-reciprocal-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-reciprocal-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-lib-libc.a.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-reciprocal-lib-libb.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + { + RefA: common.MakeDocElementID("", "testdata-reciprocal-lib-libd.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-notice-NOTICE_LICENSE", + ExtractedText: "%%%Notice License%%%\n", + LicenseName: "testdata-notice-NOTICE_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-reciprocal-RECIPROCAL_LICENSE", + ExtractedText: "$$$Reciprocal License$$$\n", + LicenseName: "testdata-reciprocal-RECIPROCAL_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -690,132 +1052,82 @@ func Test(t *testing.T) { "testdata/reciprocal/lib/libd.so.meta_lic", }, }, - { - condition: "reciprocal", - name: "container", - roots: []string{"container.zip.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/reciprocal/container.zip.meta_lic"}, - packageName{"testdata/reciprocal/container.zip.meta_lic"}, - spdxPkgID{"testdata/reciprocal/container.zip.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/reciprocal/container.zip.meta_lic", "DESCRIBES"}, - packageTag{"testdata/reciprocal/bin/bin1.meta_lic"}, - packageName{"testdata/reciprocal/bin/bin1.meta_lic"}, - spdxPkgID{"testdata/reciprocal/bin/bin1.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/container.zip.meta_lic ", "testdata-reciprocal-bin-bin1.meta_lic", "CONTAINS"}, - packageTag{"testdata/reciprocal/bin/bin2.meta_lic"}, - packageName{"testdata/reciprocal/bin/bin2.meta_lic"}, - spdxPkgID{"testdata/reciprocal/bin/bin2.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/container.zip.meta_lic ", "testdata-reciprocal-bin-bin2.meta_lic", "CONTAINS"}, - packageTag{"testdata/reciprocal/lib/liba.so.meta_lic"}, - packageName{"testdata/reciprocal/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/reciprocal/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/container.zip.meta_lic ", "testdata/reciprocal/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/reciprocal/lib/libb.so.meta_lic"}, - packageName{"testdata/reciprocal/lib/libb.so.meta_lic"}, - spdxPkgID{"testdata/reciprocal/lib/libb.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/container.zip.meta_lic ", "testdata/reciprocal/lib/libb.so.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/reciprocal/bin/bin1.meta_lic ", "testdata/reciprocal/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/reciprocal/lib/libc.a.meta_lic"}, - packageName{"testdata/reciprocal/lib/libc.a.meta_lic"}, - spdxPkgID{"testdata/reciprocal/lib/libc.a.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/bin/bin1.meta_lic ", "testdata/reciprocal/lib/libc.a.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/reciprocal/lib/libb.so.meta_lic ", "testdata/reciprocal/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - packageTag{"testdata/reciprocal/lib/libd.so.meta_lic"}, - packageName{"testdata/reciprocal/lib/libd.so.meta_lic"}, - spdxPkgID{"testdata/reciprocal/lib/libd.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/lib/libd.so.meta_lic ", "testdata/reciprocal/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-notice-NOTICE_LICENSE"}, - spdxExtractedText{"%%%Notice License%%%"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxExtractedText{"$$$Reciprocal License$$$"}, - spdxExtractedClosingText{}, - }, - expectedDeps: []string{ - "testdata/firstparty/FIRST_PARTY_LICENSE", - "testdata/notice/NOTICE_LICENSE", - "testdata/reciprocal/RECIPROCAL_LICENSE", - "testdata/reciprocal/bin/bin1.meta_lic", - "testdata/reciprocal/bin/bin2.meta_lic", - "testdata/reciprocal/container.zip.meta_lic", - "testdata/reciprocal/lib/liba.so.meta_lic", - "testdata/reciprocal/lib/libb.so.meta_lic", - "testdata/reciprocal/lib/libc.a.meta_lic", - "testdata/reciprocal/lib/libd.so.meta_lic", - }, - }, { condition: "reciprocal", name: "application", roots: []string{"application.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/reciprocal/application.meta_lic"}, - packageName{"testdata/reciprocal/application.meta_lic"}, - spdxPkgID{"testdata/reciprocal/application.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/reciprocal/application.meta_lic", "DESCRIBES"}, - packageTag{"testdata/reciprocal/bin/bin3.meta_lic"}, - packageName{"testdata/reciprocal/bin/bin3.meta_lic"}, - spdxPkgID{"testdata/reciprocal/bin/bin3.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata-reciprocal-bin-bin3.meta_lic ", "testdata/reciprocal/application.meta_lic", "BUILD_TOOL_OF"}, - packageTag{"testdata/reciprocal/lib/liba.so.meta_lic"}, - packageName{"testdata/reciprocal/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/reciprocal/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/application.meta_lic ", "testdata/reciprocal/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/reciprocal/lib/libb.so.meta_lic"}, - packageName{"testdata/reciprocal/lib/libb.so.meta_lic"}, - spdxPkgID{"testdata/reciprocal/lib/libb.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/lib/libb.so.meta_lic ", "testdata/reciprocal/application.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-notice-NOTICE_LICENSE"}, - spdxExtractedText{"%%%Notice License%%%"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxExtractedText{"$$$Reciprocal License$$$"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-reciprocal-application.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-reciprocal-application.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-reciprocal-bin-bin3.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-reciprocal-bin-bin3.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + { + PackageName: "testdata-reciprocal-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-reciprocal-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-reciprocal-RECIPROCAL_LICENSE", + }, + { + PackageName: "testdata-reciprocal-lib-libb.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-reciprocal-lib-libb.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-application.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-reciprocal-bin-bin3.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-application.meta_lic"), + Relationship: "BUILD_TOOL_OF", + }, + { + RefA: common.MakeDocElementID("", "testdata-reciprocal-application.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-reciprocal-lib-libb.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-application.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-notice-NOTICE_LICENSE", + ExtractedText: "%%%Notice License%%%\n", + LicenseName: "testdata-notice-NOTICE_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-reciprocal-RECIPROCAL_LICENSE", + ExtractedText: "$$$Reciprocal License$$$\n", + LicenseName: "testdata-reciprocal-RECIPROCAL_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -831,39 +1143,61 @@ func Test(t *testing.T) { condition: "reciprocal", name: "binary", roots: []string{"bin/bin1.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/reciprocal/bin/bin1.meta_lic"}, - packageName{"testdata/reciprocal/bin/bin1.meta_lic"}, - spdxPkgID{"testdata/reciprocal/bin/bin1.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/reciprocal/bin/bin1.meta_lic", "DESCRIBES"}, - packageTag{"testdata/reciprocal/lib/liba.so.meta_lic"}, - packageName{"testdata/reciprocal/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/reciprocal/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/bin/bin1.meta_lic ", "testdata/reciprocal/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/reciprocal/lib/libc.a.meta_lic"}, - packageName{"testdata/reciprocal/lib/libc.a.meta_lic"}, - spdxPkgID{"testdata/reciprocal/lib/libc.a.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxRelationship{"Package-testdata/reciprocal/bin/bin1.meta_lic ", "testdata/reciprocal/lib/libc.a.meta_lic", "CONTAINS"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxExtractedText{"$$$Reciprocal License$$$"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-reciprocal-bin-bin1.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-reciprocal-bin-bin1.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-reciprocal-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-reciprocal-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-reciprocal-RECIPROCAL_LICENSE", + }, + { + PackageName: "testdata-reciprocal-lib-libc.a.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-reciprocal-lib-libc.a.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-reciprocal-RECIPROCAL_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-bin-bin1.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-reciprocal-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-reciprocal-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-lib-libc.a.meta_lic"), + Relationship: "CONTAINS", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-reciprocal-RECIPROCAL_LICENSE", + ExtractedText: "$$$Reciprocal License$$$\n", + LicenseName: "testdata-reciprocal-RECIPROCAL_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -877,24 +1211,32 @@ func Test(t *testing.T) { condition: "reciprocal", name: "library", roots: []string{"lib/libd.so.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/reciprocal/lib/libd.so.meta_lic"}, - packageName{"testdata/reciprocal/lib/libd.so.meta_lic"}, - spdxPkgID{"testdata/reciprocal/lib/libd.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/reciprocal/lib/libd.so.meta_lic", "DESCRIBES"}, - spdxLicense{}, - spdxLicenseID{"testdata-notice-NOTICE_LICENSE"}, - spdxExtractedText{"%%%Notice License%%%"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-reciprocal-lib-libd.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-reciprocal-lib-libd.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-reciprocal-lib-libd.so.meta_lic"), + Relationship: "DESCRIBES", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-notice-NOTICE_LICENSE", + ExtractedText: "%%%Notice License%%%\n", + LicenseName: "testdata-notice-NOTICE_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/notice/NOTICE_LICENSE", @@ -902,75 +1244,132 @@ func Test(t *testing.T) { }, }, { - condition: "restricted", - name: "apex", - roots: []string{"highest.apex.meta_lic"}, - stripPrefix: "out/target/product/fictional/system/apex/", - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/restricted/highest.apex.meta_lic"}, - packageName{"testdata/restricted/highest.apex.meta_lic"}, - spdxPkgID{"testdata/restricted/highest.apex.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/restricted/highest.apex.meta_lic", "DESCRIBES"}, - packageTag{"testdata/restricted/bin/bin1.meta_lic"}, - packageName{"testdata/restricted/bin/bin1.meta_lic"}, - spdxPkgID{"testdata/restricted/bin/bin1.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/restricted/highest.apex.meta_lic ", "testdata/restricted/bin/bin1.meta_lic", "CONTAINS"}, - packageTag{"testdata/restricted/bin/bin2.meta_lic"}, - packageName{"testdata/restricted/bin/bin2.meta_lic"}, - spdxPkgID{"testdata/restricted/bin/bin2.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/restricted/highest.apex.meta_lic ", "testdata/restricted/bin/bin2.meta_lic", "CONTAINS"}, - packageTag{"testdata/restricted/lib/liba.so.meta_lic"}, - packageName{"testdata/restricted/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/restricted/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-restricted-RESTRICTED_LICENSE"}, - spdxRelationship{"Package-testdata/restricted/highest.apex.meta_lic ", "testdata/restricted/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/restricted/lib/libb.so.meta_lic"}, - packageName{"testdata/restricted/lib/libb.so.meta_lic"}, - spdxPkgID{"testdata/restricted/lib/libb.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-restricted-RESTRICTED_LICENSE"}, - spdxRelationship{"Package-testdata/restricted/highest.apex.meta_lic ", "testdata/restricted/lib/libb.so.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/restricted/bin/bin1.meta_lic ", "testdata/restricted/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/restricted/lib/libc.a.meta_lic"}, - packageName{"testdata/restricted/lib/libc.a.meta_lic"}, - spdxPkgID{"testdata/restricted/lib/libc.a.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxRelationship{"Package-testdata/restricted/bin/bin1.meta_lic ", "testdata/restricted/lib/libc.a.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/restricted/lib/libb.so.meta_lic ", "testdata/restricted/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - packageTag{"testdata/restricted/lib/libd.so.meta_lic"}, - packageName{"testdata/restricted/lib/libd.so.meta_lic"}, - spdxPkgID{"testdata/restricted/lib/libd.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata/restricted/lib/libd.so.meta_lic ", "testdata/restricted/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-notice-NOTICE_LICENSE"}, - spdxExtractedText{"%%%Notice License%%%"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxExtractedText{"$$$Reciprocal License$$$"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-restricted-RESTRICTED_LICENSE"}, - spdxExtractedText{"###Restricted License###"}, - spdxExtractedClosingText{}, + condition: "restricted", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-restricted-highest.apex.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-highest.apex.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-restricted-bin-bin1.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-bin-bin1.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-restricted-bin-bin2.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-bin-bin2.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-restricted-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-restricted-RESTRICTED_LICENSE", + }, + { + PackageName: "testdata-restricted-lib-libb.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-lib-libb.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-restricted-RESTRICTED_LICENSE", + }, + { + PackageName: "testdata-restricted-lib-libc.a.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-lib-libc.a.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-reciprocal-RECIPROCAL_LICENSE", + }, + { + PackageName: "testdata-restricted-lib-libd.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-lib-libd.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-restricted-highest.apex.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-bin-bin1.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-bin-bin2.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-lib-libb.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-lib-libc.a.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-lib-libb.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-lib-libd.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-notice-NOTICE_LICENSE", + ExtractedText: "%%%Notice License%%%\n", + LicenseName: "testdata-notice-NOTICE_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-reciprocal-RECIPROCAL_LICENSE", + ExtractedText: "$$$Reciprocal License$$$\n", + LicenseName: "testdata-reciprocal-RECIPROCAL_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-restricted-RESTRICTED_LICENSE", + ExtractedText: "###Restricted License###\n", + LicenseName: "testdata-restricted-RESTRICTED_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -987,75 +1386,132 @@ func Test(t *testing.T) { }, }, { - condition: "restricted", - name: "container", - roots: []string{"container.zip.meta_lic"}, - stripPrefix: "out/target/product/fictional/system/apex/", - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/restricted/container.zip.meta_lic"}, - packageName{"testdata/restricted/container.zip.meta_lic"}, - spdxPkgID{"testdata/restricted/container.zip.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/restricted/container.zip.meta_lic", "DESCRIBES"}, - packageTag{"testdata/restricted/bin/bin1.meta_lic"}, - packageName{"testdata/restricted/bin/bin1.meta_lic"}, - spdxPkgID{"testdata/restricted/bin/bin1.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/restricted/container.zip.meta_lic ", "testdata/restricted/bin/bin1.meta_lic", "CONTAINS"}, - packageTag{"testdata/restricted/bin/bin2.meta_lic"}, - packageName{"testdata/restricted/bin/bin2.meta_lic"}, - spdxPkgID{"testdata/restricted/bin/bin2.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/restricted/container.zip.meta_lic ", "testdata/restricted/bin/bin2.meta_lic", "CONTAINS"}, - packageTag{"testdata/restricted/lib/liba.so.meta_lic"}, - packageName{"testdata/restricted/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/restricted/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-restricted-RESTRICTED_LICENSE"}, - spdxRelationship{"Package-testdata/restricted/container.zip.meta_lic ", "testdata/restricted/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/restricted/lib/libb.so.meta_lic"}, - packageName{"testdata/restricted/lib/libb.so.meta_lic"}, - spdxPkgID{"testdata/restricted/lib/libb.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-restricted-RESTRICTED_LICENSE"}, - spdxRelationship{"Package-testdata/restricted/container.zip.meta_lic ", "testdata/restricted/lib/libb.so.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/restricted/bin/bin1.meta_lic ", "testdata/restricted/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/restricted/lib/libc.a.meta_lic"}, - packageName{"testdata/restricted/lib/libc.a.meta_lic"}, - spdxPkgID{"testdata/restricted/lib/libc.a.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxRelationship{"Package-testdata/restricted/bin/bin1.meta_lic ", "testdata/restricted/lib/libc.a.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/restricted/lib/libb.so.meta_lic ", "testdata/restricted/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - packageTag{"testdata/restricted/lib/libd.so.meta_lic"}, - packageName{"testdata/restricted/lib/libd.so.meta_lic"}, - spdxPkgID{"testdata/restricted/lib/libd.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata/restricted/lib/libd.so.meta_lic ", "testdata/restricted/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-notice-NOTICE_LICENSE"}, - spdxExtractedText{"%%%Notice License%%%"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxExtractedText{"$$$Reciprocal License$$$"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-restricted-RESTRICTED_LICENSE"}, - spdxExtractedText{"###Restricted License###"}, - spdxExtractedClosingText{}, + condition: "restricted", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-restricted-container.zip.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-container.zip.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-restricted-bin-bin1.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-bin-bin1.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-restricted-bin-bin2.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-bin-bin2.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-restricted-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-restricted-RESTRICTED_LICENSE", + }, + { + PackageName: "testdata-restricted-lib-libb.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-lib-libb.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-restricted-RESTRICTED_LICENSE", + }, + { + PackageName: "testdata-restricted-lib-libc.a.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-lib-libc.a.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-reciprocal-RECIPROCAL_LICENSE", + }, + { + PackageName: "testdata-restricted-lib-libd.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-lib-libd.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-restricted-container.zip.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-bin-bin1.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-bin-bin2.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-lib-libb.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-lib-libc.a.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-lib-libb.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-lib-libd.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-notice-NOTICE_LICENSE", + ExtractedText: "%%%Notice License%%%\n", + LicenseName: "testdata-notice-NOTICE_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-reciprocal-RECIPROCAL_LICENSE", + ExtractedText: "$$$Reciprocal License$$$\n", + LicenseName: "testdata-reciprocal-RECIPROCAL_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-restricted-RESTRICTED_LICENSE", + ExtractedText: "###Restricted License###\n", + LicenseName: "testdata-restricted-RESTRICTED_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -1075,42 +1531,66 @@ func Test(t *testing.T) { condition: "restricted", name: "binary", roots: []string{"bin/bin1.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/restricted/bin/bin1.meta_lic"}, - packageName{"testdata/restricted/bin/bin1.meta_lic"}, - spdxPkgID{"testdata/restricted/bin/bin1.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/restricted/bin/bin1.meta_lic", "DESCRIBES"}, - packageTag{"testdata/restricted/lib/liba.so.meta_lic"}, - packageName{"testdata/restricted/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/restricted/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-restricted-RESTRICTED_LICENSE"}, - spdxRelationship{"Package-testdata/restricted/bin/bin1.meta_lic ", "testdata/restricted/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/restricted/lib/libc.a.meta_lic"}, - packageName{"testdata/restricted/lib/libc.a.meta_lic"}, - spdxPkgID{"testdata/restricted/lib/libc.a.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxRelationship{"Package-testdata/restricted/bin/bin1.meta_lic ", "testdata/restricted/lib/libc.a.meta_lic", "CONTAINS"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-reciprocal-RECIPROCAL_LICENSE"}, - spdxExtractedText{"$$$Reciprocal License$$$"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-restricted-RESTRICTED_LICENSE"}, - spdxExtractedText{"###Restricted License###"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-restricted-bin-bin1.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-bin-bin1.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-restricted-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-restricted-RESTRICTED_LICENSE", + }, + { + PackageName: "testdata-restricted-lib-libc.a.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-lib-libc.a.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-reciprocal-RECIPROCAL_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-restricted-bin-bin1.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-restricted-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-restricted-lib-libc.a.meta_lic"), + Relationship: "CONTAINS", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-reciprocal-RECIPROCAL_LICENSE", + ExtractedText: "$$$Reciprocal License$$$\n", + LicenseName: "testdata-reciprocal-RECIPROCAL_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-restricted-RESTRICTED_LICENSE", + ExtractedText: "###Restricted License###\n", + LicenseName: "testdata-restricted-RESTRICTED_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -1125,24 +1605,32 @@ func Test(t *testing.T) { condition: "restricted", name: "library", roots: []string{"lib/libd.so.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/restricted/lib/libd.so.meta_lic"}, - packageName{"testdata/restricted/lib/libd.so.meta_lic"}, - spdxPkgID{"testdata/restricted/lib/libd.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/restricted/lib/libd.so.meta_lic", "DESCRIBES"}, - spdxLicense{}, - spdxLicenseID{"testdata-notice-NOTICE_LICENSE"}, - spdxExtractedText{"%%%Notice License%%%"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-restricted-lib-libd.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-restricted-lib-libd.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-restricted-lib-libd.so.meta_lic"), + Relationship: "DESCRIBES", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-notice-NOTICE_LICENSE", + ExtractedText: "%%%Notice License%%%\n", + LicenseName: "testdata-notice-NOTICE_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/notice/NOTICE_LICENSE", @@ -1153,71 +1641,129 @@ func Test(t *testing.T) { condition: "proprietary", name: "apex", roots: []string{"highest.apex.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/proprietary/highest.apex.meta_lic"}, - packageName{"testdata/proprietary/highest.apex.meta_lic"}, - spdxPkgID{"testdata/proprietary/highest.apex.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/proprietary/highest.apex.meta_lic", "DESCRIBES"}, - packageTag{"testdata/proprietary/bin/bin1.meta_lic"}, - packageName{"testdata/proprietary/bin/bin1.meta_lic"}, - spdxPkgID{"testdata/proprietary/bin/bin1.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/proprietary/highest.apex.meta_lic ", "testdata/proprietary/bin/bin1.meta_lic", "CONTAINS"}, - packageTag{"testdata/proprietary/bin/bin2.meta_lic"}, - packageName{"testdata/proprietary/bin/bin2.meta_lic"}, - spdxPkgID{"testdata/proprietary/bin/bin2.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-proprietary-PROPRIETARY_LICENSE"}, - spdxRelationship{"Package-testdata/proprietary/highest.apex.meta_lic ", "testdata/proprietary/bin/bin2.meta_lic", "CONTAINS"}, - packageTag{"testdata/proprietary/lib/liba.so.meta_lic"}, - packageName{"testdata/proprietary/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/proprietary/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-proprietary-PROPRIETARY_LICENSE"}, - spdxRelationship{"Package-testdata/proprietary/highest.apex.meta_lic ", "testdata/proprietary/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/proprietary/lib/libb.so.meta_lic"}, - packageName{"testdata/proprietary/lib/libb.so.meta_lic"}, - spdxPkgID{"testdata/proprietary/lib/libb.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-restricted-RESTRICTED_LICENSE"}, - spdxRelationship{"Package-testdata/proprietary/highest.apex.meta_lic ", "testdata/proprietary/lib/libb.so.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/proprietary/bin/bin1.meta_lic ", "testdata/proprietary/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/proprietary/lib/libc.a.meta_lic"}, - packageName{"testdata/proprietary/lib/libc.a.meta_lic"}, - spdxPkgID{"testdata/proprietary/lib/libc.a.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-proprietary-PROPRIETARY_LICENSE"}, - spdxRelationship{"Package-testdata/proprietary/bin/bin1.meta_lic ", "testdata/proprietary/lib/libc.a.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata-proprietary-lib-libb.so.meta_lic ", "testdata/proprietary/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - packageTag{"testdata/proprietary/lib/libd.so.meta_lic"}, - packageName{"testdata/proprietary/lib/libd.so.meta_lic"}, - spdxPkgID{"testdata/proprietary/lib/libd.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata-proprietary-lib-libd.so.meta_lic ", "testdata/proprietary/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-notice-NOTICE_LICENSE"}, - spdxExtractedText{"%%%Notice License%%%"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-proprietary-PROPRIETARY_LICENSE"}, - spdxExtractedText{"@@@Proprietary License@@@"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-restricted-RESTRICTED_LICENSE"}, - spdxExtractedText{"###Restricted License###"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-proprietary-highest.apex.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-highest.apex.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-proprietary-bin-bin1.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-bin-bin1.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-proprietary-bin-bin2.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-bin-bin2.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-proprietary-PROPRIETARY_LICENSE", + }, + { + PackageName: "testdata-proprietary-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-proprietary-PROPRIETARY_LICENSE", + }, + { + PackageName: "testdata-proprietary-lib-libb.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-lib-libb.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-restricted-RESTRICTED_LICENSE", + }, + { + PackageName: "testdata-proprietary-lib-libc.a.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-lib-libc.a.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-proprietary-PROPRIETARY_LICENSE", + }, + { + PackageName: "testdata-proprietary-lib-libd.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-lib-libd.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-proprietary-highest.apex.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-bin-bin1.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-bin-bin2.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-highest.apex.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-lib-libb.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-lib-libc.a.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-lib-libb.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-lib-libd.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-notice-NOTICE_LICENSE", + ExtractedText: "%%%Notice License%%%\n", + LicenseName: "testdata-notice-NOTICE_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-proprietary-PROPRIETARY_LICENSE", + ExtractedText: "@@@Proprietary License@@@\n", + LicenseName: "testdata-proprietary-PROPRIETARY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-restricted-RESTRICTED_LICENSE", + ExtractedText: "###Restricted License###\n", + LicenseName: "testdata-restricted-RESTRICTED_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -1237,71 +1783,129 @@ func Test(t *testing.T) { condition: "proprietary", name: "container", roots: []string{"container.zip.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/proprietary/container.zip.meta_lic"}, - packageName{"testdata/proprietary/container.zip.meta_lic"}, - spdxPkgID{"testdata/proprietary/container.zip.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/proprietary/container.zip.meta_lic", "DESCRIBES"}, - packageTag{"testdata/proprietary/bin/bin1.meta_lic"}, - packageName{"testdata/proprietary/bin/bin1.meta_lic"}, - spdxPkgID{"testdata/proprietary/bin/bin1.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"Package-testdata/proprietary/container.zip.meta_lic ", "testdata/proprietary/bin/bin1.meta_lic", "CONTAINS"}, - packageTag{"testdata/proprietary/bin/bin2.meta_lic"}, - packageName{"testdata/proprietary/bin/bin2.meta_lic"}, - spdxPkgID{"testdata/proprietary/bin/bin2.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-proprietary-PROPRIETARY_LICENSE"}, - spdxRelationship{"Package-testdata/proprietary/container.zip.meta_lic ", "testdata/proprietary/bin/bin2.meta_lic", "CONTAINS"}, - packageTag{"testdata/proprietary/lib/liba.so.meta_lic"}, - packageName{"testdata/proprietary/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/proprietary/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-proprietary-PROPRIETARY_LICENSE"}, - spdxRelationship{"Package-testdata/proprietary/container.zip.meta_lic ", "testdata/proprietary/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/proprietary/lib/libb.so.meta_lic"}, - packageName{"testdata/proprietary/lib/libb.so.meta_lic"}, - spdxPkgID{"testdata/proprietary/lib/libb.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-restricted-RESTRICTED_LICENSE"}, - spdxRelationship{"Package-testdata/proprietary/container.zip.meta_lic ", "testdata/proprietary/lib/libb.so.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata/proprietary/bin/bin1.meta_lic ", "testdata/proprietary/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/proprietary/lib/libc.a.meta_lic"}, - packageName{"testdata/proprietary/lib/libc.a.meta_lic"}, - spdxPkgID{"testdata/proprietary/lib/libc.a.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-proprietary-PROPRIETARY_LICENSE"}, - spdxRelationship{"Package-testdata/proprietary/bin/bin1.meta_lic ", "testdata/proprietary/lib/libc.a.meta_lic", "CONTAINS"}, - spdxRelationship{"Package-testdata-proprietary-lib-libb.so.meta_lic ", "testdata/proprietary/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - packageTag{"testdata/proprietary/lib/libd.so.meta_lic"}, - packageName{"testdata/proprietary/lib/libd.so.meta_lic"}, - spdxPkgID{"testdata/proprietary/lib/libd.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"Package-testdata-proprietary-lib-libd.so.meta_lic ", "testdata/proprietary/bin/bin2.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-notice-NOTICE_LICENSE"}, - spdxExtractedText{"%%%Notice License%%%"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-proprietary-PROPRIETARY_LICENSE"}, - spdxExtractedText{"@@@Proprietary License@@@"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-restricted-RESTRICTED_LICENSE"}, - spdxExtractedText{"###Restricted License###"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-proprietary-container.zip.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-container.zip.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-proprietary-bin-bin1.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-bin-bin1.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-proprietary-bin-bin2.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-bin-bin2.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-proprietary-PROPRIETARY_LICENSE", + }, + { + PackageName: "testdata-proprietary-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-proprietary-PROPRIETARY_LICENSE", + }, + { + PackageName: "testdata-proprietary-lib-libb.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-lib-libb.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-restricted-RESTRICTED_LICENSE", + }, + { + PackageName: "testdata-proprietary-lib-libc.a.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-lib-libc.a.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-proprietary-PROPRIETARY_LICENSE", + }, + { + PackageName: "testdata-proprietary-lib-libd.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-lib-libd.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-proprietary-container.zip.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-bin-bin1.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-bin-bin2.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-container.zip.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-lib-libb.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-lib-libc.a.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-lib-libb.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-lib-libd.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-bin-bin2.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-notice-NOTICE_LICENSE", + ExtractedText: "%%%Notice License%%%\n", + LicenseName: "testdata-notice-NOTICE_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-proprietary-PROPRIETARY_LICENSE", + ExtractedText: "@@@Proprietary License@@@\n", + LicenseName: "testdata-proprietary-PROPRIETARY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-restricted-RESTRICTED_LICENSE", + ExtractedText: "###Restricted License###\n", + LicenseName: "testdata-restricted-RESTRICTED_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -1321,48 +1925,78 @@ func Test(t *testing.T) { condition: "proprietary", name: "application", roots: []string{"application.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/proprietary/application.meta_lic"}, - packageName{"testdata/proprietary/application.meta_lic"}, - spdxPkgID{"testdata/proprietary/application.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/proprietary/application.meta_lic", "DESCRIBES"}, - packageTag{"testdata/proprietary/bin/bin3.meta_lic"}, - packageName{"testdata/proprietary/bin/bin3.meta_lic"}, - spdxPkgID{"testdata/proprietary/bin/bin3.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-restricted-RESTRICTED_LICENSE"}, - spdxRelationship{"Package-testdata/proprietary/bin/bin3.meta_lic ", "testdata/proprietary/application.meta_lic", "BUILD_TOOL_OF"}, - packageTag{"testdata/proprietary/lib/liba.so.meta_lic"}, - packageName{"testdata/proprietary/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/proprietary/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-proprietary-PROPRIETARY_LICENSE"}, - spdxRelationship{"Package-testdata/proprietary/application.meta_lic ", "testdata/proprietary/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/proprietary/lib/libb.so.meta_lic"}, - packageName{"testdata/proprietary/lib/libb.so.meta_lic"}, - spdxPkgID{"testdata/proprietary/lib/libb.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-restricted-RESTRICTED_LICENSE"}, - spdxRelationship{"Package-testdata/proprietary/lib/libb.so.meta_lic ", "testdata/proprietary/application.meta_lic", "RUNTIME_DEPENDENCY_OF"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-proprietary-PROPRIETARY_LICENSE"}, - spdxExtractedText{"@@@Proprietary License@@@"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-restricted-RESTRICTED_LICENSE"}, - spdxExtractedText{"###Restricted License###"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-proprietary-application.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-application.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-proprietary-bin-bin3.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-bin-bin3.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-restricted-RESTRICTED_LICENSE", + }, + { + PackageName: "testdata-proprietary-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-proprietary-PROPRIETARY_LICENSE", + }, + { + PackageName: "testdata-proprietary-lib-libb.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-lib-libb.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-restricted-RESTRICTED_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-proprietary-application.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-bin-bin3.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-application.meta_lic"), + Relationship: "BUILD_TOOL_OF", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-application.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-lib-libb.so.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-application.meta_lic"), + Relationship: "RUNTIME_DEPENDENCY_OF", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-proprietary-PROPRIETARY_LICENSE", + ExtractedText: "@@@Proprietary License@@@\n", + LicenseName: "testdata-proprietary-PROPRIETARY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-restricted-RESTRICTED_LICENSE", + ExtractedText: "###Restricted License###\n", + LicenseName: "testdata-restricted-RESTRICTED_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -1378,39 +2012,61 @@ func Test(t *testing.T) { condition: "proprietary", name: "binary", roots: []string{"bin/bin1.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/proprietary/bin/bin1.meta_lic"}, - packageName{"testdata/proprietary/bin/bin1.meta_lic"}, - spdxPkgID{"testdata/proprietary/bin/bin1.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/proprietary/bin/bin1.meta_lic", "DESCRIBES"}, - packageTag{"testdata/proprietary/lib/liba.so.meta_lic"}, - packageName{"testdata/proprietary/lib/liba.so.meta_lic"}, - spdxPkgID{"testdata/proprietary/lib/liba.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-proprietary-PROPRIETARY_LICENSE"}, - spdxRelationship{"Package-testdata/proprietary/bin/bin1.meta_lic ", "testdata/proprietary/lib/liba.so.meta_lic", "CONTAINS"}, - packageTag{"testdata/proprietary/lib/libc.a.meta_lic"}, - packageName{"testdata/proprietary/lib/libc.a.meta_lic"}, - spdxPkgID{"testdata/proprietary/lib/libc.a.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-proprietary-PROPRIETARY_LICENSE"}, - spdxRelationship{"Package-testdata/proprietary/bin/bin1.meta_lic ", "testdata/proprietary/lib/libc.a.meta_lic", "CONTAINS"}, - spdxLicense{}, - spdxLicenseID{"testdata-firstparty-FIRST_PARTY_LICENSE"}, - spdxExtractedText{"&&&First Party License&&&"}, - spdxExtractedClosingText{}, - spdxLicenseID{"testdata-proprietary-PROPRIETARY_LICENSE"}, - spdxExtractedText{"@@@Proprietary License@@@"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-proprietary-bin-bin1.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-bin-bin1.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + PackageName: "testdata-proprietary-lib-liba.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-lib-liba.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-proprietary-PROPRIETARY_LICENSE", + }, + { + PackageName: "testdata-proprietary-lib-libc.a.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-lib-libc.a.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-proprietary-PROPRIETARY_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-proprietary-bin-bin1.meta_lic"), + Relationship: "DESCRIBES", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-lib-liba.so.meta_lic"), + Relationship: "CONTAINS", + }, + { + RefA: common.MakeDocElementID("", "testdata-proprietary-bin-bin1.meta_lic"), + RefB: common.MakeDocElementID("", "testdata-proprietary-lib-libc.a.meta_lic"), + Relationship: "CONTAINS", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-firstparty-FIRST_PARTY_LICENSE", + ExtractedText: "&&&First Party License&&&\n", + LicenseName: "testdata-firstparty-FIRST_PARTY_LICENSE", + }, + { + LicenseIdentifier: "LicenseRef-testdata-proprietary-PROPRIETARY_LICENSE", + ExtractedText: "@@@Proprietary License@@@\n", + LicenseName: "testdata-proprietary-PROPRIETARY_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/firstparty/FIRST_PARTY_LICENSE", @@ -1424,24 +2080,32 @@ func Test(t *testing.T) { condition: "proprietary", name: "library", roots: []string{"lib/libd.so.meta_lic"}, - expectedOut: []matcher{ - spdxVersion{}, - spdxDataLicense{}, - spdxDocumentName{"Android"}, - spdxID{}, - spdxDocumentNameSpace{}, - spdxCreatorOrganization{}, - spdxCreatedTime{}, - packageTag{"testdata/proprietary/lib/libd.so.meta_lic"}, - packageName{"testdata/proprietary/lib/libd.so.meta_lic"}, - spdxPkgID{"testdata/proprietary/lib/libd.so.meta_lic"}, - spdxPkgDownloadLocation{"NOASSERTION"}, - spdxPkgLicenseDeclared{"testdata-notice-NOTICE_LICENSE"}, - spdxRelationship{"DOCUMENT ", "testdata/proprietary/lib/libd.so.meta_lic", "DESCRIBES"}, - spdxLicense{}, - spdxLicenseID{"testdata-notice-NOTICE_LICENSE"}, - spdxExtractedText{"%%%Notice License%%%"}, - spdxExtractedClosingText{}, + expectedOut: &spdx.Document{ + SPDXIdentifier: "DOCUMENT", + CreationInfo: getCreationInfo(t), + Packages: []*spdx.Package{ + { + PackageName: "testdata-proprietary-lib-libd.so.meta_lic", + PackageVersion: "NOASSERTION", + PackageDownloadLocation: "NOASSERTION", + PackageSPDXIdentifier: common.ElementID("testdata-proprietary-lib-libd.so.meta_lic"), + PackageLicenseConcluded: "LicenseRef-testdata-notice-NOTICE_LICENSE", + }, + }, + Relationships: []*spdx.Relationship{ + { + RefA: common.MakeDocElementID("", "DOCUMENT"), + RefB: common.MakeDocElementID("", "testdata-proprietary-lib-libd.so.meta_lic"), + Relationship: "DESCRIBES", + }, + }, + OtherLicenses: []*spdx.OtherLicense{ + { + LicenseIdentifier: "LicenseRef-testdata-notice-NOTICE_LICENSE", + ExtractedText: "%%%Notice License%%%\n", + LicenseName: "testdata-notice-NOTICE_LICENSE", + }, + }, }, expectedDeps: []string{ "testdata/notice/NOTICE_LICENSE", @@ -1461,7 +2125,7 @@ func Test(t *testing.T) { ctx := context{stdout, stderr, compliance.GetFS(tt.outDir), "Android", []string{tt.stripPrefix}, fakeTime} - deps, err := sbomGenerator(&ctx, rootFiles...) + spdxDoc, deps, err := sbomGenerator(&ctx, rootFiles...) if err != nil { t.Fatalf("sbom: error = %v, stderr = %v", err, stderr) return @@ -1470,28 +2134,26 @@ func Test(t *testing.T) { t.Errorf("sbom: gotStderr = %v, want none", stderr) } - t.Logf("got stdout: %s", stdout.String()) - - t.Logf("want stdout: %s", matcherList(tt.expectedOut).String()) - - out := bufio.NewScanner(stdout) - lineno := 0 - for out.Scan() { - line := out.Text() - if strings.TrimLeft(line, " ") == "" { - continue - } - if len(tt.expectedOut) <= lineno { - t.Errorf("sbom: unexpected output at line %d: got %q, want nothing (wanted %d lines)", lineno+1, line, len(tt.expectedOut)) - } else if !tt.expectedOut[lineno].isMatch(line) { - t.Errorf("sbom: unexpected output at line %d: got %q, want %q", lineno+1, line, tt.expectedOut[lineno]) - } - lineno++ - } - for ; lineno < len(tt.expectedOut); lineno++ { - t.Errorf("bom: missing output line %d: ended early, want %q", lineno+1, tt.expectedOut[lineno]) + gotData, err := json.Marshal(spdxDoc) + if err != nil { + t.Fatalf("sbom: failed to marshal spdx doc: %v", err) + return } + t.Logf("Got SPDX Doc: %s", string(gotData)) + + expectedData, err := json.Marshal(tt.expectedOut) + if err != nil { + t.Fatalf("sbom: failed to marshal spdx doc: %v", err) + return + } + + t.Logf("Want SPDX Doc: %s", string(expectedData)) + + // compare the spdx Docs + compareSpdxDocs(t, spdxDoc, tt.expectedOut) + + // compare deps t.Logf("got deps: %q", deps) t.Logf("want deps: %q", tt.expectedDeps) @@ -1504,242 +2166,154 @@ func Test(t *testing.T) { } } -type matcher interface { - isMatch(line string) bool - String() string +func getCreationInfo(t *testing.T) *spdx.CreationInfo { + ci, err := builder2v2.BuildCreationInfoSection2_2("Organization", "Google LLC", nil) + if err != nil { + t.Errorf("Unable to get creation info: %v", err) + return nil + } + return ci } -type packageTag struct { - name string +// compareSpdxDocs deep-compares two spdx docs by going through the info section, packages, relationships and licenses +func compareSpdxDocs(t *testing.T, actual, expected *spdx.Document) { + + if actual == nil || expected == nil { + t.Errorf("SBOM: SPDX Doc is nil! Got %v: Expected %v", actual, expected) + } + // compare creation info + compareSpdxCreationInfo(t, actual.CreationInfo, expected.CreationInfo) + + // compare packages + if len(actual.Packages) != len(expected.Packages) { + t.Errorf("SBOM: Number of Packages is different! Got %d: Expected %d", len(actual.Packages), len(expected.Packages)) + } + + for i, pkg := range actual.Packages { + if !compareSpdxPackages(t, i, pkg, expected.Packages[i]) { + break + } + } + + // compare licenses + if len(actual.OtherLicenses) != len(expected.OtherLicenses) { + t.Errorf("SBOM: Number of Licenses in actual is different! Got %d: Expected %d", len(actual.OtherLicenses), len(expected.OtherLicenses)) + } + for i, license := range actual.OtherLicenses { + if !compareLicenses(t, i, license, expected.OtherLicenses[i]) { + break + } + } + + //compare Relationships + if len(actual.Relationships) != len(expected.Relationships) { + t.Errorf("SBOM: Number of Licenses in actual is different! Got %d: Expected %d", len(actual.Relationships), len(expected.Relationships)) + } + for i, rl := range actual.Relationships { + if !compareRelationShips(t, i, rl, expected.Relationships[i]) { + break + } + } } -func (m packageTag) isMatch(line string) bool { - groups := spdxPackageTag.FindStringSubmatch(line) - if len(groups) != 2 { +func compareSpdxCreationInfo(t *testing.T, actual, expected *spdx.CreationInfo) { + if actual == nil || expected == nil { + t.Errorf("SBOM: Creation info is nil! Got %q: Expected %q", actual, expected) + } + + if actual.LicenseListVersion != expected.LicenseListVersion { + t.Errorf("SBOM: Creation info license version Error! Got %s: Expected %s", actual.LicenseListVersion, expected.LicenseListVersion) + } + + if len(actual.Creators) != len(expected.Creators) { + t.Errorf("SBOM: Creation info creators Error! Got %d: Expected %d", len(actual.Creators), len(expected.Creators)) + } + + for i, info := range actual.Creators { + if info != expected.Creators[i] { + t.Errorf("SBOM: Creation info creators Error! Got %q: Expected %q", info, expected.Creators[i]) + } + } +} + +func compareSpdxPackages(t *testing.T, i int, actual, expected *spdx.Package) bool { + if actual == nil || expected == nil { + t.Errorf("SBOM: Packages are nil at index %d! Got %v: Expected %v", i, actual, expected) return false } - return groups[1] == m.name -} - -func (m packageTag) String() string { - return "##### Package: " + m.name -} - -type packageName struct { - name string -} - -func (m packageName) isMatch(line string) bool { - groups := spdxPackageNameTag.FindStringSubmatch(line) - if len(groups) != 2 { + if actual.PackageName != expected.PackageName { + t.Errorf("SBOM: Package name Error at index %d! Got %s: Expected %s", i, actual.PackageName, expected.PackageName) return false } - return groups[1] == replaceSlashes(m.name) -} -func (m packageName) String() string { - return "PackageName: " + replaceSlashes(m.name) -} - -type spdxID struct {} - -func (m spdxID) isMatch(line string) bool { - return spdxIDTag.MatchString(line) -} - -func (m spdxID) String() string { - return "SPDXID: SPDXRef-DOCUMENT" -} - -type spdxPkgID struct { - name string -} - -func (m spdxPkgID) isMatch(line string) bool { - groups := spdxPkgIDTag.FindStringSubmatch(line) - if len(groups) != 2 { + if actual.PackageVersion != expected.PackageVersion { + t.Errorf("SBOM: Package version Error at index %d! Got %s: Expected %s", i, actual.PackageVersion, expected.PackageVersion) return false } - return groups[1] == replaceSlashes(m.name) + + if actual.PackageSPDXIdentifier != expected.PackageSPDXIdentifier { + t.Errorf("SBOM: Package identifier Error at index %d! Got %s: Expected %s", i, actual.PackageSPDXIdentifier, expected.PackageSPDXIdentifier) + return false + } + + if actual.PackageDownloadLocation != expected.PackageDownloadLocation { + t.Errorf("SBOM: Package download location Error at index %d! Got %s: Expected %s", i, actual.PackageDownloadLocation, expected.PackageDownloadLocation) + return false + } + + if actual.PackageLicenseConcluded != expected.PackageLicenseConcluded { + t.Errorf("SBOM: Package license concluded Error at index %d! Got %s: Expected %s", i, actual.PackageLicenseConcluded, expected.PackageLicenseConcluded) + return false + } + return true } -func (m spdxPkgID) String() string { - return "SPDXID: SPDXRef-Package-" + replaceSlashes(m.name) +func compareRelationShips(t *testing.T, i int, actual, expected *spdx.Relationship) bool { + if actual == nil || expected == nil { + t.Errorf("SBOM: Relationships is nil at index %d! Got %v: Expected %v", i, actual, expected) + return false + } + + if actual.RefA != expected.RefA { + t.Errorf("SBOM: Relationship RefA Error at index %d! Got %s: Expected %s", i, actual.RefA, expected.RefA) + return false + } + + if actual.RefB != expected.RefB { + t.Errorf("SBOM: Relationship RefB Error at index %d! Got %s: Expected %s", i, actual.RefB, expected.RefB) + return false + } + + if actual.Relationship != expected.Relationship { + t.Errorf("SBOM: Relationship type Error at index %d! Got %s: Expected %s", i, actual.Relationship, expected.Relationship) + return false + } + return true } -type spdxVersion struct{} +func compareLicenses(t *testing.T, i int, actual, expected *spdx.OtherLicense) bool { + if actual == nil || expected == nil { + t.Errorf("SBOM: Licenses is nil at index %d! Got %v: Expected %v", i, actual, expected) + return false + } -func (m spdxVersion) isMatch(line string) bool { - return spdxVersionTag.MatchString(line) -} + if actual.LicenseName != expected.LicenseName { + t.Errorf("SBOM: License Name Error at index %d! Got %s: Expected %s", i, actual.LicenseName, expected.LicenseName) + return false + } -func (m spdxVersion) String() string { - return "SPDXVersion: SPDX-2.2" -} + if actual.LicenseIdentifier != expected.LicenseIdentifier { + t.Errorf("SBOM: License Identifier Error at index %d! Got %s: Expected %s", i, actual.LicenseIdentifier, expected.LicenseIdentifier) + return false + } -type spdxDataLicense struct{} - -func (m spdxDataLicense) isMatch(line string) bool { - return spdxDataLicenseTag.MatchString(line) -} - -func (m spdxDataLicense) String() string { - return "DataLicense: CC0-1.0" -} - -type spdxDocumentName struct { - name string -} - -func (m spdxDocumentName) isMatch(line string) bool { - return spdxDocumentNameTag.MatchString(line) -} - -func (m spdxDocumentName) String() string { - return "DocumentName: " + m.name -} - -type spdxDocumentNameSpace struct { - name string -} - -func (m spdxDocumentNameSpace) isMatch(line string) bool { - return spdxDocumentNameSpaceTag.MatchString(line) -} - -func (m spdxDocumentNameSpace) String() string { - return "DocumentNameSpace: Android" -} - -type spdxCreatorOrganization struct{} - -func (m spdxCreatorOrganization) isMatch(line string) bool { - return spdxCreatorOrganizationTag.MatchString(line) -} - -func (m spdxCreatorOrganization) String() string { - return "Creator: Organization: Google LLC" + if actual.ExtractedText != expected.ExtractedText { + t.Errorf("SBOM: License Extracted Text Error at index %d! Got: %q want: %q", i, actual.ExtractedText, expected.ExtractedText) + return false + } + return true } func fakeTime() time.Time { return time.UnixMicro(0).UTC() } - -type spdxCreatedTime struct{} - -func (m spdxCreatedTime) isMatch(line string) bool { - return spdxCreatedTimeTag.MatchString(line) -} - -func (m spdxCreatedTime) String() string { - return "Created: 1970-01-01T00:00:00Z" -} - -type spdxPkgDownloadLocation struct { - name string -} - -func (m spdxPkgDownloadLocation) isMatch(line string) bool { - return spdxPkgDownloadLocationTag.MatchString(line) -} - -func (m spdxPkgDownloadLocation) String() string { - return "PackageDownloadLocation: " + m.name -} - -type spdxPkgLicenseDeclared struct { - name string -} - -func (m spdxPkgLicenseDeclared) isMatch(line string) bool { - groups := spdxPkgLicenseDeclaredTag.FindStringSubmatch(line) - if len(groups) != 2 { - return false - } - return groups[1] == replaceSlashes(m.name) -} - -func (m spdxPkgLicenseDeclared) String() string { - return "PackageLicenseConcluded: LicenseRef-" + m.name -} - -type spdxRelationship struct { - pkg1 string - pkg2 string - relation string -} - -func (m spdxRelationship) isMatch(line string) bool { - groups := spdxRelationshipTag.FindStringSubmatch(line) - if len(groups) != 4 { - return false - } - return groups[1] == replaceSlashes(m.pkg1) && groups[2] == m.relation && groups[3] == replaceSlashes(m.pkg2) -} - -func (m spdxRelationship) String() string { - return "Relationship: SPDXRef-" + replaceSlashes(m.pkg1) + " " + m.relation + " SPDXRef-Package-" + replaceSlashes(m.pkg2) -} - -type spdxLicense struct{} - -func (m spdxLicense) isMatch(line string) bool { - return spdxLicenseTag.MatchString(line) -} - -func (m spdxLicense) String() string { - return "##### Non-standard license:" -} - -type spdxLicenseID struct { - name string -} - -func (m spdxLicenseID) isMatch(line string) bool { - groups := spdxLicenseIDTag.FindStringSubmatch(line) - if len(groups) != 2 { - return false - } - return groups[1] == replaceSlashes(m.name) -} - -func (m spdxLicenseID) String() string { - return "LicenseID: LicenseRef-" + m.name -} - -type spdxExtractedText struct { - name string -} - -func (m spdxExtractedText) isMatch(line string) bool { - groups := spdxExtractedTextTag.FindStringSubmatch(line) - if len(groups) != 2 { - return false - } - return groups[1] == replaceSlashes(m.name) -} - -func (m spdxExtractedText) String() string { - return "ExtractedText: " + m.name -} - -type spdxExtractedClosingText struct{} - -func (m spdxExtractedClosingText) isMatch(line string) bool { - return spdxExtractedClosingTextTag.MatchString(line) -} - -func (m spdxExtractedClosingText) String() string { - return "" -} - -type matcherList []matcher - -func (l matcherList) String() string { - var sb strings.Builder - for _, m := range l { - s := m.String() - fmt.Fprintf(&sb, "%s\n", s) - } - return sb.String() -}