xref: /aosp_15_r20/build/make/tools/compliance/policy_shipped_test.go (revision 9e94795a3d4ef5c1d47486f9a02bb378756cea8a)
1*9e94795aSAndroid Build Coastguard Worker// Copyright 2021 Google LLC
2*9e94795aSAndroid Build Coastguard Worker//
3*9e94795aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*9e94795aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*9e94795aSAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*9e94795aSAndroid Build Coastguard Worker//
7*9e94795aSAndroid Build Coastguard Worker//      http://www.apache.org/licenses/LICENSE-2.0
8*9e94795aSAndroid Build Coastguard Worker//
9*9e94795aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*9e94795aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*9e94795aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9e94795aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*9e94795aSAndroid Build Coastguard Worker// limitations under the License.
14*9e94795aSAndroid Build Coastguard Worker
15*9e94795aSAndroid Build Coastguard Workerpackage compliance
16*9e94795aSAndroid Build Coastguard Worker
17*9e94795aSAndroid Build Coastguard Workerimport (
18*9e94795aSAndroid Build Coastguard Worker	"bytes"
19*9e94795aSAndroid Build Coastguard Worker	"sort"
20*9e94795aSAndroid Build Coastguard Worker	"strings"
21*9e94795aSAndroid Build Coastguard Worker	"testing"
22*9e94795aSAndroid Build Coastguard Worker)
23*9e94795aSAndroid Build Coastguard Worker
24*9e94795aSAndroid Build Coastguard Workerfunc TestShippedNodes(t *testing.T) {
25*9e94795aSAndroid Build Coastguard Worker	tests := []struct {
26*9e94795aSAndroid Build Coastguard Worker		name          string
27*9e94795aSAndroid Build Coastguard Worker		roots         []string
28*9e94795aSAndroid Build Coastguard Worker		edges         []annotated
29*9e94795aSAndroid Build Coastguard Worker		expectedNodes []string
30*9e94795aSAndroid Build Coastguard Worker	}{
31*9e94795aSAndroid Build Coastguard Worker		{
32*9e94795aSAndroid Build Coastguard Worker			name:          "singleton",
33*9e94795aSAndroid Build Coastguard Worker			roots:         []string{"apacheLib.meta_lic"},
34*9e94795aSAndroid Build Coastguard Worker			edges:         []annotated{},
35*9e94795aSAndroid Build Coastguard Worker			expectedNodes: []string{"apacheLib.meta_lic"},
36*9e94795aSAndroid Build Coastguard Worker		},
37*9e94795aSAndroid Build Coastguard Worker		{
38*9e94795aSAndroid Build Coastguard Worker			name:  "simplebinary",
39*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
40*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
41*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
42*9e94795aSAndroid Build Coastguard Worker			},
43*9e94795aSAndroid Build Coastguard Worker			expectedNodes: []string{"apacheBin.meta_lic", "apacheLib.meta_lic"},
44*9e94795aSAndroid Build Coastguard Worker		},
45*9e94795aSAndroid Build Coastguard Worker		{
46*9e94795aSAndroid Build Coastguard Worker			name:  "simpledynamic",
47*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
48*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
49*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
50*9e94795aSAndroid Build Coastguard Worker			},
51*9e94795aSAndroid Build Coastguard Worker			expectedNodes: []string{"apacheBin.meta_lic"},
52*9e94795aSAndroid Build Coastguard Worker		},
53*9e94795aSAndroid Build Coastguard Worker		{
54*9e94795aSAndroid Build Coastguard Worker			name:  "container",
55*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
56*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
57*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheLib.meta_lic", []string{"static"}},
58*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"static"}},
59*9e94795aSAndroid Build Coastguard Worker			},
60*9e94795aSAndroid Build Coastguard Worker			expectedNodes: []string{
61*9e94795aSAndroid Build Coastguard Worker				"apacheContainer.meta_lic",
62*9e94795aSAndroid Build Coastguard Worker				"apacheLib.meta_lic",
63*9e94795aSAndroid Build Coastguard Worker				"gplLib.meta_lic",
64*9e94795aSAndroid Build Coastguard Worker			},
65*9e94795aSAndroid Build Coastguard Worker		},
66*9e94795aSAndroid Build Coastguard Worker		{
67*9e94795aSAndroid Build Coastguard Worker			name:  "binary",
68*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
69*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
70*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
71*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
72*9e94795aSAndroid Build Coastguard Worker			},
73*9e94795aSAndroid Build Coastguard Worker			expectedNodes: []string{
74*9e94795aSAndroid Build Coastguard Worker				"apacheBin.meta_lic",
75*9e94795aSAndroid Build Coastguard Worker				"apacheLib.meta_lic",
76*9e94795aSAndroid Build Coastguard Worker				"gplLib.meta_lic",
77*9e94795aSAndroid Build Coastguard Worker			},
78*9e94795aSAndroid Build Coastguard Worker		},
79*9e94795aSAndroid Build Coastguard Worker		{
80*9e94795aSAndroid Build Coastguard Worker			name:  "binarydynamic",
81*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
82*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
83*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
84*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
85*9e94795aSAndroid Build Coastguard Worker			},
86*9e94795aSAndroid Build Coastguard Worker			expectedNodes: []string{
87*9e94795aSAndroid Build Coastguard Worker				"apacheBin.meta_lic",
88*9e94795aSAndroid Build Coastguard Worker				"apacheLib.meta_lic",
89*9e94795aSAndroid Build Coastguard Worker			},
90*9e94795aSAndroid Build Coastguard Worker		},
91*9e94795aSAndroid Build Coastguard Worker		{
92*9e94795aSAndroid Build Coastguard Worker			name:  "containerdeep",
93*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
94*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
95*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
96*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
97*9e94795aSAndroid Build Coastguard Worker				{"apacheLib.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
98*9e94795aSAndroid Build Coastguard Worker			},
99*9e94795aSAndroid Build Coastguard Worker			expectedNodes: []string{
100*9e94795aSAndroid Build Coastguard Worker				"apacheContainer.meta_lic",
101*9e94795aSAndroid Build Coastguard Worker				"apacheBin.meta_lic",
102*9e94795aSAndroid Build Coastguard Worker				"apacheLib.meta_lic",
103*9e94795aSAndroid Build Coastguard Worker			},
104*9e94795aSAndroid Build Coastguard Worker		},
105*9e94795aSAndroid Build Coastguard Worker	}
106*9e94795aSAndroid Build Coastguard Worker	for _, tt := range tests {
107*9e94795aSAndroid Build Coastguard Worker		t.Run(tt.name, func(t *testing.T) {
108*9e94795aSAndroid Build Coastguard Worker			stderr := &bytes.Buffer{}
109*9e94795aSAndroid Build Coastguard Worker			lg, err := toGraph(stderr, tt.roots, tt.edges)
110*9e94795aSAndroid Build Coastguard Worker			if err != nil {
111*9e94795aSAndroid Build Coastguard Worker				t.Errorf("unexpected test data error: got %s, want no error", err)
112*9e94795aSAndroid Build Coastguard Worker				return
113*9e94795aSAndroid Build Coastguard Worker			}
114*9e94795aSAndroid Build Coastguard Worker			t.Logf("graph:")
115*9e94795aSAndroid Build Coastguard Worker			for _, edge := range lg.Edges() {
116*9e94795aSAndroid Build Coastguard Worker				t.Logf("  %s", edge.String())
117*9e94795aSAndroid Build Coastguard Worker			}
118*9e94795aSAndroid Build Coastguard Worker			expectedNodes := append([]string{}, tt.expectedNodes...)
119*9e94795aSAndroid Build Coastguard Worker			nodeset := ShippedNodes(lg)
120*9e94795aSAndroid Build Coastguard Worker			t.Logf("shipped node set: %s", nodeset.String())
121*9e94795aSAndroid Build Coastguard Worker
122*9e94795aSAndroid Build Coastguard Worker			actualNodes := nodeset.Names()
123*9e94795aSAndroid Build Coastguard Worker			t.Logf("shipped nodes: [%s]", strings.Join(actualNodes, ", "))
124*9e94795aSAndroid Build Coastguard Worker
125*9e94795aSAndroid Build Coastguard Worker			sort.Strings(expectedNodes)
126*9e94795aSAndroid Build Coastguard Worker			sort.Strings(actualNodes)
127*9e94795aSAndroid Build Coastguard Worker
128*9e94795aSAndroid Build Coastguard Worker			t.Logf("sorted nodes: [%s]", strings.Join(actualNodes, ", "))
129*9e94795aSAndroid Build Coastguard Worker			t.Logf("expected nodes: [%s]", strings.Join(expectedNodes, ", "))
130*9e94795aSAndroid Build Coastguard Worker			if len(expectedNodes) != len(actualNodes) {
131*9e94795aSAndroid Build Coastguard Worker				t.Errorf("unexpected number of shipped nodes: %d nodes, want %d nodes",
132*9e94795aSAndroid Build Coastguard Worker					len(actualNodes), len(expectedNodes))
133*9e94795aSAndroid Build Coastguard Worker				return
134*9e94795aSAndroid Build Coastguard Worker			}
135*9e94795aSAndroid Build Coastguard Worker			for i := 0; i < len(actualNodes); i++ {
136*9e94795aSAndroid Build Coastguard Worker				if expectedNodes[i] != actualNodes[i] {
137*9e94795aSAndroid Build Coastguard Worker					t.Errorf("unexpected node at index %d: got %q, want %q",
138*9e94795aSAndroid Build Coastguard Worker						i, actualNodes[i], expectedNodes[i])
139*9e94795aSAndroid Build Coastguard Worker				}
140*9e94795aSAndroid Build Coastguard Worker			}
141*9e94795aSAndroid Build Coastguard Worker		})
142*9e94795aSAndroid Build Coastguard Worker	}
143*9e94795aSAndroid Build Coastguard Worker}
144