diff --git a/tools/compliance/Android.bp b/tools/compliance/Android.bp index e56a471eb5..d671f45f97 100644 --- a/tools/compliance/Android.bp +++ b/tools/compliance/Android.bp @@ -17,6 +17,20 @@ package { default_applicable_licenses: ["Android-Apache-2.0"], } +blueprint_go_binary { + name: "dumpgraph", + srcs: ["cmd/dumpgraph.go"], + deps: ["compliance-module"], + testSrcs: ["cmd/dumpgraph_test.go"], +} + +blueprint_go_binary { + name: "dumpresolutions", + srcs: ["cmd/dumpresolutions.go"], + deps: ["compliance-module"], + testSrcs: ["cmd/dumpresolutions_test.go"], +} + bootstrap_go_package { name: "compliance-module", srcs: [ diff --git a/tools/compliance/cmd/dumpgraph.go b/tools/compliance/cmd/dumpgraph.go new file mode 100644 index 0000000000..1ee63b238c --- /dev/null +++ b/tools/compliance/cmd/dumpgraph.go @@ -0,0 +1,178 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "compliance" + "flag" + "fmt" + "io" + "os" + "path/filepath" + "sort" + "strings" +) + +var ( + graphViz = flag.Bool("dot", false, "Whether to output graphviz (i.e. dot) format.") + labelConditions = flag.Bool("label_conditions", false, "Whether to label target nodes with conditions.") + stripPrefix = flag.String("strip_prefix", "", "Prefix to remove from paths. i.e. path to root") + + failNoneRequested = fmt.Errorf("\nNo license metadata files requested") + failNoLicenses = fmt.Errorf("No licenses found") +) + +type context struct { + graphViz bool + labelConditions bool + stripPrefix string +} + +func init() { + flag.Usage = func() { + fmt.Fprintf(os.Stderr, `Usage: %s {options} file.meta_lic {file.meta_lic...} + +Outputs space-separated Target Dependency Annotations tuples for each +edge in the license graph. When -dot flag given, outputs the nodes and +edges in graphViz directed graph format. + +In plain text mode, multiple values within a field are colon-separated. +e.g. multiple annotations appear as annotation1:annotation2:annotation3 +or when -label_conditions is requested, Target and Dependency become +target:condition1:condition2 etc. + +Options: +`, filepath.Base(os.Args[0])) + flag.PrintDefaults() + } +} + +func main() { + flag.Parse() + + // Must specify at least one root target. + if flag.NArg() == 0 { + flag.Usage() + os.Exit(2) + } + + ctx := &context{*graphViz, *labelConditions, *stripPrefix} + + err := dumpGraph(ctx, os.Stdout, os.Stderr, flag.Args()...) + if err != nil { + if err == failNoneRequested { + flag.Usage() + } + fmt.Fprintf(os.Stderr, "%s\n", err.Error()) + os.Exit(1) + } + os.Exit(0) +} + +// dumpGraph implements the dumpgraph utility. +func dumpGraph(ctx *context, stdout, stderr io.Writer, files ...string) error { + if len(files) < 1 { + return failNoneRequested + } + + // Read the license graph from the license metadata files (*.meta_lic). + licenseGraph, err := compliance.ReadLicenseGraph(os.DirFS("."), stderr, files) + if err != nil { + return fmt.Errorf("Unable to read license metadata file(s) %q: %w\n", files, err) + } + if licenseGraph == nil { + return failNoLicenses + } + + // Sort the edges of the graph. + edges := licenseGraph.Edges() + sort.Sort(edges) + + // nodes maps license metadata file names to graphViz node names when ctx.graphViz is true. + var nodes map[string]string + n := 0 + + // targetOut calculates the string to output for `target` separating conditions as needed using `sep`. + targetOut := func(target *compliance.TargetNode, sep string) string { + tOut := strings.TrimPrefix(target.Name(), ctx.stripPrefix) + if ctx.labelConditions { + conditions := target.LicenseConditions().Names() + sort.Strings(conditions) + if len(conditions) > 0 { + tOut += sep + strings.Join(conditions, sep) + } + } + return tOut + } + + // makeNode maps `target` to a graphViz node name. + makeNode := func(target *compliance.TargetNode) { + tName := target.Name() + if _, ok := nodes[tName]; !ok { + nodeName := fmt.Sprintf("n%d", n) + nodes[tName] = nodeName + fmt.Fprintf(stdout, "\t%s [label=\"%s\"];\n", nodeName, targetOut(target, "\\n")) + n++ + } + } + + // If graphviz output, map targets to node names, and start the directed graph. + if ctx.graphViz { + nodes = make(map[string]string) + targets := licenseGraph.Targets() + sort.Sort(targets) + + fmt.Fprintf(stdout, "strict digraph {\n\trankdir=RL;\n") + for _, target := range targets { + makeNode(target) + } + } + + // Print the sorted edges to stdout ... + for _, e := range edges { + // sort the annotations for repeatability/stability + annotations := e.Annotations().AsList() + sort.Strings(annotations) + + tName := e.Target().Name() + dName := e.Dependency().Name() + + if ctx.graphViz { + // ... one edge per line labelled with \\n-separated annotations. + tNode := nodes[tName] + dNode := nodes[dName] + fmt.Fprintf(stdout, "\t%s -> %s [label=\"%s\"];\n", dNode, tNode, strings.Join(annotations, "\\n")) + } else { + // ... one edge per line with annotations in a colon-separated tuple. + fmt.Fprintf(stdout, "%s %s %s\n", targetOut(e.Target(), ":"), targetOut(e.Dependency(), ":"), strings.Join(annotations, ":")) + } + } + + // If graphViz output, rank the root nodes together, and complete the directed graph. + if ctx.graphViz { + fmt.Fprintf(stdout, "\t{rank=same;") + for _, f := range files { + fName := f + if !strings.HasSuffix(fName, ".meta_lic") { + fName += ".meta_lic" + } + if fNode, ok := nodes[fName]; ok { + fmt.Fprintf(stdout, " %s", fNode) + } + } + fmt.Fprintf(stdout, "}\n}\n") + } + return nil +} diff --git a/tools/compliance/cmd/dumpgraph_test.go b/tools/compliance/cmd/dumpgraph_test.go new file mode 100644 index 0000000000..b7d66f7940 --- /dev/null +++ b/tools/compliance/cmd/dumpgraph_test.go @@ -0,0 +1,1258 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "bytes" + "fmt" + "strings" + "testing" +) + +func Test_plaintext(t *testing.T) { + tests := []struct { + condition string + name string + roots []string + ctx context + expectedOut []string + }{ + { + condition: "firstparty", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []string{ + "testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/lib/liba.so.meta_lic static", + "testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/lib/libc.a.meta_lic static", + "testdata/firstparty/bin/bin2.meta_lic testdata/firstparty/lib/libb.so.meta_lic dynamic", + "testdata/firstparty/bin/bin2.meta_lic testdata/firstparty/lib/libd.so.meta_lic dynamic", + "testdata/firstparty/highest.apex.meta_lic testdata/firstparty/bin/bin1.meta_lic static", + "testdata/firstparty/highest.apex.meta_lic testdata/firstparty/bin/bin2.meta_lic static", + "testdata/firstparty/highest.apex.meta_lic testdata/firstparty/lib/liba.so.meta_lic static", + "testdata/firstparty/highest.apex.meta_lic testdata/firstparty/lib/libb.so.meta_lic static", + }, + }, + { + condition: "firstparty", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/firstparty/"}, + expectedOut: []string{ + "bin/bin1.meta_lic lib/liba.so.meta_lic static", + "bin/bin1.meta_lic lib/libc.a.meta_lic static", + "bin/bin2.meta_lic lib/libb.so.meta_lic dynamic", + "bin/bin2.meta_lic lib/libd.so.meta_lic dynamic", + "highest.apex.meta_lic bin/bin1.meta_lic static", + "highest.apex.meta_lic bin/bin2.meta_lic static", + "highest.apex.meta_lic lib/liba.so.meta_lic static", + "highest.apex.meta_lic lib/libb.so.meta_lic static", + }, + }, + { + condition: "firstparty", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/firstparty/", labelConditions: true}, + expectedOut: []string{ + "bin/bin1.meta_lic:notice lib/liba.so.meta_lic:notice static", + "bin/bin1.meta_lic:notice lib/libc.a.meta_lic:notice static", + "bin/bin2.meta_lic:notice lib/libb.so.meta_lic:notice dynamic", + "bin/bin2.meta_lic:notice lib/libd.so.meta_lic:notice dynamic", + "highest.apex.meta_lic:notice bin/bin1.meta_lic:notice static", + "highest.apex.meta_lic:notice bin/bin2.meta_lic:notice static", + "highest.apex.meta_lic:notice lib/liba.so.meta_lic:notice static", + "highest.apex.meta_lic:notice lib/libb.so.meta_lic:notice static", + }, + }, + { + condition: "firstparty", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []string{ + "testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/lib/liba.so.meta_lic static", + "testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/lib/libc.a.meta_lic static", + "testdata/firstparty/bin/bin2.meta_lic testdata/firstparty/lib/libb.so.meta_lic dynamic", + "testdata/firstparty/bin/bin2.meta_lic testdata/firstparty/lib/libd.so.meta_lic dynamic", + "testdata/firstparty/container.zip.meta_lic testdata/firstparty/bin/bin1.meta_lic static", + "testdata/firstparty/container.zip.meta_lic testdata/firstparty/bin/bin2.meta_lic static", + "testdata/firstparty/container.zip.meta_lic testdata/firstparty/lib/liba.so.meta_lic static", + "testdata/firstparty/container.zip.meta_lic testdata/firstparty/lib/libb.so.meta_lic static", + }, + }, + { + condition: "firstparty", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []string{ + "testdata/firstparty/application.meta_lic testdata/firstparty/bin/bin3.meta_lic toolchain", + "testdata/firstparty/application.meta_lic testdata/firstparty/lib/liba.so.meta_lic static", + "testdata/firstparty/application.meta_lic testdata/firstparty/lib/libb.so.meta_lic dynamic", + }, + }, + { + condition: "firstparty", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []string{ + "testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/lib/liba.so.meta_lic static", + "testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/lib/libc.a.meta_lic static", + }, + }, + { + condition: "firstparty", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []string{}, + }, + { + condition: "notice", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []string{ + "testdata/notice/bin/bin1.meta_lic testdata/notice/lib/liba.so.meta_lic static", + "testdata/notice/bin/bin1.meta_lic testdata/notice/lib/libc.a.meta_lic static", + "testdata/notice/bin/bin2.meta_lic testdata/notice/lib/libb.so.meta_lic dynamic", + "testdata/notice/bin/bin2.meta_lic testdata/notice/lib/libd.so.meta_lic dynamic", + "testdata/notice/highest.apex.meta_lic testdata/notice/bin/bin1.meta_lic static", + "testdata/notice/highest.apex.meta_lic testdata/notice/bin/bin2.meta_lic static", + "testdata/notice/highest.apex.meta_lic testdata/notice/lib/liba.so.meta_lic static", + "testdata/notice/highest.apex.meta_lic testdata/notice/lib/libb.so.meta_lic static", + }, + }, + { + condition: "notice", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/notice/"}, + expectedOut: []string{ + "bin/bin1.meta_lic lib/liba.so.meta_lic static", + "bin/bin1.meta_lic lib/libc.a.meta_lic static", + "bin/bin2.meta_lic lib/libb.so.meta_lic dynamic", + "bin/bin2.meta_lic lib/libd.so.meta_lic dynamic", + "highest.apex.meta_lic bin/bin1.meta_lic static", + "highest.apex.meta_lic bin/bin2.meta_lic static", + "highest.apex.meta_lic lib/liba.so.meta_lic static", + "highest.apex.meta_lic lib/libb.so.meta_lic static", + }, + }, + { + condition: "notice", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/notice/", labelConditions: true}, + expectedOut: []string{ + "bin/bin1.meta_lic:notice lib/liba.so.meta_lic:notice static", + "bin/bin1.meta_lic:notice lib/libc.a.meta_lic:notice static", + "bin/bin2.meta_lic:notice lib/libb.so.meta_lic:notice dynamic", + "bin/bin2.meta_lic:notice lib/libd.so.meta_lic:notice dynamic", + "highest.apex.meta_lic:notice bin/bin1.meta_lic:notice static", + "highest.apex.meta_lic:notice bin/bin2.meta_lic:notice static", + "highest.apex.meta_lic:notice lib/liba.so.meta_lic:notice static", + "highest.apex.meta_lic:notice lib/libb.so.meta_lic:notice static", + }, + }, + { + condition: "notice", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []string{ + "testdata/notice/bin/bin1.meta_lic testdata/notice/lib/liba.so.meta_lic static", + "testdata/notice/bin/bin1.meta_lic testdata/notice/lib/libc.a.meta_lic static", + "testdata/notice/bin/bin2.meta_lic testdata/notice/lib/libb.so.meta_lic dynamic", + "testdata/notice/bin/bin2.meta_lic testdata/notice/lib/libd.so.meta_lic dynamic", + "testdata/notice/container.zip.meta_lic testdata/notice/bin/bin1.meta_lic static", + "testdata/notice/container.zip.meta_lic testdata/notice/bin/bin2.meta_lic static", + "testdata/notice/container.zip.meta_lic testdata/notice/lib/liba.so.meta_lic static", + "testdata/notice/container.zip.meta_lic testdata/notice/lib/libb.so.meta_lic static", + }, + }, + { + condition: "notice", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []string{ + "testdata/notice/application.meta_lic testdata/notice/bin/bin3.meta_lic toolchain", + "testdata/notice/application.meta_lic testdata/notice/lib/liba.so.meta_lic static", + "testdata/notice/application.meta_lic testdata/notice/lib/libb.so.meta_lic dynamic", + }, + }, + { + condition: "notice", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []string{ + "testdata/notice/bin/bin1.meta_lic testdata/notice/lib/liba.so.meta_lic static", + "testdata/notice/bin/bin1.meta_lic testdata/notice/lib/libc.a.meta_lic static", + }, + }, + { + condition: "notice", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []string{}, + }, + { + condition: "reciprocal", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []string{ + "testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/lib/liba.so.meta_lic static", + "testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/lib/libc.a.meta_lic static", + "testdata/reciprocal/bin/bin2.meta_lic testdata/reciprocal/lib/libb.so.meta_lic dynamic", + "testdata/reciprocal/bin/bin2.meta_lic testdata/reciprocal/lib/libd.so.meta_lic dynamic", + "testdata/reciprocal/highest.apex.meta_lic testdata/reciprocal/bin/bin1.meta_lic static", + "testdata/reciprocal/highest.apex.meta_lic testdata/reciprocal/bin/bin2.meta_lic static", + "testdata/reciprocal/highest.apex.meta_lic testdata/reciprocal/lib/liba.so.meta_lic static", + "testdata/reciprocal/highest.apex.meta_lic testdata/reciprocal/lib/libb.so.meta_lic static", + }, + }, + { + condition: "reciprocal", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/reciprocal/"}, + expectedOut: []string{ + "bin/bin1.meta_lic lib/liba.so.meta_lic static", + "bin/bin1.meta_lic lib/libc.a.meta_lic static", + "bin/bin2.meta_lic lib/libb.so.meta_lic dynamic", + "bin/bin2.meta_lic lib/libd.so.meta_lic dynamic", + "highest.apex.meta_lic bin/bin1.meta_lic static", + "highest.apex.meta_lic bin/bin2.meta_lic static", + "highest.apex.meta_lic lib/liba.so.meta_lic static", + "highest.apex.meta_lic lib/libb.so.meta_lic static", + }, + }, + { + condition: "reciprocal", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/reciprocal/", labelConditions: true}, + expectedOut: []string{ + "bin/bin1.meta_lic:notice lib/liba.so.meta_lic:reciprocal static", + "bin/bin1.meta_lic:notice lib/libc.a.meta_lic:reciprocal static", + "bin/bin2.meta_lic:notice lib/libb.so.meta_lic:notice dynamic", + "bin/bin2.meta_lic:notice lib/libd.so.meta_lic:notice dynamic", + "highest.apex.meta_lic:notice bin/bin1.meta_lic:notice static", + "highest.apex.meta_lic:notice bin/bin2.meta_lic:notice static", + "highest.apex.meta_lic:notice lib/liba.so.meta_lic:reciprocal static", + "highest.apex.meta_lic:notice lib/libb.so.meta_lic:notice static", + }, + }, + { + condition: "reciprocal", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []string{ + "testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/lib/liba.so.meta_lic static", + "testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/lib/libc.a.meta_lic static", + "testdata/reciprocal/bin/bin2.meta_lic testdata/reciprocal/lib/libb.so.meta_lic dynamic", + "testdata/reciprocal/bin/bin2.meta_lic testdata/reciprocal/lib/libd.so.meta_lic dynamic", + "testdata/reciprocal/container.zip.meta_lic testdata/reciprocal/bin/bin1.meta_lic static", + "testdata/reciprocal/container.zip.meta_lic testdata/reciprocal/bin/bin2.meta_lic static", + "testdata/reciprocal/container.zip.meta_lic testdata/reciprocal/lib/liba.so.meta_lic static", + "testdata/reciprocal/container.zip.meta_lic testdata/reciprocal/lib/libb.so.meta_lic static", + }, + }, + { + condition: "reciprocal", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []string{ + "testdata/reciprocal/application.meta_lic testdata/reciprocal/bin/bin3.meta_lic toolchain", + "testdata/reciprocal/application.meta_lic testdata/reciprocal/lib/liba.so.meta_lic static", + "testdata/reciprocal/application.meta_lic testdata/reciprocal/lib/libb.so.meta_lic dynamic", + }, + }, + { + condition: "reciprocal", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []string{ + "testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/lib/liba.so.meta_lic static", + "testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/lib/libc.a.meta_lic static", + }, + }, + { + condition: "reciprocal", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []string{}, + }, + { + condition: "restricted", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []string{ + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/liba.so.meta_lic static", + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/libc.a.meta_lic static", + "testdata/restricted/bin/bin2.meta_lic testdata/restricted/lib/libb.so.meta_lic dynamic", + "testdata/restricted/bin/bin2.meta_lic testdata/restricted/lib/libd.so.meta_lic dynamic", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/bin/bin1.meta_lic static", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/bin/bin2.meta_lic static", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/lib/liba.so.meta_lic static", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/lib/libb.so.meta_lic static", + }, + }, + { + condition: "restricted", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/restricted/"}, + expectedOut: []string{ + "bin/bin1.meta_lic lib/liba.so.meta_lic static", + "bin/bin1.meta_lic lib/libc.a.meta_lic static", + "bin/bin2.meta_lic lib/libb.so.meta_lic dynamic", + "bin/bin2.meta_lic lib/libd.so.meta_lic dynamic", + "highest.apex.meta_lic bin/bin1.meta_lic static", + "highest.apex.meta_lic bin/bin2.meta_lic static", + "highest.apex.meta_lic lib/liba.so.meta_lic static", + "highest.apex.meta_lic lib/libb.so.meta_lic static", + }, + }, + { + condition: "restricted", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/restricted/", labelConditions: true}, + expectedOut: []string{ + "bin/bin1.meta_lic:notice lib/liba.so.meta_lic:restricted static", + "bin/bin1.meta_lic:notice lib/libc.a.meta_lic:reciprocal static", + "bin/bin2.meta_lic:notice lib/libb.so.meta_lic:restricted dynamic", + "bin/bin2.meta_lic:notice lib/libd.so.meta_lic:notice dynamic", + "highest.apex.meta_lic:notice bin/bin1.meta_lic:notice static", + "highest.apex.meta_lic:notice bin/bin2.meta_lic:notice static", + "highest.apex.meta_lic:notice lib/liba.so.meta_lic:restricted static", + "highest.apex.meta_lic:notice lib/libb.so.meta_lic:restricted static", + }, + }, + { + condition: "restricted", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []string{ + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/liba.so.meta_lic static", + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/libc.a.meta_lic static", + "testdata/restricted/bin/bin2.meta_lic testdata/restricted/lib/libb.so.meta_lic dynamic", + "testdata/restricted/bin/bin2.meta_lic testdata/restricted/lib/libd.so.meta_lic dynamic", + "testdata/restricted/container.zip.meta_lic testdata/restricted/bin/bin1.meta_lic static", + "testdata/restricted/container.zip.meta_lic testdata/restricted/bin/bin2.meta_lic static", + "testdata/restricted/container.zip.meta_lic testdata/restricted/lib/liba.so.meta_lic static", + "testdata/restricted/container.zip.meta_lic testdata/restricted/lib/libb.so.meta_lic static", + }, + }, + { + condition: "restricted", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []string{ + "testdata/restricted/application.meta_lic testdata/restricted/bin/bin3.meta_lic toolchain", + "testdata/restricted/application.meta_lic testdata/restricted/lib/liba.so.meta_lic static", + "testdata/restricted/application.meta_lic testdata/restricted/lib/libb.so.meta_lic dynamic", + }, + }, + { + condition: "restricted", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []string{ + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/liba.so.meta_lic static", + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/libc.a.meta_lic static", + }, + }, + { + condition: "restricted", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []string{}, + }, + { + condition: "proprietary", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []string{ + "testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/lib/liba.so.meta_lic static", + "testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/lib/libc.a.meta_lic static", + "testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/lib/libb.so.meta_lic dynamic", + "testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/lib/libd.so.meta_lic dynamic", + "testdata/proprietary/highest.apex.meta_lic testdata/proprietary/bin/bin1.meta_lic static", + "testdata/proprietary/highest.apex.meta_lic testdata/proprietary/bin/bin2.meta_lic static", + "testdata/proprietary/highest.apex.meta_lic testdata/proprietary/lib/liba.so.meta_lic static", + "testdata/proprietary/highest.apex.meta_lic testdata/proprietary/lib/libb.so.meta_lic static", + }, + }, + { + condition: "proprietary", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/proprietary/"}, + expectedOut: []string{ + "bin/bin1.meta_lic lib/liba.so.meta_lic static", + "bin/bin1.meta_lic lib/libc.a.meta_lic static", + "bin/bin2.meta_lic lib/libb.so.meta_lic dynamic", + "bin/bin2.meta_lic lib/libd.so.meta_lic dynamic", + "highest.apex.meta_lic bin/bin1.meta_lic static", + "highest.apex.meta_lic bin/bin2.meta_lic static", + "highest.apex.meta_lic lib/liba.so.meta_lic static", + "highest.apex.meta_lic lib/libb.so.meta_lic static", + }, + }, + { + condition: "proprietary", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/proprietary/", labelConditions: true}, + expectedOut: []string{ + "bin/bin1.meta_lic:notice lib/liba.so.meta_lic:by_exception_only:proprietary static", + "bin/bin1.meta_lic:notice lib/libc.a.meta_lic:by_exception_only:proprietary static", + "bin/bin2.meta_lic:by_exception_only:proprietary lib/libb.so.meta_lic:restricted dynamic", + "bin/bin2.meta_lic:by_exception_only:proprietary lib/libd.so.meta_lic:notice dynamic", + "highest.apex.meta_lic:notice bin/bin1.meta_lic:notice static", + "highest.apex.meta_lic:notice bin/bin2.meta_lic:by_exception_only:proprietary static", + "highest.apex.meta_lic:notice lib/liba.so.meta_lic:by_exception_only:proprietary static", + "highest.apex.meta_lic:notice lib/libb.so.meta_lic:restricted static", + }, + }, + { + condition: "proprietary", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []string{ + "testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/lib/liba.so.meta_lic static", + "testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/lib/libc.a.meta_lic static", + "testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/lib/libb.so.meta_lic dynamic", + "testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/lib/libd.so.meta_lic dynamic", + "testdata/proprietary/container.zip.meta_lic testdata/proprietary/bin/bin1.meta_lic static", + "testdata/proprietary/container.zip.meta_lic testdata/proprietary/bin/bin2.meta_lic static", + "testdata/proprietary/container.zip.meta_lic testdata/proprietary/lib/liba.so.meta_lic static", + "testdata/proprietary/container.zip.meta_lic testdata/proprietary/lib/libb.so.meta_lic static", + }, + }, + { + condition: "proprietary", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []string{ + "testdata/proprietary/application.meta_lic testdata/proprietary/bin/bin3.meta_lic toolchain", + "testdata/proprietary/application.meta_lic testdata/proprietary/lib/liba.so.meta_lic static", + "testdata/proprietary/application.meta_lic testdata/proprietary/lib/libb.so.meta_lic dynamic", + }, + }, + { + condition: "proprietary", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []string{ + "testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/lib/liba.so.meta_lic static", + "testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/lib/libc.a.meta_lic static", + }, + }, + { + condition: "proprietary", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []string{}, + }, + } + for _, tt := range tests { + t.Run(tt.condition+" "+tt.name, func(t *testing.T) { + expectedOut := &bytes.Buffer{} + for _, eo := range tt.expectedOut { + expectedOut.WriteString(eo) + expectedOut.WriteString("\n") + } + + stdout := &bytes.Buffer{} + stderr := &bytes.Buffer{} + + rootFiles := make([]string, 0, len(tt.roots)) + for _, r := range tt.roots { + rootFiles = append(rootFiles, "testdata/"+tt.condition+"/"+r) + } + err := dumpGraph(&tt.ctx, stdout, stderr, rootFiles...) + if err != nil { + t.Fatalf("dumpgraph: error = %v, stderr = %v", err, stderr) + return + } + if stderr.Len() > 0 { + t.Errorf("dumpgraph: gotStderr = %v, want none", stderr) + } + out := stdout.String() + expected := expectedOut.String() + if out != expected { + outList := strings.Split(out, "\n") + expectedList := strings.Split(expected, "\n") + startLine := 0 + for len(outList) > startLine && len(expectedList) > startLine && outList[startLine] == expectedList[startLine] { + startLine++ + } + t.Errorf("listshare: gotStdout = %v, want %v, somewhere near line %d Stdout = %v, want %v", + out, expected, startLine+1, outList[startLine], expectedList[startLine]) + } + }) + } +} + +type testContext struct { + nextNode int + nodes map[string]string +} + +type matcher interface { + matchString(*testContext) string + typeString() string +} + +type targetMatcher struct { + target string + conditions []string +} + +func (tm *targetMatcher) matchString(ctx *testContext) string { + m := tm.target + if len(tm.conditions) > 0 { + m += "\\n" + strings.Join(tm.conditions, "\\n") + } + m = ctx.nodes[tm.target] + " [label=\"" + m + "\"];" + return m +} + +func (tm *targetMatcher) typeString() string { + return "target" +} + +type edgeMatcher struct { + target string + dep string + annotations []string +} + +func (em *edgeMatcher) matchString(ctx *testContext) string { + return ctx.nodes[em.dep] + " -> " + ctx.nodes[em.target] + " [label=\"" + strings.Join(em.annotations, "\\n") + "\"];" +} + +func (tm *edgeMatcher) typeString() string { + return "edge" +} + +type getMatcher func(*testContext) matcher + +func matchTarget(target string, conditions ...string) getMatcher { + return func(ctx *testContext) matcher { + ctx.nodes[target] = fmt.Sprintf("n%d", ctx.nextNode) + ctx.nextNode++ + return &targetMatcher{target, append([]string{}, conditions...)} + } +} + +func matchEdge(target, dep string, annotations ...string) getMatcher { + return func(ctx *testContext) matcher { + if _, ok := ctx.nodes[target]; !ok { + panic(fmt.Errorf("no node for target %v in %v -> %v [label=\"%s\"];", target, dep, target, strings.Join(annotations, "\\n"))) + } + if _, ok := ctx.nodes[dep]; !ok { + panic(fmt.Errorf("no node for dep %v in %v -> %v [label=\"%s\"];", target, dep, target, strings.Join(annotations, "\\n"))) + } + return &edgeMatcher{target, dep, append([]string{}, annotations...)} + } +} + +func Test_graphviz(t *testing.T) { + tests := []struct { + condition string + name string + roots []string + ctx context + expectedOut []getMatcher + }{ + { + condition: "firstparty", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/firstparty/bin/bin1.meta_lic"), + matchTarget("testdata/firstparty/bin/bin2.meta_lic"), + matchTarget("testdata/firstparty/highest.apex.meta_lic"), + matchTarget("testdata/firstparty/lib/liba.so.meta_lic"), + matchTarget("testdata/firstparty/lib/libb.so.meta_lic"), + matchTarget("testdata/firstparty/lib/libc.a.meta_lic"), + matchTarget("testdata/firstparty/lib/libd.so.meta_lic"), + matchEdge("testdata/firstparty/bin/bin1.meta_lic", "testdata/firstparty/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/firstparty/bin/bin1.meta_lic", "testdata/firstparty/lib/libc.a.meta_lic", "static"), + matchEdge("testdata/firstparty/bin/bin2.meta_lic", "testdata/firstparty/lib/libb.so.meta_lic", "dynamic"), + matchEdge("testdata/firstparty/bin/bin2.meta_lic", "testdata/firstparty/lib/libd.so.meta_lic", "dynamic"), + matchEdge("testdata/firstparty/highest.apex.meta_lic", "testdata/firstparty/bin/bin1.meta_lic", "static"), + matchEdge("testdata/firstparty/highest.apex.meta_lic", "testdata/firstparty/bin/bin2.meta_lic", "static"), + matchEdge("testdata/firstparty/highest.apex.meta_lic", "testdata/firstparty/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/firstparty/highest.apex.meta_lic", "testdata/firstparty/lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "firstparty", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/firstparty/"}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("lib/libd.so.meta_lic"), + matchEdge("bin/bin1.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("bin/bin1.meta_lic", "lib/libc.a.meta_lic", "static"), + matchEdge("bin/bin2.meta_lic", "lib/libb.so.meta_lic", "dynamic"), + matchEdge("bin/bin2.meta_lic", "lib/libd.so.meta_lic", "dynamic"), + matchEdge("highest.apex.meta_lic", "bin/bin1.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "bin/bin2.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "firstparty", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/firstparty/", labelConditions: true}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic", "notice"), + matchTarget("bin/bin2.meta_lic", "notice"), + matchTarget("highest.apex.meta_lic", "notice"), + matchTarget("lib/liba.so.meta_lic", "notice"), + matchTarget("lib/libb.so.meta_lic", "notice"), + matchTarget("lib/libc.a.meta_lic", "notice"), + matchTarget("lib/libd.so.meta_lic", "notice"), + matchEdge("bin/bin1.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("bin/bin1.meta_lic", "lib/libc.a.meta_lic", "static"), + matchEdge("bin/bin2.meta_lic", "lib/libb.so.meta_lic", "dynamic"), + matchEdge("bin/bin2.meta_lic", "lib/libd.so.meta_lic", "dynamic"), + matchEdge("highest.apex.meta_lic", "bin/bin1.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "bin/bin2.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "firstparty", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/firstparty/bin/bin1.meta_lic"), + matchTarget("testdata/firstparty/bin/bin2.meta_lic"), + matchTarget("testdata/firstparty/container.zip.meta_lic"), + matchTarget("testdata/firstparty/lib/liba.so.meta_lic"), + matchTarget("testdata/firstparty/lib/libb.so.meta_lic"), + matchTarget("testdata/firstparty/lib/libc.a.meta_lic"), + matchTarget("testdata/firstparty/lib/libd.so.meta_lic"), + matchEdge("testdata/firstparty/bin/bin1.meta_lic", "testdata/firstparty/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/firstparty/bin/bin1.meta_lic", "testdata/firstparty/lib/libc.a.meta_lic", "static"), + matchEdge("testdata/firstparty/bin/bin2.meta_lic", "testdata/firstparty/lib/libb.so.meta_lic", "dynamic"), + matchEdge("testdata/firstparty/bin/bin2.meta_lic", "testdata/firstparty/lib/libd.so.meta_lic", "dynamic"), + matchEdge("testdata/firstparty/container.zip.meta_lic", "testdata/firstparty/bin/bin1.meta_lic", "static"), + matchEdge("testdata/firstparty/container.zip.meta_lic", "testdata/firstparty/bin/bin2.meta_lic", "static"), + matchEdge("testdata/firstparty/container.zip.meta_lic", "testdata/firstparty/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/firstparty/container.zip.meta_lic", "testdata/firstparty/lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "firstparty", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/firstparty/application.meta_lic"), + matchTarget("testdata/firstparty/bin/bin3.meta_lic"), + matchTarget("testdata/firstparty/lib/liba.so.meta_lic"), + matchTarget("testdata/firstparty/lib/libb.so.meta_lic"), + matchEdge("testdata/firstparty/application.meta_lic", "testdata/firstparty/bin/bin3.meta_lic", "toolchain"), + matchEdge("testdata/firstparty/application.meta_lic", "testdata/firstparty/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/firstparty/application.meta_lic", "testdata/firstparty/lib/libb.so.meta_lic", "dynamic"), + }, + }, + { + condition: "firstparty", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/firstparty/bin/bin1.meta_lic"), + matchTarget("testdata/firstparty/lib/liba.so.meta_lic"), + matchTarget("testdata/firstparty/lib/libc.a.meta_lic"), + matchEdge("testdata/firstparty/bin/bin1.meta_lic", "testdata/firstparty/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/firstparty/bin/bin1.meta_lic", "testdata/firstparty/lib/libc.a.meta_lic", "static"), + }, + }, + { + condition: "firstparty", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []getMatcher{matchTarget("testdata/firstparty/lib/libd.so.meta_lic")}, + }, + { + condition: "notice", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/notice/bin/bin1.meta_lic"), + matchTarget("testdata/notice/bin/bin2.meta_lic"), + matchTarget("testdata/notice/highest.apex.meta_lic"), + matchTarget("testdata/notice/lib/liba.so.meta_lic"), + matchTarget("testdata/notice/lib/libb.so.meta_lic"), + matchTarget("testdata/notice/lib/libc.a.meta_lic"), + matchTarget("testdata/notice/lib/libd.so.meta_lic"), + matchEdge("testdata/notice/bin/bin1.meta_lic", "testdata/notice/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/notice/bin/bin1.meta_lic", "testdata/notice/lib/libc.a.meta_lic", "static"), + matchEdge("testdata/notice/bin/bin2.meta_lic", "testdata/notice/lib/libb.so.meta_lic", "dynamic"), + matchEdge("testdata/notice/bin/bin2.meta_lic", "testdata/notice/lib/libd.so.meta_lic", "dynamic"), + matchEdge("testdata/notice/highest.apex.meta_lic", "testdata/notice/bin/bin1.meta_lic", "static"), + matchEdge("testdata/notice/highest.apex.meta_lic", "testdata/notice/bin/bin2.meta_lic", "static"), + matchEdge("testdata/notice/highest.apex.meta_lic", "testdata/notice/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/notice/highest.apex.meta_lic", "testdata/notice/lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "notice", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/notice/"}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("lib/libd.so.meta_lic"), + matchEdge("bin/bin1.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("bin/bin1.meta_lic", "lib/libc.a.meta_lic", "static"), + matchEdge("bin/bin2.meta_lic", "lib/libb.so.meta_lic", "dynamic"), + matchEdge("bin/bin2.meta_lic", "lib/libd.so.meta_lic", "dynamic"), + matchEdge("highest.apex.meta_lic", "bin/bin1.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "bin/bin2.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "notice", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/notice/", labelConditions: true}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic", "notice"), + matchTarget("bin/bin2.meta_lic", "notice"), + matchTarget("highest.apex.meta_lic", "notice"), + matchTarget("lib/liba.so.meta_lic", "notice"), + matchTarget("lib/libb.so.meta_lic", "notice"), + matchTarget("lib/libc.a.meta_lic", "notice"), + matchTarget("lib/libd.so.meta_lic", "notice"), + matchEdge("bin/bin1.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("bin/bin1.meta_lic", "lib/libc.a.meta_lic", "static"), + matchEdge("bin/bin2.meta_lic", "lib/libb.so.meta_lic", "dynamic"), + matchEdge("bin/bin2.meta_lic", "lib/libd.so.meta_lic", "dynamic"), + matchEdge("highest.apex.meta_lic", "bin/bin1.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "bin/bin2.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "notice", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/notice/bin/bin1.meta_lic"), + matchTarget("testdata/notice/bin/bin2.meta_lic"), + matchTarget("testdata/notice/container.zip.meta_lic"), + matchTarget("testdata/notice/lib/liba.so.meta_lic"), + matchTarget("testdata/notice/lib/libb.so.meta_lic"), + matchTarget("testdata/notice/lib/libc.a.meta_lic"), + matchTarget("testdata/notice/lib/libd.so.meta_lic"), + matchEdge("testdata/notice/bin/bin1.meta_lic", "testdata/notice/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/notice/bin/bin1.meta_lic", "testdata/notice/lib/libc.a.meta_lic", "static"), + matchEdge("testdata/notice/bin/bin2.meta_lic", "testdata/notice/lib/libb.so.meta_lic", "dynamic"), + matchEdge("testdata/notice/bin/bin2.meta_lic", "testdata/notice/lib/libd.so.meta_lic", "dynamic"), + matchEdge("testdata/notice/container.zip.meta_lic", "testdata/notice/bin/bin1.meta_lic", "static"), + matchEdge("testdata/notice/container.zip.meta_lic", "testdata/notice/bin/bin2.meta_lic", "static"), + matchEdge("testdata/notice/container.zip.meta_lic", "testdata/notice/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/notice/container.zip.meta_lic", "testdata/notice/lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "notice", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/notice/application.meta_lic"), + matchTarget("testdata/notice/bin/bin3.meta_lic"), + matchTarget("testdata/notice/lib/liba.so.meta_lic"), + matchTarget("testdata/notice/lib/libb.so.meta_lic"), + matchEdge("testdata/notice/application.meta_lic", "testdata/notice/bin/bin3.meta_lic", "toolchain"), + matchEdge("testdata/notice/application.meta_lic", "testdata/notice/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/notice/application.meta_lic", "testdata/notice/lib/libb.so.meta_lic", "dynamic"), + }, + }, + { + condition: "notice", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/notice/bin/bin1.meta_lic"), + matchTarget("testdata/notice/lib/liba.so.meta_lic"), + matchTarget("testdata/notice/lib/libc.a.meta_lic"), + matchEdge("testdata/notice/bin/bin1.meta_lic", "testdata/notice/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/notice/bin/bin1.meta_lic", "testdata/notice/lib/libc.a.meta_lic", "static"), + }, + }, + { + condition: "notice", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []getMatcher{matchTarget("testdata/notice/lib/libd.so.meta_lic")}, + }, + { + condition: "reciprocal", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/reciprocal/bin/bin1.meta_lic"), + matchTarget("testdata/reciprocal/bin/bin2.meta_lic"), + matchTarget("testdata/reciprocal/highest.apex.meta_lic"), + matchTarget("testdata/reciprocal/lib/liba.so.meta_lic"), + matchTarget("testdata/reciprocal/lib/libb.so.meta_lic"), + matchTarget("testdata/reciprocal/lib/libc.a.meta_lic"), + matchTarget("testdata/reciprocal/lib/libd.so.meta_lic"), + matchEdge("testdata/reciprocal/bin/bin1.meta_lic", "testdata/reciprocal/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/reciprocal/bin/bin1.meta_lic", "testdata/reciprocal/lib/libc.a.meta_lic", "static"), + matchEdge("testdata/reciprocal/bin/bin2.meta_lic", "testdata/reciprocal/lib/libb.so.meta_lic", "dynamic"), + matchEdge("testdata/reciprocal/bin/bin2.meta_lic", "testdata/reciprocal/lib/libd.so.meta_lic", "dynamic"), + matchEdge("testdata/reciprocal/highest.apex.meta_lic", "testdata/reciprocal/bin/bin1.meta_lic", "static"), + matchEdge("testdata/reciprocal/highest.apex.meta_lic", "testdata/reciprocal/bin/bin2.meta_lic", "static"), + matchEdge("testdata/reciprocal/highest.apex.meta_lic", "testdata/reciprocal/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/reciprocal/highest.apex.meta_lic", "testdata/reciprocal/lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "reciprocal", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/reciprocal/"}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("lib/libd.so.meta_lic"), + matchEdge("bin/bin1.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("bin/bin1.meta_lic", "lib/libc.a.meta_lic", "static"), + matchEdge("bin/bin2.meta_lic", "lib/libb.so.meta_lic", "dynamic"), + matchEdge("bin/bin2.meta_lic", "lib/libd.so.meta_lic", "dynamic"), + matchEdge("highest.apex.meta_lic", "bin/bin1.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "bin/bin2.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "reciprocal", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/reciprocal/", labelConditions: true}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic", "notice"), + matchTarget("bin/bin2.meta_lic", "notice"), + matchTarget("highest.apex.meta_lic", "notice"), + matchTarget("lib/liba.so.meta_lic", "reciprocal"), + matchTarget("lib/libb.so.meta_lic", "notice"), + matchTarget("lib/libc.a.meta_lic", "reciprocal"), + matchTarget("lib/libd.so.meta_lic", "notice"), + matchEdge("bin/bin1.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("bin/bin1.meta_lic", "lib/libc.a.meta_lic", "static"), + matchEdge("bin/bin2.meta_lic", "lib/libb.so.meta_lic", "dynamic"), + matchEdge("bin/bin2.meta_lic", "lib/libd.so.meta_lic", "dynamic"), + matchEdge("highest.apex.meta_lic", "bin/bin1.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "bin/bin2.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "reciprocal", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/reciprocal/bin/bin1.meta_lic"), + matchTarget("testdata/reciprocal/bin/bin2.meta_lic"), + matchTarget("testdata/reciprocal/container.zip.meta_lic"), + matchTarget("testdata/reciprocal/lib/liba.so.meta_lic"), + matchTarget("testdata/reciprocal/lib/libb.so.meta_lic"), + matchTarget("testdata/reciprocal/lib/libc.a.meta_lic"), + matchTarget("testdata/reciprocal/lib/libd.so.meta_lic"), + matchEdge("testdata/reciprocal/bin/bin1.meta_lic", "testdata/reciprocal/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/reciprocal/bin/bin1.meta_lic", "testdata/reciprocal/lib/libc.a.meta_lic", "static"), + matchEdge("testdata/reciprocal/bin/bin2.meta_lic", "testdata/reciprocal/lib/libb.so.meta_lic", "dynamic"), + matchEdge("testdata/reciprocal/bin/bin2.meta_lic", "testdata/reciprocal/lib/libd.so.meta_lic", "dynamic"), + matchEdge("testdata/reciprocal/container.zip.meta_lic", "testdata/reciprocal/bin/bin1.meta_lic", "static"), + matchEdge("testdata/reciprocal/container.zip.meta_lic", "testdata/reciprocal/bin/bin2.meta_lic", "static"), + matchEdge("testdata/reciprocal/container.zip.meta_lic", "testdata/reciprocal/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/reciprocal/container.zip.meta_lic", "testdata/reciprocal/lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "reciprocal", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/reciprocal/application.meta_lic"), + matchTarget("testdata/reciprocal/bin/bin3.meta_lic"), + matchTarget("testdata/reciprocal/lib/liba.so.meta_lic"), + matchTarget("testdata/reciprocal/lib/libb.so.meta_lic"), + matchEdge("testdata/reciprocal/application.meta_lic", "testdata/reciprocal/bin/bin3.meta_lic", "toolchain"), + matchEdge("testdata/reciprocal/application.meta_lic", "testdata/reciprocal/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/reciprocal/application.meta_lic", "testdata/reciprocal/lib/libb.so.meta_lic", "dynamic"), + }, + }, + { + condition: "reciprocal", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/reciprocal/bin/bin1.meta_lic"), + matchTarget("testdata/reciprocal/lib/liba.so.meta_lic"), + matchTarget("testdata/reciprocal/lib/libc.a.meta_lic"), + matchEdge("testdata/reciprocal/bin/bin1.meta_lic", "testdata/reciprocal/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/reciprocal/bin/bin1.meta_lic", "testdata/reciprocal/lib/libc.a.meta_lic", "static"), + }, + }, + { + condition: "reciprocal", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []getMatcher{matchTarget("testdata/reciprocal/lib/libd.so.meta_lic")}, + }, + { + condition: "restricted", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/restricted/bin/bin1.meta_lic"), + matchTarget("testdata/restricted/bin/bin2.meta_lic"), + matchTarget("testdata/restricted/highest.apex.meta_lic"), + matchTarget("testdata/restricted/lib/liba.so.meta_lic"), + matchTarget("testdata/restricted/lib/libb.so.meta_lic"), + matchTarget("testdata/restricted/lib/libc.a.meta_lic"), + matchTarget("testdata/restricted/lib/libd.so.meta_lic"), + matchEdge("testdata/restricted/bin/bin1.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/restricted/bin/bin1.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "static"), + matchEdge("testdata/restricted/bin/bin2.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", "dynamic"), + matchEdge("testdata/restricted/bin/bin2.meta_lic", "testdata/restricted/lib/libd.so.meta_lic", "dynamic"), + matchEdge("testdata/restricted/highest.apex.meta_lic", "testdata/restricted/bin/bin1.meta_lic", "static"), + matchEdge("testdata/restricted/highest.apex.meta_lic", "testdata/restricted/bin/bin2.meta_lic", "static"), + matchEdge("testdata/restricted/highest.apex.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/restricted/highest.apex.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "restricted", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/restricted/"}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("lib/libd.so.meta_lic"), + matchEdge("bin/bin1.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("bin/bin1.meta_lic", "lib/libc.a.meta_lic", "static"), + matchEdge("bin/bin2.meta_lic", "lib/libb.so.meta_lic", "dynamic"), + matchEdge("bin/bin2.meta_lic", "lib/libd.so.meta_lic", "dynamic"), + matchEdge("highest.apex.meta_lic", "bin/bin1.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "bin/bin2.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "restricted", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/restricted/", labelConditions: true}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic", "notice"), + matchTarget("bin/bin2.meta_lic", "notice"), + matchTarget("highest.apex.meta_lic", "notice"), + matchTarget("lib/liba.so.meta_lic", "restricted"), + matchTarget("lib/libb.so.meta_lic", "restricted"), + matchTarget("lib/libc.a.meta_lic", "reciprocal"), + matchTarget("lib/libd.so.meta_lic", "notice"), + matchEdge("bin/bin1.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("bin/bin1.meta_lic", "lib/libc.a.meta_lic", "static"), + matchEdge("bin/bin2.meta_lic", "lib/libb.so.meta_lic", "dynamic"), + matchEdge("bin/bin2.meta_lic", "lib/libd.so.meta_lic", "dynamic"), + matchEdge("highest.apex.meta_lic", "bin/bin1.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "bin/bin2.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "restricted", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/restricted/bin/bin1.meta_lic"), + matchTarget("testdata/restricted/bin/bin2.meta_lic"), + matchTarget("testdata/restricted/container.zip.meta_lic"), + matchTarget("testdata/restricted/lib/liba.so.meta_lic"), + matchTarget("testdata/restricted/lib/libb.so.meta_lic"), + matchTarget("testdata/restricted/lib/libc.a.meta_lic"), + matchTarget("testdata/restricted/lib/libd.so.meta_lic"), + matchEdge("testdata/restricted/bin/bin1.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/restricted/bin/bin1.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "static"), + matchEdge("testdata/restricted/bin/bin2.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", "dynamic"), + matchEdge("testdata/restricted/bin/bin2.meta_lic", "testdata/restricted/lib/libd.so.meta_lic", "dynamic"), + matchEdge("testdata/restricted/container.zip.meta_lic", "testdata/restricted/bin/bin1.meta_lic", "static"), + matchEdge("testdata/restricted/container.zip.meta_lic", "testdata/restricted/bin/bin2.meta_lic", "static"), + matchEdge("testdata/restricted/container.zip.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/restricted/container.zip.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "restricted", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/restricted/application.meta_lic"), + matchTarget("testdata/restricted/bin/bin3.meta_lic"), + matchTarget("testdata/restricted/lib/liba.so.meta_lic"), + matchTarget("testdata/restricted/lib/libb.so.meta_lic"), + matchEdge("testdata/restricted/application.meta_lic", "testdata/restricted/bin/bin3.meta_lic", "toolchain"), + matchEdge("testdata/restricted/application.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/restricted/application.meta_lic", "testdata/restricted/lib/libb.so.meta_lic", "dynamic"), + }, + }, + { + condition: "restricted", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/restricted/bin/bin1.meta_lic"), + matchTarget("testdata/restricted/lib/liba.so.meta_lic"), + matchTarget("testdata/restricted/lib/libc.a.meta_lic"), + matchEdge("testdata/restricted/bin/bin1.meta_lic", "testdata/restricted/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/restricted/bin/bin1.meta_lic", "testdata/restricted/lib/libc.a.meta_lic", "static"), + }, + }, + { + condition: "restricted", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []getMatcher{matchTarget("testdata/restricted/lib/libd.so.meta_lic")}, + }, + { + condition: "proprietary", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/proprietary/bin/bin1.meta_lic"), + matchTarget("testdata/proprietary/bin/bin2.meta_lic"), + matchTarget("testdata/proprietary/highest.apex.meta_lic"), + matchTarget("testdata/proprietary/lib/liba.so.meta_lic"), + matchTarget("testdata/proprietary/lib/libb.so.meta_lic"), + matchTarget("testdata/proprietary/lib/libc.a.meta_lic"), + matchTarget("testdata/proprietary/lib/libd.so.meta_lic"), + matchEdge("testdata/proprietary/bin/bin1.meta_lic", "testdata/proprietary/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/proprietary/bin/bin1.meta_lic", "testdata/proprietary/lib/libc.a.meta_lic", "static"), + matchEdge("testdata/proprietary/bin/bin2.meta_lic", "testdata/proprietary/lib/libb.so.meta_lic", "dynamic"), + matchEdge("testdata/proprietary/bin/bin2.meta_lic", "testdata/proprietary/lib/libd.so.meta_lic", "dynamic"), + matchEdge("testdata/proprietary/highest.apex.meta_lic", "testdata/proprietary/bin/bin1.meta_lic", "static"), + matchEdge("testdata/proprietary/highest.apex.meta_lic", "testdata/proprietary/bin/bin2.meta_lic", "static"), + matchEdge("testdata/proprietary/highest.apex.meta_lic", "testdata/proprietary/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/proprietary/highest.apex.meta_lic", "testdata/proprietary/lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "proprietary", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/proprietary/"}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("lib/libd.so.meta_lic"), + matchEdge("bin/bin1.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("bin/bin1.meta_lic", "lib/libc.a.meta_lic", "static"), + matchEdge("bin/bin2.meta_lic", "lib/libb.so.meta_lic", "dynamic"), + matchEdge("bin/bin2.meta_lic", "lib/libd.so.meta_lic", "dynamic"), + matchEdge("highest.apex.meta_lic", "bin/bin1.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "bin/bin2.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "proprietary", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/proprietary/", labelConditions: true}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic", "notice"), + matchTarget("bin/bin2.meta_lic", "by_exception_only", "proprietary"), + matchTarget("highest.apex.meta_lic", "notice"), + matchTarget("lib/liba.so.meta_lic", "by_exception_only", "proprietary"), + matchTarget("lib/libb.so.meta_lic", "restricted"), + matchTarget("lib/libc.a.meta_lic", "by_exception_only", "proprietary"), + matchTarget("lib/libd.so.meta_lic", "notice"), + matchEdge("bin/bin1.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("bin/bin1.meta_lic", "lib/libc.a.meta_lic", "static"), + matchEdge("bin/bin2.meta_lic", "lib/libb.so.meta_lic", "dynamic"), + matchEdge("bin/bin2.meta_lic", "lib/libd.so.meta_lic", "dynamic"), + matchEdge("highest.apex.meta_lic", "bin/bin1.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "bin/bin2.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/liba.so.meta_lic", "static"), + matchEdge("highest.apex.meta_lic", "lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "proprietary", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/proprietary/bin/bin1.meta_lic"), + matchTarget("testdata/proprietary/bin/bin2.meta_lic"), + matchTarget("testdata/proprietary/container.zip.meta_lic"), + matchTarget("testdata/proprietary/lib/liba.so.meta_lic"), + matchTarget("testdata/proprietary/lib/libb.so.meta_lic"), + matchTarget("testdata/proprietary/lib/libc.a.meta_lic"), + matchTarget("testdata/proprietary/lib/libd.so.meta_lic"), + matchEdge("testdata/proprietary/bin/bin1.meta_lic", "testdata/proprietary/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/proprietary/bin/bin1.meta_lic", "testdata/proprietary/lib/libc.a.meta_lic", "static"), + matchEdge("testdata/proprietary/bin/bin2.meta_lic", "testdata/proprietary/lib/libb.so.meta_lic", "dynamic"), + matchEdge("testdata/proprietary/bin/bin2.meta_lic", "testdata/proprietary/lib/libd.so.meta_lic", "dynamic"), + matchEdge("testdata/proprietary/container.zip.meta_lic", "testdata/proprietary/bin/bin1.meta_lic", "static"), + matchEdge("testdata/proprietary/container.zip.meta_lic", "testdata/proprietary/bin/bin2.meta_lic", "static"), + matchEdge("testdata/proprietary/container.zip.meta_lic", "testdata/proprietary/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/proprietary/container.zip.meta_lic", "testdata/proprietary/lib/libb.so.meta_lic", "static"), + }, + }, + { + condition: "proprietary", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/proprietary/application.meta_lic"), + matchTarget("testdata/proprietary/bin/bin3.meta_lic"), + matchTarget("testdata/proprietary/lib/liba.so.meta_lic"), + matchTarget("testdata/proprietary/lib/libb.so.meta_lic"), + matchEdge("testdata/proprietary/application.meta_lic", "testdata/proprietary/bin/bin3.meta_lic", "toolchain"), + matchEdge("testdata/proprietary/application.meta_lic", "testdata/proprietary/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/proprietary/application.meta_lic", "testdata/proprietary/lib/libb.so.meta_lic", "dynamic"), + }, + }, + { + condition: "proprietary", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/proprietary/bin/bin1.meta_lic"), + matchTarget("testdata/proprietary/lib/liba.so.meta_lic"), + matchTarget("testdata/proprietary/lib/libc.a.meta_lic"), + matchEdge("testdata/proprietary/bin/bin1.meta_lic", "testdata/proprietary/lib/liba.so.meta_lic", "static"), + matchEdge("testdata/proprietary/bin/bin1.meta_lic", "testdata/proprietary/lib/libc.a.meta_lic", "static"), + }, + }, + { + condition: "proprietary", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []getMatcher{matchTarget("testdata/proprietary/lib/libd.so.meta_lic")}, + }, + } + for _, tt := range tests { + t.Run(tt.condition+" "+tt.name, func(t *testing.T) { + ctx := &testContext{0, make(map[string]string)} + + expectedOut := &bytes.Buffer{} + for _, eo := range tt.expectedOut { + m := eo(ctx) + expectedOut.WriteString(m.matchString(ctx)) + expectedOut.WriteString("\n") + } + + stdout := &bytes.Buffer{} + stderr := &bytes.Buffer{} + + rootFiles := make([]string, 0, len(tt.roots)) + for _, r := range tt.roots { + rootFiles = append(rootFiles, "testdata/"+tt.condition+"/"+r) + } + tt.ctx.graphViz = true + err := dumpGraph(&tt.ctx, stdout, stderr, rootFiles...) + if err != nil { + t.Fatalf("dumpgraph: error = %v, stderr = %v", err, stderr) + return + } + if stderr.Len() > 0 { + t.Errorf("dumpgraph: gotStderr = %v, want none", stderr) + } + outList := strings.Split(stdout.String(), "\n") + outLine := 0 + if outList[outLine] != "strict digraph {" { + t.Errorf("dumpgraph: got 1st line %v, want strict digraph {") + } + outLine++ + if strings.HasPrefix(strings.TrimLeft(outList[outLine], " \t"), "rankdir") { + outLine++ + } + endOut := len(outList) + for endOut > 0 && strings.TrimLeft(outList[endOut-1], " \t") == "" { + endOut-- + } + if outList[endOut-1] != "}" { + t.Errorf("dumpgraph: got last line %v, want }", outList[endOut-1]) + } + endOut-- + if strings.HasPrefix(strings.TrimLeft(outList[endOut-1], " \t"), "{rank=same") { + endOut-- + } + expectedList := strings.Split(expectedOut.String(), "\n") + for len(expectedList) > 0 && expectedList[len(expectedList)-1] == "" { + expectedList = expectedList[0 : len(expectedList)-1] + } + matchLine := 0 + + for outLine < endOut && matchLine < len(expectedList) && strings.TrimLeft(outList[outLine], " \t") == expectedList[matchLine] { + outLine++ + matchLine++ + } + if outLine < endOut || matchLine < len(expectedList) { + if outLine >= endOut { + t.Errorf("dumpgraph: missing lines at end of graph, want %d lines %v", len(expectedList)-matchLine, strings.Join(expectedList[matchLine:], "\n")) + } else if matchLine >= len(expectedList) { + t.Errorf("dumpgraph: unexpected lines at end of graph starting line %d, got %v, want nothing", outLine+1, strings.Join(outList[outLine:], "\n")) + } else { + t.Errorf("dumpgraph: at line %d, got %v, want %v", outLine+1, strings.Join(outList[outLine:], "\n"), strings.Join(expectedList[matchLine:], "\n")) + } + } + }) + } +} diff --git a/tools/compliance/cmd/dumpresolutions.go b/tools/compliance/cmd/dumpresolutions.go new file mode 100644 index 0000000000..36fbb7d8b9 --- /dev/null +++ b/tools/compliance/cmd/dumpresolutions.go @@ -0,0 +1,284 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "compliance" + "flag" + "fmt" + "io" + "os" + "path/filepath" + "sort" + "strings" +) + +var ( + conditions = newMultiString("c", "License condition to resolve. (may be given multiple times)") + graphViz = flag.Bool("dot", false, "Whether to output graphviz (i.e. dot) format.") + labelConditions = flag.Bool("label_conditions", false, "Whether to label target nodes with conditions.") + stripPrefix = flag.String("strip_prefix", "", "Prefix to remove from paths. i.e. path to root") + + failNoneRequested = fmt.Errorf("\nNo license metadata files requested") + failNoLicenses = fmt.Errorf("No licenses found") +) + +type context struct { + conditions []string + graphViz bool + labelConditions bool + stripPrefix string +} + +func init() { + flag.Usage = func() { + fmt.Fprintf(os.Stderr, `Usage: %s {options} file.meta_lic {file.meta_lic...} + +Outputs a space-separated Target ActsOn Origin Condition tuple for each +resolution in the graph. When -dot flag given, outputs nodes and edges +in graphviz directed graph format. + +If one or more '-c condition' conditions are given, outputs the joined +set of resolutions for all of the conditions. Otherwise, outputs the +result of the bottom-up and top-down resolve only. + +In plain text mode, when '-label_conditions' is requested, the Target +and Origin have colon-separated license conditions appended: +i.e. target:condition1:condition2 etc. + +Options: +`, filepath.Base(os.Args[0])) + flag.PrintDefaults() + } +} + +// newMultiString creates a flag that allows multiple values in an array. +func newMultiString(name, usage string) *multiString { + var f multiString + flag.Var(&f, name, usage) + return &f +} + +// multiString implements the flag `Value` interface for multiple strings. +type multiString []string + +func (ms *multiString) String() string { return strings.Join(*ms, ", ") } +func (ms *multiString) Set(s string) error { *ms = append(*ms, s); return nil } + +func main() { + flag.Parse() + + // Must specify at least one root target. + if flag.NArg() == 0 { + flag.Usage() + os.Exit(2) + } + + ctx := &context{ + conditions: append([]string{}, *conditions...), + graphViz: *graphViz, + labelConditions: *labelConditions, + stripPrefix: *stripPrefix, + } + err := dumpResolutions(ctx, os.Stdout, os.Stderr, flag.Args()...) + if err != nil { + if err == failNoneRequested { + flag.Usage() + } + fmt.Fprintf(os.Stderr, "%s\n", err.Error()) + os.Exit(1) + } + os.Exit(0) +} + +// dumpResolutions implements the dumpresolutions utility. +func dumpResolutions(ctx *context, stdout, stderr io.Writer, files ...string) error { + if len(files) < 1 { + return failNoneRequested + } + + // Read the license graph from the license metadata files (*.meta_lic). + licenseGraph, err := compliance.ReadLicenseGraph(os.DirFS("."), stderr, files) + if err != nil { + return fmt.Errorf("Unable to read license metadata file(s) %q: %v\n", files, err) + } + if licenseGraph == nil { + return failNoLicenses + } + + // resolutions will contain the requested set of resolutions. + var resolutions *compliance.ResolutionSet + + resolutions = compliance.ResolveTopDownConditions(licenseGraph) + if len(ctx.conditions) > 0 { + rlist := make([]*compliance.ResolutionSet, 0, len(ctx.conditions)) + for _, c := range ctx.conditions { + rlist = append(rlist, compliance.WalkResolutionsForCondition(licenseGraph, resolutions, compliance.ConditionNames{c})) + } + if len(rlist) == 1 { + resolutions = rlist[0] + } else { + resolutions = compliance.JoinResolutionSets(rlist...) + } + } + + // nodes maps license metadata file names to graphViz node names when graphViz requested. + nodes := make(map[string]string) + n := 0 + + // targetOut calculates the string to output for `target` adding `sep`-separated conditions as needed. + targetOut := func(target *compliance.TargetNode, sep string) string { + tOut := strings.TrimPrefix(target.Name(), ctx.stripPrefix) + if ctx.labelConditions { + conditions := make([]string, 0, target.LicenseConditions().Count()) + for _, lc := range target.LicenseConditions().AsList() { + conditions = append(conditions, lc.Name()) + } + sort.Strings(conditions) + if len(conditions) > 0 { + tOut += sep + strings.Join(conditions, sep) + } + } + return tOut + } + + // makeNode maps `target` to a graphViz node name. + makeNode := func(target *compliance.TargetNode) { + tName := target.Name() + if _, ok := nodes[tName]; !ok { + nodeName := fmt.Sprintf("n%d", n) + nodes[tName] = nodeName + fmt.Fprintf(stdout, "\t%s [label=\"%s\"];\n", nodeName, targetOut(target, "\\n")) + n++ + } + } + + // outputResolution prints a resolution in the requested format to `stdout`, where one can read + // a resolution as `tname` resolves `oname`'s conditions named in `cnames`. + // `tname` is the name of the target the resolution applies to. + // `oname` is the name of the target where the conditions originate. + // `cnames` is the list of conditions to resolve. + outputResolution := func(tname, aname, oname string, cnames []string) { + if ctx.graphViz { + // ... one edge per line labelled with \\n-separated annotations. + tNode := nodes[tname] + aNode := nodes[aname] + oNode := nodes[oname] + fmt.Fprintf(stdout, "\t%s -> %s; %s -> %s [label=\"%s\"];\n", tNode, aNode, aNode, oNode, strings.Join(cnames, "\\n")) + } else { + // ... one edge per line with names in a colon-separated tuple. + fmt.Fprintf(stdout, "%s %s %s %s\n", tname, aname, oname, strings.Join(cnames, ":")) + } + } + + // outputSingleton prints `tname` to plain text in the unexpected event that `tname` is the name of + // a target in `resolutions.AppliesTo()` but has no conditions to resolve. + outputSingleton := func(tname, aname string) { + if !ctx.graphViz { + fmt.Fprintf(stdout, "%s %s\n", tname, aname) + } + } + + // Sort the resolutions by targetname for repeatability/stability. + targets := resolutions.AttachesTo() + sort.Sort(targets) + + // If graphviz output, start the directed graph. + if ctx.graphViz { + fmt.Fprintf(stdout, "strict digraph {\n\trankdir=LR;\n") + for _, target := range targets { + makeNode(target) + rl := compliance.ResolutionList(resolutions.Resolutions(target)) + sort.Sort(rl) + for _, r := range rl { + makeNode(r.ActsOn()) + } + conditions := rl.AllConditions().AsList() + sort.Sort(conditions) + for _, lc := range conditions { + makeNode(lc.Origin()) + } + } + } + + // Output the sorted targets. + for _, target := range targets { + var tname string + if ctx.graphViz { + tname = target.Name() + } else { + tname = targetOut(target, ":") + } + + rl := compliance.ResolutionList(resolutions.Resolutions(target)) + sort.Sort(rl) + for _, r := range rl { + var aname string + if ctx.graphViz { + aname = r.ActsOn().Name() + } else { + aname = targetOut(r.ActsOn(), ":") + } + + conditions := r.Resolves().AsList() + sort.Sort(conditions) + + // poname is the previous origin name or "" if no previous + poname := "" + + // cnames accumulates the list of condition names originating at a single origin that apply to `target`. + cnames := make([]string, 0, len(conditions)) + + // Output 1 line for each attachesTo+actsOn+origin combination. + for _, condition := range conditions { + var oname string + if ctx.graphViz { + oname = condition.Origin().Name() + } else { + oname = targetOut(condition.Origin(), ":") + } + + // Detect when origin changes and output prior origin's conditions. + if poname != oname && poname != "" { + outputResolution(tname, aname, poname, cnames) + cnames = cnames[:0] + } + poname = oname + cnames = append(cnames, condition.Name()) + } + // Output last origin's conditions or a singleton if no origins. + if poname == "" { + outputSingleton(tname, aname) + } else { + outputResolution(tname, aname, poname, cnames) + } + } + } + // If graphViz output, rank the root nodes together, and complete the directed graph. + if ctx.graphViz { + fmt.Fprintf(stdout, "\t{rank=same;") + for _, f := range files { + fName := f + if !strings.HasSuffix(fName, ".meta_lic") { + fName += ".meta_lic" + } + if fNode, ok := nodes[fName]; ok { + fmt.Fprintf(stdout, " %s", fNode) + } + } + fmt.Fprintf(stdout, "}\n}\n") + } + return nil +} diff --git a/tools/compliance/cmd/dumpresolutions_test.go b/tools/compliance/cmd/dumpresolutions_test.go new file mode 100644 index 0000000000..1328a364c1 --- /dev/null +++ b/tools/compliance/cmd/dumpresolutions_test.go @@ -0,0 +1,4544 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "bytes" + "fmt" + "strings" + "testing" +) + +func Test_plaintext(t *testing.T) { + tests := []struct { + condition string + name string + roots []string + ctx context + expectedOut []string + }{ + { + condition: "firstparty", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []string{ + "testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/bin/bin1.meta_lic notice", + "testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/lib/liba.so.meta_lic testdata/firstparty/lib/liba.so.meta_lic notice", + "testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/lib/libc.a.meta_lic testdata/firstparty/lib/libc.a.meta_lic notice", + "testdata/firstparty/bin/bin2.meta_lic testdata/firstparty/bin/bin2.meta_lic testdata/firstparty/bin/bin2.meta_lic notice", + "testdata/firstparty/highest.apex.meta_lic testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/bin/bin1.meta_lic notice", + "testdata/firstparty/highest.apex.meta_lic testdata/firstparty/bin/bin2.meta_lic testdata/firstparty/bin/bin2.meta_lic notice", + "testdata/firstparty/highest.apex.meta_lic testdata/firstparty/highest.apex.meta_lic testdata/firstparty/highest.apex.meta_lic notice", + "testdata/firstparty/highest.apex.meta_lic testdata/firstparty/lib/liba.so.meta_lic testdata/firstparty/lib/liba.so.meta_lic notice", + "testdata/firstparty/highest.apex.meta_lic testdata/firstparty/lib/libb.so.meta_lic testdata/firstparty/lib/libb.so.meta_lic notice", + "testdata/firstparty/highest.apex.meta_lic testdata/firstparty/lib/libc.a.meta_lic testdata/firstparty/lib/libc.a.meta_lic notice", + "testdata/firstparty/lib/liba.so.meta_lic testdata/firstparty/lib/liba.so.meta_lic testdata/firstparty/lib/liba.so.meta_lic notice", + "testdata/firstparty/lib/libb.so.meta_lic testdata/firstparty/lib/libb.so.meta_lic testdata/firstparty/lib/libb.so.meta_lic notice", + "testdata/firstparty/lib/libc.a.meta_lic testdata/firstparty/lib/libc.a.meta_lic testdata/firstparty/lib/libc.a.meta_lic notice", + "testdata/firstparty/lib/libd.so.meta_lic testdata/firstparty/lib/libd.so.meta_lic testdata/firstparty/lib/libd.so.meta_lic notice", + }, + }, + { + condition: "firstparty", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/firstparty/"}, + expectedOut: []string{ + "bin/bin1.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "bin/bin1.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic notice", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic notice", + "bin/bin2.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "highest.apex.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "highest.apex.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "highest.apex.meta_lic highest.apex.meta_lic highest.apex.meta_lic notice", + "highest.apex.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic notice", + "highest.apex.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic notice", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic notice", + "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic notice", + "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic notice", + "lib/libc.a.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic notice", + "lib/libd.so.meta_lic lib/libd.so.meta_lic lib/libd.so.meta_lic notice", + }, + }, + { + condition: "firstparty", + name: "apex_trimmed_notice", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"notice"}, + stripPrefix: "testdata/firstparty/", + }, + expectedOut: []string{ + "bin/bin1.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "bin/bin1.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic notice", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic notice", + "bin/bin2.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "highest.apex.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "highest.apex.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "highest.apex.meta_lic highest.apex.meta_lic highest.apex.meta_lic notice", + "highest.apex.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic notice", + "highest.apex.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic notice", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic notice", + "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic notice", + "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic notice", + }, + }, + { + condition: "firstparty", + name: "apex_trimmed_share", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted"}, + stripPrefix: "testdata/firstparty/", + }, + expectedOut: []string{}, + }, + { + condition: "firstparty", + name: "apex_trimmed_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"proprietary"}, + stripPrefix: "testdata/firstparty/", + }, + expectedOut: []string{}, + }, + { + condition: "firstparty", + name: "apex_trimmed_share_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted", "proprietary"}, + stripPrefix: "testdata/firstparty/", + }, + expectedOut: []string{}, + }, + { + condition: "firstparty", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/firstparty/", labelConditions: true}, + expectedOut: []string{ + "bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice notice", + "bin/bin1.meta_lic:notice lib/liba.so.meta_lic:notice lib/liba.so.meta_lic:notice notice", + "bin/bin1.meta_lic:notice lib/libc.a.meta_lic:notice lib/libc.a.meta_lic:notice notice", + "bin/bin2.meta_lic:notice bin/bin2.meta_lic:notice bin/bin2.meta_lic:notice notice", + "highest.apex.meta_lic:notice bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice notice", + "highest.apex.meta_lic:notice bin/bin2.meta_lic:notice bin/bin2.meta_lic:notice notice", + "highest.apex.meta_lic:notice highest.apex.meta_lic:notice highest.apex.meta_lic:notice notice", + "highest.apex.meta_lic:notice lib/liba.so.meta_lic:notice lib/liba.so.meta_lic:notice notice", + "highest.apex.meta_lic:notice lib/libb.so.meta_lic:notice lib/libb.so.meta_lic:notice notice", + "highest.apex.meta_lic:notice lib/libc.a.meta_lic:notice lib/libc.a.meta_lic:notice notice", + "lib/liba.so.meta_lic:notice lib/liba.so.meta_lic:notice lib/liba.so.meta_lic:notice notice", + "lib/libb.so.meta_lic:notice lib/libb.so.meta_lic:notice lib/libb.so.meta_lic:notice notice", + "lib/libc.a.meta_lic:notice lib/libc.a.meta_lic:notice lib/libc.a.meta_lic:notice notice", + "lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice notice", + }, + }, + { + condition: "firstparty", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []string{ + "testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/bin/bin1.meta_lic notice", + "testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/lib/liba.so.meta_lic testdata/firstparty/lib/liba.so.meta_lic notice", + "testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/lib/libc.a.meta_lic testdata/firstparty/lib/libc.a.meta_lic notice", + "testdata/firstparty/bin/bin2.meta_lic testdata/firstparty/bin/bin2.meta_lic testdata/firstparty/bin/bin2.meta_lic notice", + "testdata/firstparty/container.zip.meta_lic testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/bin/bin1.meta_lic notice", + "testdata/firstparty/container.zip.meta_lic testdata/firstparty/bin/bin2.meta_lic testdata/firstparty/bin/bin2.meta_lic notice", + "testdata/firstparty/container.zip.meta_lic testdata/firstparty/container.zip.meta_lic testdata/firstparty/container.zip.meta_lic notice", + "testdata/firstparty/container.zip.meta_lic testdata/firstparty/lib/liba.so.meta_lic testdata/firstparty/lib/liba.so.meta_lic notice", + "testdata/firstparty/container.zip.meta_lic testdata/firstparty/lib/libb.so.meta_lic testdata/firstparty/lib/libb.so.meta_lic notice", + "testdata/firstparty/container.zip.meta_lic testdata/firstparty/lib/libc.a.meta_lic testdata/firstparty/lib/libc.a.meta_lic notice", + "testdata/firstparty/lib/liba.so.meta_lic testdata/firstparty/lib/liba.so.meta_lic testdata/firstparty/lib/liba.so.meta_lic notice", + "testdata/firstparty/lib/libb.so.meta_lic testdata/firstparty/lib/libb.so.meta_lic testdata/firstparty/lib/libb.so.meta_lic notice", + "testdata/firstparty/lib/libc.a.meta_lic testdata/firstparty/lib/libc.a.meta_lic testdata/firstparty/lib/libc.a.meta_lic notice", + "testdata/firstparty/lib/libd.so.meta_lic testdata/firstparty/lib/libd.so.meta_lic testdata/firstparty/lib/libd.so.meta_lic notice", + }, + }, + { + condition: "firstparty", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []string{ + "testdata/firstparty/application.meta_lic testdata/firstparty/application.meta_lic testdata/firstparty/application.meta_lic notice", + "testdata/firstparty/application.meta_lic testdata/firstparty/lib/liba.so.meta_lic testdata/firstparty/lib/liba.so.meta_lic notice", + "testdata/firstparty/bin/bin3.meta_lic testdata/firstparty/bin/bin3.meta_lic testdata/firstparty/bin/bin3.meta_lic notice", + "testdata/firstparty/lib/liba.so.meta_lic testdata/firstparty/lib/liba.so.meta_lic testdata/firstparty/lib/liba.so.meta_lic notice", + "testdata/firstparty/lib/libb.so.meta_lic testdata/firstparty/lib/libb.so.meta_lic testdata/firstparty/lib/libb.so.meta_lic notice", + }, + }, + { + condition: "firstparty", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []string{ + "testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/bin/bin1.meta_lic notice", + "testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/lib/liba.so.meta_lic testdata/firstparty/lib/liba.so.meta_lic notice", + "testdata/firstparty/bin/bin1.meta_lic testdata/firstparty/lib/libc.a.meta_lic testdata/firstparty/lib/libc.a.meta_lic notice", + "testdata/firstparty/lib/liba.so.meta_lic testdata/firstparty/lib/liba.so.meta_lic testdata/firstparty/lib/liba.so.meta_lic notice", + "testdata/firstparty/lib/libc.a.meta_lic testdata/firstparty/lib/libc.a.meta_lic testdata/firstparty/lib/libc.a.meta_lic notice", + }, + }, + { + condition: "firstparty", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []string{ + "testdata/firstparty/lib/libd.so.meta_lic testdata/firstparty/lib/libd.so.meta_lic testdata/firstparty/lib/libd.so.meta_lic notice", + }, + }, + { + condition: "notice", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []string{ + "testdata/notice/bin/bin1.meta_lic testdata/notice/bin/bin1.meta_lic testdata/notice/bin/bin1.meta_lic notice", + "testdata/notice/bin/bin1.meta_lic testdata/notice/lib/liba.so.meta_lic testdata/notice/lib/liba.so.meta_lic notice", + "testdata/notice/bin/bin1.meta_lic testdata/notice/lib/libc.a.meta_lic testdata/notice/lib/libc.a.meta_lic notice", + "testdata/notice/bin/bin2.meta_lic testdata/notice/bin/bin2.meta_lic testdata/notice/bin/bin2.meta_lic notice", + "testdata/notice/highest.apex.meta_lic testdata/notice/bin/bin1.meta_lic testdata/notice/bin/bin1.meta_lic notice", + "testdata/notice/highest.apex.meta_lic testdata/notice/bin/bin2.meta_lic testdata/notice/bin/bin2.meta_lic notice", + "testdata/notice/highest.apex.meta_lic testdata/notice/highest.apex.meta_lic testdata/notice/highest.apex.meta_lic notice", + "testdata/notice/highest.apex.meta_lic testdata/notice/lib/liba.so.meta_lic testdata/notice/lib/liba.so.meta_lic notice", + "testdata/notice/highest.apex.meta_lic testdata/notice/lib/libb.so.meta_lic testdata/notice/lib/libb.so.meta_lic notice", + "testdata/notice/highest.apex.meta_lic testdata/notice/lib/libc.a.meta_lic testdata/notice/lib/libc.a.meta_lic notice", + "testdata/notice/lib/liba.so.meta_lic testdata/notice/lib/liba.so.meta_lic testdata/notice/lib/liba.so.meta_lic notice", + "testdata/notice/lib/libb.so.meta_lic testdata/notice/lib/libb.so.meta_lic testdata/notice/lib/libb.so.meta_lic notice", + "testdata/notice/lib/libc.a.meta_lic testdata/notice/lib/libc.a.meta_lic testdata/notice/lib/libc.a.meta_lic notice", + "testdata/notice/lib/libd.so.meta_lic testdata/notice/lib/libd.so.meta_lic testdata/notice/lib/libd.so.meta_lic notice", + }, + }, + { + condition: "notice", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/notice/"}, + expectedOut: []string{ + "bin/bin1.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "bin/bin1.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic notice", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic notice", + "bin/bin2.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "highest.apex.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "highest.apex.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "highest.apex.meta_lic highest.apex.meta_lic highest.apex.meta_lic notice", + "highest.apex.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic notice", + "highest.apex.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic notice", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic notice", + "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic notice", + "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic notice", + "lib/libc.a.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic notice", + "lib/libd.so.meta_lic lib/libd.so.meta_lic lib/libd.so.meta_lic notice", + }, + }, + { + condition: "notice", + name: "apex_trimmed_notice", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"notice"}, + stripPrefix: "testdata/notice/", + }, + expectedOut: []string{ + "bin/bin1.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "bin/bin1.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic notice", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic notice", + "bin/bin2.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "highest.apex.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "highest.apex.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "highest.apex.meta_lic highest.apex.meta_lic highest.apex.meta_lic notice", + "highest.apex.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic notice", + "highest.apex.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic notice", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic notice", + "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic notice", + "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic notice", + }, + }, + { + condition: "notice", + name: "apex_trimmed_share", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted"}, + stripPrefix: "testdata/notice/", + }, + expectedOut: []string{}, + }, + { + condition: "notice", + name: "apex_trimmed_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"proprietary"}, + stripPrefix: "testdata/notice/", + }, + expectedOut: []string{}, + }, + { + condition: "notice", + name: "apex_trimmed_share_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted", "proprietary"}, + stripPrefix: "testdata/notice/", + }, + expectedOut: []string{}, + }, + { + condition: "notice", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/notice/", labelConditions: true}, + expectedOut: []string{ + "bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice notice", + "bin/bin1.meta_lic:notice lib/liba.so.meta_lic:notice lib/liba.so.meta_lic:notice notice", + "bin/bin1.meta_lic:notice lib/libc.a.meta_lic:notice lib/libc.a.meta_lic:notice notice", + "bin/bin2.meta_lic:notice bin/bin2.meta_lic:notice bin/bin2.meta_lic:notice notice", + "highest.apex.meta_lic:notice bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice notice", + "highest.apex.meta_lic:notice bin/bin2.meta_lic:notice bin/bin2.meta_lic:notice notice", + "highest.apex.meta_lic:notice highest.apex.meta_lic:notice highest.apex.meta_lic:notice notice", + "highest.apex.meta_lic:notice lib/liba.so.meta_lic:notice lib/liba.so.meta_lic:notice notice", + "highest.apex.meta_lic:notice lib/libb.so.meta_lic:notice lib/libb.so.meta_lic:notice notice", + "highest.apex.meta_lic:notice lib/libc.a.meta_lic:notice lib/libc.a.meta_lic:notice notice", + "lib/liba.so.meta_lic:notice lib/liba.so.meta_lic:notice lib/liba.so.meta_lic:notice notice", + "lib/libb.so.meta_lic:notice lib/libb.so.meta_lic:notice lib/libb.so.meta_lic:notice notice", + "lib/libc.a.meta_lic:notice lib/libc.a.meta_lic:notice lib/libc.a.meta_lic:notice notice", + "lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice notice", + }, + }, + { + condition: "notice", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []string{ + "testdata/notice/bin/bin1.meta_lic testdata/notice/bin/bin1.meta_lic testdata/notice/bin/bin1.meta_lic notice", + "testdata/notice/bin/bin1.meta_lic testdata/notice/lib/liba.so.meta_lic testdata/notice/lib/liba.so.meta_lic notice", + "testdata/notice/bin/bin1.meta_lic testdata/notice/lib/libc.a.meta_lic testdata/notice/lib/libc.a.meta_lic notice", + "testdata/notice/bin/bin2.meta_lic testdata/notice/bin/bin2.meta_lic testdata/notice/bin/bin2.meta_lic notice", + "testdata/notice/container.zip.meta_lic testdata/notice/bin/bin1.meta_lic testdata/notice/bin/bin1.meta_lic notice", + "testdata/notice/container.zip.meta_lic testdata/notice/bin/bin2.meta_lic testdata/notice/bin/bin2.meta_lic notice", + "testdata/notice/container.zip.meta_lic testdata/notice/container.zip.meta_lic testdata/notice/container.zip.meta_lic notice", + "testdata/notice/container.zip.meta_lic testdata/notice/lib/liba.so.meta_lic testdata/notice/lib/liba.so.meta_lic notice", + "testdata/notice/container.zip.meta_lic testdata/notice/lib/libb.so.meta_lic testdata/notice/lib/libb.so.meta_lic notice", + "testdata/notice/container.zip.meta_lic testdata/notice/lib/libc.a.meta_lic testdata/notice/lib/libc.a.meta_lic notice", + "testdata/notice/lib/liba.so.meta_lic testdata/notice/lib/liba.so.meta_lic testdata/notice/lib/liba.so.meta_lic notice", + "testdata/notice/lib/libb.so.meta_lic testdata/notice/lib/libb.so.meta_lic testdata/notice/lib/libb.so.meta_lic notice", + "testdata/notice/lib/libc.a.meta_lic testdata/notice/lib/libc.a.meta_lic testdata/notice/lib/libc.a.meta_lic notice", + "testdata/notice/lib/libd.so.meta_lic testdata/notice/lib/libd.so.meta_lic testdata/notice/lib/libd.so.meta_lic notice", + }, + }, + { + condition: "notice", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []string{ + "testdata/notice/application.meta_lic testdata/notice/application.meta_lic testdata/notice/application.meta_lic notice", + "testdata/notice/application.meta_lic testdata/notice/lib/liba.so.meta_lic testdata/notice/lib/liba.so.meta_lic notice", + "testdata/notice/bin/bin3.meta_lic testdata/notice/bin/bin3.meta_lic testdata/notice/bin/bin3.meta_lic notice", + "testdata/notice/lib/liba.so.meta_lic testdata/notice/lib/liba.so.meta_lic testdata/notice/lib/liba.so.meta_lic notice", + "testdata/notice/lib/libb.so.meta_lic testdata/notice/lib/libb.so.meta_lic testdata/notice/lib/libb.so.meta_lic notice", + }, + }, + { + condition: "notice", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []string{ + "testdata/notice/bin/bin1.meta_lic testdata/notice/bin/bin1.meta_lic testdata/notice/bin/bin1.meta_lic notice", + "testdata/notice/bin/bin1.meta_lic testdata/notice/lib/liba.so.meta_lic testdata/notice/lib/liba.so.meta_lic notice", + "testdata/notice/bin/bin1.meta_lic testdata/notice/lib/libc.a.meta_lic testdata/notice/lib/libc.a.meta_lic notice", + "testdata/notice/lib/liba.so.meta_lic testdata/notice/lib/liba.so.meta_lic testdata/notice/lib/liba.so.meta_lic notice", + "testdata/notice/lib/libc.a.meta_lic testdata/notice/lib/libc.a.meta_lic testdata/notice/lib/libc.a.meta_lic notice", + }, + }, + { + condition: "notice", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []string{ + "testdata/notice/lib/libd.so.meta_lic testdata/notice/lib/libd.so.meta_lic testdata/notice/lib/libd.so.meta_lic notice", + }, + }, + { + condition: "reciprocal", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []string{ + "testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/bin/bin1.meta_lic notice", + "testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/lib/liba.so.meta_lic testdata/reciprocal/lib/liba.so.meta_lic reciprocal", + "testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/lib/libc.a.meta_lic testdata/reciprocal/lib/libc.a.meta_lic reciprocal", + "testdata/reciprocal/bin/bin2.meta_lic testdata/reciprocal/bin/bin2.meta_lic testdata/reciprocal/bin/bin2.meta_lic notice", + "testdata/reciprocal/highest.apex.meta_lic testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/bin/bin1.meta_lic notice", + "testdata/reciprocal/highest.apex.meta_lic testdata/reciprocal/bin/bin2.meta_lic testdata/reciprocal/bin/bin2.meta_lic notice", + "testdata/reciprocal/highest.apex.meta_lic testdata/reciprocal/highest.apex.meta_lic testdata/reciprocal/highest.apex.meta_lic notice", + "testdata/reciprocal/highest.apex.meta_lic testdata/reciprocal/lib/liba.so.meta_lic testdata/reciprocal/lib/liba.so.meta_lic reciprocal", + "testdata/reciprocal/highest.apex.meta_lic testdata/reciprocal/lib/libb.so.meta_lic testdata/reciprocal/lib/libb.so.meta_lic notice", + "testdata/reciprocal/highest.apex.meta_lic testdata/reciprocal/lib/libc.a.meta_lic testdata/reciprocal/lib/libc.a.meta_lic reciprocal", + "testdata/reciprocal/lib/liba.so.meta_lic testdata/reciprocal/lib/liba.so.meta_lic testdata/reciprocal/lib/liba.so.meta_lic reciprocal", + "testdata/reciprocal/lib/libb.so.meta_lic testdata/reciprocal/lib/libb.so.meta_lic testdata/reciprocal/lib/libb.so.meta_lic notice", + "testdata/reciprocal/lib/libc.a.meta_lic testdata/reciprocal/lib/libc.a.meta_lic testdata/reciprocal/lib/libc.a.meta_lic reciprocal", + "testdata/reciprocal/lib/libd.so.meta_lic testdata/reciprocal/lib/libd.so.meta_lic testdata/reciprocal/lib/libd.so.meta_lic notice", + }, + }, + { + condition: "reciprocal", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/reciprocal/"}, + expectedOut: []string{ + "bin/bin1.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "bin/bin1.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic reciprocal", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", + "bin/bin2.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "highest.apex.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "highest.apex.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "highest.apex.meta_lic highest.apex.meta_lic highest.apex.meta_lic notice", + "highest.apex.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic reciprocal", + "highest.apex.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic notice", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", + "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic reciprocal", + "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic notice", + "lib/libc.a.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", + "lib/libd.so.meta_lic lib/libd.so.meta_lic lib/libd.so.meta_lic notice", + }, + }, + { + condition: "reciprocal", + name: "apex_trimmed_notice", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"notice"}, + stripPrefix: "testdata/reciprocal/", + }, + expectedOut: []string{ + "bin/bin1.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "bin/bin2.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "highest.apex.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "highest.apex.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "highest.apex.meta_lic highest.apex.meta_lic highest.apex.meta_lic notice", + "highest.apex.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic notice", + "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic notice", + }, + }, + { + condition: "reciprocal", + name: "apex_trimmed_share", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted"}, + stripPrefix: "testdata/reciprocal/", + }, + expectedOut: []string{ + "bin/bin1.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic reciprocal", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", + "highest.apex.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic reciprocal", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", + "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic reciprocal", + }, + }, + { + condition: "reciprocal", + name: "apex_trimmed_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"proprietary"}, + stripPrefix: "testdata/reciprocal/", + }, + expectedOut: []string{}, + }, + { + condition: "reciprocal", + name: "apex_trimmed_share_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted", "proprietary"}, + stripPrefix: "testdata/reciprocal/", + }, + expectedOut: []string{ + "bin/bin1.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic reciprocal", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", + "highest.apex.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic reciprocal", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", + "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic reciprocal", + }, + }, + { + condition: "reciprocal", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/reciprocal/", labelConditions: true}, + expectedOut: []string{ + "bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice notice", + "bin/bin1.meta_lic:notice lib/liba.so.meta_lic:reciprocal lib/liba.so.meta_lic:reciprocal reciprocal", + "bin/bin1.meta_lic:notice lib/libc.a.meta_lic:reciprocal lib/libc.a.meta_lic:reciprocal reciprocal", + "bin/bin2.meta_lic:notice bin/bin2.meta_lic:notice bin/bin2.meta_lic:notice notice", + "highest.apex.meta_lic:notice bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice notice", + "highest.apex.meta_lic:notice bin/bin2.meta_lic:notice bin/bin2.meta_lic:notice notice", + "highest.apex.meta_lic:notice highest.apex.meta_lic:notice highest.apex.meta_lic:notice notice", + "highest.apex.meta_lic:notice lib/liba.so.meta_lic:reciprocal lib/liba.so.meta_lic:reciprocal reciprocal", + "highest.apex.meta_lic:notice lib/libb.so.meta_lic:notice lib/libb.so.meta_lic:notice notice", + "highest.apex.meta_lic:notice lib/libc.a.meta_lic:reciprocal lib/libc.a.meta_lic:reciprocal reciprocal", + "lib/liba.so.meta_lic:reciprocal lib/liba.so.meta_lic:reciprocal lib/liba.so.meta_lic:reciprocal reciprocal", + "lib/libb.so.meta_lic:notice lib/libb.so.meta_lic:notice lib/libb.so.meta_lic:notice notice", + "lib/libc.a.meta_lic:reciprocal lib/libc.a.meta_lic:reciprocal lib/libc.a.meta_lic:reciprocal reciprocal", + "lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice notice", + }, + }, + { + condition: "reciprocal", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []string{ + "testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/bin/bin1.meta_lic notice", + "testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/lib/liba.so.meta_lic testdata/reciprocal/lib/liba.so.meta_lic reciprocal", + "testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/lib/libc.a.meta_lic testdata/reciprocal/lib/libc.a.meta_lic reciprocal", + "testdata/reciprocal/bin/bin2.meta_lic testdata/reciprocal/bin/bin2.meta_lic testdata/reciprocal/bin/bin2.meta_lic notice", + "testdata/reciprocal/container.zip.meta_lic testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/bin/bin1.meta_lic notice", + "testdata/reciprocal/container.zip.meta_lic testdata/reciprocal/bin/bin2.meta_lic testdata/reciprocal/bin/bin2.meta_lic notice", + "testdata/reciprocal/container.zip.meta_lic testdata/reciprocal/container.zip.meta_lic testdata/reciprocal/container.zip.meta_lic notice", + "testdata/reciprocal/container.zip.meta_lic testdata/reciprocal/lib/liba.so.meta_lic testdata/reciprocal/lib/liba.so.meta_lic reciprocal", + "testdata/reciprocal/container.zip.meta_lic testdata/reciprocal/lib/libb.so.meta_lic testdata/reciprocal/lib/libb.so.meta_lic notice", + "testdata/reciprocal/container.zip.meta_lic testdata/reciprocal/lib/libc.a.meta_lic testdata/reciprocal/lib/libc.a.meta_lic reciprocal", + "testdata/reciprocal/lib/liba.so.meta_lic testdata/reciprocal/lib/liba.so.meta_lic testdata/reciprocal/lib/liba.so.meta_lic reciprocal", + "testdata/reciprocal/lib/libb.so.meta_lic testdata/reciprocal/lib/libb.so.meta_lic testdata/reciprocal/lib/libb.so.meta_lic notice", + "testdata/reciprocal/lib/libc.a.meta_lic testdata/reciprocal/lib/libc.a.meta_lic testdata/reciprocal/lib/libc.a.meta_lic reciprocal", + "testdata/reciprocal/lib/libd.so.meta_lic testdata/reciprocal/lib/libd.so.meta_lic testdata/reciprocal/lib/libd.so.meta_lic notice", + }, + }, + { + condition: "reciprocal", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []string{ + "testdata/reciprocal/application.meta_lic testdata/reciprocal/application.meta_lic testdata/reciprocal/application.meta_lic notice", + "testdata/reciprocal/application.meta_lic testdata/reciprocal/lib/liba.so.meta_lic testdata/reciprocal/lib/liba.so.meta_lic reciprocal", + "testdata/reciprocal/bin/bin3.meta_lic testdata/reciprocal/bin/bin3.meta_lic testdata/reciprocal/bin/bin3.meta_lic notice", + "testdata/reciprocal/lib/liba.so.meta_lic testdata/reciprocal/lib/liba.so.meta_lic testdata/reciprocal/lib/liba.so.meta_lic reciprocal", + "testdata/reciprocal/lib/libb.so.meta_lic testdata/reciprocal/lib/libb.so.meta_lic testdata/reciprocal/lib/libb.so.meta_lic notice", + }, + }, + { + condition: "reciprocal", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []string{ + "testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/bin/bin1.meta_lic notice", + "testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/lib/liba.so.meta_lic testdata/reciprocal/lib/liba.so.meta_lic reciprocal", + "testdata/reciprocal/bin/bin1.meta_lic testdata/reciprocal/lib/libc.a.meta_lic testdata/reciprocal/lib/libc.a.meta_lic reciprocal", + "testdata/reciprocal/lib/liba.so.meta_lic testdata/reciprocal/lib/liba.so.meta_lic testdata/reciprocal/lib/liba.so.meta_lic reciprocal", + "testdata/reciprocal/lib/libc.a.meta_lic testdata/reciprocal/lib/libc.a.meta_lic testdata/reciprocal/lib/libc.a.meta_lic reciprocal", + }, + }, + { + condition: "reciprocal", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []string{ + "testdata/reciprocal/lib/libd.so.meta_lic testdata/reciprocal/lib/libd.so.meta_lic testdata/reciprocal/lib/libd.so.meta_lic notice", + }, + }, + { + condition: "restricted", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []string{ + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/bin/bin1.meta_lic testdata/restricted/bin/bin1.meta_lic notice", + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", + "testdata/restricted/bin/bin2.meta_lic testdata/restricted/bin/bin2.meta_lic testdata/restricted/bin/bin2.meta_lic notice", + "testdata/restricted/bin/bin2.meta_lic testdata/restricted/bin/bin2.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/bin/bin2.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/bin/bin2.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/bin/bin1.meta_lic testdata/restricted/bin/bin1.meta_lic notice", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/bin/bin2.meta_lic testdata/restricted/bin/bin2.meta_lic notice", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/bin/bin2.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/highest.apex.meta_lic testdata/restricted/highest.apex.meta_lic notice", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/highest.apex.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/highest.apex.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", + "testdata/restricted/highest.apex.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", + "testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic notice", + }, + }, + { + condition: "restricted", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/restricted/"}, + expectedOut: []string{ + "bin/bin1.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "bin/bin1.meta_lic bin/bin1.meta_lic lib/liba.so.meta_lic restricted", + "bin/bin1.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic restricted", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/liba.so.meta_lic restricted", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", + "bin/bin2.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "bin/bin2.meta_lic bin/bin2.meta_lic lib/libb.so.meta_lic restricted", + "bin/bin2.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + "bin/bin2.meta_lic lib/libd.so.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "highest.apex.meta_lic bin/bin1.meta_lic lib/liba.so.meta_lic restricted", + "highest.apex.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "highest.apex.meta_lic bin/bin2.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic highest.apex.meta_lic highest.apex.meta_lic notice", + "highest.apex.meta_lic highest.apex.meta_lic lib/liba.so.meta_lic restricted", + "highest.apex.meta_lic highest.apex.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic restricted", + "highest.apex.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/liba.so.meta_lic restricted", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", + "highest.apex.meta_lic lib/libd.so.meta_lic lib/libb.so.meta_lic restricted", + "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic restricted", + "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + "lib/libc.a.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", + "lib/libd.so.meta_lic lib/libd.so.meta_lic lib/libd.so.meta_lic notice", + }, + }, + { + condition: "restricted", + name: "apex_trimmed_notice", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"notice"}, + stripPrefix: "testdata/restricted/", + }, + expectedOut: []string{ + "bin/bin1.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "bin/bin2.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "highest.apex.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "highest.apex.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic notice", + "highest.apex.meta_lic highest.apex.meta_lic highest.apex.meta_lic notice", + }, + }, + { + condition: "restricted", + name: "apex_trimmed_share", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted"}, + stripPrefix: "testdata/restricted/", + }, + expectedOut: []string{ + "bin/bin1.meta_lic bin/bin1.meta_lic lib/liba.so.meta_lic restricted", + "bin/bin1.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic restricted", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/liba.so.meta_lic restricted", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", + "bin/bin2.meta_lic bin/bin2.meta_lic lib/libb.so.meta_lic restricted", + "bin/bin2.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic bin/bin1.meta_lic lib/liba.so.meta_lic restricted", + "highest.apex.meta_lic bin/bin2.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic highest.apex.meta_lic lib/liba.so.meta_lic restricted", + "highest.apex.meta_lic highest.apex.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic restricted", + "highest.apex.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/liba.so.meta_lic restricted", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", + "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic restricted", + "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + }, + }, + { + condition: "restricted", + name: "apex_trimmed_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"proprietary"}, + stripPrefix: "testdata/restricted/", + }, + expectedOut: []string{}, + }, + { + condition: "restricted", + name: "apex_trimmed_share_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted", "proprietary"}, + stripPrefix: "testdata/restricted/", + }, + expectedOut: []string{ + "bin/bin1.meta_lic bin/bin1.meta_lic lib/liba.so.meta_lic restricted", + "bin/bin1.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic restricted", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/liba.so.meta_lic restricted", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", + "bin/bin2.meta_lic bin/bin2.meta_lic lib/libb.so.meta_lic restricted", + "bin/bin2.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic bin/bin1.meta_lic lib/liba.so.meta_lic restricted", + "highest.apex.meta_lic bin/bin2.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic highest.apex.meta_lic lib/liba.so.meta_lic restricted", + "highest.apex.meta_lic highest.apex.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic restricted", + "highest.apex.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/liba.so.meta_lic restricted", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic reciprocal", + "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic restricted", + "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + }, + }, + { + condition: "restricted", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/restricted/", labelConditions: true}, + expectedOut: []string{ + "bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice notice", + "bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice lib/liba.so.meta_lic:restricted restricted", + "bin/bin1.meta_lic:notice lib/liba.so.meta_lic:restricted lib/liba.so.meta_lic:restricted restricted", + "bin/bin1.meta_lic:notice lib/libc.a.meta_lic:reciprocal lib/liba.so.meta_lic:restricted restricted", + "bin/bin1.meta_lic:notice lib/libc.a.meta_lic:reciprocal lib/libc.a.meta_lic:reciprocal reciprocal", + "bin/bin2.meta_lic:notice bin/bin2.meta_lic:notice bin/bin2.meta_lic:notice notice", + "bin/bin2.meta_lic:notice bin/bin2.meta_lic:notice lib/libb.so.meta_lic:restricted restricted", + "bin/bin2.meta_lic:notice lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted restricted", + "bin/bin2.meta_lic:notice lib/libd.so.meta_lic:notice lib/libb.so.meta_lic:restricted restricted", + "highest.apex.meta_lic:notice bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice notice", + "highest.apex.meta_lic:notice bin/bin1.meta_lic:notice lib/liba.so.meta_lic:restricted restricted", + "highest.apex.meta_lic:notice bin/bin2.meta_lic:notice bin/bin2.meta_lic:notice notice", + "highest.apex.meta_lic:notice bin/bin2.meta_lic:notice lib/libb.so.meta_lic:restricted restricted", + "highest.apex.meta_lic:notice highest.apex.meta_lic:notice highest.apex.meta_lic:notice notice", + "highest.apex.meta_lic:notice highest.apex.meta_lic:notice lib/liba.so.meta_lic:restricted restricted", + "highest.apex.meta_lic:notice highest.apex.meta_lic:notice lib/libb.so.meta_lic:restricted restricted", + "highest.apex.meta_lic:notice lib/liba.so.meta_lic:restricted lib/liba.so.meta_lic:restricted restricted", + "highest.apex.meta_lic:notice lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted restricted", + "highest.apex.meta_lic:notice lib/libc.a.meta_lic:reciprocal lib/liba.so.meta_lic:restricted restricted", + "highest.apex.meta_lic:notice lib/libc.a.meta_lic:reciprocal lib/libc.a.meta_lic:reciprocal reciprocal", + "highest.apex.meta_lic:notice lib/libd.so.meta_lic:notice lib/libb.so.meta_lic:restricted restricted", + "lib/liba.so.meta_lic:restricted lib/liba.so.meta_lic:restricted lib/liba.so.meta_lic:restricted restricted", + "lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted restricted", + "lib/libc.a.meta_lic:reciprocal lib/libc.a.meta_lic:reciprocal lib/libc.a.meta_lic:reciprocal reciprocal", + "lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice notice", + }, + }, + { + condition: "restricted", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []string{ + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/bin/bin1.meta_lic testdata/restricted/bin/bin1.meta_lic notice", + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", + "testdata/restricted/bin/bin2.meta_lic testdata/restricted/bin/bin2.meta_lic testdata/restricted/bin/bin2.meta_lic notice", + "testdata/restricted/bin/bin2.meta_lic testdata/restricted/bin/bin2.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/bin/bin2.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/bin/bin2.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/container.zip.meta_lic testdata/restricted/bin/bin1.meta_lic testdata/restricted/bin/bin1.meta_lic notice", + "testdata/restricted/container.zip.meta_lic testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/container.zip.meta_lic testdata/restricted/bin/bin2.meta_lic testdata/restricted/bin/bin2.meta_lic notice", + "testdata/restricted/container.zip.meta_lic testdata/restricted/bin/bin2.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/container.zip.meta_lic testdata/restricted/container.zip.meta_lic testdata/restricted/container.zip.meta_lic notice", + "testdata/restricted/container.zip.meta_lic testdata/restricted/container.zip.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/container.zip.meta_lic testdata/restricted/container.zip.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/container.zip.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/container.zip.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/container.zip.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/container.zip.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", + "testdata/restricted/container.zip.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", + "testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic notice", + }, + }, + { + condition: "restricted", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []string{ + "testdata/restricted/application.meta_lic testdata/restricted/application.meta_lic testdata/restricted/application.meta_lic notice", + "testdata/restricted/application.meta_lic testdata/restricted/application.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/application.meta_lic testdata/restricted/application.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/application.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/application.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/application.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + "testdata/restricted/bin/bin3.meta_lic testdata/restricted/bin/bin3.meta_lic testdata/restricted/bin/bin3.meta_lic restricted", + "testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic testdata/restricted/lib/libb.so.meta_lic restricted", + }, + }, + { + condition: "restricted", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []string{ + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/bin/bin1.meta_lic testdata/restricted/bin/bin1.meta_lic notice", + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/bin/bin1.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", + "testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic testdata/restricted/lib/liba.so.meta_lic restricted", + "testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic testdata/restricted/lib/libc.a.meta_lic reciprocal", + }, + }, + { + condition: "restricted", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []string{ + "testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic testdata/restricted/lib/libd.so.meta_lic notice", + }, + }, + { + condition: "proprietary", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []string{ + "testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/bin/bin1.meta_lic notice", + "testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", + "testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic by_exception_only:proprietary", + "testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/bin/bin2.meta_lic by_exception_only:proprietary", + "testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/highest.apex.meta_lic testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/bin/bin1.meta_lic notice", + "testdata/proprietary/highest.apex.meta_lic testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/bin/bin2.meta_lic by_exception_only:proprietary", + "testdata/proprietary/highest.apex.meta_lic testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/highest.apex.meta_lic testdata/proprietary/highest.apex.meta_lic testdata/proprietary/highest.apex.meta_lic notice", + "testdata/proprietary/highest.apex.meta_lic testdata/proprietary/highest.apex.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/highest.apex.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", + "testdata/proprietary/highest.apex.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/highest.apex.meta_lic testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic by_exception_only:proprietary", + "testdata/proprietary/highest.apex.meta_lic testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", + "testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic by_exception_only:proprietary", + "testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic notice", + }, + }, + { + condition: "proprietary", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/proprietary/"}, + expectedOut: []string{ + "bin/bin1.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "bin/bin1.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic by_exception_only:proprietary", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic by_exception_only:proprietary", + "bin/bin2.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic by_exception_only:proprietary", + "bin/bin2.meta_lic bin/bin2.meta_lic lib/libb.so.meta_lic restricted", + "bin/bin2.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + "bin/bin2.meta_lic lib/libd.so.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "highest.apex.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic by_exception_only:proprietary", + "highest.apex.meta_lic bin/bin2.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic highest.apex.meta_lic highest.apex.meta_lic notice", + "highest.apex.meta_lic highest.apex.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic by_exception_only:proprietary", + "highest.apex.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic by_exception_only:proprietary", + "highest.apex.meta_lic lib/libd.so.meta_lic lib/libb.so.meta_lic restricted", + "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic by_exception_only:proprietary", + "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + "lib/libc.a.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic by_exception_only:proprietary", + "lib/libd.so.meta_lic lib/libd.so.meta_lic lib/libd.so.meta_lic notice", + }, + }, + { + condition: "proprietary", + name: "apex_trimmed_notice", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"notice"}, + stripPrefix: "testdata/proprietary/", + }, + expectedOut: []string{ + "bin/bin1.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "highest.apex.meta_lic bin/bin1.meta_lic bin/bin1.meta_lic notice", + "highest.apex.meta_lic highest.apex.meta_lic highest.apex.meta_lic notice", + }, + }, + { + condition: "proprietary", + name: "apex_trimmed_share", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted"}, + stripPrefix: "testdata/proprietary/", + }, + expectedOut: []string{ + "bin/bin2.meta_lic bin/bin2.meta_lic lib/libb.so.meta_lic restricted", + "bin/bin2.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic bin/bin2.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic highest.apex.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + }, + }, + { + condition: "proprietary", + name: "apex_trimmed_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"proprietary"}, + stripPrefix: "testdata/proprietary/", + }, + expectedOut: []string{ + "bin/bin1.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic proprietary", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic proprietary", + "bin/bin2.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic proprietary", + "highest.apex.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic proprietary", + "highest.apex.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic proprietary", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic proprietary", + "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic proprietary", + }, + }, + { + condition: "proprietary", + name: "apex_trimmed_share_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted", "proprietary"}, + stripPrefix: "testdata/proprietary/", + }, + expectedOut: []string{ + "bin/bin1.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic proprietary", + "bin/bin1.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic proprietary", + "bin/bin2.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic proprietary", + "bin/bin2.meta_lic bin/bin2.meta_lic lib/libb.so.meta_lic restricted", + "bin/bin2.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic bin/bin2.meta_lic bin/bin2.meta_lic proprietary", + "highest.apex.meta_lic bin/bin2.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic highest.apex.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic proprietary", + "highest.apex.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + "highest.apex.meta_lic lib/libc.a.meta_lic lib/libc.a.meta_lic proprietary", + "lib/liba.so.meta_lic lib/liba.so.meta_lic lib/liba.so.meta_lic proprietary", + "lib/libb.so.meta_lic lib/libb.so.meta_lic lib/libb.so.meta_lic restricted", + }, + }, + { + condition: "proprietary", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/proprietary/", labelConditions: true}, + expectedOut: []string{ + "bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice notice", + "bin/bin1.meta_lic:notice lib/liba.so.meta_lic:by_exception_only:proprietary lib/liba.so.meta_lic:by_exception_only:proprietary by_exception_only:proprietary", + "bin/bin1.meta_lic:notice lib/libc.a.meta_lic:by_exception_only:proprietary lib/libc.a.meta_lic:by_exception_only:proprietary by_exception_only:proprietary", + "bin/bin2.meta_lic:by_exception_only:proprietary bin/bin2.meta_lic:by_exception_only:proprietary bin/bin2.meta_lic:by_exception_only:proprietary by_exception_only:proprietary", + "bin/bin2.meta_lic:by_exception_only:proprietary bin/bin2.meta_lic:by_exception_only:proprietary lib/libb.so.meta_lic:restricted restricted", + "bin/bin2.meta_lic:by_exception_only:proprietary lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted restricted", + "bin/bin2.meta_lic:by_exception_only:proprietary lib/libd.so.meta_lic:notice lib/libb.so.meta_lic:restricted restricted", + "highest.apex.meta_lic:notice bin/bin1.meta_lic:notice bin/bin1.meta_lic:notice notice", + "highest.apex.meta_lic:notice bin/bin2.meta_lic:by_exception_only:proprietary bin/bin2.meta_lic:by_exception_only:proprietary by_exception_only:proprietary", + "highest.apex.meta_lic:notice bin/bin2.meta_lic:by_exception_only:proprietary lib/libb.so.meta_lic:restricted restricted", + "highest.apex.meta_lic:notice highest.apex.meta_lic:notice highest.apex.meta_lic:notice notice", + "highest.apex.meta_lic:notice highest.apex.meta_lic:notice lib/libb.so.meta_lic:restricted restricted", + "highest.apex.meta_lic:notice lib/liba.so.meta_lic:by_exception_only:proprietary lib/liba.so.meta_lic:by_exception_only:proprietary by_exception_only:proprietary", + "highest.apex.meta_lic:notice lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted restricted", + "highest.apex.meta_lic:notice lib/libc.a.meta_lic:by_exception_only:proprietary lib/libc.a.meta_lic:by_exception_only:proprietary by_exception_only:proprietary", + "highest.apex.meta_lic:notice lib/libd.so.meta_lic:notice lib/libb.so.meta_lic:restricted restricted", + "lib/liba.so.meta_lic:by_exception_only:proprietary lib/liba.so.meta_lic:by_exception_only:proprietary lib/liba.so.meta_lic:by_exception_only:proprietary by_exception_only:proprietary", + "lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted lib/libb.so.meta_lic:restricted restricted", + "lib/libc.a.meta_lic:by_exception_only:proprietary lib/libc.a.meta_lic:by_exception_only:proprietary lib/libc.a.meta_lic:by_exception_only:proprietary by_exception_only:proprietary", + "lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice lib/libd.so.meta_lic:notice notice", + }, + }, + { + condition: "proprietary", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []string{ + "testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/bin/bin1.meta_lic notice", + "testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", + "testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic by_exception_only:proprietary", + "testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/bin/bin2.meta_lic by_exception_only:proprietary", + "testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/container.zip.meta_lic testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/bin/bin1.meta_lic notice", + "testdata/proprietary/container.zip.meta_lic testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/bin/bin2.meta_lic by_exception_only:proprietary", + "testdata/proprietary/container.zip.meta_lic testdata/proprietary/bin/bin2.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/container.zip.meta_lic testdata/proprietary/container.zip.meta_lic testdata/proprietary/container.zip.meta_lic notice", + "testdata/proprietary/container.zip.meta_lic testdata/proprietary/container.zip.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/container.zip.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", + "testdata/proprietary/container.zip.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/container.zip.meta_lic testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic by_exception_only:proprietary", + "testdata/proprietary/container.zip.meta_lic testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", + "testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic by_exception_only:proprietary", + "testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic notice", + }, + }, + { + condition: "proprietary", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []string{ + "testdata/proprietary/application.meta_lic testdata/proprietary/application.meta_lic testdata/proprietary/application.meta_lic notice", + "testdata/proprietary/application.meta_lic testdata/proprietary/application.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/application.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", + "testdata/proprietary/application.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/application.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + "testdata/proprietary/bin/bin3.meta_lic testdata/proprietary/bin/bin3.meta_lic testdata/proprietary/bin/bin3.meta_lic restricted", + "testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", + "testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic testdata/proprietary/lib/libb.so.meta_lic restricted", + }, + }, + { + condition: "proprietary", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []string{ + "testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/bin/bin1.meta_lic notice", + "testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", + "testdata/proprietary/bin/bin1.meta_lic testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic by_exception_only:proprietary", + "testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic testdata/proprietary/lib/liba.so.meta_lic by_exception_only:proprietary", + "testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic testdata/proprietary/lib/libc.a.meta_lic by_exception_only:proprietary", + }, + }, + { + condition: "proprietary", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []string{ + "testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic testdata/proprietary/lib/libd.so.meta_lic notice", + }, + }, + } + for _, tt := range tests { + t.Run(tt.condition+" "+tt.name, func(t *testing.T) { + expectedOut := &bytes.Buffer{} + for _, eo := range tt.expectedOut { + expectedOut.WriteString(eo) + expectedOut.WriteString("\n") + } + + stdout := &bytes.Buffer{} + stderr := &bytes.Buffer{} + + rootFiles := make([]string, 0, len(tt.roots)) + for _, r := range tt.roots { + rootFiles = append(rootFiles, "testdata/"+tt.condition+"/"+r) + } + err := dumpResolutions(&tt.ctx, stdout, stderr, rootFiles...) + if err != nil { + t.Fatalf("dumpresolutions: error = %v, stderr = %v", err, stderr) + return + } + if stderr.Len() > 0 { + t.Errorf("dumpresolutions: gotStderr = %v, want none", stderr) + } + out := stdout.String() + expected := expectedOut.String() + if out != expected { + outList := strings.Split(out, "\n") + expectedList := strings.Split(expected, "\n") + startLine := 0 + for len(outList) > startLine && len(expectedList) > startLine && outList[startLine] == expectedList[startLine] { + startLine++ + } + t.Errorf("listshare: gotStdout = %v, want %v, somewhere near line %d Stdout = %v, want %v", + out, expected, startLine+1, outList[startLine], expectedList[startLine]) + } + }) + } +} + +type testContext struct { + nextNode int + nodes map[string]string +} + +type matcher interface { + matchString(*testContext) string + typeString() string +} + +type targetMatcher struct { + target string + conditions []string +} + +func (tm *targetMatcher) matchString(ctx *testContext) string { + m := tm.target + if len(tm.conditions) > 0 { + m += "\\n" + strings.Join(tm.conditions, "\\n") + } + m = ctx.nodes[tm.target] + " [label=\"" + m + "\"];" + return m +} + +func (tm *targetMatcher) typeString() string { + return "target" +} + +type resolutionMatcher struct { + appliesTo string + actsOn string + origin string + conditions []string +} + +func (rm *resolutionMatcher) matchString(ctx *testContext) string { + return ctx.nodes[rm.appliesTo] + " -> " + ctx.nodes[rm.actsOn] + "; " + + ctx.nodes[rm.actsOn] + " -> " + ctx.nodes[rm.origin] + + " [label=\"" + strings.Join(rm.conditions, "\\n") + "\"];" +} + +func (rm *resolutionMatcher) typeString() string { + return "resolution" +} + +type getMatcher func(*testContext) matcher + +func matchTarget(target string, conditions ...string) getMatcher { + return func(ctx *testContext) matcher { + ctx.nodes[target] = fmt.Sprintf("n%d", ctx.nextNode) + ctx.nextNode++ + return &targetMatcher{target, append([]string{}, conditions...)} + } +} + +func matchResolution(appliesTo, actsOn, origin string, conditions ...string) getMatcher { + return func(ctx *testContext) matcher { + if _, ok := ctx.nodes[appliesTo]; !ok { + ctx.nodes[appliesTo] = fmt.Sprintf("unknown%d", ctx.nextNode) + ctx.nextNode++ + } + if _, ok := ctx.nodes[actsOn]; !ok { + ctx.nodes[actsOn] = fmt.Sprintf("unknown%d", ctx.nextNode) + ctx.nextNode++ + } + if _, ok := ctx.nodes[origin]; !ok { + ctx.nodes[origin] = fmt.Sprintf("unknown%d", ctx.nextNode) + ctx.nextNode++ + } + return &resolutionMatcher{appliesTo, actsOn, origin, append([]string{}, conditions...)} + } +} + +func Test_graphviz(t *testing.T) { + tests := []struct { + condition string + name string + roots []string + ctx context + expectedOut []getMatcher + }{ + { + condition: "firstparty", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/firstparty/bin/bin1.meta_lic"), + matchTarget("testdata/firstparty/lib/liba.so.meta_lic"), + matchTarget("testdata/firstparty/lib/libc.a.meta_lic"), + matchTarget("testdata/firstparty/bin/bin2.meta_lic"), + matchTarget("testdata/firstparty/highest.apex.meta_lic"), + matchTarget("testdata/firstparty/lib/libb.so.meta_lic"), + matchTarget("testdata/firstparty/lib/libd.so.meta_lic"), + matchResolution( + "testdata/firstparty/bin/bin1.meta_lic", + "testdata/firstparty/bin/bin1.meta_lic", + "testdata/firstparty/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/bin/bin1.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/bin/bin1.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/bin/bin2.meta_lic", + "testdata/firstparty/bin/bin2.meta_lic", + "testdata/firstparty/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/highest.apex.meta_lic", + "testdata/firstparty/bin/bin1.meta_lic", + "testdata/firstparty/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/highest.apex.meta_lic", + "testdata/firstparty/bin/bin2.meta_lic", + "testdata/firstparty/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/highest.apex.meta_lic", + "testdata/firstparty/highest.apex.meta_lic", + "testdata/firstparty/highest.apex.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/highest.apex.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/highest.apex.meta_lic", + "testdata/firstparty/lib/libb.so.meta_lic", + "testdata/firstparty/lib/libb.so.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/highest.apex.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/lib/liba.so.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/lib/libb.so.meta_lic", + "testdata/firstparty/lib/libb.so.meta_lic", + "testdata/firstparty/lib/libb.so.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/lib/libc.a.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/lib/libd.so.meta_lic", + "testdata/firstparty/lib/libd.so.meta_lic", + "testdata/firstparty/lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "firstparty", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/firstparty/"}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchTarget("lib/libd.so.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + matchResolution( + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "firstparty", + name: "apex_trimmed_notice", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"notice"}, + stripPrefix: "testdata/firstparty/", + }, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + }, + }, + { + condition: "firstparty", + name: "apex_trimmed_share", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted"}, + stripPrefix: "testdata/firstparty/", + }, + expectedOut: []getMatcher{}, + }, + { + condition: "firstparty", + name: "apex_trimmed_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"proprietary"}, + stripPrefix: "testdata/firstparty/", + }, + expectedOut: []getMatcher{}, + }, + { + condition: "firstparty", + name: "apex_trimmed_share_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted", "proprietary"}, + stripPrefix: "testdata/firstparty/", + }, + expectedOut: []getMatcher{}, + }, + { + condition: "firstparty", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/firstparty/", labelConditions: true}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic", "notice"), + matchTarget("lib/liba.so.meta_lic", "notice"), + matchTarget("lib/libc.a.meta_lic", "notice"), + matchTarget("bin/bin2.meta_lic", "notice"), + matchTarget("highest.apex.meta_lic", "notice"), + matchTarget("lib/libb.so.meta_lic", "notice"), + matchTarget("lib/libd.so.meta_lic", "notice"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + matchResolution( + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "firstparty", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/firstparty/bin/bin1.meta_lic"), + matchTarget("testdata/firstparty/lib/liba.so.meta_lic"), + matchTarget("testdata/firstparty/lib/libc.a.meta_lic"), + matchTarget("testdata/firstparty/bin/bin2.meta_lic"), + matchTarget("testdata/firstparty/container.zip.meta_lic"), + matchTarget("testdata/firstparty/lib/libb.so.meta_lic"), + matchTarget("testdata/firstparty/lib/libd.so.meta_lic"), + matchResolution( + "testdata/firstparty/bin/bin1.meta_lic", + "testdata/firstparty/bin/bin1.meta_lic", + "testdata/firstparty/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/bin/bin1.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/bin/bin1.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/bin/bin2.meta_lic", + "testdata/firstparty/bin/bin2.meta_lic", + "testdata/firstparty/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/container.zip.meta_lic", + "testdata/firstparty/bin/bin1.meta_lic", + "testdata/firstparty/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/container.zip.meta_lic", + "testdata/firstparty/bin/bin2.meta_lic", + "testdata/firstparty/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/container.zip.meta_lic", + "testdata/firstparty/container.zip.meta_lic", + "testdata/firstparty/container.zip.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/container.zip.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/container.zip.meta_lic", + "testdata/firstparty/lib/libb.so.meta_lic", + "testdata/firstparty/lib/libb.so.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/container.zip.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/lib/liba.so.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/lib/libb.so.meta_lic", + "testdata/firstparty/lib/libb.so.meta_lic", + "testdata/firstparty/lib/libb.so.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/lib/libc.a.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/lib/libd.so.meta_lic", + "testdata/firstparty/lib/libd.so.meta_lic", + "testdata/firstparty/lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "firstparty", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/firstparty/application.meta_lic"), + matchTarget("testdata/firstparty/lib/liba.so.meta_lic"), + matchTarget("testdata/firstparty/bin/bin3.meta_lic"), + matchTarget("testdata/firstparty/lib/libb.so.meta_lic"), + matchResolution( + "testdata/firstparty/application.meta_lic", + "testdata/firstparty/application.meta_lic", + "testdata/firstparty/application.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/application.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/bin/bin3.meta_lic", + "testdata/firstparty/bin/bin3.meta_lic", + "testdata/firstparty/bin/bin3.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/lib/liba.so.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/lib/libb.so.meta_lic", + "testdata/firstparty/lib/libb.so.meta_lic", + "testdata/firstparty/lib/libb.so.meta_lic", + "notice"), + }, + }, + { + condition: "firstparty", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/firstparty/bin/bin1.meta_lic"), + matchTarget("testdata/firstparty/lib/liba.so.meta_lic"), + matchTarget("testdata/firstparty/lib/libc.a.meta_lic"), + matchResolution( + "testdata/firstparty/bin/bin1.meta_lic", + "testdata/firstparty/bin/bin1.meta_lic", + "testdata/firstparty/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/bin/bin1.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/bin/bin1.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/lib/liba.so.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "testdata/firstparty/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/firstparty/lib/libc.a.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "testdata/firstparty/lib/libc.a.meta_lic", + "notice"), + }, + }, + { + condition: "firstparty", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/firstparty/lib/libd.so.meta_lic"), + matchResolution( + "testdata/firstparty/lib/libd.so.meta_lic", + "testdata/firstparty/lib/libd.so.meta_lic", + "testdata/firstparty/lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "notice", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/notice/bin/bin1.meta_lic"), + matchTarget("testdata/notice/lib/liba.so.meta_lic"), + matchTarget("testdata/notice/lib/libc.a.meta_lic"), + matchTarget("testdata/notice/bin/bin2.meta_lic"), + matchTarget("testdata/notice/highest.apex.meta_lic"), + matchTarget("testdata/notice/lib/libb.so.meta_lic"), + matchTarget("testdata/notice/lib/libd.so.meta_lic"), + matchResolution( + "testdata/notice/bin/bin1.meta_lic", + "testdata/notice/bin/bin1.meta_lic", + "testdata/notice/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/notice/bin/bin1.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/notice/bin/bin1.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "notice"), + matchResolution( + "testdata/notice/bin/bin2.meta_lic", + "testdata/notice/bin/bin2.meta_lic", + "testdata/notice/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/notice/highest.apex.meta_lic", + "testdata/notice/bin/bin1.meta_lic", + "testdata/notice/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/notice/highest.apex.meta_lic", + "testdata/notice/bin/bin2.meta_lic", + "testdata/notice/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/notice/highest.apex.meta_lic", + "testdata/notice/highest.apex.meta_lic", + "testdata/notice/highest.apex.meta_lic", + "notice"), + matchResolution( + "testdata/notice/highest.apex.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/notice/highest.apex.meta_lic", + "testdata/notice/lib/libb.so.meta_lic", + "testdata/notice/lib/libb.so.meta_lic", + "notice"), + matchResolution( + "testdata/notice/highest.apex.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "notice"), + matchResolution( + "testdata/notice/lib/liba.so.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/notice/lib/libb.so.meta_lic", + "testdata/notice/lib/libb.so.meta_lic", + "testdata/notice/lib/libb.so.meta_lic", + "notice"), + matchResolution( + "testdata/notice/lib/libc.a.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "notice"), + matchResolution( + "testdata/notice/lib/libd.so.meta_lic", + "testdata/notice/lib/libd.so.meta_lic", + "testdata/notice/lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "notice", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/notice/"}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchTarget("lib/libd.so.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + matchResolution( + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "notice", + name: "apex_trimmed_notice", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"notice"}, + stripPrefix: "testdata/notice/", + }, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + }, + }, + { + condition: "notice", + name: "apex_trimmed_share", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted"}, + stripPrefix: "testdata/notice/", + }, + expectedOut: []getMatcher{}, + }, + { + condition: "notice", + name: "apex_trimmed_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"proprietary"}, + stripPrefix: "testdata/notice/", + }, + expectedOut: []getMatcher{}, + }, + { + condition: "notice", + name: "apex_trimmed_share_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted", "proprietary"}, + stripPrefix: "testdata/notice/", + }, + expectedOut: []getMatcher{}, + }, + { + condition: "notice", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/notice/", labelConditions: true}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic", "notice"), + matchTarget("lib/liba.so.meta_lic", "notice"), + matchTarget("lib/libc.a.meta_lic", "notice"), + matchTarget("bin/bin2.meta_lic", "notice"), + matchTarget("highest.apex.meta_lic", "notice"), + matchTarget("lib/libb.so.meta_lic", "notice"), + matchTarget("lib/libd.so.meta_lic", "notice"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "notice"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + matchResolution( + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "notice"), + matchResolution( + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "notice", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/notice/bin/bin1.meta_lic"), + matchTarget("testdata/notice/lib/liba.so.meta_lic"), + matchTarget("testdata/notice/lib/libc.a.meta_lic"), + matchTarget("testdata/notice/bin/bin2.meta_lic"), + matchTarget("testdata/notice/container.zip.meta_lic"), + matchTarget("testdata/notice/lib/libb.so.meta_lic"), + matchTarget("testdata/notice/lib/libd.so.meta_lic"), + matchResolution( + "testdata/notice/bin/bin1.meta_lic", + "testdata/notice/bin/bin1.meta_lic", + "testdata/notice/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/notice/bin/bin1.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/notice/bin/bin1.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "notice"), + matchResolution( + "testdata/notice/bin/bin2.meta_lic", + "testdata/notice/bin/bin2.meta_lic", + "testdata/notice/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/notice/container.zip.meta_lic", + "testdata/notice/bin/bin1.meta_lic", + "testdata/notice/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/notice/container.zip.meta_lic", + "testdata/notice/bin/bin2.meta_lic", + "testdata/notice/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/notice/container.zip.meta_lic", + "testdata/notice/container.zip.meta_lic", + "testdata/notice/container.zip.meta_lic", + "notice"), + matchResolution( + "testdata/notice/container.zip.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/notice/container.zip.meta_lic", + "testdata/notice/lib/libb.so.meta_lic", + "testdata/notice/lib/libb.so.meta_lic", + "notice"), + matchResolution( + "testdata/notice/container.zip.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "notice"), + matchResolution( + "testdata/notice/lib/liba.so.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/notice/lib/libb.so.meta_lic", + "testdata/notice/lib/libb.so.meta_lic", + "testdata/notice/lib/libb.so.meta_lic", + "notice"), + matchResolution( + "testdata/notice/lib/libc.a.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "notice"), + matchResolution( + "testdata/notice/lib/libd.so.meta_lic", + "testdata/notice/lib/libd.so.meta_lic", + "testdata/notice/lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "notice", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/notice/application.meta_lic"), + matchTarget("testdata/notice/lib/liba.so.meta_lic"), + matchTarget("testdata/notice/bin/bin3.meta_lic"), + matchTarget("testdata/notice/lib/libb.so.meta_lic"), + matchResolution( + "testdata/notice/application.meta_lic", + "testdata/notice/application.meta_lic", + "testdata/notice/application.meta_lic", + "notice"), + matchResolution( + "testdata/notice/application.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/notice/bin/bin3.meta_lic", + "testdata/notice/bin/bin3.meta_lic", + "testdata/notice/bin/bin3.meta_lic", + "notice"), + matchResolution( + "testdata/notice/lib/liba.so.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/notice/lib/libb.so.meta_lic", + "testdata/notice/lib/libb.so.meta_lic", + "testdata/notice/lib/libb.so.meta_lic", + "notice"), + }, + }, + { + condition: "notice", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/notice/bin/bin1.meta_lic"), + matchTarget("testdata/notice/lib/liba.so.meta_lic"), + matchTarget("testdata/notice/lib/libc.a.meta_lic"), + matchResolution( + "testdata/notice/bin/bin1.meta_lic", + "testdata/notice/bin/bin1.meta_lic", + "testdata/notice/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/notice/bin/bin1.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/notice/bin/bin1.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "notice"), + matchResolution( + "testdata/notice/lib/liba.so.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "testdata/notice/lib/liba.so.meta_lic", + "notice"), + matchResolution( + "testdata/notice/lib/libc.a.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "testdata/notice/lib/libc.a.meta_lic", + "notice"), + }, + }, + { + condition: "notice", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/notice/lib/libd.so.meta_lic"), + matchResolution( + "testdata/notice/lib/libd.so.meta_lic", + "testdata/notice/lib/libd.so.meta_lic", + "testdata/notice/lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "reciprocal", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/reciprocal/bin/bin1.meta_lic"), + matchTarget("testdata/reciprocal/lib/liba.so.meta_lic"), + matchTarget("testdata/reciprocal/lib/libc.a.meta_lic"), + matchTarget("testdata/reciprocal/bin/bin2.meta_lic"), + matchTarget("testdata/reciprocal/highest.apex.meta_lic"), + matchTarget("testdata/reciprocal/lib/libb.so.meta_lic"), + matchTarget("testdata/reciprocal/lib/libd.so.meta_lic"), + matchResolution( + "testdata/reciprocal/bin/bin1.meta_lic", + "testdata/reciprocal/bin/bin1.meta_lic", + "testdata/reciprocal/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/bin/bin1.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/bin/bin1.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/bin/bin2.meta_lic", + "testdata/reciprocal/bin/bin2.meta_lic", + "testdata/reciprocal/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/highest.apex.meta_lic", + "testdata/reciprocal/bin/bin1.meta_lic", + "testdata/reciprocal/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/highest.apex.meta_lic", + "testdata/reciprocal/bin/bin2.meta_lic", + "testdata/reciprocal/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/highest.apex.meta_lic", + "testdata/reciprocal/highest.apex.meta_lic", + "testdata/reciprocal/highest.apex.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/highest.apex.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/highest.apex.meta_lic", + "testdata/reciprocal/lib/libb.so.meta_lic", + "testdata/reciprocal/lib/libb.so.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/highest.apex.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/lib/liba.so.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/lib/libb.so.meta_lic", + "testdata/reciprocal/lib/libb.so.meta_lic", + "testdata/reciprocal/lib/libb.so.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/lib/libc.a.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/lib/libd.so.meta_lic", + "testdata/reciprocal/lib/libd.so.meta_lic", + "testdata/reciprocal/lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "reciprocal", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/reciprocal/"}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchTarget("lib/libd.so.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + matchResolution( + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "reciprocal", + name: "apex_trimmed_notice", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"notice"}, + stripPrefix: "testdata/reciprocal/", + }, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + }, + }, + { + condition: "reciprocal", + name: "apex_trimmed_share", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted"}, + stripPrefix: "testdata/reciprocal/", + }, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "reciprocal"), + }, + }, + { + condition: "reciprocal", + name: "apex_trimmed_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"proprietary"}, + stripPrefix: "testdata/reciprocal/", + }, + expectedOut: []getMatcher{}, + }, + { + condition: "reciprocal", + name: "apex_trimmed_share_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted", "proprietary"}, + stripPrefix: "testdata/reciprocal/", + }, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "reciprocal"), + }, + }, + { + condition: "reciprocal", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/reciprocal/", labelConditions: true}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic", "notice"), + matchTarget("lib/liba.so.meta_lic", "reciprocal"), + matchTarget("lib/libc.a.meta_lic", "reciprocal"), + matchTarget("bin/bin2.meta_lic", "notice"), + matchTarget("highest.apex.meta_lic", "notice"), + matchTarget("lib/libb.so.meta_lic", "notice"), + matchTarget("lib/libd.so.meta_lic", "notice"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "notice"), + matchResolution( + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "reciprocal", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/reciprocal/bin/bin1.meta_lic"), + matchTarget("testdata/reciprocal/lib/liba.so.meta_lic"), + matchTarget("testdata/reciprocal/lib/libc.a.meta_lic"), + matchTarget("testdata/reciprocal/bin/bin2.meta_lic"), + matchTarget("testdata/reciprocal/container.zip.meta_lic"), + matchTarget("testdata/reciprocal/lib/libb.so.meta_lic"), + matchTarget("testdata/reciprocal/lib/libd.so.meta_lic"), + matchResolution( + "testdata/reciprocal/bin/bin1.meta_lic", + "testdata/reciprocal/bin/bin1.meta_lic", + "testdata/reciprocal/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/bin/bin1.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/bin/bin1.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/bin/bin2.meta_lic", + "testdata/reciprocal/bin/bin2.meta_lic", + "testdata/reciprocal/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/container.zip.meta_lic", + "testdata/reciprocal/bin/bin1.meta_lic", + "testdata/reciprocal/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/container.zip.meta_lic", + "testdata/reciprocal/bin/bin2.meta_lic", + "testdata/reciprocal/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/container.zip.meta_lic", + "testdata/reciprocal/container.zip.meta_lic", + "testdata/reciprocal/container.zip.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/container.zip.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/container.zip.meta_lic", + "testdata/reciprocal/lib/libb.so.meta_lic", + "testdata/reciprocal/lib/libb.so.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/container.zip.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/lib/liba.so.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/lib/libb.so.meta_lic", + "testdata/reciprocal/lib/libb.so.meta_lic", + "testdata/reciprocal/lib/libb.so.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/lib/libc.a.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/lib/libd.so.meta_lic", + "testdata/reciprocal/lib/libd.so.meta_lic", + "testdata/reciprocal/lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "reciprocal", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/reciprocal/application.meta_lic"), + matchTarget("testdata/reciprocal/lib/liba.so.meta_lic"), + matchTarget("testdata/reciprocal/bin/bin3.meta_lic"), + matchTarget("testdata/reciprocal/lib/libb.so.meta_lic"), + matchResolution( + "testdata/reciprocal/application.meta_lic", + "testdata/reciprocal/application.meta_lic", + "testdata/reciprocal/application.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/application.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/bin/bin3.meta_lic", + "testdata/reciprocal/bin/bin3.meta_lic", + "testdata/reciprocal/bin/bin3.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/lib/liba.so.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/lib/libb.so.meta_lic", + "testdata/reciprocal/lib/libb.so.meta_lic", + "testdata/reciprocal/lib/libb.so.meta_lic", + "notice"), + }, + }, + { + condition: "reciprocal", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/reciprocal/bin/bin1.meta_lic"), + matchTarget("testdata/reciprocal/lib/liba.so.meta_lic"), + matchTarget("testdata/reciprocal/lib/libc.a.meta_lic"), + matchResolution( + "testdata/reciprocal/bin/bin1.meta_lic", + "testdata/reciprocal/bin/bin1.meta_lic", + "testdata/reciprocal/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/reciprocal/bin/bin1.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/bin/bin1.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/lib/liba.so.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "testdata/reciprocal/lib/liba.so.meta_lic", + "reciprocal"), + matchResolution( + "testdata/reciprocal/lib/libc.a.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "testdata/reciprocal/lib/libc.a.meta_lic", + "reciprocal"), + }, + }, + { + condition: "reciprocal", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/reciprocal/lib/libd.so.meta_lic"), + matchResolution( + "testdata/reciprocal/lib/libd.so.meta_lic", + "testdata/reciprocal/lib/libd.so.meta_lic", + "testdata/reciprocal/lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "restricted", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/restricted/bin/bin1.meta_lic"), + matchTarget("testdata/restricted/lib/liba.so.meta_lic"), + matchTarget("testdata/restricted/lib/libc.a.meta_lic"), + matchTarget("testdata/restricted/bin/bin2.meta_lic"), + matchTarget("testdata/restricted/lib/libb.so.meta_lic"), + matchTarget("testdata/restricted/lib/libd.so.meta_lic"), + matchTarget("testdata/restricted/highest.apex.meta_lic"), + matchResolution( + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/lib/libd.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/highest.apex.meta_lic", + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/restricted/highest.apex.meta_lic", + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/highest.apex.meta_lic", + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/restricted/highest.apex.meta_lic", + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/highest.apex.meta_lic", + "testdata/restricted/highest.apex.meta_lic", + "testdata/restricted/highest.apex.meta_lic", + "notice"), + matchResolution( + "testdata/restricted/highest.apex.meta_lic", + "testdata/restricted/highest.apex.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/highest.apex.meta_lic", + "testdata/restricted/highest.apex.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/highest.apex.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/highest.apex.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/highest.apex.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/highest.apex.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "testdata/restricted/highest.apex.meta_lic", + "testdata/restricted/lib/libd.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/lib/liba.so.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/lib/libb.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "testdata/restricted/lib/libd.so.meta_lic", + "testdata/restricted/lib/libd.so.meta_lic", + "testdata/restricted/lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "restricted", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/restricted/"}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchTarget("lib/libd.so.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin2.meta_lic", + "lib/libd.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "highest.apex.meta_lic", + "lib/libd.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "restricted", + name: "apex_trimmed_notice", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"notice"}, + stripPrefix: "testdata/restricted/", + }, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "notice"), + }, + }, + { + condition: "restricted", + name: "apex_trimmed_share", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted"}, + stripPrefix: "testdata/restricted/", + }, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + }, + }, + { + condition: "restricted", + name: "apex_trimmed_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"proprietary"}, + stripPrefix: "testdata/restricted/", + }, + expectedOut: []getMatcher{}, + }, + { + condition: "restricted", + name: "apex_trimmed_share_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted", "proprietary"}, + stripPrefix: "testdata/restricted/", + }, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + }, + }, + { + condition: "restricted", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/restricted/", labelConditions: true}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic", "notice"), + matchTarget("lib/liba.so.meta_lic", "restricted"), + matchTarget("lib/libc.a.meta_lic", "reciprocal"), + matchTarget("bin/bin2.meta_lic", "notice"), + matchTarget("lib/libb.so.meta_lic", "restricted"), + matchTarget("lib/libd.so.meta_lic", "notice"), + matchTarget("highest.apex.meta_lic", "notice"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin2.meta_lic", + "lib/libd.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "highest.apex.meta_lic", + "lib/libd.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "restricted", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/restricted/bin/bin1.meta_lic"), + matchTarget("testdata/restricted/lib/liba.so.meta_lic"), + matchTarget("testdata/restricted/lib/libc.a.meta_lic"), + matchTarget("testdata/restricted/bin/bin2.meta_lic"), + matchTarget("testdata/restricted/lib/libb.so.meta_lic"), + matchTarget("testdata/restricted/lib/libd.so.meta_lic"), + matchTarget("testdata/restricted/container.zip.meta_lic"), + matchResolution( + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/lib/libd.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/container.zip.meta_lic", + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/restricted/container.zip.meta_lic", + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/container.zip.meta_lic", + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/bin/bin2.meta_lic", + "notice"), + matchResolution( + "testdata/restricted/container.zip.meta_lic", + "testdata/restricted/bin/bin2.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/container.zip.meta_lic", + "testdata/restricted/container.zip.meta_lic", + "testdata/restricted/container.zip.meta_lic", + "notice"), + matchResolution( + "testdata/restricted/container.zip.meta_lic", + "testdata/restricted/container.zip.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/container.zip.meta_lic", + "testdata/restricted/container.zip.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/container.zip.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/container.zip.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/container.zip.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/container.zip.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "testdata/restricted/container.zip.meta_lic", + "testdata/restricted/lib/libd.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/lib/liba.so.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/lib/libb.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "testdata/restricted/lib/libd.so.meta_lic", + "testdata/restricted/lib/libd.so.meta_lic", + "testdata/restricted/lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "restricted", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/restricted/application.meta_lic"), + matchTarget("testdata/restricted/lib/liba.so.meta_lic"), + matchTarget("testdata/restricted/lib/libb.so.meta_lic"), + matchTarget("testdata/restricted/bin/bin3.meta_lic"), + matchResolution( + "testdata/restricted/application.meta_lic", + "testdata/restricted/application.meta_lic", + "testdata/restricted/application.meta_lic", + "notice"), + matchResolution( + "testdata/restricted/application.meta_lic", + "testdata/restricted/application.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/application.meta_lic", + "testdata/restricted/application.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/application.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/application.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/application.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/bin/bin3.meta_lic", + "testdata/restricted/bin/bin3.meta_lic", + "testdata/restricted/bin/bin3.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/lib/liba.so.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/lib/libb.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "testdata/restricted/lib/libb.so.meta_lic", + "restricted"), + }, + }, + { + condition: "restricted", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/restricted/bin/bin1.meta_lic"), + matchTarget("testdata/restricted/lib/liba.so.meta_lic"), + matchTarget("testdata/restricted/lib/libc.a.meta_lic"), + matchResolution( + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/bin/bin1.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "reciprocal"), + matchResolution( + "testdata/restricted/lib/liba.so.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "testdata/restricted/lib/liba.so.meta_lic", + "restricted"), + matchResolution( + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "testdata/restricted/lib/libc.a.meta_lic", + "reciprocal"), + }, + }, + { + condition: "restricted", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/restricted/lib/libd.so.meta_lic"), + matchResolution( + "testdata/restricted/lib/libd.so.meta_lic", + "testdata/restricted/lib/libd.so.meta_lic", + "testdata/restricted/lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "proprietary", + name: "apex", + roots: []string{"highest.apex.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/proprietary/bin/bin1.meta_lic"), + matchTarget("testdata/proprietary/lib/liba.so.meta_lic"), + matchTarget("testdata/proprietary/lib/libc.a.meta_lic"), + matchTarget("testdata/proprietary/bin/bin2.meta_lic"), + matchTarget("testdata/proprietary/lib/libb.so.meta_lic"), + matchTarget("testdata/proprietary/lib/libd.so.meta_lic"), + matchTarget("testdata/proprietary/highest.apex.meta_lic"), + matchResolution( + "testdata/proprietary/bin/bin1.meta_lic", + "testdata/proprietary/bin/bin1.meta_lic", + "testdata/proprietary/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/proprietary/bin/bin1.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/bin/bin1.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/bin/bin2.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/lib/libd.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/highest.apex.meta_lic", + "testdata/proprietary/bin/bin1.meta_lic", + "testdata/proprietary/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/proprietary/highest.apex.meta_lic", + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/bin/bin2.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/highest.apex.meta_lic", + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/highest.apex.meta_lic", + "testdata/proprietary/highest.apex.meta_lic", + "testdata/proprietary/highest.apex.meta_lic", + "notice"), + matchResolution( + "testdata/proprietary/highest.apex.meta_lic", + "testdata/proprietary/highest.apex.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/highest.apex.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/highest.apex.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/highest.apex.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/highest.apex.meta_lic", + "testdata/proprietary/lib/libd.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/lib/liba.so.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/lib/libb.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/lib/libc.a.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/lib/libd.so.meta_lic", + "testdata/proprietary/lib/libd.so.meta_lic", + "testdata/proprietary/lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "proprietary", + name: "apex_trimmed", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/proprietary/"}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchTarget("lib/libd.so.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin2.meta_lic", + "lib/libd.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "highest.apex.meta_lic", + "lib/libd.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "proprietary", + name: "apex_trimmed_notice", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"notice"}, + stripPrefix: "testdata/proprietary/", + }, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "notice"), + }, + }, + { + condition: "proprietary", + name: "apex_trimmed_share", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted"}, + stripPrefix: "testdata/proprietary/", + }, + expectedOut: []getMatcher{ + matchTarget("bin/bin2.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + }, + }, + { + condition: "proprietary", + name: "apex_trimmed_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"proprietary"}, + stripPrefix: "testdata/proprietary/", + }, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "proprietary"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "proprietary"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "proprietary"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "proprietary"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "proprietary"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "proprietary"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "proprietary"), + }, + }, + { + condition: "proprietary", + name: "apex_trimmed_share_private", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{ + conditions: []string{"reciprocal", "restricted", "proprietary"}, + stripPrefix: "testdata/proprietary/", + }, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic"), + matchTarget("lib/liba.so.meta_lic"), + matchTarget("lib/libc.a.meta_lic"), + matchTarget("bin/bin2.meta_lic"), + matchTarget("lib/libb.so.meta_lic"), + matchTarget("highest.apex.meta_lic"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "proprietary"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "proprietary"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "proprietary"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "proprietary"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "proprietary"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "proprietary"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "proprietary"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + }, + }, + { + condition: "proprietary", + name: "apex_trimmed_labelled", + roots: []string{"highest.apex.meta_lic"}, + ctx: context{stripPrefix: "testdata/proprietary/", labelConditions: true}, + expectedOut: []getMatcher{ + matchTarget("bin/bin1.meta_lic", "notice"), + matchTarget("lib/liba.so.meta_lic", "by_exception_only", "proprietary"), + matchTarget("lib/libc.a.meta_lic", "by_exception_only", "proprietary"), + matchTarget("bin/bin2.meta_lic", "by_exception_only", "proprietary"), + matchTarget("lib/libb.so.meta_lic", "restricted"), + matchTarget("lib/libd.so.meta_lic", "notice"), + matchTarget("highest.apex.meta_lic", "notice"), + matchResolution( + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "bin/bin1.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "bin/bin1.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "bin/bin2.meta_lic", + "lib/libd.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin1.meta_lic", + "bin/bin1.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "bin/bin2.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "highest.apex.meta_lic", + "bin/bin2.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "notice"), + matchResolution( + "highest.apex.meta_lic", + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "highest.apex.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "highest.apex.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "highest.apex.meta_lic", + "lib/libd.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "lib/libc.a.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "proprietary", + name: "container", + roots: []string{"container.zip.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/proprietary/bin/bin1.meta_lic"), + matchTarget("testdata/proprietary/lib/liba.so.meta_lic"), + matchTarget("testdata/proprietary/lib/libc.a.meta_lic"), + matchTarget("testdata/proprietary/bin/bin2.meta_lic"), + matchTarget("testdata/proprietary/lib/libb.so.meta_lic"), + matchTarget("testdata/proprietary/lib/libd.so.meta_lic"), + matchTarget("testdata/proprietary/container.zip.meta_lic"), + matchResolution( + "testdata/proprietary/bin/bin1.meta_lic", + "testdata/proprietary/bin/bin1.meta_lic", + "testdata/proprietary/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/proprietary/bin/bin1.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/bin/bin1.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/bin/bin2.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/lib/libd.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/container.zip.meta_lic", + "testdata/proprietary/bin/bin1.meta_lic", + "testdata/proprietary/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/proprietary/container.zip.meta_lic", + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/bin/bin2.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/container.zip.meta_lic", + "testdata/proprietary/bin/bin2.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/container.zip.meta_lic", + "testdata/proprietary/container.zip.meta_lic", + "testdata/proprietary/container.zip.meta_lic", + "notice"), + matchResolution( + "testdata/proprietary/container.zip.meta_lic", + "testdata/proprietary/container.zip.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/container.zip.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/container.zip.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/container.zip.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/container.zip.meta_lic", + "testdata/proprietary/lib/libd.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/lib/liba.so.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/lib/libb.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/lib/libc.a.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/lib/libd.so.meta_lic", + "testdata/proprietary/lib/libd.so.meta_lic", + "testdata/proprietary/lib/libd.so.meta_lic", + "notice"), + }, + }, + { + condition: "proprietary", + name: "application", + roots: []string{"application.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/proprietary/application.meta_lic"), + matchTarget("testdata/proprietary/lib/liba.so.meta_lic"), + matchTarget("testdata/proprietary/lib/libb.so.meta_lic"), + matchTarget("testdata/proprietary/bin/bin3.meta_lic"), + matchResolution( + "testdata/proprietary/application.meta_lic", + "testdata/proprietary/application.meta_lic", + "testdata/proprietary/application.meta_lic", + "notice"), + matchResolution( + "testdata/proprietary/application.meta_lic", + "testdata/proprietary/application.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/application.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/application.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/application.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/bin/bin3.meta_lic", + "testdata/proprietary/bin/bin3.meta_lic", + "testdata/proprietary/bin/bin3.meta_lic", + "restricted"), + matchResolution( + "testdata/proprietary/lib/liba.so.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/lib/libb.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "testdata/proprietary/lib/libb.so.meta_lic", + "restricted"), + }, + }, + { + condition: "proprietary", + name: "binary", + roots: []string{"bin/bin1.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/proprietary/bin/bin1.meta_lic"), + matchTarget("testdata/proprietary/lib/liba.so.meta_lic"), + matchTarget("testdata/proprietary/lib/libc.a.meta_lic"), + matchResolution( + "testdata/proprietary/bin/bin1.meta_lic", + "testdata/proprietary/bin/bin1.meta_lic", + "testdata/proprietary/bin/bin1.meta_lic", + "notice"), + matchResolution( + "testdata/proprietary/bin/bin1.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/bin/bin1.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/lib/liba.so.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "testdata/proprietary/lib/liba.so.meta_lic", + "by_exception_only", + "proprietary"), + matchResolution( + "testdata/proprietary/lib/libc.a.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "testdata/proprietary/lib/libc.a.meta_lic", + "by_exception_only", + "proprietary"), + }, + }, + { + condition: "proprietary", + name: "library", + roots: []string{"lib/libd.so.meta_lic"}, + expectedOut: []getMatcher{ + matchTarget("testdata/proprietary/lib/libd.so.meta_lic"), + matchResolution( + "testdata/proprietary/lib/libd.so.meta_lic", + "testdata/proprietary/lib/libd.so.meta_lic", + "testdata/proprietary/lib/libd.so.meta_lic", + "notice"), + }, + }, + } + for _, tt := range tests { + t.Run(tt.condition+" "+tt.name, func(t *testing.T) { + ctx := &testContext{0, make(map[string]string)} + + expectedOut := &bytes.Buffer{} + for _, eo := range tt.expectedOut { + m := eo(ctx) + expectedOut.WriteString(m.matchString(ctx)) + expectedOut.WriteString("\n") + } + + stdout := &bytes.Buffer{} + stderr := &bytes.Buffer{} + + rootFiles := make([]string, 0, len(tt.roots)) + for _, r := range tt.roots { + rootFiles = append(rootFiles, "testdata/"+tt.condition+"/"+r) + } + tt.ctx.graphViz = true + err := dumpResolutions(&tt.ctx, stdout, stderr, rootFiles...) + + if err != nil { + t.Fatalf("dumpresolutions: error = %v, stderr = %v", err, stderr) + return + } + if stderr.Len() > 0 { + t.Errorf("dumpresolutions: gotStderr = %v, want none", stderr) + } + outList := strings.Split(stdout.String(), "\n") + outLine := 0 + if outList[outLine] != "strict digraph {" { + t.Errorf("dumpresolutions: got 1st line %v, want strict digraph {") + } + outLine++ + if strings.HasPrefix(strings.TrimLeft(outList[outLine], " \t"), "rankdir") { + outLine++ + } + endOut := len(outList) + for endOut > 0 && strings.TrimLeft(outList[endOut-1], " \t") == "" { + endOut-- + } + if outList[endOut-1] != "}" { + t.Errorf("dumpresolutions: got last line %v, want }", outList[endOut-1]) + } + endOut-- + if strings.HasPrefix(strings.TrimLeft(outList[endOut-1], " \t"), "{rank=same") { + endOut-- + } + expectedList := strings.Split(expectedOut.String(), "\n") + for len(expectedList) > 0 && expectedList[len(expectedList)-1] == "" { + expectedList = expectedList[0 : len(expectedList)-1] + } + matchLine := 0 + + for outLine < endOut && matchLine < len(expectedList) && strings.TrimLeft(outList[outLine], " \t") == expectedList[matchLine] { + outLine++ + matchLine++ + } + if outLine < endOut || matchLine < len(expectedList) { + if outLine >= endOut { + t.Errorf("dumpresolutions: missing lines at end of graph, want %d lines %v", len(expectedList)-matchLine, strings.Join(expectedList[matchLine:], "\n")) + } else if matchLine >= len(expectedList) { + t.Errorf("dumpresolutions: unexpected lines at end of graph starting line %d, got %v, want nothing", outLine+1, strings.Join(outList[outLine:], "\n")) + } else { + t.Errorf("dumpresolutions: at line %d, got %v, want %v", outLine+1, strings.Join(outList[outLine:], "\n"), strings.Join(expectedList[matchLine:], "\n")) + } + } + }) + } +} diff --git a/tools/compliance/cmd/testdata/README.md b/tools/compliance/cmd/testdata/README.md new file mode 100644 index 0000000000..9872c04452 --- /dev/null +++ b/tools/compliance/cmd/testdata/README.md @@ -0,0 +1,321 @@ +## Test data + +Each directory under testdata/ defines a similar build graph. +All have the same structure, but different versions of the graph have different +license metadata. + +### Testdata build graph structure: + +The structure is meant to simulate some common scenarios: + +* a `lib/` directory with some libraries +* a `bin/` directory with some executables +* one of the binaries, `bin3`, is a toolchain executable like a compiler +* an `application` built with the `bin3` compiler and linking a couple libraries +* a pure aggregation `continer.zip` that merely bundles files together, and +* an apex file (more like an apk file) with some binaries and libraries. + +The testdata starts with a `firstparty/` version containng only first-party +licenses, and each subsequent directory introduces more restrictive conditions: + +* `notice/` starts with `firstparty/` adds third-party notice conditions +* `reciprocal/` starts with `notice/` and adds some reciprocal conditions +* `restricted/` starts with `reciprocal/` and adds some restricted conditions +* `proprietary/` starts with `restricted/` and add some privacy conditions + +#### a `lib/` directory with some libraries + +```dot +strict digraph { + liba [label="lib/liba.so.meta_lic"]; + libb [label="lib/libb.so.meta_lic"]; + libc [label="lib/libc.a.meta_lic"]; + libd [label="lib/libd.so.meta_lic"]; +} +``` + +#### a `bin/` directory with some executables + +strict digraph { + rankdir=LR; + bin1 [label="bin/bin1.meta_lic"]; + bin2 [label="bin/bin2.meta_lic"]; + bin3 [label="bin/bin3.meta_lic\ntoolchain"]; + liba [label="lib/liba.so.meta_lic"]; + libb [label="lib/libb.so.meta_lic"]; + libc [label="lib/libc.a.meta_lic"]; + libd [label="lib/libd.so.meta_lic"]; + bin1 -> liba [label="static"]; + bin1 -> libc [label="static"]; + bin2 -> libb [label="dynamic"]; + bin2 -> libd [label="dynamic"]; + {rank=same; bin1 bin2 bin3} +} + +#### an `application` built with the `bin3` compiler and linking a couple libraries + +```dot +strict digraph { + rankdir=LR; + app [label="application.meta_lic"]; + bin3 [label="bin/bin3.meta_lic"]; + liba [label="lib/liba.so.meta_lic"]; + libb [label="lib/libb.so.meta_lic"]; + app -> bin3 [label="toolchain"]; + app -> liba [label="static"]; + app -> libb [label="dynamic"]; + {rank=same; app} +} +``` + +#### a pure aggregation `container.zip` that merely bundles files together + +strict digraph { + rankdir=LR; + bin1 [label="bin/bin1.meta_lic"]; + bin2 [label="bin/bin2.meta_lic"]; + container [label="container.zip.meta_lic"]; + liba [label="lib/liba.so.meta_lic"]; + libb [label="lib/libb.so.meta_lic"]; + libc [label="lib/libc.a.meta_lic"]; + libd [label="lib/libd.so.meta_lic"]; + bin1 -> liba [label="static"]; + bin1 -> libc [label="static"]; + bin2 -> libb [label="dynamic"]; + bin2 -> libd [label="dynamic"]; + container -> bin1 [label="static"]; + container -> bin2 [label="static"]; + container -> liba [label="static"]; + container -> libb [label="static"]; + {rank=same; container} +} + +#### an apex file (more like an apk file) with some binaries and libraries + +```dot +strict digraph { + rankdir=LR; + apex [label="highest.apex.meta_lic"]; + bin1 [label="bin/bin1.meta_lic"]; + bin2 [label="bin/bin2.meta_lic"]; + bin3 [label="bin/bin3.meta_lic"]; + liba [label="lib/liba.so.meta_lic"]; + libb [label="lib/libb.so.meta_lic"]; + libc [label="lib/libc.a.meta_lic"]; + libd [label="lib/libd.so.meta_lic"]; + bin1 -> liba [label="static"]; + bin1 -> libc [label="static"]; + bin2 -> libb [label="dynamic"]; + bin2 -> libd [label="dynamic"]; + apex -> bin1 [label="static"]; + apex -> bin2 [label="static"]; + apex -> liba [label="static"]; + apex -> libb [label="static"]; + {rank=same; apex} +} +``` + +#### the whole build graph + +```dot +strict digraph { + rankdir=LR; + apex [label="highest.apex.meta_lic"]; + app [label="application.meta_lic"]; + bin1 [label="bin/bin1.meta_lic"]; + bin2 [label="bin/bin2.meta_lic"]; + bin3 [label="bin/bin3.meta_lic"]; + container [label="container.zip.meta_lic"]; + liba [label="lib/liba.so.meta_lic"]; + libb [label="lib/libb.so.meta_lic"]; + libc [label="lib/libc.a.meta_lic"]; + libd [label="lib/libd.so.meta_lic"]; + app -> bin3 [label="toolchain"]; + app -> liba [label="static"]; + app -> libb [label="dynamic"]; + bin1 -> liba [label="static"]; + bin1 -> libc [label="static"]; + bin2 -> libb [label="dynamic"]; + bin2 -> libd [label="dynamic"]; + container -> bin1 [label="static"]; + container -> bin2 [label="static"]; + container -> liba [label="static"]; + container -> libb [label="static"]; + apex -> bin1 [label="static"]; + apex -> bin2 [label="static"]; + apex -> liba [label="static"]; + apex -> libb [label="static"]; + {rank=same; app container apex} +} +``` + + +### firstparty/ testdata starts with all first-party licensing + +```dot +strict digraph { + rankdir=LR; + app [label="firstparty/application.meta_lic"]; + bin1 [label="firstparty/bin/bin1.meta_lic"]; + bin2 [label="firstparty/bin/bin2.meta_lic"]; + bin3 [label="firstparty/bin/bin3.meta_lic"]; + container [label="firstparty/container.zip.meta_lic"]; + apex [label="firstparty/highest.apex.meta_lic"]; + liba [label="firstparty/lib/liba.so.meta_lic"]; + libb [label="firstparty/lib/libb.so.meta_lic"]; + libc [label="firstparty/lib/libc.a.meta_lic"]; + lib [label="firstparty/lib/libd.so.meta_lic"]; + app -> bin3 [label="toolchain"]; + app -> liba [label="static"]; + app -> libb [label="dynamic"]; + bin1 -> liba [label="static"]; + bin1 -> libc [label="static"]; + bin2 -> libb [label="dynamic"]; + bin2 -> libd [label="dynamic"]; + container -> bin1 [label="static"]; + container -> bin2 [label="static"]; + container -> liba [label="static"]; + container -> libb [label="static"]; + apex -> bin1 [label="static"]; + apex -> bin2 [label="static"]; + apex -> liba [label="static"]; + apex -> libb [label="static"]; + {rank=same; app container apex} +} +``` + +### notice/ testdata introduces third-party notice conditions + +```dot +strict digraph { + rankdir=LR; + app [label="notice/application.meta_lic"]; + bin1 [label="notice/bin/bin1.meta_lic"]; + bin2 [label="notice/bin/bin2.meta_lic"]; + bin3 [label="notice/bin/bin3.meta_lic\nnotice"]; + container [label="notice/container.zip.meta_lic"]; + apex [label="notice/highest.apex.meta_lic"]; + liba [label="notice/lib/liba.so.meta_lic\nnotice"]; + libb [label="notice/lib/libb.so.meta_lic"]; + libc [label="notice/lib/libc.a.meta_lic\nnotice"]; + libd [label="notice/lib/libd.so.meta_lic\nnotice"]; + app -> bin3 [label="toolchain"]; + app -> liba [label="static"]; + app -> libb [label="dynamic"]; + bin1 -> liba [label="static"]; + bin1 -> libc [label="static"]; + bin2 -> libb [label="dynamic"]; + bin2 -> libd [label="dynamic"]; + container -> bin1 [label="static"]; + container -> bin2 [label="static"]; + container -> liba [label="static"]; + container -> libb [label="static"]; + apex -> bin1 [label="static"]; + apex -> bin2 [label="static"]; + apex -> liba [label="static"]; + apex -> libb [label="static"]; + {rank=same; app container apex} +} +``` + +### reciprocal/ testdata introduces third-party reciprocal sharing conditions + +```dot +strict digraph { + rankdir=LR; + app [label="reciprocal/application.meta_lic"]; + bin1 [label="reciprocal/bin/bin1.meta_lic"]; + bin2 [label="reciprocal/bin/bin2.meta_lic"]; + bin3 [label="reciprocal/bin/bin3.meta_lic\nnotice"]; + container [label="reciprocal/container.zip.meta_lic"]; + apex [label="reciprocal/highest.apex.meta_lic"]; + liba [label="reciprocal/lib/liba.so.meta_lic\nreciprocal"]; + libb [label="reciprocal/lib/libb.so.meta_lic"]; + libc [label="reciprocal/lib/libc.a.meta_lic\nreciprocal"]; + libd [label="reciprocal/lib/libd.so.meta_lic\nnotice"]; + app -> bin3 [label="toolchain"]; + app -> liba [label="static"]; + app -> libb [label="dynamic"]; + bin1 -> liba [label="static"]; + bin1 -> libc [label="static"]; + bin2 -> libb [label="dynamic"]; + bin2 -> libd [label="dynamic"]; + container -> bin1 [label="static"]; + container -> bin2 [label="static"]; + container -> liba [label="static"]; + container -> libb [label="static"]; + apex -> bin1 [label="static"]; + apex -> bin2 [label="static"]; + apex -> liba [label="static"]; + apex -> libb [label="static"]; + {rank=same; app container apex} +} +``` + +### restricted/ testdata introduces restricted source sharing conditions + +```dot +strict digraph { + rankdir=LR; + app [label="restricted/application.meta_lic"]; + bin1 [label="restricted/bin/bin1.meta_lic"]; + bin2 [label="restricted/bin/bin2.meta_lic"]; + bin3 [label="restricted/bin/bin3.meta_lic\nrestricted"]; + container [label="restricted/container.zip.meta_lic"]; + apex [label="restricted/highest.apex.meta_lic"]; + liba [label="restricted/lib/liba.so.meta_lic\nrestricted"]; + libb [label="restricted/lib/libb.so.meta_lic\nrestricted"]; + libc [label="restricted/lib/libc.a.meta_lic\nreciprocal"]; + libd [label="restricted/lib/libd.so.meta_lic\nnotice"]; + app -> bin3 [label="toolchain"]; + app -> liba [label="static"]; + app -> libb [label="dynamic"]; + bin1 -> liba [label="static"]; + bin1 -> libc [label="static"]; + bin2 -> libb [label="dynamic"]; + bin2 -> libd [label="dynamic"]; + container -> bin1 [label="static"]; + container -> bin2 [label="static"]; + container -> liba [label="static"]; + container -> libb [label="static"]; + apex -> bin1 [label="static"]; + apex -> bin2 [label="static"]; + apex -> liba [label="static"]; + apex -> libb [label="static"]; + {rank=same; app container apex} +} +``` + +### proprietary/ testdata introduces privacy conditions + +```dot +strict digraph { + rankdir=LR; + app [label="proprietary/application.meta_lic"]; + bin1 [label="proprietary/bin/bin1.meta_lic"]; + bin2 [label="proprietary/bin/bin2.meta_lic\nby_exception_only\nproprietary"]; + bin3 [label="proprietary/bin/bin3.meta_lic\nrestricted"]; + container [label="proprietary/container.zip.meta_lic"]; + apex [label="proprietary/highest.apex.meta_lic"]; + liba [label="proprietary/lib/liba.so.meta_lic\nby_exception_only\nproprietary"]; + libb [label="proprietary/lib/libb.so.meta_lic\nrestricted"]; + libc [label="proprietary/lib/libc.a.meta_lic\nby_exception_only\nproprietary"]; + libd [label="proprietary/lib/libd.so.meta_lic\nnotice"]; + app -> bin3 [label="toolchain"]; + app -> liba [label="static"]; + app -> libb [label="dynamic"]; + bin1 -> liba [label="static"]; + bin1 -> libc [label="static"]; + bin2 -> libb [label="dynamic"]; + bin2 -> libd [label="dynamic"]; + container -> bin1 [label="static"]; + container -> bin2 [label="static"]; + container -> liba [label="static"]; + container -> libb [label="static"]; + apex -> bin1 [label="static"]; + apex -> bin2 [label="static"]; + apex -> liba [label="static"]; + apex -> libb [label="static"]; + {rank=same; app container apex} +} +``` diff --git a/tools/compliance/cmd/testdata/firstparty/application.meta_lic b/tools/compliance/cmd/testdata/firstparty/application.meta_lic new file mode 100644 index 0000000000..58a15662f1 --- /dev/null +++ b/tools/compliance/cmd/testdata/firstparty/application.meta_lic @@ -0,0 +1,24 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "distributable/application" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/application_intermediates/application" +installed: "out/target/product/fictional/bin/application" +sources: "out/target/product/fictional/system/lib/liba.a" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/bin/bin3" +deps: { + file: "testdata/firstparty/bin/bin3.meta_lic" + annotations: "toolchain" +} +deps: { + file: "testdata/firstparty/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/firstparty/lib/libb.so.meta_lic" + annotations: "dynamic" +} diff --git a/tools/compliance/cmd/testdata/firstparty/bin/bin1.meta_lic b/tools/compliance/cmd/testdata/firstparty/bin/bin1.meta_lic new file mode 100644 index 0000000000..34d81d9750 --- /dev/null +++ b/tools/compliance/cmd/testdata/firstparty/bin/bin1.meta_lic @@ -0,0 +1,19 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "static/binary" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/bin_intermediates/bin1" +installed: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/lib/liba.a" +sources: "out/target/product/fictional/system/lib/libc.a" +deps: { + file: "testdata/firstparty/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/firstparty/lib/libc.a.meta_lic" + annotations: "static" +} diff --git a/tools/compliance/cmd/testdata/firstparty/bin/bin2.meta_lic b/tools/compliance/cmd/testdata/firstparty/bin/bin2.meta_lic new file mode 100644 index 0000000000..6154421782 --- /dev/null +++ b/tools/compliance/cmd/testdata/firstparty/bin/bin2.meta_lic @@ -0,0 +1,19 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "dynamic/binary" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/bin_intermediates/bin1" +installed: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/lib/libd.so" +deps: { + file: "testdata/firstparty/lib/libb.so.meta_lic" + annotations: "dynamic" +} +deps: { + file: "testdata/firstparty/lib/libd.so.meta_lic" + annotations: "dynamic" +} diff --git a/tools/compliance/cmd/testdata/firstparty/bin/bin3.meta_lic b/tools/compliance/cmd/testdata/firstparty/bin/bin3.meta_lic new file mode 100644 index 0000000000..9b7908e2b8 --- /dev/null +++ b/tools/compliance/cmd/testdata/firstparty/bin/bin3.meta_lic @@ -0,0 +1,9 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "standalone/binary" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/bin_intermediates/bin3" +installed: "out/target/product/fictional/system/bin/bin3" diff --git a/tools/compliance/cmd/testdata/firstparty/container.zip.meta_lic b/tools/compliance/cmd/testdata/firstparty/container.zip.meta_lic new file mode 100644 index 0000000000..350b123089 --- /dev/null +++ b/tools/compliance/cmd/testdata/firstparty/container.zip.meta_lic @@ -0,0 +1,36 @@ +package_name: "Android" +projects: "container/zip" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: true +built: "out/target/product/fictional/obj/ETC/container_intermediates/container.zip" +installed: "out/target/product/fictional/data/container.zip" +install_map { + from_path: "out/target/product/fictional/system/lib/" + container_path: "" +} +install_map { + from_path: "out/target/product/fictional/system/bin/" + container_path: "" +} +sources: "out/target/product/fictional/system/lib/liba.so" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/bin/bin2" +deps: { + file: "testdata/firstparty/bin/bin1.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/firstparty/bin/bin2.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/firstparty/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/firstparty/lib/libb.so.meta_lic" + annotations: "static" +} diff --git a/tools/compliance/cmd/testdata/firstparty/highest.apex.meta_lic b/tools/compliance/cmd/testdata/firstparty/highest.apex.meta_lic new file mode 100644 index 0000000000..53f81a25ce --- /dev/null +++ b/tools/compliance/cmd/testdata/firstparty/highest.apex.meta_lic @@ -0,0 +1,44 @@ +package_name: "Android" +projects: "highest/apex" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: true +built: "out/target/product/fictional/obj/ETC/highest_intermediates/highest.apex" +installed: "out/target/product/fictional/system/apex/highest.apex" +install_map { + from_path: "out/target/product/fictional/system/lib/liba.so" + container_path: "lib/liba.so" +} +install_map { + from_path: "out/target/product/fictional/system/lib/libb.so" + container_path: "lib/libb.so" +} +install_map { + from_path: "out/target/product/fictional/system/bin/bin1" + container_path: "bin/bin1" +} +install_map { + from_path: "out/target/product/fictional/system/bin/bin2" + container_path: "bin/bin2" +} +sources: "out/target/product/fictional/system/lib/liba.so" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/bin/bin2" +deps: { + file: "testdata/firstparty/bin/bin1.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/firstparty/bin/bin2.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/firstparty/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/firstparty/lib/libb.so.meta_lic" + annotations: "static" +} diff --git a/tools/compliance/cmd/testdata/firstparty/lib/liba.so.meta_lic b/tools/compliance/cmd/testdata/firstparty/lib/liba.so.meta_lic new file mode 100644 index 0000000000..7913af0461 --- /dev/null +++ b/tools/compliance/cmd/testdata/firstparty/lib/liba.so.meta_lic @@ -0,0 +1,9 @@ +package_name: "Android" +projects: "device/library" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/liba.so" +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/liba.a" +installed: "out/target/product/fictional/system/lib/liba.so" diff --git a/tools/compliance/cmd/testdata/firstparty/lib/libb.so.meta_lic b/tools/compliance/cmd/testdata/firstparty/lib/libb.so.meta_lic new file mode 100644 index 0000000000..a4935d4fd1 --- /dev/null +++ b/tools/compliance/cmd/testdata/firstparty/lib/libb.so.meta_lic @@ -0,0 +1,9 @@ +package_name: "Android" +projects: "base/library" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libb.so" +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libb.a" +installed: "out/target/product/fictional/system/lib/libb.so" diff --git a/tools/compliance/cmd/testdata/firstparty/lib/libc.a.meta_lic b/tools/compliance/cmd/testdata/firstparty/lib/libc.a.meta_lic new file mode 100644 index 0000000000..fa7459ae49 --- /dev/null +++ b/tools/compliance/cmd/testdata/firstparty/lib/libc.a.meta_lic @@ -0,0 +1,7 @@ +package_name: "Android" +projects: "static/library" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libc.a" diff --git a/tools/compliance/cmd/testdata/firstparty/lib/libd.so.meta_lic b/tools/compliance/cmd/testdata/firstparty/lib/libd.so.meta_lic new file mode 100644 index 0000000000..a2db94a26c --- /dev/null +++ b/tools/compliance/cmd/testdata/firstparty/lib/libd.so.meta_lic @@ -0,0 +1,8 @@ +package_name: "Android" +projects: "dynamic/library" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libd.so" +installed: "out/target/product/fictional/system/lib/libd.so" diff --git a/tools/compliance/cmd/testdata/notice/application.meta_lic b/tools/compliance/cmd/testdata/notice/application.meta_lic new file mode 100644 index 0000000000..56c60efce1 --- /dev/null +++ b/tools/compliance/cmd/testdata/notice/application.meta_lic @@ -0,0 +1,24 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "distributable/application" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/application_intermediates/application" +installed: "out/target/product/fictional/bin/application" +sources: "out/target/product/fictional/system/lib/liba.a" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/bin/bin3" +deps: { + file: "testdata/notice/bin/bin3.meta_lic" + annotations: "toolchain" +} +deps: { + file: "testdata/notice/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/notice/lib/libb.so.meta_lic" + annotations: "dynamic" +} diff --git a/tools/compliance/cmd/testdata/notice/bin/bin1.meta_lic b/tools/compliance/cmd/testdata/notice/bin/bin1.meta_lic new file mode 100644 index 0000000000..9bede1ba86 --- /dev/null +++ b/tools/compliance/cmd/testdata/notice/bin/bin1.meta_lic @@ -0,0 +1,19 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "static/binary" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/bin_intermediates/bin1" +installed: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/lib/liba.a" +sources: "out/target/product/fictional/system/lib/libc.a" +deps: { + file: "testdata/notice/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/notice/lib/libc.a.meta_lic" + annotations: "static" +} diff --git a/tools/compliance/cmd/testdata/notice/bin/bin2.meta_lic b/tools/compliance/cmd/testdata/notice/bin/bin2.meta_lic new file mode 100644 index 0000000000..86e06c655e --- /dev/null +++ b/tools/compliance/cmd/testdata/notice/bin/bin2.meta_lic @@ -0,0 +1,19 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "dynamic/binary" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/bin_intermediates/bin1" +installed: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/lib/libd.so" +deps: { + file: "testdata/notice/lib/libb.so.meta_lic" + annotations: "dynamic" +} +deps: { + file: "testdata/notice/lib/libd.so.meta_lic" + annotations: "dynamic" +} diff --git a/tools/compliance/cmd/testdata/notice/bin/bin3.meta_lic b/tools/compliance/cmd/testdata/notice/bin/bin3.meta_lic new file mode 100644 index 0000000000..285d89959d --- /dev/null +++ b/tools/compliance/cmd/testdata/notice/bin/bin3.meta_lic @@ -0,0 +1,8 @@ +package_name: "Compiler" +module_classes: "EXECUTABLES" +projects: "standalone/binary" +license_kinds: "SPDX-license-identifier-NCSA" +license_conditions: "notice" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/bin_intermediates/bin3" +installed: "out/target/product/fictional/system/bin/bin3" diff --git a/tools/compliance/cmd/testdata/notice/container.zip.meta_lic b/tools/compliance/cmd/testdata/notice/container.zip.meta_lic new file mode 100644 index 0000000000..e8af61ce53 --- /dev/null +++ b/tools/compliance/cmd/testdata/notice/container.zip.meta_lic @@ -0,0 +1,36 @@ +package_name: "Android" +projects: "container/zip" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: true +built: "out/target/product/fictional/obj/ETC/container_intermediates/container.zip" +installed: "out/target/product/fictional/data/container.zip" +install_map { + from_path: "out/target/product/fictional/system/lib/" + container_path: "" +} +install_map { + from_path: "out/target/product/fictional/system/bin/" + container_path: "" +} +sources: "out/target/product/fictional/system/lib/liba.so" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/bin/bin2" +deps: { + file: "testdata/notice/bin/bin1.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/notice/bin/bin2.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/notice/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/notice/lib/libb.so.meta_lic" + annotations: "static" +} diff --git a/tools/compliance/cmd/testdata/notice/highest.apex.meta_lic b/tools/compliance/cmd/testdata/notice/highest.apex.meta_lic new file mode 100644 index 0000000000..9b90aa5833 --- /dev/null +++ b/tools/compliance/cmd/testdata/notice/highest.apex.meta_lic @@ -0,0 +1,44 @@ +package_name: "Android" +projects: "highest/apex" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: true +built: "out/target/product/fictional/obj/ETC/highest_intermediates/highest.apex" +installed: "out/target/product/fictional/system/apex/highest.apex" +install_map { + from_path: "out/target/product/fictional/system/lib/liba.so" + container_path: "lib/liba.so" +} +install_map { + from_path: "out/target/product/fictional/system/lib/libb.so" + container_path: "lib/libb.so" +} +install_map { + from_path: "out/target/product/fictional/system/bin/bin1" + container_path: "bin/bin1" +} +install_map { + from_path: "out/target/product/fictional/system/bin/bin2" + container_path: "bin/bin2" +} +sources: "out/target/product/fictional/system/lib/liba.so" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/bin/bin2" +deps: { + file: "testdata/notice/bin/bin1.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/notice/bin/bin2.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/notice/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/notice/lib/libb.so.meta_lic" + annotations: "static" +} diff --git a/tools/compliance/cmd/testdata/notice/lib/liba.so.meta_lic b/tools/compliance/cmd/testdata/notice/lib/liba.so.meta_lic new file mode 100644 index 0000000000..a69839fb93 --- /dev/null +++ b/tools/compliance/cmd/testdata/notice/lib/liba.so.meta_lic @@ -0,0 +1,8 @@ +package_name: "Device" +projects: "device/library" +license_kinds: "SPDX-license-identifier-BSD" +license_conditions: "notice" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/liba.so" +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/liba.a" +installed: "out/target/product/fictional/system/lib/liba.so" diff --git a/tools/compliance/cmd/testdata/notice/lib/libb.so.meta_lic b/tools/compliance/cmd/testdata/notice/lib/libb.so.meta_lic new file mode 100644 index 0000000000..a4935d4fd1 --- /dev/null +++ b/tools/compliance/cmd/testdata/notice/lib/libb.so.meta_lic @@ -0,0 +1,9 @@ +package_name: "Android" +projects: "base/library" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libb.so" +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libb.a" +installed: "out/target/product/fictional/system/lib/libb.so" diff --git a/tools/compliance/cmd/testdata/notice/lib/libc.a.meta_lic b/tools/compliance/cmd/testdata/notice/lib/libc.a.meta_lic new file mode 100644 index 0000000000..eb0f81f248 --- /dev/null +++ b/tools/compliance/cmd/testdata/notice/lib/libc.a.meta_lic @@ -0,0 +1,6 @@ +package_name: "External" +projects: "static/library" +license_kinds: "SPDX-license-identifier-MIT" +license_conditions: "notice" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libc.a" diff --git a/tools/compliance/cmd/testdata/notice/lib/libd.so.meta_lic b/tools/compliance/cmd/testdata/notice/lib/libd.so.meta_lic new file mode 100644 index 0000000000..942d298075 --- /dev/null +++ b/tools/compliance/cmd/testdata/notice/lib/libd.so.meta_lic @@ -0,0 +1,7 @@ +package_name: "External" +projects: "dynamic/library" +license_kinds: "SPDX-license-identifier-MIT" +license_conditions: "notice" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libd.so" +installed: "out/target/product/fictional/system/lib/libd.so" diff --git a/tools/compliance/cmd/testdata/proprietary/application.meta_lic b/tools/compliance/cmd/testdata/proprietary/application.meta_lic new file mode 100644 index 0000000000..51b97c541f --- /dev/null +++ b/tools/compliance/cmd/testdata/proprietary/application.meta_lic @@ -0,0 +1,24 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "distributable/application" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/application_intermediates/application" +installed: "out/target/product/fictional/bin/application" +sources: "out/target/product/fictional/system/lib/liba.a" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/bin/bin3" +deps: { + file: "testdata/proprietary/bin/bin3.meta_lic" + annotations: "toolchain" +} +deps: { + file: "testdata/proprietary/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/proprietary/lib/libb.so.meta_lic" + annotations: "dynamic" +} diff --git a/tools/compliance/cmd/testdata/proprietary/bin/bin1.meta_lic b/tools/compliance/cmd/testdata/proprietary/bin/bin1.meta_lic new file mode 100644 index 0000000000..c815858c79 --- /dev/null +++ b/tools/compliance/cmd/testdata/proprietary/bin/bin1.meta_lic @@ -0,0 +1,19 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "static/binary" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/bin_intermediates/bin1" +installed: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/lib/liba.a" +sources: "out/target/product/fictional/system/lib/libc.a" +deps: { + file: "testdata/proprietary/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/proprietary/lib/libc.a.meta_lic" + annotations: "static" +} diff --git a/tools/compliance/cmd/testdata/proprietary/bin/bin2.meta_lic b/tools/compliance/cmd/testdata/proprietary/bin/bin2.meta_lic new file mode 100644 index 0000000000..6b89ba457b --- /dev/null +++ b/tools/compliance/cmd/testdata/proprietary/bin/bin2.meta_lic @@ -0,0 +1,19 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "dynamic/binary" +license_kinds: "legacy_proprietary" +license_conditions: "proprietary" +license_conditions: "by_exception_only" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/bin_intermediates/bin1" +installed: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/lib/libd.so" +deps: { + file: "testdata/proprietary/lib/libb.so.meta_lic" + annotations: "dynamic" +} +deps: { + file: "testdata/proprietary/lib/libd.so.meta_lic" + annotations: "dynamic" +} diff --git a/tools/compliance/cmd/testdata/proprietary/bin/bin3.meta_lic b/tools/compliance/cmd/testdata/proprietary/bin/bin3.meta_lic new file mode 100644 index 0000000000..f93553db67 --- /dev/null +++ b/tools/compliance/cmd/testdata/proprietary/bin/bin3.meta_lic @@ -0,0 +1,8 @@ +package_name: "Compiler" +module_classes: "EXECUTABLES" +projects: "standalone/binary" +license_kinds: "SPDX-license-identifier-LGPL-2.0" +license_conditions: "restricted" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/bin_intermediates/bin3" +installed: "out/target/product/fictional/system/bin/bin3" diff --git a/tools/compliance/cmd/testdata/proprietary/container.zip.meta_lic b/tools/compliance/cmd/testdata/proprietary/container.zip.meta_lic new file mode 100644 index 0000000000..889e17ef00 --- /dev/null +++ b/tools/compliance/cmd/testdata/proprietary/container.zip.meta_lic @@ -0,0 +1,36 @@ +package_name: "Android" +projects: "container/zip" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: true +built: "out/target/product/fictional/obj/ETC/container_intermediates/container.zip" +installed: "out/target/product/fictional/data/container.zip" +install_map { + from_path: "out/target/product/fictional/system/lib/" + container_path: "" +} +install_map { + from_path: "out/target/product/fictional/system/bin/" + container_path: "" +} +sources: "out/target/product/fictional/system/lib/liba.so" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/bin/bin2" +deps: { + file: "testdata/proprietary/bin/bin1.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/proprietary/bin/bin2.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/proprietary/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/proprietary/lib/libb.so.meta_lic" + annotations: "static" +} diff --git a/tools/compliance/cmd/testdata/proprietary/highest.apex.meta_lic b/tools/compliance/cmd/testdata/proprietary/highest.apex.meta_lic new file mode 100644 index 0000000000..d615404f53 --- /dev/null +++ b/tools/compliance/cmd/testdata/proprietary/highest.apex.meta_lic @@ -0,0 +1,44 @@ +package_name: "Android" +projects: "highest/apex" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: true +built: "out/target/product/fictional/obj/ETC/highest_intermediates/highest.apex" +installed: "out/target/product/fictional/system/apex/highest.apex" +install_map { + from_path: "out/target/product/fictional/system/lib/liba.so" + container_path: "lib/liba.so" +} +install_map { + from_path: "out/target/product/fictional/system/lib/libb.so" + container_path: "lib/libb.so" +} +install_map { + from_path: "out/target/product/fictional/system/bin/bin1" + container_path: "bin/bin1" +} +install_map { + from_path: "out/target/product/fictional/system/bin/bin2" + container_path: "bin/bin2" +} +sources: "out/target/product/fictional/system/lib/liba.so" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/bin/bin2" +deps: { + file: "testdata/proprietary/bin/bin1.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/proprietary/bin/bin2.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/proprietary/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/proprietary/lib/libb.so.meta_lic" + annotations: "static" +} diff --git a/tools/compliance/cmd/testdata/proprietary/lib/liba.so.meta_lic b/tools/compliance/cmd/testdata/proprietary/lib/liba.so.meta_lic new file mode 100644 index 0000000000..51141c8922 --- /dev/null +++ b/tools/compliance/cmd/testdata/proprietary/lib/liba.so.meta_lic @@ -0,0 +1,9 @@ +package_name: "Device" +projects: "device/library" +license_kinds: "legacy_proprietary" +license_conditions: "proprietary" +license_conditions: "by_exception_only" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/liba.so" +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/liba.a" +installed: "out/target/product/fictional/system/lib/liba.so" diff --git a/tools/compliance/cmd/testdata/proprietary/lib/libb.so.meta_lic b/tools/compliance/cmd/testdata/proprietary/lib/libb.so.meta_lic new file mode 100644 index 0000000000..c1b86d7a70 --- /dev/null +++ b/tools/compliance/cmd/testdata/proprietary/lib/libb.so.meta_lic @@ -0,0 +1,8 @@ +package_name: "Android" +projects: "base/library" +license_kinds: "SPDX-license-identifier-GPL-2.0" +license_conditions: "restricted" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libb.so" +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libb.a" +installed: "out/target/product/fictional/system/lib/libb.so" diff --git a/tools/compliance/cmd/testdata/proprietary/lib/libc.a.meta_lic b/tools/compliance/cmd/testdata/proprietary/lib/libc.a.meta_lic new file mode 100644 index 0000000000..1ade7da602 --- /dev/null +++ b/tools/compliance/cmd/testdata/proprietary/lib/libc.a.meta_lic @@ -0,0 +1,7 @@ +package_name: "External" +projects: "static/library" +license_kinds: "legacy_proprietary" +license_conditions: "proprietary" +license_conditions: "by_exception_only" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libc.a" diff --git a/tools/compliance/cmd/testdata/proprietary/lib/libd.so.meta_lic b/tools/compliance/cmd/testdata/proprietary/lib/libd.so.meta_lic new file mode 100644 index 0000000000..942d298075 --- /dev/null +++ b/tools/compliance/cmd/testdata/proprietary/lib/libd.so.meta_lic @@ -0,0 +1,7 @@ +package_name: "External" +projects: "dynamic/library" +license_kinds: "SPDX-license-identifier-MIT" +license_conditions: "notice" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libd.so" +installed: "out/target/product/fictional/system/lib/libd.so" diff --git a/tools/compliance/cmd/testdata/reciprocal/application.meta_lic b/tools/compliance/cmd/testdata/reciprocal/application.meta_lic new file mode 100644 index 0000000000..015c2d92b5 --- /dev/null +++ b/tools/compliance/cmd/testdata/reciprocal/application.meta_lic @@ -0,0 +1,24 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "distributable/application" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/application_intermediates/application" +installed: "out/target/product/fictional/bin/application" +sources: "out/target/product/fictional/system/lib/liba.a" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/bin/bin3" +deps: { + file: "testdata/reciprocal/bin/bin3.meta_lic" + annotations: "toolchain" +} +deps: { + file: "testdata/reciprocal/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/reciprocal/lib/libb.so.meta_lic" + annotations: "dynamic" +} diff --git a/tools/compliance/cmd/testdata/reciprocal/bin/bin1.meta_lic b/tools/compliance/cmd/testdata/reciprocal/bin/bin1.meta_lic new file mode 100644 index 0000000000..4ebf653ca8 --- /dev/null +++ b/tools/compliance/cmd/testdata/reciprocal/bin/bin1.meta_lic @@ -0,0 +1,19 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "static/binary" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/bin_intermediates/bin1" +installed: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/lib/liba.a" +sources: "out/target/product/fictional/system/lib/libc.a" +deps: { + file: "testdata/reciprocal/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/reciprocal/lib/libc.a.meta_lic" + annotations: "static" +} diff --git a/tools/compliance/cmd/testdata/reciprocal/bin/bin2.meta_lic b/tools/compliance/cmd/testdata/reciprocal/bin/bin2.meta_lic new file mode 100644 index 0000000000..4d28608077 --- /dev/null +++ b/tools/compliance/cmd/testdata/reciprocal/bin/bin2.meta_lic @@ -0,0 +1,19 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "dynamic/binary" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/bin_intermediates/bin1" +installed: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/lib/libd.so" +deps: { + file: "testdata/reciprocal/lib/libb.so.meta_lic" + annotations: "dynamic" +} +deps: { + file: "testdata/reciprocal/lib/libd.so.meta_lic" + annotations: "dynamic" +} diff --git a/tools/compliance/cmd/testdata/reciprocal/bin/bin3.meta_lic b/tools/compliance/cmd/testdata/reciprocal/bin/bin3.meta_lic new file mode 100644 index 0000000000..285d89959d --- /dev/null +++ b/tools/compliance/cmd/testdata/reciprocal/bin/bin3.meta_lic @@ -0,0 +1,8 @@ +package_name: "Compiler" +module_classes: "EXECUTABLES" +projects: "standalone/binary" +license_kinds: "SPDX-license-identifier-NCSA" +license_conditions: "notice" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/bin_intermediates/bin3" +installed: "out/target/product/fictional/system/bin/bin3" diff --git a/tools/compliance/cmd/testdata/reciprocal/container.zip.meta_lic b/tools/compliance/cmd/testdata/reciprocal/container.zip.meta_lic new file mode 100644 index 0000000000..ea3598f4df --- /dev/null +++ b/tools/compliance/cmd/testdata/reciprocal/container.zip.meta_lic @@ -0,0 +1,36 @@ +package_name: "Android" +projects: "container/zip" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: true +built: "out/target/product/fictional/obj/ETC/container_intermediates/container.zip" +installed: "out/target/product/fictional/data/container.zip" +install_map { + from_path: "out/target/product/fictional/system/lib/" + container_path: "" +} +install_map { + from_path: "out/target/product/fictional/system/bin/" + container_path: "" +} +sources: "out/target/product/fictional/system/lib/liba.so" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/bin/bin2" +deps: { + file: "testdata/reciprocal/bin/bin1.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/reciprocal/bin/bin2.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/reciprocal/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/reciprocal/lib/libb.so.meta_lic" + annotations: "static" +} diff --git a/tools/compliance/cmd/testdata/reciprocal/highest.apex.meta_lic b/tools/compliance/cmd/testdata/reciprocal/highest.apex.meta_lic new file mode 100644 index 0000000000..1fec741f37 --- /dev/null +++ b/tools/compliance/cmd/testdata/reciprocal/highest.apex.meta_lic @@ -0,0 +1,44 @@ +package_name: "Android" +projects: "highest/apex" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: true +built: "out/target/product/fictional/obj/ETC/highest_intermediates/highest.apex" +installed: "out/target/product/fictional/system/apex/highest.apex" +install_map { + from_path: "out/target/product/fictional/system/lib/liba.so" + container_path: "lib/liba.so" +} +install_map { + from_path: "out/target/product/fictional/system/lib/libb.so" + container_path: "lib/libb.so" +} +install_map { + from_path: "out/target/product/fictional/system/bin/bin1" + container_path: "bin/bin1" +} +install_map { + from_path: "out/target/product/fictional/system/bin/bin2" + container_path: "bin/bin2" +} +sources: "out/target/product/fictional/system/lib/liba.so" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/bin/bin2" +deps: { + file: "testdata/reciprocal/bin/bin1.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/reciprocal/bin/bin2.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/reciprocal/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/reciprocal/lib/libb.so.meta_lic" + annotations: "static" +} diff --git a/tools/compliance/cmd/testdata/reciprocal/lib/liba.so.meta_lic b/tools/compliance/cmd/testdata/reciprocal/lib/liba.so.meta_lic new file mode 100644 index 0000000000..79d7a9e205 --- /dev/null +++ b/tools/compliance/cmd/testdata/reciprocal/lib/liba.so.meta_lic @@ -0,0 +1,8 @@ +package_name: "Device" +projects: "device/library" +license_kinds: "SPDX-license-identifier-MPL" +license_conditions: "reciprocal" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/liba.so" +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/liba.a" +installed: "out/target/product/fictional/system/lib/liba.so" diff --git a/tools/compliance/cmd/testdata/reciprocal/lib/libb.so.meta_lic b/tools/compliance/cmd/testdata/reciprocal/lib/libb.so.meta_lic new file mode 100644 index 0000000000..a4935d4fd1 --- /dev/null +++ b/tools/compliance/cmd/testdata/reciprocal/lib/libb.so.meta_lic @@ -0,0 +1,9 @@ +package_name: "Android" +projects: "base/library" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libb.so" +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libb.a" +installed: "out/target/product/fictional/system/lib/libb.so" diff --git a/tools/compliance/cmd/testdata/reciprocal/lib/libc.a.meta_lic b/tools/compliance/cmd/testdata/reciprocal/lib/libc.a.meta_lic new file mode 100644 index 0000000000..8f6d356c9c --- /dev/null +++ b/tools/compliance/cmd/testdata/reciprocal/lib/libc.a.meta_lic @@ -0,0 +1,6 @@ +package_name: "External" +projects: "static/library" +license_kinds: "SPDX-license-identifier-MPL" +license_conditions: "reciprocal" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libc.a" diff --git a/tools/compliance/cmd/testdata/reciprocal/lib/libd.so.meta_lic b/tools/compliance/cmd/testdata/reciprocal/lib/libd.so.meta_lic new file mode 100644 index 0000000000..942d298075 --- /dev/null +++ b/tools/compliance/cmd/testdata/reciprocal/lib/libd.so.meta_lic @@ -0,0 +1,7 @@ +package_name: "External" +projects: "dynamic/library" +license_kinds: "SPDX-license-identifier-MIT" +license_conditions: "notice" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libd.so" +installed: "out/target/product/fictional/system/lib/libd.so" diff --git a/tools/compliance/cmd/testdata/restricted/application.meta_lic b/tools/compliance/cmd/testdata/restricted/application.meta_lic new file mode 100644 index 0000000000..a06a2c88f2 --- /dev/null +++ b/tools/compliance/cmd/testdata/restricted/application.meta_lic @@ -0,0 +1,24 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "distributable/application" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/application_intermediates/application" +installed: "out/target/product/fictional/bin/application" +sources: "out/target/product/fictional/system/lib/liba.a" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/bin/bin3" +deps: { + file: "testdata/restricted/bin/bin3.meta_lic" + annotations: "toolchain" +} +deps: { + file: "testdata/restricted/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/restricted/lib/libb.so.meta_lic" + annotations: "dynamic" +} diff --git a/tools/compliance/cmd/testdata/restricted/bin/bin1.meta_lic b/tools/compliance/cmd/testdata/restricted/bin/bin1.meta_lic new file mode 100644 index 0000000000..dd8a2e0e51 --- /dev/null +++ b/tools/compliance/cmd/testdata/restricted/bin/bin1.meta_lic @@ -0,0 +1,19 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "static/binary" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/bin_intermediates/bin1" +installed: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/lib/liba.a" +sources: "out/target/product/fictional/system/lib/libc.a" +deps: { + file: "testdata/restricted/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/restricted/lib/libc.a.meta_lic" + annotations: "static" +} diff --git a/tools/compliance/cmd/testdata/restricted/bin/bin2.meta_lic b/tools/compliance/cmd/testdata/restricted/bin/bin2.meta_lic new file mode 100644 index 0000000000..714b53753c --- /dev/null +++ b/tools/compliance/cmd/testdata/restricted/bin/bin2.meta_lic @@ -0,0 +1,19 @@ +package_name: "Android" +module_classes: "EXECUTABLES" +projects: "dynamic/binary" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/bin_intermediates/bin1" +installed: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/lib/libd.so" +deps: { + file: "testdata/restricted/lib/libb.so.meta_lic" + annotations: "dynamic" +} +deps: { + file: "testdata/restricted/lib/libd.so.meta_lic" + annotations: "dynamic" +} diff --git a/tools/compliance/cmd/testdata/restricted/bin/bin3.meta_lic b/tools/compliance/cmd/testdata/restricted/bin/bin3.meta_lic new file mode 100644 index 0000000000..f93553db67 --- /dev/null +++ b/tools/compliance/cmd/testdata/restricted/bin/bin3.meta_lic @@ -0,0 +1,8 @@ +package_name: "Compiler" +module_classes: "EXECUTABLES" +projects: "standalone/binary" +license_kinds: "SPDX-license-identifier-LGPL-2.0" +license_conditions: "restricted" +is_container: false +built: "out/target/product/fictional/obj/EXECUTABLES/bin_intermediates/bin3" +installed: "out/target/product/fictional/system/bin/bin3" diff --git a/tools/compliance/cmd/testdata/restricted/container.zip.meta_lic b/tools/compliance/cmd/testdata/restricted/container.zip.meta_lic new file mode 100644 index 0000000000..a63263b59a --- /dev/null +++ b/tools/compliance/cmd/testdata/restricted/container.zip.meta_lic @@ -0,0 +1,36 @@ +package_name: "Android" +projects: "container/zip" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: true +built: "out/target/product/fictional/obj/ETC/container_intermediates/container.zip" +installed: "out/target/product/fictional/data/container.zip" +install_map { + from_path: "out/target/product/fictional/system/lib/" + container_path: "" +} +install_map { + from_path: "out/target/product/fictional/system/bin/" + container_path: "" +} +sources: "out/target/product/fictional/system/lib/liba.so" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/bin/bin2" +deps: { + file: "testdata/restricted/bin/bin1.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/restricted/bin/bin2.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/restricted/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/restricted/lib/libb.so.meta_lic" + annotations: "static" +} diff --git a/tools/compliance/cmd/testdata/restricted/highest.apex.meta_lic b/tools/compliance/cmd/testdata/restricted/highest.apex.meta_lic new file mode 100644 index 0000000000..dba419a239 --- /dev/null +++ b/tools/compliance/cmd/testdata/restricted/highest.apex.meta_lic @@ -0,0 +1,44 @@ +package_name: "Android" +projects: "highest/apex" +license_kinds: "SPDX-license-identifier-Apache-2.0" +license_conditions: "notice" +license_texts: "build/soong/licenses/LICENSE" +is_container: true +built: "out/target/product/fictional/obj/ETC/highest_intermediates/highest.apex" +installed: "out/target/product/fictional/system/apex/highest.apex" +install_map { + from_path: "out/target/product/fictional/system/lib/liba.so" + container_path: "lib/liba.so" +} +install_map { + from_path: "out/target/product/fictional/system/lib/libb.so" + container_path: "lib/libb.so" +} +install_map { + from_path: "out/target/product/fictional/system/bin/bin1" + container_path: "bin/bin1" +} +install_map { + from_path: "out/target/product/fictional/system/bin/bin2" + container_path: "bin/bin2" +} +sources: "out/target/product/fictional/system/lib/liba.so" +sources: "out/target/product/fictional/system/lib/libb.so" +sources: "out/target/product/fictional/system/bin/bin1" +sources: "out/target/product/fictional/system/bin/bin2" +deps: { + file: "testdata/restricted/bin/bin1.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/restricted/bin/bin2.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/restricted/lib/liba.so.meta_lic" + annotations: "static" +} +deps: { + file: "testdata/restricted/lib/libb.so.meta_lic" + annotations: "static" +} diff --git a/tools/compliance/cmd/testdata/restricted/lib/liba.so.meta_lic b/tools/compliance/cmd/testdata/restricted/lib/liba.so.meta_lic new file mode 100644 index 0000000000..b1d456043d --- /dev/null +++ b/tools/compliance/cmd/testdata/restricted/lib/liba.so.meta_lic @@ -0,0 +1,8 @@ +package_name: "Device" +projects: "device/library" +license_kinds: "SPDX-license-identifier-LGPL-2.0" +license_conditions: "restricted" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/liba.so" +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/liba.a" +installed: "out/target/product/fictional/system/lib/liba.so" diff --git a/tools/compliance/cmd/testdata/restricted/lib/libb.so.meta_lic b/tools/compliance/cmd/testdata/restricted/lib/libb.so.meta_lic new file mode 100644 index 0000000000..c1b86d7a70 --- /dev/null +++ b/tools/compliance/cmd/testdata/restricted/lib/libb.so.meta_lic @@ -0,0 +1,8 @@ +package_name: "Android" +projects: "base/library" +license_kinds: "SPDX-license-identifier-GPL-2.0" +license_conditions: "restricted" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libb.so" +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libb.a" +installed: "out/target/product/fictional/system/lib/libb.so" diff --git a/tools/compliance/cmd/testdata/restricted/lib/libc.a.meta_lic b/tools/compliance/cmd/testdata/restricted/lib/libc.a.meta_lic new file mode 100644 index 0000000000..8f6d356c9c --- /dev/null +++ b/tools/compliance/cmd/testdata/restricted/lib/libc.a.meta_lic @@ -0,0 +1,6 @@ +package_name: "External" +projects: "static/library" +license_kinds: "SPDX-license-identifier-MPL" +license_conditions: "reciprocal" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libc.a" diff --git a/tools/compliance/cmd/testdata/restricted/lib/libd.so.meta_lic b/tools/compliance/cmd/testdata/restricted/lib/libd.so.meta_lic new file mode 100644 index 0000000000..942d298075 --- /dev/null +++ b/tools/compliance/cmd/testdata/restricted/lib/libd.so.meta_lic @@ -0,0 +1,7 @@ +package_name: "External" +projects: "dynamic/library" +license_kinds: "SPDX-license-identifier-MIT" +license_conditions: "notice" +is_container: false +built: "out/target/product/fictional/obj/SHARED_LIBRARIES/lib_intermediates/libd.so" +installed: "out/target/product/fictional/system/lib/libd.so" diff --git a/tools/compliance/condition.go b/tools/compliance/condition.go index e6d23ef3e5..b5c8cec04d 100644 --- a/tools/compliance/condition.go +++ b/tools/compliance/condition.go @@ -77,6 +77,15 @@ func (cl ConditionList) String() string { return sb.String() } +// Names returns the list of the conditions' names. +func (cl ConditionList) Names() []string { + result := make([]string, 0, len(cl)) + for _, lc := range cl { + result = append(result, lc.name) + } + return result +} + // HasByName returns true if the list contains any condition matching `name`. func (cl ConditionList) HasByName(name ConditionNames) bool { for _, lc := range cl { diff --git a/tools/compliance/conditionset.go b/tools/compliance/conditionset.go index d972eb9c48..1ad15cab4c 100644 --- a/tools/compliance/conditionset.go +++ b/tools/compliance/conditionset.go @@ -150,6 +150,15 @@ func (cs *LicenseConditionSet) AsList() ConditionList { return result } +// Names returns a list of the names of the conditions in the set. +func (cs *LicenseConditionSet) Names() []string { + result := make([]string, 0, len(cs.conditions)) + for name := range cs.conditions { + result = append(result, name) + } + return result +} + // Count returns the number of conditions in the set. func (cs *LicenseConditionSet) Count() int { size := 0