• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// 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 TestWalkResolutionsForCondition(t *testing.T) {
23	tests := []struct {
24		name                string
25		condition           LicenseConditionSet
26		roots               []string
27		edges               []annotated
28		expectedResolutions []res
29	}{
30		{
31			name:      "firstparty",
32			condition: ImpliesNotice,
33			roots:     []string{"apacheBin.meta_lic"},
34			edges: []annotated{
35				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
36			},
37			expectedResolutions: []res{
38				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
39				{"apacheBin.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
40			},
41		},
42		{
43			name:      "notice",
44			condition: ImpliesNotice,
45			roots:     []string{"mitBin.meta_lic"},
46			edges: []annotated{
47				{"mitBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
48			},
49			expectedResolutions: []res{
50				{"mitBin.meta_lic", "mitBin.meta_lic", "mitBin.meta_lic", "notice"},
51				{"mitBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
52			},
53		},
54		{
55			name:      "fponlgplnotice",
56			condition: ImpliesNotice,
57			roots:     []string{"apacheBin.meta_lic"},
58			edges: []annotated{
59				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"static"}},
60			},
61			expectedResolutions: []res{
62				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
63				{"apacheBin.meta_lic", "apacheBin.meta_lic", "lgplLib.meta_lic", "restricted"},
64				{"apacheBin.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
65			},
66		},
67		{
68			name:      "fponlgpldynamicnotice",
69			condition: ImpliesNotice,
70			roots:     []string{"apacheBin.meta_lic"},
71			edges: []annotated{
72				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
73			},
74			expectedResolutions: []res{
75				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
76			},
77		},
78		{
79			name:      "independentmodulenotice",
80			condition: ImpliesNotice,
81			roots:     []string{"apacheBin.meta_lic"},
82			edges: []annotated{
83				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
84			},
85			expectedResolutions: []res{
86				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
87			},
88		},
89		{
90			name:      "independentmodulerestricted",
91			condition: ImpliesRestricted,
92			roots:     []string{"apacheBin.meta_lic"},
93			edges: []annotated{
94				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
95			},
96			expectedResolutions: []res{},
97		},
98		{
99			name:      "independentmodulestaticnotice",
100			condition: ImpliesNotice,
101			roots:     []string{"apacheBin.meta_lic"},
102			edges: []annotated{
103				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}},
104			},
105			expectedResolutions: []res{
106				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
107				{"apacheBin.meta_lic", "apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
108				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
109			},
110		},
111		{
112			name:      "independentmodulestaticrestricted",
113			condition: ImpliesRestricted,
114			roots:     []string{"apacheBin.meta_lic"},
115			edges: []annotated{
116				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}},
117			},
118			expectedResolutions: []res{
119				{"apacheBin.meta_lic", "apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
120				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
121			},
122		},
123		{
124			name:      "dependentmodulenotice",
125			condition: ImpliesNotice,
126			roots:     []string{"dependentModule.meta_lic"},
127			edges: []annotated{
128				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
129			},
130			expectedResolutions: []res{
131				{"dependentModule.meta_lic", "dependentModule.meta_lic", "dependentModule.meta_lic", "notice"},
132				{"dependentModule.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
133			},
134		},
135		{
136			name:      "dependentmodulerestricted",
137			condition: ImpliesRestricted,
138			roots:     []string{"dependentModule.meta_lic"},
139			edges: []annotated{
140				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
141			},
142			expectedResolutions: []res{
143				{"dependentModule.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
144			},
145		},
146		{
147			name:      "lgplonfpnotice",
148			condition: ImpliesNotice,
149			roots:     []string{"lgplBin.meta_lic"},
150			edges: []annotated{
151				{"lgplBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
152			},
153			expectedResolutions: []res{
154				{"lgplBin.meta_lic", "lgplBin.meta_lic", "lgplBin.meta_lic", "restricted"},
155				{"lgplBin.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
156				{"lgplBin.meta_lic", "apacheLib.meta_lic", "lgplBin.meta_lic", "restricted"},
157			},
158		},
159		{
160			name:      "lgplonfprestricted",
161			condition: ImpliesRestricted,
162			roots:     []string{"lgplBin.meta_lic"},
163			edges: []annotated{
164				{"lgplBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
165			},
166			expectedResolutions: []res{
167				{"lgplBin.meta_lic", "lgplBin.meta_lic", "lgplBin.meta_lic", "restricted"},
168				{"lgplBin.meta_lic", "apacheLib.meta_lic", "lgplBin.meta_lic", "restricted"},
169			},
170		},
171		{
172			name:      "lgplonfpdynamicnotice",
173			condition: ImpliesNotice,
174			roots:     []string{"lgplBin.meta_lic"},
175			edges: []annotated{
176				{"lgplBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
177			},
178			expectedResolutions: []res{
179				{"lgplBin.meta_lic", "lgplBin.meta_lic", "lgplBin.meta_lic", "restricted"},
180			},
181		},
182		{
183			name:      "lgplonfpdynamicrestricted",
184			condition: ImpliesRestricted,
185			roots:     []string{"lgplBin.meta_lic"},
186			edges: []annotated{
187				{"lgplBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
188			},
189			expectedResolutions: []res{
190				{"lgplBin.meta_lic", "lgplBin.meta_lic", "lgplBin.meta_lic", "restricted"},
191			},
192		},
193		{
194			name:      "gplonfpnotice",
195			condition: ImpliesNotice,
196			roots:     []string{"gplBin.meta_lic"},
197			edges: []annotated{
198				{"gplBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
199			},
200			expectedResolutions: []res{
201				{"gplBin.meta_lic", "gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
202				{"gplBin.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
203				{"gplBin.meta_lic", "apacheLib.meta_lic", "gplBin.meta_lic", "restricted"},
204			},
205		},
206		{
207			name:      "gplonfprestricted",
208			condition: ImpliesRestricted,
209			roots:     []string{"gplBin.meta_lic"},
210			edges: []annotated{
211				{"gplBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
212			},
213			expectedResolutions: []res{
214				{"gplBin.meta_lic", "gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
215				{"gplBin.meta_lic", "apacheLib.meta_lic", "gplBin.meta_lic", "restricted"},
216			},
217		},
218		{
219			name:      "gplcontainernotice",
220			condition: ImpliesNotice,
221			roots:     []string{"gplContainer.meta_lic"},
222			edges: []annotated{
223				{"gplContainer.meta_lic", "apacheLib.meta_lic", []string{"static"}},
224			},
225			expectedResolutions: []res{
226				{"gplContainer.meta_lic", "gplContainer.meta_lic", "gplContainer.meta_lic", "restricted"},
227				{"gplContainer.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
228				{"gplContainer.meta_lic", "apacheLib.meta_lic", "gplContainer.meta_lic", "restricted"},
229				{"apacheLib.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
230				{"apacheLib.meta_lic", "apacheLib.meta_lic", "gplContainer.meta_lic", "restricted"},
231			},
232		},
233		{
234			name:      "gplcontainerrestricted",
235			condition: ImpliesRestricted,
236			roots:     []string{"gplContainer.meta_lic"},
237			edges: []annotated{
238				{"gplContainer.meta_lic", "apacheLib.meta_lic", []string{"static"}},
239			},
240			expectedResolutions: []res{
241				{"gplContainer.meta_lic", "gplContainer.meta_lic", "gplContainer.meta_lic", "restricted"},
242				{"gplContainer.meta_lic", "apacheLib.meta_lic", "gplContainer.meta_lic", "restricted"},
243				{"apacheLib.meta_lic", "apacheLib.meta_lic", "gplContainer.meta_lic", "restricted"},
244			},
245		},
246		{
247			name:      "gploncontainernotice",
248			condition: ImpliesNotice,
249			roots:     []string{"apacheContainer.meta_lic"},
250			edges: []annotated{
251				{"apacheContainer.meta_lic", "apacheLib.meta_lic", []string{"static"}},
252				{"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"static"}},
253			},
254			expectedResolutions: []res{
255				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
256				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
257				{"apacheContainer.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
258				{"apacheContainer.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
259				{"apacheLib.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
260				{"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
261			},
262		},
263		{
264			name:      "gploncontainerrestricted",
265			condition: ImpliesRestricted,
266			roots:     []string{"apacheContainer.meta_lic"},
267			edges: []annotated{
268				{"apacheContainer.meta_lic", "apacheLib.meta_lic", []string{"static"}},
269				{"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"static"}},
270			},
271			expectedResolutions: []res{
272				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
273				{"apacheContainer.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
274				{"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
275			},
276		},
277		{
278			name:      "gplonbinnotice",
279			condition: ImpliesNotice,
280			roots:     []string{"apacheBin.meta_lic"},
281			edges: []annotated{
282				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
283				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
284			},
285			expectedResolutions: []res{
286				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
287				{"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
288				{"apacheBin.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
289				{"apacheBin.meta_lic", "apacheLib.meta_lic", "gplLib.meta_lic", "restricted"},
290				{"apacheBin.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
291			},
292		},
293		{
294			name:      "gplonbinrestricted",
295			condition: ImpliesRestricted,
296			roots:     []string{"apacheBin.meta_lic"},
297			edges: []annotated{
298				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
299				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
300			},
301			expectedResolutions: []res{
302				{"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
303				{"apacheBin.meta_lic", "apacheLib.meta_lic", "gplLib.meta_lic", "restricted"},
304				{"apacheBin.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
305			},
306		},
307		{
308			name:      "gplonfpdynamicnotice",
309			condition: ImpliesNotice,
310			roots:     []string{"gplBin.meta_lic"},
311			edges: []annotated{
312				{"gplBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
313			},
314			expectedResolutions: []res{
315				{"gplBin.meta_lic", "gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
316			},
317		},
318		{
319			name:      "gplonfpdynamicrestricted",
320			condition: ImpliesRestricted,
321			roots:     []string{"gplBin.meta_lic"},
322			edges: []annotated{
323				{"gplBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
324			},
325			expectedResolutions: []res{
326				{"gplBin.meta_lic", "gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
327			},
328		},
329		{
330			name:      "gplonfpdynamicrestrictedshipped",
331			condition: ImpliesRestricted,
332			roots:     []string{"gplBin.meta_lic", "apacheLib.meta_lic"},
333			edges: []annotated{
334				{"gplBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
335			},
336			expectedResolutions: []res{
337				{"gplBin.meta_lic", "gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
338				{"gplBin.meta_lic", "apacheLib.meta_lic", "gplBin.meta_lic", "restricted"},
339				{"apacheLib.meta_lic", "apacheLib.meta_lic", "gplBin.meta_lic", "restricted"},
340			},
341		},
342		{
343			name:      "independentmodulereversenotice",
344			condition: ImpliesNotice,
345			roots:     []string{"gplWithClasspathException.meta_lic"},
346			edges: []annotated{
347				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", []string{"dynamic"}},
348			},
349			expectedResolutions: []res{
350				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
351			},
352		},
353		{
354			name:      "independentmodulereverserestricted",
355			condition: ImpliesRestricted,
356			roots:     []string{"gplWithClasspathException.meta_lic"},
357			edges: []annotated{
358				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", []string{"dynamic"}},
359			},
360			expectedResolutions: []res{
361				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
362			},
363		},
364		{
365			name:      "independentmodulereverserestrictedshipped",
366			condition: ImpliesRestricted,
367			roots:     []string{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic"},
368			edges: []annotated{
369				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", []string{"dynamic"}},
370			},
371			expectedResolutions: []res{
372				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
373			},
374		},
375		{
376			name:      "independentmodulereversestaticnotice",
377			condition: ImpliesNotice,
378			roots:     []string{"gplWithClasspathException.meta_lic"},
379			edges: []annotated{
380				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", []string{"static"}},
381			},
382			expectedResolutions: []res{
383				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
384				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
385				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
386			},
387		},
388		{
389			name:      "independentmodulereversestaticrestricted",
390			condition: ImpliesRestricted,
391			roots:     []string{"gplWithClasspathException.meta_lic"},
392			edges: []annotated{
393				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", []string{"static"}},
394			},
395			expectedResolutions: []res{
396				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
397				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
398			},
399		},
400		{
401			name:      "dependentmodulereversenotice",
402			condition: ImpliesNotice,
403			roots:     []string{"gplWithClasspathException.meta_lic"},
404			edges: []annotated{
405				{"gplWithClasspathException.meta_lic", "dependentModule.meta_lic", []string{"dynamic"}},
406			},
407			expectedResolutions: []res{
408				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
409			},
410		},
411		{
412			name:      "dependentmodulereverserestricted",
413			condition: ImpliesRestricted,
414			roots:     []string{"gplWithClasspathException.meta_lic"},
415			edges: []annotated{
416				{"gplWithClasspathException.meta_lic", "dependentModule.meta_lic", []string{"dynamic"}},
417			},
418			expectedResolutions: []res{
419				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
420			},
421		},
422		{
423			name:      "dependentmodulereverserestrictedshipped",
424			condition: ImpliesRestricted,
425			roots:     []string{"gplWithClasspathException.meta_lic", "dependentModule.meta_lic"},
426			edges: []annotated{
427				{"gplWithClasspathException.meta_lic", "dependentModule.meta_lic", []string{"dynamic"}},
428			},
429			expectedResolutions: []res{
430				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
431				{"gplWithClasspathException.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
432				{"dependentModule.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
433			},
434		},
435		{
436			name:      "ponrnotice",
437			condition: ImpliesNotice,
438			roots:     []string{"proprietary.meta_lic"},
439			edges: []annotated{
440				{"proprietary.meta_lic", "gplLib.meta_lic", []string{"static"}},
441			},
442			expectedResolutions: []res{
443				{"proprietary.meta_lic", "proprietary.meta_lic", "proprietary.meta_lic", "proprietary"},
444				{"proprietary.meta_lic", "proprietary.meta_lic", "gplLib.meta_lic", "restricted"},
445				{"proprietary.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
446			},
447		},
448		{
449			name:      "ponrrestricted",
450			condition: ImpliesRestricted,
451			roots:     []string{"proprietary.meta_lic"},
452			edges: []annotated{
453				{"proprietary.meta_lic", "gplLib.meta_lic", []string{"static"}},
454			},
455			expectedResolutions: []res{
456				{"proprietary.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
457				{"proprietary.meta_lic", "proprietary.meta_lic", "gplLib.meta_lic", "restricted"},
458			},
459		},
460		{
461			name:      "ponrproprietary",
462			condition: ImpliesProprietary,
463			roots:     []string{"proprietary.meta_lic"},
464			edges: []annotated{
465				{"proprietary.meta_lic", "gplLib.meta_lic", []string{"static"}},
466			},
467			expectedResolutions: []res{
468				{"proprietary.meta_lic", "proprietary.meta_lic", "proprietary.meta_lic", "proprietary"},
469			},
470		},
471		{
472			name:      "ronpnotice",
473			condition: ImpliesNotice,
474			roots:     []string{"gplBin.meta_lic"},
475			edges: []annotated{
476				{"gplBin.meta_lic", "proprietary.meta_lic", []string{"static"}},
477			},
478			expectedResolutions: []res{
479				{"gplBin.meta_lic", "gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
480				{"gplBin.meta_lic", "proprietary.meta_lic", "proprietary.meta_lic", "proprietary"},
481				{"gplBin.meta_lic", "proprietary.meta_lic", "gplBin.meta_lic", "restricted"},
482			},
483		},
484		{
485			name:      "ronprestricted",
486			condition: ImpliesRestricted,
487			roots:     []string{"gplBin.meta_lic"},
488			edges: []annotated{
489				{"gplBin.meta_lic", "proprietary.meta_lic", []string{"static"}},
490			},
491			expectedResolutions: []res{
492				{"gplBin.meta_lic", "gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
493				{"gplBin.meta_lic", "proprietary.meta_lic", "gplBin.meta_lic", "restricted"},
494			},
495		},
496		{
497			name:      "ronpproprietary",
498			condition: ImpliesProprietary,
499			roots:     []string{"gplBin.meta_lic"},
500			edges: []annotated{
501				{"gplBin.meta_lic", "proprietary.meta_lic", []string{"static"}},
502			},
503			expectedResolutions: []res{
504				{"gplBin.meta_lic", "proprietary.meta_lic", "proprietary.meta_lic", "proprietary"},
505			},
506		},
507		{
508			name:      "noticeonb_e_onotice",
509			condition: ImpliesNotice,
510			roots:     []string{"mitBin.meta_lic"},
511			edges: []annotated{
512				{"mitBin.meta_lic", "by_exception.meta_lic", []string{"static"}},
513			},
514			expectedResolutions: []res{
515				{"mitBin.meta_lic", "mitBin.meta_lic", "mitBin.meta_lic", "notice"},
516				{"mitBin.meta_lic", "by_exception.meta_lic", "by_exception.meta_lic", "by_exception_only"},
517			},
518		},
519		{
520			name:      "noticeonb_e_orestricted",
521			condition: ImpliesRestricted,
522			roots:     []string{"mitBin.meta_lic"},
523			edges: []annotated{
524				{"mitBin.meta_lic", "by_exception.meta_lic", []string{"static"}},
525			},
526			expectedResolutions: []res{},
527		},
528		{
529			name:      "noticeonb_e_ob_e_o",
530			condition: ImpliesByExceptionOnly,
531			roots:     []string{"mitBin.meta_lic"},
532			edges: []annotated{
533				{"mitBin.meta_lic", "by_exception.meta_lic", []string{"static"}},
534			},
535			expectedResolutions: []res{
536				{"mitBin.meta_lic", "by_exception.meta_lic", "by_exception.meta_lic", "by_exception_only"},
537			},
538		},
539		{
540			name:      "b_e_oonnoticenotice",
541			condition: ImpliesNotice,
542			roots:     []string{"by_exception.meta_lic"},
543			edges: []annotated{
544				{"by_exception.meta_lic", "mitLib.meta_lic", []string{"static"}},
545			},
546			expectedResolutions: []res{
547				{"by_exception.meta_lic", "by_exception.meta_lic", "by_exception.meta_lic", "by_exception_only"},
548				{"by_exception.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
549			},
550		},
551		{
552			name:      "b_e_oonnoticerestricted",
553			condition: ImpliesRestricted,
554			roots:     []string{"by_exception.meta_lic"},
555			edges: []annotated{
556				{"by_exception.meta_lic", "mitLib.meta_lic", []string{"static"}},
557			},
558			expectedResolutions: []res{},
559		},
560		{
561			name:      "b_e_oonnoticeb_e_o",
562			condition: ImpliesByExceptionOnly,
563			roots:     []string{"by_exception.meta_lic"},
564			edges: []annotated{
565				{"by_exception.meta_lic", "mitLib.meta_lic", []string{"static"}},
566			},
567			expectedResolutions: []res{
568				{"by_exception.meta_lic", "by_exception.meta_lic", "by_exception.meta_lic", "by_exception_only"},
569			},
570		},
571		{
572			name:      "noticeonrecipnotice",
573			condition: ImpliesNotice,
574			roots:     []string{"mitBin.meta_lic"},
575			edges: []annotated{
576				{"mitBin.meta_lic", "mplLib.meta_lic", []string{"static"}},
577			},
578			expectedResolutions: []res{
579				{"mitBin.meta_lic", "mitBin.meta_lic", "mitBin.meta_lic", "notice"},
580				{"mitBin.meta_lic", "mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"},
581			},
582		},
583		{
584			name:      "noticeonreciprecip",
585			condition: ImpliesReciprocal,
586			roots:     []string{"mitBin.meta_lic"},
587			edges: []annotated{
588				{"mitBin.meta_lic", "mplLib.meta_lic", []string{"static"}},
589			},
590			expectedResolutions: []res{
591				{"mitBin.meta_lic", "mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"},
592			},
593		},
594		{
595			name:      "reciponnoticenotice",
596			condition: ImpliesNotice,
597			roots:     []string{"mplBin.meta_lic"},
598			edges: []annotated{
599				{"mplBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
600			},
601			expectedResolutions: []res{
602				{"mplBin.meta_lic", "mplBin.meta_lic", "mplBin.meta_lic", "reciprocal"},
603				{"mplBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
604			},
605		},
606		{
607			name:      "reciponnoticerecip",
608			condition: ImpliesReciprocal,
609			roots:     []string{"mplBin.meta_lic"},
610			edges: []annotated{
611				{"mplBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
612			},
613			expectedResolutions: []res{
614				{"mplBin.meta_lic", "mplBin.meta_lic", "mplBin.meta_lic", "reciprocal"},
615			},
616		},
617	}
618	for _, tt := range tests {
619		t.Run(tt.name, func(t *testing.T) {
620			stderr := &bytes.Buffer{}
621			lg, err := toGraph(stderr, tt.roots, tt.edges)
622			if err != nil {
623				t.Errorf("unexpected test data error: got %s, want no error", err)
624				return
625			}
626			expectedRs := toResolutionSet(lg, tt.expectedResolutions)
627			ResolveTopDownConditions(lg)
628			actualRs := WalkResolutionsForCondition(lg, tt.condition)
629			checkResolves(actualRs, expectedRs, t)
630		})
631	}
632}
633
634func TestWalkActionsForCondition(t *testing.T) {
635	tests := []struct {
636		name            string
637		condition       LicenseConditionSet
638		roots           []string
639		edges           []annotated
640		expectedActions []act
641	}{
642		{
643			name:      "firstparty",
644			condition: ImpliesNotice,
645			roots:     []string{"apacheBin.meta_lic"},
646			edges: []annotated{
647				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
648			},
649			expectedActions: []act{
650				{"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
651				{"apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
652			},
653		},
654		{
655			name:      "notice",
656			condition: ImpliesNotice,
657			roots:     []string{"mitBin.meta_lic"},
658			edges: []annotated{
659				{"mitBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
660			},
661			expectedActions: []act{
662				{"mitBin.meta_lic", "mitBin.meta_lic", "notice"},
663				{"mitLib.meta_lic", "mitLib.meta_lic", "notice"},
664			},
665		},
666		{
667			name:      "fponlgplnotice",
668			condition: ImpliesNotice,
669			roots:     []string{"apacheBin.meta_lic"},
670			edges: []annotated{
671				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"static"}},
672			},
673			expectedActions: []act{
674				{"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
675				{"apacheBin.meta_lic", "lgplLib.meta_lic", "restricted"},
676				{"lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
677			},
678		},
679		{
680			name:      "fponlgpldynamicnotice",
681			condition: ImpliesNotice,
682			roots:     []string{"apacheBin.meta_lic"},
683			edges: []annotated{
684				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
685			},
686			expectedActions: []act{
687				{"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
688			},
689		},
690		{
691			name:      "independentmodulenotice",
692			condition: ImpliesNotice,
693			roots:     []string{"apacheBin.meta_lic"},
694			edges: []annotated{
695				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
696			},
697			expectedActions: []act{
698				{"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
699			},
700		},
701		{
702			name:      "independentmodulerestricted",
703			condition: ImpliesRestricted,
704			roots:     []string{"apacheBin.meta_lic"},
705			edges: []annotated{
706				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
707			},
708			expectedActions: []act{},
709		},
710		{
711			name:      "independentmodulestaticnotice",
712			condition: ImpliesNotice,
713			roots:     []string{"apacheBin.meta_lic"},
714			edges: []annotated{
715				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}},
716			},
717			expectedActions: []act{
718				{"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
719				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
720				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
721			},
722		},
723		{
724			name:      "independentmodulestaticrestricted",
725			condition: ImpliesRestricted,
726			roots:     []string{"apacheBin.meta_lic"},
727			edges: []annotated{
728				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}},
729			},
730			expectedActions: []act{
731				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
732				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
733			},
734		},
735		{
736			name:      "dependentmodulenotice",
737			condition: ImpliesNotice,
738			roots:     []string{"dependentModule.meta_lic"},
739			edges: []annotated{
740				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
741			},
742			expectedActions: []act{
743				{"dependentModule.meta_lic", "dependentModule.meta_lic", "notice"},
744				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
745			},
746		},
747		{
748			name:      "dependentmodulerestricted",
749			condition: ImpliesRestricted,
750			roots:     []string{"dependentModule.meta_lic"},
751			edges: []annotated{
752				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
753			},
754			expectedActions: []act{
755				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
756			},
757		},
758		{
759			name:      "lgplonfpnotice",
760			condition: ImpliesNotice,
761			roots:     []string{"lgplBin.meta_lic"},
762			edges: []annotated{
763				{"lgplBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
764			},
765			expectedActions: []act{
766				{"lgplBin.meta_lic", "lgplBin.meta_lic", "restricted"},
767				{"apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
768				{"apacheLib.meta_lic", "lgplBin.meta_lic", "restricted"},
769			},
770		},
771		{
772			name:      "lgplonfprestricted",
773			condition: ImpliesRestricted,
774			roots:     []string{"lgplBin.meta_lic"},
775			edges: []annotated{
776				{"lgplBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
777			},
778			expectedActions: []act{
779				{"lgplBin.meta_lic", "lgplBin.meta_lic", "restricted"},
780				{"apacheLib.meta_lic", "lgplBin.meta_lic", "restricted"},
781			},
782		},
783		{
784			name:      "lgplonfpdynamicnotice",
785			condition: ImpliesNotice,
786			roots:     []string{"lgplBin.meta_lic"},
787			edges: []annotated{
788				{"lgplBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
789			},
790			expectedActions: []act{
791				{"lgplBin.meta_lic", "lgplBin.meta_lic", "restricted"},
792			},
793		},
794		{
795			name:      "lgplonfpdynamicrestricted",
796			condition: ImpliesRestricted,
797			roots:     []string{"lgplBin.meta_lic"},
798			edges: []annotated{
799				{"lgplBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
800			},
801			expectedActions: []act{
802				{"lgplBin.meta_lic", "lgplBin.meta_lic", "restricted"},
803			},
804		},
805		{
806			name:      "gplonfpnotice",
807			condition: ImpliesNotice,
808			roots:     []string{"gplBin.meta_lic"},
809			edges: []annotated{
810				{"gplBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
811			},
812			expectedActions: []act{
813				{"gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
814				{"apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
815				{"apacheLib.meta_lic", "gplBin.meta_lic", "restricted"},
816			},
817		},
818		{
819			name:      "gplonfprestricted",
820			condition: ImpliesRestricted,
821			roots:     []string{"gplBin.meta_lic"},
822			edges: []annotated{
823				{"gplBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
824			},
825			expectedActions: []act{
826				{"gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
827				{"apacheLib.meta_lic", "gplBin.meta_lic", "restricted"},
828			},
829		},
830		{
831			name:      "gplcontainernotice",
832			condition: ImpliesNotice,
833			roots:     []string{"gplContainer.meta_lic"},
834			edges: []annotated{
835				{"gplContainer.meta_lic", "apacheLib.meta_lic", []string{"static"}},
836			},
837			expectedActions: []act{
838				{"gplContainer.meta_lic", "gplContainer.meta_lic", "restricted"},
839				{"apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
840				{"apacheLib.meta_lic", "gplContainer.meta_lic", "restricted"},
841				{"apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
842				{"apacheLib.meta_lic", "gplContainer.meta_lic", "restricted"},
843			},
844		},
845		{
846			name:      "gplcontainerrestricted",
847			condition: ImpliesRestricted,
848			roots:     []string{"gplContainer.meta_lic"},
849			edges: []annotated{
850				{"gplContainer.meta_lic", "apacheLib.meta_lic", []string{"static"}},
851			},
852			expectedActions: []act{
853				{"gplContainer.meta_lic", "gplContainer.meta_lic", "restricted"},
854				{"apacheLib.meta_lic", "gplContainer.meta_lic", "restricted"},
855				{"apacheLib.meta_lic", "gplContainer.meta_lic", "restricted"},
856			},
857		},
858		{
859			name:      "gploncontainernotice",
860			condition: ImpliesNotice,
861			roots:     []string{"apacheContainer.meta_lic"},
862			edges: []annotated{
863				{"apacheContainer.meta_lic", "apacheLib.meta_lic", []string{"static"}},
864				{"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"static"}},
865			},
866			expectedActions: []act{
867				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
868				{"apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
869				{"apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
870				{"apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
871				{"gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
872			},
873		},
874		{
875			name:      "gploncontainerrestricted",
876			condition: ImpliesRestricted,
877			roots:     []string{"apacheContainer.meta_lic"},
878			edges: []annotated{
879				{"apacheContainer.meta_lic", "apacheLib.meta_lic", []string{"static"}},
880				{"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"static"}},
881			},
882			expectedActions: []act{
883				{"apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
884				{"gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
885			},
886		},
887		{
888			name:      "gplonbinnotice",
889			condition: ImpliesNotice,
890			roots:     []string{"apacheBin.meta_lic"},
891			edges: []annotated{
892				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
893				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
894			},
895			expectedActions: []act{
896				{"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
897				{"apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
898				{"apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
899				{"apacheLib.meta_lic", "gplLib.meta_lic", "restricted"},
900				{"gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
901			},
902		},
903		{
904			name:      "gplonbinrestricted",
905			condition: ImpliesRestricted,
906			roots:     []string{"apacheBin.meta_lic"},
907			edges: []annotated{
908				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
909				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
910			},
911			expectedActions: []act{
912				{"apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
913				{"apacheLib.meta_lic", "gplLib.meta_lic", "restricted"},
914				{"gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
915			},
916		},
917		{
918			name:      "gplonfpdynamicnotice",
919			condition: ImpliesNotice,
920			roots:     []string{"gplBin.meta_lic"},
921			edges: []annotated{
922				{"gplBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
923			},
924			expectedActions: []act{
925				{"gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
926			},
927		},
928		{
929			name:      "gplonfpdynamicrestricted",
930			condition: ImpliesRestricted,
931			roots:     []string{"gplBin.meta_lic"},
932			edges: []annotated{
933				{"gplBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
934			},
935			expectedActions: []act{
936				{"gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
937			},
938		},
939		{
940			name:      "gplonfpdynamicrestrictedshipped",
941			condition: ImpliesRestricted,
942			roots:     []string{"gplBin.meta_lic", "apacheLib.meta_lic"},
943			edges: []annotated{
944				{"gplBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
945			},
946			expectedActions: []act{
947				{"gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
948				{"apacheLib.meta_lic", "gplBin.meta_lic", "restricted"},
949			},
950		},
951		{
952			name:      "independentmodulereversenotice",
953			condition: ImpliesNotice,
954			roots:     []string{"gplWithClasspathException.meta_lic"},
955			edges: []annotated{
956				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", []string{"dynamic"}},
957			},
958			expectedActions: []act{
959				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
960			},
961		},
962		{
963			name:      "independentmodulereverserestricted",
964			condition: ImpliesRestricted,
965			roots:     []string{"gplWithClasspathException.meta_lic"},
966			edges: []annotated{
967				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", []string{"dynamic"}},
968			},
969			expectedActions: []act{
970				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
971			},
972		},
973		{
974			name:      "independentmodulereverserestrictedshipped",
975			condition: ImpliesRestricted,
976			roots:     []string{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic"},
977			edges: []annotated{
978				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", []string{"dynamic"}},
979			},
980			expectedActions: []act{
981				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
982			},
983		},
984		{
985			name:      "independentmodulereversestaticnotice",
986			condition: ImpliesNotice,
987			roots:     []string{"gplWithClasspathException.meta_lic"},
988			edges: []annotated{
989				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", []string{"static"}},
990			},
991			expectedActions: []act{
992				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
993				{"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
994				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
995			},
996		},
997		{
998			name:      "independentmodulereversestaticrestricted",
999			condition: ImpliesRestricted,
1000			roots:     []string{"gplWithClasspathException.meta_lic"},
1001			edges: []annotated{
1002				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", []string{"static"}},
1003			},
1004			expectedActions: []act{
1005				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
1006				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
1007			},
1008		},
1009		{
1010			name:      "dependentmodulereversenotice",
1011			condition: ImpliesNotice,
1012			roots:     []string{"gplWithClasspathException.meta_lic"},
1013			edges: []annotated{
1014				{"gplWithClasspathException.meta_lic", "dependentModule.meta_lic", []string{"dynamic"}},
1015			},
1016			expectedActions: []act{
1017				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
1018			},
1019		},
1020		{
1021			name:      "dependentmodulereverserestricted",
1022			condition: ImpliesRestricted,
1023			roots:     []string{"gplWithClasspathException.meta_lic"},
1024			edges: []annotated{
1025				{"gplWithClasspathException.meta_lic", "dependentModule.meta_lic", []string{"dynamic"}},
1026			},
1027			expectedActions: []act{
1028				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
1029			},
1030		},
1031		{
1032			name:      "dependentmodulereverserestrictedshipped",
1033			condition: ImpliesRestricted,
1034			roots:     []string{"gplWithClasspathException.meta_lic", "dependentModule.meta_lic"},
1035			edges: []annotated{
1036				{"gplWithClasspathException.meta_lic", "dependentModule.meta_lic", []string{"dynamic"}},
1037			},
1038			expectedActions: []act{
1039				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
1040				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
1041			},
1042		},
1043		{
1044			name:      "ponrnotice",
1045			condition: ImpliesNotice,
1046			roots:     []string{"proprietary.meta_lic"},
1047			edges: []annotated{
1048				{"proprietary.meta_lic", "gplLib.meta_lic", []string{"static"}},
1049			},
1050			expectedActions: []act{
1051				{"proprietary.meta_lic", "proprietary.meta_lic", "proprietary"},
1052				{"proprietary.meta_lic", "gplLib.meta_lic", "restricted"},
1053				{"gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
1054			},
1055		},
1056		{
1057			name:      "ponrrestricted",
1058			condition: ImpliesRestricted,
1059			roots:     []string{"proprietary.meta_lic"},
1060			edges: []annotated{
1061				{"proprietary.meta_lic", "gplLib.meta_lic", []string{"static"}},
1062			},
1063			expectedActions: []act{
1064				{"gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
1065				{"proprietary.meta_lic", "gplLib.meta_lic", "restricted"},
1066			},
1067		},
1068		{
1069			name:      "ponrproprietary",
1070			condition: ImpliesProprietary,
1071			roots:     []string{"proprietary.meta_lic"},
1072			edges: []annotated{
1073				{"proprietary.meta_lic", "gplLib.meta_lic", []string{"static"}},
1074			},
1075			expectedActions: []act{
1076				{"proprietary.meta_lic", "proprietary.meta_lic", "proprietary"},
1077			},
1078		},
1079		{
1080			name:      "ronpnotice",
1081			condition: ImpliesNotice,
1082			roots:     []string{"gplBin.meta_lic"},
1083			edges: []annotated{
1084				{"gplBin.meta_lic", "proprietary.meta_lic", []string{"static"}},
1085			},
1086			expectedActions: []act{
1087				{"gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
1088				{"proprietary.meta_lic", "proprietary.meta_lic", "proprietary"},
1089				{"proprietary.meta_lic", "gplBin.meta_lic", "restricted"},
1090			},
1091		},
1092		{
1093			name:      "ronprestricted",
1094			condition: ImpliesRestricted,
1095			roots:     []string{"gplBin.meta_lic"},
1096			edges: []annotated{
1097				{"gplBin.meta_lic", "proprietary.meta_lic", []string{"static"}},
1098			},
1099			expectedActions: []act{
1100				{"gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
1101				{"proprietary.meta_lic", "gplBin.meta_lic", "restricted"},
1102			},
1103		},
1104		{
1105			name:      "ronpproprietary",
1106			condition: ImpliesProprietary,
1107			roots:     []string{"gplBin.meta_lic"},
1108			edges: []annotated{
1109				{"gplBin.meta_lic", "proprietary.meta_lic", []string{"static"}},
1110			},
1111			expectedActions: []act{
1112				{"proprietary.meta_lic", "proprietary.meta_lic", "proprietary"},
1113			},
1114		},
1115		{
1116			name:      "noticeonb_e_onotice",
1117			condition: ImpliesNotice,
1118			roots:     []string{"mitBin.meta_lic"},
1119			edges: []annotated{
1120				{"mitBin.meta_lic", "by_exception.meta_lic", []string{"static"}},
1121			},
1122			expectedActions: []act{
1123				{"mitBin.meta_lic", "mitBin.meta_lic", "notice"},
1124				{"by_exception.meta_lic", "by_exception.meta_lic", "by_exception_only"},
1125			},
1126		},
1127		{
1128			name:      "noticeonb_e_orestricted",
1129			condition: ImpliesRestricted,
1130			roots:     []string{"mitBin.meta_lic"},
1131			edges: []annotated{
1132				{"mitBin.meta_lic", "by_exception.meta_lic", []string{"static"}},
1133			},
1134			expectedActions: []act{},
1135		},
1136		{
1137			name:      "noticeonb_e_ob_e_o",
1138			condition: ImpliesByExceptionOnly,
1139			roots:     []string{"mitBin.meta_lic"},
1140			edges: []annotated{
1141				{"mitBin.meta_lic", "by_exception.meta_lic", []string{"static"}},
1142			},
1143			expectedActions: []act{
1144				{"by_exception.meta_lic", "by_exception.meta_lic", "by_exception_only"},
1145			},
1146		},
1147		{
1148			name:      "b_e_oonnoticenotice",
1149			condition: ImpliesNotice,
1150			roots:     []string{"by_exception.meta_lic"},
1151			edges: []annotated{
1152				{"by_exception.meta_lic", "mitLib.meta_lic", []string{"static"}},
1153			},
1154			expectedActions: []act{
1155				{"by_exception.meta_lic", "by_exception.meta_lic", "by_exception_only"},
1156				{"mitLib.meta_lic", "mitLib.meta_lic", "notice"},
1157			},
1158		},
1159		{
1160			name:      "b_e_oonnoticerestricted",
1161			condition: ImpliesRestricted,
1162			roots:     []string{"by_exception.meta_lic"},
1163			edges: []annotated{
1164				{"by_exception.meta_lic", "mitLib.meta_lic", []string{"static"}},
1165			},
1166			expectedActions: []act{},
1167		},
1168		{
1169			name:      "b_e_oonnoticeb_e_o",
1170			condition: ImpliesByExceptionOnly,
1171			roots:     []string{"by_exception.meta_lic"},
1172			edges: []annotated{
1173				{"by_exception.meta_lic", "mitLib.meta_lic", []string{"static"}},
1174			},
1175			expectedActions: []act{
1176				{"by_exception.meta_lic", "by_exception.meta_lic", "by_exception_only"},
1177			},
1178		},
1179		{
1180			name:      "noticeonrecipnotice",
1181			condition: ImpliesNotice,
1182			roots:     []string{"mitBin.meta_lic"},
1183			edges: []annotated{
1184				{"mitBin.meta_lic", "mplLib.meta_lic", []string{"static"}},
1185			},
1186			expectedActions: []act{
1187				{"mitBin.meta_lic", "mitBin.meta_lic", "notice"},
1188				{"mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"},
1189			},
1190		},
1191		{
1192			name:      "noticeonreciprecip",
1193			condition: ImpliesReciprocal,
1194			roots:     []string{"mitBin.meta_lic"},
1195			edges: []annotated{
1196				{"mitBin.meta_lic", "mplLib.meta_lic", []string{"static"}},
1197			},
1198			expectedActions: []act{
1199				{"mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"},
1200			},
1201		},
1202		{
1203			name:      "reciponnoticenotice",
1204			condition: ImpliesNotice,
1205			roots:     []string{"mplBin.meta_lic"},
1206			edges: []annotated{
1207				{"mplBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
1208			},
1209			expectedActions: []act{
1210				{"mplBin.meta_lic", "mplBin.meta_lic", "reciprocal"},
1211				{"mitLib.meta_lic", "mitLib.meta_lic", "notice"},
1212			},
1213		},
1214		{
1215			name:      "reciponnoticerecip",
1216			condition: ImpliesReciprocal,
1217			roots:     []string{"mplBin.meta_lic"},
1218			edges: []annotated{
1219				{"mplBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
1220			},
1221			expectedActions: []act{
1222				{"mplBin.meta_lic", "mplBin.meta_lic", "reciprocal"},
1223			},
1224		},
1225	}
1226	for _, tt := range tests {
1227		t.Run(tt.name, func(t *testing.T) {
1228			stderr := &bytes.Buffer{}
1229			lg, err := toGraph(stderr, tt.roots, tt.edges)
1230			if err != nil {
1231				t.Errorf("unexpected test data error: got %s, want no error", err)
1232				return
1233			}
1234			expectedAs := toActionSet(lg, tt.expectedActions)
1235			ResolveTopDownConditions(lg)
1236			actualAs := WalkActionsForCondition(lg, tt.condition)
1237			checkResolvesActions(lg, actualAs, expectedAs, t)
1238		})
1239	}
1240}
1241