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