xref: /aosp_15_r20/build/soong/android/licenses_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Workerpackage android
2*333d2b36SAndroid Build Coastguard Worker
3*333d2b36SAndroid Build Coastguard Workerimport (
4*333d2b36SAndroid Build Coastguard Worker	"testing"
5*333d2b36SAndroid Build Coastguard Worker
6*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
7*333d2b36SAndroid Build Coastguard Worker)
8*333d2b36SAndroid Build Coastguard Worker
9*333d2b36SAndroid Build Coastguard Workervar licensesTests = []struct {
10*333d2b36SAndroid Build Coastguard Worker	name                       string
11*333d2b36SAndroid Build Coastguard Worker	fs                         MockFS
12*333d2b36SAndroid Build Coastguard Worker	expectedErrors             []string
13*333d2b36SAndroid Build Coastguard Worker	effectiveLicenses          map[string][]string
14*333d2b36SAndroid Build Coastguard Worker	effectiveInheritedLicenses map[string][]string
15*333d2b36SAndroid Build Coastguard Worker	effectivePackage           map[string]string
16*333d2b36SAndroid Build Coastguard Worker	effectiveNotices           map[string][]string
17*333d2b36SAndroid Build Coastguard Worker	effectiveKinds             map[string][]string
18*333d2b36SAndroid Build Coastguard Worker	effectiveConditions        map[string][]string
19*333d2b36SAndroid Build Coastguard Worker}{
20*333d2b36SAndroid Build Coastguard Worker	{
21*333d2b36SAndroid Build Coastguard Worker		name: "invalid module type without licenses property",
22*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
23*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
24*333d2b36SAndroid Build Coastguard Worker				mock_bad_module {
25*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
26*333d2b36SAndroid Build Coastguard Worker				}`),
27*333d2b36SAndroid Build Coastguard Worker		},
28*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`module type "mock_bad_module" must have an applicable licenses property`},
29*333d2b36SAndroid Build Coastguard Worker	},
30*333d2b36SAndroid Build Coastguard Worker	{
31*333d2b36SAndroid Build Coastguard Worker		name: "license must exist",
32*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
33*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
34*333d2b36SAndroid Build Coastguard Worker				mock_library {
35*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
36*333d2b36SAndroid Build Coastguard Worker					licenses: ["notice"],
37*333d2b36SAndroid Build Coastguard Worker				}`),
38*333d2b36SAndroid Build Coastguard Worker		},
39*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`"libexample" depends on undefined module "notice"`},
40*333d2b36SAndroid Build Coastguard Worker	},
41*333d2b36SAndroid Build Coastguard Worker	{
42*333d2b36SAndroid Build Coastguard Worker		name: "all good",
43*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
44*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
45*333d2b36SAndroid Build Coastguard Worker				license_kind {
46*333d2b36SAndroid Build Coastguard Worker					name: "notice",
47*333d2b36SAndroid Build Coastguard Worker					conditions: ["shownotice"],
48*333d2b36SAndroid Build Coastguard Worker				}
49*333d2b36SAndroid Build Coastguard Worker
50*333d2b36SAndroid Build Coastguard Worker				license {
51*333d2b36SAndroid Build Coastguard Worker					name: "top_Apache2",
52*333d2b36SAndroid Build Coastguard Worker					license_kinds: ["notice"],
53*333d2b36SAndroid Build Coastguard Worker					package_name: "topDog",
54*333d2b36SAndroid Build Coastguard Worker					license_text: ["LICENSE", "NOTICE"],
55*333d2b36SAndroid Build Coastguard Worker				}
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Worker				mock_library {
58*333d2b36SAndroid Build Coastguard Worker					name: "libexample1",
59*333d2b36SAndroid Build Coastguard Worker					licenses: ["top_Apache2"],
60*333d2b36SAndroid Build Coastguard Worker				}`),
61*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
62*333d2b36SAndroid Build Coastguard Worker				mock_library {
63*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
64*333d2b36SAndroid Build Coastguard Worker					licenses: ["top_Apache2"],
65*333d2b36SAndroid Build Coastguard Worker				}`),
66*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
67*333d2b36SAndroid Build Coastguard Worker				mock_library {
68*333d2b36SAndroid Build Coastguard Worker					name: "libother",
69*333d2b36SAndroid Build Coastguard Worker					licenses: ["top_Apache2"],
70*333d2b36SAndroid Build Coastguard Worker				}`),
71*333d2b36SAndroid Build Coastguard Worker		},
72*333d2b36SAndroid Build Coastguard Worker		effectiveLicenses: map[string][]string{
73*333d2b36SAndroid Build Coastguard Worker			"libexample1": []string{"top_Apache2"},
74*333d2b36SAndroid Build Coastguard Worker			"libnested":   []string{"top_Apache2"},
75*333d2b36SAndroid Build Coastguard Worker			"libother":    []string{"top_Apache2"},
76*333d2b36SAndroid Build Coastguard Worker		},
77*333d2b36SAndroid Build Coastguard Worker		effectiveKinds: map[string][]string{
78*333d2b36SAndroid Build Coastguard Worker			"libexample1": []string{"notice"},
79*333d2b36SAndroid Build Coastguard Worker			"libnested":   []string{"notice"},
80*333d2b36SAndroid Build Coastguard Worker			"libother":    []string{"notice"},
81*333d2b36SAndroid Build Coastguard Worker		},
82*333d2b36SAndroid Build Coastguard Worker		effectivePackage: map[string]string{
83*333d2b36SAndroid Build Coastguard Worker			"libexample1": "topDog",
84*333d2b36SAndroid Build Coastguard Worker			"libnested":   "topDog",
85*333d2b36SAndroid Build Coastguard Worker			"libother":    "topDog",
86*333d2b36SAndroid Build Coastguard Worker		},
87*333d2b36SAndroid Build Coastguard Worker		effectiveConditions: map[string][]string{
88*333d2b36SAndroid Build Coastguard Worker			"libexample1": []string{"shownotice"},
89*333d2b36SAndroid Build Coastguard Worker			"libnested":   []string{"shownotice"},
90*333d2b36SAndroid Build Coastguard Worker			"libother":    []string{"shownotice"},
91*333d2b36SAndroid Build Coastguard Worker		},
92*333d2b36SAndroid Build Coastguard Worker		effectiveNotices: map[string][]string{
93*333d2b36SAndroid Build Coastguard Worker			"libexample1": []string{"top/LICENSE:topDog", "top/NOTICE:topDog"},
94*333d2b36SAndroid Build Coastguard Worker			"libnested":   []string{"top/LICENSE:topDog", "top/NOTICE:topDog"},
95*333d2b36SAndroid Build Coastguard Worker			"libother":    []string{"top/LICENSE:topDog", "top/NOTICE:topDog"},
96*333d2b36SAndroid Build Coastguard Worker		},
97*333d2b36SAndroid Build Coastguard Worker	},
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Worker	// Defaults propagation tests
100*333d2b36SAndroid Build Coastguard Worker	{
101*333d2b36SAndroid Build Coastguard Worker		// Check that licenses is the union of the defaults modules.
102*333d2b36SAndroid Build Coastguard Worker		name: "defaults union, basic",
103*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
104*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
105*333d2b36SAndroid Build Coastguard Worker				license_kind {
106*333d2b36SAndroid Build Coastguard Worker					name: "top_notice",
107*333d2b36SAndroid Build Coastguard Worker					conditions: ["notice"],
108*333d2b36SAndroid Build Coastguard Worker				}
109*333d2b36SAndroid Build Coastguard Worker
110*333d2b36SAndroid Build Coastguard Worker				license {
111*333d2b36SAndroid Build Coastguard Worker					name: "top_other",
112*333d2b36SAndroid Build Coastguard Worker					license_kinds: ["top_notice"],
113*333d2b36SAndroid Build Coastguard Worker				}
114*333d2b36SAndroid Build Coastguard Worker
115*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
116*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
117*333d2b36SAndroid Build Coastguard Worker					licenses: ["top_other"],
118*333d2b36SAndroid Build Coastguard Worker				}
119*333d2b36SAndroid Build Coastguard Worker				mock_library {
120*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
121*333d2b36SAndroid Build Coastguard Worker					licenses: ["nested_other"],
122*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
123*333d2b36SAndroid Build Coastguard Worker				}
124*333d2b36SAndroid Build Coastguard Worker				mock_library {
125*333d2b36SAndroid Build Coastguard Worker					name: "libsamepackage",
126*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
127*333d2b36SAndroid Build Coastguard Worker				}`),
128*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
129*333d2b36SAndroid Build Coastguard Worker				license_kind {
130*333d2b36SAndroid Build Coastguard Worker					name: "nested_notice",
131*333d2b36SAndroid Build Coastguard Worker					conditions: ["notice"],
132*333d2b36SAndroid Build Coastguard Worker				}
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Worker				license {
135*333d2b36SAndroid Build Coastguard Worker					name: "nested_other",
136*333d2b36SAndroid Build Coastguard Worker					license_kinds: ["nested_notice"],
137*333d2b36SAndroid Build Coastguard Worker				}
138*333d2b36SAndroid Build Coastguard Worker
139*333d2b36SAndroid Build Coastguard Worker				mock_library {
140*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
141*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
142*333d2b36SAndroid Build Coastguard Worker				}`),
143*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
144*333d2b36SAndroid Build Coastguard Worker				mock_library {
145*333d2b36SAndroid Build Coastguard Worker					name: "libother",
146*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
147*333d2b36SAndroid Build Coastguard Worker				}`),
148*333d2b36SAndroid Build Coastguard Worker		},
149*333d2b36SAndroid Build Coastguard Worker		effectiveLicenses: map[string][]string{
150*333d2b36SAndroid Build Coastguard Worker			"libexample":     []string{"nested_other", "top_other"},
151*333d2b36SAndroid Build Coastguard Worker			"libsamepackage": []string{},
152*333d2b36SAndroid Build Coastguard Worker			"libnested":      []string{},
153*333d2b36SAndroid Build Coastguard Worker			"libother":       []string{},
154*333d2b36SAndroid Build Coastguard Worker		},
155*333d2b36SAndroid Build Coastguard Worker		effectiveInheritedLicenses: map[string][]string{
156*333d2b36SAndroid Build Coastguard Worker			"libexample":     []string{"nested_other", "top_other"},
157*333d2b36SAndroid Build Coastguard Worker			"libsamepackage": []string{"nested_other", "top_other"},
158*333d2b36SAndroid Build Coastguard Worker			"libnested":      []string{"nested_other", "top_other"},
159*333d2b36SAndroid Build Coastguard Worker			"libother":       []string{"nested_other", "top_other"},
160*333d2b36SAndroid Build Coastguard Worker		},
161*333d2b36SAndroid Build Coastguard Worker		effectiveKinds: map[string][]string{
162*333d2b36SAndroid Build Coastguard Worker			"libexample":     []string{"nested_notice", "top_notice"},
163*333d2b36SAndroid Build Coastguard Worker			"libsamepackage": []string{},
164*333d2b36SAndroid Build Coastguard Worker			"libnested":      []string{},
165*333d2b36SAndroid Build Coastguard Worker			"libother":       []string{},
166*333d2b36SAndroid Build Coastguard Worker		},
167*333d2b36SAndroid Build Coastguard Worker		effectiveConditions: map[string][]string{
168*333d2b36SAndroid Build Coastguard Worker			"libexample":     []string{"notice"},
169*333d2b36SAndroid Build Coastguard Worker			"libsamepackage": []string{},
170*333d2b36SAndroid Build Coastguard Worker			"libnested":      []string{},
171*333d2b36SAndroid Build Coastguard Worker			"libother":       []string{},
172*333d2b36SAndroid Build Coastguard Worker		},
173*333d2b36SAndroid Build Coastguard Worker	},
174*333d2b36SAndroid Build Coastguard Worker	{
175*333d2b36SAndroid Build Coastguard Worker		name: "defaults union, multiple defaults",
176*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
177*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
178*333d2b36SAndroid Build Coastguard Worker				license {
179*333d2b36SAndroid Build Coastguard Worker					name: "top",
180*333d2b36SAndroid Build Coastguard Worker				}
181*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
182*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_1",
183*333d2b36SAndroid Build Coastguard Worker					licenses: ["other"],
184*333d2b36SAndroid Build Coastguard Worker				}
185*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
186*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_2",
187*333d2b36SAndroid Build Coastguard Worker					licenses: ["top_nested"],
188*333d2b36SAndroid Build Coastguard Worker				}
189*333d2b36SAndroid Build Coastguard Worker				mock_library {
190*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
191*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults_1", "libexample_defaults_2"],
192*333d2b36SAndroid Build Coastguard Worker				}
193*333d2b36SAndroid Build Coastguard Worker				mock_library {
194*333d2b36SAndroid Build Coastguard Worker					name: "libsamepackage",
195*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
196*333d2b36SAndroid Build Coastguard Worker				}`),
197*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
198*333d2b36SAndroid Build Coastguard Worker				license {
199*333d2b36SAndroid Build Coastguard Worker					name: "top_nested",
200*333d2b36SAndroid Build Coastguard Worker					license_text: ["LICENSE.txt"],
201*333d2b36SAndroid Build Coastguard Worker				}
202*333d2b36SAndroid Build Coastguard Worker				mock_library {
203*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
204*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
205*333d2b36SAndroid Build Coastguard Worker				}`),
206*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
207*333d2b36SAndroid Build Coastguard Worker				license {
208*333d2b36SAndroid Build Coastguard Worker					name: "other",
209*333d2b36SAndroid Build Coastguard Worker				}
210*333d2b36SAndroid Build Coastguard Worker				mock_library {
211*333d2b36SAndroid Build Coastguard Worker					name: "libother",
212*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
213*333d2b36SAndroid Build Coastguard Worker				}`),
214*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
215*333d2b36SAndroid Build Coastguard Worker				mock_library {
216*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
217*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
218*333d2b36SAndroid Build Coastguard Worker				}`),
219*333d2b36SAndroid Build Coastguard Worker		},
220*333d2b36SAndroid Build Coastguard Worker		effectiveLicenses: map[string][]string{
221*333d2b36SAndroid Build Coastguard Worker			"libexample":     []string{"other", "top_nested"},
222*333d2b36SAndroid Build Coastguard Worker			"libsamepackage": []string{},
223*333d2b36SAndroid Build Coastguard Worker			"libnested":      []string{},
224*333d2b36SAndroid Build Coastguard Worker			"libother":       []string{},
225*333d2b36SAndroid Build Coastguard Worker			"liboutsider":    []string{},
226*333d2b36SAndroid Build Coastguard Worker		},
227*333d2b36SAndroid Build Coastguard Worker		effectiveInheritedLicenses: map[string][]string{
228*333d2b36SAndroid Build Coastguard Worker			"libexample":     []string{"other", "top_nested"},
229*333d2b36SAndroid Build Coastguard Worker			"libsamepackage": []string{"other", "top_nested"},
230*333d2b36SAndroid Build Coastguard Worker			"libnested":      []string{"other", "top_nested"},
231*333d2b36SAndroid Build Coastguard Worker			"libother":       []string{"other", "top_nested"},
232*333d2b36SAndroid Build Coastguard Worker			"liboutsider":    []string{"other", "top_nested"},
233*333d2b36SAndroid Build Coastguard Worker		},
234*333d2b36SAndroid Build Coastguard Worker		effectiveKinds: map[string][]string{
235*333d2b36SAndroid Build Coastguard Worker			"libexample":     []string{},
236*333d2b36SAndroid Build Coastguard Worker			"libsamepackage": []string{},
237*333d2b36SAndroid Build Coastguard Worker			"libnested":      []string{},
238*333d2b36SAndroid Build Coastguard Worker			"libother":       []string{},
239*333d2b36SAndroid Build Coastguard Worker			"liboutsider":    []string{},
240*333d2b36SAndroid Build Coastguard Worker		},
241*333d2b36SAndroid Build Coastguard Worker		effectiveNotices: map[string][]string{
242*333d2b36SAndroid Build Coastguard Worker			"libexample":     []string{"top/nested/LICENSE.txt"},
243*333d2b36SAndroid Build Coastguard Worker			"libsamepackage": []string{},
244*333d2b36SAndroid Build Coastguard Worker			"libnested":      []string{},
245*333d2b36SAndroid Build Coastguard Worker			"libother":       []string{},
246*333d2b36SAndroid Build Coastguard Worker			"liboutsider":    []string{},
247*333d2b36SAndroid Build Coastguard Worker		},
248*333d2b36SAndroid Build Coastguard Worker	},
249*333d2b36SAndroid Build Coastguard Worker
250*333d2b36SAndroid Build Coastguard Worker	// Defaults module's defaults_licenses tests
251*333d2b36SAndroid Build Coastguard Worker	{
252*333d2b36SAndroid Build Coastguard Worker		name: "defaults_licenses invalid",
253*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
254*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
255*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
256*333d2b36SAndroid Build Coastguard Worker					name: "top_defaults",
257*333d2b36SAndroid Build Coastguard Worker					licenses: ["notice"],
258*333d2b36SAndroid Build Coastguard Worker				}`),
259*333d2b36SAndroid Build Coastguard Worker		},
260*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`"top_defaults" depends on undefined module "notice"`},
261*333d2b36SAndroid Build Coastguard Worker	},
262*333d2b36SAndroid Build Coastguard Worker	{
263*333d2b36SAndroid Build Coastguard Worker		name: "defaults_licenses overrides package default",
264*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
265*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
266*333d2b36SAndroid Build Coastguard Worker				package {
267*333d2b36SAndroid Build Coastguard Worker					default_applicable_licenses: ["by_exception_only"],
268*333d2b36SAndroid Build Coastguard Worker				}
269*333d2b36SAndroid Build Coastguard Worker				license {
270*333d2b36SAndroid Build Coastguard Worker					name: "by_exception_only",
271*333d2b36SAndroid Build Coastguard Worker				}
272*333d2b36SAndroid Build Coastguard Worker				license {
273*333d2b36SAndroid Build Coastguard Worker					name: "notice",
274*333d2b36SAndroid Build Coastguard Worker				}
275*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
276*333d2b36SAndroid Build Coastguard Worker					name: "top_defaults",
277*333d2b36SAndroid Build Coastguard Worker					licenses: ["notice"],
278*333d2b36SAndroid Build Coastguard Worker				}
279*333d2b36SAndroid Build Coastguard Worker				mock_library {
280*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
281*333d2b36SAndroid Build Coastguard Worker				}
282*333d2b36SAndroid Build Coastguard Worker				mock_library {
283*333d2b36SAndroid Build Coastguard Worker					name: "libdefaults",
284*333d2b36SAndroid Build Coastguard Worker					defaults: ["top_defaults"],
285*333d2b36SAndroid Build Coastguard Worker				}`),
286*333d2b36SAndroid Build Coastguard Worker		},
287*333d2b36SAndroid Build Coastguard Worker		effectiveLicenses: map[string][]string{
288*333d2b36SAndroid Build Coastguard Worker			"libexample":  []string{"by_exception_only"},
289*333d2b36SAndroid Build Coastguard Worker			"libdefaults": []string{"notice"},
290*333d2b36SAndroid Build Coastguard Worker		},
291*333d2b36SAndroid Build Coastguard Worker		effectiveInheritedLicenses: map[string][]string{
292*333d2b36SAndroid Build Coastguard Worker			"libexample":  []string{"by_exception_only"},
293*333d2b36SAndroid Build Coastguard Worker			"libdefaults": []string{"notice"},
294*333d2b36SAndroid Build Coastguard Worker		},
295*333d2b36SAndroid Build Coastguard Worker	},
296*333d2b36SAndroid Build Coastguard Worker
297*333d2b36SAndroid Build Coastguard Worker	// Package default_applicable_licenses tests
298*333d2b36SAndroid Build Coastguard Worker	{
299*333d2b36SAndroid Build Coastguard Worker		name: "package default_applicable_licenses must exist",
300*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
301*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
302*333d2b36SAndroid Build Coastguard Worker				package {
303*333d2b36SAndroid Build Coastguard Worker					default_applicable_licenses: ["notice"],
304*333d2b36SAndroid Build Coastguard Worker				}`),
305*333d2b36SAndroid Build Coastguard Worker		},
306*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`"//top" depends on undefined module "notice"`},
307*333d2b36SAndroid Build Coastguard Worker	},
308*333d2b36SAndroid Build Coastguard Worker	{
309*333d2b36SAndroid Build Coastguard Worker		// This test relies on the default licenses being legacy_public.
310*333d2b36SAndroid Build Coastguard Worker		name: "package default_applicable_licenses property used when no licenses specified",
311*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
312*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
313*333d2b36SAndroid Build Coastguard Worker				package {
314*333d2b36SAndroid Build Coastguard Worker					default_applicable_licenses: ["top_notice"],
315*333d2b36SAndroid Build Coastguard Worker				}
316*333d2b36SAndroid Build Coastguard Worker
317*333d2b36SAndroid Build Coastguard Worker				license {
318*333d2b36SAndroid Build Coastguard Worker					name: "top_notice",
319*333d2b36SAndroid Build Coastguard Worker				}
320*333d2b36SAndroid Build Coastguard Worker				mock_library {
321*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
322*333d2b36SAndroid Build Coastguard Worker				}`),
323*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
324*333d2b36SAndroid Build Coastguard Worker				mock_library {
325*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
326*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
327*333d2b36SAndroid Build Coastguard Worker				}`),
328*333d2b36SAndroid Build Coastguard Worker		},
329*333d2b36SAndroid Build Coastguard Worker		effectiveLicenses: map[string][]string{
330*333d2b36SAndroid Build Coastguard Worker			"libexample":  []string{"top_notice"},
331*333d2b36SAndroid Build Coastguard Worker			"liboutsider": []string{},
332*333d2b36SAndroid Build Coastguard Worker		},
333*333d2b36SAndroid Build Coastguard Worker		effectiveInheritedLicenses: map[string][]string{
334*333d2b36SAndroid Build Coastguard Worker			"libexample":  []string{"top_notice"},
335*333d2b36SAndroid Build Coastguard Worker			"liboutsider": []string{"top_notice"},
336*333d2b36SAndroid Build Coastguard Worker		},
337*333d2b36SAndroid Build Coastguard Worker	},
338*333d2b36SAndroid Build Coastguard Worker	{
339*333d2b36SAndroid Build Coastguard Worker		name: "package default_applicable_licenses not inherited to subpackages",
340*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
341*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
342*333d2b36SAndroid Build Coastguard Worker				package {
343*333d2b36SAndroid Build Coastguard Worker					default_applicable_licenses: ["top_notice"],
344*333d2b36SAndroid Build Coastguard Worker				}
345*333d2b36SAndroid Build Coastguard Worker				license {
346*333d2b36SAndroid Build Coastguard Worker					name: "top_notice",
347*333d2b36SAndroid Build Coastguard Worker				}
348*333d2b36SAndroid Build Coastguard Worker				mock_library {
349*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
350*333d2b36SAndroid Build Coastguard Worker				}`),
351*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
352*333d2b36SAndroid Build Coastguard Worker				package {
353*333d2b36SAndroid Build Coastguard Worker					default_applicable_licenses: ["outsider"],
354*333d2b36SAndroid Build Coastguard Worker				}
355*333d2b36SAndroid Build Coastguard Worker
356*333d2b36SAndroid Build Coastguard Worker				mock_library {
357*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
358*333d2b36SAndroid Build Coastguard Worker				}`),
359*333d2b36SAndroid Build Coastguard Worker			"top/other/Android.bp": []byte(`
360*333d2b36SAndroid Build Coastguard Worker				mock_library {
361*333d2b36SAndroid Build Coastguard Worker					name: "libother",
362*333d2b36SAndroid Build Coastguard Worker				}`),
363*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
364*333d2b36SAndroid Build Coastguard Worker				license {
365*333d2b36SAndroid Build Coastguard Worker					name: "outsider",
366*333d2b36SAndroid Build Coastguard Worker				}
367*333d2b36SAndroid Build Coastguard Worker				mock_library {
368*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
369*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample", "libother", "libnested"],
370*333d2b36SAndroid Build Coastguard Worker				}`),
371*333d2b36SAndroid Build Coastguard Worker		},
372*333d2b36SAndroid Build Coastguard Worker		effectiveLicenses: map[string][]string{
373*333d2b36SAndroid Build Coastguard Worker			"libexample":  []string{"top_notice"},
374*333d2b36SAndroid Build Coastguard Worker			"libnested":   []string{"outsider"},
375*333d2b36SAndroid Build Coastguard Worker			"libother":    []string{},
376*333d2b36SAndroid Build Coastguard Worker			"liboutsider": []string{},
377*333d2b36SAndroid Build Coastguard Worker		},
378*333d2b36SAndroid Build Coastguard Worker		effectiveInheritedLicenses: map[string][]string{
379*333d2b36SAndroid Build Coastguard Worker			"libexample":  []string{"top_notice"},
380*333d2b36SAndroid Build Coastguard Worker			"libnested":   []string{"outsider"},
381*333d2b36SAndroid Build Coastguard Worker			"libother":    []string{},
382*333d2b36SAndroid Build Coastguard Worker			"liboutsider": []string{"top_notice", "outsider"},
383*333d2b36SAndroid Build Coastguard Worker		},
384*333d2b36SAndroid Build Coastguard Worker	},
385*333d2b36SAndroid Build Coastguard Worker	{
386*333d2b36SAndroid Build Coastguard Worker		name: "verify that prebuilt dependencies are included",
387*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
388*333d2b36SAndroid Build Coastguard Worker			"prebuilts/Android.bp": []byte(`
389*333d2b36SAndroid Build Coastguard Worker				license {
390*333d2b36SAndroid Build Coastguard Worker					name: "prebuilt"
391*333d2b36SAndroid Build Coastguard Worker				}
392*333d2b36SAndroid Build Coastguard Worker				prebuilt {
393*333d2b36SAndroid Build Coastguard Worker					name: "module",
394*333d2b36SAndroid Build Coastguard Worker					licenses: ["prebuilt"],
395*333d2b36SAndroid Build Coastguard Worker				}`),
396*333d2b36SAndroid Build Coastguard Worker			"top/sources/source_file": nil,
397*333d2b36SAndroid Build Coastguard Worker			"top/sources/Android.bp": []byte(`
398*333d2b36SAndroid Build Coastguard Worker				license {
399*333d2b36SAndroid Build Coastguard Worker					name: "top_sources"
400*333d2b36SAndroid Build Coastguard Worker				}
401*333d2b36SAndroid Build Coastguard Worker				source {
402*333d2b36SAndroid Build Coastguard Worker					name: "module",
403*333d2b36SAndroid Build Coastguard Worker					licenses: ["top_sources"],
404*333d2b36SAndroid Build Coastguard Worker				}`),
405*333d2b36SAndroid Build Coastguard Worker			"top/other/source_file": nil,
406*333d2b36SAndroid Build Coastguard Worker			"top/other/Android.bp": []byte(`
407*333d2b36SAndroid Build Coastguard Worker				source {
408*333d2b36SAndroid Build Coastguard Worker					name: "other",
409*333d2b36SAndroid Build Coastguard Worker					deps: [":module"],
410*333d2b36SAndroid Build Coastguard Worker				}`),
411*333d2b36SAndroid Build Coastguard Worker		},
412*333d2b36SAndroid Build Coastguard Worker		effectiveLicenses: map[string][]string{
413*333d2b36SAndroid Build Coastguard Worker			"other": []string{},
414*333d2b36SAndroid Build Coastguard Worker		},
415*333d2b36SAndroid Build Coastguard Worker		effectiveInheritedLicenses: map[string][]string{
416*333d2b36SAndroid Build Coastguard Worker			"other": []string{"prebuilt", "top_sources"},
417*333d2b36SAndroid Build Coastguard Worker		},
418*333d2b36SAndroid Build Coastguard Worker	},
419*333d2b36SAndroid Build Coastguard Worker	{
420*333d2b36SAndroid Build Coastguard Worker		name: "verify that prebuilt dependencies are ignored for licenses reasons (preferred)",
421*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
422*333d2b36SAndroid Build Coastguard Worker			"prebuilts/Android.bp": []byte(`
423*333d2b36SAndroid Build Coastguard Worker				license {
424*333d2b36SAndroid Build Coastguard Worker					name: "prebuilt"
425*333d2b36SAndroid Build Coastguard Worker				}
426*333d2b36SAndroid Build Coastguard Worker				prebuilt {
427*333d2b36SAndroid Build Coastguard Worker					name: "module",
428*333d2b36SAndroid Build Coastguard Worker					licenses: ["prebuilt"],
429*333d2b36SAndroid Build Coastguard Worker					prefer: true,
430*333d2b36SAndroid Build Coastguard Worker				}`),
431*333d2b36SAndroid Build Coastguard Worker			"top/sources/source_file": nil,
432*333d2b36SAndroid Build Coastguard Worker			"top/sources/Android.bp": []byte(`
433*333d2b36SAndroid Build Coastguard Worker				license {
434*333d2b36SAndroid Build Coastguard Worker					name: "top_sources"
435*333d2b36SAndroid Build Coastguard Worker				}
436*333d2b36SAndroid Build Coastguard Worker				source {
437*333d2b36SAndroid Build Coastguard Worker					name: "module",
438*333d2b36SAndroid Build Coastguard Worker					licenses: ["top_sources"],
439*333d2b36SAndroid Build Coastguard Worker				}`),
440*333d2b36SAndroid Build Coastguard Worker			"top/other/source_file": nil,
441*333d2b36SAndroid Build Coastguard Worker			"top/other/Android.bp": []byte(`
442*333d2b36SAndroid Build Coastguard Worker				source {
443*333d2b36SAndroid Build Coastguard Worker					name: "other",
444*333d2b36SAndroid Build Coastguard Worker					deps: [":module"],
445*333d2b36SAndroid Build Coastguard Worker				}`),
446*333d2b36SAndroid Build Coastguard Worker		},
447*333d2b36SAndroid Build Coastguard Worker		effectiveLicenses: map[string][]string{
448*333d2b36SAndroid Build Coastguard Worker			"other": []string{},
449*333d2b36SAndroid Build Coastguard Worker		},
450*333d2b36SAndroid Build Coastguard Worker		effectiveInheritedLicenses: map[string][]string{
451*333d2b36SAndroid Build Coastguard Worker			"module": []string{"prebuilt", "top_sources"},
452*333d2b36SAndroid Build Coastguard Worker			"other":  []string{"prebuilt", "top_sources"},
453*333d2b36SAndroid Build Coastguard Worker		},
454*333d2b36SAndroid Build Coastguard Worker	},
455*333d2b36SAndroid Build Coastguard Worker}
456*333d2b36SAndroid Build Coastguard Worker
457*333d2b36SAndroid Build Coastguard Workerfunc TestLicenses(t *testing.T) {
458*333d2b36SAndroid Build Coastguard Worker	for _, test := range licensesTests {
459*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
460*333d2b36SAndroid Build Coastguard Worker			// Customize the common license text fixture factory.
461*333d2b36SAndroid Build Coastguard Worker			result := GroupFixturePreparers(
462*333d2b36SAndroid Build Coastguard Worker				prepareForLicenseTest,
463*333d2b36SAndroid Build Coastguard Worker				FixtureRegisterWithContext(func(ctx RegistrationContext) {
464*333d2b36SAndroid Build Coastguard Worker					ctx.RegisterModuleType("mock_bad_module", newMockLicensesBadModule)
465*333d2b36SAndroid Build Coastguard Worker					ctx.RegisterModuleType("mock_library", newMockLicensesLibraryModule)
466*333d2b36SAndroid Build Coastguard Worker					ctx.RegisterModuleType("mock_defaults", defaultsLicensesFactory)
467*333d2b36SAndroid Build Coastguard Worker				}),
468*333d2b36SAndroid Build Coastguard Worker				test.fs.AddToFixture(),
469*333d2b36SAndroid Build Coastguard Worker			).
470*333d2b36SAndroid Build Coastguard Worker				ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern(test.expectedErrors)).
471*333d2b36SAndroid Build Coastguard Worker				RunTest(t)
472*333d2b36SAndroid Build Coastguard Worker
473*333d2b36SAndroid Build Coastguard Worker			if test.effectiveLicenses != nil {
474*333d2b36SAndroid Build Coastguard Worker				checkEffectiveLicenses(t, result, test.effectiveLicenses)
475*333d2b36SAndroid Build Coastguard Worker			}
476*333d2b36SAndroid Build Coastguard Worker
477*333d2b36SAndroid Build Coastguard Worker			if test.effectivePackage != nil {
478*333d2b36SAndroid Build Coastguard Worker				checkEffectivePackage(t, result, test.effectivePackage)
479*333d2b36SAndroid Build Coastguard Worker			}
480*333d2b36SAndroid Build Coastguard Worker
481*333d2b36SAndroid Build Coastguard Worker			if test.effectiveNotices != nil {
482*333d2b36SAndroid Build Coastguard Worker				checkEffectiveNotices(t, result, test.effectiveNotices)
483*333d2b36SAndroid Build Coastguard Worker			}
484*333d2b36SAndroid Build Coastguard Worker
485*333d2b36SAndroid Build Coastguard Worker			if test.effectiveKinds != nil {
486*333d2b36SAndroid Build Coastguard Worker				checkEffectiveKinds(t, result, test.effectiveKinds)
487*333d2b36SAndroid Build Coastguard Worker			}
488*333d2b36SAndroid Build Coastguard Worker
489*333d2b36SAndroid Build Coastguard Worker			if test.effectiveConditions != nil {
490*333d2b36SAndroid Build Coastguard Worker				checkEffectiveConditions(t, result, test.effectiveConditions)
491*333d2b36SAndroid Build Coastguard Worker			}
492*333d2b36SAndroid Build Coastguard Worker
493*333d2b36SAndroid Build Coastguard Worker			if test.effectiveInheritedLicenses != nil {
494*333d2b36SAndroid Build Coastguard Worker				checkEffectiveInheritedLicenses(t, result, test.effectiveInheritedLicenses)
495*333d2b36SAndroid Build Coastguard Worker			}
496*333d2b36SAndroid Build Coastguard Worker		})
497*333d2b36SAndroid Build Coastguard Worker	}
498*333d2b36SAndroid Build Coastguard Worker}
499*333d2b36SAndroid Build Coastguard Worker
500*333d2b36SAndroid Build Coastguard Workerfunc checkEffectiveLicenses(t *testing.T, result *TestResult, effectiveLicenses map[string][]string) {
501*333d2b36SAndroid Build Coastguard Worker	actualLicenses := make(map[string][]string)
502*333d2b36SAndroid Build Coastguard Worker	result.Context.Context.VisitAllModules(func(m blueprint.Module) {
503*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*licenseModule); ok {
504*333d2b36SAndroid Build Coastguard Worker			return
505*333d2b36SAndroid Build Coastguard Worker		}
506*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*licenseKindModule); ok {
507*333d2b36SAndroid Build Coastguard Worker			return
508*333d2b36SAndroid Build Coastguard Worker		}
509*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*packageModule); ok {
510*333d2b36SAndroid Build Coastguard Worker			return
511*333d2b36SAndroid Build Coastguard Worker		}
512*333d2b36SAndroid Build Coastguard Worker		module, ok := m.(Module)
513*333d2b36SAndroid Build Coastguard Worker		if !ok {
514*333d2b36SAndroid Build Coastguard Worker			t.Errorf("%q not a module", m.Name())
515*333d2b36SAndroid Build Coastguard Worker			return
516*333d2b36SAndroid Build Coastguard Worker		}
517*333d2b36SAndroid Build Coastguard Worker		base := module.base()
518*333d2b36SAndroid Build Coastguard Worker		if base == nil {
519*333d2b36SAndroid Build Coastguard Worker			return
520*333d2b36SAndroid Build Coastguard Worker		}
521*333d2b36SAndroid Build Coastguard Worker		actualLicenses[m.Name()] = base.commonProperties.Effective_licenses
522*333d2b36SAndroid Build Coastguard Worker	})
523*333d2b36SAndroid Build Coastguard Worker
524*333d2b36SAndroid Build Coastguard Worker	for moduleName, expectedLicenses := range effectiveLicenses {
525*333d2b36SAndroid Build Coastguard Worker		licenses, ok := actualLicenses[moduleName]
526*333d2b36SAndroid Build Coastguard Worker		if !ok {
527*333d2b36SAndroid Build Coastguard Worker			licenses = []string{}
528*333d2b36SAndroid Build Coastguard Worker		}
529*333d2b36SAndroid Build Coastguard Worker		if !compareUnorderedStringArrays(expectedLicenses, licenses) {
530*333d2b36SAndroid Build Coastguard Worker			t.Errorf("effective licenses mismatch for module %q: expected %q, found %q", moduleName, expectedLicenses, licenses)
531*333d2b36SAndroid Build Coastguard Worker		}
532*333d2b36SAndroid Build Coastguard Worker	}
533*333d2b36SAndroid Build Coastguard Worker}
534*333d2b36SAndroid Build Coastguard Worker
535*333d2b36SAndroid Build Coastguard Workerfunc checkEffectiveInheritedLicenses(t *testing.T, result *TestResult, effectiveInheritedLicenses map[string][]string) {
536*333d2b36SAndroid Build Coastguard Worker	actualLicenses := make(map[string][]string)
537*333d2b36SAndroid Build Coastguard Worker	result.Context.Context.VisitAllModules(func(m blueprint.Module) {
538*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*licenseModule); ok {
539*333d2b36SAndroid Build Coastguard Worker			return
540*333d2b36SAndroid Build Coastguard Worker		}
541*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*licenseKindModule); ok {
542*333d2b36SAndroid Build Coastguard Worker			return
543*333d2b36SAndroid Build Coastguard Worker		}
544*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*packageModule); ok {
545*333d2b36SAndroid Build Coastguard Worker			return
546*333d2b36SAndroid Build Coastguard Worker		}
547*333d2b36SAndroid Build Coastguard Worker		module, ok := m.(Module)
548*333d2b36SAndroid Build Coastguard Worker		if !ok {
549*333d2b36SAndroid Build Coastguard Worker			t.Errorf("%q not a module", m.Name())
550*333d2b36SAndroid Build Coastguard Worker			return
551*333d2b36SAndroid Build Coastguard Worker		}
552*333d2b36SAndroid Build Coastguard Worker		base := module.base()
553*333d2b36SAndroid Build Coastguard Worker		if base == nil {
554*333d2b36SAndroid Build Coastguard Worker			return
555*333d2b36SAndroid Build Coastguard Worker		}
556*333d2b36SAndroid Build Coastguard Worker		inherited := make(map[string]bool)
557*333d2b36SAndroid Build Coastguard Worker		for _, l := range base.commonProperties.Effective_licenses {
558*333d2b36SAndroid Build Coastguard Worker			inherited[l] = true
559*333d2b36SAndroid Build Coastguard Worker		}
560*333d2b36SAndroid Build Coastguard Worker		result.Context.Context.VisitDepsDepthFirst(m, func(c blueprint.Module) {
561*333d2b36SAndroid Build Coastguard Worker			if _, ok := c.(*licenseModule); ok {
562*333d2b36SAndroid Build Coastguard Worker				return
563*333d2b36SAndroid Build Coastguard Worker			}
564*333d2b36SAndroid Build Coastguard Worker			if _, ok := c.(*licenseKindModule); ok {
565*333d2b36SAndroid Build Coastguard Worker				return
566*333d2b36SAndroid Build Coastguard Worker			}
567*333d2b36SAndroid Build Coastguard Worker			if _, ok := c.(*packageModule); ok {
568*333d2b36SAndroid Build Coastguard Worker				return
569*333d2b36SAndroid Build Coastguard Worker			}
570*333d2b36SAndroid Build Coastguard Worker			cmodule, ok := c.(Module)
571*333d2b36SAndroid Build Coastguard Worker			if !ok {
572*333d2b36SAndroid Build Coastguard Worker				t.Errorf("%q not a module", c.Name())
573*333d2b36SAndroid Build Coastguard Worker				return
574*333d2b36SAndroid Build Coastguard Worker			}
575*333d2b36SAndroid Build Coastguard Worker			cbase := cmodule.base()
576*333d2b36SAndroid Build Coastguard Worker			if cbase == nil {
577*333d2b36SAndroid Build Coastguard Worker				return
578*333d2b36SAndroid Build Coastguard Worker			}
579*333d2b36SAndroid Build Coastguard Worker			for _, l := range cbase.commonProperties.Effective_licenses {
580*333d2b36SAndroid Build Coastguard Worker				inherited[l] = true
581*333d2b36SAndroid Build Coastguard Worker			}
582*333d2b36SAndroid Build Coastguard Worker		})
583*333d2b36SAndroid Build Coastguard Worker		actualLicenses[m.Name()] = []string{}
584*333d2b36SAndroid Build Coastguard Worker		for l := range inherited {
585*333d2b36SAndroid Build Coastguard Worker			actualLicenses[m.Name()] = append(actualLicenses[m.Name()], l)
586*333d2b36SAndroid Build Coastguard Worker		}
587*333d2b36SAndroid Build Coastguard Worker	})
588*333d2b36SAndroid Build Coastguard Worker
589*333d2b36SAndroid Build Coastguard Worker	for moduleName, expectedInheritedLicenses := range effectiveInheritedLicenses {
590*333d2b36SAndroid Build Coastguard Worker		licenses, ok := actualLicenses[moduleName]
591*333d2b36SAndroid Build Coastguard Worker		if !ok {
592*333d2b36SAndroid Build Coastguard Worker			licenses = []string{}
593*333d2b36SAndroid Build Coastguard Worker		}
594*333d2b36SAndroid Build Coastguard Worker		if !compareUnorderedStringArrays(expectedInheritedLicenses, licenses) {
595*333d2b36SAndroid Build Coastguard Worker			t.Errorf("effective inherited licenses mismatch for module %q: expected %q, found %q", moduleName, expectedInheritedLicenses, licenses)
596*333d2b36SAndroid Build Coastguard Worker		}
597*333d2b36SAndroid Build Coastguard Worker	}
598*333d2b36SAndroid Build Coastguard Worker}
599*333d2b36SAndroid Build Coastguard Worker
600*333d2b36SAndroid Build Coastguard Workerfunc checkEffectivePackage(t *testing.T, result *TestResult, effectivePackage map[string]string) {
601*333d2b36SAndroid Build Coastguard Worker	actualPackage := make(map[string]string)
602*333d2b36SAndroid Build Coastguard Worker	result.Context.Context.VisitAllModules(func(m blueprint.Module) {
603*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*licenseModule); ok {
604*333d2b36SAndroid Build Coastguard Worker			return
605*333d2b36SAndroid Build Coastguard Worker		}
606*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*licenseKindModule); ok {
607*333d2b36SAndroid Build Coastguard Worker			return
608*333d2b36SAndroid Build Coastguard Worker		}
609*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*packageModule); ok {
610*333d2b36SAndroid Build Coastguard Worker			return
611*333d2b36SAndroid Build Coastguard Worker		}
612*333d2b36SAndroid Build Coastguard Worker		module, ok := m.(Module)
613*333d2b36SAndroid Build Coastguard Worker		if !ok {
614*333d2b36SAndroid Build Coastguard Worker			t.Errorf("%q not a module", m.Name())
615*333d2b36SAndroid Build Coastguard Worker			return
616*333d2b36SAndroid Build Coastguard Worker		}
617*333d2b36SAndroid Build Coastguard Worker		base := module.base()
618*333d2b36SAndroid Build Coastguard Worker		if base == nil {
619*333d2b36SAndroid Build Coastguard Worker			return
620*333d2b36SAndroid Build Coastguard Worker		}
621*333d2b36SAndroid Build Coastguard Worker
622*333d2b36SAndroid Build Coastguard Worker		if base.commonProperties.Effective_package_name == nil {
623*333d2b36SAndroid Build Coastguard Worker			actualPackage[m.Name()] = ""
624*333d2b36SAndroid Build Coastguard Worker		} else {
625*333d2b36SAndroid Build Coastguard Worker			actualPackage[m.Name()] = *base.commonProperties.Effective_package_name
626*333d2b36SAndroid Build Coastguard Worker		}
627*333d2b36SAndroid Build Coastguard Worker	})
628*333d2b36SAndroid Build Coastguard Worker
629*333d2b36SAndroid Build Coastguard Worker	for moduleName, expectedPackage := range effectivePackage {
630*333d2b36SAndroid Build Coastguard Worker		packageName, ok := actualPackage[moduleName]
631*333d2b36SAndroid Build Coastguard Worker		if !ok {
632*333d2b36SAndroid Build Coastguard Worker			packageName = ""
633*333d2b36SAndroid Build Coastguard Worker		}
634*333d2b36SAndroid Build Coastguard Worker		if expectedPackage != packageName {
635*333d2b36SAndroid Build Coastguard Worker			t.Errorf("effective package mismatch for module %q: expected %q, found %q", moduleName, expectedPackage, packageName)
636*333d2b36SAndroid Build Coastguard Worker		}
637*333d2b36SAndroid Build Coastguard Worker	}
638*333d2b36SAndroid Build Coastguard Worker}
639*333d2b36SAndroid Build Coastguard Worker
640*333d2b36SAndroid Build Coastguard Workerfunc checkEffectiveNotices(t *testing.T, result *TestResult, effectiveNotices map[string][]string) {
641*333d2b36SAndroid Build Coastguard Worker	actualNotices := make(map[string][]string)
642*333d2b36SAndroid Build Coastguard Worker	result.Context.Context.VisitAllModules(func(m blueprint.Module) {
643*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*licenseModule); ok {
644*333d2b36SAndroid Build Coastguard Worker			return
645*333d2b36SAndroid Build Coastguard Worker		}
646*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*licenseKindModule); ok {
647*333d2b36SAndroid Build Coastguard Worker			return
648*333d2b36SAndroid Build Coastguard Worker		}
649*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*packageModule); ok {
650*333d2b36SAndroid Build Coastguard Worker			return
651*333d2b36SAndroid Build Coastguard Worker		}
652*333d2b36SAndroid Build Coastguard Worker		module, ok := m.(Module)
653*333d2b36SAndroid Build Coastguard Worker		if !ok {
654*333d2b36SAndroid Build Coastguard Worker			t.Errorf("%q not a module", m.Name())
655*333d2b36SAndroid Build Coastguard Worker			return
656*333d2b36SAndroid Build Coastguard Worker		}
657*333d2b36SAndroid Build Coastguard Worker		base := module.base()
658*333d2b36SAndroid Build Coastguard Worker		if base == nil {
659*333d2b36SAndroid Build Coastguard Worker			return
660*333d2b36SAndroid Build Coastguard Worker		}
661*333d2b36SAndroid Build Coastguard Worker		actualNotices[m.Name()] = base.commonProperties.Effective_license_text.Strings()
662*333d2b36SAndroid Build Coastguard Worker	})
663*333d2b36SAndroid Build Coastguard Worker
664*333d2b36SAndroid Build Coastguard Worker	for moduleName, expectedNotices := range effectiveNotices {
665*333d2b36SAndroid Build Coastguard Worker		notices, ok := actualNotices[moduleName]
666*333d2b36SAndroid Build Coastguard Worker		if !ok {
667*333d2b36SAndroid Build Coastguard Worker			notices = []string{}
668*333d2b36SAndroid Build Coastguard Worker		}
669*333d2b36SAndroid Build Coastguard Worker		if !compareUnorderedStringArrays(expectedNotices, notices) {
670*333d2b36SAndroid Build Coastguard Worker			t.Errorf("effective notice files mismatch for module %q: expected %q, found %q", moduleName, expectedNotices, notices)
671*333d2b36SAndroid Build Coastguard Worker		}
672*333d2b36SAndroid Build Coastguard Worker	}
673*333d2b36SAndroid Build Coastguard Worker}
674*333d2b36SAndroid Build Coastguard Worker
675*333d2b36SAndroid Build Coastguard Workerfunc checkEffectiveKinds(t *testing.T, result *TestResult, effectiveKinds map[string][]string) {
676*333d2b36SAndroid Build Coastguard Worker	actualKinds := make(map[string][]string)
677*333d2b36SAndroid Build Coastguard Worker	result.Context.Context.VisitAllModules(func(m blueprint.Module) {
678*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*licenseModule); ok {
679*333d2b36SAndroid Build Coastguard Worker			return
680*333d2b36SAndroid Build Coastguard Worker		}
681*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*licenseKindModule); ok {
682*333d2b36SAndroid Build Coastguard Worker			return
683*333d2b36SAndroid Build Coastguard Worker		}
684*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*packageModule); ok {
685*333d2b36SAndroid Build Coastguard Worker			return
686*333d2b36SAndroid Build Coastguard Worker		}
687*333d2b36SAndroid Build Coastguard Worker		module, ok := m.(Module)
688*333d2b36SAndroid Build Coastguard Worker		if !ok {
689*333d2b36SAndroid Build Coastguard Worker			t.Errorf("%q not a module", m.Name())
690*333d2b36SAndroid Build Coastguard Worker			return
691*333d2b36SAndroid Build Coastguard Worker		}
692*333d2b36SAndroid Build Coastguard Worker		base := module.base()
693*333d2b36SAndroid Build Coastguard Worker		if base == nil {
694*333d2b36SAndroid Build Coastguard Worker			return
695*333d2b36SAndroid Build Coastguard Worker		}
696*333d2b36SAndroid Build Coastguard Worker		actualKinds[m.Name()] = base.commonProperties.Effective_license_kinds
697*333d2b36SAndroid Build Coastguard Worker	})
698*333d2b36SAndroid Build Coastguard Worker
699*333d2b36SAndroid Build Coastguard Worker	for moduleName, expectedKinds := range effectiveKinds {
700*333d2b36SAndroid Build Coastguard Worker		kinds, ok := actualKinds[moduleName]
701*333d2b36SAndroid Build Coastguard Worker		if !ok {
702*333d2b36SAndroid Build Coastguard Worker			kinds = []string{}
703*333d2b36SAndroid Build Coastguard Worker		}
704*333d2b36SAndroid Build Coastguard Worker		if !compareUnorderedStringArrays(expectedKinds, kinds) {
705*333d2b36SAndroid Build Coastguard Worker			t.Errorf("effective license kinds mismatch for module %q: expected %q, found %q", moduleName, expectedKinds, kinds)
706*333d2b36SAndroid Build Coastguard Worker		}
707*333d2b36SAndroid Build Coastguard Worker	}
708*333d2b36SAndroid Build Coastguard Worker}
709*333d2b36SAndroid Build Coastguard Worker
710*333d2b36SAndroid Build Coastguard Workerfunc checkEffectiveConditions(t *testing.T, result *TestResult, effectiveConditions map[string][]string) {
711*333d2b36SAndroid Build Coastguard Worker	actualConditions := make(map[string][]string)
712*333d2b36SAndroid Build Coastguard Worker	result.Context.Context.VisitAllModules(func(m blueprint.Module) {
713*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*licenseModule); ok {
714*333d2b36SAndroid Build Coastguard Worker			return
715*333d2b36SAndroid Build Coastguard Worker		}
716*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*licenseKindModule); ok {
717*333d2b36SAndroid Build Coastguard Worker			return
718*333d2b36SAndroid Build Coastguard Worker		}
719*333d2b36SAndroid Build Coastguard Worker		if _, ok := m.(*packageModule); ok {
720*333d2b36SAndroid Build Coastguard Worker			return
721*333d2b36SAndroid Build Coastguard Worker		}
722*333d2b36SAndroid Build Coastguard Worker		module, ok := m.(Module)
723*333d2b36SAndroid Build Coastguard Worker		if !ok {
724*333d2b36SAndroid Build Coastguard Worker			t.Errorf("%q not a module", m.Name())
725*333d2b36SAndroid Build Coastguard Worker			return
726*333d2b36SAndroid Build Coastguard Worker		}
727*333d2b36SAndroid Build Coastguard Worker		base := module.base()
728*333d2b36SAndroid Build Coastguard Worker		if base == nil {
729*333d2b36SAndroid Build Coastguard Worker			return
730*333d2b36SAndroid Build Coastguard Worker		}
731*333d2b36SAndroid Build Coastguard Worker		actualConditions[m.Name()] = base.commonProperties.Effective_license_conditions
732*333d2b36SAndroid Build Coastguard Worker	})
733*333d2b36SAndroid Build Coastguard Worker
734*333d2b36SAndroid Build Coastguard Worker	for moduleName, expectedConditions := range effectiveConditions {
735*333d2b36SAndroid Build Coastguard Worker		conditions, ok := actualConditions[moduleName]
736*333d2b36SAndroid Build Coastguard Worker		if !ok {
737*333d2b36SAndroid Build Coastguard Worker			conditions = []string{}
738*333d2b36SAndroid Build Coastguard Worker		}
739*333d2b36SAndroid Build Coastguard Worker		if !compareUnorderedStringArrays(expectedConditions, conditions) {
740*333d2b36SAndroid Build Coastguard Worker			t.Errorf("effective license conditions mismatch for module %q: expected %q, found %q", moduleName, expectedConditions, conditions)
741*333d2b36SAndroid Build Coastguard Worker		}
742*333d2b36SAndroid Build Coastguard Worker	}
743*333d2b36SAndroid Build Coastguard Worker}
744*333d2b36SAndroid Build Coastguard Worker
745*333d2b36SAndroid Build Coastguard Workerfunc compareUnorderedStringArrays(expected, actual []string) bool {
746*333d2b36SAndroid Build Coastguard Worker	if len(expected) != len(actual) {
747*333d2b36SAndroid Build Coastguard Worker		return false
748*333d2b36SAndroid Build Coastguard Worker	}
749*333d2b36SAndroid Build Coastguard Worker	s := make(map[string]int)
750*333d2b36SAndroid Build Coastguard Worker	for _, v := range expected {
751*333d2b36SAndroid Build Coastguard Worker		s[v] += 1
752*333d2b36SAndroid Build Coastguard Worker	}
753*333d2b36SAndroid Build Coastguard Worker	for _, v := range actual {
754*333d2b36SAndroid Build Coastguard Worker		c, ok := s[v]
755*333d2b36SAndroid Build Coastguard Worker		if !ok {
756*333d2b36SAndroid Build Coastguard Worker			return false
757*333d2b36SAndroid Build Coastguard Worker		}
758*333d2b36SAndroid Build Coastguard Worker		if c < 1 {
759*333d2b36SAndroid Build Coastguard Worker			return false
760*333d2b36SAndroid Build Coastguard Worker		}
761*333d2b36SAndroid Build Coastguard Worker		s[v] -= 1
762*333d2b36SAndroid Build Coastguard Worker	}
763*333d2b36SAndroid Build Coastguard Worker	return true
764*333d2b36SAndroid Build Coastguard Worker}
765*333d2b36SAndroid Build Coastguard Worker
766*333d2b36SAndroid Build Coastguard Workertype mockLicensesBadProperties struct {
767*333d2b36SAndroid Build Coastguard Worker	Visibility []string
768*333d2b36SAndroid Build Coastguard Worker}
769*333d2b36SAndroid Build Coastguard Worker
770*333d2b36SAndroid Build Coastguard Workertype mockLicensesBadModule struct {
771*333d2b36SAndroid Build Coastguard Worker	ModuleBase
772*333d2b36SAndroid Build Coastguard Worker	DefaultableModuleBase
773*333d2b36SAndroid Build Coastguard Worker	properties mockLicensesBadProperties
774*333d2b36SAndroid Build Coastguard Worker}
775*333d2b36SAndroid Build Coastguard Worker
776*333d2b36SAndroid Build Coastguard Workerfunc newMockLicensesBadModule() Module {
777*333d2b36SAndroid Build Coastguard Worker	m := &mockLicensesBadModule{}
778*333d2b36SAndroid Build Coastguard Worker
779*333d2b36SAndroid Build Coastguard Worker	base := m.base()
780*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&base.nameProperties, &m.properties)
781*333d2b36SAndroid Build Coastguard Worker
782*333d2b36SAndroid Build Coastguard Worker	// The default_visibility property needs to be checked and parsed by the visibility module during
783*333d2b36SAndroid Build Coastguard Worker	// its checking and parsing phases so make it the primary visibility property.
784*333d2b36SAndroid Build Coastguard Worker	setPrimaryVisibilityProperty(m, "visibility", &m.properties.Visibility)
785*333d2b36SAndroid Build Coastguard Worker
786*333d2b36SAndroid Build Coastguard Worker	initAndroidModuleBase(m)
787*333d2b36SAndroid Build Coastguard Worker	InitDefaultableModule(m)
788*333d2b36SAndroid Build Coastguard Worker
789*333d2b36SAndroid Build Coastguard Worker	return m
790*333d2b36SAndroid Build Coastguard Worker}
791*333d2b36SAndroid Build Coastguard Worker
792*333d2b36SAndroid Build Coastguard Workerfunc (m *mockLicensesBadModule) GenerateAndroidBuildActions(ModuleContext) {
793*333d2b36SAndroid Build Coastguard Worker}
794*333d2b36SAndroid Build Coastguard Worker
795*333d2b36SAndroid Build Coastguard Workertype mockLicensesLibraryProperties struct {
796*333d2b36SAndroid Build Coastguard Worker	Deps []string
797*333d2b36SAndroid Build Coastguard Worker}
798*333d2b36SAndroid Build Coastguard Worker
799*333d2b36SAndroid Build Coastguard Workertype mockLicensesLibraryModule struct {
800*333d2b36SAndroid Build Coastguard Worker	ModuleBase
801*333d2b36SAndroid Build Coastguard Worker	DefaultableModuleBase
802*333d2b36SAndroid Build Coastguard Worker	properties mockLicensesLibraryProperties
803*333d2b36SAndroid Build Coastguard Worker}
804*333d2b36SAndroid Build Coastguard Worker
805*333d2b36SAndroid Build Coastguard Workerfunc newMockLicensesLibraryModule() Module {
806*333d2b36SAndroid Build Coastguard Worker	m := &mockLicensesLibraryModule{}
807*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
808*333d2b36SAndroid Build Coastguard Worker	InitAndroidArchModule(m, HostAndDeviceSupported, MultilibCommon)
809*333d2b36SAndroid Build Coastguard Worker	InitDefaultableModule(m)
810*333d2b36SAndroid Build Coastguard Worker	return m
811*333d2b36SAndroid Build Coastguard Worker}
812*333d2b36SAndroid Build Coastguard Worker
813*333d2b36SAndroid Build Coastguard Workertype dependencyLicensesTag struct {
814*333d2b36SAndroid Build Coastguard Worker	blueprint.BaseDependencyTag
815*333d2b36SAndroid Build Coastguard Worker	name string
816*333d2b36SAndroid Build Coastguard Worker}
817*333d2b36SAndroid Build Coastguard Worker
818*333d2b36SAndroid Build Coastguard Workerfunc (j *mockLicensesLibraryModule) DepsMutator(ctx BottomUpMutatorContext) {
819*333d2b36SAndroid Build Coastguard Worker	ctx.AddVariationDependencies(nil, dependencyLicensesTag{name: "mockdeps"}, j.properties.Deps...)
820*333d2b36SAndroid Build Coastguard Worker}
821*333d2b36SAndroid Build Coastguard Worker
822*333d2b36SAndroid Build Coastguard Workerfunc (p *mockLicensesLibraryModule) GenerateAndroidBuildActions(ModuleContext) {
823*333d2b36SAndroid Build Coastguard Worker}
824*333d2b36SAndroid Build Coastguard Worker
825*333d2b36SAndroid Build Coastguard Workertype mockLicensesDefaults struct {
826*333d2b36SAndroid Build Coastguard Worker	ModuleBase
827*333d2b36SAndroid Build Coastguard Worker	DefaultsModuleBase
828*333d2b36SAndroid Build Coastguard Worker}
829*333d2b36SAndroid Build Coastguard Worker
830*333d2b36SAndroid Build Coastguard Workerfunc defaultsLicensesFactory() Module {
831*333d2b36SAndroid Build Coastguard Worker	m := &mockLicensesDefaults{}
832*333d2b36SAndroid Build Coastguard Worker	InitDefaultsModule(m)
833*333d2b36SAndroid Build Coastguard Worker	return m
834*333d2b36SAndroid Build Coastguard Worker}
835