blob: aa5bb2a3c7b7d3033920c7824a8bab529703f656 [file] [log] [blame]
Bob Badour9ee7d032021-10-25 16:51:48 -07001// Copyright 2021 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package compliance
16
17import (
18 "bytes"
19 "testing"
20)
21
22func TestResolveBottomUpConditions(t *testing.T) {
23 tests := []struct {
24 name string
25 roots []string
26 edges []annotated
27 expectedResolutions []res
28 }{
29 {
30 name: "firstparty",
31 roots: []string{"apacheBin.meta_lic"},
32 edges: []annotated{
33 {"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
34 },
35 expectedResolutions: []res{
36 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
37 {"apacheBin.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
38 {"apacheLib.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
39 },
40 },
41 {
42 name: "firstpartytool",
43 roots: []string{"apacheBin.meta_lic"},
44 edges: []annotated{
45 {"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"toolchain"}},
46 },
47 expectedResolutions: []res{
48 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
49 {"apacheLib.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
50 },
51 },
52 {
53 name: "firstpartydeep",
54 roots: []string{"apacheContainer.meta_lic"},
55 edges: []annotated{
56 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
57 {"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
58 },
59 expectedResolutions: []res{
60 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
61 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
62 {"apacheContainer.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
63 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
64 {"apacheBin.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
65 {"apacheLib.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
66 },
67 },
68 {
69 name: "firstpartywide",
70 roots: []string{"apacheContainer.meta_lic"},
71 edges: []annotated{
72 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
73 {"apacheContainer.meta_lic", "apacheLib.meta_lic", []string{"static"}},
74 },
75 expectedResolutions: []res{
76 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
77 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
78 {"apacheContainer.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
79 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
80 {"apacheLib.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
81 },
82 },
83 {
84 name: "firstpartydynamic",
85 roots: []string{"apacheBin.meta_lic"},
86 edges: []annotated{
87 {"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
88 },
89 expectedResolutions: []res{
90 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
91 {"apacheLib.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
92 },
93 },
94 {
95 name: "firstpartydynamicdeep",
96 roots: []string{"apacheContainer.meta_lic"},
97 edges: []annotated{
98 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
99 {"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
100 },
101 expectedResolutions: []res{
102 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
103 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
104 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
105 {"apacheLib.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
106 },
107 },
108 {
109 name: "firstpartydynamicwide",
110 roots: []string{"apacheContainer.meta_lic"},
111 edges: []annotated{
112 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
113 {"apacheContainer.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
114 },
115 expectedResolutions: []res{
116 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
117 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
118 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
119 {"apacheLib.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
120 },
121 },
122 {
123 name: "restricted",
124 roots: []string{"apacheBin.meta_lic"},
125 edges: []annotated{
126 {"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
127 },
128 expectedResolutions: []res{
129 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
130 {"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
131 {"apacheBin.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
132 {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
133 },
134 },
135 {
136 name: "restrictedtool",
137 roots: []string{"apacheBin.meta_lic"},
138 edges: []annotated{
139 {"apacheBin.meta_lic", "gplLib.meta_lic", []string{"toolchain"}},
140 },
141 expectedResolutions: []res{
142 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
143 {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
144 },
145 },
146 {
147 name: "restricteddeep",
148 roots: []string{"apacheContainer.meta_lic"},
149 edges: []annotated{
150 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
151 {"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
152 },
153 expectedResolutions: []res{
154 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
155 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
156 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
157 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
158 {"apacheContainer.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
159 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
160 {"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
161 {"apacheBin.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
162 {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
163 },
164 },
165 {
166 name: "restrictedwide",
167 roots: []string{"apacheContainer.meta_lic"},
168 edges: []annotated{
169 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
170 {"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"static"}},
171 },
172 expectedResolutions: []res{
173 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
174 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
175 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
176 {"apacheContainer.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
177 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
178 {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
179 },
180 },
181 {
182 name: "restricteddynamic",
183 roots: []string{"apacheBin.meta_lic"},
184 edges: []annotated{
185 {"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
186 },
187 expectedResolutions: []res{
188 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
189 {"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
190 {"apacheBin.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
191 {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
192 },
193 },
194 {
195 name: "restricteddynamicdeep",
196 roots: []string{"apacheContainer.meta_lic"},
197 edges: []annotated{
198 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
199 {"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
200 },
201 expectedResolutions: []res{
202 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
203 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
204 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
205 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
206 {"apacheContainer.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
207 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
208 {"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
209 {"apacheBin.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
210 {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
211 },
212 },
213 {
214 name: "restricteddynamicwide",
215 roots: []string{"apacheContainer.meta_lic"},
216 edges: []annotated{
217 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
218 {"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
219 },
220 expectedResolutions: []res{
221 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
222 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
223 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
224 {"apacheContainer.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
225 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
226 {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
227 },
228 },
229 {
230 name: "weakrestricted",
231 roots: []string{"apacheBin.meta_lic"},
232 edges: []annotated{
233 {"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"static"}},
234 },
235 expectedResolutions: []res{
236 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
237 {"apacheBin.meta_lic", "apacheBin.meta_lic", "lgplLib.meta_lic", "restricted"},
238 {"apacheBin.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
239 {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
240 },
241 },
242 {
243 name: "weakrestrictedtool",
244 roots: []string{"apacheBin.meta_lic"},
245 edges: []annotated{
246 {"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"toolchain"}},
247 },
248 expectedResolutions: []res{
249 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
250 {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
251 },
252 },
253 {
254 name: "weakrestricteddeep",
255 roots: []string{"apacheContainer.meta_lic"},
256 edges: []annotated{
257 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
258 {"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"static"}},
259 },
260 expectedResolutions: []res{
261 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
262 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "lgplLib.meta_lic", "restricted"},
263 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
264 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "lgplLib.meta_lic", "restricted"},
265 {"apacheContainer.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
266 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
267 {"apacheBin.meta_lic", "apacheBin.meta_lic", "lgplLib.meta_lic", "restricted"},
268 {"apacheBin.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
269 {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
270 },
271 },
272 {
273 name: "weakrestrictedwide",
274 roots: []string{"apacheContainer.meta_lic"},
275 edges: []annotated{
276 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
277 {"apacheContainer.meta_lic", "lgplLib.meta_lic", []string{"static"}},
278 },
279 expectedResolutions: []res{
280 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
281 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "lgplLib.meta_lic", "restricted"},
282 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
283 {"apacheContainer.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
284 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
285 {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
286 },
287 },
288 {
289 name: "weakrestricteddynamic",
290 roots: []string{"apacheBin.meta_lic"},
291 edges: []annotated{
292 {"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
293 },
294 expectedResolutions: []res{
295 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
296 {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
297 },
298 },
299 {
300 name: "weakrestricteddynamicdeep",
301 roots: []string{"apacheContainer.meta_lic"},
302 edges: []annotated{
303 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
304 {"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
305 },
306 expectedResolutions: []res{
307 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
308 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
309 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
310 {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
311 },
312 },
313 {
314 name: "weakrestricteddynamicwide",
315 roots: []string{"apacheContainer.meta_lic"},
316 edges: []annotated{
317 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
318 {"apacheContainer.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
319 },
320 expectedResolutions: []res{
321 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
322 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
323 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
324 {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
325 },
326 },
327 {
328 name: "classpath",
329 roots: []string{"apacheBin.meta_lic"},
330 edges: []annotated{
331 {"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}},
332 },
333 expectedResolutions: []res{
334 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
335 {"apacheBin.meta_lic", "apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
336 {"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
337 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
338 },
339 },
340 {
341 name: "classpathdependent",
342 roots: []string{"dependentModule.meta_lic"},
343 edges: []annotated{
344 {"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}},
345 },
346 expectedResolutions: []res{
347 {"dependentModule.meta_lic", "dependentModule.meta_lic", "dependentModule.meta_lic", "notice"},
348 {"dependentModule.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
349 {"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
350 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
351 },
352 },
353 {
354 name: "classpathdynamic",
355 roots: []string{"apacheBin.meta_lic"},
356 edges: []annotated{
357 {"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
358 },
359 expectedResolutions: []res{
360 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
361 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
362 },
363 },
364 {
365 name: "classpathdependentdynamic",
366 roots: []string{"dependentModule.meta_lic"},
367 edges: []annotated{
368 {"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
369 },
370 expectedResolutions: []res{
371 {"dependentModule.meta_lic", "dependentModule.meta_lic", "dependentModule.meta_lic", "notice"},
372 {"dependentModule.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
373 {"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
374 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
375 },
376 },
377 }
378 for _, tt := range tests {
379 t.Run(tt.name, func(t *testing.T) {
380 stderr := &bytes.Buffer{}
381 lg, err := toGraph(stderr, tt.roots, tt.edges)
382 if err != nil {
383 t.Errorf("unexpected test data error: got %w, want no error", err)
384 return
385 }
386 expectedRs := toResolutionSet(lg, tt.expectedResolutions)
387 actualRs := ResolveBottomUpConditions(lg)
388 checkSame(actualRs, expectedRs, t)
389 })
390 }
391}
392
393func TestResolveTopDownConditions(t *testing.T) {
394 tests := []struct {
395 name string
396 roots []string
397 edges []annotated
398 expectedResolutions []res
399 }{
400 {
401 name: "firstparty",
402 roots: []string{"apacheBin.meta_lic"},
403 edges: []annotated{
404 {"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
405 },
406 expectedResolutions: []res{
407 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
408 {"apacheBin.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
409 {"apacheLib.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
410 },
411 },
412 {
413 name: "firstpartydynamic",
414 roots: []string{"apacheBin.meta_lic"},
415 edges: []annotated{
416 {"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
417 },
418 expectedResolutions: []res{
419 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
420 {"apacheLib.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
421 },
422 },
423 {
424 name: "restricted",
425 roots: []string{"apacheBin.meta_lic"},
426 edges: []annotated{
427 {"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
428 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
429 },
430 expectedResolutions: []res{
431 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
432 {"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
433 {"apacheBin.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
434 {"apacheBin.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"},
435 {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
436 {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
437 {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
438 },
439 },
440 {
441 name: "restrictedtool",
442 roots: []string{"apacheBin.meta_lic"},
443 edges: []annotated{
444 {"apacheBin.meta_lic", "gplBin.meta_lic", []string{"toolchain"}},
445 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
446 },
447 expectedResolutions: []res{
448 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
449 {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
450 {"gplBin.meta_lic", "gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
451 {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
452 },
453 },
454 {
455 name: "restricteddeep",
456 roots: []string{"apacheContainer.meta_lic"},
457 edges: []annotated{
458 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
459 {"apacheContainer.meta_lic", "mitBin.meta_lic", []string{"static"}},
460 {"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
461 {"apacheBin.meta_lic", "mplLib.meta_lic", []string{"static"}},
462 {"mitBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
463 },
464 expectedResolutions: []res{
465 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
466 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
467 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
468 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
469 {"apacheContainer.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
470 {"apacheContainer.meta_lic", "mitBin.meta_lic", "mitBin.meta_lic", "notice"},
471 {"apacheContainer.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
472 {"apacheContainer.meta_lic", "mplLib.meta_lic", "gplLib.meta_lic", "restricted"},
473 {"apacheContainer.meta_lic", "mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"},
474 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
475 {"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
476 {"apacheBin.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
477 {"apacheBin.meta_lic", "mplLib.meta_lic", "gplLib.meta_lic", "restricted"},
478 {"apacheBin.meta_lic", "mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"},
479 {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
480 {"mitBin.meta_lic", "mitBin.meta_lic", "mitBin.meta_lic", "notice"},
481 {"mitBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
482 {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
483 {"mplLib.meta_lic", "mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"},
484 },
485 },
486 {
487 name: "restrictedwide",
488 roots: []string{"apacheContainer.meta_lic"},
489 edges: []annotated{
490 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
491 {"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"static"}},
492 },
493 expectedResolutions: []res{
494 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
495 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
496 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
497 {"apacheContainer.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
498 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
499 {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
500 },
501 },
502 {
503 name: "restricteddynamic",
504 roots: []string{"apacheBin.meta_lic"},
505 edges: []annotated{
506 {"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
507 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"dynamic"}},
508 },
509 expectedResolutions: []res{
510 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
511 {"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
512 {"apacheBin.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
513 {"apacheBin.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"},
514 {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
515 {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
516 },
517 },
518 {
519 name: "restricteddynamicdeep",
520 roots: []string{"apacheContainer.meta_lic"},
521 edges: []annotated{
522 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
523 {"apacheContainer.meta_lic", "mitBin.meta_lic", []string{"static"}},
524 {"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
525 {"apacheBin.meta_lic", "mplLib.meta_lic", []string{"dynamic"}},
526 {"mitBin.meta_lic", "mitLib.meta_lic", []string{"dynamic"}},
527 },
528 expectedResolutions: []res{
529 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
530 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
531 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
532 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
533 {"apacheContainer.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
534 {"apacheContainer.meta_lic", "mitBin.meta_lic", "mitBin.meta_lic", "notice"},
535 {"apacheContainer.meta_lic", "mplLib.meta_lic", "gplLib.meta_lic", "restricted"},
536 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
537 {"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
538 {"apacheBin.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
539 {"apacheBin.meta_lic", "mplLib.meta_lic", "gplLib.meta_lic", "restricted"},
540 {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
541 {"mitBin.meta_lic", "mitBin.meta_lic", "mitBin.meta_lic", "notice"},
542 {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
543 {"mplLib.meta_lic", "mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"},
544 },
545 },
546 {
547 name: "restricteddynamicwide",
548 roots: []string{"apacheContainer.meta_lic"},
549 edges: []annotated{
550 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
551 {"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
552 },
553 expectedResolutions: []res{
554 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
555 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
556 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
557 {"apacheContainer.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
558 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
559 {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
560 },
561 },
562 {
563 name: "weakrestricted",
564 roots: []string{"apacheBin.meta_lic"},
565 edges: []annotated{
566 {"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"static"}},
567 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
568 },
569 expectedResolutions: []res{
570 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
571 {"apacheBin.meta_lic", "apacheBin.meta_lic", "lgplLib.meta_lic", "restricted"},
572 {"apacheBin.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
573 {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
574 {"apacheBin.meta_lic", "mitLib.meta_lic", "lgplLib.meta_lic", "restricted"},
575 {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
576 {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
577 },
578 },
579 {
580 name: "weakrestrictedtool",
581 roots: []string{"apacheBin.meta_lic"},
582 edges: []annotated{
583 {"apacheBin.meta_lic", "lgplBin.meta_lic", []string{"toolchain"}},
584 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
585 },
586 expectedResolutions: []res{
587 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
588 {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
589 {"lgplBin.meta_lic", "lgplBin.meta_lic", "lgplBin.meta_lic", "restricted"},
590 {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
591 },
592 },
593 {
594 name: "weakrestricteddeep",
595 roots: []string{"apacheContainer.meta_lic"},
596 edges: []annotated{
597 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
598 {"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"static"}},
599 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
600 },
601 expectedResolutions: []res{
602 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
603 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "lgplLib.meta_lic", "restricted"},
604 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
605 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "lgplLib.meta_lic", "restricted"},
606 {"apacheContainer.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
607 {"apacheContainer.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
608 {"apacheContainer.meta_lic", "mitLib.meta_lic", "lgplLib.meta_lic", "restricted"},
609 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
610 {"apacheBin.meta_lic", "apacheBin.meta_lic", "lgplLib.meta_lic", "restricted"},
611 {"apacheBin.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
612 {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
613 {"apacheBin.meta_lic", "mitLib.meta_lic", "lgplLib.meta_lic", "restricted"},
614 {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
615 {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
616 },
617 },
618 {
619 name: "weakrestrictedwide",
620 roots: []string{"apacheContainer.meta_lic"},
621 edges: []annotated{
622 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
623 {"apacheContainer.meta_lic", "lgplLib.meta_lic", []string{"static"}},
624 },
625 expectedResolutions: []res{
626 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
627 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "lgplLib.meta_lic", "restricted"},
628 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
629 {"apacheContainer.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
630 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
631 {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
632 },
633 },
634 {
635 name: "weakrestricteddynamic",
636 roots: []string{"apacheBin.meta_lic"},
637 edges: []annotated{
638 {"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
639 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
640 },
641 expectedResolutions: []res{
642 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
643 {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
644 {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
645 {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
646 },
647 },
648 {
649 name: "weakrestricteddynamicdeep",
650 roots: []string{"apacheContainer.meta_lic"},
651 edges: []annotated{
652 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
653 {"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
654 },
655 expectedResolutions: []res{
656 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
657 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
658 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
659 {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
660 },
661 },
662 {
663 name: "weakrestricteddynamicwide",
664 roots: []string{"apacheContainer.meta_lic"},
665 edges: []annotated{
666 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
667 {"apacheContainer.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
668 },
669 expectedResolutions: []res{
670 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
671 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
672 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
673 {"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
674 },
675 },
676 {
677 name: "classpath",
678 roots: []string{"apacheBin.meta_lic"},
679 edges: []annotated{
680 {"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}},
681 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
682 },
683 expectedResolutions: []res{
684 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
685 {"apacheBin.meta_lic", "apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
686 {"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
687 {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
688 {"apacheBin.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
689 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
690 {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
691 },
692 },
693 {
694 name: "classpathdependent",
695 roots: []string{"dependentModule.meta_lic"},
696 edges: []annotated{
697 {"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}},
698 {"dependentModule.meta_lic", "mitLib.meta_lic", []string{"static"}},
699 },
700 expectedResolutions: []res{
701 {"dependentModule.meta_lic", "dependentModule.meta_lic", "dependentModule.meta_lic", "notice"},
702 {"dependentModule.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
703 {"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
704 {"dependentModule.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
705 {"dependentModule.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
706 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
707 {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
708 },
709 },
710 {
711 name: "classpathdynamic",
712 roots: []string{"apacheBin.meta_lic"},
713 edges: []annotated{
714 {"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
715 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
716 },
717 expectedResolutions: []res{
718 {"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
719 {"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
720 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
721 {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
722 },
723 },
724 {
725 name: "classpathdependentdynamic",
726 roots: []string{"dependentModule.meta_lic"},
727 edges: []annotated{
728 {"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
729 {"dependentModule.meta_lic", "mitLib.meta_lic", []string{"static"}},
730 },
731 expectedResolutions: []res{
732 {"dependentModule.meta_lic", "dependentModule.meta_lic", "dependentModule.meta_lic", "notice"},
733 {"dependentModule.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
734 {"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
735 {"dependentModule.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
736 {"dependentModule.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
737 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
738 {"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
739 },
740 },
741 }
742 for _, tt := range tests {
743 t.Run(tt.name, func(t *testing.T) {
744 stderr := &bytes.Buffer{}
745 lg, err := toGraph(stderr, tt.roots, tt.edges)
746 if err != nil {
747 t.Errorf("unexpected test data error: got %w, want no error", err)
748 return
749 }
750 expectedRs := toResolutionSet(lg, tt.expectedResolutions)
751 actualRs := ResolveTopDownConditions(lg)
752 checkSame(actualRs, expectedRs, t)
753 })
754 }
755}