xref: /aosp_15_r20/build/make/tools/compliance/policy_resolve_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	"testing"
21*9e94795aSAndroid Build Coastguard Worker)
22*9e94795aSAndroid Build Coastguard Worker
23*9e94795aSAndroid Build Coastguard Workerfunc TestResolveBottomUpConditions(t *testing.T) {
24*9e94795aSAndroid Build Coastguard Worker	tests := []struct {
25*9e94795aSAndroid Build Coastguard Worker		name            string
26*9e94795aSAndroid Build Coastguard Worker		roots           []string
27*9e94795aSAndroid Build Coastguard Worker		edges           []annotated
28*9e94795aSAndroid Build Coastguard Worker		expectedActions []tcond
29*9e94795aSAndroid Build Coastguard Worker	}{
30*9e94795aSAndroid Build Coastguard Worker		{
31*9e94795aSAndroid Build Coastguard Worker			name:  "firstparty",
32*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
33*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
34*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
35*9e94795aSAndroid Build Coastguard Worker			},
36*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
37*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
38*9e94795aSAndroid Build Coastguard Worker				{"apacheLib.meta_lic", "notice"},
39*9e94795aSAndroid Build Coastguard Worker			},
40*9e94795aSAndroid Build Coastguard Worker		},
41*9e94795aSAndroid Build Coastguard Worker		{
42*9e94795aSAndroid Build Coastguard Worker			name:  "firstpartytool",
43*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
44*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
45*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"toolchain"}},
46*9e94795aSAndroid Build Coastguard Worker			},
47*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
48*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
49*9e94795aSAndroid Build Coastguard Worker				{"apacheLib.meta_lic", "notice"},
50*9e94795aSAndroid Build Coastguard Worker			},
51*9e94795aSAndroid Build Coastguard Worker		},
52*9e94795aSAndroid Build Coastguard Worker		{
53*9e94795aSAndroid Build Coastguard Worker			name:  "firstpartydeep",
54*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
55*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
56*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
57*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
58*9e94795aSAndroid Build Coastguard Worker			},
59*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
60*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice"},
61*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
62*9e94795aSAndroid Build Coastguard Worker				{"apacheLib.meta_lic", "notice"},
63*9e94795aSAndroid Build Coastguard Worker			},
64*9e94795aSAndroid Build Coastguard Worker		},
65*9e94795aSAndroid Build Coastguard Worker		{
66*9e94795aSAndroid Build Coastguard Worker			name:  "firstpartywide",
67*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
68*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
69*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
70*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheLib.meta_lic", []string{"static"}},
71*9e94795aSAndroid Build Coastguard Worker			},
72*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
73*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice"},
74*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
75*9e94795aSAndroid Build Coastguard Worker				{"apacheLib.meta_lic", "notice"},
76*9e94795aSAndroid Build Coastguard Worker			},
77*9e94795aSAndroid Build Coastguard Worker		},
78*9e94795aSAndroid Build Coastguard Worker		{
79*9e94795aSAndroid Build Coastguard Worker			name:  "firstpartydynamic",
80*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
81*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
82*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
83*9e94795aSAndroid Build Coastguard Worker			},
84*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
85*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
86*9e94795aSAndroid Build Coastguard Worker				{"apacheLib.meta_lic", "notice"},
87*9e94795aSAndroid Build Coastguard Worker			},
88*9e94795aSAndroid Build Coastguard Worker		},
89*9e94795aSAndroid Build Coastguard Worker		{
90*9e94795aSAndroid Build Coastguard Worker			name:  "firstpartydynamicdeep",
91*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
92*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
93*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
94*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
95*9e94795aSAndroid Build Coastguard Worker			},
96*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
97*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice"},
98*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
99*9e94795aSAndroid Build Coastguard Worker				{"apacheLib.meta_lic", "notice"},
100*9e94795aSAndroid Build Coastguard Worker			},
101*9e94795aSAndroid Build Coastguard Worker		},
102*9e94795aSAndroid Build Coastguard Worker		{
103*9e94795aSAndroid Build Coastguard Worker			name:  "firstpartydynamicwide",
104*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
105*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
106*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
107*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
108*9e94795aSAndroid Build Coastguard Worker			},
109*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
110*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice"},
111*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
112*9e94795aSAndroid Build Coastguard Worker				{"apacheLib.meta_lic", "notice"},
113*9e94795aSAndroid Build Coastguard Worker			},
114*9e94795aSAndroid Build Coastguard Worker		},
115*9e94795aSAndroid Build Coastguard Worker		{
116*9e94795aSAndroid Build Coastguard Worker			name:  "restricted",
117*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
118*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
119*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
120*9e94795aSAndroid Build Coastguard Worker			},
121*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
122*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice|restricted"},
123*9e94795aSAndroid Build Coastguard Worker				{"gplLib.meta_lic", "restricted"},
124*9e94795aSAndroid Build Coastguard Worker			},
125*9e94795aSAndroid Build Coastguard Worker		},
126*9e94795aSAndroid Build Coastguard Worker		{
127*9e94795aSAndroid Build Coastguard Worker			name:  "restrictedtool",
128*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
129*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
130*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"toolchain"}},
131*9e94795aSAndroid Build Coastguard Worker			},
132*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
133*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
134*9e94795aSAndroid Build Coastguard Worker				{"gplLib.meta_lic", "restricted"},
135*9e94795aSAndroid Build Coastguard Worker			},
136*9e94795aSAndroid Build Coastguard Worker		},
137*9e94795aSAndroid Build Coastguard Worker		{
138*9e94795aSAndroid Build Coastguard Worker			name:  "restricteddeep",
139*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
140*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
141*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
142*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
143*9e94795aSAndroid Build Coastguard Worker			},
144*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
145*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice|restricted"},
146*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice|restricted"},
147*9e94795aSAndroid Build Coastguard Worker				{"gplLib.meta_lic", "restricted"},
148*9e94795aSAndroid Build Coastguard Worker			},
149*9e94795aSAndroid Build Coastguard Worker		},
150*9e94795aSAndroid Build Coastguard Worker		{
151*9e94795aSAndroid Build Coastguard Worker			name:  "restrictedwide",
152*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
153*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
154*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
155*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"static"}},
156*9e94795aSAndroid Build Coastguard Worker			},
157*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
158*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice|restricted"},
159*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
160*9e94795aSAndroid Build Coastguard Worker				{"gplLib.meta_lic", "restricted"},
161*9e94795aSAndroid Build Coastguard Worker			},
162*9e94795aSAndroid Build Coastguard Worker		},
163*9e94795aSAndroid Build Coastguard Worker		{
164*9e94795aSAndroid Build Coastguard Worker			name:  "restricteddynamic",
165*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
166*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
167*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
168*9e94795aSAndroid Build Coastguard Worker			},
169*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
170*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice|restricted"},
171*9e94795aSAndroid Build Coastguard Worker				{"gplLib.meta_lic", "restricted"},
172*9e94795aSAndroid Build Coastguard Worker			},
173*9e94795aSAndroid Build Coastguard Worker		},
174*9e94795aSAndroid Build Coastguard Worker		{
175*9e94795aSAndroid Build Coastguard Worker			name:  "restricteddynamicdeep",
176*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
177*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
178*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
179*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
180*9e94795aSAndroid Build Coastguard Worker			},
181*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
182*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice|restricted"},
183*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice|restricted"},
184*9e94795aSAndroid Build Coastguard Worker				{"gplLib.meta_lic", "restricted"},
185*9e94795aSAndroid Build Coastguard Worker			},
186*9e94795aSAndroid Build Coastguard Worker		},
187*9e94795aSAndroid Build Coastguard Worker		{
188*9e94795aSAndroid Build Coastguard Worker			name:  "restricteddynamicwide",
189*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
190*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
191*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
192*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
193*9e94795aSAndroid Build Coastguard Worker			},
194*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
195*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice|restricted"},
196*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
197*9e94795aSAndroid Build Coastguard Worker				{"gplLib.meta_lic", "restricted"},
198*9e94795aSAndroid Build Coastguard Worker			},
199*9e94795aSAndroid Build Coastguard Worker		},
200*9e94795aSAndroid Build Coastguard Worker		{
201*9e94795aSAndroid Build Coastguard Worker			name:  "weakrestricted",
202*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
203*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
204*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"static"}},
205*9e94795aSAndroid Build Coastguard Worker			},
206*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
207*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice|restricted_if_statically_linked"},
208*9e94795aSAndroid Build Coastguard Worker				{"lgplLib.meta_lic", "restricted_if_statically_linked"},
209*9e94795aSAndroid Build Coastguard Worker			},
210*9e94795aSAndroid Build Coastguard Worker		},
211*9e94795aSAndroid Build Coastguard Worker		{
212*9e94795aSAndroid Build Coastguard Worker			name:  "weakrestrictedtool",
213*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
214*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
215*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"toolchain"}},
216*9e94795aSAndroid Build Coastguard Worker			},
217*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
218*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
219*9e94795aSAndroid Build Coastguard Worker				{"lgplLib.meta_lic", "restricted_if_statically_linked"},
220*9e94795aSAndroid Build Coastguard Worker			},
221*9e94795aSAndroid Build Coastguard Worker		},
222*9e94795aSAndroid Build Coastguard Worker		{
223*9e94795aSAndroid Build Coastguard Worker			name:  "weakrestricteddeep",
224*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
225*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
226*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
227*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"static"}},
228*9e94795aSAndroid Build Coastguard Worker			},
229*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
230*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice|restricted_if_statically_linked"},
231*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice|restricted_if_statically_linked"},
232*9e94795aSAndroid Build Coastguard Worker				{"lgplLib.meta_lic", "restricted_if_statically_linked"},
233*9e94795aSAndroid Build Coastguard Worker			},
234*9e94795aSAndroid Build Coastguard Worker		},
235*9e94795aSAndroid Build Coastguard Worker		{
236*9e94795aSAndroid Build Coastguard Worker			name:  "weakrestrictedwide",
237*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
238*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
239*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
240*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "lgplLib.meta_lic", []string{"static"}},
241*9e94795aSAndroid Build Coastguard Worker			},
242*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
243*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice|restricted_if_statically_linked"},
244*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
245*9e94795aSAndroid Build Coastguard Worker				{"lgplLib.meta_lic", "restricted_if_statically_linked"},
246*9e94795aSAndroid Build Coastguard Worker			},
247*9e94795aSAndroid Build Coastguard Worker		},
248*9e94795aSAndroid Build Coastguard Worker		{
249*9e94795aSAndroid Build Coastguard Worker			name:  "weakrestricteddynamic",
250*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
251*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
252*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
253*9e94795aSAndroid Build Coastguard Worker			},
254*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
255*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
256*9e94795aSAndroid Build Coastguard Worker				{"lgplLib.meta_lic", "restricted_if_statically_linked"},
257*9e94795aSAndroid Build Coastguard Worker			},
258*9e94795aSAndroid Build Coastguard Worker		},
259*9e94795aSAndroid Build Coastguard Worker		{
260*9e94795aSAndroid Build Coastguard Worker			name:  "weakrestricteddynamicdeep",
261*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
262*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
263*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
264*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
265*9e94795aSAndroid Build Coastguard Worker			},
266*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
267*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice"},
268*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
269*9e94795aSAndroid Build Coastguard Worker				{"lgplLib.meta_lic", "restricted_if_statically_linked"},
270*9e94795aSAndroid Build Coastguard Worker			},
271*9e94795aSAndroid Build Coastguard Worker		},
272*9e94795aSAndroid Build Coastguard Worker		{
273*9e94795aSAndroid Build Coastguard Worker			name:  "weakrestricteddynamicwide",
274*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
275*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
276*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
277*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
278*9e94795aSAndroid Build Coastguard Worker			},
279*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
280*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice"},
281*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
282*9e94795aSAndroid Build Coastguard Worker				{"lgplLib.meta_lic", "restricted_if_statically_linked"},
283*9e94795aSAndroid Build Coastguard Worker			},
284*9e94795aSAndroid Build Coastguard Worker		},
285*9e94795aSAndroid Build Coastguard Worker		{
286*9e94795aSAndroid Build Coastguard Worker			name:  "classpath",
287*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
288*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
289*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}},
290*9e94795aSAndroid Build Coastguard Worker			},
291*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
292*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
293*9e94795aSAndroid Build Coastguard Worker				{"gplWithClasspathException.meta_lic", "permissive"},
294*9e94795aSAndroid Build Coastguard Worker			},
295*9e94795aSAndroid Build Coastguard Worker		},
296*9e94795aSAndroid Build Coastguard Worker		{
297*9e94795aSAndroid Build Coastguard Worker			name:  "classpathdependent",
298*9e94795aSAndroid Build Coastguard Worker			roots: []string{"dependentModule.meta_lic"},
299*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
300*9e94795aSAndroid Build Coastguard Worker				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}},
301*9e94795aSAndroid Build Coastguard Worker			},
302*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
303*9e94795aSAndroid Build Coastguard Worker				{"dependentModule.meta_lic", "notice"},
304*9e94795aSAndroid Build Coastguard Worker				{"gplWithClasspathException.meta_lic", "permissive"},
305*9e94795aSAndroid Build Coastguard Worker			},
306*9e94795aSAndroid Build Coastguard Worker		},
307*9e94795aSAndroid Build Coastguard Worker		{
308*9e94795aSAndroid Build Coastguard Worker			name:  "classpathdynamic",
309*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
310*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
311*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
312*9e94795aSAndroid Build Coastguard Worker			},
313*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
314*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
315*9e94795aSAndroid Build Coastguard Worker				{"gplWithClasspathException.meta_lic", "permissive"},
316*9e94795aSAndroid Build Coastguard Worker			},
317*9e94795aSAndroid Build Coastguard Worker		},
318*9e94795aSAndroid Build Coastguard Worker		{
319*9e94795aSAndroid Build Coastguard Worker			name:  "classpathdependentdynamic",
320*9e94795aSAndroid Build Coastguard Worker			roots: []string{"dependentModule.meta_lic"},
321*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
322*9e94795aSAndroid Build Coastguard Worker				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
323*9e94795aSAndroid Build Coastguard Worker			},
324*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
325*9e94795aSAndroid Build Coastguard Worker				{"dependentModule.meta_lic", "notice"},
326*9e94795aSAndroid Build Coastguard Worker				{"gplWithClasspathException.meta_lic", "permissive"},
327*9e94795aSAndroid Build Coastguard Worker			},
328*9e94795aSAndroid Build Coastguard Worker		},
329*9e94795aSAndroid Build Coastguard Worker	}
330*9e94795aSAndroid Build Coastguard Worker	for _, tt := range tests {
331*9e94795aSAndroid Build Coastguard Worker		t.Run(tt.name, func(t *testing.T) {
332*9e94795aSAndroid Build Coastguard Worker			stderr := &bytes.Buffer{}
333*9e94795aSAndroid Build Coastguard Worker			lg, err := toGraph(stderr, tt.roots, tt.edges)
334*9e94795aSAndroid Build Coastguard Worker			if err != nil {
335*9e94795aSAndroid Build Coastguard Worker				t.Errorf("unexpected test data error: got %s, want no error", err)
336*9e94795aSAndroid Build Coastguard Worker				return
337*9e94795aSAndroid Build Coastguard Worker			}
338*9e94795aSAndroid Build Coastguard Worker
339*9e94795aSAndroid Build Coastguard Worker			logGraph(lg, t)
340*9e94795aSAndroid Build Coastguard Worker
341*9e94795aSAndroid Build Coastguard Worker			ResolveBottomUpConditions(lg)
342*9e94795aSAndroid Build Coastguard Worker			actual := asActionList(lg)
343*9e94795aSAndroid Build Coastguard Worker			sort.Sort(actual)
344*9e94795aSAndroid Build Coastguard Worker			t.Logf("actual: %s", actual.String())
345*9e94795aSAndroid Build Coastguard Worker
346*9e94795aSAndroid Build Coastguard Worker			expected := toActionList(lg, tt.expectedActions)
347*9e94795aSAndroid Build Coastguard Worker			sort.Sort(expected)
348*9e94795aSAndroid Build Coastguard Worker			t.Logf("expected: %s", expected.String())
349*9e94795aSAndroid Build Coastguard Worker
350*9e94795aSAndroid Build Coastguard Worker			if len(actual) != len(expected) {
351*9e94795aSAndroid Build Coastguard Worker				t.Errorf("unexpected number of actions: got %d, want %d", len(actual), len(expected))
352*9e94795aSAndroid Build Coastguard Worker				return
353*9e94795aSAndroid Build Coastguard Worker			}
354*9e94795aSAndroid Build Coastguard Worker			for i := 0; i < len(actual); i++ {
355*9e94795aSAndroid Build Coastguard Worker				if actual[i] != expected[i] {
356*9e94795aSAndroid Build Coastguard Worker					t.Errorf("unexpected action at index %d: got %s, want %s", i, actual[i].String(), expected[i].String())
357*9e94795aSAndroid Build Coastguard Worker				}
358*9e94795aSAndroid Build Coastguard Worker			}
359*9e94795aSAndroid Build Coastguard Worker		})
360*9e94795aSAndroid Build Coastguard Worker	}
361*9e94795aSAndroid Build Coastguard Worker}
362*9e94795aSAndroid Build Coastguard Worker
363*9e94795aSAndroid Build Coastguard Workerfunc TestResolveTopDownConditions(t *testing.T) {
364*9e94795aSAndroid Build Coastguard Worker	tests := []struct {
365*9e94795aSAndroid Build Coastguard Worker		name            string
366*9e94795aSAndroid Build Coastguard Worker		roots           []string
367*9e94795aSAndroid Build Coastguard Worker		edges           []annotated
368*9e94795aSAndroid Build Coastguard Worker		expectedActions []tcond
369*9e94795aSAndroid Build Coastguard Worker	}{
370*9e94795aSAndroid Build Coastguard Worker		{
371*9e94795aSAndroid Build Coastguard Worker			name:  "firstparty",
372*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
373*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
374*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
375*9e94795aSAndroid Build Coastguard Worker			},
376*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
377*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
378*9e94795aSAndroid Build Coastguard Worker				{"apacheLib.meta_lic", "notice"},
379*9e94795aSAndroid Build Coastguard Worker			},
380*9e94795aSAndroid Build Coastguard Worker		},
381*9e94795aSAndroid Build Coastguard Worker		{
382*9e94795aSAndroid Build Coastguard Worker			name:  "firstpartydynamic",
383*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
384*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
385*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
386*9e94795aSAndroid Build Coastguard Worker			},
387*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
388*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
389*9e94795aSAndroid Build Coastguard Worker				{"apacheLib.meta_lic", "notice"},
390*9e94795aSAndroid Build Coastguard Worker			},
391*9e94795aSAndroid Build Coastguard Worker		},
392*9e94795aSAndroid Build Coastguard Worker		{
393*9e94795aSAndroid Build Coastguard Worker			name:  "restricted",
394*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
395*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
396*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
397*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
398*9e94795aSAndroid Build Coastguard Worker			},
399*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
400*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice|restricted"},
401*9e94795aSAndroid Build Coastguard Worker				{"mitLib.meta_lic", "notice|restricted"},
402*9e94795aSAndroid Build Coastguard Worker				{"gplLib.meta_lic", "restricted"},
403*9e94795aSAndroid Build Coastguard Worker			},
404*9e94795aSAndroid Build Coastguard Worker		},
405*9e94795aSAndroid Build Coastguard Worker		{
406*9e94795aSAndroid Build Coastguard Worker			name:  "restrictedtool",
407*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
408*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
409*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplBin.meta_lic", []string{"toolchain"}},
410*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
411*9e94795aSAndroid Build Coastguard Worker			},
412*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
413*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
414*9e94795aSAndroid Build Coastguard Worker				{"mitLib.meta_lic", "notice"},
415*9e94795aSAndroid Build Coastguard Worker				{"gplBin.meta_lic", "restricted"},
416*9e94795aSAndroid Build Coastguard Worker			},
417*9e94795aSAndroid Build Coastguard Worker		},
418*9e94795aSAndroid Build Coastguard Worker		{
419*9e94795aSAndroid Build Coastguard Worker			name:  "restricteddeep",
420*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
421*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
422*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
423*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "mitBin.meta_lic", []string{"static"}},
424*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
425*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "mplLib.meta_lic", []string{"static"}},
426*9e94795aSAndroid Build Coastguard Worker				{"mitBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
427*9e94795aSAndroid Build Coastguard Worker			},
428*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
429*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice|restricted"},
430*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice|restricted"},
431*9e94795aSAndroid Build Coastguard Worker				{"mitBin.meta_lic", "notice"},
432*9e94795aSAndroid Build Coastguard Worker				{"gplLib.meta_lic", "restricted"},
433*9e94795aSAndroid Build Coastguard Worker				{"mplLib.meta_lic", "reciprocal|restricted"},
434*9e94795aSAndroid Build Coastguard Worker				{"mitLib.meta_lic", "notice"},
435*9e94795aSAndroid Build Coastguard Worker			},
436*9e94795aSAndroid Build Coastguard Worker		},
437*9e94795aSAndroid Build Coastguard Worker		{
438*9e94795aSAndroid Build Coastguard Worker			name:  "restrictedwide",
439*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
440*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
441*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
442*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"static"}},
443*9e94795aSAndroid Build Coastguard Worker			},
444*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
445*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice|restricted"},
446*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
447*9e94795aSAndroid Build Coastguard Worker				{"gplLib.meta_lic", "restricted"},
448*9e94795aSAndroid Build Coastguard Worker			},
449*9e94795aSAndroid Build Coastguard Worker		},
450*9e94795aSAndroid Build Coastguard Worker		{
451*9e94795aSAndroid Build Coastguard Worker			name:  "restricteddynamic",
452*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
453*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
454*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
455*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"dynamic"}},
456*9e94795aSAndroid Build Coastguard Worker			},
457*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
458*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice|restricted"},
459*9e94795aSAndroid Build Coastguard Worker				{"gplLib.meta_lic", "restricted"},
460*9e94795aSAndroid Build Coastguard Worker				{"mitLib.meta_lic", "notice|restricted"},
461*9e94795aSAndroid Build Coastguard Worker			},
462*9e94795aSAndroid Build Coastguard Worker		},
463*9e94795aSAndroid Build Coastguard Worker		{
464*9e94795aSAndroid Build Coastguard Worker			name:  "restricteddynamicdeep",
465*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
466*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
467*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
468*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "mitBin.meta_lic", []string{"static"}},
469*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
470*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "mplLib.meta_lic", []string{"dynamic"}},
471*9e94795aSAndroid Build Coastguard Worker				{"mitBin.meta_lic", "mitLib.meta_lic", []string{"dynamic"}},
472*9e94795aSAndroid Build Coastguard Worker			},
473*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
474*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice|restricted"},
475*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice|restricted"},
476*9e94795aSAndroid Build Coastguard Worker				{"mitBin.meta_lic", "notice"},
477*9e94795aSAndroid Build Coastguard Worker				{"gplLib.meta_lic", "restricted"},
478*9e94795aSAndroid Build Coastguard Worker				{"mplLib.meta_lic", "reciprocal|restricted"},
479*9e94795aSAndroid Build Coastguard Worker				{"mitLib.meta_lic", "notice"},
480*9e94795aSAndroid Build Coastguard Worker			},
481*9e94795aSAndroid Build Coastguard Worker		},
482*9e94795aSAndroid Build Coastguard Worker		{
483*9e94795aSAndroid Build Coastguard Worker			name:  "restricteddynamicwide",
484*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
485*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
486*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
487*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
488*9e94795aSAndroid Build Coastguard Worker			},
489*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
490*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice|restricted"},
491*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
492*9e94795aSAndroid Build Coastguard Worker				{"gplLib.meta_lic", "restricted"},
493*9e94795aSAndroid Build Coastguard Worker			},
494*9e94795aSAndroid Build Coastguard Worker		},
495*9e94795aSAndroid Build Coastguard Worker		{
496*9e94795aSAndroid Build Coastguard Worker			name:  "weakrestricted",
497*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
498*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
499*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"static"}},
500*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
501*9e94795aSAndroid Build Coastguard Worker			},
502*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
503*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice|restricted_if_statically_linked"},
504*9e94795aSAndroid Build Coastguard Worker				{"lgplLib.meta_lic", "restricted_if_statically_linked"},
505*9e94795aSAndroid Build Coastguard Worker				{"mitLib.meta_lic", "notice|restricted_if_statically_linked"},
506*9e94795aSAndroid Build Coastguard Worker			},
507*9e94795aSAndroid Build Coastguard Worker		},
508*9e94795aSAndroid Build Coastguard Worker		{
509*9e94795aSAndroid Build Coastguard Worker			name:  "weakrestrictedtool",
510*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
511*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
512*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "lgplBin.meta_lic", []string{"toolchain"}},
513*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
514*9e94795aSAndroid Build Coastguard Worker			},
515*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
516*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
517*9e94795aSAndroid Build Coastguard Worker				{"lgplBin.meta_lic", "restricted_if_statically_linked"},
518*9e94795aSAndroid Build Coastguard Worker				{"mitLib.meta_lic", "notice"},
519*9e94795aSAndroid Build Coastguard Worker			},
520*9e94795aSAndroid Build Coastguard Worker		},
521*9e94795aSAndroid Build Coastguard Worker		{
522*9e94795aSAndroid Build Coastguard Worker			name:  "weakrestricteddeep",
523*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
524*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
525*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
526*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"static"}},
527*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
528*9e94795aSAndroid Build Coastguard Worker			},
529*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
530*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice|restricted_if_statically_linked"},
531*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice|restricted_if_statically_linked"},
532*9e94795aSAndroid Build Coastguard Worker				{"lgplLib.meta_lic", "restricted_if_statically_linked"},
533*9e94795aSAndroid Build Coastguard Worker				{"mitLib.meta_lic", "notice|restricted_if_statically_linked"},
534*9e94795aSAndroid Build Coastguard Worker			},
535*9e94795aSAndroid Build Coastguard Worker		},
536*9e94795aSAndroid Build Coastguard Worker		{
537*9e94795aSAndroid Build Coastguard Worker			name:  "weakrestrictedwide",
538*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
539*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
540*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
541*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "lgplLib.meta_lic", []string{"static"}},
542*9e94795aSAndroid Build Coastguard Worker			},
543*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
544*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice|restricted_if_statically_linked"},
545*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
546*9e94795aSAndroid Build Coastguard Worker				{"lgplLib.meta_lic", "restricted_if_statically_linked"},
547*9e94795aSAndroid Build Coastguard Worker			},
548*9e94795aSAndroid Build Coastguard Worker		},
549*9e94795aSAndroid Build Coastguard Worker		{
550*9e94795aSAndroid Build Coastguard Worker			name:  "weakrestricteddynamic",
551*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
552*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
553*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
554*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
555*9e94795aSAndroid Build Coastguard Worker			},
556*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
557*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
558*9e94795aSAndroid Build Coastguard Worker				{"lgplLib.meta_lic", "restricted_if_statically_linked"},
559*9e94795aSAndroid Build Coastguard Worker				{"mitLib.meta_lic", "notice"},
560*9e94795aSAndroid Build Coastguard Worker			},
561*9e94795aSAndroid Build Coastguard Worker		},
562*9e94795aSAndroid Build Coastguard Worker		{
563*9e94795aSAndroid Build Coastguard Worker			name:  "weakrestricteddynamicdeep",
564*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
565*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
566*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
567*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
568*9e94795aSAndroid Build Coastguard Worker			},
569*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
570*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice"},
571*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
572*9e94795aSAndroid Build Coastguard Worker				{"lgplLib.meta_lic", "restricted_if_statically_linked"},
573*9e94795aSAndroid Build Coastguard Worker			},
574*9e94795aSAndroid Build Coastguard Worker		},
575*9e94795aSAndroid Build Coastguard Worker		{
576*9e94795aSAndroid Build Coastguard Worker			name:  "weakrestricteddynamicwide",
577*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheContainer.meta_lic"},
578*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
579*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
580*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
581*9e94795aSAndroid Build Coastguard Worker			},
582*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
583*9e94795aSAndroid Build Coastguard Worker				{"apacheContainer.meta_lic", "notice"},
584*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
585*9e94795aSAndroid Build Coastguard Worker				{"lgplLib.meta_lic", "restricted_if_statically_linked"},
586*9e94795aSAndroid Build Coastguard Worker			},
587*9e94795aSAndroid Build Coastguard Worker		},
588*9e94795aSAndroid Build Coastguard Worker		{
589*9e94795aSAndroid Build Coastguard Worker			name:  "classpath",
590*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
591*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
592*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}},
593*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
594*9e94795aSAndroid Build Coastguard Worker			},
595*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
596*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
597*9e94795aSAndroid Build Coastguard Worker				{"gplWithClasspathException.meta_lic", "permissive"},
598*9e94795aSAndroid Build Coastguard Worker				{"mitLib.meta_lic", "notice"},
599*9e94795aSAndroid Build Coastguard Worker			},
600*9e94795aSAndroid Build Coastguard Worker		},
601*9e94795aSAndroid Build Coastguard Worker		{
602*9e94795aSAndroid Build Coastguard Worker			name:  "classpathdependent",
603*9e94795aSAndroid Build Coastguard Worker			roots: []string{"dependentModule.meta_lic"},
604*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
605*9e94795aSAndroid Build Coastguard Worker				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}},
606*9e94795aSAndroid Build Coastguard Worker				{"dependentModule.meta_lic", "mitLib.meta_lic", []string{"static"}},
607*9e94795aSAndroid Build Coastguard Worker			},
608*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
609*9e94795aSAndroid Build Coastguard Worker				{"dependentModule.meta_lic", "notice"},
610*9e94795aSAndroid Build Coastguard Worker				{"gplWithClasspathException.meta_lic", "permissive"},
611*9e94795aSAndroid Build Coastguard Worker				{"mitLib.meta_lic", "notice"},
612*9e94795aSAndroid Build Coastguard Worker			},
613*9e94795aSAndroid Build Coastguard Worker		},
614*9e94795aSAndroid Build Coastguard Worker		{
615*9e94795aSAndroid Build Coastguard Worker			name:  "classpathdynamic",
616*9e94795aSAndroid Build Coastguard Worker			roots: []string{"apacheBin.meta_lic"},
617*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
618*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
619*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
620*9e94795aSAndroid Build Coastguard Worker			},
621*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
622*9e94795aSAndroid Build Coastguard Worker				{"apacheBin.meta_lic", "notice"},
623*9e94795aSAndroid Build Coastguard Worker				{"gplWithClasspathException.meta_lic", "permissive"},
624*9e94795aSAndroid Build Coastguard Worker				{"mitLib.meta_lic", "notice"},
625*9e94795aSAndroid Build Coastguard Worker			},
626*9e94795aSAndroid Build Coastguard Worker		},
627*9e94795aSAndroid Build Coastguard Worker		{
628*9e94795aSAndroid Build Coastguard Worker			name:  "classpathdependentdynamic",
629*9e94795aSAndroid Build Coastguard Worker			roots: []string{"dependentModule.meta_lic"},
630*9e94795aSAndroid Build Coastguard Worker			edges: []annotated{
631*9e94795aSAndroid Build Coastguard Worker				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
632*9e94795aSAndroid Build Coastguard Worker				{"dependentModule.meta_lic", "mitLib.meta_lic", []string{"static"}},
633*9e94795aSAndroid Build Coastguard Worker			},
634*9e94795aSAndroid Build Coastguard Worker			expectedActions: []tcond{
635*9e94795aSAndroid Build Coastguard Worker				{"dependentModule.meta_lic", "notice"},
636*9e94795aSAndroid Build Coastguard Worker				{"gplWithClasspathException.meta_lic", "permissive"},
637*9e94795aSAndroid Build Coastguard Worker				{"mitLib.meta_lic", "notice"},
638*9e94795aSAndroid Build Coastguard Worker			},
639*9e94795aSAndroid Build Coastguard Worker		},
640*9e94795aSAndroid Build Coastguard Worker	}
641*9e94795aSAndroid Build Coastguard Worker	for _, tt := range tests {
642*9e94795aSAndroid Build Coastguard Worker		t.Run(tt.name, func(t *testing.T) {
643*9e94795aSAndroid Build Coastguard Worker			stderr := &bytes.Buffer{}
644*9e94795aSAndroid Build Coastguard Worker			lg, err := toGraph(stderr, tt.roots, tt.edges)
645*9e94795aSAndroid Build Coastguard Worker			if err != nil {
646*9e94795aSAndroid Build Coastguard Worker				t.Errorf("unexpected test data error: got %s, want no error", err)
647*9e94795aSAndroid Build Coastguard Worker				return
648*9e94795aSAndroid Build Coastguard Worker			}
649*9e94795aSAndroid Build Coastguard Worker
650*9e94795aSAndroid Build Coastguard Worker			logGraph(lg, t)
651*9e94795aSAndroid Build Coastguard Worker
652*9e94795aSAndroid Build Coastguard Worker			ResolveTopDownConditions(lg)
653*9e94795aSAndroid Build Coastguard Worker			actual := asActionList(lg)
654*9e94795aSAndroid Build Coastguard Worker			sort.Sort(actual)
655*9e94795aSAndroid Build Coastguard Worker			t.Logf("actual: %s", actual.String())
656*9e94795aSAndroid Build Coastguard Worker
657*9e94795aSAndroid Build Coastguard Worker			expected := toActionList(lg, tt.expectedActions)
658*9e94795aSAndroid Build Coastguard Worker			sort.Sort(expected)
659*9e94795aSAndroid Build Coastguard Worker			t.Logf("expected: %s", expected.String())
660*9e94795aSAndroid Build Coastguard Worker
661*9e94795aSAndroid Build Coastguard Worker			if len(actual) != len(expected) {
662*9e94795aSAndroid Build Coastguard Worker				t.Errorf("unexpected number of actions: got %d, want %d", len(actual), len(expected))
663*9e94795aSAndroid Build Coastguard Worker				return
664*9e94795aSAndroid Build Coastguard Worker			}
665*9e94795aSAndroid Build Coastguard Worker			for i := 0; i < len(actual); i++ {
666*9e94795aSAndroid Build Coastguard Worker				if actual[i] != expected[i] {
667*9e94795aSAndroid Build Coastguard Worker					t.Errorf("unexpected action at index %d: got %s, want %s", i, actual[i].String(), expected[i].String())
668*9e94795aSAndroid Build Coastguard Worker				}
669*9e94795aSAndroid Build Coastguard Worker			}
670*9e94795aSAndroid Build Coastguard Worker		})
671*9e94795aSAndroid Build Coastguard Worker	}
672*9e94795aSAndroid Build Coastguard Worker}
673