xref: /aosp_15_r20/build/soong/android/neverallow_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage android
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"regexp"
19*333d2b36SAndroid Build Coastguard Worker	"testing"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
22*333d2b36SAndroid Build Coastguard Worker)
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Workervar neverallowTests = []struct {
25*333d2b36SAndroid Build Coastguard Worker	// The name of the test.
26*333d2b36SAndroid Build Coastguard Worker	name string
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Worker	// Optional test specific rules. If specified then they are used instead of the default rules.
29*333d2b36SAndroid Build Coastguard Worker	rules []Rule
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Worker	// Additional contents to add to the virtual filesystem used by the tests.
32*333d2b36SAndroid Build Coastguard Worker	fs MockFS
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Worker	// The expected error patterns. If empty then no errors are expected, otherwise each error
35*333d2b36SAndroid Build Coastguard Worker	// reported must be matched by at least one of these patterns. A pattern matches if the error
36*333d2b36SAndroid Build Coastguard Worker	// message contains the pattern. A pattern does not have to match the whole error message.
37*333d2b36SAndroid Build Coastguard Worker	expectedErrors []string
38*333d2b36SAndroid Build Coastguard Worker}{
39*333d2b36SAndroid Build Coastguard Worker	// Test General Functionality
40*333d2b36SAndroid Build Coastguard Worker
41*333d2b36SAndroid Build Coastguard Worker	// in direct deps tests
42*333d2b36SAndroid Build Coastguard Worker	{
43*333d2b36SAndroid Build Coastguard Worker		name: "not_allowed_in_direct_deps",
44*333d2b36SAndroid Build Coastguard Worker		rules: []Rule{
45*333d2b36SAndroid Build Coastguard Worker			NeverAllow().InDirectDeps("not_allowed_in_direct_deps"),
46*333d2b36SAndroid Build Coastguard Worker		},
47*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
48*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
49*333d2b36SAndroid Build Coastguard Worker				cc_library {
50*333d2b36SAndroid Build Coastguard Worker					name: "not_allowed_in_direct_deps",
51*333d2b36SAndroid Build Coastguard Worker				}`),
52*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
53*333d2b36SAndroid Build Coastguard Worker				cc_library {
54*333d2b36SAndroid Build Coastguard Worker					name: "libother",
55*333d2b36SAndroid Build Coastguard Worker					static_libs: ["not_allowed_in_direct_deps"],
56*333d2b36SAndroid Build Coastguard Worker				}`),
57*333d2b36SAndroid Build Coastguard Worker		},
58*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
59*333d2b36SAndroid Build Coastguard Worker			regexp.QuoteMeta("module \"libother\": violates neverallow requirements. Not allowed:\n\tdep(s): [\"not_allowed_in_direct_deps\"]"),
60*333d2b36SAndroid Build Coastguard Worker		},
61*333d2b36SAndroid Build Coastguard Worker	},
62*333d2b36SAndroid Build Coastguard Worker	{
63*333d2b36SAndroid Build Coastguard Worker		name: "multiple constraints",
64*333d2b36SAndroid Build Coastguard Worker		rules: []Rule{
65*333d2b36SAndroid Build Coastguard Worker			NeverAllow().
66*333d2b36SAndroid Build Coastguard Worker				InDirectDeps("not_allowed_in_direct_deps").
67*333d2b36SAndroid Build Coastguard Worker				In("other").
68*333d2b36SAndroid Build Coastguard Worker				ModuleType("cc_library").
69*333d2b36SAndroid Build Coastguard Worker				NotIn("top").
70*333d2b36SAndroid Build Coastguard Worker				NotModuleType("cc_binary"),
71*333d2b36SAndroid Build Coastguard Worker		},
72*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
73*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
74*333d2b36SAndroid Build Coastguard Worker				cc_library {
75*333d2b36SAndroid Build Coastguard Worker					name: "not_allowed_in_direct_deps",
76*333d2b36SAndroid Build Coastguard Worker				}`),
77*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
78*333d2b36SAndroid Build Coastguard Worker				cc_library {
79*333d2b36SAndroid Build Coastguard Worker					name: "libother",
80*333d2b36SAndroid Build Coastguard Worker					static_libs: ["not_allowed_in_direct_deps"],
81*333d2b36SAndroid Build Coastguard Worker				}`),
82*333d2b36SAndroid Build Coastguard Worker		},
83*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
84*333d2b36SAndroid Build Coastguard Worker			regexp.QuoteMeta(`module "libother": violates neverallow requirements. Not allowed:
85*333d2b36SAndroid Build Coastguard Worker	in dirs: ["other/"]
86*333d2b36SAndroid Build Coastguard Worker	module types: ["cc_library"]
87*333d2b36SAndroid Build Coastguard Worker	dep(s): ["not_allowed_in_direct_deps"]
88*333d2b36SAndroid Build Coastguard Worker	EXCEPT in dirs: ["top/"]
89*333d2b36SAndroid Build Coastguard Worker	EXCEPT module types: ["cc_binary"]`),
90*333d2b36SAndroid Build Coastguard Worker		},
91*333d2b36SAndroid Build Coastguard Worker	},
92*333d2b36SAndroid Build Coastguard Worker
93*333d2b36SAndroid Build Coastguard Worker	// Test android specific rules
94*333d2b36SAndroid Build Coastguard Worker
95*333d2b36SAndroid Build Coastguard Worker	// include_dir rule tests
96*333d2b36SAndroid Build Coastguard Worker	{
97*333d2b36SAndroid Build Coastguard Worker		name: "include_dir not allowed to reference art",
98*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
99*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
100*333d2b36SAndroid Build Coastguard Worker				cc_library {
101*333d2b36SAndroid Build Coastguard Worker					name: "libother",
102*333d2b36SAndroid Build Coastguard Worker					include_dirs: ["art/libdexfile/include"],
103*333d2b36SAndroid Build Coastguard Worker				}`),
104*333d2b36SAndroid Build Coastguard Worker		},
105*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
106*333d2b36SAndroid Build Coastguard Worker			"all usages of 'art' have been migrated",
107*333d2b36SAndroid Build Coastguard Worker		},
108*333d2b36SAndroid Build Coastguard Worker	},
109*333d2b36SAndroid Build Coastguard Worker	{
110*333d2b36SAndroid Build Coastguard Worker		name: "include_dir not allowed to reference art",
111*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
112*333d2b36SAndroid Build Coastguard Worker			"system/libfmq/Android.bp": []byte(`
113*333d2b36SAndroid Build Coastguard Worker				cc_library {
114*333d2b36SAndroid Build Coastguard Worker					name: "libother",
115*333d2b36SAndroid Build Coastguard Worker					include_dirs: ["any/random/file"],
116*333d2b36SAndroid Build Coastguard Worker				}`),
117*333d2b36SAndroid Build Coastguard Worker		},
118*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
119*333d2b36SAndroid Build Coastguard Worker			"all usages of them in 'system/libfmq' have been migrated",
120*333d2b36SAndroid Build Coastguard Worker		},
121*333d2b36SAndroid Build Coastguard Worker	},
122*333d2b36SAndroid Build Coastguard Worker	{
123*333d2b36SAndroid Build Coastguard Worker		name: "include_dir can work",
124*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
125*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
126*333d2b36SAndroid Build Coastguard Worker				cc_library {
127*333d2b36SAndroid Build Coastguard Worker					name: "libother",
128*333d2b36SAndroid Build Coastguard Worker					include_dirs: ["another/include"],
129*333d2b36SAndroid Build Coastguard Worker				}`),
130*333d2b36SAndroid Build Coastguard Worker		},
131*333d2b36SAndroid Build Coastguard Worker	},
132*333d2b36SAndroid Build Coastguard Worker	// Treble rule tests
133*333d2b36SAndroid Build Coastguard Worker	{
134*333d2b36SAndroid Build Coastguard Worker		name: "no vndk.enabled under vendor directory",
135*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
136*333d2b36SAndroid Build Coastguard Worker			"vendor/Android.bp": []byte(`
137*333d2b36SAndroid Build Coastguard Worker				cc_library {
138*333d2b36SAndroid Build Coastguard Worker					name: "libvndk",
139*333d2b36SAndroid Build Coastguard Worker					vendor_available: true,
140*333d2b36SAndroid Build Coastguard Worker					vndk: {
141*333d2b36SAndroid Build Coastguard Worker						enabled: true,
142*333d2b36SAndroid Build Coastguard Worker					},
143*333d2b36SAndroid Build Coastguard Worker				}`),
144*333d2b36SAndroid Build Coastguard Worker		},
145*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
146*333d2b36SAndroid Build Coastguard Worker			"VNDK can never contain a library that is device dependent",
147*333d2b36SAndroid Build Coastguard Worker		},
148*333d2b36SAndroid Build Coastguard Worker	},
149*333d2b36SAndroid Build Coastguard Worker	{
150*333d2b36SAndroid Build Coastguard Worker		name: "no vndk.enabled under device directory",
151*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
152*333d2b36SAndroid Build Coastguard Worker			"device/Android.bp": []byte(`
153*333d2b36SAndroid Build Coastguard Worker				cc_library {
154*333d2b36SAndroid Build Coastguard Worker					name: "libvndk",
155*333d2b36SAndroid Build Coastguard Worker					vendor_available: true,
156*333d2b36SAndroid Build Coastguard Worker					vndk: {
157*333d2b36SAndroid Build Coastguard Worker						enabled: true,
158*333d2b36SAndroid Build Coastguard Worker					},
159*333d2b36SAndroid Build Coastguard Worker				}`),
160*333d2b36SAndroid Build Coastguard Worker		},
161*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
162*333d2b36SAndroid Build Coastguard Worker			"VNDK can never contain a library that is device dependent",
163*333d2b36SAndroid Build Coastguard Worker		},
164*333d2b36SAndroid Build Coastguard Worker	},
165*333d2b36SAndroid Build Coastguard Worker	{
166*333d2b36SAndroid Build Coastguard Worker		name: "vndk-ext under vendor or device directory",
167*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
168*333d2b36SAndroid Build Coastguard Worker			"device/Android.bp": []byte(`
169*333d2b36SAndroid Build Coastguard Worker				cc_library {
170*333d2b36SAndroid Build Coastguard Worker					name: "libvndk1_ext",
171*333d2b36SAndroid Build Coastguard Worker					vendor: true,
172*333d2b36SAndroid Build Coastguard Worker					vndk: {
173*333d2b36SAndroid Build Coastguard Worker						enabled: true,
174*333d2b36SAndroid Build Coastguard Worker					},
175*333d2b36SAndroid Build Coastguard Worker				}`),
176*333d2b36SAndroid Build Coastguard Worker			"vendor/Android.bp": []byte(`
177*333d2b36SAndroid Build Coastguard Worker				cc_library {
178*333d2b36SAndroid Build Coastguard Worker					name: "libvndk2_ext",
179*333d2b36SAndroid Build Coastguard Worker					vendor: true,
180*333d2b36SAndroid Build Coastguard Worker					vndk: {
181*333d2b36SAndroid Build Coastguard Worker						enabled: true,
182*333d2b36SAndroid Build Coastguard Worker					},
183*333d2b36SAndroid Build Coastguard Worker				}`),
184*333d2b36SAndroid Build Coastguard Worker		},
185*333d2b36SAndroid Build Coastguard Worker	},
186*333d2b36SAndroid Build Coastguard Worker
187*333d2b36SAndroid Build Coastguard Worker	{
188*333d2b36SAndroid Build Coastguard Worker		name: "no enforce_vintf_manifest.cflags",
189*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
190*333d2b36SAndroid Build Coastguard Worker			"Android.bp": []byte(`
191*333d2b36SAndroid Build Coastguard Worker				cc_library {
192*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
193*333d2b36SAndroid Build Coastguard Worker					product_variables: {
194*333d2b36SAndroid Build Coastguard Worker						enforce_vintf_manifest: {
195*333d2b36SAndroid Build Coastguard Worker							cflags: ["-DSHOULD_NOT_EXIST"],
196*333d2b36SAndroid Build Coastguard Worker						},
197*333d2b36SAndroid Build Coastguard Worker					},
198*333d2b36SAndroid Build Coastguard Worker				}`),
199*333d2b36SAndroid Build Coastguard Worker		},
200*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
201*333d2b36SAndroid Build Coastguard Worker			"manifest enforcement should be independent",
202*333d2b36SAndroid Build Coastguard Worker		},
203*333d2b36SAndroid Build Coastguard Worker	},
204*333d2b36SAndroid Build Coastguard Worker
205*333d2b36SAndroid Build Coastguard Worker	{
206*333d2b36SAndroid Build Coastguard Worker		name: "no treble_linker_namespaces.cflags",
207*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
208*333d2b36SAndroid Build Coastguard Worker			"Android.bp": []byte(`
209*333d2b36SAndroid Build Coastguard Worker				cc_library {
210*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
211*333d2b36SAndroid Build Coastguard Worker					product_variables: {
212*333d2b36SAndroid Build Coastguard Worker						treble_linker_namespaces: {
213*333d2b36SAndroid Build Coastguard Worker							cflags: ["-DSHOULD_NOT_EXIST"],
214*333d2b36SAndroid Build Coastguard Worker						},
215*333d2b36SAndroid Build Coastguard Worker					},
216*333d2b36SAndroid Build Coastguard Worker				}`),
217*333d2b36SAndroid Build Coastguard Worker		},
218*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
219*333d2b36SAndroid Build Coastguard Worker			"nothing should care if linker namespaces are enabled or not",
220*333d2b36SAndroid Build Coastguard Worker		},
221*333d2b36SAndroid Build Coastguard Worker	},
222*333d2b36SAndroid Build Coastguard Worker	{
223*333d2b36SAndroid Build Coastguard Worker		name: "libc_bionic_ndk treble_linker_namespaces.cflags",
224*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
225*333d2b36SAndroid Build Coastguard Worker			"Android.bp": []byte(`
226*333d2b36SAndroid Build Coastguard Worker				cc_library {
227*333d2b36SAndroid Build Coastguard Worker					name: "libc_bionic_ndk",
228*333d2b36SAndroid Build Coastguard Worker					product_variables: {
229*333d2b36SAndroid Build Coastguard Worker						treble_linker_namespaces: {
230*333d2b36SAndroid Build Coastguard Worker							cflags: ["-DSHOULD_NOT_EXIST"],
231*333d2b36SAndroid Build Coastguard Worker						},
232*333d2b36SAndroid Build Coastguard Worker					},
233*333d2b36SAndroid Build Coastguard Worker				}`),
234*333d2b36SAndroid Build Coastguard Worker		},
235*333d2b36SAndroid Build Coastguard Worker	},
236*333d2b36SAndroid Build Coastguard Worker	{
237*333d2b36SAndroid Build Coastguard Worker		name: "java_device_for_host",
238*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
239*333d2b36SAndroid Build Coastguard Worker			"Android.bp": []byte(`
240*333d2b36SAndroid Build Coastguard Worker				java_device_for_host {
241*333d2b36SAndroid Build Coastguard Worker					name: "device_for_host",
242*333d2b36SAndroid Build Coastguard Worker					libs: ["core-libart"],
243*333d2b36SAndroid Build Coastguard Worker				}`),
244*333d2b36SAndroid Build Coastguard Worker		},
245*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
246*333d2b36SAndroid Build Coastguard Worker			"java_device_for_host can only be used in allowed projects",
247*333d2b36SAndroid Build Coastguard Worker		},
248*333d2b36SAndroid Build Coastguard Worker	},
249*333d2b36SAndroid Build Coastguard Worker	// CC sdk rule tests
250*333d2b36SAndroid Build Coastguard Worker	{
251*333d2b36SAndroid Build Coastguard Worker		name: `"sdk_variant_only" outside allowed list`,
252*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
253*333d2b36SAndroid Build Coastguard Worker			"Android.bp": []byte(`
254*333d2b36SAndroid Build Coastguard Worker				cc_library {
255*333d2b36SAndroid Build Coastguard Worker					name: "outside_allowed_list",
256*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
257*333d2b36SAndroid Build Coastguard Worker					sdk_variant_only: true,
258*333d2b36SAndroid Build Coastguard Worker				}`),
259*333d2b36SAndroid Build Coastguard Worker		},
260*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
261*333d2b36SAndroid Build Coastguard Worker			`module "outside_allowed_list": violates neverallow`,
262*333d2b36SAndroid Build Coastguard Worker		},
263*333d2b36SAndroid Build Coastguard Worker	},
264*333d2b36SAndroid Build Coastguard Worker	{
265*333d2b36SAndroid Build Coastguard Worker		name: `"sdk_variant_only: false" outside allowed list`,
266*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
267*333d2b36SAndroid Build Coastguard Worker			"Android.bp": []byte(`
268*333d2b36SAndroid Build Coastguard Worker				cc_library {
269*333d2b36SAndroid Build Coastguard Worker					name: "outside_allowed_list",
270*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
271*333d2b36SAndroid Build Coastguard Worker					sdk_variant_only: false,
272*333d2b36SAndroid Build Coastguard Worker				}`),
273*333d2b36SAndroid Build Coastguard Worker		},
274*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
275*333d2b36SAndroid Build Coastguard Worker			`module "outside_allowed_list": violates neverallow`,
276*333d2b36SAndroid Build Coastguard Worker		},
277*333d2b36SAndroid Build Coastguard Worker	},
278*333d2b36SAndroid Build Coastguard Worker	{
279*333d2b36SAndroid Build Coastguard Worker		name: `"platform" outside allowed list`,
280*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
281*333d2b36SAndroid Build Coastguard Worker			"Android.bp": []byte(`
282*333d2b36SAndroid Build Coastguard Worker				cc_library {
283*333d2b36SAndroid Build Coastguard Worker					name: "outside_allowed_list",
284*333d2b36SAndroid Build Coastguard Worker					platform: {
285*333d2b36SAndroid Build Coastguard Worker						shared_libs: ["libfoo"],
286*333d2b36SAndroid Build Coastguard Worker					},
287*333d2b36SAndroid Build Coastguard Worker				}`),
288*333d2b36SAndroid Build Coastguard Worker		},
289*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
290*333d2b36SAndroid Build Coastguard Worker			`module "outside_allowed_list": violates neverallow`,
291*333d2b36SAndroid Build Coastguard Worker		},
292*333d2b36SAndroid Build Coastguard Worker	},
293*333d2b36SAndroid Build Coastguard Worker	{
294*333d2b36SAndroid Build Coastguard Worker		name: "uncompress_dex inside art",
295*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
296*333d2b36SAndroid Build Coastguard Worker			"art/Android.bp": []byte(`
297*333d2b36SAndroid Build Coastguard Worker				java_library {
298*333d2b36SAndroid Build Coastguard Worker					name: "inside_art_libraries",
299*333d2b36SAndroid Build Coastguard Worker					uncompress_dex: true,
300*333d2b36SAndroid Build Coastguard Worker				}`),
301*333d2b36SAndroid Build Coastguard Worker		},
302*333d2b36SAndroid Build Coastguard Worker	},
303*333d2b36SAndroid Build Coastguard Worker	{
304*333d2b36SAndroid Build Coastguard Worker		name: "uncompress_dex outside art",
305*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
306*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
307*333d2b36SAndroid Build Coastguard Worker				java_library {
308*333d2b36SAndroid Build Coastguard Worker					name: "outside_art_libraries",
309*333d2b36SAndroid Build Coastguard Worker					uncompress_dex: true,
310*333d2b36SAndroid Build Coastguard Worker				}`),
311*333d2b36SAndroid Build Coastguard Worker		},
312*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
313*333d2b36SAndroid Build Coastguard Worker			"module \"outside_art_libraries\": violates neverallow",
314*333d2b36SAndroid Build Coastguard Worker		},
315*333d2b36SAndroid Build Coastguard Worker	},
316*333d2b36SAndroid Build Coastguard Worker	// Tests for the rule prohibiting the use of framework
317*333d2b36SAndroid Build Coastguard Worker	{
318*333d2b36SAndroid Build Coastguard Worker		name: "prohibit framework",
319*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
320*333d2b36SAndroid Build Coastguard Worker			"Android.bp": []byte(`
321*333d2b36SAndroid Build Coastguard Worker				java_library {
322*333d2b36SAndroid Build Coastguard Worker					name: "foo",
323*333d2b36SAndroid Build Coastguard Worker					libs: ["framework"],
324*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
325*333d2b36SAndroid Build Coastguard Worker				}`),
326*333d2b36SAndroid Build Coastguard Worker		},
327*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
328*333d2b36SAndroid Build Coastguard Worker			"framework can't be used when building against SDK",
329*333d2b36SAndroid Build Coastguard Worker		},
330*333d2b36SAndroid Build Coastguard Worker	},
331*333d2b36SAndroid Build Coastguard Worker	// Test for the rule restricting use of implementation_installable
332*333d2b36SAndroid Build Coastguard Worker	{
333*333d2b36SAndroid Build Coastguard Worker		name: `"implementation_installable" outside allowed list`,
334*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
335*333d2b36SAndroid Build Coastguard Worker			"Android.bp": []byte(`
336*333d2b36SAndroid Build Coastguard Worker				cc_library {
337*333d2b36SAndroid Build Coastguard Worker					name: "outside_allowed_list",
338*333d2b36SAndroid Build Coastguard Worker					stubs: {
339*333d2b36SAndroid Build Coastguard Worker                                                implementation_installable: true,
340*333d2b36SAndroid Build Coastguard Worker					},
341*333d2b36SAndroid Build Coastguard Worker				}`),
342*333d2b36SAndroid Build Coastguard Worker		},
343*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
344*333d2b36SAndroid Build Coastguard Worker			`module "outside_allowed_list": violates neverallow`,
345*333d2b36SAndroid Build Coastguard Worker		},
346*333d2b36SAndroid Build Coastguard Worker	},
347*333d2b36SAndroid Build Coastguard Worker	// Test for only allowing headers_only for framework-minus-apex-headers
348*333d2b36SAndroid Build Coastguard Worker	{
349*333d2b36SAndroid Build Coastguard Worker		name: `"headers_only" outside framework-minus-apex-headers modules`,
350*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
351*333d2b36SAndroid Build Coastguard Worker			"a/b/Android.bp": []byte(`
352*333d2b36SAndroid Build Coastguard Worker				java_library {
353*333d2b36SAndroid Build Coastguard Worker					name: "baz",
354*333d2b36SAndroid Build Coastguard Worker					headers_only: true,
355*333d2b36SAndroid Build Coastguard Worker				}
356*333d2b36SAndroid Build Coastguard Worker			`),
357*333d2b36SAndroid Build Coastguard Worker		},
358*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
359*333d2b36SAndroid Build Coastguard Worker			`headers_only can only be used for generating framework-minus-apex headers for non-updatable modules`,
360*333d2b36SAndroid Build Coastguard Worker		},
361*333d2b36SAndroid Build Coastguard Worker	},
362*333d2b36SAndroid Build Coastguard Worker	// Test for the rule restricting use of is_auto_generated
363*333d2b36SAndroid Build Coastguard Worker	{
364*333d2b36SAndroid Build Coastguard Worker		name: `"is_auto_generated" outside allowed directory`,
365*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
366*333d2b36SAndroid Build Coastguard Worker			"a/b/Android.bp": []byte(`
367*333d2b36SAndroid Build Coastguard Worker				filesystem {
368*333d2b36SAndroid Build Coastguard Worker					name: "baaz",
369*333d2b36SAndroid Build Coastguard Worker					is_auto_generated: true,
370*333d2b36SAndroid Build Coastguard Worker				}
371*333d2b36SAndroid Build Coastguard Worker			`),
372*333d2b36SAndroid Build Coastguard Worker		},
373*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
374*333d2b36SAndroid Build Coastguard Worker			`is_auto_generated property is only allowed for filesystem modules in build/soong/fsgen directory`,
375*333d2b36SAndroid Build Coastguard Worker		},
376*333d2b36SAndroid Build Coastguard Worker	},
377*333d2b36SAndroid Build Coastguard Worker	// Test for the rule restricting use of prebuilt_* module
378*333d2b36SAndroid Build Coastguard Worker	{
379*333d2b36SAndroid Build Coastguard Worker		name: `"prebuilt_usr_srec" defined in Android.bp file`,
380*333d2b36SAndroid Build Coastguard Worker		fs: map[string][]byte{
381*333d2b36SAndroid Build Coastguard Worker			"a/b/Android.bp": []byte(`
382*333d2b36SAndroid Build Coastguard Worker				prebuilt_usr_srec {
383*333d2b36SAndroid Build Coastguard Worker					name: "foo",
384*333d2b36SAndroid Build Coastguard Worker				}
385*333d2b36SAndroid Build Coastguard Worker			`),
386*333d2b36SAndroid Build Coastguard Worker		},
387*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
388*333d2b36SAndroid Build Coastguard Worker			`module type not allowed to be defined in bp file`,
389*333d2b36SAndroid Build Coastguard Worker		},
390*333d2b36SAndroid Build Coastguard Worker	},
391*333d2b36SAndroid Build Coastguard Worker}
392*333d2b36SAndroid Build Coastguard Worker
393*333d2b36SAndroid Build Coastguard Workervar prepareForNeverAllowTest = GroupFixturePreparers(
394*333d2b36SAndroid Build Coastguard Worker	FixtureRegisterWithContext(func(ctx RegistrationContext) {
395*333d2b36SAndroid Build Coastguard Worker		ctx.RegisterModuleType("cc_library", newMockCcLibraryModule)
396*333d2b36SAndroid Build Coastguard Worker		ctx.RegisterModuleType("java_library", newMockJavaLibraryModule)
397*333d2b36SAndroid Build Coastguard Worker		ctx.RegisterModuleType("java_library_host", newMockJavaLibraryModule)
398*333d2b36SAndroid Build Coastguard Worker		ctx.RegisterModuleType("java_device_for_host", newMockJavaLibraryModule)
399*333d2b36SAndroid Build Coastguard Worker		ctx.RegisterModuleType("filesystem", newMockFilesystemModule)
400*333d2b36SAndroid Build Coastguard Worker		ctx.RegisterModuleType("prebuilt_usr_srec", newMockPrebuiltUsrSrecModule)
401*333d2b36SAndroid Build Coastguard Worker	}),
402*333d2b36SAndroid Build Coastguard Worker)
403*333d2b36SAndroid Build Coastguard Worker
404*333d2b36SAndroid Build Coastguard Workerfunc TestNeverallow(t *testing.T) {
405*333d2b36SAndroid Build Coastguard Worker	for _, test := range neverallowTests {
406*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
407*333d2b36SAndroid Build Coastguard Worker			GroupFixturePreparers(
408*333d2b36SAndroid Build Coastguard Worker				prepareForNeverAllowTest,
409*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithNeverallowRules(test.rules),
410*333d2b36SAndroid Build Coastguard Worker				test.fs.AddToFixture(),
411*333d2b36SAndroid Build Coastguard Worker			).
412*333d2b36SAndroid Build Coastguard Worker				ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern(test.expectedErrors)).
413*333d2b36SAndroid Build Coastguard Worker				RunTest(t)
414*333d2b36SAndroid Build Coastguard Worker		})
415*333d2b36SAndroid Build Coastguard Worker	}
416*333d2b36SAndroid Build Coastguard Worker}
417*333d2b36SAndroid Build Coastguard Worker
418*333d2b36SAndroid Build Coastguard Workertype mockCcLibraryProperties struct {
419*333d2b36SAndroid Build Coastguard Worker	Include_dirs     []string
420*333d2b36SAndroid Build Coastguard Worker	Vendor_available *bool
421*333d2b36SAndroid Build Coastguard Worker	Static_libs      []string
422*333d2b36SAndroid Build Coastguard Worker	Sdk_version      *string
423*333d2b36SAndroid Build Coastguard Worker	Sdk_variant_only *bool
424*333d2b36SAndroid Build Coastguard Worker
425*333d2b36SAndroid Build Coastguard Worker	Vndk struct {
426*333d2b36SAndroid Build Coastguard Worker		Enabled                *bool
427*333d2b36SAndroid Build Coastguard Worker		Support_system_process *bool
428*333d2b36SAndroid Build Coastguard Worker		Extends                *string
429*333d2b36SAndroid Build Coastguard Worker	}
430*333d2b36SAndroid Build Coastguard Worker
431*333d2b36SAndroid Build Coastguard Worker	Product_variables struct {
432*333d2b36SAndroid Build Coastguard Worker		Enforce_vintf_manifest struct {
433*333d2b36SAndroid Build Coastguard Worker			Cflags []string
434*333d2b36SAndroid Build Coastguard Worker		}
435*333d2b36SAndroid Build Coastguard Worker
436*333d2b36SAndroid Build Coastguard Worker		Treble_linker_namespaces struct {
437*333d2b36SAndroid Build Coastguard Worker			Cflags []string
438*333d2b36SAndroid Build Coastguard Worker		}
439*333d2b36SAndroid Build Coastguard Worker	}
440*333d2b36SAndroid Build Coastguard Worker
441*333d2b36SAndroid Build Coastguard Worker	Platform struct {
442*333d2b36SAndroid Build Coastguard Worker		Shared_libs []string
443*333d2b36SAndroid Build Coastguard Worker	}
444*333d2b36SAndroid Build Coastguard Worker
445*333d2b36SAndroid Build Coastguard Worker	Stubs struct {
446*333d2b36SAndroid Build Coastguard Worker		Implementation_installable *bool
447*333d2b36SAndroid Build Coastguard Worker	}
448*333d2b36SAndroid Build Coastguard Worker}
449*333d2b36SAndroid Build Coastguard Worker
450*333d2b36SAndroid Build Coastguard Workertype mockCcLibraryModule struct {
451*333d2b36SAndroid Build Coastguard Worker	ModuleBase
452*333d2b36SAndroid Build Coastguard Worker	properties mockCcLibraryProperties
453*333d2b36SAndroid Build Coastguard Worker}
454*333d2b36SAndroid Build Coastguard Worker
455*333d2b36SAndroid Build Coastguard Workerfunc newMockCcLibraryModule() Module {
456*333d2b36SAndroid Build Coastguard Worker	m := &mockCcLibraryModule{}
457*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
458*333d2b36SAndroid Build Coastguard Worker	InitAndroidModule(m)
459*333d2b36SAndroid Build Coastguard Worker	return m
460*333d2b36SAndroid Build Coastguard Worker}
461*333d2b36SAndroid Build Coastguard Worker
462*333d2b36SAndroid Build Coastguard Workertype neverallowTestDependencyTag struct {
463*333d2b36SAndroid Build Coastguard Worker	blueprint.BaseDependencyTag
464*333d2b36SAndroid Build Coastguard Worker	name string
465*333d2b36SAndroid Build Coastguard Worker}
466*333d2b36SAndroid Build Coastguard Worker
467*333d2b36SAndroid Build Coastguard Workervar staticDepTag = neverallowTestDependencyTag{name: "static"}
468*333d2b36SAndroid Build Coastguard Worker
469*333d2b36SAndroid Build Coastguard Workerfunc (c *mockCcLibraryModule) DepsMutator(ctx BottomUpMutatorContext) {
470*333d2b36SAndroid Build Coastguard Worker	for _, lib := range c.properties.Static_libs {
471*333d2b36SAndroid Build Coastguard Worker		ctx.AddDependency(ctx.Module(), staticDepTag, lib)
472*333d2b36SAndroid Build Coastguard Worker	}
473*333d2b36SAndroid Build Coastguard Worker}
474*333d2b36SAndroid Build Coastguard Worker
475*333d2b36SAndroid Build Coastguard Workerfunc (p *mockCcLibraryModule) GenerateAndroidBuildActions(ModuleContext) {
476*333d2b36SAndroid Build Coastguard Worker}
477*333d2b36SAndroid Build Coastguard Worker
478*333d2b36SAndroid Build Coastguard Workertype mockJavaLibraryProperties struct {
479*333d2b36SAndroid Build Coastguard Worker	Libs                []string
480*333d2b36SAndroid Build Coastguard Worker	Sdk_version         *string
481*333d2b36SAndroid Build Coastguard Worker	Uncompress_dex      *bool
482*333d2b36SAndroid Build Coastguard Worker	Exclude_static_libs []string
483*333d2b36SAndroid Build Coastguard Worker	Headers_only        *bool
484*333d2b36SAndroid Build Coastguard Worker}
485*333d2b36SAndroid Build Coastguard Worker
486*333d2b36SAndroid Build Coastguard Workertype mockJavaLibraryModule struct {
487*333d2b36SAndroid Build Coastguard Worker	ModuleBase
488*333d2b36SAndroid Build Coastguard Worker	properties mockJavaLibraryProperties
489*333d2b36SAndroid Build Coastguard Worker}
490*333d2b36SAndroid Build Coastguard Worker
491*333d2b36SAndroid Build Coastguard Workerfunc newMockJavaLibraryModule() Module {
492*333d2b36SAndroid Build Coastguard Worker	m := &mockJavaLibraryModule{}
493*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
494*333d2b36SAndroid Build Coastguard Worker	InitAndroidModule(m)
495*333d2b36SAndroid Build Coastguard Worker	return m
496*333d2b36SAndroid Build Coastguard Worker}
497*333d2b36SAndroid Build Coastguard Worker
498*333d2b36SAndroid Build Coastguard Workerfunc (p *mockJavaLibraryModule) GenerateAndroidBuildActions(ModuleContext) {
499*333d2b36SAndroid Build Coastguard Worker}
500*333d2b36SAndroid Build Coastguard Worker
501*333d2b36SAndroid Build Coastguard Workertype mockPrebuiltUsrSrecModule struct {
502*333d2b36SAndroid Build Coastguard Worker	ModuleBase
503*333d2b36SAndroid Build Coastguard Worker}
504*333d2b36SAndroid Build Coastguard Worker
505*333d2b36SAndroid Build Coastguard Workerfunc (p *mockPrebuiltUsrSrecModule) GenerateAndroidBuildActions(ModuleContext) {
506*333d2b36SAndroid Build Coastguard Worker}
507*333d2b36SAndroid Build Coastguard Worker
508*333d2b36SAndroid Build Coastguard Workerfunc newMockPrebuiltUsrSrecModule() Module {
509*333d2b36SAndroid Build Coastguard Worker	m := &mockPrebuiltUsrSrecModule{}
510*333d2b36SAndroid Build Coastguard Worker	InitAndroidModule(m)
511*333d2b36SAndroid Build Coastguard Worker	return m
512*333d2b36SAndroid Build Coastguard Worker}
513