• 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 TestResolveNotices(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			},
39		},
40		{
41			name:  "firstpartydynamic",
42			roots: []string{"apacheBin.meta_lic"},
43			edges: []annotated{
44				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
45			},
46			expectedResolutions: []res{
47				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
48			},
49		},
50		{
51			name:  "firstpartydynamicshipped",
52			roots: []string{"apacheBin.meta_lic", "apacheLib.meta_lic"},
53			edges: []annotated{
54				{"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
55			},
56			expectedResolutions: []res{
57				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
58				{"apacheLib.meta_lic", "apacheLib.meta_lic", "apacheLib.meta_lic", "notice"},
59			},
60		},
61		{
62			name:  "restricted",
63			roots: []string{"apacheBin.meta_lic"},
64			edges: []annotated{
65				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
66				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
67			},
68			expectedResolutions: []res{
69				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
70				{"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
71				{"apacheBin.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
72				{"apacheBin.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"},
73				{"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
74			},
75		},
76		{
77			name:  "restrictedtool",
78			roots: []string{"apacheBin.meta_lic"},
79			edges: []annotated{
80				{"apacheBin.meta_lic", "gplBin.meta_lic", []string{"toolchain"}},
81				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
82			},
83			expectedResolutions: []res{
84				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
85				{"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
86			},
87		},
88		{
89			name:  "restricteddeep",
90			roots: []string{"apacheContainer.meta_lic"},
91			edges: []annotated{
92				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
93				{"apacheContainer.meta_lic", "mitBin.meta_lic", []string{"static"}},
94				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
95				{"apacheBin.meta_lic", "mplLib.meta_lic", []string{"static"}},
96				{"mitBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
97			},
98			expectedResolutions: []res{
99				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
100				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
101				{"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
102				{"apacheContainer.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
103				{"apacheContainer.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
104				{"apacheContainer.meta_lic", "mitBin.meta_lic", "mitBin.meta_lic", "notice"},
105				{"apacheContainer.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
106				{"apacheContainer.meta_lic", "mplLib.meta_lic", "gplLib.meta_lic", "restricted"},
107				{"apacheContainer.meta_lic", "mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"},
108				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
109				{"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
110				{"apacheBin.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
111				{"apacheBin.meta_lic", "mplLib.meta_lic", "gplLib.meta_lic", "restricted"},
112				{"apacheBin.meta_lic", "mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"},
113				{"mitBin.meta_lic", "mitBin.meta_lic", "mitBin.meta_lic", "notice"},
114				{"mitBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
115			},
116		},
117		{
118			name:  "restrictedwide",
119			roots: []string{"apacheContainer.meta_lic"},
120			edges: []annotated{
121				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
122				{"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"static"}},
123			},
124			expectedResolutions: []res{
125				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
126				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
127				{"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
128				{"apacheContainer.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
129				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
130				{"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
131			},
132		},
133		{
134			name:  "restricteddynamic",
135			roots: []string{"apacheBin.meta_lic"},
136			edges: []annotated{
137				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
138				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"dynamic"}},
139			},
140			expectedResolutions: []res{
141				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
142				{"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
143			},
144		},
145		{
146			name:  "restricteddynamicshipped",
147			roots: []string{"apacheBin.meta_lic", "mitLib.meta_lic"},
148			edges: []annotated{
149				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
150				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"dynamic"}},
151			},
152			expectedResolutions: []res{
153				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
154				{"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
155				{"apacheBin.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"},
156				{"mitLib.meta_lic", "mitLib.meta_lic", "gplLib.meta_lic", "restricted"},
157				{"mitLib.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
158			},
159		},
160		{
161			name:  "restricteddynamicdeep",
162			roots: []string{"apacheContainer.meta_lic"},
163			edges: []annotated{
164				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
165				{"apacheContainer.meta_lic", "mitBin.meta_lic", []string{"static"}},
166				{"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
167				{"apacheBin.meta_lic", "mplLib.meta_lic", []string{"dynamic"}},
168				{"mitBin.meta_lic", "mitLib.meta_lic", []string{"dynamic"}},
169			},
170			expectedResolutions: []res{
171				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
172				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
173				{"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
174				{"apacheContainer.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
175				{"apacheContainer.meta_lic", "mitBin.meta_lic", "mitBin.meta_lic", "notice"},
176				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
177				{"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
178				{"mitBin.meta_lic", "mitBin.meta_lic", "mitBin.meta_lic", "notice"},
179			},
180		},
181		{
182			name:  "restricteddynamicwide",
183			roots: []string{"apacheContainer.meta_lic"},
184			edges: []annotated{
185				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
186				{"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
187			},
188			expectedResolutions: []res{
189				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
190				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
191				{"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
192				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
193			},
194		},
195		{
196			name:  "restricteddynamicwideshipped",
197			roots: []string{"apacheContainer.meta_lic", "gplLib.meta_lic"},
198			edges: []annotated{
199				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
200				{"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"dynamic"}},
201			},
202			expectedResolutions: []res{
203				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
204				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
205				{"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
206				{"apacheContainer.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
207				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
208				{"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
209			},
210		},
211		{
212			name:  "weakrestricted",
213			roots: []string{"apacheBin.meta_lic"},
214			edges: []annotated{
215				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"static"}},
216				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
217			},
218			expectedResolutions: []res{
219				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
220				{"apacheBin.meta_lic", "apacheBin.meta_lic", "lgplLib.meta_lic", "restricted"},
221				{"apacheBin.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
222				{"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
223				{"apacheBin.meta_lic", "mitLib.meta_lic", "lgplLib.meta_lic", "restricted"},
224			},
225		},
226		{
227			name:  "weakrestrictedtool",
228			roots: []string{"apacheBin.meta_lic"},
229			edges: []annotated{
230				{"apacheBin.meta_lic", "lgplBin.meta_lic", []string{"toolchain"}},
231				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
232			},
233			expectedResolutions: []res{
234				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
235				{"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
236			},
237		},
238		{
239			name:  "weakrestrictedtoolshipped",
240			roots: []string{"apacheBin.meta_lic", "lgplBin.meta_lic"},
241			edges: []annotated{
242				{"apacheBin.meta_lic", "lgplBin.meta_lic", []string{"toolchain"}},
243				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
244			},
245			expectedResolutions: []res{
246				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
247				{"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
248				{"lgplBin.meta_lic", "lgplBin.meta_lic", "lgplBin.meta_lic", "restricted"},
249			},
250		},
251		{
252			name:  "weakrestricteddeep",
253			roots: []string{"apacheContainer.meta_lic"},
254			edges: []annotated{
255				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
256				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"static"}},
257				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
258			},
259			expectedResolutions: []res{
260				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
261				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "lgplLib.meta_lic", "restricted"},
262				{"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
263				{"apacheContainer.meta_lic", "apacheBin.meta_lic", "lgplLib.meta_lic", "restricted"},
264				{"apacheContainer.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
265				{"apacheContainer.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
266				{"apacheContainer.meta_lic", "mitLib.meta_lic", "lgplLib.meta_lic", "restricted"},
267				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
268				{"apacheBin.meta_lic", "apacheBin.meta_lic", "lgplLib.meta_lic", "restricted"},
269				{"apacheBin.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
270				{"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
271				{"apacheBin.meta_lic", "mitLib.meta_lic", "lgplLib.meta_lic", "restricted"},
272			},
273		},
274		{
275			name:  "weakrestrictedwide",
276			roots: []string{"apacheContainer.meta_lic"},
277			edges: []annotated{
278				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
279				{"apacheContainer.meta_lic", "lgplLib.meta_lic", []string{"static"}},
280			},
281			expectedResolutions: []res{
282				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
283				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "lgplLib.meta_lic", "restricted"},
284				{"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
285				{"apacheContainer.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
286				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
287				{"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
288			},
289		},
290		{
291			name:  "weakrestricteddynamic",
292			roots: []string{"apacheBin.meta_lic"},
293			edges: []annotated{
294				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
295				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
296			},
297			expectedResolutions: []res{
298				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
299				{"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
300			},
301		},
302		{
303			name:  "weakrestricteddynamicshipped",
304			roots: []string{"apacheBin.meta_lic", "lgplLib.meta_lic"},
305			edges: []annotated{
306				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
307				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
308			},
309			expectedResolutions: []res{
310				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
311				{"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
312				{"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
313			},
314		},
315		{
316			name:  "weakrestricteddynamicdeep",
317			roots: []string{"apacheContainer.meta_lic"},
318			edges: []annotated{
319				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
320				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
321			},
322			expectedResolutions: []res{
323				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
324				{"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
325				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
326			},
327		},
328		{
329			name:  "weakrestricteddynamicdeepshipped",
330			roots: []string{"apacheContainer.meta_lic", "lgplLib.meta_lic"},
331			edges: []annotated{
332				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
333				{"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
334			},
335			expectedResolutions: []res{
336				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
337				{"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
338				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
339				{"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
340			},
341		},
342		{
343			name:  "weakrestricteddynamicwide",
344			roots: []string{"apacheContainer.meta_lic"},
345			edges: []annotated{
346				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
347				{"apacheContainer.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
348			},
349			expectedResolutions: []res{
350				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
351				{"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
352				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
353			},
354		},
355		{
356			name:  "weakrestricteddynamicwideshipped",
357			roots: []string{"apacheContainer.meta_lic", "lgplLib.meta_lic"},
358			edges: []annotated{
359				{"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}},
360				{"apacheContainer.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}},
361			},
362			expectedResolutions: []res{
363				{"apacheContainer.meta_lic", "apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"},
364				{"apacheContainer.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
365				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
366				{"lgplLib.meta_lic", "lgplLib.meta_lic", "lgplLib.meta_lic", "restricted"},
367			},
368		},
369		{
370			name:  "classpath",
371			roots: []string{"apacheBin.meta_lic"},
372			edges: []annotated{
373				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}},
374				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
375			},
376			expectedResolutions: []res{
377				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
378				{"apacheBin.meta_lic", "apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
379				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
380				{"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
381				{"apacheBin.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
382			},
383		},
384		{
385			name:  "classpathdependent",
386			roots: []string{"dependentModule.meta_lic"},
387			edges: []annotated{
388				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}},
389				{"dependentModule.meta_lic", "mitLib.meta_lic", []string{"static"}},
390			},
391			expectedResolutions: []res{
392				{"dependentModule.meta_lic", "dependentModule.meta_lic", "dependentModule.meta_lic", "notice"},
393				{"dependentModule.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
394				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
395				{"dependentModule.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
396				{"dependentModule.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
397			},
398		},
399		{
400			name:  "classpathdynamic",
401			roots: []string{"apacheBin.meta_lic"},
402			edges: []annotated{
403				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
404				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
405			},
406			expectedResolutions: []res{
407				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
408				{"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
409			},
410		},
411		{
412			name:  "classpathdynamicshipped",
413			roots: []string{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic"},
414			edges: []annotated{
415				{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
416				{"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
417			},
418			expectedResolutions: []res{
419				{"apacheBin.meta_lic", "apacheBin.meta_lic", "apacheBin.meta_lic", "notice"},
420				{"apacheBin.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
421				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
422			},
423		},
424		{
425			name:  "classpathdependentdynamic",
426			roots: []string{"dependentModule.meta_lic"},
427			edges: []annotated{
428				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
429				{"dependentModule.meta_lic", "mitLib.meta_lic", []string{"static"}},
430			},
431			expectedResolutions: []res{
432				{"dependentModule.meta_lic", "dependentModule.meta_lic", "dependentModule.meta_lic", "notice"},
433				{"dependentModule.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
434				{"dependentModule.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
435				{"dependentModule.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
436			},
437		},
438		{
439			name:  "classpathdependentdynamicshipped",
440			roots: []string{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic"},
441			edges: []annotated{
442				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
443				{"dependentModule.meta_lic", "mitLib.meta_lic", []string{"static"}},
444			},
445			expectedResolutions: []res{
446				{"dependentModule.meta_lic", "dependentModule.meta_lic", "dependentModule.meta_lic", "notice"},
447				{"dependentModule.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
448				{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
449				{"dependentModule.meta_lic", "mitLib.meta_lic", "mitLib.meta_lic", "notice"},
450				{"dependentModule.meta_lic", "mitLib.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
451				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
452			},
453		},
454	}
455	for _, tt := range tests {
456		t.Run(tt.name, func(t *testing.T) {
457			stderr := &bytes.Buffer{}
458			lg, err := toGraph(stderr, tt.roots, tt.edges)
459			if err != nil {
460				t.Errorf("unexpected test data error: got %s, want no error", err)
461				return
462			}
463			expectedRs := toResolutionSet(lg, tt.expectedResolutions)
464			actualRs := ResolveNotices(lg)
465			checkSame(actualRs, expectedRs, t)
466		})
467	}
468}
469