xref: /aosp_15_r20/build/soong/android/license_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
7*333d2b36SAndroid Build Coastguard Worker// Common test set up for license tests.
8*333d2b36SAndroid Build Coastguard Workervar prepareForLicenseTest = GroupFixturePreparers(
9*333d2b36SAndroid Build Coastguard Worker	// General preparers in alphabetical order.
10*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithDefaults,
11*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithLicenses,
12*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithOverrides,
13*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithPackageModule,
14*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithPrebuilts,
15*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithVisibility,
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Worker	// Additional test specific stuff
18*333d2b36SAndroid Build Coastguard Worker	prepareForTestWithFakePrebuiltModules,
19*333d2b36SAndroid Build Coastguard Worker	FixtureMergeEnv(map[string]string{"ANDROID_REQUIRE_LICENSES": "1"}),
20*333d2b36SAndroid Build Coastguard Worker)
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Workervar licenseTests = []struct {
23*333d2b36SAndroid Build Coastguard Worker	name           string
24*333d2b36SAndroid Build Coastguard Worker	fs             MockFS
25*333d2b36SAndroid Build Coastguard Worker	expectedErrors []string
26*333d2b36SAndroid Build Coastguard Worker}{
27*333d2b36SAndroid Build Coastguard Worker	{
28*333d2b36SAndroid Build Coastguard Worker		name: "license must not accept licenses property",
29*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
30*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
31*333d2b36SAndroid Build Coastguard Worker				license {
32*333d2b36SAndroid Build Coastguard Worker					name: "top_license",
33*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
34*333d2b36SAndroid Build Coastguard Worker					licenses: ["other_license"],
35*333d2b36SAndroid Build Coastguard Worker				}`),
36*333d2b36SAndroid Build Coastguard Worker		},
37*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
38*333d2b36SAndroid Build Coastguard Worker			`top/Android.bp:5:14: unrecognized property "licenses"`,
39*333d2b36SAndroid Build Coastguard Worker		},
40*333d2b36SAndroid Build Coastguard Worker	},
41*333d2b36SAndroid Build Coastguard Worker	{
42*333d2b36SAndroid Build Coastguard Worker		name: "private license",
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: "top_notice",
47*333d2b36SAndroid Build Coastguard Worker					conditions: ["notice"],
48*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
49*333d2b36SAndroid Build Coastguard Worker				}
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Worker				license {
52*333d2b36SAndroid Build Coastguard Worker					name: "top_allowed_as_notice",
53*333d2b36SAndroid Build Coastguard Worker					license_kinds: ["top_notice"],
54*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
55*333d2b36SAndroid Build Coastguard Worker				}`),
56*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
57*333d2b36SAndroid Build Coastguard Worker				rule {
58*333d2b36SAndroid Build Coastguard Worker					name: "arule",
59*333d2b36SAndroid Build Coastguard Worker					licenses: ["top_allowed_as_notice"],
60*333d2b36SAndroid Build Coastguard Worker				}`),
61*333d2b36SAndroid Build Coastguard Worker			"yetmore/Android.bp": []byte(`
62*333d2b36SAndroid Build Coastguard Worker				package {
63*333d2b36SAndroid Build Coastguard Worker					default_applicable_licenses: ["top_allowed_as_notice"],
64*333d2b36SAndroid Build Coastguard Worker				}`),
65*333d2b36SAndroid Build Coastguard Worker		},
66*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
67*333d2b36SAndroid Build Coastguard Worker			`other/Android.bp:2:5: module "arule": depends on //top:top_allowed_as_notice ` +
68*333d2b36SAndroid Build Coastguard Worker				`which is not visible to this module`,
69*333d2b36SAndroid Build Coastguard Worker			`yetmore/Android.bp:2:5: module "//yetmore": depends on //top:top_allowed_as_notice ` +
70*333d2b36SAndroid Build Coastguard Worker				`which is not visible to this module`,
71*333d2b36SAndroid Build Coastguard Worker		},
72*333d2b36SAndroid Build Coastguard Worker	},
73*333d2b36SAndroid Build Coastguard Worker	{
74*333d2b36SAndroid Build Coastguard Worker		name: "must reference license_kind module",
75*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
76*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
77*333d2b36SAndroid Build Coastguard Worker				rule {
78*333d2b36SAndroid Build Coastguard Worker					name: "top_by_exception_only",
79*333d2b36SAndroid Build Coastguard Worker				}
80*333d2b36SAndroid Build Coastguard Worker
81*333d2b36SAndroid Build Coastguard Worker				license {
82*333d2b36SAndroid Build Coastguard Worker					name: "top_proprietary",
83*333d2b36SAndroid Build Coastguard Worker					license_kinds: ["top_by_exception_only"],
84*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
85*333d2b36SAndroid Build Coastguard Worker				}`),
86*333d2b36SAndroid Build Coastguard Worker		},
87*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
88*333d2b36SAndroid Build Coastguard Worker			`top/Android.bp:6:5: module "top_proprietary": license_kinds property ` +
89*333d2b36SAndroid Build Coastguard Worker				`"top_by_exception_only" is not a license_kind module`,
90*333d2b36SAndroid Build Coastguard Worker		},
91*333d2b36SAndroid Build Coastguard Worker	},
92*333d2b36SAndroid Build Coastguard Worker	{
93*333d2b36SAndroid Build Coastguard Worker		name: "must not duplicate license_kind",
94*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
95*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
96*333d2b36SAndroid Build Coastguard Worker				license_kind {
97*333d2b36SAndroid Build Coastguard Worker					name: "top_by_exception_only",
98*333d2b36SAndroid Build Coastguard Worker					conditions: ["by_exception_only"],
99*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
100*333d2b36SAndroid Build Coastguard Worker				}
101*333d2b36SAndroid Build Coastguard Worker
102*333d2b36SAndroid Build Coastguard Worker				license_kind {
103*333d2b36SAndroid Build Coastguard Worker					name: "top_by_exception_only_2",
104*333d2b36SAndroid Build Coastguard Worker					conditions: ["by_exception_only"],
105*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
106*333d2b36SAndroid Build Coastguard Worker				}
107*333d2b36SAndroid Build Coastguard Worker
108*333d2b36SAndroid Build Coastguard Worker				license {
109*333d2b36SAndroid Build Coastguard Worker					name: "top_proprietary",
110*333d2b36SAndroid Build Coastguard Worker					license_kinds: [
111*333d2b36SAndroid Build Coastguard Worker						"top_by_exception_only",
112*333d2b36SAndroid Build Coastguard Worker						"top_by_exception_only_2",
113*333d2b36SAndroid Build Coastguard Worker						"top_by_exception_only"
114*333d2b36SAndroid Build Coastguard Worker					],
115*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
116*333d2b36SAndroid Build Coastguard Worker				}`),
117*333d2b36SAndroid Build Coastguard Worker		},
118*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
119*333d2b36SAndroid Build Coastguard Worker			`top/Android.bp:14:5: module "top_proprietary": Duplicated license kind: "top_by_exception_only"`,
120*333d2b36SAndroid Build Coastguard Worker		},
121*333d2b36SAndroid Build Coastguard Worker	},
122*333d2b36SAndroid Build Coastguard Worker	{
123*333d2b36SAndroid Build Coastguard Worker		name: "license_kind module must exist",
124*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
125*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
126*333d2b36SAndroid Build Coastguard Worker				license {
127*333d2b36SAndroid Build Coastguard Worker					name: "top_notice_allowed",
128*333d2b36SAndroid Build Coastguard Worker					license_kinds: ["top_notice"],
129*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
130*333d2b36SAndroid Build Coastguard Worker				}`),
131*333d2b36SAndroid Build Coastguard Worker		},
132*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
133*333d2b36SAndroid Build Coastguard Worker			`top/Android.bp:2:5: "top_notice_allowed" depends on undefined module "top_notice"`,
134*333d2b36SAndroid Build Coastguard Worker		},
135*333d2b36SAndroid Build Coastguard Worker	},
136*333d2b36SAndroid Build Coastguard Worker	{
137*333d2b36SAndroid Build Coastguard Worker		name: "public license",
138*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
139*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
140*333d2b36SAndroid Build Coastguard Worker				license_kind {
141*333d2b36SAndroid Build Coastguard Worker					name: "top_by_exception_only",
142*333d2b36SAndroid Build Coastguard Worker					conditions: ["by_exception_only"],
143*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
144*333d2b36SAndroid Build Coastguard Worker				}
145*333d2b36SAndroid Build Coastguard Worker
146*333d2b36SAndroid Build Coastguard Worker				license {
147*333d2b36SAndroid Build Coastguard Worker					name: "top_proprietary",
148*333d2b36SAndroid Build Coastguard Worker					license_kinds: ["top_by_exception_only"],
149*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
150*333d2b36SAndroid Build Coastguard Worker				}`),
151*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
152*333d2b36SAndroid Build Coastguard Worker				rule {
153*333d2b36SAndroid Build Coastguard Worker					name: "arule",
154*333d2b36SAndroid Build Coastguard Worker					licenses: ["top_proprietary"],
155*333d2b36SAndroid Build Coastguard Worker				}`),
156*333d2b36SAndroid Build Coastguard Worker			"yetmore/Android.bp": []byte(`
157*333d2b36SAndroid Build Coastguard Worker				package {
158*333d2b36SAndroid Build Coastguard Worker					default_applicable_licenses: ["top_proprietary"],
159*333d2b36SAndroid Build Coastguard Worker				}`),
160*333d2b36SAndroid Build Coastguard Worker		},
161*333d2b36SAndroid Build Coastguard Worker	},
162*333d2b36SAndroid Build Coastguard Worker	{
163*333d2b36SAndroid Build Coastguard Worker		name: "multiple licenses",
164*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
165*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
166*333d2b36SAndroid Build Coastguard Worker				package {
167*333d2b36SAndroid Build Coastguard Worker					default_applicable_licenses: ["top_proprietary"],
168*333d2b36SAndroid Build Coastguard Worker				}
169*333d2b36SAndroid Build Coastguard Worker
170*333d2b36SAndroid Build Coastguard Worker				license_kind {
171*333d2b36SAndroid Build Coastguard Worker					name: "top_notice",
172*333d2b36SAndroid Build Coastguard Worker					conditions: ["notice"],
173*333d2b36SAndroid Build Coastguard Worker				}
174*333d2b36SAndroid Build Coastguard Worker
175*333d2b36SAndroid Build Coastguard Worker				license_kind {
176*333d2b36SAndroid Build Coastguard Worker					name: "top_by_exception_only",
177*333d2b36SAndroid Build Coastguard Worker					conditions: ["by_exception_only"],
178*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
179*333d2b36SAndroid Build Coastguard Worker				}
180*333d2b36SAndroid Build Coastguard Worker
181*333d2b36SAndroid Build Coastguard Worker				license {
182*333d2b36SAndroid Build Coastguard Worker					name: "top_allowed_as_notice",
183*333d2b36SAndroid Build Coastguard Worker					license_kinds: ["top_notice"],
184*333d2b36SAndroid Build Coastguard Worker				}
185*333d2b36SAndroid Build Coastguard Worker
186*333d2b36SAndroid Build Coastguard Worker				license {
187*333d2b36SAndroid Build Coastguard Worker					name: "top_proprietary",
188*333d2b36SAndroid Build Coastguard Worker					license_kinds: ["top_by_exception_only"],
189*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
190*333d2b36SAndroid Build Coastguard Worker				}
191*333d2b36SAndroid Build Coastguard Worker				rule {
192*333d2b36SAndroid Build Coastguard Worker					name: "myrule",
193*333d2b36SAndroid Build Coastguard Worker					licenses: ["top_allowed_as_notice", "top_proprietary"]
194*333d2b36SAndroid Build Coastguard Worker				}`),
195*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
196*333d2b36SAndroid Build Coastguard Worker				rule {
197*333d2b36SAndroid Build Coastguard Worker					name: "arule",
198*333d2b36SAndroid Build Coastguard Worker					licenses: ["top_proprietary"],
199*333d2b36SAndroid Build Coastguard Worker				}`),
200*333d2b36SAndroid Build Coastguard Worker			"yetmore/Android.bp": []byte(`
201*333d2b36SAndroid Build Coastguard Worker				package {
202*333d2b36SAndroid Build Coastguard Worker					default_applicable_licenses: ["top_proprietary"],
203*333d2b36SAndroid Build Coastguard Worker				}`),
204*333d2b36SAndroid Build Coastguard Worker		},
205*333d2b36SAndroid Build Coastguard Worker	},
206*333d2b36SAndroid Build Coastguard Worker}
207*333d2b36SAndroid Build Coastguard Worker
208*333d2b36SAndroid Build Coastguard Workerfunc TestLicense(t *testing.T) {
209*333d2b36SAndroid Build Coastguard Worker	for _, test := range licenseTests {
210*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
211*333d2b36SAndroid Build Coastguard Worker			// Customize the common license text fixture factory.
212*333d2b36SAndroid Build Coastguard Worker			GroupFixturePreparers(
213*333d2b36SAndroid Build Coastguard Worker				prepareForLicenseTest,
214*333d2b36SAndroid Build Coastguard Worker				FixtureRegisterWithContext(func(ctx RegistrationContext) {
215*333d2b36SAndroid Build Coastguard Worker					ctx.RegisterModuleType("rule", newMockRuleModule)
216*333d2b36SAndroid Build Coastguard Worker				}),
217*333d2b36SAndroid Build Coastguard Worker				test.fs.AddToFixture(),
218*333d2b36SAndroid Build Coastguard Worker			).
219*333d2b36SAndroid Build Coastguard Worker				ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern(test.expectedErrors)).
220*333d2b36SAndroid Build Coastguard Worker				RunTest(t)
221*333d2b36SAndroid Build Coastguard Worker		})
222*333d2b36SAndroid Build Coastguard Worker	}
223*333d2b36SAndroid Build Coastguard Worker}
224*333d2b36SAndroid Build Coastguard Worker
225*333d2b36SAndroid Build Coastguard Workerfunc testLicense(t *testing.T, fs MockFS, expectedErrors []string) {
226*333d2b36SAndroid Build Coastguard Worker}
227*333d2b36SAndroid Build Coastguard Worker
228*333d2b36SAndroid Build Coastguard Workertype mockRuleModule struct {
229*333d2b36SAndroid Build Coastguard Worker	ModuleBase
230*333d2b36SAndroid Build Coastguard Worker	DefaultableModuleBase
231*333d2b36SAndroid Build Coastguard Worker}
232*333d2b36SAndroid Build Coastguard Worker
233*333d2b36SAndroid Build Coastguard Workerfunc newMockRuleModule() Module {
234*333d2b36SAndroid Build Coastguard Worker	m := &mockRuleModule{}
235*333d2b36SAndroid Build Coastguard Worker	InitAndroidModule(m)
236*333d2b36SAndroid Build Coastguard Worker	InitDefaultableModule(m)
237*333d2b36SAndroid Build Coastguard Worker	return m
238*333d2b36SAndroid Build Coastguard Worker}
239*333d2b36SAndroid Build Coastguard Worker
240*333d2b36SAndroid Build Coastguard Workerfunc (p *mockRuleModule) GenerateAndroidBuildActions(ModuleContext) {
241*333d2b36SAndroid Build Coastguard Worker}
242