xref: /aosp_15_r20/build/soong/android/visibility_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	"reflect"
5*333d2b36SAndroid Build Coastguard Worker	"testing"
6*333d2b36SAndroid Build Coastguard Worker
7*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
8*333d2b36SAndroid Build Coastguard Worker)
9*333d2b36SAndroid Build Coastguard Worker
10*333d2b36SAndroid Build Coastguard Workervar visibilityTests = []struct {
11*333d2b36SAndroid Build Coastguard Worker	name                string
12*333d2b36SAndroid Build Coastguard Worker	fs                  MockFS
13*333d2b36SAndroid Build Coastguard Worker	expectedErrors      []string
14*333d2b36SAndroid Build Coastguard Worker	effectiveVisibility map[qualifiedModuleName][]string
15*333d2b36SAndroid Build Coastguard Worker}{
16*333d2b36SAndroid Build Coastguard Worker	{
17*333d2b36SAndroid Build Coastguard Worker		name: "invalid visibility: empty list",
18*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
19*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
20*333d2b36SAndroid Build Coastguard Worker				mock_library {
21*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
22*333d2b36SAndroid Build Coastguard Worker					visibility: [],
23*333d2b36SAndroid Build Coastguard Worker				}`),
24*333d2b36SAndroid Build Coastguard Worker		},
25*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`visibility: must contain at least one visibility rule`},
26*333d2b36SAndroid Build Coastguard Worker	},
27*333d2b36SAndroid Build Coastguard Worker	{
28*333d2b36SAndroid Build Coastguard Worker		name: "invalid visibility: empty rule",
29*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
30*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
31*333d2b36SAndroid Build Coastguard Worker				mock_library {
32*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
33*333d2b36SAndroid Build Coastguard Worker					visibility: [""],
34*333d2b36SAndroid Build Coastguard Worker				}`),
35*333d2b36SAndroid Build Coastguard Worker		},
36*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`visibility: invalid visibility pattern ""`},
37*333d2b36SAndroid Build Coastguard Worker	},
38*333d2b36SAndroid Build Coastguard Worker	{
39*333d2b36SAndroid Build Coastguard Worker		name: "invalid visibility: unqualified",
40*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
41*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
42*333d2b36SAndroid Build Coastguard Worker				mock_library {
43*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
44*333d2b36SAndroid Build Coastguard Worker					visibility: ["target"],
45*333d2b36SAndroid Build Coastguard Worker				}`),
46*333d2b36SAndroid Build Coastguard Worker		},
47*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`visibility: invalid visibility pattern "target"`},
48*333d2b36SAndroid Build Coastguard Worker	},
49*333d2b36SAndroid Build Coastguard Worker	{
50*333d2b36SAndroid Build Coastguard Worker		name: "invalid visibility: empty namespace",
51*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
52*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
53*333d2b36SAndroid Build Coastguard Worker				mock_library {
54*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
55*333d2b36SAndroid Build Coastguard Worker					visibility: ["//"],
56*333d2b36SAndroid Build Coastguard Worker				}`),
57*333d2b36SAndroid Build Coastguard Worker		},
58*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`visibility: invalid visibility pattern "//"`},
59*333d2b36SAndroid Build Coastguard Worker	},
60*333d2b36SAndroid Build Coastguard Worker	{
61*333d2b36SAndroid Build Coastguard Worker		name: "invalid visibility: empty module",
62*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
63*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
64*333d2b36SAndroid Build Coastguard Worker				mock_library {
65*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
66*333d2b36SAndroid Build Coastguard Worker					visibility: [":"],
67*333d2b36SAndroid Build Coastguard Worker				}`),
68*333d2b36SAndroid Build Coastguard Worker		},
69*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`visibility: invalid visibility pattern ":"`},
70*333d2b36SAndroid Build Coastguard Worker	},
71*333d2b36SAndroid Build Coastguard Worker	{
72*333d2b36SAndroid Build Coastguard Worker		name: "invalid visibility: empty namespace and module",
73*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
74*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
75*333d2b36SAndroid Build Coastguard Worker				mock_library {
76*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
77*333d2b36SAndroid Build Coastguard Worker					visibility: ["//:"],
78*333d2b36SAndroid Build Coastguard Worker				}`),
79*333d2b36SAndroid Build Coastguard Worker		},
80*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`visibility: invalid visibility pattern "//:"`},
81*333d2b36SAndroid Build Coastguard Worker	},
82*333d2b36SAndroid Build Coastguard Worker	{
83*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:unknown",
84*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
85*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
86*333d2b36SAndroid Build Coastguard Worker				mock_library {
87*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
88*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:unknown"],
89*333d2b36SAndroid Build Coastguard Worker				}`),
90*333d2b36SAndroid Build Coastguard Worker		},
91*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`unrecognized visibility rule "//visibility:unknown"`},
92*333d2b36SAndroid Build Coastguard Worker	},
93*333d2b36SAndroid Build Coastguard Worker	{
94*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:xxx mixed",
95*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
96*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
97*333d2b36SAndroid Build Coastguard Worker				mock_library {
98*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
99*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public", "//namespace"],
100*333d2b36SAndroid Build Coastguard Worker				}
101*333d2b36SAndroid Build Coastguard Worker
102*333d2b36SAndroid Build Coastguard Worker				mock_library {
103*333d2b36SAndroid Build Coastguard Worker					name: "libother",
104*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private", "//namespace"],
105*333d2b36SAndroid Build Coastguard Worker				}`),
106*333d2b36SAndroid Build Coastguard Worker		},
107*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
108*333d2b36SAndroid Build Coastguard Worker			`module "libother": visibility: cannot mix "//visibility:private"` +
109*333d2b36SAndroid Build Coastguard Worker				` with any other visibility rules`,
110*333d2b36SAndroid Build Coastguard Worker			`module "libexample": visibility: cannot mix "//visibility:public"` +
111*333d2b36SAndroid Build Coastguard Worker				` with any other visibility rules`,
112*333d2b36SAndroid Build Coastguard Worker		},
113*333d2b36SAndroid Build Coastguard Worker	},
114*333d2b36SAndroid Build Coastguard Worker	{
115*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:legacy_public",
116*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
117*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
118*333d2b36SAndroid Build Coastguard Worker				mock_library {
119*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
120*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:legacy_public"],
121*333d2b36SAndroid Build Coastguard Worker				}`),
122*333d2b36SAndroid Build Coastguard Worker		},
123*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
124*333d2b36SAndroid Build Coastguard Worker			`module "libexample": visibility: //visibility:legacy_public must` +
125*333d2b36SAndroid Build Coastguard Worker				` not be used`,
126*333d2b36SAndroid Build Coastguard Worker		},
127*333d2b36SAndroid Build Coastguard Worker	},
128*333d2b36SAndroid Build Coastguard Worker	{
129*333d2b36SAndroid Build Coastguard Worker		// Verify that //visibility:public will allow the module to be referenced from anywhere, e.g.
130*333d2b36SAndroid Build Coastguard Worker		// the current directory, a nested directory and a directory in a separate tree.
131*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:public",
132*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
133*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
134*333d2b36SAndroid Build Coastguard Worker				mock_library {
135*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
136*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
137*333d2b36SAndroid Build Coastguard Worker				}
138*333d2b36SAndroid Build Coastguard Worker
139*333d2b36SAndroid Build Coastguard Worker				mock_library {
140*333d2b36SAndroid Build Coastguard Worker					name: "libsamepackage",
141*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
142*333d2b36SAndroid Build Coastguard Worker				}
143*333d2b36SAndroid Build Coastguard Worker
144*333d2b36SAndroid Build Coastguard Worker				gen_notice {
145*333d2b36SAndroid Build Coastguard Worker					name: "libexample-notice",
146*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
147*333d2b36SAndroid Build Coastguard Worker				}`),
148*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
149*333d2b36SAndroid Build Coastguard Worker				mock_library {
150*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
151*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
152*333d2b36SAndroid Build Coastguard Worker				}
153*333d2b36SAndroid Build Coastguard Worker
154*333d2b36SAndroid Build Coastguard Worker				gen_notice {
155*333d2b36SAndroid Build Coastguard Worker					name: "nested-notice",
156*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
157*333d2b36SAndroid Build Coastguard Worker				}`),
158*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
159*333d2b36SAndroid Build Coastguard Worker				mock_library {
160*333d2b36SAndroid Build Coastguard Worker					name: "libother",
161*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
162*333d2b36SAndroid Build Coastguard Worker				}
163*333d2b36SAndroid Build Coastguard Worker
164*333d2b36SAndroid Build Coastguard Worker				gen_notice {
165*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
166*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
167*333d2b36SAndroid Build Coastguard Worker				}`),
168*333d2b36SAndroid Build Coastguard Worker		},
169*333d2b36SAndroid Build Coastguard Worker	},
170*333d2b36SAndroid Build Coastguard Worker	{
171*333d2b36SAndroid Build Coastguard Worker		// Verify that //visibility:private allows the module to be referenced from the current
172*333d2b36SAndroid Build Coastguard Worker		// directory only.
173*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:private",
174*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
175*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
176*333d2b36SAndroid Build Coastguard Worker				mock_library {
177*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
178*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
179*333d2b36SAndroid Build Coastguard Worker				}
180*333d2b36SAndroid Build Coastguard Worker
181*333d2b36SAndroid Build Coastguard Worker				mock_library {
182*333d2b36SAndroid Build Coastguard Worker					name: "libsamepackage",
183*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
184*333d2b36SAndroid Build Coastguard Worker				}`),
185*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
186*333d2b36SAndroid Build Coastguard Worker				mock_library {
187*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
188*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
189*333d2b36SAndroid Build Coastguard Worker				}`),
190*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
191*333d2b36SAndroid Build Coastguard Worker				mock_library {
192*333d2b36SAndroid Build Coastguard Worker					name: "libother",
193*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
194*333d2b36SAndroid Build Coastguard Worker				}`),
195*333d2b36SAndroid Build Coastguard Worker		},
196*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
197*333d2b36SAndroid Build Coastguard Worker			`module "libnested" variant "android_common": depends on //top:libexample which is not` +
198*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
199*333d2b36SAndroid Build Coastguard Worker			`module "libother" variant "android_common": depends on //top:libexample which is not` +
200*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
201*333d2b36SAndroid Build Coastguard Worker		},
202*333d2b36SAndroid Build Coastguard Worker	},
203*333d2b36SAndroid Build Coastguard Worker	{
204*333d2b36SAndroid Build Coastguard Worker		// Verify that //visibility:private allows the module to be referenced from the current
205*333d2b36SAndroid Build Coastguard Worker		// directory only.
206*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:private (notices)",
207*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
208*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
209*333d2b36SAndroid Build Coastguard Worker				mock_library {
210*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
211*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
212*333d2b36SAndroid Build Coastguard Worker				}
213*333d2b36SAndroid Build Coastguard Worker
214*333d2b36SAndroid Build Coastguard Worker				mock_library {
215*333d2b36SAndroid Build Coastguard Worker					name: "libsamepackage",
216*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
217*333d2b36SAndroid Build Coastguard Worker				}
218*333d2b36SAndroid Build Coastguard Worker
219*333d2b36SAndroid Build Coastguard Worker				gen_notice {
220*333d2b36SAndroid Build Coastguard Worker					name: "libexample-notice",
221*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
222*333d2b36SAndroid Build Coastguard Worker				}`),
223*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
224*333d2b36SAndroid Build Coastguard Worker				gen_notice {
225*333d2b36SAndroid Build Coastguard Worker					name: "nested-notice",
226*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
227*333d2b36SAndroid Build Coastguard Worker				}`),
228*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
229*333d2b36SAndroid Build Coastguard Worker				gen_notice {
230*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
231*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
232*333d2b36SAndroid Build Coastguard Worker				}`),
233*333d2b36SAndroid Build Coastguard Worker		},
234*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
235*333d2b36SAndroid Build Coastguard Worker			`module "nested-notice" references "//top:libexample" which is not visible to this` +
236*333d2b36SAndroid Build Coastguard Worker				` module\nYou may need to add "//top/nested" to its visibility`,
237*333d2b36SAndroid Build Coastguard Worker			`module "other-notice" references "//top:libexample" which is not visible to this module\n` +
238*333d2b36SAndroid Build Coastguard Worker				`You may need to add "//other" to its visibility`,
239*333d2b36SAndroid Build Coastguard Worker		},
240*333d2b36SAndroid Build Coastguard Worker	},
241*333d2b36SAndroid Build Coastguard Worker	{
242*333d2b36SAndroid Build Coastguard Worker		// Verify that :__pkg__ allows the module to be referenced from the current directory only.
243*333d2b36SAndroid Build Coastguard Worker		name: ":__pkg__",
244*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
245*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
246*333d2b36SAndroid Build Coastguard Worker				mock_library {
247*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
248*333d2b36SAndroid Build Coastguard Worker					visibility: [":__pkg__"],
249*333d2b36SAndroid Build Coastguard Worker				}
250*333d2b36SAndroid Build Coastguard Worker
251*333d2b36SAndroid Build Coastguard Worker				mock_library {
252*333d2b36SAndroid Build Coastguard Worker					name: "libsamepackage",
253*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
254*333d2b36SAndroid Build Coastguard Worker				}`),
255*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
256*333d2b36SAndroid Build Coastguard Worker				mock_library {
257*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
258*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
259*333d2b36SAndroid Build Coastguard Worker				}`),
260*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
261*333d2b36SAndroid Build Coastguard Worker				mock_library {
262*333d2b36SAndroid Build Coastguard Worker					name: "libother",
263*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
264*333d2b36SAndroid Build Coastguard Worker				}`),
265*333d2b36SAndroid Build Coastguard Worker		},
266*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
267*333d2b36SAndroid Build Coastguard Worker			`module "libnested" variant "android_common": depends on //top:libexample which is not` +
268*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
269*333d2b36SAndroid Build Coastguard Worker			`module "libother" variant "android_common": depends on //top:libexample which is not` +
270*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
271*333d2b36SAndroid Build Coastguard Worker		},
272*333d2b36SAndroid Build Coastguard Worker	},
273*333d2b36SAndroid Build Coastguard Worker	{
274*333d2b36SAndroid Build Coastguard Worker		// Verify that :__pkg__ allows the module to be referenced from the current directory only.
275*333d2b36SAndroid Build Coastguard Worker		name: ":__pkg__ (notices)",
276*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
277*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
278*333d2b36SAndroid Build Coastguard Worker				mock_library {
279*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
280*333d2b36SAndroid Build Coastguard Worker					visibility: [":__pkg__"],
281*333d2b36SAndroid Build Coastguard Worker				}
282*333d2b36SAndroid Build Coastguard Worker
283*333d2b36SAndroid Build Coastguard Worker				gen_notice {
284*333d2b36SAndroid Build Coastguard Worker					name: "libexample-notice",
285*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
286*333d2b36SAndroid Build Coastguard Worker				}`),
287*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
288*333d2b36SAndroid Build Coastguard Worker				gen_notice {
289*333d2b36SAndroid Build Coastguard Worker					name: "nested-notice",
290*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
291*333d2b36SAndroid Build Coastguard Worker				}`),
292*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
293*333d2b36SAndroid Build Coastguard Worker				gen_notice {
294*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
295*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
296*333d2b36SAndroid Build Coastguard Worker				}`),
297*333d2b36SAndroid Build Coastguard Worker		},
298*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
299*333d2b36SAndroid Build Coastguard Worker			`module "nested-notice" references "//top:libexample" which is not visible to this module`,
300*333d2b36SAndroid Build Coastguard Worker			`module "other-notice" references "//top:libexample" which is not visible to this module`,
301*333d2b36SAndroid Build Coastguard Worker		},
302*333d2b36SAndroid Build Coastguard Worker	},
303*333d2b36SAndroid Build Coastguard Worker	{
304*333d2b36SAndroid Build Coastguard Worker		// Verify that //top/nested allows the module to be referenced from the current directory and
305*333d2b36SAndroid Build Coastguard Worker		// the top/nested directory only, not a subdirectory of top/nested and not peak directory.
306*333d2b36SAndroid Build Coastguard Worker		name: "//top/nested",
307*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
308*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
309*333d2b36SAndroid Build Coastguard Worker				mock_library {
310*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
311*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/nested"],
312*333d2b36SAndroid Build Coastguard Worker				}
313*333d2b36SAndroid Build Coastguard Worker
314*333d2b36SAndroid Build Coastguard Worker				mock_library {
315*333d2b36SAndroid Build Coastguard Worker					name: "libsamepackage",
316*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
317*333d2b36SAndroid Build Coastguard Worker				}`),
318*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
319*333d2b36SAndroid Build Coastguard Worker				mock_library {
320*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
321*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
322*333d2b36SAndroid Build Coastguard Worker				}`),
323*333d2b36SAndroid Build Coastguard Worker			"top/nested/again/Android.bp": []byte(`
324*333d2b36SAndroid Build Coastguard Worker				mock_library {
325*333d2b36SAndroid Build Coastguard Worker					name: "libnestedagain",
326*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
327*333d2b36SAndroid Build Coastguard Worker				}`),
328*333d2b36SAndroid Build Coastguard Worker			"peak/Android.bp": []byte(`
329*333d2b36SAndroid Build Coastguard Worker				mock_library {
330*333d2b36SAndroid Build Coastguard Worker					name: "libother",
331*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
332*333d2b36SAndroid Build Coastguard Worker				}`),
333*333d2b36SAndroid Build Coastguard Worker		},
334*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
335*333d2b36SAndroid Build Coastguard Worker			`module "libother" variant "android_common": depends on //top:libexample which is not` +
336*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
337*333d2b36SAndroid Build Coastguard Worker			`module "libnestedagain" variant "android_common": depends on //top:libexample which is not` +
338*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
339*333d2b36SAndroid Build Coastguard Worker		},
340*333d2b36SAndroid Build Coastguard Worker	},
341*333d2b36SAndroid Build Coastguard Worker	{
342*333d2b36SAndroid Build Coastguard Worker		// Verify that //top/nested allows the module to be referenced from the current directory and
343*333d2b36SAndroid Build Coastguard Worker		// the top/nested directory only, not a subdirectory of top/nested and not peak directory.
344*333d2b36SAndroid Build Coastguard Worker		name: "//top/nested (notices)",
345*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
346*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
347*333d2b36SAndroid Build Coastguard Worker				mock_library {
348*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
349*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/nested"],
350*333d2b36SAndroid Build Coastguard Worker				}
351*333d2b36SAndroid Build Coastguard Worker
352*333d2b36SAndroid Build Coastguard Worker				gen_notice {
353*333d2b36SAndroid Build Coastguard Worker					name: "libexample-notice",
354*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
355*333d2b36SAndroid Build Coastguard Worker				}`),
356*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
357*333d2b36SAndroid Build Coastguard Worker				gen_notice {
358*333d2b36SAndroid Build Coastguard Worker					name: "nested-notice",
359*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
360*333d2b36SAndroid Build Coastguard Worker				}`),
361*333d2b36SAndroid Build Coastguard Worker			"top/nested/again/Android.bp": []byte(`
362*333d2b36SAndroid Build Coastguard Worker				gen_notice {
363*333d2b36SAndroid Build Coastguard Worker					name: "nestedagain-notice",
364*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
365*333d2b36SAndroid Build Coastguard Worker				}`),
366*333d2b36SAndroid Build Coastguard Worker			"peak/Android.bp": []byte(`
367*333d2b36SAndroid Build Coastguard Worker				gen_notice {
368*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
369*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
370*333d2b36SAndroid Build Coastguard Worker				}`),
371*333d2b36SAndroid Build Coastguard Worker		},
372*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
373*333d2b36SAndroid Build Coastguard Worker			`module "other-notice" references "//top:libexample" which is not visible to this module`,
374*333d2b36SAndroid Build Coastguard Worker			`module "nestedagain-notice" references "//top:libexample" which is not visible to this module`,
375*333d2b36SAndroid Build Coastguard Worker		},
376*333d2b36SAndroid Build Coastguard Worker	},
377*333d2b36SAndroid Build Coastguard Worker	{
378*333d2b36SAndroid Build Coastguard Worker		// Verify that :__subpackages__ allows the module to be referenced from the current directory
379*333d2b36SAndroid Build Coastguard Worker		// and sub directories but nowhere else.
380*333d2b36SAndroid Build Coastguard Worker		name: ":__subpackages__",
381*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
382*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
383*333d2b36SAndroid Build Coastguard Worker				mock_library {
384*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
385*333d2b36SAndroid Build Coastguard Worker					visibility: [":__subpackages__"],
386*333d2b36SAndroid Build Coastguard Worker				}
387*333d2b36SAndroid Build Coastguard Worker
388*333d2b36SAndroid Build Coastguard Worker				mock_library {
389*333d2b36SAndroid Build Coastguard Worker					name: "libsamepackage",
390*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
391*333d2b36SAndroid Build Coastguard Worker				}`),
392*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
393*333d2b36SAndroid Build Coastguard Worker				mock_library {
394*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
395*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
396*333d2b36SAndroid Build Coastguard Worker				}`),
397*333d2b36SAndroid Build Coastguard Worker			"peak/other/Android.bp": []byte(`
398*333d2b36SAndroid Build Coastguard Worker				mock_library {
399*333d2b36SAndroid Build Coastguard Worker					name: "libother",
400*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
401*333d2b36SAndroid Build Coastguard Worker				}`),
402*333d2b36SAndroid Build Coastguard Worker		},
403*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
404*333d2b36SAndroid Build Coastguard Worker			`module "libother" variant "android_common": depends on //top:libexample which is not` +
405*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
406*333d2b36SAndroid Build Coastguard Worker		},
407*333d2b36SAndroid Build Coastguard Worker	},
408*333d2b36SAndroid Build Coastguard Worker	{
409*333d2b36SAndroid Build Coastguard Worker		// Verify that :__subpackages__ allows the module to be referenced from the current directory
410*333d2b36SAndroid Build Coastguard Worker		// and sub directories but nowhere else.
411*333d2b36SAndroid Build Coastguard Worker		name: ":__subpackages__ (notices)",
412*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
413*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
414*333d2b36SAndroid Build Coastguard Worker				mock_library {
415*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
416*333d2b36SAndroid Build Coastguard Worker					visibility: [":__subpackages__"],
417*333d2b36SAndroid Build Coastguard Worker				}
418*333d2b36SAndroid Build Coastguard Worker
419*333d2b36SAndroid Build Coastguard Worker				gen_notice {
420*333d2b36SAndroid Build Coastguard Worker					name: "libexample-notice",
421*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
422*333d2b36SAndroid Build Coastguard Worker				}`),
423*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
424*333d2b36SAndroid Build Coastguard Worker				gen_notice {
425*333d2b36SAndroid Build Coastguard Worker					name: "nested-notice",
426*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
427*333d2b36SAndroid Build Coastguard Worker				}`),
428*333d2b36SAndroid Build Coastguard Worker			"peak/other/Android.bp": []byte(`
429*333d2b36SAndroid Build Coastguard Worker				gen_notice {
430*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
431*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
432*333d2b36SAndroid Build Coastguard Worker				}`),
433*333d2b36SAndroid Build Coastguard Worker		},
434*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
435*333d2b36SAndroid Build Coastguard Worker			`module "other-notice" references "//top:libexample" which is not visible to this module`,
436*333d2b36SAndroid Build Coastguard Worker		},
437*333d2b36SAndroid Build Coastguard Worker	},
438*333d2b36SAndroid Build Coastguard Worker	{
439*333d2b36SAndroid Build Coastguard Worker		// Verify that //top/nested:__subpackages__ allows the module to be referenced from the current
440*333d2b36SAndroid Build Coastguard Worker		// directory and sub directories but nowhere else.
441*333d2b36SAndroid Build Coastguard Worker		name: "//top/nested:__subpackages__",
442*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
443*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
444*333d2b36SAndroid Build Coastguard Worker				mock_library {
445*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
446*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/nested:__subpackages__", "//other"],
447*333d2b36SAndroid Build Coastguard Worker				}
448*333d2b36SAndroid Build Coastguard Worker
449*333d2b36SAndroid Build Coastguard Worker				mock_library {
450*333d2b36SAndroid Build Coastguard Worker					name: "libsamepackage",
451*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
452*333d2b36SAndroid Build Coastguard Worker				}`),
453*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
454*333d2b36SAndroid Build Coastguard Worker				mock_library {
455*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
456*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
457*333d2b36SAndroid Build Coastguard Worker				}`),
458*333d2b36SAndroid Build Coastguard Worker			"top/other/Android.bp": []byte(`
459*333d2b36SAndroid Build Coastguard Worker				mock_library {
460*333d2b36SAndroid Build Coastguard Worker					name: "libother",
461*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
462*333d2b36SAndroid Build Coastguard Worker				}`),
463*333d2b36SAndroid Build Coastguard Worker		},
464*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
465*333d2b36SAndroid Build Coastguard Worker			`module "libother" variant "android_common": depends on //top:libexample which is not` +
466*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
467*333d2b36SAndroid Build Coastguard Worker		},
468*333d2b36SAndroid Build Coastguard Worker	},
469*333d2b36SAndroid Build Coastguard Worker	{
470*333d2b36SAndroid Build Coastguard Worker		// Verify that //top/nested:__subpackages__ allows the module to be referenced from the current
471*333d2b36SAndroid Build Coastguard Worker		// directory and sub directories but nowhere else.
472*333d2b36SAndroid Build Coastguard Worker		name: "//top/nested:__subpackages__ (notices)",
473*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
474*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
475*333d2b36SAndroid Build Coastguard Worker				mock_library {
476*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
477*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/nested:__subpackages__", "//other"],
478*333d2b36SAndroid Build Coastguard Worker				}
479*333d2b36SAndroid Build Coastguard Worker
480*333d2b36SAndroid Build Coastguard Worker				gen_notice {
481*333d2b36SAndroid Build Coastguard Worker					name: "libexample-notice",
482*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
483*333d2b36SAndroid Build Coastguard Worker				}`),
484*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
485*333d2b36SAndroid Build Coastguard Worker				gen_notice {
486*333d2b36SAndroid Build Coastguard Worker					name: "nested-notice",
487*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
488*333d2b36SAndroid Build Coastguard Worker				}`),
489*333d2b36SAndroid Build Coastguard Worker			"top/other/Android.bp": []byte(`
490*333d2b36SAndroid Build Coastguard Worker				gen_notice {
491*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
492*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
493*333d2b36SAndroid Build Coastguard Worker				}`),
494*333d2b36SAndroid Build Coastguard Worker		},
495*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
496*333d2b36SAndroid Build Coastguard Worker			`module "other-notice" references "//top:libexample" which is not visible to this module`,
497*333d2b36SAndroid Build Coastguard Worker		},
498*333d2b36SAndroid Build Coastguard Worker	},
499*333d2b36SAndroid Build Coastguard Worker	{
500*333d2b36SAndroid Build Coastguard Worker		// Verify that ["//top/nested", "//peak:__subpackages"] allows the module to be referenced from
501*333d2b36SAndroid Build Coastguard Worker		// the current directory, top/nested and peak and all its subpackages.
502*333d2b36SAndroid Build Coastguard Worker		name: `["//top/nested", "//peak:__subpackages__"]`,
503*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
504*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
505*333d2b36SAndroid Build Coastguard Worker				mock_library {
506*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
507*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/nested", "//peak:__subpackages__"],
508*333d2b36SAndroid Build Coastguard Worker				}
509*333d2b36SAndroid Build Coastguard Worker
510*333d2b36SAndroid Build Coastguard Worker				mock_library {
511*333d2b36SAndroid Build Coastguard Worker					name: "libsamepackage",
512*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
513*333d2b36SAndroid Build Coastguard Worker				}`),
514*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
515*333d2b36SAndroid Build Coastguard Worker				mock_library {
516*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
517*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
518*333d2b36SAndroid Build Coastguard Worker				}`),
519*333d2b36SAndroid Build Coastguard Worker			"peak/other/Android.bp": []byte(`
520*333d2b36SAndroid Build Coastguard Worker				mock_library {
521*333d2b36SAndroid Build Coastguard Worker					name: "libother",
522*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
523*333d2b36SAndroid Build Coastguard Worker				}`),
524*333d2b36SAndroid Build Coastguard Worker		},
525*333d2b36SAndroid Build Coastguard Worker	},
526*333d2b36SAndroid Build Coastguard Worker	{
527*333d2b36SAndroid Build Coastguard Worker		// Verify that ["//top/nested", "//peak:__subpackages"] allows the module to be referenced from
528*333d2b36SAndroid Build Coastguard Worker		// the current directory, top/nested and peak and all its subpackages.
529*333d2b36SAndroid Build Coastguard Worker		name: `["//top/nested", "//peak:__subpackages__ (notices)"]`,
530*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
531*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
532*333d2b36SAndroid Build Coastguard Worker				mock_library {
533*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
534*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/nested", "//peak:__subpackages__"],
535*333d2b36SAndroid Build Coastguard Worker				}
536*333d2b36SAndroid Build Coastguard Worker
537*333d2b36SAndroid Build Coastguard Worker				gen_notice {
538*333d2b36SAndroid Build Coastguard Worker					name: "libexample-notice",
539*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
540*333d2b36SAndroid Build Coastguard Worker				}`),
541*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
542*333d2b36SAndroid Build Coastguard Worker				gen_notice {
543*333d2b36SAndroid Build Coastguard Worker					name: "nested-notice",
544*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
545*333d2b36SAndroid Build Coastguard Worker				}`),
546*333d2b36SAndroid Build Coastguard Worker			"peak/other/Android.bp": []byte(`
547*333d2b36SAndroid Build Coastguard Worker				gen_notice {
548*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
549*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
550*333d2b36SAndroid Build Coastguard Worker				}`),
551*333d2b36SAndroid Build Coastguard Worker		},
552*333d2b36SAndroid Build Coastguard Worker	},
553*333d2b36SAndroid Build Coastguard Worker	{
554*333d2b36SAndroid Build Coastguard Worker		// Verify that //vendor... cannot be used outside vendor apart from //vendor:__subpackages__
555*333d2b36SAndroid Build Coastguard Worker		name: `//vendor`,
556*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
557*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
558*333d2b36SAndroid Build Coastguard Worker				mock_library {
559*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
560*333d2b36SAndroid Build Coastguard Worker					visibility: ["//vendor:__subpackages__"],
561*333d2b36SAndroid Build Coastguard Worker				}
562*333d2b36SAndroid Build Coastguard Worker
563*333d2b36SAndroid Build Coastguard Worker				mock_library {
564*333d2b36SAndroid Build Coastguard Worker					name: "libsamepackage",
565*333d2b36SAndroid Build Coastguard Worker					visibility: ["//vendor/apps/AcmeSettings"],
566*333d2b36SAndroid Build Coastguard Worker				}`),
567*333d2b36SAndroid Build Coastguard Worker			"vendor/Android.bp": []byte(`
568*333d2b36SAndroid Build Coastguard Worker				mock_library {
569*333d2b36SAndroid Build Coastguard Worker					name: "libvendorexample",
570*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
571*333d2b36SAndroid Build Coastguard Worker					visibility: ["//vendor/nested"],
572*333d2b36SAndroid Build Coastguard Worker				}`),
573*333d2b36SAndroid Build Coastguard Worker			"vendor/nested/Android.bp": []byte(`
574*333d2b36SAndroid Build Coastguard Worker				mock_library {
575*333d2b36SAndroid Build Coastguard Worker					name: "libvendornested",
576*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample", "libvendorexample"],
577*333d2b36SAndroid Build Coastguard Worker				}`),
578*333d2b36SAndroid Build Coastguard Worker		},
579*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
580*333d2b36SAndroid Build Coastguard Worker			`module "libsamepackage": visibility: "//vendor/apps/AcmeSettings"` +
581*333d2b36SAndroid Build Coastguard Worker				` is not allowed. Packages outside //vendor cannot make themselves visible to specific` +
582*333d2b36SAndroid Build Coastguard Worker				` targets within //vendor, they can only use //vendor:__subpackages__.`,
583*333d2b36SAndroid Build Coastguard Worker		},
584*333d2b36SAndroid Build Coastguard Worker	},
585*333d2b36SAndroid Build Coastguard Worker
586*333d2b36SAndroid Build Coastguard Worker	// Defaults propagation tests
587*333d2b36SAndroid Build Coastguard Worker	{
588*333d2b36SAndroid Build Coastguard Worker		// Check that visibility is the union of the defaults modules.
589*333d2b36SAndroid Build Coastguard Worker		name: "defaults union, basic",
590*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
591*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
592*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
593*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
594*333d2b36SAndroid Build Coastguard Worker					visibility: ["//other"],
595*333d2b36SAndroid Build Coastguard Worker				}
596*333d2b36SAndroid Build Coastguard Worker				mock_library {
597*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
598*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/nested"],
599*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
600*333d2b36SAndroid Build Coastguard Worker				}
601*333d2b36SAndroid Build Coastguard Worker				mock_library {
602*333d2b36SAndroid Build Coastguard Worker					name: "libsamepackage",
603*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
604*333d2b36SAndroid Build Coastguard Worker				}`),
605*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
606*333d2b36SAndroid Build Coastguard Worker				mock_library {
607*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
608*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
609*333d2b36SAndroid Build Coastguard Worker				}`),
610*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
611*333d2b36SAndroid Build Coastguard Worker				mock_library {
612*333d2b36SAndroid Build Coastguard Worker					name: "libother",
613*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
614*333d2b36SAndroid Build Coastguard Worker				}`),
615*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
616*333d2b36SAndroid Build Coastguard Worker				mock_library {
617*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
618*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
619*333d2b36SAndroid Build Coastguard Worker				}`),
620*333d2b36SAndroid Build Coastguard Worker		},
621*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
622*333d2b36SAndroid Build Coastguard Worker			`module "liboutsider" variant "android_common": depends on //top:libexample which is not` +
623*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
624*333d2b36SAndroid Build Coastguard Worker		},
625*333d2b36SAndroid Build Coastguard Worker	},
626*333d2b36SAndroid Build Coastguard Worker	{
627*333d2b36SAndroid Build Coastguard Worker		// Check that visibility is the union of the defaults modules.
628*333d2b36SAndroid Build Coastguard Worker		name: "defaults union, basic (notices)",
629*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
630*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
631*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
632*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
633*333d2b36SAndroid Build Coastguard Worker					visibility: ["//other"],
634*333d2b36SAndroid Build Coastguard Worker				}
635*333d2b36SAndroid Build Coastguard Worker				mock_library {
636*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
637*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/nested"],
638*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
639*333d2b36SAndroid Build Coastguard Worker				}
640*333d2b36SAndroid Build Coastguard Worker
641*333d2b36SAndroid Build Coastguard Worker				gen_notice {
642*333d2b36SAndroid Build Coastguard Worker					name: "libexample-notice",
643*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
644*333d2b36SAndroid Build Coastguard Worker				}`),
645*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
646*333d2b36SAndroid Build Coastguard Worker				gen_notice {
647*333d2b36SAndroid Build Coastguard Worker					name: "nested-notice",
648*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
649*333d2b36SAndroid Build Coastguard Worker				}`),
650*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
651*333d2b36SAndroid Build Coastguard Worker				gen_notice {
652*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
653*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
654*333d2b36SAndroid Build Coastguard Worker				}`),
655*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
656*333d2b36SAndroid Build Coastguard Worker				gen_notice {
657*333d2b36SAndroid Build Coastguard Worker					name: "outsider-notice",
658*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
659*333d2b36SAndroid Build Coastguard Worker				}`),
660*333d2b36SAndroid Build Coastguard Worker		},
661*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
662*333d2b36SAndroid Build Coastguard Worker			`module "outsider-notice" references "//top:libexample" which is not visible to this module`,
663*333d2b36SAndroid Build Coastguard Worker		},
664*333d2b36SAndroid Build Coastguard Worker	},
665*333d2b36SAndroid Build Coastguard Worker	{
666*333d2b36SAndroid Build Coastguard Worker		name: "defaults union, multiple defaults",
667*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
668*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
669*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
670*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_1",
671*333d2b36SAndroid Build Coastguard Worker					visibility: ["//other"],
672*333d2b36SAndroid Build Coastguard Worker				}
673*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
674*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_2",
675*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/nested"],
676*333d2b36SAndroid Build Coastguard Worker				}
677*333d2b36SAndroid Build Coastguard Worker				mock_library {
678*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
679*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults_1", "libexample_defaults_2"],
680*333d2b36SAndroid Build Coastguard Worker				}
681*333d2b36SAndroid Build Coastguard Worker				mock_library {
682*333d2b36SAndroid Build Coastguard Worker					name: "libsamepackage",
683*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
684*333d2b36SAndroid Build Coastguard Worker				}`),
685*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
686*333d2b36SAndroid Build Coastguard Worker				mock_library {
687*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
688*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
689*333d2b36SAndroid Build Coastguard Worker				}`),
690*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
691*333d2b36SAndroid Build Coastguard Worker				mock_library {
692*333d2b36SAndroid Build Coastguard Worker					name: "libother",
693*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
694*333d2b36SAndroid Build Coastguard Worker				}`),
695*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
696*333d2b36SAndroid Build Coastguard Worker				mock_library {
697*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
698*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
699*333d2b36SAndroid Build Coastguard Worker				}`),
700*333d2b36SAndroid Build Coastguard Worker		},
701*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
702*333d2b36SAndroid Build Coastguard Worker			`module "liboutsider" variant "android_common": depends on //top:libexample which is not` +
703*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
704*333d2b36SAndroid Build Coastguard Worker		},
705*333d2b36SAndroid Build Coastguard Worker	},
706*333d2b36SAndroid Build Coastguard Worker	{
707*333d2b36SAndroid Build Coastguard Worker		name: "defaults union, multiple defaults (notices)",
708*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
709*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
710*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
711*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_1",
712*333d2b36SAndroid Build Coastguard Worker					visibility: ["//other"],
713*333d2b36SAndroid Build Coastguard Worker				}
714*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
715*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_2",
716*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/nested"],
717*333d2b36SAndroid Build Coastguard Worker				}
718*333d2b36SAndroid Build Coastguard Worker				mock_library {
719*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
720*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults_1", "libexample_defaults_2"],
721*333d2b36SAndroid Build Coastguard Worker				}
722*333d2b36SAndroid Build Coastguard Worker
723*333d2b36SAndroid Build Coastguard Worker				gen_notice {
724*333d2b36SAndroid Build Coastguard Worker					name: "libexample-notice",
725*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
726*333d2b36SAndroid Build Coastguard Worker				}`),
727*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
728*333d2b36SAndroid Build Coastguard Worker				gen_notice {
729*333d2b36SAndroid Build Coastguard Worker					name: "nested-notice",
730*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
731*333d2b36SAndroid Build Coastguard Worker				}`),
732*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
733*333d2b36SAndroid Build Coastguard Worker				gen_notice {
734*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
735*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
736*333d2b36SAndroid Build Coastguard Worker				}`),
737*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
738*333d2b36SAndroid Build Coastguard Worker				gen_notice {
739*333d2b36SAndroid Build Coastguard Worker					name: "outsider-notice",
740*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
741*333d2b36SAndroid Build Coastguard Worker				}`),
742*333d2b36SAndroid Build Coastguard Worker		},
743*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
744*333d2b36SAndroid Build Coastguard Worker			`module "outsider-notice" references "//top:libexample" which is not visible to this module`,
745*333d2b36SAndroid Build Coastguard Worker		},
746*333d2b36SAndroid Build Coastguard Worker	},
747*333d2b36SAndroid Build Coastguard Worker	{
748*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:public mixed with other in defaults",
749*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
750*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
751*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
752*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
753*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public", "//namespace"],
754*333d2b36SAndroid Build Coastguard Worker				}
755*333d2b36SAndroid Build Coastguard Worker				mock_library {
756*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
757*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
758*333d2b36SAndroid Build Coastguard Worker				}`),
759*333d2b36SAndroid Build Coastguard Worker		},
760*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
761*333d2b36SAndroid Build Coastguard Worker			`module "libexample_defaults": visibility: cannot mix "//visibility:public"` +
762*333d2b36SAndroid Build Coastguard Worker				` with any other visibility rules`,
763*333d2b36SAndroid Build Coastguard Worker		},
764*333d2b36SAndroid Build Coastguard Worker	},
765*333d2b36SAndroid Build Coastguard Worker	{
766*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:public overriding defaults",
767*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
768*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
769*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
770*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
771*333d2b36SAndroid Build Coastguard Worker					visibility: ["//namespace"],
772*333d2b36SAndroid Build Coastguard Worker				}
773*333d2b36SAndroid Build Coastguard Worker				mock_library {
774*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
775*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
776*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
777*333d2b36SAndroid Build Coastguard Worker				}`),
778*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
779*333d2b36SAndroid Build Coastguard Worker				mock_library {
780*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
781*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
782*333d2b36SAndroid Build Coastguard Worker				}`),
783*333d2b36SAndroid Build Coastguard Worker		},
784*333d2b36SAndroid Build Coastguard Worker		effectiveVisibility: map[qualifiedModuleName][]string{
785*333d2b36SAndroid Build Coastguard Worker			qualifiedModuleName{pkg: "top", name: "libexample"}: {"//visibility:public"},
786*333d2b36SAndroid Build Coastguard Worker		},
787*333d2b36SAndroid Build Coastguard Worker	},
788*333d2b36SAndroid Build Coastguard Worker	{
789*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:public overriding defaults (notices)",
790*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
791*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
792*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
793*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
794*333d2b36SAndroid Build Coastguard Worker					visibility: ["//namespace"],
795*333d2b36SAndroid Build Coastguard Worker				}
796*333d2b36SAndroid Build Coastguard Worker				mock_library {
797*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
798*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
799*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
800*333d2b36SAndroid Build Coastguard Worker				}`),
801*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
802*333d2b36SAndroid Build Coastguard Worker				gen_notice {
803*333d2b36SAndroid Build Coastguard Worker					name: "outsider-notice",
804*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
805*333d2b36SAndroid Build Coastguard Worker				}`),
806*333d2b36SAndroid Build Coastguard Worker		},
807*333d2b36SAndroid Build Coastguard Worker		effectiveVisibility: map[qualifiedModuleName][]string{
808*333d2b36SAndroid Build Coastguard Worker			qualifiedModuleName{pkg: "top", name: "libexample"}: {"//visibility:public"},
809*333d2b36SAndroid Build Coastguard Worker		},
810*333d2b36SAndroid Build Coastguard Worker	},
811*333d2b36SAndroid Build Coastguard Worker	{
812*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:public mixed with other from different defaults 1",
813*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
814*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
815*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
816*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_1",
817*333d2b36SAndroid Build Coastguard Worker					visibility: ["//namespace"],
818*333d2b36SAndroid Build Coastguard Worker				}
819*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
820*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_2",
821*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
822*333d2b36SAndroid Build Coastguard Worker				}
823*333d2b36SAndroid Build Coastguard Worker				mock_library {
824*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
825*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults_1", "libexample_defaults_2"],
826*333d2b36SAndroid Build Coastguard Worker				}`),
827*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
828*333d2b36SAndroid Build Coastguard Worker				mock_library {
829*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
830*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
831*333d2b36SAndroid Build Coastguard Worker				}`),
832*333d2b36SAndroid Build Coastguard Worker		},
833*333d2b36SAndroid Build Coastguard Worker	},
834*333d2b36SAndroid Build Coastguard Worker	{
835*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:public mixed with other from different defaults 1",
836*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
837*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
838*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
839*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_1",
840*333d2b36SAndroid Build Coastguard Worker					visibility: ["//namespace"],
841*333d2b36SAndroid Build Coastguard Worker				}
842*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
843*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_2",
844*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
845*333d2b36SAndroid Build Coastguard Worker				}
846*333d2b36SAndroid Build Coastguard Worker				mock_library {
847*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
848*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults_1", "libexample_defaults_2"],
849*333d2b36SAndroid Build Coastguard Worker				}
850*333d2b36SAndroid Build Coastguard Worker
851*333d2b36SAndroid Build Coastguard Worker				gen_notice {
852*333d2b36SAndroid Build Coastguard Worker					name: "libexample-notice",
853*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
854*333d2b36SAndroid Build Coastguard Worker				}`),
855*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
856*333d2b36SAndroid Build Coastguard Worker				gen_notice {
857*333d2b36SAndroid Build Coastguard Worker					name: "outsider-notice",
858*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
859*333d2b36SAndroid Build Coastguard Worker				}`),
860*333d2b36SAndroid Build Coastguard Worker		},
861*333d2b36SAndroid Build Coastguard Worker	},
862*333d2b36SAndroid Build Coastguard Worker	{
863*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:public mixed with other from different defaults 2",
864*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
865*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
866*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
867*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_1",
868*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
869*333d2b36SAndroid Build Coastguard Worker				}
870*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
871*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_2",
872*333d2b36SAndroid Build Coastguard Worker					visibility: ["//namespace"],
873*333d2b36SAndroid Build Coastguard Worker				}
874*333d2b36SAndroid Build Coastguard Worker				mock_library {
875*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
876*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults_1", "libexample_defaults_2"],
877*333d2b36SAndroid Build Coastguard Worker				}`),
878*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
879*333d2b36SAndroid Build Coastguard Worker				mock_library {
880*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
881*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
882*333d2b36SAndroid Build Coastguard Worker				}`),
883*333d2b36SAndroid Build Coastguard Worker		},
884*333d2b36SAndroid Build Coastguard Worker	},
885*333d2b36SAndroid Build Coastguard Worker	{
886*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:public mixed with other from different defaults 2 (notices)",
887*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
888*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
889*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
890*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_1",
891*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
892*333d2b36SAndroid Build Coastguard Worker				}
893*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
894*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_2",
895*333d2b36SAndroid Build Coastguard Worker					visibility: ["//namespace"],
896*333d2b36SAndroid Build Coastguard Worker				}
897*333d2b36SAndroid Build Coastguard Worker				mock_library {
898*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
899*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults_1", "libexample_defaults_2"],
900*333d2b36SAndroid Build Coastguard Worker				}`),
901*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
902*333d2b36SAndroid Build Coastguard Worker				gen_notice {
903*333d2b36SAndroid Build Coastguard Worker					name: "outsider-notice",
904*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
905*333d2b36SAndroid Build Coastguard Worker				}`),
906*333d2b36SAndroid Build Coastguard Worker		},
907*333d2b36SAndroid Build Coastguard Worker	},
908*333d2b36SAndroid Build Coastguard Worker	{
909*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:private in defaults",
910*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
911*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
912*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
913*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
914*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
915*333d2b36SAndroid Build Coastguard Worker				}
916*333d2b36SAndroid Build Coastguard Worker				mock_library {
917*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
918*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
919*333d2b36SAndroid Build Coastguard Worker				}
920*333d2b36SAndroid Build Coastguard Worker				mock_library {
921*333d2b36SAndroid Build Coastguard Worker					name: "libsamepackage",
922*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
923*333d2b36SAndroid Build Coastguard Worker				}`),
924*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
925*333d2b36SAndroid Build Coastguard Worker				mock_library {
926*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
927*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
928*333d2b36SAndroid Build Coastguard Worker				}`),
929*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
930*333d2b36SAndroid Build Coastguard Worker				mock_library {
931*333d2b36SAndroid Build Coastguard Worker					name: "libother",
932*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
933*333d2b36SAndroid Build Coastguard Worker				}`),
934*333d2b36SAndroid Build Coastguard Worker		},
935*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
936*333d2b36SAndroid Build Coastguard Worker			`module "libnested" variant "android_common": depends on //top:libexample which is not` +
937*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
938*333d2b36SAndroid Build Coastguard Worker			`module "libother" variant "android_common": depends on //top:libexample which is not` +
939*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
940*333d2b36SAndroid Build Coastguard Worker		},
941*333d2b36SAndroid Build Coastguard Worker	},
942*333d2b36SAndroid Build Coastguard Worker	{
943*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:private in defaults (notices)",
944*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
945*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
946*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
947*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
948*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
949*333d2b36SAndroid Build Coastguard Worker				}
950*333d2b36SAndroid Build Coastguard Worker				mock_library {
951*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
952*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
953*333d2b36SAndroid Build Coastguard Worker				}
954*333d2b36SAndroid Build Coastguard Worker
955*333d2b36SAndroid Build Coastguard Worker				gen_notice {
956*333d2b36SAndroid Build Coastguard Worker					name: "libexample-notice",
957*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
958*333d2b36SAndroid Build Coastguard Worker				}`),
959*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
960*333d2b36SAndroid Build Coastguard Worker				gen_notice {
961*333d2b36SAndroid Build Coastguard Worker					name: "nested-notice",
962*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
963*333d2b36SAndroid Build Coastguard Worker				}`),
964*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
965*333d2b36SAndroid Build Coastguard Worker				gen_notice {
966*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
967*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
968*333d2b36SAndroid Build Coastguard Worker				}`),
969*333d2b36SAndroid Build Coastguard Worker		},
970*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
971*333d2b36SAndroid Build Coastguard Worker			`module "nested-notice" references "//top:libexample" which is not visible to this module`,
972*333d2b36SAndroid Build Coastguard Worker			`module "other-notice" references "//top:libexample" which is not visible to this module`,
973*333d2b36SAndroid Build Coastguard Worker		},
974*333d2b36SAndroid Build Coastguard Worker	},
975*333d2b36SAndroid Build Coastguard Worker	{
976*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:private mixed with other in defaults",
977*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
978*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
979*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
980*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
981*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private", "//namespace"],
982*333d2b36SAndroid Build Coastguard Worker				}
983*333d2b36SAndroid Build Coastguard Worker				mock_library {
984*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
985*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
986*333d2b36SAndroid Build Coastguard Worker				}`),
987*333d2b36SAndroid Build Coastguard Worker		},
988*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
989*333d2b36SAndroid Build Coastguard Worker			`module "libexample_defaults": visibility: cannot mix "//visibility:private"` +
990*333d2b36SAndroid Build Coastguard Worker				` with any other visibility rules`,
991*333d2b36SAndroid Build Coastguard Worker		},
992*333d2b36SAndroid Build Coastguard Worker	},
993*333d2b36SAndroid Build Coastguard Worker	{
994*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:private overriding defaults",
995*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
996*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
997*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
998*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
999*333d2b36SAndroid Build Coastguard Worker					visibility: ["//namespace"],
1000*333d2b36SAndroid Build Coastguard Worker				}
1001*333d2b36SAndroid Build Coastguard Worker				mock_library {
1002*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1003*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1004*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
1005*333d2b36SAndroid Build Coastguard Worker				}`),
1006*333d2b36SAndroid Build Coastguard Worker		},
1007*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1008*333d2b36SAndroid Build Coastguard Worker			`module "libexample": visibility: cannot mix "//visibility:private"` +
1009*333d2b36SAndroid Build Coastguard Worker				` with any other visibility rules`,
1010*333d2b36SAndroid Build Coastguard Worker		},
1011*333d2b36SAndroid Build Coastguard Worker	},
1012*333d2b36SAndroid Build Coastguard Worker	{
1013*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:private in defaults overridden",
1014*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1015*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1016*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1017*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
1018*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1019*333d2b36SAndroid Build Coastguard Worker				}
1020*333d2b36SAndroid Build Coastguard Worker				mock_library {
1021*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1022*333d2b36SAndroid Build Coastguard Worker					visibility: ["//namespace"],
1023*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
1024*333d2b36SAndroid Build Coastguard Worker				}`),
1025*333d2b36SAndroid Build Coastguard Worker		},
1026*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1027*333d2b36SAndroid Build Coastguard Worker			`module "libexample": visibility: cannot mix "//visibility:private"` +
1028*333d2b36SAndroid Build Coastguard Worker				` with any other visibility rules`,
1029*333d2b36SAndroid Build Coastguard Worker		},
1030*333d2b36SAndroid Build Coastguard Worker	},
1031*333d2b36SAndroid Build Coastguard Worker	{
1032*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:private override //visibility:public",
1033*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1034*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1035*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1036*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
1037*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
1038*333d2b36SAndroid Build Coastguard Worker				}
1039*333d2b36SAndroid Build Coastguard Worker				mock_library {
1040*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1041*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1042*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
1043*333d2b36SAndroid Build Coastguard Worker				}`),
1044*333d2b36SAndroid Build Coastguard Worker		},
1045*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1046*333d2b36SAndroid Build Coastguard Worker			`module "libexample": visibility: cannot mix "//visibility:private" with any other visibility rules`,
1047*333d2b36SAndroid Build Coastguard Worker		},
1048*333d2b36SAndroid Build Coastguard Worker	},
1049*333d2b36SAndroid Build Coastguard Worker	{
1050*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:public override //visibility:private",
1051*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1052*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1053*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1054*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
1055*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1056*333d2b36SAndroid Build Coastguard Worker				}
1057*333d2b36SAndroid Build Coastguard Worker				mock_library {
1058*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1059*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
1060*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
1061*333d2b36SAndroid Build Coastguard Worker				}`),
1062*333d2b36SAndroid Build Coastguard Worker		},
1063*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1064*333d2b36SAndroid Build Coastguard Worker			`module "libexample": visibility: cannot mix "//visibility:private" with any other visibility rules`,
1065*333d2b36SAndroid Build Coastguard Worker		},
1066*333d2b36SAndroid Build Coastguard Worker	},
1067*333d2b36SAndroid Build Coastguard Worker	{
1068*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:override must be first in the list",
1069*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1070*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1071*333d2b36SAndroid Build Coastguard Worker				mock_library {
1072*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1073*333d2b36SAndroid Build Coastguard Worker					visibility: ["//other", "//visibility:override", "//namespace"],
1074*333d2b36SAndroid Build Coastguard Worker				}`),
1075*333d2b36SAndroid Build Coastguard Worker		},
1076*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1077*333d2b36SAndroid Build Coastguard Worker			`module "libexample": visibility: "//visibility:override" may only be used at the start of the visibility rules`,
1078*333d2b36SAndroid Build Coastguard Worker		},
1079*333d2b36SAndroid Build Coastguard Worker	},
1080*333d2b36SAndroid Build Coastguard Worker	{
1081*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:override discards //visibility:private",
1082*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1083*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1084*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1085*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
1086*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1087*333d2b36SAndroid Build Coastguard Worker				}
1088*333d2b36SAndroid Build Coastguard Worker				mock_library {
1089*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1090*333d2b36SAndroid Build Coastguard Worker					// Make this visibility to //other but not //visibility:private
1091*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:override", "//other"],
1092*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
1093*333d2b36SAndroid Build Coastguard Worker				}`),
1094*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
1095*333d2b36SAndroid Build Coastguard Worker				mock_library {
1096*333d2b36SAndroid Build Coastguard Worker					name: "libother",
1097*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
1098*333d2b36SAndroid Build Coastguard Worker				}`),
1099*333d2b36SAndroid Build Coastguard Worker		},
1100*333d2b36SAndroid Build Coastguard Worker	},
1101*333d2b36SAndroid Build Coastguard Worker	{
1102*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:override discards //visibility:private (notices)",
1103*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1104*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1105*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1106*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
1107*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1108*333d2b36SAndroid Build Coastguard Worker				}
1109*333d2b36SAndroid Build Coastguard Worker				mock_library {
1110*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1111*333d2b36SAndroid Build Coastguard Worker					// Make this visibility to //other but not //visibility:private
1112*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:override", "//other"],
1113*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
1114*333d2b36SAndroid Build Coastguard Worker				}`),
1115*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
1116*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1117*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
1118*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
1119*333d2b36SAndroid Build Coastguard Worker				}`),
1120*333d2b36SAndroid Build Coastguard Worker		},
1121*333d2b36SAndroid Build Coastguard Worker	},
1122*333d2b36SAndroid Build Coastguard Worker	{
1123*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:override discards //visibility:public",
1124*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1125*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1126*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1127*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
1128*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
1129*333d2b36SAndroid Build Coastguard Worker				}
1130*333d2b36SAndroid Build Coastguard Worker				mock_library {
1131*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1132*333d2b36SAndroid Build Coastguard Worker					// Make this visibility to //other but not //visibility:public
1133*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:override", "//other"],
1134*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
1135*333d2b36SAndroid Build Coastguard Worker				}`),
1136*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
1137*333d2b36SAndroid Build Coastguard Worker				mock_library {
1138*333d2b36SAndroid Build Coastguard Worker					name: "libother",
1139*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
1140*333d2b36SAndroid Build Coastguard Worker				}`),
1141*333d2b36SAndroid Build Coastguard Worker			"namespace/Android.bp": []byte(`
1142*333d2b36SAndroid Build Coastguard Worker				mock_library {
1143*333d2b36SAndroid Build Coastguard Worker					name: "libnamespace",
1144*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
1145*333d2b36SAndroid Build Coastguard Worker				}`),
1146*333d2b36SAndroid Build Coastguard Worker		},
1147*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1148*333d2b36SAndroid Build Coastguard Worker			`module "libnamespace" variant "android_common": depends on //top:libexample which is not visible to this module\nYou may need to add "//namespace" to its visibility`,
1149*333d2b36SAndroid Build Coastguard Worker		},
1150*333d2b36SAndroid Build Coastguard Worker	},
1151*333d2b36SAndroid Build Coastguard Worker	{
1152*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:override discards //visibility:public (notices)",
1153*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1154*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1155*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1156*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
1157*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
1158*333d2b36SAndroid Build Coastguard Worker				}
1159*333d2b36SAndroid Build Coastguard Worker				mock_library {
1160*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1161*333d2b36SAndroid Build Coastguard Worker					// Make this visibility to //other but not //visibility:public
1162*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:override", "//other"],
1163*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
1164*333d2b36SAndroid Build Coastguard Worker				}`),
1165*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
1166*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1167*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
1168*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
1169*333d2b36SAndroid Build Coastguard Worker				}`),
1170*333d2b36SAndroid Build Coastguard Worker			"namespace/Android.bp": []byte(`
1171*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1172*333d2b36SAndroid Build Coastguard Worker					name: "namespace-notice",
1173*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
1174*333d2b36SAndroid Build Coastguard Worker				}`),
1175*333d2b36SAndroid Build Coastguard Worker		},
1176*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1177*333d2b36SAndroid Build Coastguard Worker			`module "namespace-notice" references "//top:libexample" which is not visible to this module\nYou may need to add "//namespace" to its visibility`,
1178*333d2b36SAndroid Build Coastguard Worker		},
1179*333d2b36SAndroid Build Coastguard Worker	},
1180*333d2b36SAndroid Build Coastguard Worker	{
1181*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:override discards defaults supplied rules",
1182*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1183*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1184*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1185*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
1186*333d2b36SAndroid Build Coastguard Worker					visibility: ["//namespace"],
1187*333d2b36SAndroid Build Coastguard Worker				}
1188*333d2b36SAndroid Build Coastguard Worker				mock_library {
1189*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1190*333d2b36SAndroid Build Coastguard Worker					// Make this visibility to //other but not //namespace
1191*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:override", "//other"],
1192*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
1193*333d2b36SAndroid Build Coastguard Worker				}`),
1194*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
1195*333d2b36SAndroid Build Coastguard Worker				mock_library {
1196*333d2b36SAndroid Build Coastguard Worker					name: "libother",
1197*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
1198*333d2b36SAndroid Build Coastguard Worker				}`),
1199*333d2b36SAndroid Build Coastguard Worker			"namespace/Android.bp": []byte(`
1200*333d2b36SAndroid Build Coastguard Worker				mock_library {
1201*333d2b36SAndroid Build Coastguard Worker					name: "libnamespace",
1202*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
1203*333d2b36SAndroid Build Coastguard Worker				}`),
1204*333d2b36SAndroid Build Coastguard Worker		},
1205*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1206*333d2b36SAndroid Build Coastguard Worker			`module "libnamespace" variant "android_common": depends on //top:libexample which is not visible to this module\nYou may need to add "//namespace" to its visibility`,
1207*333d2b36SAndroid Build Coastguard Worker		},
1208*333d2b36SAndroid Build Coastguard Worker	},
1209*333d2b36SAndroid Build Coastguard Worker	{
1210*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:override discards defaults supplied rules (notices)",
1211*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1212*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1213*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1214*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
1215*333d2b36SAndroid Build Coastguard Worker					visibility: ["//namespace"],
1216*333d2b36SAndroid Build Coastguard Worker				}
1217*333d2b36SAndroid Build Coastguard Worker				mock_library {
1218*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1219*333d2b36SAndroid Build Coastguard Worker					// Make this visibility to //other but not //namespace
1220*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:override", "//other"],
1221*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
1222*333d2b36SAndroid Build Coastguard Worker				}`),
1223*333d2b36SAndroid Build Coastguard Worker			"other/Android.bp": []byte(`
1224*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1225*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
1226*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
1227*333d2b36SAndroid Build Coastguard Worker				}`),
1228*333d2b36SAndroid Build Coastguard Worker			"namespace/Android.bp": []byte(`
1229*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1230*333d2b36SAndroid Build Coastguard Worker					name: "namespace-notice",
1231*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
1232*333d2b36SAndroid Build Coastguard Worker				}`),
1233*333d2b36SAndroid Build Coastguard Worker		},
1234*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1235*333d2b36SAndroid Build Coastguard Worker			`module "namespace-notice" references "//top:libexample" which is not visible to this module\nYou may need to add "//namespace" to its visibility`,
1236*333d2b36SAndroid Build Coastguard Worker		},
1237*333d2b36SAndroid Build Coastguard Worker	},
1238*333d2b36SAndroid Build Coastguard Worker	{
1239*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:override can override //visibility:public with //visibility:private",
1240*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1241*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1242*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1243*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
1244*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
1245*333d2b36SAndroid Build Coastguard Worker				}
1246*333d2b36SAndroid Build Coastguard Worker				mock_library {
1247*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1248*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:override", "//visibility:private"],
1249*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
1250*333d2b36SAndroid Build Coastguard Worker				}`),
1251*333d2b36SAndroid Build Coastguard Worker			"namespace/Android.bp": []byte(`
1252*333d2b36SAndroid Build Coastguard Worker				mock_library {
1253*333d2b36SAndroid Build Coastguard Worker					name: "libnamespace",
1254*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
1255*333d2b36SAndroid Build Coastguard Worker				}`),
1256*333d2b36SAndroid Build Coastguard Worker		},
1257*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1258*333d2b36SAndroid Build Coastguard Worker			`module "libnamespace" variant "android_common": depends on //top:libexample which is not visible to this module`,
1259*333d2b36SAndroid Build Coastguard Worker		},
1260*333d2b36SAndroid Build Coastguard Worker	},
1261*333d2b36SAndroid Build Coastguard Worker	{
1262*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:override can override //visibility:public with //visibility:private (notices)",
1263*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1264*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1265*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1266*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
1267*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
1268*333d2b36SAndroid Build Coastguard Worker				}
1269*333d2b36SAndroid Build Coastguard Worker				mock_library {
1270*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1271*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:override", "//visibility:private"],
1272*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
1273*333d2b36SAndroid Build Coastguard Worker				}`),
1274*333d2b36SAndroid Build Coastguard Worker			"namespace/Android.bp": []byte(`
1275*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1276*333d2b36SAndroid Build Coastguard Worker					name: "namespace-notice",
1277*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
1278*333d2b36SAndroid Build Coastguard Worker				}`),
1279*333d2b36SAndroid Build Coastguard Worker		},
1280*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1281*333d2b36SAndroid Build Coastguard Worker			`module "namespace-notice" references "//top:libexample" which is not visible to this module`,
1282*333d2b36SAndroid Build Coastguard Worker		},
1283*333d2b36SAndroid Build Coastguard Worker	},
1284*333d2b36SAndroid Build Coastguard Worker	{
1285*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:override can override //visibility:private with //visibility:public",
1286*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1287*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1288*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1289*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
1290*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1291*333d2b36SAndroid Build Coastguard Worker				}
1292*333d2b36SAndroid Build Coastguard Worker				mock_library {
1293*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1294*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:override", "//visibility:public"],
1295*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
1296*333d2b36SAndroid Build Coastguard Worker				}`),
1297*333d2b36SAndroid Build Coastguard Worker			"namespace/Android.bp": []byte(`
1298*333d2b36SAndroid Build Coastguard Worker				mock_library {
1299*333d2b36SAndroid Build Coastguard Worker					name: "libnamespace",
1300*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
1301*333d2b36SAndroid Build Coastguard Worker				}`),
1302*333d2b36SAndroid Build Coastguard Worker		},
1303*333d2b36SAndroid Build Coastguard Worker	},
1304*333d2b36SAndroid Build Coastguard Worker	{
1305*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:override can override //visibility:private with //visibility:public (notices)",
1306*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1307*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1308*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1309*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults",
1310*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1311*333d2b36SAndroid Build Coastguard Worker				}
1312*333d2b36SAndroid Build Coastguard Worker				mock_library {
1313*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1314*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:override", "//visibility:public"],
1315*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults"],
1316*333d2b36SAndroid Build Coastguard Worker				}`),
1317*333d2b36SAndroid Build Coastguard Worker			"namespace/Android.bp": []byte(`
1318*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1319*333d2b36SAndroid Build Coastguard Worker					name: "namespace-notice",
1320*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
1321*333d2b36SAndroid Build Coastguard Worker				}`),
1322*333d2b36SAndroid Build Coastguard Worker		},
1323*333d2b36SAndroid Build Coastguard Worker	},
1324*333d2b36SAndroid Build Coastguard Worker	{
1325*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:private mixed with itself",
1326*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1327*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1328*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1329*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_1",
1330*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1331*333d2b36SAndroid Build Coastguard Worker				}
1332*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1333*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_2",
1334*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1335*333d2b36SAndroid Build Coastguard Worker				}
1336*333d2b36SAndroid Build Coastguard Worker				mock_library {
1337*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1338*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1339*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults_1", "libexample_defaults_2"],
1340*333d2b36SAndroid Build Coastguard Worker				}`),
1341*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
1342*333d2b36SAndroid Build Coastguard Worker				mock_library {
1343*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
1344*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
1345*333d2b36SAndroid Build Coastguard Worker				}`),
1346*333d2b36SAndroid Build Coastguard Worker		},
1347*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1348*333d2b36SAndroid Build Coastguard Worker			`module "liboutsider" variant "android_common": depends on //top:libexample which is not` +
1349*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
1350*333d2b36SAndroid Build Coastguard Worker		},
1351*333d2b36SAndroid Build Coastguard Worker	},
1352*333d2b36SAndroid Build Coastguard Worker	{
1353*333d2b36SAndroid Build Coastguard Worker		name: "//visibility:private mixed with itself (notices)",
1354*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1355*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1356*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1357*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_1",
1358*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1359*333d2b36SAndroid Build Coastguard Worker				}
1360*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1361*333d2b36SAndroid Build Coastguard Worker					name: "libexample_defaults_2",
1362*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1363*333d2b36SAndroid Build Coastguard Worker				}
1364*333d2b36SAndroid Build Coastguard Worker				mock_library {
1365*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1366*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1367*333d2b36SAndroid Build Coastguard Worker					defaults: ["libexample_defaults_1", "libexample_defaults_2"],
1368*333d2b36SAndroid Build Coastguard Worker				}`),
1369*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
1370*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1371*333d2b36SAndroid Build Coastguard Worker					name: "outsider-notice",
1372*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
1373*333d2b36SAndroid Build Coastguard Worker				}`),
1374*333d2b36SAndroid Build Coastguard Worker		},
1375*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1376*333d2b36SAndroid Build Coastguard Worker			`module "outsider-notice" references "//top:libexample" which is not visible to this module`,
1377*333d2b36SAndroid Build Coastguard Worker		},
1378*333d2b36SAndroid Build Coastguard Worker	},
1379*333d2b36SAndroid Build Coastguard Worker
1380*333d2b36SAndroid Build Coastguard Worker	// Defaults module's defaults_visibility tests
1381*333d2b36SAndroid Build Coastguard Worker	{
1382*333d2b36SAndroid Build Coastguard Worker		name: "defaults_visibility invalid",
1383*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1384*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1385*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1386*333d2b36SAndroid Build Coastguard Worker					name: "top_defaults",
1387*333d2b36SAndroid Build Coastguard Worker					defaults_visibility: ["//visibility:invalid"],
1388*333d2b36SAndroid Build Coastguard Worker				}`),
1389*333d2b36SAndroid Build Coastguard Worker		},
1390*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1391*333d2b36SAndroid Build Coastguard Worker			`defaults_visibility: unrecognized visibility rule "//visibility:invalid"`,
1392*333d2b36SAndroid Build Coastguard Worker		},
1393*333d2b36SAndroid Build Coastguard Worker	},
1394*333d2b36SAndroid Build Coastguard Worker	{
1395*333d2b36SAndroid Build Coastguard Worker		name: "defaults_visibility overrides package default",
1396*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1397*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1398*333d2b36SAndroid Build Coastguard Worker				package {
1399*333d2b36SAndroid Build Coastguard Worker					default_visibility: ["//visibility:private"],
1400*333d2b36SAndroid Build Coastguard Worker				}
1401*333d2b36SAndroid Build Coastguard Worker				mock_defaults {
1402*333d2b36SAndroid Build Coastguard Worker					name: "top_defaults",
1403*333d2b36SAndroid Build Coastguard Worker					defaults_visibility: ["//visibility:public"],
1404*333d2b36SAndroid Build Coastguard Worker				}`),
1405*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
1406*333d2b36SAndroid Build Coastguard Worker				mock_library {
1407*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
1408*333d2b36SAndroid Build Coastguard Worker					defaults: ["top_defaults"],
1409*333d2b36SAndroid Build Coastguard Worker				}`),
1410*333d2b36SAndroid Build Coastguard Worker		},
1411*333d2b36SAndroid Build Coastguard Worker	},
1412*333d2b36SAndroid Build Coastguard Worker
1413*333d2b36SAndroid Build Coastguard Worker	// Package default_visibility tests
1414*333d2b36SAndroid Build Coastguard Worker	{
1415*333d2b36SAndroid Build Coastguard Worker		name: "package default_visibility property is checked",
1416*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1417*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1418*333d2b36SAndroid Build Coastguard Worker				package {
1419*333d2b36SAndroid Build Coastguard Worker					default_visibility: ["//visibility:invalid"],
1420*333d2b36SAndroid Build Coastguard Worker				}`),
1421*333d2b36SAndroid Build Coastguard Worker		},
1422*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`default_visibility: unrecognized visibility rule "//visibility:invalid"`},
1423*333d2b36SAndroid Build Coastguard Worker	},
1424*333d2b36SAndroid Build Coastguard Worker	{
1425*333d2b36SAndroid Build Coastguard Worker		// This test relies on the default visibility being legacy_public.
1426*333d2b36SAndroid Build Coastguard Worker		name: "package default_visibility property used when no visibility specified",
1427*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1428*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1429*333d2b36SAndroid Build Coastguard Worker				package {
1430*333d2b36SAndroid Build Coastguard Worker					default_visibility: ["//visibility:private"],
1431*333d2b36SAndroid Build Coastguard Worker				}
1432*333d2b36SAndroid Build Coastguard Worker
1433*333d2b36SAndroid Build Coastguard Worker				mock_library {
1434*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1435*333d2b36SAndroid Build Coastguard Worker				}`),
1436*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
1437*333d2b36SAndroid Build Coastguard Worker				mock_library {
1438*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
1439*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
1440*333d2b36SAndroid Build Coastguard Worker				}`),
1441*333d2b36SAndroid Build Coastguard Worker		},
1442*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1443*333d2b36SAndroid Build Coastguard Worker			`module "liboutsider" variant "android_common": depends on //top:libexample which is not` +
1444*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
1445*333d2b36SAndroid Build Coastguard Worker		},
1446*333d2b36SAndroid Build Coastguard Worker	},
1447*333d2b36SAndroid Build Coastguard Worker	{
1448*333d2b36SAndroid Build Coastguard Worker		// This test relies on the default visibility being legacy_public.
1449*333d2b36SAndroid Build Coastguard Worker		name: "package default_visibility property used when no visibility specified (notices)",
1450*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1451*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1452*333d2b36SAndroid Build Coastguard Worker				package {
1453*333d2b36SAndroid Build Coastguard Worker					default_visibility: ["//visibility:private"],
1454*333d2b36SAndroid Build Coastguard Worker				}
1455*333d2b36SAndroid Build Coastguard Worker
1456*333d2b36SAndroid Build Coastguard Worker				mock_library {
1457*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1458*333d2b36SAndroid Build Coastguard Worker				}`),
1459*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
1460*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1461*333d2b36SAndroid Build Coastguard Worker					name: "outsider-notice",
1462*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
1463*333d2b36SAndroid Build Coastguard Worker				}`),
1464*333d2b36SAndroid Build Coastguard Worker		},
1465*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1466*333d2b36SAndroid Build Coastguard Worker			`module "outsider-notice" references "//top:libexample" which is not visible to this module`,
1467*333d2b36SAndroid Build Coastguard Worker		},
1468*333d2b36SAndroid Build Coastguard Worker	},
1469*333d2b36SAndroid Build Coastguard Worker	{
1470*333d2b36SAndroid Build Coastguard Worker		name: "package default_visibility public does not override visibility private",
1471*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1472*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1473*333d2b36SAndroid Build Coastguard Worker				package {
1474*333d2b36SAndroid Build Coastguard Worker					default_visibility: ["//visibility:public"],
1475*333d2b36SAndroid Build Coastguard Worker				}
1476*333d2b36SAndroid Build Coastguard Worker
1477*333d2b36SAndroid Build Coastguard Worker				mock_library {
1478*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1479*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1480*333d2b36SAndroid Build Coastguard Worker				}`),
1481*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
1482*333d2b36SAndroid Build Coastguard Worker				mock_library {
1483*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
1484*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
1485*333d2b36SAndroid Build Coastguard Worker				}`),
1486*333d2b36SAndroid Build Coastguard Worker		},
1487*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1488*333d2b36SAndroid Build Coastguard Worker			`module "liboutsider" variant "android_common": depends on //top:libexample which is not` +
1489*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
1490*333d2b36SAndroid Build Coastguard Worker		},
1491*333d2b36SAndroid Build Coastguard Worker	},
1492*333d2b36SAndroid Build Coastguard Worker	{
1493*333d2b36SAndroid Build Coastguard Worker		name: "package default_visibility public does not override visibility private (notices)",
1494*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1495*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1496*333d2b36SAndroid Build Coastguard Worker				package {
1497*333d2b36SAndroid Build Coastguard Worker					default_visibility: ["//visibility:public"],
1498*333d2b36SAndroid Build Coastguard Worker				}
1499*333d2b36SAndroid Build Coastguard Worker
1500*333d2b36SAndroid Build Coastguard Worker				mock_library {
1501*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1502*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:private"],
1503*333d2b36SAndroid Build Coastguard Worker				}`),
1504*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
1505*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1506*333d2b36SAndroid Build Coastguard Worker					name: "outsider-notice",
1507*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
1508*333d2b36SAndroid Build Coastguard Worker				}`),
1509*333d2b36SAndroid Build Coastguard Worker		},
1510*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1511*333d2b36SAndroid Build Coastguard Worker			`module "outsider-notice" references "//top:libexample" which is not visible to this module`,
1512*333d2b36SAndroid Build Coastguard Worker		},
1513*333d2b36SAndroid Build Coastguard Worker	},
1514*333d2b36SAndroid Build Coastguard Worker	{
1515*333d2b36SAndroid Build Coastguard Worker		name: "package default_visibility private does not override visibility public",
1516*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1517*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1518*333d2b36SAndroid Build Coastguard Worker				package {
1519*333d2b36SAndroid Build Coastguard Worker					default_visibility: ["//visibility:private"],
1520*333d2b36SAndroid Build Coastguard Worker				}
1521*333d2b36SAndroid Build Coastguard Worker
1522*333d2b36SAndroid Build Coastguard Worker				mock_library {
1523*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1524*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
1525*333d2b36SAndroid Build Coastguard Worker				}`),
1526*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
1527*333d2b36SAndroid Build Coastguard Worker				mock_library {
1528*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
1529*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
1530*333d2b36SAndroid Build Coastguard Worker				}`),
1531*333d2b36SAndroid Build Coastguard Worker		},
1532*333d2b36SAndroid Build Coastguard Worker	},
1533*333d2b36SAndroid Build Coastguard Worker	{
1534*333d2b36SAndroid Build Coastguard Worker		name: "package default_visibility private does not override visibility public (notices)",
1535*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1536*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1537*333d2b36SAndroid Build Coastguard Worker				package {
1538*333d2b36SAndroid Build Coastguard Worker					default_visibility: ["//visibility:private"],
1539*333d2b36SAndroid Build Coastguard Worker				}
1540*333d2b36SAndroid Build Coastguard Worker
1541*333d2b36SAndroid Build Coastguard Worker				mock_library {
1542*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1543*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:public"],
1544*333d2b36SAndroid Build Coastguard Worker				}`),
1545*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
1546*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1547*333d2b36SAndroid Build Coastguard Worker					name: "outsider-notice",
1548*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
1549*333d2b36SAndroid Build Coastguard Worker				}`),
1550*333d2b36SAndroid Build Coastguard Worker		},
1551*333d2b36SAndroid Build Coastguard Worker	},
1552*333d2b36SAndroid Build Coastguard Worker	{
1553*333d2b36SAndroid Build Coastguard Worker		name: "package default_visibility :__subpackages__",
1554*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1555*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1556*333d2b36SAndroid Build Coastguard Worker				package {
1557*333d2b36SAndroid Build Coastguard Worker					default_visibility: [":__subpackages__"],
1558*333d2b36SAndroid Build Coastguard Worker				}
1559*333d2b36SAndroid Build Coastguard Worker
1560*333d2b36SAndroid Build Coastguard Worker				mock_library {
1561*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1562*333d2b36SAndroid Build Coastguard Worker				}`),
1563*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
1564*333d2b36SAndroid Build Coastguard Worker				mock_library {
1565*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
1566*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
1567*333d2b36SAndroid Build Coastguard Worker				}`),
1568*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
1569*333d2b36SAndroid Build Coastguard Worker				mock_library {
1570*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
1571*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
1572*333d2b36SAndroid Build Coastguard Worker				}`),
1573*333d2b36SAndroid Build Coastguard Worker		},
1574*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1575*333d2b36SAndroid Build Coastguard Worker			`module "liboutsider" variant "android_common": depends on //top:libexample which is not` +
1576*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
1577*333d2b36SAndroid Build Coastguard Worker		},
1578*333d2b36SAndroid Build Coastguard Worker	},
1579*333d2b36SAndroid Build Coastguard Worker	{
1580*333d2b36SAndroid Build Coastguard Worker		name: "package default_visibility :__subpackages__ (notices)",
1581*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1582*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1583*333d2b36SAndroid Build Coastguard Worker				package {
1584*333d2b36SAndroid Build Coastguard Worker					default_visibility: [":__subpackages__"],
1585*333d2b36SAndroid Build Coastguard Worker				}
1586*333d2b36SAndroid Build Coastguard Worker
1587*333d2b36SAndroid Build Coastguard Worker				mock_library {
1588*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1589*333d2b36SAndroid Build Coastguard Worker				}`),
1590*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
1591*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1592*333d2b36SAndroid Build Coastguard Worker					name: "nested-notice",
1593*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
1594*333d2b36SAndroid Build Coastguard Worker				}`),
1595*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
1596*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1597*333d2b36SAndroid Build Coastguard Worker					name: "outsider-notice",
1598*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
1599*333d2b36SAndroid Build Coastguard Worker				}`),
1600*333d2b36SAndroid Build Coastguard Worker		},
1601*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1602*333d2b36SAndroid Build Coastguard Worker			`module "outsider-notice" references "//top:libexample" which is not visible to this module`,
1603*333d2b36SAndroid Build Coastguard Worker		},
1604*333d2b36SAndroid Build Coastguard Worker	},
1605*333d2b36SAndroid Build Coastguard Worker	{
1606*333d2b36SAndroid Build Coastguard Worker		name: "package default_visibility inherited to subpackages",
1607*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1608*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1609*333d2b36SAndroid Build Coastguard Worker				package {
1610*333d2b36SAndroid Build Coastguard Worker					default_visibility: ["//outsider"],
1611*333d2b36SAndroid Build Coastguard Worker				}
1612*333d2b36SAndroid Build Coastguard Worker
1613*333d2b36SAndroid Build Coastguard Worker				mock_library {
1614*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1615*333d2b36SAndroid Build Coastguard Worker					visibility: [":__subpackages__"],
1616*333d2b36SAndroid Build Coastguard Worker				}`),
1617*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
1618*333d2b36SAndroid Build Coastguard Worker				mock_library {
1619*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
1620*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
1621*333d2b36SAndroid Build Coastguard Worker				}`),
1622*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
1623*333d2b36SAndroid Build Coastguard Worker				mock_library {
1624*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
1625*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample", "libnested"],
1626*333d2b36SAndroid Build Coastguard Worker				}`),
1627*333d2b36SAndroid Build Coastguard Worker		},
1628*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1629*333d2b36SAndroid Build Coastguard Worker			`module "liboutsider" variant "android_common": depends on //top:libexample which is not` +
1630*333d2b36SAndroid Build Coastguard Worker				` visible to this module`,
1631*333d2b36SAndroid Build Coastguard Worker		},
1632*333d2b36SAndroid Build Coastguard Worker	},
1633*333d2b36SAndroid Build Coastguard Worker	{
1634*333d2b36SAndroid Build Coastguard Worker		name: "package default_visibility inherited to subpackages (notices)",
1635*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1636*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1637*333d2b36SAndroid Build Coastguard Worker				package {
1638*333d2b36SAndroid Build Coastguard Worker					default_visibility: ["//outsider"],
1639*333d2b36SAndroid Build Coastguard Worker				}
1640*333d2b36SAndroid Build Coastguard Worker
1641*333d2b36SAndroid Build Coastguard Worker				mock_library {
1642*333d2b36SAndroid Build Coastguard Worker					name: "libexample",
1643*333d2b36SAndroid Build Coastguard Worker					visibility: [":__subpackages__"],
1644*333d2b36SAndroid Build Coastguard Worker				}`),
1645*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
1646*333d2b36SAndroid Build Coastguard Worker				mock_library {
1647*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
1648*333d2b36SAndroid Build Coastguard Worker					deps: ["libexample"],
1649*333d2b36SAndroid Build Coastguard Worker				}
1650*333d2b36SAndroid Build Coastguard Worker
1651*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1652*333d2b36SAndroid Build Coastguard Worker					name: "nested-notice",
1653*333d2b36SAndroid Build Coastguard Worker					for: ["libexample"],
1654*333d2b36SAndroid Build Coastguard Worker				}`),
1655*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
1656*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1657*333d2b36SAndroid Build Coastguard Worker					name: "outsider-notice",
1658*333d2b36SAndroid Build Coastguard Worker					for: ["libexample", "libnested"],
1659*333d2b36SAndroid Build Coastguard Worker				}`),
1660*333d2b36SAndroid Build Coastguard Worker		},
1661*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1662*333d2b36SAndroid Build Coastguard Worker			`module "outsider-notice" references "//top:libexample" which is not visible to this module`,
1663*333d2b36SAndroid Build Coastguard Worker		},
1664*333d2b36SAndroid Build Coastguard Worker	},
1665*333d2b36SAndroid Build Coastguard Worker	{
1666*333d2b36SAndroid Build Coastguard Worker		name: "package default_visibility inherited to subpackages",
1667*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1668*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1669*333d2b36SAndroid Build Coastguard Worker				package {
1670*333d2b36SAndroid Build Coastguard Worker					default_visibility: ["//visibility:private"],
1671*333d2b36SAndroid Build Coastguard Worker				}`),
1672*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
1673*333d2b36SAndroid Build Coastguard Worker				package {
1674*333d2b36SAndroid Build Coastguard Worker					default_visibility: ["//outsider"],
1675*333d2b36SAndroid Build Coastguard Worker				}
1676*333d2b36SAndroid Build Coastguard Worker
1677*333d2b36SAndroid Build Coastguard Worker				mock_library {
1678*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
1679*333d2b36SAndroid Build Coastguard Worker				}`),
1680*333d2b36SAndroid Build Coastguard Worker			"top/other/Android.bp": []byte(`
1681*333d2b36SAndroid Build Coastguard Worker				mock_library {
1682*333d2b36SAndroid Build Coastguard Worker					name: "libother",
1683*333d2b36SAndroid Build Coastguard Worker				}`),
1684*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
1685*333d2b36SAndroid Build Coastguard Worker				mock_library {
1686*333d2b36SAndroid Build Coastguard Worker					name: "liboutsider",
1687*333d2b36SAndroid Build Coastguard Worker					deps: ["libother", "libnested"],
1688*333d2b36SAndroid Build Coastguard Worker				}`),
1689*333d2b36SAndroid Build Coastguard Worker		},
1690*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1691*333d2b36SAndroid Build Coastguard Worker			`module "liboutsider" variant "android_common": depends on //top/other:libother which is` +
1692*333d2b36SAndroid Build Coastguard Worker				` not visible to this module`,
1693*333d2b36SAndroid Build Coastguard Worker		},
1694*333d2b36SAndroid Build Coastguard Worker	},
1695*333d2b36SAndroid Build Coastguard Worker	{
1696*333d2b36SAndroid Build Coastguard Worker		name: "package default_visibility inherited to subpackages (notices)",
1697*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1698*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1699*333d2b36SAndroid Build Coastguard Worker				package {
1700*333d2b36SAndroid Build Coastguard Worker					default_visibility: ["//visibility:private"],
1701*333d2b36SAndroid Build Coastguard Worker				}`),
1702*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
1703*333d2b36SAndroid Build Coastguard Worker				package {
1704*333d2b36SAndroid Build Coastguard Worker					default_visibility: ["//outsider"],
1705*333d2b36SAndroid Build Coastguard Worker				}
1706*333d2b36SAndroid Build Coastguard Worker
1707*333d2b36SAndroid Build Coastguard Worker				mock_library {
1708*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
1709*333d2b36SAndroid Build Coastguard Worker				}`),
1710*333d2b36SAndroid Build Coastguard Worker			"top/other/Android.bp": []byte(`
1711*333d2b36SAndroid Build Coastguard Worker				mock_library {
1712*333d2b36SAndroid Build Coastguard Worker					name: "libother",
1713*333d2b36SAndroid Build Coastguard Worker				}
1714*333d2b36SAndroid Build Coastguard Worker
1715*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1716*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
1717*333d2b36SAndroid Build Coastguard Worker					for: ["libother"],
1718*333d2b36SAndroid Build Coastguard Worker				}`),
1719*333d2b36SAndroid Build Coastguard Worker			"outsider/Android.bp": []byte(`
1720*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1721*333d2b36SAndroid Build Coastguard Worker					name: "outsider-notice",
1722*333d2b36SAndroid Build Coastguard Worker					for: ["libother", "libnested"],
1723*333d2b36SAndroid Build Coastguard Worker				}`),
1724*333d2b36SAndroid Build Coastguard Worker		},
1725*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1726*333d2b36SAndroid Build Coastguard Worker			`module "outsider-notice" references "//top/other:libother" which is not visible to this` +
1727*333d2b36SAndroid Build Coastguard Worker				` module\nYou may need to add "//outsider" to its visibility`,
1728*333d2b36SAndroid Build Coastguard Worker		},
1729*333d2b36SAndroid Build Coastguard Worker	},
1730*333d2b36SAndroid Build Coastguard Worker	{
1731*333d2b36SAndroid Build Coastguard Worker		name: "verify that prebuilt dependencies are ignored for visibility reasons (not preferred)",
1732*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1733*333d2b36SAndroid Build Coastguard Worker			"prebuilts/Android.bp": []byte(`
1734*333d2b36SAndroid Build Coastguard Worker				prebuilt {
1735*333d2b36SAndroid Build Coastguard Worker					name: "module",
1736*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/other"],
1737*333d2b36SAndroid Build Coastguard Worker				}`),
1738*333d2b36SAndroid Build Coastguard Worker			"top/sources/source_file": nil,
1739*333d2b36SAndroid Build Coastguard Worker			"top/sources/Android.bp": []byte(`
1740*333d2b36SAndroid Build Coastguard Worker				source {
1741*333d2b36SAndroid Build Coastguard Worker					name: "module",
1742*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/other"],
1743*333d2b36SAndroid Build Coastguard Worker				}`),
1744*333d2b36SAndroid Build Coastguard Worker			"top/other/source_file": nil,
1745*333d2b36SAndroid Build Coastguard Worker			"top/other/Android.bp": []byte(`
1746*333d2b36SAndroid Build Coastguard Worker				source {
1747*333d2b36SAndroid Build Coastguard Worker					name: "other",
1748*333d2b36SAndroid Build Coastguard Worker					deps: [":module"],
1749*333d2b36SAndroid Build Coastguard Worker				}`),
1750*333d2b36SAndroid Build Coastguard Worker		},
1751*333d2b36SAndroid Build Coastguard Worker	},
1752*333d2b36SAndroid Build Coastguard Worker	{
1753*333d2b36SAndroid Build Coastguard Worker		name: "verify that prebuilt dependencies are ignored for visibility reasons (not preferred) (notices)",
1754*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1755*333d2b36SAndroid Build Coastguard Worker			"prebuilts/Android.bp": []byte(`
1756*333d2b36SAndroid Build Coastguard Worker				prebuilt {
1757*333d2b36SAndroid Build Coastguard Worker					name: "module",
1758*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/other"],
1759*333d2b36SAndroid Build Coastguard Worker				}`),
1760*333d2b36SAndroid Build Coastguard Worker			"top/sources/source_file": nil,
1761*333d2b36SAndroid Build Coastguard Worker			"top/sources/Android.bp": []byte(`
1762*333d2b36SAndroid Build Coastguard Worker				source {
1763*333d2b36SAndroid Build Coastguard Worker					name: "module",
1764*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/other"],
1765*333d2b36SAndroid Build Coastguard Worker				}`),
1766*333d2b36SAndroid Build Coastguard Worker			"top/other/source_file": nil,
1767*333d2b36SAndroid Build Coastguard Worker			"top/other/Android.bp": []byte(`
1768*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1769*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
1770*333d2b36SAndroid Build Coastguard Worker					for: ["module"],
1771*333d2b36SAndroid Build Coastguard Worker				}`),
1772*333d2b36SAndroid Build Coastguard Worker		},
1773*333d2b36SAndroid Build Coastguard Worker	},
1774*333d2b36SAndroid Build Coastguard Worker	{
1775*333d2b36SAndroid Build Coastguard Worker		name: "verify that prebuilt dependencies are ignored for visibility reasons (preferred)",
1776*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1777*333d2b36SAndroid Build Coastguard Worker			"prebuilts/Android.bp": []byte(`
1778*333d2b36SAndroid Build Coastguard Worker				prebuilt {
1779*333d2b36SAndroid Build Coastguard Worker					name: "module",
1780*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/other"],
1781*333d2b36SAndroid Build Coastguard Worker					prefer: true,
1782*333d2b36SAndroid Build Coastguard Worker				}`),
1783*333d2b36SAndroid Build Coastguard Worker			"top/sources/source_file": nil,
1784*333d2b36SAndroid Build Coastguard Worker			"top/sources/Android.bp": []byte(`
1785*333d2b36SAndroid Build Coastguard Worker				source {
1786*333d2b36SAndroid Build Coastguard Worker					name: "module",
1787*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/other"],
1788*333d2b36SAndroid Build Coastguard Worker				}`),
1789*333d2b36SAndroid Build Coastguard Worker			"top/other/source_file": nil,
1790*333d2b36SAndroid Build Coastguard Worker			"top/other/Android.bp": []byte(`
1791*333d2b36SAndroid Build Coastguard Worker				source {
1792*333d2b36SAndroid Build Coastguard Worker					name: "other",
1793*333d2b36SAndroid Build Coastguard Worker					deps: [":module"],
1794*333d2b36SAndroid Build Coastguard Worker				}`),
1795*333d2b36SAndroid Build Coastguard Worker		},
1796*333d2b36SAndroid Build Coastguard Worker	},
1797*333d2b36SAndroid Build Coastguard Worker	{
1798*333d2b36SAndroid Build Coastguard Worker		name: "verify that prebuilt dependencies are ignored for visibility reasons (preferred) (notices)",
1799*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1800*333d2b36SAndroid Build Coastguard Worker			"prebuilts/Android.bp": []byte(`
1801*333d2b36SAndroid Build Coastguard Worker				prebuilt {
1802*333d2b36SAndroid Build Coastguard Worker					name: "module",
1803*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/other"],
1804*333d2b36SAndroid Build Coastguard Worker					prefer: true,
1805*333d2b36SAndroid Build Coastguard Worker				}`),
1806*333d2b36SAndroid Build Coastguard Worker			"top/sources/source_file": nil,
1807*333d2b36SAndroid Build Coastguard Worker			"top/sources/Android.bp": []byte(`
1808*333d2b36SAndroid Build Coastguard Worker				source {
1809*333d2b36SAndroid Build Coastguard Worker					name: "module",
1810*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/other"],
1811*333d2b36SAndroid Build Coastguard Worker				}`),
1812*333d2b36SAndroid Build Coastguard Worker			"top/other/source_file": nil,
1813*333d2b36SAndroid Build Coastguard Worker			"top/other/Android.bp": []byte(`
1814*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1815*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
1816*333d2b36SAndroid Build Coastguard Worker					for: ["module"],
1817*333d2b36SAndroid Build Coastguard Worker				}`),
1818*333d2b36SAndroid Build Coastguard Worker		},
1819*333d2b36SAndroid Build Coastguard Worker	},
1820*333d2b36SAndroid Build Coastguard Worker	{
1821*333d2b36SAndroid Build Coastguard Worker		name: "ensure visibility properties are checked for correctness",
1822*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1823*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1824*333d2b36SAndroid Build Coastguard Worker				mock_parent {
1825*333d2b36SAndroid Build Coastguard Worker					name: "parent",
1826*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/nested"],
1827*333d2b36SAndroid Build Coastguard Worker					child: {
1828*333d2b36SAndroid Build Coastguard Worker						name: "libchild",
1829*333d2b36SAndroid Build Coastguard Worker						visibility: ["top/other"],
1830*333d2b36SAndroid Build Coastguard Worker					},
1831*333d2b36SAndroid Build Coastguard Worker				}`),
1832*333d2b36SAndroid Build Coastguard Worker		},
1833*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1834*333d2b36SAndroid Build Coastguard Worker			`module "parent": child.visibility: invalid visibility pattern "top/other"`,
1835*333d2b36SAndroid Build Coastguard Worker		},
1836*333d2b36SAndroid Build Coastguard Worker	},
1837*333d2b36SAndroid Build Coastguard Worker	{
1838*333d2b36SAndroid Build Coastguard Worker		name: "invalid visibility added to child detected during gather phase",
1839*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1840*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1841*333d2b36SAndroid Build Coastguard Worker				mock_parent {
1842*333d2b36SAndroid Build Coastguard Worker					name: "parent",
1843*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/nested"],
1844*333d2b36SAndroid Build Coastguard Worker					child: {
1845*333d2b36SAndroid Build Coastguard Worker						name: "libchild",
1846*333d2b36SAndroid Build Coastguard Worker						invalid_visibility: ["top/other"],
1847*333d2b36SAndroid Build Coastguard Worker					},
1848*333d2b36SAndroid Build Coastguard Worker				}`),
1849*333d2b36SAndroid Build Coastguard Worker		},
1850*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{
1851*333d2b36SAndroid Build Coastguard Worker			// That this error is reported against the child not the parent shows it was
1852*333d2b36SAndroid Build Coastguard Worker			// not being detected in the parent which is correct as invalid_visibility is
1853*333d2b36SAndroid Build Coastguard Worker			// purposely not added to the list of visibility properties to check, and was
1854*333d2b36SAndroid Build Coastguard Worker			// in fact detected in the child in the gather phase. Contrast this error message
1855*333d2b36SAndroid Build Coastguard Worker			// with the preceding one.
1856*333d2b36SAndroid Build Coastguard Worker			`module "libchild" \(created by module "parent"\): visibility: invalid visibility pattern "top/other"`,
1857*333d2b36SAndroid Build Coastguard Worker		},
1858*333d2b36SAndroid Build Coastguard Worker	},
1859*333d2b36SAndroid Build Coastguard Worker	{
1860*333d2b36SAndroid Build Coastguard Worker		name: "automatic visibility inheritance enabled",
1861*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1862*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1863*333d2b36SAndroid Build Coastguard Worker				mock_parent {
1864*333d2b36SAndroid Build Coastguard Worker					name: "parent",
1865*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/nested"],
1866*333d2b36SAndroid Build Coastguard Worker					child: {
1867*333d2b36SAndroid Build Coastguard Worker						name: "libchild",
1868*333d2b36SAndroid Build Coastguard Worker						visibility: ["//top/other"],
1869*333d2b36SAndroid Build Coastguard Worker					},
1870*333d2b36SAndroid Build Coastguard Worker				}`),
1871*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
1872*333d2b36SAndroid Build Coastguard Worker				mock_library {
1873*333d2b36SAndroid Build Coastguard Worker					name: "libnested",
1874*333d2b36SAndroid Build Coastguard Worker					deps: ["libchild"],
1875*333d2b36SAndroid Build Coastguard Worker				}`),
1876*333d2b36SAndroid Build Coastguard Worker			"top/other/Android.bp": []byte(`
1877*333d2b36SAndroid Build Coastguard Worker				mock_library {
1878*333d2b36SAndroid Build Coastguard Worker					name: "libother",
1879*333d2b36SAndroid Build Coastguard Worker					deps: ["libchild"],
1880*333d2b36SAndroid Build Coastguard Worker				}`),
1881*333d2b36SAndroid Build Coastguard Worker		},
1882*333d2b36SAndroid Build Coastguard Worker	},
1883*333d2b36SAndroid Build Coastguard Worker	{
1884*333d2b36SAndroid Build Coastguard Worker		name: "automatic visibility inheritance enabled (notices)",
1885*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1886*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1887*333d2b36SAndroid Build Coastguard Worker				mock_parent {
1888*333d2b36SAndroid Build Coastguard Worker					name: "parent",
1889*333d2b36SAndroid Build Coastguard Worker					visibility: ["//top/nested"],
1890*333d2b36SAndroid Build Coastguard Worker					child: {
1891*333d2b36SAndroid Build Coastguard Worker						name: "libchild",
1892*333d2b36SAndroid Build Coastguard Worker						visibility: ["//top/other"],
1893*333d2b36SAndroid Build Coastguard Worker					},
1894*333d2b36SAndroid Build Coastguard Worker				}`),
1895*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
1896*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1897*333d2b36SAndroid Build Coastguard Worker					name: "nested-notice",
1898*333d2b36SAndroid Build Coastguard Worker					for: ["libchild"],
1899*333d2b36SAndroid Build Coastguard Worker				}`),
1900*333d2b36SAndroid Build Coastguard Worker			"top/other/Android.bp": []byte(`
1901*333d2b36SAndroid Build Coastguard Worker				gen_notice {
1902*333d2b36SAndroid Build Coastguard Worker					name: "other-notice",
1903*333d2b36SAndroid Build Coastguard Worker					for: ["libchild"],
1904*333d2b36SAndroid Build Coastguard Worker				}`),
1905*333d2b36SAndroid Build Coastguard Worker		},
1906*333d2b36SAndroid Build Coastguard Worker	},
1907*333d2b36SAndroid Build Coastguard Worker	{
1908*333d2b36SAndroid Build Coastguard Worker		name: "any_system_partition visibility works",
1909*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1910*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1911*333d2b36SAndroid Build Coastguard Worker				android_filesystem {
1912*333d2b36SAndroid Build Coastguard Worker					name: "foo",
1913*333d2b36SAndroid Build Coastguard Worker					deps: ["bar"],
1914*333d2b36SAndroid Build Coastguard Worker				}`),
1915*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
1916*333d2b36SAndroid Build Coastguard Worker				package(default_visibility=["//visibility:private"])
1917*333d2b36SAndroid Build Coastguard Worker				mock_library {
1918*333d2b36SAndroid Build Coastguard Worker					name: "bar",
1919*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:any_system_partition"],
1920*333d2b36SAndroid Build Coastguard Worker				}`),
1921*333d2b36SAndroid Build Coastguard Worker		},
1922*333d2b36SAndroid Build Coastguard Worker	},
1923*333d2b36SAndroid Build Coastguard Worker	{
1924*333d2b36SAndroid Build Coastguard Worker		name: "any_system_partition visibility works with the other visibility",
1925*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1926*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1927*333d2b36SAndroid Build Coastguard Worker				android_filesystem {
1928*333d2b36SAndroid Build Coastguard Worker					name: "foo",
1929*333d2b36SAndroid Build Coastguard Worker					deps: ["bar"],
1930*333d2b36SAndroid Build Coastguard Worker				}`),
1931*333d2b36SAndroid Build Coastguard Worker			"top2/Android.bp": []byte(``),
1932*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
1933*333d2b36SAndroid Build Coastguard Worker				package(default_visibility=["//visibility:private"])
1934*333d2b36SAndroid Build Coastguard Worker				mock_library {
1935*333d2b36SAndroid Build Coastguard Worker					name: "bar",
1936*333d2b36SAndroid Build Coastguard Worker					visibility: [
1937*333d2b36SAndroid Build Coastguard Worker						"//top2",
1938*333d2b36SAndroid Build Coastguard Worker						"//visibility:any_system_partition"
1939*333d2b36SAndroid Build Coastguard Worker					],
1940*333d2b36SAndroid Build Coastguard Worker				}`),
1941*333d2b36SAndroid Build Coastguard Worker		},
1942*333d2b36SAndroid Build Coastguard Worker	},
1943*333d2b36SAndroid Build Coastguard Worker	{
1944*333d2b36SAndroid Build Coastguard Worker		name: "any_system_partition visibility doesn't work for non-partitions",
1945*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1946*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1947*333d2b36SAndroid Build Coastguard Worker				mock_library {
1948*333d2b36SAndroid Build Coastguard Worker					name: "foo",
1949*333d2b36SAndroid Build Coastguard Worker					deps: ["bar"],
1950*333d2b36SAndroid Build Coastguard Worker				}`),
1951*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
1952*333d2b36SAndroid Build Coastguard Worker				mock_library {
1953*333d2b36SAndroid Build Coastguard Worker					name: "bar",
1954*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:any_system_partition"],
1955*333d2b36SAndroid Build Coastguard Worker				}`),
1956*333d2b36SAndroid Build Coastguard Worker		},
1957*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`module "foo" variant "android_common": depends on //top/nested:bar which is not visible to this module`},
1958*333d2b36SAndroid Build Coastguard Worker	},
1959*333d2b36SAndroid Build Coastguard Worker	{
1960*333d2b36SAndroid Build Coastguard Worker		name: "any_system_partition visibility doesn't work for vendor partitions",
1961*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1962*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1963*333d2b36SAndroid Build Coastguard Worker				android_filesystem {
1964*333d2b36SAndroid Build Coastguard Worker					name: "foo",
1965*333d2b36SAndroid Build Coastguard Worker					partition_type: "vendor",
1966*333d2b36SAndroid Build Coastguard Worker					deps: ["bar"],
1967*333d2b36SAndroid Build Coastguard Worker				}`),
1968*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
1969*333d2b36SAndroid Build Coastguard Worker				package(default_visibility=["//visibility:private"])
1970*333d2b36SAndroid Build Coastguard Worker				mock_library {
1971*333d2b36SAndroid Build Coastguard Worker					name: "bar",
1972*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:any_system_partition"],
1973*333d2b36SAndroid Build Coastguard Worker				}`),
1974*333d2b36SAndroid Build Coastguard Worker		},
1975*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`module "foo" variant "android_common": depends on //top/nested:bar which is not visible to this module`},
1976*333d2b36SAndroid Build Coastguard Worker	},
1977*333d2b36SAndroid Build Coastguard Worker	{
1978*333d2b36SAndroid Build Coastguard Worker		name: "Vendor modules are visible to any vendor partition by default",
1979*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1980*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1981*333d2b36SAndroid Build Coastguard Worker				android_filesystem {
1982*333d2b36SAndroid Build Coastguard Worker					name: "foo",
1983*333d2b36SAndroid Build Coastguard Worker					partition_type: "vendor",
1984*333d2b36SAndroid Build Coastguard Worker					deps: ["bar"],
1985*333d2b36SAndroid Build Coastguard Worker				}`),
1986*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
1987*333d2b36SAndroid Build Coastguard Worker				package(default_visibility=["//visibility:private"])
1988*333d2b36SAndroid Build Coastguard Worker				mock_library {
1989*333d2b36SAndroid Build Coastguard Worker					name: "bar",
1990*333d2b36SAndroid Build Coastguard Worker					vendor: true,
1991*333d2b36SAndroid Build Coastguard Worker				}`),
1992*333d2b36SAndroid Build Coastguard Worker		},
1993*333d2b36SAndroid Build Coastguard Worker	},
1994*333d2b36SAndroid Build Coastguard Worker	{
1995*333d2b36SAndroid Build Coastguard Worker		name: "Not visible to vendor partitions when using any_system_partiton, even if vendor: true",
1996*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
1997*333d2b36SAndroid Build Coastguard Worker			"top/Android.bp": []byte(`
1998*333d2b36SAndroid Build Coastguard Worker				android_filesystem {
1999*333d2b36SAndroid Build Coastguard Worker					name: "foo",
2000*333d2b36SAndroid Build Coastguard Worker					partition_type: "vendor",
2001*333d2b36SAndroid Build Coastguard Worker					deps: ["bar"],
2002*333d2b36SAndroid Build Coastguard Worker				}`),
2003*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
2004*333d2b36SAndroid Build Coastguard Worker				package(default_visibility=["//visibility:private"])
2005*333d2b36SAndroid Build Coastguard Worker				mock_library {
2006*333d2b36SAndroid Build Coastguard Worker					name: "bar",
2007*333d2b36SAndroid Build Coastguard Worker					vendor: true,
2008*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:any_system_partition"],
2009*333d2b36SAndroid Build Coastguard Worker				}`),
2010*333d2b36SAndroid Build Coastguard Worker		},
2011*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`module "foo" variant "android_common": depends on //top/nested:bar which is not visible to this module`},
2012*333d2b36SAndroid Build Coastguard Worker	},
2013*333d2b36SAndroid Build Coastguard Worker	{
2014*333d2b36SAndroid Build Coastguard Worker		name: "unknown any_partition specs throw errors",
2015*333d2b36SAndroid Build Coastguard Worker		fs: MockFS{
2016*333d2b36SAndroid Build Coastguard Worker			"top/nested/Android.bp": []byte(`
2017*333d2b36SAndroid Build Coastguard Worker				package(default_visibility=["//visibility:private"])
2018*333d2b36SAndroid Build Coastguard Worker				mock_library {
2019*333d2b36SAndroid Build Coastguard Worker					name: "bar",
2020*333d2b36SAndroid Build Coastguard Worker					visibility: ["//visibility:any_unknown_partition"],
2021*333d2b36SAndroid Build Coastguard Worker				}`),
2022*333d2b36SAndroid Build Coastguard Worker		},
2023*333d2b36SAndroid Build Coastguard Worker		expectedErrors: []string{`unrecognized visibility rule "//visibility:any_unknown_partition"`},
2024*333d2b36SAndroid Build Coastguard Worker	},
2025*333d2b36SAndroid Build Coastguard Worker}
2026*333d2b36SAndroid Build Coastguard Worker
2027*333d2b36SAndroid Build Coastguard Workerfunc TestVisibility(t *testing.T) {
2028*333d2b36SAndroid Build Coastguard Worker	for _, test := range visibilityTests {
2029*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
2030*333d2b36SAndroid Build Coastguard Worker			result := GroupFixturePreparers(
2031*333d2b36SAndroid Build Coastguard Worker				// General preparers in alphabetical order as test infrastructure will enforce correct
2032*333d2b36SAndroid Build Coastguard Worker				// registration order.
2033*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithArchMutator,
2034*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithDefaults,
2035*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithGenNotice,
2036*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithOverrides,
2037*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithPackageModule,
2038*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithPrebuilts,
2039*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithVisibility,
2040*333d2b36SAndroid Build Coastguard Worker
2041*333d2b36SAndroid Build Coastguard Worker				// Additional test specific preparers.
2042*333d2b36SAndroid Build Coastguard Worker				FixtureRegisterWithContext(func(ctx RegistrationContext) {
2043*333d2b36SAndroid Build Coastguard Worker					ctx.RegisterModuleType("mock_library", newMockLibraryModule)
2044*333d2b36SAndroid Build Coastguard Worker					ctx.RegisterModuleType("mock_parent", newMockParentFactory)
2045*333d2b36SAndroid Build Coastguard Worker					ctx.RegisterModuleType("mock_defaults", defaultsFactory)
2046*333d2b36SAndroid Build Coastguard Worker					ctx.RegisterModuleType("android_filesystem", newMockFilesystemModule)
2047*333d2b36SAndroid Build Coastguard Worker				}),
2048*333d2b36SAndroid Build Coastguard Worker				prepareForTestWithFakePrebuiltModules,
2049*333d2b36SAndroid Build Coastguard Worker				// Add additional files to the mock filesystem
2050*333d2b36SAndroid Build Coastguard Worker				test.fs.AddToFixture(),
2051*333d2b36SAndroid Build Coastguard Worker			).
2052*333d2b36SAndroid Build Coastguard Worker				ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern(test.expectedErrors)).
2053*333d2b36SAndroid Build Coastguard Worker				RunTest(t)
2054*333d2b36SAndroid Build Coastguard Worker
2055*333d2b36SAndroid Build Coastguard Worker			if test.effectiveVisibility != nil {
2056*333d2b36SAndroid Build Coastguard Worker				checkEffectiveVisibility(t, result, test.effectiveVisibility)
2057*333d2b36SAndroid Build Coastguard Worker			}
2058*333d2b36SAndroid Build Coastguard Worker		})
2059*333d2b36SAndroid Build Coastguard Worker	}
2060*333d2b36SAndroid Build Coastguard Worker}
2061*333d2b36SAndroid Build Coastguard Worker
2062*333d2b36SAndroid Build Coastguard Workerfunc checkEffectiveVisibility(t *testing.T, result *TestResult, effectiveVisibility map[qualifiedModuleName][]string) {
2063*333d2b36SAndroid Build Coastguard Worker	for moduleName, expectedRules := range effectiveVisibility {
2064*333d2b36SAndroid Build Coastguard Worker		rule := effectiveVisibilityRules(result.Config, moduleName)
2065*333d2b36SAndroid Build Coastguard Worker		stringRules := rule.Strings()
2066*333d2b36SAndroid Build Coastguard Worker		AssertDeepEquals(t, "effective rules mismatch", expectedRules, stringRules)
2067*333d2b36SAndroid Build Coastguard Worker	}
2068*333d2b36SAndroid Build Coastguard Worker}
2069*333d2b36SAndroid Build Coastguard Worker
2070*333d2b36SAndroid Build Coastguard Workertype mockLibraryProperties struct {
2071*333d2b36SAndroid Build Coastguard Worker	Deps []string
2072*333d2b36SAndroid Build Coastguard Worker}
2073*333d2b36SAndroid Build Coastguard Worker
2074*333d2b36SAndroid Build Coastguard Workertype mockLibraryModule struct {
2075*333d2b36SAndroid Build Coastguard Worker	ModuleBase
2076*333d2b36SAndroid Build Coastguard Worker	DefaultableModuleBase
2077*333d2b36SAndroid Build Coastguard Worker	properties mockLibraryProperties
2078*333d2b36SAndroid Build Coastguard Worker}
2079*333d2b36SAndroid Build Coastguard Worker
2080*333d2b36SAndroid Build Coastguard Workerfunc newMockLibraryModule() Module {
2081*333d2b36SAndroid Build Coastguard Worker	m := &mockLibraryModule{}
2082*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
2083*333d2b36SAndroid Build Coastguard Worker	InitAndroidArchModule(m, HostAndDeviceSupported, MultilibCommon)
2084*333d2b36SAndroid Build Coastguard Worker	InitDefaultableModule(m)
2085*333d2b36SAndroid Build Coastguard Worker	return m
2086*333d2b36SAndroid Build Coastguard Worker}
2087*333d2b36SAndroid Build Coastguard Worker
2088*333d2b36SAndroid Build Coastguard Workertype dependencyTag struct {
2089*333d2b36SAndroid Build Coastguard Worker	blueprint.BaseDependencyTag
2090*333d2b36SAndroid Build Coastguard Worker	name string
2091*333d2b36SAndroid Build Coastguard Worker}
2092*333d2b36SAndroid Build Coastguard Worker
2093*333d2b36SAndroid Build Coastguard Workerfunc (j *mockLibraryModule) DepsMutator(ctx BottomUpMutatorContext) {
2094*333d2b36SAndroid Build Coastguard Worker	ctx.AddVariationDependencies(nil, dependencyTag{name: "mockdeps"}, j.properties.Deps...)
2095*333d2b36SAndroid Build Coastguard Worker}
2096*333d2b36SAndroid Build Coastguard Worker
2097*333d2b36SAndroid Build Coastguard Workerfunc (p *mockLibraryModule) GenerateAndroidBuildActions(ModuleContext) {
2098*333d2b36SAndroid Build Coastguard Worker}
2099*333d2b36SAndroid Build Coastguard Worker
2100*333d2b36SAndroid Build Coastguard Workertype mockFilesystemModuleProperties struct {
2101*333d2b36SAndroid Build Coastguard Worker	Partition_type    *string
2102*333d2b36SAndroid Build Coastguard Worker	Deps              []string
2103*333d2b36SAndroid Build Coastguard Worker	Is_auto_generated *bool
2104*333d2b36SAndroid Build Coastguard Worker}
2105*333d2b36SAndroid Build Coastguard Worker
2106*333d2b36SAndroid Build Coastguard Workertype mockFilesystemModule struct {
2107*333d2b36SAndroid Build Coastguard Worker	ModuleBase
2108*333d2b36SAndroid Build Coastguard Worker	properties mockFilesystemModuleProperties
2109*333d2b36SAndroid Build Coastguard Worker}
2110*333d2b36SAndroid Build Coastguard Worker
2111*333d2b36SAndroid Build Coastguard Workerfunc (j *mockFilesystemModule) DepsMutator(ctx BottomUpMutatorContext) {
2112*333d2b36SAndroid Build Coastguard Worker	ctx.AddVariationDependencies(nil, dependencyTag{name: "mockdeps"}, j.properties.Deps...)
2113*333d2b36SAndroid Build Coastguard Worker}
2114*333d2b36SAndroid Build Coastguard Worker
2115*333d2b36SAndroid Build Coastguard Workerfunc (p *mockFilesystemModule) GenerateAndroidBuildActions(ModuleContext) {
2116*333d2b36SAndroid Build Coastguard Worker}
2117*333d2b36SAndroid Build Coastguard Worker
2118*333d2b36SAndroid Build Coastguard Workerfunc (p *mockFilesystemModule) PartitionType() string {
2119*333d2b36SAndroid Build Coastguard Worker	if p.properties.Partition_type == nil {
2120*333d2b36SAndroid Build Coastguard Worker		return "system"
2121*333d2b36SAndroid Build Coastguard Worker	}
2122*333d2b36SAndroid Build Coastguard Worker	return *p.properties.Partition_type
2123*333d2b36SAndroid Build Coastguard Worker}
2124*333d2b36SAndroid Build Coastguard Worker
2125*333d2b36SAndroid Build Coastguard Workerfunc newMockFilesystemModule() Module {
2126*333d2b36SAndroid Build Coastguard Worker	m := &mockFilesystemModule{}
2127*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
2128*333d2b36SAndroid Build Coastguard Worker	InitAndroidArchModule(m, DeviceSupported, MultilibCommon)
2129*333d2b36SAndroid Build Coastguard Worker	return m
2130*333d2b36SAndroid Build Coastguard Worker}
2131*333d2b36SAndroid Build Coastguard Worker
2132*333d2b36SAndroid Build Coastguard Workertype mockDefaults struct {
2133*333d2b36SAndroid Build Coastguard Worker	ModuleBase
2134*333d2b36SAndroid Build Coastguard Worker	DefaultsModuleBase
2135*333d2b36SAndroid Build Coastguard Worker}
2136*333d2b36SAndroid Build Coastguard Worker
2137*333d2b36SAndroid Build Coastguard Workerfunc defaultsFactory() Module {
2138*333d2b36SAndroid Build Coastguard Worker	m := &mockDefaults{}
2139*333d2b36SAndroid Build Coastguard Worker	InitDefaultsModule(m)
2140*333d2b36SAndroid Build Coastguard Worker	return m
2141*333d2b36SAndroid Build Coastguard Worker}
2142*333d2b36SAndroid Build Coastguard Worker
2143*333d2b36SAndroid Build Coastguard Workertype mockParentProperties struct {
2144*333d2b36SAndroid Build Coastguard Worker	Child struct {
2145*333d2b36SAndroid Build Coastguard Worker		Name *string
2146*333d2b36SAndroid Build Coastguard Worker
2147*333d2b36SAndroid Build Coastguard Worker		// Visibility to pass to the child module.
2148*333d2b36SAndroid Build Coastguard Worker		Visibility []string
2149*333d2b36SAndroid Build Coastguard Worker
2150*333d2b36SAndroid Build Coastguard Worker		// Purposely not validated visibility to pass to the child.
2151*333d2b36SAndroid Build Coastguard Worker		Invalid_visibility []string
2152*333d2b36SAndroid Build Coastguard Worker	}
2153*333d2b36SAndroid Build Coastguard Worker}
2154*333d2b36SAndroid Build Coastguard Worker
2155*333d2b36SAndroid Build Coastguard Workertype mockParent struct {
2156*333d2b36SAndroid Build Coastguard Worker	ModuleBase
2157*333d2b36SAndroid Build Coastguard Worker	DefaultableModuleBase
2158*333d2b36SAndroid Build Coastguard Worker	properties mockParentProperties
2159*333d2b36SAndroid Build Coastguard Worker}
2160*333d2b36SAndroid Build Coastguard Worker
2161*333d2b36SAndroid Build Coastguard Workerfunc (p *mockParent) GenerateAndroidBuildActions(ModuleContext) {
2162*333d2b36SAndroid Build Coastguard Worker}
2163*333d2b36SAndroid Build Coastguard Worker
2164*333d2b36SAndroid Build Coastguard Workerfunc newMockParentFactory() Module {
2165*333d2b36SAndroid Build Coastguard Worker	m := &mockParent{}
2166*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
2167*333d2b36SAndroid Build Coastguard Worker	InitAndroidArchModule(m, HostAndDeviceSupported, MultilibCommon)
2168*333d2b36SAndroid Build Coastguard Worker	InitDefaultableModule(m)
2169*333d2b36SAndroid Build Coastguard Worker	AddVisibilityProperty(m, "child.visibility", &m.properties.Child.Visibility)
2170*333d2b36SAndroid Build Coastguard Worker
2171*333d2b36SAndroid Build Coastguard Worker	m.SetDefaultableHook(func(ctx DefaultableHookContext) {
2172*333d2b36SAndroid Build Coastguard Worker		visibility := m.properties.Child.Visibility
2173*333d2b36SAndroid Build Coastguard Worker		visibility = append(visibility, m.properties.Child.Invalid_visibility...)
2174*333d2b36SAndroid Build Coastguard Worker		ctx.CreateModule(newMockLibraryModule, &struct {
2175*333d2b36SAndroid Build Coastguard Worker			Name       *string
2176*333d2b36SAndroid Build Coastguard Worker			Visibility []string
2177*333d2b36SAndroid Build Coastguard Worker		}{m.properties.Child.Name, visibility})
2178*333d2b36SAndroid Build Coastguard Worker	})
2179*333d2b36SAndroid Build Coastguard Worker	return m
2180*333d2b36SAndroid Build Coastguard Worker}
2181*333d2b36SAndroid Build Coastguard Worker
2182*333d2b36SAndroid Build Coastguard Workerfunc testVisibilityRuleSet(t *testing.T, rules, extra, expected []string) {
2183*333d2b36SAndroid Build Coastguard Worker	t.Helper()
2184*333d2b36SAndroid Build Coastguard Worker	set := &visibilityRuleSet{rules}
2185*333d2b36SAndroid Build Coastguard Worker	err := set.Widen(extra)
2186*333d2b36SAndroid Build Coastguard Worker	if err != nil {
2187*333d2b36SAndroid Build Coastguard Worker		t.Error(err)
2188*333d2b36SAndroid Build Coastguard Worker		return
2189*333d2b36SAndroid Build Coastguard Worker	}
2190*333d2b36SAndroid Build Coastguard Worker	actual := set.Strings()
2191*333d2b36SAndroid Build Coastguard Worker	if !reflect.DeepEqual(actual, expected) {
2192*333d2b36SAndroid Build Coastguard Worker		t.Errorf("mismatching rules after extend: expected %#v, actual %#v", expected, actual)
2193*333d2b36SAndroid Build Coastguard Worker	}
2194*333d2b36SAndroid Build Coastguard Worker}
2195*333d2b36SAndroid Build Coastguard Worker
2196*333d2b36SAndroid Build Coastguard Workerfunc TestVisibilityRuleSet(t *testing.T) {
2197*333d2b36SAndroid Build Coastguard Worker	t.Run("extend empty", func(t *testing.T) {
2198*333d2b36SAndroid Build Coastguard Worker		testVisibilityRuleSet(t, nil, []string{"//foo"}, []string{"//foo"})
2199*333d2b36SAndroid Build Coastguard Worker	})
2200*333d2b36SAndroid Build Coastguard Worker	t.Run("extend", func(t *testing.T) {
2201*333d2b36SAndroid Build Coastguard Worker		testVisibilityRuleSet(t, []string{"//foo"}, []string{"//bar"}, []string{"//bar", "//foo"})
2202*333d2b36SAndroid Build Coastguard Worker	})
2203*333d2b36SAndroid Build Coastguard Worker	t.Run("extend duplicate", func(t *testing.T) {
2204*333d2b36SAndroid Build Coastguard Worker		testVisibilityRuleSet(t, []string{"//foo"}, []string{"//bar", "//foo"}, []string{"//bar", "//foo"})
2205*333d2b36SAndroid Build Coastguard Worker	})
2206*333d2b36SAndroid Build Coastguard Worker	t.Run("extend public", func(t *testing.T) {
2207*333d2b36SAndroid Build Coastguard Worker		testVisibilityRuleSet(t, []string{"//visibility:public"}, []string{"//foo"}, []string{"//visibility:public"})
2208*333d2b36SAndroid Build Coastguard Worker	})
2209*333d2b36SAndroid Build Coastguard Worker	t.Run("extend private", func(t *testing.T) {
2210*333d2b36SAndroid Build Coastguard Worker		testVisibilityRuleSet(t, []string{"//visibility:private"}, []string{"//foo"}, []string{"//foo"})
2211*333d2b36SAndroid Build Coastguard Worker	})
2212*333d2b36SAndroid Build Coastguard Worker	t.Run("extend with public", func(t *testing.T) {
2213*333d2b36SAndroid Build Coastguard Worker		testVisibilityRuleSet(t, []string{"//foo"}, []string{"//visibility:public"}, []string{"//visibility:public"})
2214*333d2b36SAndroid Build Coastguard Worker	})
2215*333d2b36SAndroid Build Coastguard Worker	t.Run("extend with private", func(t *testing.T) {
2216*333d2b36SAndroid Build Coastguard Worker		t.Helper()
2217*333d2b36SAndroid Build Coastguard Worker		set := &visibilityRuleSet{[]string{"//foo"}}
2218*333d2b36SAndroid Build Coastguard Worker		err := set.Widen([]string{"//visibility:private"})
2219*333d2b36SAndroid Build Coastguard Worker		expectedError := `"//visibility:private" does not widen the visibility`
2220*333d2b36SAndroid Build Coastguard Worker		if err == nil {
2221*333d2b36SAndroid Build Coastguard Worker			t.Errorf("missing error")
2222*333d2b36SAndroid Build Coastguard Worker		} else if err.Error() != expectedError {
2223*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected error %q found error %q", expectedError, err)
2224*333d2b36SAndroid Build Coastguard Worker		}
2225*333d2b36SAndroid Build Coastguard Worker	})
2226*333d2b36SAndroid Build Coastguard Worker}
2227