xref: /aosp_15_r20/build/soong/java/app_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage java
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
20*333d2b36SAndroid Build Coastguard Worker	"reflect"
21*333d2b36SAndroid Build Coastguard Worker	"sort"
22*333d2b36SAndroid Build Coastguard Worker	"strings"
23*333d2b36SAndroid Build Coastguard Worker	"testing"
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
28*333d2b36SAndroid Build Coastguard Worker	"android/soong/cc"
29*333d2b36SAndroid Build Coastguard Worker	"android/soong/dexpreopt"
30*333d2b36SAndroid Build Coastguard Worker)
31*333d2b36SAndroid Build Coastguard Worker
32*333d2b36SAndroid Build Coastguard Worker// testApp runs tests using the prepareForJavaTest
33*333d2b36SAndroid Build Coastguard Worker//
34*333d2b36SAndroid Build Coastguard Worker// See testJava for an explanation as to how to stop using this deprecated method.
35*333d2b36SAndroid Build Coastguard Worker//
36*333d2b36SAndroid Build Coastguard Worker// deprecated
37*333d2b36SAndroid Build Coastguard Workerfunc testApp(t *testing.T, bp string) *android.TestContext {
38*333d2b36SAndroid Build Coastguard Worker	t.Helper()
39*333d2b36SAndroid Build Coastguard Worker	result := prepareForJavaTest.RunTestWithBp(t, bp)
40*333d2b36SAndroid Build Coastguard Worker	return result.TestContext
41*333d2b36SAndroid Build Coastguard Worker}
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Workerfunc TestApp(t *testing.T) {
44*333d2b36SAndroid Build Coastguard Worker	resourceFiles := []string{
45*333d2b36SAndroid Build Coastguard Worker		"res/layout/layout.xml",
46*333d2b36SAndroid Build Coastguard Worker		"res/values/strings.xml",
47*333d2b36SAndroid Build Coastguard Worker		"res/values-en-rUS/strings.xml",
48*333d2b36SAndroid Build Coastguard Worker	}
49*333d2b36SAndroid Build Coastguard Worker
50*333d2b36SAndroid Build Coastguard Worker	compiledResourceFiles := []string{
51*333d2b36SAndroid Build Coastguard Worker		"aapt2/res/layout_layout.xml.flat",
52*333d2b36SAndroid Build Coastguard Worker		"aapt2/res/values_strings.arsc.flat",
53*333d2b36SAndroid Build Coastguard Worker		"aapt2/res/values-en-rUS_strings.arsc.flat",
54*333d2b36SAndroid Build Coastguard Worker	}
55*333d2b36SAndroid Build Coastguard Worker
56*333d2b36SAndroid Build Coastguard Worker	for _, moduleType := range []string{"android_app", "android_library"} {
57*333d2b36SAndroid Build Coastguard Worker		t.Run(moduleType, func(t *testing.T) {
58*333d2b36SAndroid Build Coastguard Worker			result := android.GroupFixturePreparers(
59*333d2b36SAndroid Build Coastguard Worker				prepareForJavaTest,
60*333d2b36SAndroid Build Coastguard Worker				android.FixtureModifyMockFS(func(fs android.MockFS) {
61*333d2b36SAndroid Build Coastguard Worker					for _, file := range resourceFiles {
62*333d2b36SAndroid Build Coastguard Worker						fs[file] = nil
63*333d2b36SAndroid Build Coastguard Worker					}
64*333d2b36SAndroid Build Coastguard Worker				}),
65*333d2b36SAndroid Build Coastguard Worker			).RunTestWithBp(t, moduleType+` {
66*333d2b36SAndroid Build Coastguard Worker					name: "foo",
67*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
68*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current"
69*333d2b36SAndroid Build Coastguard Worker				}
70*333d2b36SAndroid Build Coastguard Worker			`)
71*333d2b36SAndroid Build Coastguard Worker
72*333d2b36SAndroid Build Coastguard Worker			foo := result.ModuleForTests("foo", "android_common")
73*333d2b36SAndroid Build Coastguard Worker
74*333d2b36SAndroid Build Coastguard Worker			var expectedLinkImplicits []string
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Worker			manifestFixer := foo.Output("manifest_fixer/AndroidManifest.xml")
77*333d2b36SAndroid Build Coastguard Worker			expectedLinkImplicits = append(expectedLinkImplicits, manifestFixer.Output.String())
78*333d2b36SAndroid Build Coastguard Worker
79*333d2b36SAndroid Build Coastguard Worker			frameworkRes := result.ModuleForTests("framework-res", "android_common")
80*333d2b36SAndroid Build Coastguard Worker			expectedLinkImplicits = append(expectedLinkImplicits,
81*333d2b36SAndroid Build Coastguard Worker				frameworkRes.Output("package-res.apk").Output.String())
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Worker			// Test the mapping from input files to compiled output file names
84*333d2b36SAndroid Build Coastguard Worker			compile := foo.Output(compiledResourceFiles[0])
85*333d2b36SAndroid Build Coastguard Worker			android.AssertDeepEquals(t, "aapt2 compile inputs", resourceFiles, compile.Inputs.Strings())
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker			compiledResourceOutputs := compile.Outputs.Strings()
88*333d2b36SAndroid Build Coastguard Worker			sort.Strings(compiledResourceOutputs)
89*333d2b36SAndroid Build Coastguard Worker
90*333d2b36SAndroid Build Coastguard Worker			expectedLinkImplicits = append(expectedLinkImplicits, compiledResourceOutputs...)
91*333d2b36SAndroid Build Coastguard Worker
92*333d2b36SAndroid Build Coastguard Worker			list := foo.Output("aapt2/res.list")
93*333d2b36SAndroid Build Coastguard Worker			expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String())
94*333d2b36SAndroid Build Coastguard Worker
95*333d2b36SAndroid Build Coastguard Worker			// Check that the link rule uses
96*333d2b36SAndroid Build Coastguard Worker			res := result.ModuleForTests("foo", "android_common").Output("package-res.apk")
97*333d2b36SAndroid Build Coastguard Worker			android.AssertDeepEquals(t, "aapt2 link implicits", expectedLinkImplicits, res.Implicits.Strings())
98*333d2b36SAndroid Build Coastguard Worker		})
99*333d2b36SAndroid Build Coastguard Worker	}
100*333d2b36SAndroid Build Coastguard Worker}
101*333d2b36SAndroid Build Coastguard Worker
102*333d2b36SAndroid Build Coastguard Workerfunc TestAppSplits(t *testing.T) {
103*333d2b36SAndroid Build Coastguard Worker	ctx := testApp(t, `
104*333d2b36SAndroid Build Coastguard Worker				android_app {
105*333d2b36SAndroid Build Coastguard Worker					name: "foo",
106*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
107*333d2b36SAndroid Build Coastguard Worker					package_splits: ["v4", "v7,hdpi"],
108*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current"
109*333d2b36SAndroid Build Coastguard Worker				}`)
110*333d2b36SAndroid Build Coastguard Worker
111*333d2b36SAndroid Build Coastguard Worker	foo := ctx.ModuleForTests("foo", "android_common")
112*333d2b36SAndroid Build Coastguard Worker
113*333d2b36SAndroid Build Coastguard Worker	expectedOutputs := []string{
114*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/foo/android_common/foo.apk",
115*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/foo/android_common/foo_v4.apk",
116*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/foo/android_common/foo_v7_hdpi.apk",
117*333d2b36SAndroid Build Coastguard Worker	}
118*333d2b36SAndroid Build Coastguard Worker	for _, expectedOutput := range expectedOutputs {
119*333d2b36SAndroid Build Coastguard Worker		foo.Output(expectedOutput)
120*333d2b36SAndroid Build Coastguard Worker	}
121*333d2b36SAndroid Build Coastguard Worker
122*333d2b36SAndroid Build Coastguard Worker	outputFiles := foo.OutputFiles(ctx, t, "")
123*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, `OutputFiles("")`, expectedOutputs, outputFiles)
124*333d2b36SAndroid Build Coastguard Worker}
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Workerfunc TestPlatformAPIs(t *testing.T) {
127*333d2b36SAndroid Build Coastguard Worker	testJava(t, `
128*333d2b36SAndroid Build Coastguard Worker		android_app {
129*333d2b36SAndroid Build Coastguard Worker			name: "foo",
130*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
131*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
132*333d2b36SAndroid Build Coastguard Worker		}
133*333d2b36SAndroid Build Coastguard Worker	`)
134*333d2b36SAndroid Build Coastguard Worker
135*333d2b36SAndroid Build Coastguard Worker	testJava(t, `
136*333d2b36SAndroid Build Coastguard Worker		android_app {
137*333d2b36SAndroid Build Coastguard Worker			name: "foo",
138*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
139*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
140*333d2b36SAndroid Build Coastguard Worker		}
141*333d2b36SAndroid Build Coastguard Worker	`)
142*333d2b36SAndroid Build Coastguard Worker
143*333d2b36SAndroid Build Coastguard Worker	testJavaError(t, "This module has conflicting settings. sdk_version is empty, which means that this module is build against platform APIs. However platform_apis is not set to true", `
144*333d2b36SAndroid Build Coastguard Worker		android_app {
145*333d2b36SAndroid Build Coastguard Worker			name: "bar",
146*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
147*333d2b36SAndroid Build Coastguard Worker		}
148*333d2b36SAndroid Build Coastguard Worker	`)
149*333d2b36SAndroid Build Coastguard Worker
150*333d2b36SAndroid Build Coastguard Worker	testJavaError(t, "This module has conflicting settings. sdk_version is not empty, which means this module cannot use platform APIs. However platform_apis is set to true.", `
151*333d2b36SAndroid Build Coastguard Worker		android_app {
152*333d2b36SAndroid Build Coastguard Worker			name: "bar",
153*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
154*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_current",
155*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
156*333d2b36SAndroid Build Coastguard Worker		}
157*333d2b36SAndroid Build Coastguard Worker	`)
158*333d2b36SAndroid Build Coastguard Worker}
159*333d2b36SAndroid Build Coastguard Worker
160*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidAppLinkType(t *testing.T) {
161*333d2b36SAndroid Build Coastguard Worker	testJava(t, `
162*333d2b36SAndroid Build Coastguard Worker		android_app {
163*333d2b36SAndroid Build Coastguard Worker			name: "foo",
164*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
165*333d2b36SAndroid Build Coastguard Worker			libs: ["bar"],
166*333d2b36SAndroid Build Coastguard Worker			static_libs: ["baz"],
167*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
168*333d2b36SAndroid Build Coastguard Worker		}
169*333d2b36SAndroid Build Coastguard Worker
170*333d2b36SAndroid Build Coastguard Worker		java_library {
171*333d2b36SAndroid Build Coastguard Worker			name: "bar",
172*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
173*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
174*333d2b36SAndroid Build Coastguard Worker		}
175*333d2b36SAndroid Build Coastguard Worker
176*333d2b36SAndroid Build Coastguard Worker		android_library {
177*333d2b36SAndroid Build Coastguard Worker			name: "baz",
178*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_current",
179*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
180*333d2b36SAndroid Build Coastguard Worker		}
181*333d2b36SAndroid Build Coastguard Worker	`)
182*333d2b36SAndroid Build Coastguard Worker
183*333d2b36SAndroid Build Coastguard Worker	testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
184*333d2b36SAndroid Build Coastguard Worker		android_app {
185*333d2b36SAndroid Build Coastguard Worker			name: "foo",
186*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
187*333d2b36SAndroid Build Coastguard Worker			libs: ["bar"],
188*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
189*333d2b36SAndroid Build Coastguard Worker			static_libs: ["baz"],
190*333d2b36SAndroid Build Coastguard Worker		}
191*333d2b36SAndroid Build Coastguard Worker
192*333d2b36SAndroid Build Coastguard Worker		java_library {
193*333d2b36SAndroid Build Coastguard Worker			name: "bar",
194*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
195*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
196*333d2b36SAndroid Build Coastguard Worker		}
197*333d2b36SAndroid Build Coastguard Worker
198*333d2b36SAndroid Build Coastguard Worker		android_library {
199*333d2b36SAndroid Build Coastguard Worker			name: "baz",
200*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_current",
201*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
202*333d2b36SAndroid Build Coastguard Worker		}
203*333d2b36SAndroid Build Coastguard Worker	`)
204*333d2b36SAndroid Build Coastguard Worker
205*333d2b36SAndroid Build Coastguard Worker	testJava(t, `
206*333d2b36SAndroid Build Coastguard Worker		android_app {
207*333d2b36SAndroid Build Coastguard Worker			name: "foo",
208*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
209*333d2b36SAndroid Build Coastguard Worker			libs: ["bar"],
210*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_current",
211*333d2b36SAndroid Build Coastguard Worker			static_libs: ["baz"],
212*333d2b36SAndroid Build Coastguard Worker		}
213*333d2b36SAndroid Build Coastguard Worker
214*333d2b36SAndroid Build Coastguard Worker		java_library {
215*333d2b36SAndroid Build Coastguard Worker			name: "bar",
216*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
217*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
218*333d2b36SAndroid Build Coastguard Worker		}
219*333d2b36SAndroid Build Coastguard Worker
220*333d2b36SAndroid Build Coastguard Worker		android_library {
221*333d2b36SAndroid Build Coastguard Worker			name: "baz",
222*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_current",
223*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
224*333d2b36SAndroid Build Coastguard Worker		}
225*333d2b36SAndroid Build Coastguard Worker	`)
226*333d2b36SAndroid Build Coastguard Worker
227*333d2b36SAndroid Build Coastguard Worker	testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
228*333d2b36SAndroid Build Coastguard Worker		android_app {
229*333d2b36SAndroid Build Coastguard Worker			name: "foo",
230*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
231*333d2b36SAndroid Build Coastguard Worker			libs: ["bar"],
232*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_current",
233*333d2b36SAndroid Build Coastguard Worker			static_libs: ["baz"],
234*333d2b36SAndroid Build Coastguard Worker		}
235*333d2b36SAndroid Build Coastguard Worker
236*333d2b36SAndroid Build Coastguard Worker		java_library {
237*333d2b36SAndroid Build Coastguard Worker			name: "bar",
238*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
239*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
240*333d2b36SAndroid Build Coastguard Worker		}
241*333d2b36SAndroid Build Coastguard Worker
242*333d2b36SAndroid Build Coastguard Worker		android_library {
243*333d2b36SAndroid Build Coastguard Worker			name: "baz",
244*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
245*333d2b36SAndroid Build Coastguard Worker		}
246*333d2b36SAndroid Build Coastguard Worker	`)
247*333d2b36SAndroid Build Coastguard Worker}
248*333d2b36SAndroid Build Coastguard Worker
249*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps(t *testing.T) {
250*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
251*333d2b36SAndroid Build Coastguard Worker		name          string
252*333d2b36SAndroid Build Coastguard Worker		bp            string
253*333d2b36SAndroid Build Coastguard Worker		expectedError string
254*333d2b36SAndroid Build Coastguard Worker	}{
255*333d2b36SAndroid Build Coastguard Worker		{
256*333d2b36SAndroid Build Coastguard Worker			name: "Stable public SDK",
257*333d2b36SAndroid Build Coastguard Worker			bp: `android_app {
258*333d2b36SAndroid Build Coastguard Worker					name: "foo",
259*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
260*333d2b36SAndroid Build Coastguard Worker					sdk_version: "29",
261*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "29",
262*333d2b36SAndroid Build Coastguard Worker					updatable: true,
263*333d2b36SAndroid Build Coastguard Worker				}`,
264*333d2b36SAndroid Build Coastguard Worker		},
265*333d2b36SAndroid Build Coastguard Worker		{
266*333d2b36SAndroid Build Coastguard Worker			name: "Stable system SDK",
267*333d2b36SAndroid Build Coastguard Worker			bp: `android_app {
268*333d2b36SAndroid Build Coastguard Worker					name: "foo",
269*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
270*333d2b36SAndroid Build Coastguard Worker					sdk_version: "system_29",
271*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "29",
272*333d2b36SAndroid Build Coastguard Worker					updatable: true,
273*333d2b36SAndroid Build Coastguard Worker				}`,
274*333d2b36SAndroid Build Coastguard Worker		},
275*333d2b36SAndroid Build Coastguard Worker		{
276*333d2b36SAndroid Build Coastguard Worker			name: "Current public SDK",
277*333d2b36SAndroid Build Coastguard Worker			bp: `android_app {
278*333d2b36SAndroid Build Coastguard Worker					name: "foo",
279*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
280*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
281*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "29",
282*333d2b36SAndroid Build Coastguard Worker					updatable: true,
283*333d2b36SAndroid Build Coastguard Worker				}`,
284*333d2b36SAndroid Build Coastguard Worker		},
285*333d2b36SAndroid Build Coastguard Worker		{
286*333d2b36SAndroid Build Coastguard Worker			name: "Current system SDK",
287*333d2b36SAndroid Build Coastguard Worker			bp: `android_app {
288*333d2b36SAndroid Build Coastguard Worker					name: "foo",
289*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
290*333d2b36SAndroid Build Coastguard Worker					sdk_version: "system_current",
291*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "29",
292*333d2b36SAndroid Build Coastguard Worker					updatable: true,
293*333d2b36SAndroid Build Coastguard Worker				}`,
294*333d2b36SAndroid Build Coastguard Worker		},
295*333d2b36SAndroid Build Coastguard Worker		{
296*333d2b36SAndroid Build Coastguard Worker			name: "Current module SDK",
297*333d2b36SAndroid Build Coastguard Worker			bp: `android_app {
298*333d2b36SAndroid Build Coastguard Worker					name: "foo",
299*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
300*333d2b36SAndroid Build Coastguard Worker					sdk_version: "module_current",
301*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "29",
302*333d2b36SAndroid Build Coastguard Worker					updatable: true,
303*333d2b36SAndroid Build Coastguard Worker				}`,
304*333d2b36SAndroid Build Coastguard Worker		},
305*333d2b36SAndroid Build Coastguard Worker		{
306*333d2b36SAndroid Build Coastguard Worker			name: "Current core SDK",
307*333d2b36SAndroid Build Coastguard Worker			bp: `android_app {
308*333d2b36SAndroid Build Coastguard Worker					name: "foo",
309*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
310*333d2b36SAndroid Build Coastguard Worker					sdk_version: "core_current",
311*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "29",
312*333d2b36SAndroid Build Coastguard Worker					updatable: true,
313*333d2b36SAndroid Build Coastguard Worker				}`,
314*333d2b36SAndroid Build Coastguard Worker		},
315*333d2b36SAndroid Build Coastguard Worker		{
316*333d2b36SAndroid Build Coastguard Worker			name: "No Platform APIs",
317*333d2b36SAndroid Build Coastguard Worker			bp: `android_app {
318*333d2b36SAndroid Build Coastguard Worker					name: "foo",
319*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
320*333d2b36SAndroid Build Coastguard Worker					platform_apis: true,
321*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "29",
322*333d2b36SAndroid Build Coastguard Worker					updatable: true,
323*333d2b36SAndroid Build Coastguard Worker				}`,
324*333d2b36SAndroid Build Coastguard Worker			expectedError: "Updatable apps must use stable SDKs",
325*333d2b36SAndroid Build Coastguard Worker		},
326*333d2b36SAndroid Build Coastguard Worker		{
327*333d2b36SAndroid Build Coastguard Worker			name: "No Core Platform APIs",
328*333d2b36SAndroid Build Coastguard Worker			bp: `android_app {
329*333d2b36SAndroid Build Coastguard Worker					name: "foo",
330*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
331*333d2b36SAndroid Build Coastguard Worker					sdk_version: "core_platform",
332*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "29",
333*333d2b36SAndroid Build Coastguard Worker					updatable: true,
334*333d2b36SAndroid Build Coastguard Worker				}`,
335*333d2b36SAndroid Build Coastguard Worker			expectedError: "Updatable apps must use stable SDKs",
336*333d2b36SAndroid Build Coastguard Worker		},
337*333d2b36SAndroid Build Coastguard Worker		{
338*333d2b36SAndroid Build Coastguard Worker			name: "No unspecified APIs",
339*333d2b36SAndroid Build Coastguard Worker			bp: `android_app {
340*333d2b36SAndroid Build Coastguard Worker					name: "foo",
341*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
342*333d2b36SAndroid Build Coastguard Worker					updatable: true,
343*333d2b36SAndroid Build Coastguard Worker					min_sdk_version: "29",
344*333d2b36SAndroid Build Coastguard Worker				}`,
345*333d2b36SAndroid Build Coastguard Worker			expectedError: "Updatable apps must use stable SDK",
346*333d2b36SAndroid Build Coastguard Worker		},
347*333d2b36SAndroid Build Coastguard Worker		{
348*333d2b36SAndroid Build Coastguard Worker			name: "Must specify min_sdk_version",
349*333d2b36SAndroid Build Coastguard Worker			bp: `android_app {
350*333d2b36SAndroid Build Coastguard Worker					name: "app_without_min_sdk_version",
351*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
352*333d2b36SAndroid Build Coastguard Worker					sdk_version: "29",
353*333d2b36SAndroid Build Coastguard Worker					updatable: true,
354*333d2b36SAndroid Build Coastguard Worker				}`,
355*333d2b36SAndroid Build Coastguard Worker			expectedError: "updatable apps must set min_sdk_version.",
356*333d2b36SAndroid Build Coastguard Worker		},
357*333d2b36SAndroid Build Coastguard Worker	}
358*333d2b36SAndroid Build Coastguard Worker
359*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
360*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
361*333d2b36SAndroid Build Coastguard Worker			errorHandler := android.FixtureExpectsNoErrors
362*333d2b36SAndroid Build Coastguard Worker			if test.expectedError != "" {
363*333d2b36SAndroid Build Coastguard Worker				errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
364*333d2b36SAndroid Build Coastguard Worker			}
365*333d2b36SAndroid Build Coastguard Worker			android.GroupFixturePreparers(
366*333d2b36SAndroid Build Coastguard Worker				prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{
367*333d2b36SAndroid Build Coastguard Worker					"29": {"foo"},
368*333d2b36SAndroid Build Coastguard Worker				})).
369*333d2b36SAndroid Build Coastguard Worker				ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, test.bp)
370*333d2b36SAndroid Build Coastguard Worker		})
371*333d2b36SAndroid Build Coastguard Worker	}
372*333d2b36SAndroid Build Coastguard Worker}
373*333d2b36SAndroid Build Coastguard Worker
374*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) {
375*333d2b36SAndroid Build Coastguard Worker	testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+`
376*333d2b36SAndroid Build Coastguard Worker		android_app {
377*333d2b36SAndroid Build Coastguard Worker			name: "foo",
378*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
379*333d2b36SAndroid Build Coastguard Worker			updatable: true,
380*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
381*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
382*333d2b36SAndroid Build Coastguard Worker			static_libs: ["bar"],
383*333d2b36SAndroid Build Coastguard Worker		}
384*333d2b36SAndroid Build Coastguard Worker
385*333d2b36SAndroid Build Coastguard Worker		java_library {
386*333d2b36SAndroid Build Coastguard Worker			name: "bar",
387*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
388*333d2b36SAndroid Build Coastguard Worker		}
389*333d2b36SAndroid Build Coastguard Worker	`)
390*333d2b36SAndroid Build Coastguard Worker}
391*333d2b36SAndroid Build Coastguard Worker
392*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) {
393*333d2b36SAndroid Build Coastguard Worker	testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
394*333d2b36SAndroid Build Coastguard Worker		android_app {
395*333d2b36SAndroid Build Coastguard Worker			name: "foo",
396*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
397*333d2b36SAndroid Build Coastguard Worker			updatable: true,
398*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
399*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "current",
400*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
401*333d2b36SAndroid Build Coastguard Worker		}
402*333d2b36SAndroid Build Coastguard Worker
403*333d2b36SAndroid Build Coastguard Worker		cc_library {
404*333d2b36SAndroid Build Coastguard Worker			name: "libjni",
405*333d2b36SAndroid Build Coastguard Worker			stl: "none",
406*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
407*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
408*333d2b36SAndroid Build Coastguard Worker		}
409*333d2b36SAndroid Build Coastguard Worker	`)
410*333d2b36SAndroid Build Coastguard Worker}
411*333d2b36SAndroid Build Coastguard Worker
412*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) {
413*333d2b36SAndroid Build Coastguard Worker	bp := cc.GatherRequiredDepsForTest(android.Android) + `
414*333d2b36SAndroid Build Coastguard Worker		android_app {
415*333d2b36SAndroid Build Coastguard Worker			name: "foo",
416*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
417*333d2b36SAndroid Build Coastguard Worker			updatable: true,
418*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
419*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
420*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
421*333d2b36SAndroid Build Coastguard Worker		}
422*333d2b36SAndroid Build Coastguard Worker
423*333d2b36SAndroid Build Coastguard Worker		cc_library {
424*333d2b36SAndroid Build Coastguard Worker			name: "libjni",
425*333d2b36SAndroid Build Coastguard Worker			stl: "none",
426*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
427*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
428*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",
429*333d2b36SAndroid Build Coastguard Worker		}
430*333d2b36SAndroid Build Coastguard Worker	`
431*333d2b36SAndroid Build Coastguard Worker	fs := map[string][]byte{
432*333d2b36SAndroid Build Coastguard Worker		"prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
433*333d2b36SAndroid Build Coastguard Worker		"prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o":   nil,
434*333d2b36SAndroid Build Coastguard Worker		"prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o":   nil,
435*333d2b36SAndroid Build Coastguard Worker		"prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o":     nil,
436*333d2b36SAndroid Build Coastguard Worker	}
437*333d2b36SAndroid Build Coastguard Worker
438*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJavaWithFS(t, bp, fs)
439*333d2b36SAndroid Build Coastguard Worker
440*333d2b36SAndroid Build Coastguard Worker	inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
441*333d2b36SAndroid Build Coastguard Worker	var crtbeginFound, crtendFound bool
442*333d2b36SAndroid Build Coastguard Worker	expectedCrtBegin := ctx.ModuleForTests("crtbegin_so",
443*333d2b36SAndroid Build Coastguard Worker		"android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
444*333d2b36SAndroid Build Coastguard Worker	expectedCrtEnd := ctx.ModuleForTests("crtend_so",
445*333d2b36SAndroid Build Coastguard Worker		"android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
446*333d2b36SAndroid Build Coastguard Worker	implicits := []string{}
447*333d2b36SAndroid Build Coastguard Worker	for _, input := range inputs {
448*333d2b36SAndroid Build Coastguard Worker		implicits = append(implicits, input.String())
449*333d2b36SAndroid Build Coastguard Worker		if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
450*333d2b36SAndroid Build Coastguard Worker			crtbeginFound = true
451*333d2b36SAndroid Build Coastguard Worker		} else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
452*333d2b36SAndroid Build Coastguard Worker			crtendFound = true
453*333d2b36SAndroid Build Coastguard Worker		}
454*333d2b36SAndroid Build Coastguard Worker	}
455*333d2b36SAndroid Build Coastguard Worker	if !crtbeginFound {
456*333d2b36SAndroid Build Coastguard Worker		t.Error(fmt.Sprintf(
457*333d2b36SAndroid Build Coastguard Worker			"expected implicit with suffix %q, have the following implicits:\n%s",
458*333d2b36SAndroid Build Coastguard Worker			expectedCrtBegin, strings.Join(implicits, "\n")))
459*333d2b36SAndroid Build Coastguard Worker	}
460*333d2b36SAndroid Build Coastguard Worker	if !crtendFound {
461*333d2b36SAndroid Build Coastguard Worker		t.Error(fmt.Sprintf(
462*333d2b36SAndroid Build Coastguard Worker			"expected implicit with suffix %q, have the following implicits:\n%s",
463*333d2b36SAndroid Build Coastguard Worker			expectedCrtEnd, strings.Join(implicits, "\n")))
464*333d2b36SAndroid Build Coastguard Worker	}
465*333d2b36SAndroid Build Coastguard Worker}
466*333d2b36SAndroid Build Coastguard Worker
467*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
468*333d2b36SAndroid Build Coastguard Worker	bp := cc.GatherRequiredDepsForTest(android.Android) + `
469*333d2b36SAndroid Build Coastguard Worker		android_app {
470*333d2b36SAndroid Build Coastguard Worker			name: "foo",
471*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
472*333d2b36SAndroid Build Coastguard Worker			updatable: true,
473*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
474*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",  // this APK should support 29
475*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
476*333d2b36SAndroid Build Coastguard Worker		}
477*333d2b36SAndroid Build Coastguard Worker
478*333d2b36SAndroid Build Coastguard Worker		cc_library {
479*333d2b36SAndroid Build Coastguard Worker			name: "libjni",
480*333d2b36SAndroid Build Coastguard Worker			stl: "none",
481*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
482*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "current",
483*333d2b36SAndroid Build Coastguard Worker		}
484*333d2b36SAndroid Build Coastguard Worker	`
485*333d2b36SAndroid Build Coastguard Worker	testJavaError(t, `"libjni" .*: min_sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
486*333d2b36SAndroid Build Coastguard Worker}
487*333d2b36SAndroid Build Coastguard Worker
488*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps_ErrorIfDepMinSdkVersionIsHigher(t *testing.T) {
489*333d2b36SAndroid Build Coastguard Worker	bp := cc.GatherRequiredDepsForTest(android.Android) + `
490*333d2b36SAndroid Build Coastguard Worker		android_app {
491*333d2b36SAndroid Build Coastguard Worker			name: "foo",
492*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
493*333d2b36SAndroid Build Coastguard Worker			updatable: true,
494*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
495*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "29",  // this APK should support 29
496*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
497*333d2b36SAndroid Build Coastguard Worker		}
498*333d2b36SAndroid Build Coastguard Worker
499*333d2b36SAndroid Build Coastguard Worker		cc_library {
500*333d2b36SAndroid Build Coastguard Worker			name: "libjni",
501*333d2b36SAndroid Build Coastguard Worker			stl: "none",
502*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbar"],
503*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
504*333d2b36SAndroid Build Coastguard Worker			sdk_version: "27",
505*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "27",
506*333d2b36SAndroid Build Coastguard Worker		}
507*333d2b36SAndroid Build Coastguard Worker
508*333d2b36SAndroid Build Coastguard Worker		cc_library {
509*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
510*333d2b36SAndroid Build Coastguard Worker			stl: "none",
511*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
512*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
513*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "current",
514*333d2b36SAndroid Build Coastguard Worker		}
515*333d2b36SAndroid Build Coastguard Worker	`
516*333d2b36SAndroid Build Coastguard Worker	testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
517*333d2b36SAndroid Build Coastguard Worker}
518*333d2b36SAndroid Build Coastguard Worker
519*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps_ApplyDefaultUpdatableModuleVersion(t *testing.T) {
520*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
521*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
522*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
523*333d2b36SAndroid Build Coastguard Worker		android_app {
524*333d2b36SAndroid Build Coastguard Worker			name: "com.android.foo",
525*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
526*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
527*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "31",
528*333d2b36SAndroid Build Coastguard Worker			updatable: true,
529*333d2b36SAndroid Build Coastguard Worker		}
530*333d2b36SAndroid Build Coastguard Worker	`)
531*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
532*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t,
533*333d2b36SAndroid Build Coastguard Worker		"com.android.foo: expected manifest fixer to set override-placeholder-version to RELEASE_DEFAULT_UPDATABLE_MODULE_VERSION",
534*333d2b36SAndroid Build Coastguard Worker		foo.BuildParams.Args["args"],
535*333d2b36SAndroid Build Coastguard Worker		fmt.Sprintf("--override-placeholder-version %s", testDefaultUpdatableModuleVersion),
536*333d2b36SAndroid Build Coastguard Worker	)
537*333d2b36SAndroid Build Coastguard Worker}
538*333d2b36SAndroid Build Coastguard Worker
539*333d2b36SAndroid Build Coastguard Workerfunc TestUpdatableApps_ApplyOverrideApexManifestDefaultVersion(t *testing.T) {
540*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
541*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
542*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeEnv(map[string]string{
543*333d2b36SAndroid Build Coastguard Worker			"OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
544*333d2b36SAndroid Build Coastguard Worker		}),
545*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
546*333d2b36SAndroid Build Coastguard Worker		android_app {
547*333d2b36SAndroid Build Coastguard Worker			name: "com.android.foo",
548*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
549*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
550*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "31",
551*333d2b36SAndroid Build Coastguard Worker			updatable: true,
552*333d2b36SAndroid Build Coastguard Worker		}
553*333d2b36SAndroid Build Coastguard Worker	`)
554*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
555*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t,
556*333d2b36SAndroid Build Coastguard Worker		"com.android.foo: expected manifest fixer to set override-placeholder-version to 1234",
557*333d2b36SAndroid Build Coastguard Worker		foo.BuildParams.Args["args"],
558*333d2b36SAndroid Build Coastguard Worker		"--override-placeholder-version 1234",
559*333d2b36SAndroid Build Coastguard Worker	)
560*333d2b36SAndroid Build Coastguard Worker}
561*333d2b36SAndroid Build Coastguard Worker
562*333d2b36SAndroid Build Coastguard Workerfunc TestResourceDirs(t *testing.T) {
563*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
564*333d2b36SAndroid Build Coastguard Worker		name      string
565*333d2b36SAndroid Build Coastguard Worker		prop      string
566*333d2b36SAndroid Build Coastguard Worker		resources []string
567*333d2b36SAndroid Build Coastguard Worker	}{
568*333d2b36SAndroid Build Coastguard Worker		{
569*333d2b36SAndroid Build Coastguard Worker			name:      "no resource_dirs",
570*333d2b36SAndroid Build Coastguard Worker			prop:      "",
571*333d2b36SAndroid Build Coastguard Worker			resources: []string{"res/res/values/strings.xml"},
572*333d2b36SAndroid Build Coastguard Worker		},
573*333d2b36SAndroid Build Coastguard Worker		{
574*333d2b36SAndroid Build Coastguard Worker			name:      "resource_dirs",
575*333d2b36SAndroid Build Coastguard Worker			prop:      `resource_dirs: ["res"]`,
576*333d2b36SAndroid Build Coastguard Worker			resources: []string{"res/res/values/strings.xml"},
577*333d2b36SAndroid Build Coastguard Worker		},
578*333d2b36SAndroid Build Coastguard Worker		{
579*333d2b36SAndroid Build Coastguard Worker			name:      "empty resource_dirs",
580*333d2b36SAndroid Build Coastguard Worker			prop:      `resource_dirs: []`,
581*333d2b36SAndroid Build Coastguard Worker			resources: nil,
582*333d2b36SAndroid Build Coastguard Worker		},
583*333d2b36SAndroid Build Coastguard Worker	}
584*333d2b36SAndroid Build Coastguard Worker
585*333d2b36SAndroid Build Coastguard Worker	fs := android.MockFS{
586*333d2b36SAndroid Build Coastguard Worker		"res/res/values/strings.xml": nil,
587*333d2b36SAndroid Build Coastguard Worker	}
588*333d2b36SAndroid Build Coastguard Worker
589*333d2b36SAndroid Build Coastguard Worker	bp := `
590*333d2b36SAndroid Build Coastguard Worker			android_app {
591*333d2b36SAndroid Build Coastguard Worker				name: "foo",
592*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
593*333d2b36SAndroid Build Coastguard Worker				%s
594*333d2b36SAndroid Build Coastguard Worker			}
595*333d2b36SAndroid Build Coastguard Worker		`
596*333d2b36SAndroid Build Coastguard Worker
597*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range testCases {
598*333d2b36SAndroid Build Coastguard Worker		t.Run(testCase.name, func(t *testing.T) {
599*333d2b36SAndroid Build Coastguard Worker			result := android.GroupFixturePreparers(
600*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithJavaDefaultModules,
601*333d2b36SAndroid Build Coastguard Worker				fs.AddToFixture(),
602*333d2b36SAndroid Build Coastguard Worker			).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop))
603*333d2b36SAndroid Build Coastguard Worker
604*333d2b36SAndroid Build Coastguard Worker			module := result.ModuleForTests("foo", "android_common")
605*333d2b36SAndroid Build Coastguard Worker			resourceList := module.MaybeOutput("aapt2/res.list")
606*333d2b36SAndroid Build Coastguard Worker
607*333d2b36SAndroid Build Coastguard Worker			var resources []string
608*333d2b36SAndroid Build Coastguard Worker			if resourceList.Rule != nil {
609*333d2b36SAndroid Build Coastguard Worker				for _, compiledResource := range resourceList.Inputs.Strings() {
610*333d2b36SAndroid Build Coastguard Worker					resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
611*333d2b36SAndroid Build Coastguard Worker				}
612*333d2b36SAndroid Build Coastguard Worker			}
613*333d2b36SAndroid Build Coastguard Worker
614*333d2b36SAndroid Build Coastguard Worker			android.AssertDeepEquals(t, "resource files", testCase.resources, resources)
615*333d2b36SAndroid Build Coastguard Worker		})
616*333d2b36SAndroid Build Coastguard Worker	}
617*333d2b36SAndroid Build Coastguard Worker}
618*333d2b36SAndroid Build Coastguard Worker
619*333d2b36SAndroid Build Coastguard Workerfunc TestLibraryAssets(t *testing.T) {
620*333d2b36SAndroid Build Coastguard Worker	bp := `
621*333d2b36SAndroid Build Coastguard Worker			android_app {
622*333d2b36SAndroid Build Coastguard Worker				name: "foo",
623*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
624*333d2b36SAndroid Build Coastguard Worker				static_libs: ["lib1", "lib2", "lib3"],
625*333d2b36SAndroid Build Coastguard Worker			}
626*333d2b36SAndroid Build Coastguard Worker
627*333d2b36SAndroid Build Coastguard Worker			android_library {
628*333d2b36SAndroid Build Coastguard Worker				name: "lib1",
629*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
630*333d2b36SAndroid Build Coastguard Worker				asset_dirs: ["assets_a"],
631*333d2b36SAndroid Build Coastguard Worker			}
632*333d2b36SAndroid Build Coastguard Worker
633*333d2b36SAndroid Build Coastguard Worker			android_library {
634*333d2b36SAndroid Build Coastguard Worker				name: "lib2",
635*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
636*333d2b36SAndroid Build Coastguard Worker			}
637*333d2b36SAndroid Build Coastguard Worker
638*333d2b36SAndroid Build Coastguard Worker			android_library {
639*333d2b36SAndroid Build Coastguard Worker				name: "lib3",
640*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
641*333d2b36SAndroid Build Coastguard Worker				static_libs: ["lib4", "import"],
642*333d2b36SAndroid Build Coastguard Worker			}
643*333d2b36SAndroid Build Coastguard Worker
644*333d2b36SAndroid Build Coastguard Worker			android_library {
645*333d2b36SAndroid Build Coastguard Worker				name: "lib4",
646*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
647*333d2b36SAndroid Build Coastguard Worker				asset_dirs: ["assets_b"],
648*333d2b36SAndroid Build Coastguard Worker			}
649*333d2b36SAndroid Build Coastguard Worker
650*333d2b36SAndroid Build Coastguard Worker			android_library {
651*333d2b36SAndroid Build Coastguard Worker				name: "lib5",
652*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
653*333d2b36SAndroid Build Coastguard Worker				assets: [
654*333d2b36SAndroid Build Coastguard Worker					"path/to/asset_file_1",
655*333d2b36SAndroid Build Coastguard Worker					"path/to/asset_file_2",
656*333d2b36SAndroid Build Coastguard Worker				],
657*333d2b36SAndroid Build Coastguard Worker			}
658*333d2b36SAndroid Build Coastguard Worker
659*333d2b36SAndroid Build Coastguard Worker			android_library_import {
660*333d2b36SAndroid Build Coastguard Worker				name: "import",
661*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
662*333d2b36SAndroid Build Coastguard Worker				aars: ["import.aar"],
663*333d2b36SAndroid Build Coastguard Worker			}
664*333d2b36SAndroid Build Coastguard Worker		`
665*333d2b36SAndroid Build Coastguard Worker
666*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
667*333d2b36SAndroid Build Coastguard Worker		name               string
668*333d2b36SAndroid Build Coastguard Worker		assetFlag          string
669*333d2b36SAndroid Build Coastguard Worker		assetPackages      []string
670*333d2b36SAndroid Build Coastguard Worker		tmpAssetDirInputs  []string
671*333d2b36SAndroid Build Coastguard Worker		tmpAssetDirOutputs []string
672*333d2b36SAndroid Build Coastguard Worker	}{
673*333d2b36SAndroid Build Coastguard Worker		{
674*333d2b36SAndroid Build Coastguard Worker			name: "foo",
675*333d2b36SAndroid Build Coastguard Worker			// lib1 has its own assets. lib3 doesn't have any, but lib4 and import have assets.
676*333d2b36SAndroid Build Coastguard Worker			assetPackages: []string{
677*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
678*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/lib1/android_common/assets.zip",
679*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/lib4/android_common/assets.zip",
680*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/import/android_common/assets.zip",
681*333d2b36SAndroid Build Coastguard Worker			},
682*333d2b36SAndroid Build Coastguard Worker		},
683*333d2b36SAndroid Build Coastguard Worker		{
684*333d2b36SAndroid Build Coastguard Worker			name:      "lib1",
685*333d2b36SAndroid Build Coastguard Worker			assetFlag: "-A assets_a",
686*333d2b36SAndroid Build Coastguard Worker		},
687*333d2b36SAndroid Build Coastguard Worker		{
688*333d2b36SAndroid Build Coastguard Worker			name: "lib2",
689*333d2b36SAndroid Build Coastguard Worker		},
690*333d2b36SAndroid Build Coastguard Worker		{
691*333d2b36SAndroid Build Coastguard Worker			name: "lib3",
692*333d2b36SAndroid Build Coastguard Worker		},
693*333d2b36SAndroid Build Coastguard Worker		{
694*333d2b36SAndroid Build Coastguard Worker			name:      "lib4",
695*333d2b36SAndroid Build Coastguard Worker			assetFlag: "-A assets_b",
696*333d2b36SAndroid Build Coastguard Worker		},
697*333d2b36SAndroid Build Coastguard Worker		{
698*333d2b36SAndroid Build Coastguard Worker			name:      "lib5",
699*333d2b36SAndroid Build Coastguard Worker			assetFlag: "-A out/soong/.intermediates/lib5/android_common/tmp_asset_dir",
700*333d2b36SAndroid Build Coastguard Worker			tmpAssetDirInputs: []string{
701*333d2b36SAndroid Build Coastguard Worker				"path/to/asset_file_1",
702*333d2b36SAndroid Build Coastguard Worker				"path/to/asset_file_2",
703*333d2b36SAndroid Build Coastguard Worker			},
704*333d2b36SAndroid Build Coastguard Worker			tmpAssetDirOutputs: []string{
705*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_1",
706*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_2",
707*333d2b36SAndroid Build Coastguard Worker			},
708*333d2b36SAndroid Build Coastguard Worker		},
709*333d2b36SAndroid Build Coastguard Worker	}
710*333d2b36SAndroid Build Coastguard Worker	ctx := testApp(t, bp)
711*333d2b36SAndroid Build Coastguard Worker
712*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
713*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
714*333d2b36SAndroid Build Coastguard Worker			m := ctx.ModuleForTests(test.name, "android_common")
715*333d2b36SAndroid Build Coastguard Worker
716*333d2b36SAndroid Build Coastguard Worker			// Check asset flag in aapt2 link flags
717*333d2b36SAndroid Build Coastguard Worker			var aapt2link android.TestingBuildParams
718*333d2b36SAndroid Build Coastguard Worker			if len(test.assetPackages) > 0 {
719*333d2b36SAndroid Build Coastguard Worker				aapt2link = m.Output("aapt2/package-res.apk")
720*333d2b36SAndroid Build Coastguard Worker			} else {
721*333d2b36SAndroid Build Coastguard Worker				aapt2link = m.Output("package-res.apk")
722*333d2b36SAndroid Build Coastguard Worker			}
723*333d2b36SAndroid Build Coastguard Worker			aapt2link = aapt2link
724*333d2b36SAndroid Build Coastguard Worker			aapt2Flags := aapt2link.Args["flags"]
725*333d2b36SAndroid Build Coastguard Worker			if test.assetFlag != "" {
726*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
727*333d2b36SAndroid Build Coastguard Worker			} else {
728*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
729*333d2b36SAndroid Build Coastguard Worker			}
730*333d2b36SAndroid Build Coastguard Worker
731*333d2b36SAndroid Build Coastguard Worker			// Check asset merge rule.
732*333d2b36SAndroid Build Coastguard Worker			if len(test.assetPackages) > 0 {
733*333d2b36SAndroid Build Coastguard Worker				mergeAssets := m.Output("package-res.apk")
734*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
735*333d2b36SAndroid Build Coastguard Worker			}
736*333d2b36SAndroid Build Coastguard Worker
737*333d2b36SAndroid Build Coastguard Worker			if len(test.tmpAssetDirInputs) > 0 {
738*333d2b36SAndroid Build Coastguard Worker				rule := m.Rule("tmp_asset_dir")
739*333d2b36SAndroid Build Coastguard Worker				inputs := rule.Implicits
740*333d2b36SAndroid Build Coastguard Worker				outputs := append(android.WritablePaths{rule.Output}, rule.ImplicitOutputs...).Paths()
741*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir inputs", test.tmpAssetDirInputs, inputs)
742*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir outputs", test.tmpAssetDirOutputs, outputs)
743*333d2b36SAndroid Build Coastguard Worker			}
744*333d2b36SAndroid Build Coastguard Worker		})
745*333d2b36SAndroid Build Coastguard Worker	}
746*333d2b36SAndroid Build Coastguard Worker}
747*333d2b36SAndroid Build Coastguard Worker
748*333d2b36SAndroid Build Coastguard Workerfunc TestAppJavaResources(t *testing.T) {
749*333d2b36SAndroid Build Coastguard Worker	bp := `
750*333d2b36SAndroid Build Coastguard Worker			android_app {
751*333d2b36SAndroid Build Coastguard Worker				name: "foo",
752*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
753*333d2b36SAndroid Build Coastguard Worker				java_resources: ["resources/a"],
754*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java"],
755*333d2b36SAndroid Build Coastguard Worker			}
756*333d2b36SAndroid Build Coastguard Worker
757*333d2b36SAndroid Build Coastguard Worker			android_app {
758*333d2b36SAndroid Build Coastguard Worker				name: "bar",
759*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
760*333d2b36SAndroid Build Coastguard Worker				java_resources: ["resources/a"],
761*333d2b36SAndroid Build Coastguard Worker			}
762*333d2b36SAndroid Build Coastguard Worker		`
763*333d2b36SAndroid Build Coastguard Worker
764*333d2b36SAndroid Build Coastguard Worker	ctx := testApp(t, bp)
765*333d2b36SAndroid Build Coastguard Worker
766*333d2b36SAndroid Build Coastguard Worker	foo := ctx.ModuleForTests("foo", "android_common")
767*333d2b36SAndroid Build Coastguard Worker	fooResources := foo.Output("res/foo.jar")
768*333d2b36SAndroid Build Coastguard Worker	fooDexJar := foo.Output("dex-withres/foo.jar")
769*333d2b36SAndroid Build Coastguard Worker	fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
770*333d2b36SAndroid Build Coastguard Worker	fooApk := foo.Rule("combineApk")
771*333d2b36SAndroid Build Coastguard Worker
772*333d2b36SAndroid Build Coastguard Worker	if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
773*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
774*333d2b36SAndroid Build Coastguard Worker	}
775*333d2b36SAndroid Build Coastguard Worker
776*333d2b36SAndroid Build Coastguard Worker	if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
777*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
778*333d2b36SAndroid Build Coastguard Worker	}
779*333d2b36SAndroid Build Coastguard Worker
780*333d2b36SAndroid Build Coastguard Worker	if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
781*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
782*333d2b36SAndroid Build Coastguard Worker	}
783*333d2b36SAndroid Build Coastguard Worker
784*333d2b36SAndroid Build Coastguard Worker	bar := ctx.ModuleForTests("bar", "android_common")
785*333d2b36SAndroid Build Coastguard Worker	barResources := bar.Output("res/bar.jar")
786*333d2b36SAndroid Build Coastguard Worker	barApk := bar.Rule("combineApk")
787*333d2b36SAndroid Build Coastguard Worker
788*333d2b36SAndroid Build Coastguard Worker	if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
789*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
790*333d2b36SAndroid Build Coastguard Worker	}
791*333d2b36SAndroid Build Coastguard Worker}
792*333d2b36SAndroid Build Coastguard Worker
793*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidResourceProcessor(t *testing.T) {
794*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
795*333d2b36SAndroid Build Coastguard Worker		name                            string
796*333d2b36SAndroid Build Coastguard Worker		appUsesRP                       bool
797*333d2b36SAndroid Build Coastguard Worker		directLibUsesRP                 bool
798*333d2b36SAndroid Build Coastguard Worker		transitiveLibUsesRP             bool
799*333d2b36SAndroid Build Coastguard Worker		sharedLibUsesRP                 bool
800*333d2b36SAndroid Build Coastguard Worker		sharedTransitiveStaticLibUsesRP bool
801*333d2b36SAndroid Build Coastguard Worker		sharedTransitiveSharedLibUsesRP bool
802*333d2b36SAndroid Build Coastguard Worker
803*333d2b36SAndroid Build Coastguard Worker		dontVerifyApp bool
804*333d2b36SAndroid Build Coastguard Worker		appResources  []string
805*333d2b36SAndroid Build Coastguard Worker		appOverlays   []string
806*333d2b36SAndroid Build Coastguard Worker		appImports    []string
807*333d2b36SAndroid Build Coastguard Worker		appSrcJars    []string
808*333d2b36SAndroid Build Coastguard Worker		appClasspath  []string
809*333d2b36SAndroid Build Coastguard Worker		appCombined   []string
810*333d2b36SAndroid Build Coastguard Worker
811*333d2b36SAndroid Build Coastguard Worker		dontVerifyDirect bool
812*333d2b36SAndroid Build Coastguard Worker		directResources  []string
813*333d2b36SAndroid Build Coastguard Worker		directOverlays   []string
814*333d2b36SAndroid Build Coastguard Worker		directImports    []string
815*333d2b36SAndroid Build Coastguard Worker		directSrcJars    []string
816*333d2b36SAndroid Build Coastguard Worker		directClasspath  []string
817*333d2b36SAndroid Build Coastguard Worker		directCombined   []string
818*333d2b36SAndroid Build Coastguard Worker
819*333d2b36SAndroid Build Coastguard Worker		dontVerifyTransitive bool
820*333d2b36SAndroid Build Coastguard Worker		transitiveResources  []string
821*333d2b36SAndroid Build Coastguard Worker		transitiveOverlays   []string
822*333d2b36SAndroid Build Coastguard Worker		transitiveImports    []string
823*333d2b36SAndroid Build Coastguard Worker		transitiveSrcJars    []string
824*333d2b36SAndroid Build Coastguard Worker		transitiveClasspath  []string
825*333d2b36SAndroid Build Coastguard Worker		transitiveCombined   []string
826*333d2b36SAndroid Build Coastguard Worker
827*333d2b36SAndroid Build Coastguard Worker		dontVerifyDirectImport bool
828*333d2b36SAndroid Build Coastguard Worker		directImportResources  []string
829*333d2b36SAndroid Build Coastguard Worker		directImportOverlays   []string
830*333d2b36SAndroid Build Coastguard Worker		directImportImports    []string
831*333d2b36SAndroid Build Coastguard Worker
832*333d2b36SAndroid Build Coastguard Worker		dontVerifyTransitiveImport bool
833*333d2b36SAndroid Build Coastguard Worker		transitiveImportResources  []string
834*333d2b36SAndroid Build Coastguard Worker		transitiveImportOverlays   []string
835*333d2b36SAndroid Build Coastguard Worker		transitiveImportImports    []string
836*333d2b36SAndroid Build Coastguard Worker
837*333d2b36SAndroid Build Coastguard Worker		dontVerifyShared bool
838*333d2b36SAndroid Build Coastguard Worker		sharedResources  []string
839*333d2b36SAndroid Build Coastguard Worker		sharedOverlays   []string
840*333d2b36SAndroid Build Coastguard Worker		sharedImports    []string
841*333d2b36SAndroid Build Coastguard Worker		sharedSrcJars    []string
842*333d2b36SAndroid Build Coastguard Worker		sharedClasspath  []string
843*333d2b36SAndroid Build Coastguard Worker		sharedCombined   []string
844*333d2b36SAndroid Build Coastguard Worker	}{
845*333d2b36SAndroid Build Coastguard Worker		{
846*333d2b36SAndroid Build Coastguard Worker			// Test with all modules set to use_resource_processor: false (except android_library_import modules,
847*333d2b36SAndroid Build Coastguard Worker			// which always use resource processor).
848*333d2b36SAndroid Build Coastguard Worker			name:                "legacy",
849*333d2b36SAndroid Build Coastguard Worker			appUsesRP:           false,
850*333d2b36SAndroid Build Coastguard Worker			directLibUsesRP:     false,
851*333d2b36SAndroid Build Coastguard Worker			transitiveLibUsesRP: false,
852*333d2b36SAndroid Build Coastguard Worker
853*333d2b36SAndroid Build Coastguard Worker			appResources: nil,
854*333d2b36SAndroid Build Coastguard Worker			appOverlays: []string{
855*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/package-res.apk",
856*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
857*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/package-res.apk",
858*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/package-res.apk",
859*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
860*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import/android_common/package-res.apk",
861*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
862*333d2b36SAndroid Build Coastguard Worker			},
863*333d2b36SAndroid Build Coastguard Worker			appImports: []string{
864*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared/android_common/package-res.apk",
865*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
866*333d2b36SAndroid Build Coastguard Worker			},
867*333d2b36SAndroid Build Coastguard Worker			appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
868*333d2b36SAndroid Build Coastguard Worker			appClasspath: []string{
869*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
870*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
871*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
872*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
873*333d2b36SAndroid Build Coastguard Worker			},
874*333d2b36SAndroid Build Coastguard Worker			appCombined: []string{
875*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/app/android_common/javac/app.jar",
876*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/combined/direct.jar",
877*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
878*333d2b36SAndroid Build Coastguard Worker			},
879*333d2b36SAndroid Build Coastguard Worker
880*333d2b36SAndroid Build Coastguard Worker			directResources: nil,
881*333d2b36SAndroid Build Coastguard Worker			directOverlays: []string{
882*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/package-res.apk",
883*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
884*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/package-res.apk",
885*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
886*333d2b36SAndroid Build Coastguard Worker			},
887*333d2b36SAndroid Build Coastguard Worker			directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
888*333d2b36SAndroid Build Coastguard Worker			directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
889*333d2b36SAndroid Build Coastguard Worker			directClasspath: []string{
890*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
891*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
892*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
893*333d2b36SAndroid Build Coastguard Worker			},
894*333d2b36SAndroid Build Coastguard Worker			directCombined: []string{
895*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/javac/direct.jar",
896*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
897*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
898*333d2b36SAndroid Build Coastguard Worker			},
899*333d2b36SAndroid Build Coastguard Worker
900*333d2b36SAndroid Build Coastguard Worker			transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
901*333d2b36SAndroid Build Coastguard Worker			transitiveOverlays:  nil,
902*333d2b36SAndroid Build Coastguard Worker			transitiveImports:   []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
903*333d2b36SAndroid Build Coastguard Worker			transitiveSrcJars:   []string{"out/soong/.intermediates/transitive/android_common/gen/android/R.srcjar"},
904*333d2b36SAndroid Build Coastguard Worker			transitiveClasspath: []string{"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar"},
905*333d2b36SAndroid Build Coastguard Worker			transitiveCombined:  nil,
906*333d2b36SAndroid Build Coastguard Worker
907*333d2b36SAndroid Build Coastguard Worker			sharedResources: nil,
908*333d2b36SAndroid Build Coastguard Worker			sharedOverlays: []string{
909*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
910*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat",
911*333d2b36SAndroid Build Coastguard Worker			},
912*333d2b36SAndroid Build Coastguard Worker			sharedImports: []string{
913*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
914*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
915*333d2b36SAndroid Build Coastguard Worker			},
916*333d2b36SAndroid Build Coastguard Worker			sharedSrcJars: []string{"out/soong/.intermediates/shared/android_common/gen/android/R.srcjar"},
917*333d2b36SAndroid Build Coastguard Worker			sharedClasspath: []string{
918*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
919*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar",
920*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar",
921*333d2b36SAndroid Build Coastguard Worker			},
922*333d2b36SAndroid Build Coastguard Worker			sharedCombined: []string{
923*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared/android_common/javac/shared.jar",
924*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
925*333d2b36SAndroid Build Coastguard Worker			},
926*333d2b36SAndroid Build Coastguard Worker
927*333d2b36SAndroid Build Coastguard Worker			directImportResources: nil,
928*333d2b36SAndroid Build Coastguard Worker			directImportOverlays:  []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
929*333d2b36SAndroid Build Coastguard Worker			directImportImports: []string{
930*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
931*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
932*333d2b36SAndroid Build Coastguard Worker			},
933*333d2b36SAndroid Build Coastguard Worker
934*333d2b36SAndroid Build Coastguard Worker			transitiveImportResources: nil,
935*333d2b36SAndroid Build Coastguard Worker			transitiveImportOverlays:  []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
936*333d2b36SAndroid Build Coastguard Worker			transitiveImportImports: []string{
937*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
938*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
939*333d2b36SAndroid Build Coastguard Worker			},
940*333d2b36SAndroid Build Coastguard Worker		},
941*333d2b36SAndroid Build Coastguard Worker		{
942*333d2b36SAndroid Build Coastguard Worker			// Test with all modules set to use_resource_processor: true.
943*333d2b36SAndroid Build Coastguard Worker			name:                            "resource_processor",
944*333d2b36SAndroid Build Coastguard Worker			appUsesRP:                       true,
945*333d2b36SAndroid Build Coastguard Worker			directLibUsesRP:                 true,
946*333d2b36SAndroid Build Coastguard Worker			transitiveLibUsesRP:             true,
947*333d2b36SAndroid Build Coastguard Worker			sharedLibUsesRP:                 true,
948*333d2b36SAndroid Build Coastguard Worker			sharedTransitiveSharedLibUsesRP: true,
949*333d2b36SAndroid Build Coastguard Worker			sharedTransitiveStaticLibUsesRP: true,
950*333d2b36SAndroid Build Coastguard Worker
951*333d2b36SAndroid Build Coastguard Worker			appResources: nil,
952*333d2b36SAndroid Build Coastguard Worker			appOverlays: []string{
953*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/package-res.apk",
954*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
955*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/package-res.apk",
956*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/package-res.apk",
957*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
958*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import/android_common/package-res.apk",
959*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
960*333d2b36SAndroid Build Coastguard Worker			},
961*333d2b36SAndroid Build Coastguard Worker			appImports: []string{
962*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared/android_common/package-res.apk",
963*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
964*333d2b36SAndroid Build Coastguard Worker			},
965*333d2b36SAndroid Build Coastguard Worker			appSrcJars: nil,
966*333d2b36SAndroid Build Coastguard Worker			appClasspath: []string{
967*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
968*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/app/android_common/busybox/R.jar",
969*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
970*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
971*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
972*333d2b36SAndroid Build Coastguard Worker			},
973*333d2b36SAndroid Build Coastguard Worker			appCombined: []string{
974*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/app/android_common/javac/app.jar",
975*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/app/android_common/busybox/R.jar",
976*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/combined/direct.jar",
977*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
978*333d2b36SAndroid Build Coastguard Worker			},
979*333d2b36SAndroid Build Coastguard Worker
980*333d2b36SAndroid Build Coastguard Worker			directResources: nil,
981*333d2b36SAndroid Build Coastguard Worker			directOverlays:  []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
982*333d2b36SAndroid Build Coastguard Worker			directImports: []string{
983*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
984*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/package-res.apk",
985*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
986*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/package-res.apk",
987*333d2b36SAndroid Build Coastguard Worker			},
988*333d2b36SAndroid Build Coastguard Worker			directSrcJars: nil,
989*333d2b36SAndroid Build Coastguard Worker			directClasspath: []string{
990*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
991*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/busybox/R.jar",
992*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/busybox/R.jar",
993*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
994*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
995*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
996*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
997*333d2b36SAndroid Build Coastguard Worker			},
998*333d2b36SAndroid Build Coastguard Worker			directCombined: []string{
999*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/javac/direct.jar",
1000*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1001*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
1002*333d2b36SAndroid Build Coastguard Worker			},
1003*333d2b36SAndroid Build Coastguard Worker
1004*333d2b36SAndroid Build Coastguard Worker			transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1005*333d2b36SAndroid Build Coastguard Worker			transitiveOverlays:  nil,
1006*333d2b36SAndroid Build Coastguard Worker			transitiveImports:   []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1007*333d2b36SAndroid Build Coastguard Worker			transitiveSrcJars:   nil,
1008*333d2b36SAndroid Build Coastguard Worker			transitiveClasspath: []string{
1009*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1010*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1011*333d2b36SAndroid Build Coastguard Worker			},
1012*333d2b36SAndroid Build Coastguard Worker			transitiveCombined: nil,
1013*333d2b36SAndroid Build Coastguard Worker
1014*333d2b36SAndroid Build Coastguard Worker			sharedResources: nil,
1015*333d2b36SAndroid Build Coastguard Worker			sharedOverlays:  []string{"out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat"},
1016*333d2b36SAndroid Build Coastguard Worker			sharedImports: []string{
1017*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
1018*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1019*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
1020*333d2b36SAndroid Build Coastguard Worker			},
1021*333d2b36SAndroid Build Coastguard Worker			sharedSrcJars: nil,
1022*333d2b36SAndroid Build Coastguard Worker			sharedClasspath: []string{
1023*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1024*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared/android_common/busybox/R.jar",
1025*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared_transitive_static/android_common/busybox/R.jar",
1026*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared_transitive_shared/android_common/busybox/R.jar",
1027*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar",
1028*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar",
1029*333d2b36SAndroid Build Coastguard Worker			},
1030*333d2b36SAndroid Build Coastguard Worker			sharedCombined: []string{
1031*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared/android_common/javac/shared.jar",
1032*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
1033*333d2b36SAndroid Build Coastguard Worker			},
1034*333d2b36SAndroid Build Coastguard Worker
1035*333d2b36SAndroid Build Coastguard Worker			directImportResources: nil,
1036*333d2b36SAndroid Build Coastguard Worker			directImportOverlays:  []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
1037*333d2b36SAndroid Build Coastguard Worker			directImportImports: []string{
1038*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1039*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1040*333d2b36SAndroid Build Coastguard Worker			},
1041*333d2b36SAndroid Build Coastguard Worker
1042*333d2b36SAndroid Build Coastguard Worker			transitiveImportResources: nil,
1043*333d2b36SAndroid Build Coastguard Worker			transitiveImportOverlays:  []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
1044*333d2b36SAndroid Build Coastguard Worker			transitiveImportImports: []string{
1045*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1046*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1047*333d2b36SAndroid Build Coastguard Worker			},
1048*333d2b36SAndroid Build Coastguard Worker		}, {
1049*333d2b36SAndroid Build Coastguard Worker			// Test an app building with resource processor enabled but with dependencies built without
1050*333d2b36SAndroid Build Coastguard Worker			// resource processor.
1051*333d2b36SAndroid Build Coastguard Worker			name:                "app_resource_processor",
1052*333d2b36SAndroid Build Coastguard Worker			appUsesRP:           true,
1053*333d2b36SAndroid Build Coastguard Worker			directLibUsesRP:     false,
1054*333d2b36SAndroid Build Coastguard Worker			transitiveLibUsesRP: false,
1055*333d2b36SAndroid Build Coastguard Worker
1056*333d2b36SAndroid Build Coastguard Worker			appResources: nil,
1057*333d2b36SAndroid Build Coastguard Worker			appOverlays: []string{
1058*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/package-res.apk",
1059*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1060*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1061*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/package-res.apk",
1062*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1063*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import/android_common/package-res.apk",
1064*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1065*333d2b36SAndroid Build Coastguard Worker			},
1066*333d2b36SAndroid Build Coastguard Worker			appImports: []string{
1067*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared/android_common/package-res.apk",
1068*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1069*333d2b36SAndroid Build Coastguard Worker			},
1070*333d2b36SAndroid Build Coastguard Worker			appSrcJars: nil,
1071*333d2b36SAndroid Build Coastguard Worker			appClasspath: []string{
1072*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1073*333d2b36SAndroid Build Coastguard Worker				// R.jar has to come before direct.jar
1074*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/app/android_common/busybox/R.jar",
1075*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
1076*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
1077*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
1078*333d2b36SAndroid Build Coastguard Worker			},
1079*333d2b36SAndroid Build Coastguard Worker			appCombined: []string{
1080*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/app/android_common/javac/app.jar",
1081*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/app/android_common/busybox/R.jar",
1082*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/combined/direct.jar",
1083*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
1084*333d2b36SAndroid Build Coastguard Worker			},
1085*333d2b36SAndroid Build Coastguard Worker
1086*333d2b36SAndroid Build Coastguard Worker			dontVerifyDirect:           true,
1087*333d2b36SAndroid Build Coastguard Worker			dontVerifyTransitive:       true,
1088*333d2b36SAndroid Build Coastguard Worker			dontVerifyShared:           true,
1089*333d2b36SAndroid Build Coastguard Worker			dontVerifyDirectImport:     true,
1090*333d2b36SAndroid Build Coastguard Worker			dontVerifyTransitiveImport: true,
1091*333d2b36SAndroid Build Coastguard Worker		},
1092*333d2b36SAndroid Build Coastguard Worker		{
1093*333d2b36SAndroid Build Coastguard Worker			// Test an app building without resource processor enabled but with a dependency built with
1094*333d2b36SAndroid Build Coastguard Worker			// resource processor.
1095*333d2b36SAndroid Build Coastguard Worker			name:                "app_dependency_lib_resource_processor",
1096*333d2b36SAndroid Build Coastguard Worker			appUsesRP:           false,
1097*333d2b36SAndroid Build Coastguard Worker			directLibUsesRP:     true,
1098*333d2b36SAndroid Build Coastguard Worker			transitiveLibUsesRP: false,
1099*333d2b36SAndroid Build Coastguard Worker
1100*333d2b36SAndroid Build Coastguard Worker			appOverlays: []string{
1101*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/package-res.apk",
1102*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1103*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1104*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/package-res.apk",
1105*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1106*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import/android_common/package-res.apk",
1107*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1108*333d2b36SAndroid Build Coastguard Worker			},
1109*333d2b36SAndroid Build Coastguard Worker			appImports: []string{
1110*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared/android_common/package-res.apk",
1111*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1112*333d2b36SAndroid Build Coastguard Worker			},
1113*333d2b36SAndroid Build Coastguard Worker			appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1114*333d2b36SAndroid Build Coastguard Worker			appClasspath: []string{
1115*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1116*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
1117*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
1118*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
1119*333d2b36SAndroid Build Coastguard Worker			},
1120*333d2b36SAndroid Build Coastguard Worker			appCombined: []string{
1121*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/app/android_common/javac/app.jar",
1122*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/combined/direct.jar",
1123*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
1124*333d2b36SAndroid Build Coastguard Worker			},
1125*333d2b36SAndroid Build Coastguard Worker
1126*333d2b36SAndroid Build Coastguard Worker			directResources: nil,
1127*333d2b36SAndroid Build Coastguard Worker			directOverlays:  []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
1128*333d2b36SAndroid Build Coastguard Worker			directImports: []string{
1129*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1130*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1131*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1132*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/package-res.apk",
1133*333d2b36SAndroid Build Coastguard Worker			},
1134*333d2b36SAndroid Build Coastguard Worker			directSrcJars: nil,
1135*333d2b36SAndroid Build Coastguard Worker			directClasspath: []string{
1136*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1137*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/busybox/R.jar",
1138*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
1139*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
1140*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
1141*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
1142*333d2b36SAndroid Build Coastguard Worker			},
1143*333d2b36SAndroid Build Coastguard Worker			directCombined: []string{
1144*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/javac/direct.jar",
1145*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1146*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
1147*333d2b36SAndroid Build Coastguard Worker			},
1148*333d2b36SAndroid Build Coastguard Worker
1149*333d2b36SAndroid Build Coastguard Worker			dontVerifyTransitive:       true,
1150*333d2b36SAndroid Build Coastguard Worker			dontVerifyShared:           true,
1151*333d2b36SAndroid Build Coastguard Worker			dontVerifyDirectImport:     true,
1152*333d2b36SAndroid Build Coastguard Worker			dontVerifyTransitiveImport: true,
1153*333d2b36SAndroid Build Coastguard Worker		},
1154*333d2b36SAndroid Build Coastguard Worker		{
1155*333d2b36SAndroid Build Coastguard Worker			// Test a library building without resource processor enabled but with a dependency built with
1156*333d2b36SAndroid Build Coastguard Worker			// resource processor.
1157*333d2b36SAndroid Build Coastguard Worker			name:                "lib_dependency_lib_resource_processor",
1158*333d2b36SAndroid Build Coastguard Worker			appUsesRP:           false,
1159*333d2b36SAndroid Build Coastguard Worker			directLibUsesRP:     false,
1160*333d2b36SAndroid Build Coastguard Worker			transitiveLibUsesRP: true,
1161*333d2b36SAndroid Build Coastguard Worker
1162*333d2b36SAndroid Build Coastguard Worker			appOverlays: []string{
1163*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/package-res.apk",
1164*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1165*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1166*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/package-res.apk",
1167*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1168*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import/android_common/package-res.apk",
1169*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1170*333d2b36SAndroid Build Coastguard Worker			},
1171*333d2b36SAndroid Build Coastguard Worker			appImports: []string{
1172*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared/android_common/package-res.apk",
1173*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1174*333d2b36SAndroid Build Coastguard Worker			},
1175*333d2b36SAndroid Build Coastguard Worker			appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1176*333d2b36SAndroid Build Coastguard Worker			appClasspath: []string{
1177*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1178*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
1179*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
1180*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
1181*333d2b36SAndroid Build Coastguard Worker			},
1182*333d2b36SAndroid Build Coastguard Worker			appCombined: []string{
1183*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/app/android_common/javac/app.jar",
1184*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/combined/direct.jar",
1185*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
1186*333d2b36SAndroid Build Coastguard Worker			},
1187*333d2b36SAndroid Build Coastguard Worker
1188*333d2b36SAndroid Build Coastguard Worker			directResources: nil,
1189*333d2b36SAndroid Build Coastguard Worker			directOverlays: []string{
1190*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/package-res.apk",
1191*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1192*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1193*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
1194*333d2b36SAndroid Build Coastguard Worker			},
1195*333d2b36SAndroid Build Coastguard Worker			directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1196*333d2b36SAndroid Build Coastguard Worker			directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
1197*333d2b36SAndroid Build Coastguard Worker			directClasspath: []string{
1198*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1199*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
1200*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
1201*333d2b36SAndroid Build Coastguard Worker			},
1202*333d2b36SAndroid Build Coastguard Worker			directCombined: []string{
1203*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/direct/android_common/javac/direct.jar",
1204*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1205*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
1206*333d2b36SAndroid Build Coastguard Worker			},
1207*333d2b36SAndroid Build Coastguard Worker
1208*333d2b36SAndroid Build Coastguard Worker			transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1209*333d2b36SAndroid Build Coastguard Worker			transitiveOverlays:  nil,
1210*333d2b36SAndroid Build Coastguard Worker			transitiveImports:   []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1211*333d2b36SAndroid Build Coastguard Worker			transitiveSrcJars:   nil,
1212*333d2b36SAndroid Build Coastguard Worker			transitiveClasspath: []string{
1213*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1214*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1215*333d2b36SAndroid Build Coastguard Worker			},
1216*333d2b36SAndroid Build Coastguard Worker			transitiveCombined: nil,
1217*333d2b36SAndroid Build Coastguard Worker
1218*333d2b36SAndroid Build Coastguard Worker			dontVerifyShared:           true,
1219*333d2b36SAndroid Build Coastguard Worker			dontVerifyDirectImport:     true,
1220*333d2b36SAndroid Build Coastguard Worker			dontVerifyTransitiveImport: true,
1221*333d2b36SAndroid Build Coastguard Worker		},
1222*333d2b36SAndroid Build Coastguard Worker	}
1223*333d2b36SAndroid Build Coastguard Worker
1224*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range testCases {
1225*333d2b36SAndroid Build Coastguard Worker		t.Run(testCase.name, func(t *testing.T) {
1226*333d2b36SAndroid Build Coastguard Worker			bp := fmt.Sprintf(`
1227*333d2b36SAndroid Build Coastguard Worker				android_app {
1228*333d2b36SAndroid Build Coastguard Worker					name: "app",
1229*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
1230*333d2b36SAndroid Build Coastguard Worker					srcs: ["app/app.java"],
1231*333d2b36SAndroid Build Coastguard Worker					resource_dirs: ["app/res"],
1232*333d2b36SAndroid Build Coastguard Worker					manifest: "app/AndroidManifest.xml",
1233*333d2b36SAndroid Build Coastguard Worker					libs: ["shared"],
1234*333d2b36SAndroid Build Coastguard Worker					static_libs: ["direct", "direct_import"],
1235*333d2b36SAndroid Build Coastguard Worker					use_resource_processor: %v,
1236*333d2b36SAndroid Build Coastguard Worker				}
1237*333d2b36SAndroid Build Coastguard Worker
1238*333d2b36SAndroid Build Coastguard Worker				android_library {
1239*333d2b36SAndroid Build Coastguard Worker					name: "direct",
1240*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
1241*333d2b36SAndroid Build Coastguard Worker					srcs: ["direct/direct.java"],
1242*333d2b36SAndroid Build Coastguard Worker					resource_dirs: ["direct/res"],
1243*333d2b36SAndroid Build Coastguard Worker					manifest: "direct/AndroidManifest.xml",
1244*333d2b36SAndroid Build Coastguard Worker					static_libs: ["transitive", "transitive_import"],
1245*333d2b36SAndroid Build Coastguard Worker					use_resource_processor: %v,
1246*333d2b36SAndroid Build Coastguard Worker				}
1247*333d2b36SAndroid Build Coastguard Worker
1248*333d2b36SAndroid Build Coastguard Worker				android_library {
1249*333d2b36SAndroid Build Coastguard Worker					name: "transitive",
1250*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
1251*333d2b36SAndroid Build Coastguard Worker					srcs: ["transitive/transitive.java"],
1252*333d2b36SAndroid Build Coastguard Worker					resource_dirs: ["transitive/res"],
1253*333d2b36SAndroid Build Coastguard Worker					manifest: "transitive/AndroidManifest.xml",
1254*333d2b36SAndroid Build Coastguard Worker					use_resource_processor: %v,
1255*333d2b36SAndroid Build Coastguard Worker				}
1256*333d2b36SAndroid Build Coastguard Worker
1257*333d2b36SAndroid Build Coastguard Worker				android_library {
1258*333d2b36SAndroid Build Coastguard Worker					name: "shared",
1259*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
1260*333d2b36SAndroid Build Coastguard Worker					srcs: ["shared/shared.java"],
1261*333d2b36SAndroid Build Coastguard Worker					resource_dirs: ["shared/res"],
1262*333d2b36SAndroid Build Coastguard Worker					manifest: "shared/AndroidManifest.xml",
1263*333d2b36SAndroid Build Coastguard Worker					use_resource_processor: %v,
1264*333d2b36SAndroid Build Coastguard Worker					libs: ["shared_transitive_shared"],
1265*333d2b36SAndroid Build Coastguard Worker					static_libs: ["shared_transitive_static"],
1266*333d2b36SAndroid Build Coastguard Worker				}
1267*333d2b36SAndroid Build Coastguard Worker
1268*333d2b36SAndroid Build Coastguard Worker				android_library {
1269*333d2b36SAndroid Build Coastguard Worker					name: "shared_transitive_shared",
1270*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
1271*333d2b36SAndroid Build Coastguard Worker					srcs: ["shared_transitive_shared/shared_transitive_shared.java"],
1272*333d2b36SAndroid Build Coastguard Worker					resource_dirs: ["shared_transitive_shared/res"],
1273*333d2b36SAndroid Build Coastguard Worker					manifest: "shared_transitive_shared/AndroidManifest.xml",
1274*333d2b36SAndroid Build Coastguard Worker					use_resource_processor: %v,
1275*333d2b36SAndroid Build Coastguard Worker				}
1276*333d2b36SAndroid Build Coastguard Worker
1277*333d2b36SAndroid Build Coastguard Worker				android_library {
1278*333d2b36SAndroid Build Coastguard Worker					name: "shared_transitive_static",
1279*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
1280*333d2b36SAndroid Build Coastguard Worker					srcs: ["shared_transitive_static/shared.java"],
1281*333d2b36SAndroid Build Coastguard Worker					resource_dirs: ["shared_transitive_static/res"],
1282*333d2b36SAndroid Build Coastguard Worker					manifest: "shared_transitive_static/AndroidManifest.xml",
1283*333d2b36SAndroid Build Coastguard Worker					use_resource_processor: %v,
1284*333d2b36SAndroid Build Coastguard Worker				}
1285*333d2b36SAndroid Build Coastguard Worker
1286*333d2b36SAndroid Build Coastguard Worker				android_library_import {
1287*333d2b36SAndroid Build Coastguard Worker					name: "direct_import",
1288*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
1289*333d2b36SAndroid Build Coastguard Worker					aars: ["direct_import.aar"],
1290*333d2b36SAndroid Build Coastguard Worker					static_libs: ["direct_import_dep"],
1291*333d2b36SAndroid Build Coastguard Worker				}
1292*333d2b36SAndroid Build Coastguard Worker
1293*333d2b36SAndroid Build Coastguard Worker				android_library_import {
1294*333d2b36SAndroid Build Coastguard Worker					name: "direct_import_dep",
1295*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
1296*333d2b36SAndroid Build Coastguard Worker					aars: ["direct_import_dep.aar"],
1297*333d2b36SAndroid Build Coastguard Worker				}
1298*333d2b36SAndroid Build Coastguard Worker
1299*333d2b36SAndroid Build Coastguard Worker				android_library_import {
1300*333d2b36SAndroid Build Coastguard Worker					name: "transitive_import",
1301*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
1302*333d2b36SAndroid Build Coastguard Worker					aars: ["transitive_import.aar"],
1303*333d2b36SAndroid Build Coastguard Worker					static_libs: ["transitive_import_dep"],
1304*333d2b36SAndroid Build Coastguard Worker				}
1305*333d2b36SAndroid Build Coastguard Worker
1306*333d2b36SAndroid Build Coastguard Worker				android_library_import {
1307*333d2b36SAndroid Build Coastguard Worker					name: "transitive_import_dep",
1308*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
1309*333d2b36SAndroid Build Coastguard Worker					aars: ["transitive_import_dep.aar"],
1310*333d2b36SAndroid Build Coastguard Worker				}
1311*333d2b36SAndroid Build Coastguard Worker			`, testCase.appUsesRP, testCase.directLibUsesRP, testCase.transitiveLibUsesRP,
1312*333d2b36SAndroid Build Coastguard Worker				testCase.sharedLibUsesRP, testCase.sharedTransitiveSharedLibUsesRP, testCase.sharedTransitiveStaticLibUsesRP)
1313*333d2b36SAndroid Build Coastguard Worker
1314*333d2b36SAndroid Build Coastguard Worker			fs := android.MockFS{
1315*333d2b36SAndroid Build Coastguard Worker				"app/res/values/strings.xml":                      nil,
1316*333d2b36SAndroid Build Coastguard Worker				"direct/res/values/strings.xml":                   nil,
1317*333d2b36SAndroid Build Coastguard Worker				"transitive/res/values/strings.xml":               nil,
1318*333d2b36SAndroid Build Coastguard Worker				"shared/res/values/strings.xml":                   nil,
1319*333d2b36SAndroid Build Coastguard Worker				"shared_transitive_static/res/values/strings.xml": nil,
1320*333d2b36SAndroid Build Coastguard Worker				"shared_transitive_shared/res/values/strings.xml": nil,
1321*333d2b36SAndroid Build Coastguard Worker			}
1322*333d2b36SAndroid Build Coastguard Worker
1323*333d2b36SAndroid Build Coastguard Worker			result := android.GroupFixturePreparers(
1324*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithJavaDefaultModules,
1325*333d2b36SAndroid Build Coastguard Worker				fs.AddToFixture(),
1326*333d2b36SAndroid Build Coastguard Worker			).RunTestWithBp(t, bp)
1327*333d2b36SAndroid Build Coastguard Worker
1328*333d2b36SAndroid Build Coastguard Worker			type aaptInfo struct {
1329*333d2b36SAndroid Build Coastguard Worker				resources, overlays, imports, srcJars, classpath, combined android.Paths
1330*333d2b36SAndroid Build Coastguard Worker			}
1331*333d2b36SAndroid Build Coastguard Worker
1332*333d2b36SAndroid Build Coastguard Worker			getAaptInfo := func(moduleName string) (aaptInfo aaptInfo) {
1333*333d2b36SAndroid Build Coastguard Worker				mod := result.ModuleForTests(moduleName, "android_common")
1334*333d2b36SAndroid Build Coastguard Worker				resourceListRule := mod.MaybeOutput("aapt2/res.list")
1335*333d2b36SAndroid Build Coastguard Worker				overlayListRule := mod.MaybeOutput("aapt2/overlay.list")
1336*333d2b36SAndroid Build Coastguard Worker				aaptRule := mod.Rule("aapt2Link")
1337*333d2b36SAndroid Build Coastguard Worker				javacRule := mod.MaybeRule("javac")
1338*333d2b36SAndroid Build Coastguard Worker				combinedRule := mod.MaybeOutput("combined/" + moduleName + ".jar")
1339*333d2b36SAndroid Build Coastguard Worker
1340*333d2b36SAndroid Build Coastguard Worker				aaptInfo.resources = resourceListRule.Inputs
1341*333d2b36SAndroid Build Coastguard Worker				aaptInfo.overlays = overlayListRule.Inputs
1342*333d2b36SAndroid Build Coastguard Worker
1343*333d2b36SAndroid Build Coastguard Worker				aaptFlags := strings.Split(aaptRule.Args["flags"], " ")
1344*333d2b36SAndroid Build Coastguard Worker				for i, flag := range aaptFlags {
1345*333d2b36SAndroid Build Coastguard Worker					if flag == "-I" && i+1 < len(aaptFlags) {
1346*333d2b36SAndroid Build Coastguard Worker						aaptInfo.imports = append(aaptInfo.imports, android.PathForTesting(aaptFlags[i+1]))
1347*333d2b36SAndroid Build Coastguard Worker					}
1348*333d2b36SAndroid Build Coastguard Worker				}
1349*333d2b36SAndroid Build Coastguard Worker
1350*333d2b36SAndroid Build Coastguard Worker				if len(javacRule.Args["srcJars"]) > 0 {
1351*333d2b36SAndroid Build Coastguard Worker					aaptInfo.srcJars = android.PathsForTesting(strings.Split(javacRule.Args["srcJars"], " ")...)
1352*333d2b36SAndroid Build Coastguard Worker				}
1353*333d2b36SAndroid Build Coastguard Worker
1354*333d2b36SAndroid Build Coastguard Worker				if len(javacRule.Args["classpath"]) > 0 {
1355*333d2b36SAndroid Build Coastguard Worker					classpathArg := strings.TrimPrefix(javacRule.Args["classpath"], "-classpath ")
1356*333d2b36SAndroid Build Coastguard Worker					aaptInfo.classpath = android.PathsForTesting(strings.Split(classpathArg, ":")...)
1357*333d2b36SAndroid Build Coastguard Worker				}
1358*333d2b36SAndroid Build Coastguard Worker
1359*333d2b36SAndroid Build Coastguard Worker				aaptInfo.combined = combinedRule.Inputs
1360*333d2b36SAndroid Build Coastguard Worker				return
1361*333d2b36SAndroid Build Coastguard Worker			}
1362*333d2b36SAndroid Build Coastguard Worker
1363*333d2b36SAndroid Build Coastguard Worker			app := getAaptInfo("app")
1364*333d2b36SAndroid Build Coastguard Worker			direct := getAaptInfo("direct")
1365*333d2b36SAndroid Build Coastguard Worker			transitive := getAaptInfo("transitive")
1366*333d2b36SAndroid Build Coastguard Worker			shared := getAaptInfo("shared")
1367*333d2b36SAndroid Build Coastguard Worker			directImport := getAaptInfo("direct_import")
1368*333d2b36SAndroid Build Coastguard Worker			transitiveImport := getAaptInfo("transitive_import")
1369*333d2b36SAndroid Build Coastguard Worker
1370*333d2b36SAndroid Build Coastguard Worker			if !testCase.dontVerifyApp {
1371*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "app resources", testCase.appResources, app.resources)
1372*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "app overlays", testCase.appOverlays, app.overlays)
1373*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "app imports", testCase.appImports, app.imports)
1374*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "app srcjars", testCase.appSrcJars, app.srcJars)
1375*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "app classpath", testCase.appClasspath, app.classpath)
1376*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "app combined", testCase.appCombined, app.combined)
1377*333d2b36SAndroid Build Coastguard Worker			}
1378*333d2b36SAndroid Build Coastguard Worker
1379*333d2b36SAndroid Build Coastguard Worker			if !testCase.dontVerifyDirect {
1380*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "direct resources", testCase.directResources, direct.resources)
1381*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "direct overlays", testCase.directOverlays, direct.overlays)
1382*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "direct imports", testCase.directImports, direct.imports)
1383*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "direct srcjars", testCase.directSrcJars, direct.srcJars)
1384*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "direct classpath", testCase.directClasspath, direct.classpath)
1385*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "direct combined", testCase.directCombined, direct.combined)
1386*333d2b36SAndroid Build Coastguard Worker			}
1387*333d2b36SAndroid Build Coastguard Worker
1388*333d2b36SAndroid Build Coastguard Worker			if !testCase.dontVerifyTransitive {
1389*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "transitive resources", testCase.transitiveResources, transitive.resources)
1390*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "transitive overlays", testCase.transitiveOverlays, transitive.overlays)
1391*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "transitive imports", testCase.transitiveImports, transitive.imports)
1392*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "transitive srcjars", testCase.transitiveSrcJars, transitive.srcJars)
1393*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "transitive classpath", testCase.transitiveClasspath, transitive.classpath)
1394*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "transitive combined", testCase.transitiveCombined, transitive.combined)
1395*333d2b36SAndroid Build Coastguard Worker			}
1396*333d2b36SAndroid Build Coastguard Worker
1397*333d2b36SAndroid Build Coastguard Worker			if !testCase.dontVerifyShared {
1398*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "shared resources", testCase.sharedResources, shared.resources)
1399*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "shared overlays", testCase.sharedOverlays, shared.overlays)
1400*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "shared imports", testCase.sharedImports, shared.imports)
1401*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "shared srcjars", testCase.sharedSrcJars, shared.srcJars)
1402*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "shared classpath", testCase.sharedClasspath, shared.classpath)
1403*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "shared combined", testCase.sharedCombined, shared.combined)
1404*333d2b36SAndroid Build Coastguard Worker			}
1405*333d2b36SAndroid Build Coastguard Worker
1406*333d2b36SAndroid Build Coastguard Worker			if !testCase.dontVerifyDirectImport {
1407*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "direct_import resources", testCase.directImportResources, directImport.resources)
1408*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "direct_import overlays", testCase.directImportOverlays, directImport.overlays)
1409*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "direct_import imports", testCase.directImportImports, directImport.imports)
1410*333d2b36SAndroid Build Coastguard Worker			}
1411*333d2b36SAndroid Build Coastguard Worker
1412*333d2b36SAndroid Build Coastguard Worker			if !testCase.dontVerifyTransitiveImport {
1413*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "transitive_import resources", testCase.transitiveImportResources, transitiveImport.resources)
1414*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "transitive_import overlays", testCase.transitiveImportOverlays, transitiveImport.overlays)
1415*333d2b36SAndroid Build Coastguard Worker				android.AssertPathsRelativeToTopEquals(t, "transitive_import imports", testCase.transitiveImportImports, transitiveImport.imports)
1416*333d2b36SAndroid Build Coastguard Worker			}
1417*333d2b36SAndroid Build Coastguard Worker		})
1418*333d2b36SAndroid Build Coastguard Worker	}
1419*333d2b36SAndroid Build Coastguard Worker}
1420*333d2b36SAndroid Build Coastguard Worker
1421*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidResourceOverlays(t *testing.T) {
1422*333d2b36SAndroid Build Coastguard Worker	type moduleAndVariant struct {
1423*333d2b36SAndroid Build Coastguard Worker		module  string
1424*333d2b36SAndroid Build Coastguard Worker		variant string
1425*333d2b36SAndroid Build Coastguard Worker	}
1426*333d2b36SAndroid Build Coastguard Worker
1427*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
1428*333d2b36SAndroid Build Coastguard Worker		name                       string
1429*333d2b36SAndroid Build Coastguard Worker		enforceRROTargets          []string
1430*333d2b36SAndroid Build Coastguard Worker		enforceRROExcludedOverlays []string
1431*333d2b36SAndroid Build Coastguard Worker		resourceFiles              map[moduleAndVariant][]string
1432*333d2b36SAndroid Build Coastguard Worker		overlayFiles               map[moduleAndVariant][]string
1433*333d2b36SAndroid Build Coastguard Worker		rroDirs                    map[moduleAndVariant][]string
1434*333d2b36SAndroid Build Coastguard Worker	}{
1435*333d2b36SAndroid Build Coastguard Worker		{
1436*333d2b36SAndroid Build Coastguard Worker			name:                       "no RRO",
1437*333d2b36SAndroid Build Coastguard Worker			enforceRROTargets:          nil,
1438*333d2b36SAndroid Build Coastguard Worker			enforceRROExcludedOverlays: nil,
1439*333d2b36SAndroid Build Coastguard Worker			resourceFiles: map[moduleAndVariant][]string{
1440*333d2b36SAndroid Build Coastguard Worker				{"foo", "android_common"}:  nil,
1441*333d2b36SAndroid Build Coastguard Worker				{"bar", "android_common"}:  {"bar/res/res/values/strings.xml"},
1442*333d2b36SAndroid Build Coastguard Worker				{"lib", "android_common"}:  nil,
1443*333d2b36SAndroid Build Coastguard Worker				{"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"},
1444*333d2b36SAndroid Build Coastguard Worker			},
1445*333d2b36SAndroid Build Coastguard Worker			overlayFiles: map[moduleAndVariant][]string{
1446*333d2b36SAndroid Build Coastguard Worker				{"foo", "android_common"}: {
1447*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/lib2/android_common/package-res.apk",
1448*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/lib/android_common/package-res.apk",
1449*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/lib3/android_common/package-res.apk",
1450*333d2b36SAndroid Build Coastguard Worker					"foo/res/res/values/strings.xml",
1451*333d2b36SAndroid Build Coastguard Worker					"device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1452*333d2b36SAndroid Build Coastguard Worker					"device/vendor/blah/overlay/foo/res/values/strings.xml",
1453*333d2b36SAndroid Build Coastguard Worker					"product/vendor/blah/overlay/foo/res/values/strings.xml",
1454*333d2b36SAndroid Build Coastguard Worker				},
1455*333d2b36SAndroid Build Coastguard Worker				{"bar", "android_common"}: {
1456*333d2b36SAndroid Build Coastguard Worker					"device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1457*333d2b36SAndroid Build Coastguard Worker					"device/vendor/blah/overlay/bar/res/values/strings.xml",
1458*333d2b36SAndroid Build Coastguard Worker				},
1459*333d2b36SAndroid Build Coastguard Worker				{"lib", "android_common"}: {
1460*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/lib2/android_common/package-res.apk",
1461*333d2b36SAndroid Build Coastguard Worker					"lib/res/res/values/strings.xml",
1462*333d2b36SAndroid Build Coastguard Worker					"device/vendor/blah/overlay/lib/res/values/strings.xml",
1463*333d2b36SAndroid Build Coastguard Worker				},
1464*333d2b36SAndroid Build Coastguard Worker			},
1465*333d2b36SAndroid Build Coastguard Worker			rroDirs: map[moduleAndVariant][]string{
1466*333d2b36SAndroid Build Coastguard Worker				{"foo", "android_common"}: nil,
1467*333d2b36SAndroid Build Coastguard Worker				{"bar", "android_common"}: nil,
1468*333d2b36SAndroid Build Coastguard Worker			},
1469*333d2b36SAndroid Build Coastguard Worker		},
1470*333d2b36SAndroid Build Coastguard Worker		{
1471*333d2b36SAndroid Build Coastguard Worker			name:                       "enforce RRO on foo",
1472*333d2b36SAndroid Build Coastguard Worker			enforceRROTargets:          []string{"foo"},
1473*333d2b36SAndroid Build Coastguard Worker			enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
1474*333d2b36SAndroid Build Coastguard Worker			resourceFiles: map[moduleAndVariant][]string{
1475*333d2b36SAndroid Build Coastguard Worker				{"foo", "android_common"}:      nil,
1476*333d2b36SAndroid Build Coastguard Worker				{"bar", "android_common"}:      {"bar/res/res/values/strings.xml"},
1477*333d2b36SAndroid Build Coastguard Worker				{"lib", "android_common"}:      nil,
1478*333d2b36SAndroid Build Coastguard Worker				{"lib", "android_common_rro"}:  nil,
1479*333d2b36SAndroid Build Coastguard Worker				{"lib2", "android_common"}:     {"lib2/res/res/values/strings.xml"},
1480*333d2b36SAndroid Build Coastguard Worker				{"lib2", "android_common_rro"}: {"lib2/res/res/values/strings.xml"},
1481*333d2b36SAndroid Build Coastguard Worker			},
1482*333d2b36SAndroid Build Coastguard Worker			overlayFiles: map[moduleAndVariant][]string{
1483*333d2b36SAndroid Build Coastguard Worker				{"foo", "android_common"}: {
1484*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/lib2/android_common_rro/package-res.apk",
1485*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/lib/android_common_rro/package-res.apk",
1486*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/lib3/android_common_rro/package-res.apk",
1487*333d2b36SAndroid Build Coastguard Worker					"foo/res/res/values/strings.xml",
1488*333d2b36SAndroid Build Coastguard Worker					"device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1489*333d2b36SAndroid Build Coastguard Worker				},
1490*333d2b36SAndroid Build Coastguard Worker				{"bar", "android_common"}: {
1491*333d2b36SAndroid Build Coastguard Worker					"device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1492*333d2b36SAndroid Build Coastguard Worker					"device/vendor/blah/overlay/bar/res/values/strings.xml",
1493*333d2b36SAndroid Build Coastguard Worker				},
1494*333d2b36SAndroid Build Coastguard Worker				{"lib", "android_common"}: {
1495*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/lib2/android_common/package-res.apk",
1496*333d2b36SAndroid Build Coastguard Worker					"lib/res/res/values/strings.xml",
1497*333d2b36SAndroid Build Coastguard Worker					"device/vendor/blah/overlay/lib/res/values/strings.xml",
1498*333d2b36SAndroid Build Coastguard Worker				},
1499*333d2b36SAndroid Build Coastguard Worker				{"lib", "android_common_rro"}: {
1500*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/lib2/android_common_rro/package-res.apk",
1501*333d2b36SAndroid Build Coastguard Worker					"lib/res/res/values/strings.xml",
1502*333d2b36SAndroid Build Coastguard Worker				},
1503*333d2b36SAndroid Build Coastguard Worker			},
1504*333d2b36SAndroid Build Coastguard Worker
1505*333d2b36SAndroid Build Coastguard Worker			rroDirs: map[moduleAndVariant][]string{
1506*333d2b36SAndroid Build Coastguard Worker				{"foo", "android_common"}: {
1507*333d2b36SAndroid Build Coastguard Worker					"device:device/vendor/blah/overlay/foo/res",
1508*333d2b36SAndroid Build Coastguard Worker					"product:product/vendor/blah/overlay/foo/res",
1509*333d2b36SAndroid Build Coastguard Worker					"device:device/vendor/blah/overlay/lib/res",
1510*333d2b36SAndroid Build Coastguard Worker				},
1511*333d2b36SAndroid Build Coastguard Worker				{"bar", "android_common"}:     nil,
1512*333d2b36SAndroid Build Coastguard Worker				{"lib", "android_common"}:     nil,
1513*333d2b36SAndroid Build Coastguard Worker				{"lib", "android_common_rro"}: {"device:device/vendor/blah/overlay/lib/res"},
1514*333d2b36SAndroid Build Coastguard Worker			},
1515*333d2b36SAndroid Build Coastguard Worker		},
1516*333d2b36SAndroid Build Coastguard Worker		{
1517*333d2b36SAndroid Build Coastguard Worker			name:              "enforce RRO on all",
1518*333d2b36SAndroid Build Coastguard Worker			enforceRROTargets: []string{"*"},
1519*333d2b36SAndroid Build Coastguard Worker			enforceRROExcludedOverlays: []string{
1520*333d2b36SAndroid Build Coastguard Worker				// Excluding specific apps/res directories also allowed.
1521*333d2b36SAndroid Build Coastguard Worker				"device/vendor/blah/static_overlay/foo",
1522*333d2b36SAndroid Build Coastguard Worker				"device/vendor/blah/static_overlay/bar/res",
1523*333d2b36SAndroid Build Coastguard Worker			},
1524*333d2b36SAndroid Build Coastguard Worker			resourceFiles: map[moduleAndVariant][]string{
1525*333d2b36SAndroid Build Coastguard Worker				{"foo", "android_common"}:  nil,
1526*333d2b36SAndroid Build Coastguard Worker				{"bar", "android_common"}:  {"bar/res/res/values/strings.xml"},
1527*333d2b36SAndroid Build Coastguard Worker				{"lib", "android_common"}:  nil,
1528*333d2b36SAndroid Build Coastguard Worker				{"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"},
1529*333d2b36SAndroid Build Coastguard Worker			},
1530*333d2b36SAndroid Build Coastguard Worker			overlayFiles: map[moduleAndVariant][]string{
1531*333d2b36SAndroid Build Coastguard Worker				{"foo", "android_common"}: {
1532*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/lib2/android_common/package-res.apk",
1533*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/lib/android_common/package-res.apk",
1534*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/lib3/android_common/package-res.apk",
1535*333d2b36SAndroid Build Coastguard Worker					"foo/res/res/values/strings.xml",
1536*333d2b36SAndroid Build Coastguard Worker					"device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1537*333d2b36SAndroid Build Coastguard Worker				},
1538*333d2b36SAndroid Build Coastguard Worker				{"bar", "android_common"}: {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
1539*333d2b36SAndroid Build Coastguard Worker				{"lib", "android_common"}: {
1540*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/lib2/android_common/package-res.apk",
1541*333d2b36SAndroid Build Coastguard Worker					"lib/res/res/values/strings.xml",
1542*333d2b36SAndroid Build Coastguard Worker				},
1543*333d2b36SAndroid Build Coastguard Worker			},
1544*333d2b36SAndroid Build Coastguard Worker			rroDirs: map[moduleAndVariant][]string{
1545*333d2b36SAndroid Build Coastguard Worker				{"foo", "android_common"}: {
1546*333d2b36SAndroid Build Coastguard Worker					"device:device/vendor/blah/overlay/foo/res",
1547*333d2b36SAndroid Build Coastguard Worker					"product:product/vendor/blah/overlay/foo/res",
1548*333d2b36SAndroid Build Coastguard Worker					// Lib dep comes after the direct deps
1549*333d2b36SAndroid Build Coastguard Worker					"device:device/vendor/blah/overlay/lib/res",
1550*333d2b36SAndroid Build Coastguard Worker				},
1551*333d2b36SAndroid Build Coastguard Worker				{"bar", "android_common"}: {"device:device/vendor/blah/overlay/bar/res"},
1552*333d2b36SAndroid Build Coastguard Worker				{"lib", "android_common"}: {"device:device/vendor/blah/overlay/lib/res"},
1553*333d2b36SAndroid Build Coastguard Worker			},
1554*333d2b36SAndroid Build Coastguard Worker		},
1555*333d2b36SAndroid Build Coastguard Worker	}
1556*333d2b36SAndroid Build Coastguard Worker
1557*333d2b36SAndroid Build Coastguard Worker	deviceResourceOverlays := []string{
1558*333d2b36SAndroid Build Coastguard Worker		"device/vendor/blah/overlay",
1559*333d2b36SAndroid Build Coastguard Worker		"device/vendor/blah/overlay2",
1560*333d2b36SAndroid Build Coastguard Worker		"device/vendor/blah/static_overlay",
1561*333d2b36SAndroid Build Coastguard Worker	}
1562*333d2b36SAndroid Build Coastguard Worker
1563*333d2b36SAndroid Build Coastguard Worker	productResourceOverlays := []string{
1564*333d2b36SAndroid Build Coastguard Worker		"product/vendor/blah/overlay",
1565*333d2b36SAndroid Build Coastguard Worker	}
1566*333d2b36SAndroid Build Coastguard Worker
1567*333d2b36SAndroid Build Coastguard Worker	fs := android.MockFS{
1568*333d2b36SAndroid Build Coastguard Worker		"foo/res/res/values/strings.xml":                               nil,
1569*333d2b36SAndroid Build Coastguard Worker		"bar/res/res/values/strings.xml":                               nil,
1570*333d2b36SAndroid Build Coastguard Worker		"lib/res/res/values/strings.xml":                               nil,
1571*333d2b36SAndroid Build Coastguard Worker		"lib2/res/res/values/strings.xml":                              nil,
1572*333d2b36SAndroid Build Coastguard Worker		"device/vendor/blah/overlay/foo/res/values/strings.xml":        nil,
1573*333d2b36SAndroid Build Coastguard Worker		"device/vendor/blah/overlay/bar/res/values/strings.xml":        nil,
1574*333d2b36SAndroid Build Coastguard Worker		"device/vendor/blah/overlay/lib/res/values/strings.xml":        nil,
1575*333d2b36SAndroid Build Coastguard Worker		"device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
1576*333d2b36SAndroid Build Coastguard Worker		"device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
1577*333d2b36SAndroid Build Coastguard Worker		"device/vendor/blah/overlay2/res/values/strings.xml":           nil,
1578*333d2b36SAndroid Build Coastguard Worker		"product/vendor/blah/overlay/foo/res/values/strings.xml":       nil,
1579*333d2b36SAndroid Build Coastguard Worker	}
1580*333d2b36SAndroid Build Coastguard Worker
1581*333d2b36SAndroid Build Coastguard Worker	bp := `
1582*333d2b36SAndroid Build Coastguard Worker			android_app {
1583*333d2b36SAndroid Build Coastguard Worker				name: "foo",
1584*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
1585*333d2b36SAndroid Build Coastguard Worker				resource_dirs: ["foo/res"],
1586*333d2b36SAndroid Build Coastguard Worker				static_libs: ["lib", "lib3"],
1587*333d2b36SAndroid Build Coastguard Worker			}
1588*333d2b36SAndroid Build Coastguard Worker
1589*333d2b36SAndroid Build Coastguard Worker			android_app {
1590*333d2b36SAndroid Build Coastguard Worker				name: "bar",
1591*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
1592*333d2b36SAndroid Build Coastguard Worker				resource_dirs: ["bar/res"],
1593*333d2b36SAndroid Build Coastguard Worker			}
1594*333d2b36SAndroid Build Coastguard Worker
1595*333d2b36SAndroid Build Coastguard Worker			android_library {
1596*333d2b36SAndroid Build Coastguard Worker				name: "lib",
1597*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
1598*333d2b36SAndroid Build Coastguard Worker				resource_dirs: ["lib/res"],
1599*333d2b36SAndroid Build Coastguard Worker				static_libs: ["lib2"],
1600*333d2b36SAndroid Build Coastguard Worker			}
1601*333d2b36SAndroid Build Coastguard Worker
1602*333d2b36SAndroid Build Coastguard Worker			android_library {
1603*333d2b36SAndroid Build Coastguard Worker				name: "lib2",
1604*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
1605*333d2b36SAndroid Build Coastguard Worker				resource_dirs: ["lib2/res"],
1606*333d2b36SAndroid Build Coastguard Worker			}
1607*333d2b36SAndroid Build Coastguard Worker
1608*333d2b36SAndroid Build Coastguard Worker			// This library has the same resources as lib (should not lead to dupe RROs)
1609*333d2b36SAndroid Build Coastguard Worker			android_library {
1610*333d2b36SAndroid Build Coastguard Worker				name: "lib3",
1611*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
1612*333d2b36SAndroid Build Coastguard Worker				resource_dirs: ["lib/res"]
1613*333d2b36SAndroid Build Coastguard Worker			}
1614*333d2b36SAndroid Build Coastguard Worker		`
1615*333d2b36SAndroid Build Coastguard Worker
1616*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range testCases {
1617*333d2b36SAndroid Build Coastguard Worker		t.Run(testCase.name, func(t *testing.T) {
1618*333d2b36SAndroid Build Coastguard Worker			result := android.GroupFixturePreparers(
1619*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithJavaDefaultModules,
1620*333d2b36SAndroid Build Coastguard Worker				fs.AddToFixture(),
1621*333d2b36SAndroid Build Coastguard Worker				android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1622*333d2b36SAndroid Build Coastguard Worker					variables.DeviceResourceOverlays = deviceResourceOverlays
1623*333d2b36SAndroid Build Coastguard Worker					variables.ProductResourceOverlays = productResourceOverlays
1624*333d2b36SAndroid Build Coastguard Worker					if testCase.enforceRROTargets != nil {
1625*333d2b36SAndroid Build Coastguard Worker						variables.EnforceRROTargets = testCase.enforceRROTargets
1626*333d2b36SAndroid Build Coastguard Worker					}
1627*333d2b36SAndroid Build Coastguard Worker					if testCase.enforceRROExcludedOverlays != nil {
1628*333d2b36SAndroid Build Coastguard Worker						variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
1629*333d2b36SAndroid Build Coastguard Worker					}
1630*333d2b36SAndroid Build Coastguard Worker				}),
1631*333d2b36SAndroid Build Coastguard Worker			).RunTestWithBp(t, bp)
1632*333d2b36SAndroid Build Coastguard Worker
1633*333d2b36SAndroid Build Coastguard Worker			resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
1634*333d2b36SAndroid Build Coastguard Worker				for _, o := range list {
1635*333d2b36SAndroid Build Coastguard Worker					res := module.MaybeOutput(o)
1636*333d2b36SAndroid Build Coastguard Worker					if res.Rule != nil {
1637*333d2b36SAndroid Build Coastguard Worker						// If the overlay is compiled as part of this moduleAndVariant (i.e. a .arsc.flat file),
1638*333d2b36SAndroid Build Coastguard Worker						// verify the inputs to the .arsc.flat rule.
1639*333d2b36SAndroid Build Coastguard Worker						files = append(files, res.Inputs.Strings()...)
1640*333d2b36SAndroid Build Coastguard Worker					} else {
1641*333d2b36SAndroid Build Coastguard Worker						// Otherwise, verify the full path to the output of the other moduleAndVariant
1642*333d2b36SAndroid Build Coastguard Worker						files = append(files, o)
1643*333d2b36SAndroid Build Coastguard Worker					}
1644*333d2b36SAndroid Build Coastguard Worker				}
1645*333d2b36SAndroid Build Coastguard Worker				return files
1646*333d2b36SAndroid Build Coastguard Worker			}
1647*333d2b36SAndroid Build Coastguard Worker
1648*333d2b36SAndroid Build Coastguard Worker			getResources := func(moduleName, variantName string) (resourceFiles, overlayFiles, rroDirs []string) {
1649*333d2b36SAndroid Build Coastguard Worker				module := result.ModuleForTests(moduleName, variantName)
1650*333d2b36SAndroid Build Coastguard Worker				resourceList := module.MaybeOutput("aapt2/res.list")
1651*333d2b36SAndroid Build Coastguard Worker				if resourceList.Rule != nil {
1652*333d2b36SAndroid Build Coastguard Worker					resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
1653*333d2b36SAndroid Build Coastguard Worker				}
1654*333d2b36SAndroid Build Coastguard Worker				overlayList := module.MaybeOutput("aapt2/overlay.list")
1655*333d2b36SAndroid Build Coastguard Worker				if overlayList.Rule != nil {
1656*333d2b36SAndroid Build Coastguard Worker					overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
1657*333d2b36SAndroid Build Coastguard Worker				}
1658*333d2b36SAndroid Build Coastguard Worker
1659*333d2b36SAndroid Build Coastguard Worker				for _, d := range module.Module().(AndroidLibraryDependency).RRODirsDepSet().ToList() {
1660*333d2b36SAndroid Build Coastguard Worker					var prefix string
1661*333d2b36SAndroid Build Coastguard Worker					if d.overlayType == device {
1662*333d2b36SAndroid Build Coastguard Worker						prefix = "device:"
1663*333d2b36SAndroid Build Coastguard Worker					} else if d.overlayType == product {
1664*333d2b36SAndroid Build Coastguard Worker						prefix = "product:"
1665*333d2b36SAndroid Build Coastguard Worker					} else {
1666*333d2b36SAndroid Build Coastguard Worker						t.Fatalf("Unexpected overlayType %d", d.overlayType)
1667*333d2b36SAndroid Build Coastguard Worker					}
1668*333d2b36SAndroid Build Coastguard Worker					rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
1669*333d2b36SAndroid Build Coastguard Worker				}
1670*333d2b36SAndroid Build Coastguard Worker
1671*333d2b36SAndroid Build Coastguard Worker				return resourceFiles, overlayFiles, rroDirs
1672*333d2b36SAndroid Build Coastguard Worker			}
1673*333d2b36SAndroid Build Coastguard Worker
1674*333d2b36SAndroid Build Coastguard Worker			modules := []moduleAndVariant{
1675*333d2b36SAndroid Build Coastguard Worker				{"foo", "android_common"},
1676*333d2b36SAndroid Build Coastguard Worker				{"foo", "android_common_rro"},
1677*333d2b36SAndroid Build Coastguard Worker				{"bar", "android_common"},
1678*333d2b36SAndroid Build Coastguard Worker				{"bar", "android_common_rro"},
1679*333d2b36SAndroid Build Coastguard Worker				{"lib", "android_common"},
1680*333d2b36SAndroid Build Coastguard Worker				{"lib", "android_common_rro"},
1681*333d2b36SAndroid Build Coastguard Worker				{"lib2", "android_common"},
1682*333d2b36SAndroid Build Coastguard Worker				{"lib2", "android_common_rro"},
1683*333d2b36SAndroid Build Coastguard Worker			}
1684*333d2b36SAndroid Build Coastguard Worker			for _, moduleAndVariant := range modules {
1685*333d2b36SAndroid Build Coastguard Worker				if _, exists := testCase.resourceFiles[moduleAndVariant]; !exists {
1686*333d2b36SAndroid Build Coastguard Worker					continue
1687*333d2b36SAndroid Build Coastguard Worker				}
1688*333d2b36SAndroid Build Coastguard Worker				resourceFiles, overlayFiles, rroDirs := getResources(moduleAndVariant.module, moduleAndVariant.variant)
1689*333d2b36SAndroid Build Coastguard Worker
1690*333d2b36SAndroid Build Coastguard Worker				if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[moduleAndVariant]) {
1691*333d2b36SAndroid Build Coastguard Worker					t.Errorf("expected %s resource files:\n  %#v\n got:\n  %#v",
1692*333d2b36SAndroid Build Coastguard Worker						moduleAndVariant, testCase.resourceFiles[moduleAndVariant], resourceFiles)
1693*333d2b36SAndroid Build Coastguard Worker				}
1694*333d2b36SAndroid Build Coastguard Worker				if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[moduleAndVariant]) {
1695*333d2b36SAndroid Build Coastguard Worker					t.Errorf("expected %s overlay files:\n  %#v\n got:\n  %#v",
1696*333d2b36SAndroid Build Coastguard Worker						moduleAndVariant, testCase.overlayFiles[moduleAndVariant], overlayFiles)
1697*333d2b36SAndroid Build Coastguard Worker				}
1698*333d2b36SAndroid Build Coastguard Worker				if !reflect.DeepEqual(rroDirs, testCase.rroDirs[moduleAndVariant]) {
1699*333d2b36SAndroid Build Coastguard Worker					t.Errorf("expected %s rroDirs:  %#v\n got:\n  %#v",
1700*333d2b36SAndroid Build Coastguard Worker						moduleAndVariant, testCase.rroDirs[moduleAndVariant], rroDirs)
1701*333d2b36SAndroid Build Coastguard Worker				}
1702*333d2b36SAndroid Build Coastguard Worker			}
1703*333d2b36SAndroid Build Coastguard Worker		})
1704*333d2b36SAndroid Build Coastguard Worker	}
1705*333d2b36SAndroid Build Coastguard Worker}
1706*333d2b36SAndroid Build Coastguard Worker
1707*333d2b36SAndroid Build Coastguard Workerfunc checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
1708*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("foo", "android_common")
1709*333d2b36SAndroid Build Coastguard Worker	link := foo.Output("package-res.apk")
1710*333d2b36SAndroid Build Coastguard Worker	linkFlags := strings.Split(link.Args["flags"], " ")
1711*333d2b36SAndroid Build Coastguard Worker	min := android.IndexList("--min-sdk-version", linkFlags)
1712*333d2b36SAndroid Build Coastguard Worker	target := android.IndexList("--target-sdk-version", linkFlags)
1713*333d2b36SAndroid Build Coastguard Worker
1714*333d2b36SAndroid Build Coastguard Worker	if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
1715*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
1716*333d2b36SAndroid Build Coastguard Worker	}
1717*333d2b36SAndroid Build Coastguard Worker
1718*333d2b36SAndroid Build Coastguard Worker	gotMinSdkVersion := linkFlags[min+1]
1719*333d2b36SAndroid Build Coastguard Worker	gotTargetSdkVersion := linkFlags[target+1]
1720*333d2b36SAndroid Build Coastguard Worker
1721*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
1722*333d2b36SAndroid Build Coastguard Worker
1723*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
1724*333d2b36SAndroid Build Coastguard Worker}
1725*333d2b36SAndroid Build Coastguard Worker
1726*333d2b36SAndroid Build Coastguard Workerfunc TestAppSdkVersion(t *testing.T) {
1727*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
1728*333d2b36SAndroid Build Coastguard Worker		name                  string
1729*333d2b36SAndroid Build Coastguard Worker		sdkVersion            string
1730*333d2b36SAndroid Build Coastguard Worker		platformSdkInt        int
1731*333d2b36SAndroid Build Coastguard Worker		platformSdkCodename   string
1732*333d2b36SAndroid Build Coastguard Worker		platformSdkFinal      bool
1733*333d2b36SAndroid Build Coastguard Worker		minSdkVersionBp       string
1734*333d2b36SAndroid Build Coastguard Worker		expectedMinSdkVersion string
1735*333d2b36SAndroid Build Coastguard Worker		platformApis          bool
1736*333d2b36SAndroid Build Coastguard Worker		activeCodenames       []string
1737*333d2b36SAndroid Build Coastguard Worker	}{
1738*333d2b36SAndroid Build Coastguard Worker		{
1739*333d2b36SAndroid Build Coastguard Worker			name:                  "current final SDK",
1740*333d2b36SAndroid Build Coastguard Worker			sdkVersion:            "current",
1741*333d2b36SAndroid Build Coastguard Worker			platformSdkInt:        27,
1742*333d2b36SAndroid Build Coastguard Worker			platformSdkCodename:   "REL",
1743*333d2b36SAndroid Build Coastguard Worker			platformSdkFinal:      true,
1744*333d2b36SAndroid Build Coastguard Worker			expectedMinSdkVersion: "27",
1745*333d2b36SAndroid Build Coastguard Worker		},
1746*333d2b36SAndroid Build Coastguard Worker		{
1747*333d2b36SAndroid Build Coastguard Worker			name:                  "current non-final SDK",
1748*333d2b36SAndroid Build Coastguard Worker			sdkVersion:            "current",
1749*333d2b36SAndroid Build Coastguard Worker			platformSdkInt:        27,
1750*333d2b36SAndroid Build Coastguard Worker			platformSdkCodename:   "OMR1",
1751*333d2b36SAndroid Build Coastguard Worker			platformSdkFinal:      false,
1752*333d2b36SAndroid Build Coastguard Worker			expectedMinSdkVersion: "OMR1",
1753*333d2b36SAndroid Build Coastguard Worker			activeCodenames:       []string{"OMR1"},
1754*333d2b36SAndroid Build Coastguard Worker		},
1755*333d2b36SAndroid Build Coastguard Worker		{
1756*333d2b36SAndroid Build Coastguard Worker			name:                  "default final SDK",
1757*333d2b36SAndroid Build Coastguard Worker			sdkVersion:            "",
1758*333d2b36SAndroid Build Coastguard Worker			platformApis:          true,
1759*333d2b36SAndroid Build Coastguard Worker			platformSdkInt:        27,
1760*333d2b36SAndroid Build Coastguard Worker			platformSdkCodename:   "REL",
1761*333d2b36SAndroid Build Coastguard Worker			platformSdkFinal:      true,
1762*333d2b36SAndroid Build Coastguard Worker			expectedMinSdkVersion: "27",
1763*333d2b36SAndroid Build Coastguard Worker		},
1764*333d2b36SAndroid Build Coastguard Worker		{
1765*333d2b36SAndroid Build Coastguard Worker			name:                  "default non-final SDK",
1766*333d2b36SAndroid Build Coastguard Worker			sdkVersion:            "",
1767*333d2b36SAndroid Build Coastguard Worker			platformApis:          true,
1768*333d2b36SAndroid Build Coastguard Worker			platformSdkInt:        27,
1769*333d2b36SAndroid Build Coastguard Worker			platformSdkCodename:   "OMR1",
1770*333d2b36SAndroid Build Coastguard Worker			platformSdkFinal:      false,
1771*333d2b36SAndroid Build Coastguard Worker			expectedMinSdkVersion: "OMR1",
1772*333d2b36SAndroid Build Coastguard Worker			activeCodenames:       []string{"OMR1"},
1773*333d2b36SAndroid Build Coastguard Worker		},
1774*333d2b36SAndroid Build Coastguard Worker		{
1775*333d2b36SAndroid Build Coastguard Worker			name:                  "14",
1776*333d2b36SAndroid Build Coastguard Worker			sdkVersion:            "14",
1777*333d2b36SAndroid Build Coastguard Worker			expectedMinSdkVersion: "14",
1778*333d2b36SAndroid Build Coastguard Worker			platformSdkCodename:   "S",
1779*333d2b36SAndroid Build Coastguard Worker			activeCodenames:       []string{"S"},
1780*333d2b36SAndroid Build Coastguard Worker		},
1781*333d2b36SAndroid Build Coastguard Worker		{
1782*333d2b36SAndroid Build Coastguard Worker			name:                  "two active SDKs",
1783*333d2b36SAndroid Build Coastguard Worker			sdkVersion:            "module_current",
1784*333d2b36SAndroid Build Coastguard Worker			minSdkVersionBp:       "UpsideDownCake",
1785*333d2b36SAndroid Build Coastguard Worker			expectedMinSdkVersion: "UpsideDownCake", // And not VanillaIceCream
1786*333d2b36SAndroid Build Coastguard Worker			platformSdkCodename:   "VanillaIceCream",
1787*333d2b36SAndroid Build Coastguard Worker			activeCodenames:       []string{"UpsideDownCake", "VanillaIceCream"},
1788*333d2b36SAndroid Build Coastguard Worker		},
1789*333d2b36SAndroid Build Coastguard Worker	}
1790*333d2b36SAndroid Build Coastguard Worker
1791*333d2b36SAndroid Build Coastguard Worker	for _, moduleType := range []string{"android_app", "android_library"} {
1792*333d2b36SAndroid Build Coastguard Worker		for _, test := range testCases {
1793*333d2b36SAndroid Build Coastguard Worker			t.Run(moduleType+" "+test.name, func(t *testing.T) {
1794*333d2b36SAndroid Build Coastguard Worker				platformApiProp := ""
1795*333d2b36SAndroid Build Coastguard Worker				if test.platformApis {
1796*333d2b36SAndroid Build Coastguard Worker					platformApiProp = "platform_apis: true,"
1797*333d2b36SAndroid Build Coastguard Worker				}
1798*333d2b36SAndroid Build Coastguard Worker				minSdkVersionProp := ""
1799*333d2b36SAndroid Build Coastguard Worker				if test.minSdkVersionBp != "" {
1800*333d2b36SAndroid Build Coastguard Worker					minSdkVersionProp = fmt.Sprintf(` min_sdk_version: "%s",`, test.minSdkVersionBp)
1801*333d2b36SAndroid Build Coastguard Worker				}
1802*333d2b36SAndroid Build Coastguard Worker				bp := fmt.Sprintf(`%s {
1803*333d2b36SAndroid Build Coastguard Worker					name: "foo",
1804*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
1805*333d2b36SAndroid Build Coastguard Worker					sdk_version: "%s",
1806*333d2b36SAndroid Build Coastguard Worker					%s
1807*333d2b36SAndroid Build Coastguard Worker					%s
1808*333d2b36SAndroid Build Coastguard Worker				}`, moduleType, test.sdkVersion, platformApiProp, minSdkVersionProp)
1809*333d2b36SAndroid Build Coastguard Worker
1810*333d2b36SAndroid Build Coastguard Worker				result := android.GroupFixturePreparers(
1811*333d2b36SAndroid Build Coastguard Worker					prepareForJavaTest,
1812*333d2b36SAndroid Build Coastguard Worker					android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1813*333d2b36SAndroid Build Coastguard Worker						variables.Platform_sdk_version = &test.platformSdkInt
1814*333d2b36SAndroid Build Coastguard Worker						variables.Platform_sdk_codename = &test.platformSdkCodename
1815*333d2b36SAndroid Build Coastguard Worker						variables.Platform_version_active_codenames = test.activeCodenames
1816*333d2b36SAndroid Build Coastguard Worker						variables.Platform_sdk_final = &test.platformSdkFinal
1817*333d2b36SAndroid Build Coastguard Worker					}),
1818*333d2b36SAndroid Build Coastguard Worker					FixtureWithPrebuiltApis(map[string][]string{
1819*333d2b36SAndroid Build Coastguard Worker						"14": {"foo"},
1820*333d2b36SAndroid Build Coastguard Worker					}),
1821*333d2b36SAndroid Build Coastguard Worker				).RunTestWithBp(t, bp)
1822*333d2b36SAndroid Build Coastguard Worker
1823*333d2b36SAndroid Build Coastguard Worker				checkSdkVersion(t, result, test.expectedMinSdkVersion)
1824*333d2b36SAndroid Build Coastguard Worker			})
1825*333d2b36SAndroid Build Coastguard Worker		}
1826*333d2b36SAndroid Build Coastguard Worker	}
1827*333d2b36SAndroid Build Coastguard Worker}
1828*333d2b36SAndroid Build Coastguard Worker
1829*333d2b36SAndroid Build Coastguard Workerfunc TestVendorAppSdkVersion(t *testing.T) {
1830*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
1831*333d2b36SAndroid Build Coastguard Worker		name                                  string
1832*333d2b36SAndroid Build Coastguard Worker		sdkVersion                            string
1833*333d2b36SAndroid Build Coastguard Worker		platformSdkInt                        int
1834*333d2b36SAndroid Build Coastguard Worker		platformSdkCodename                   string
1835*333d2b36SAndroid Build Coastguard Worker		platformSdkFinal                      bool
1836*333d2b36SAndroid Build Coastguard Worker		deviceCurrentApiLevelForVendorModules string
1837*333d2b36SAndroid Build Coastguard Worker		expectedMinSdkVersion                 string
1838*333d2b36SAndroid Build Coastguard Worker	}{
1839*333d2b36SAndroid Build Coastguard Worker		{
1840*333d2b36SAndroid Build Coastguard Worker			name:                                  "current final SDK",
1841*333d2b36SAndroid Build Coastguard Worker			sdkVersion:                            "current",
1842*333d2b36SAndroid Build Coastguard Worker			platformSdkInt:                        29,
1843*333d2b36SAndroid Build Coastguard Worker			platformSdkCodename:                   "REL",
1844*333d2b36SAndroid Build Coastguard Worker			platformSdkFinal:                      true,
1845*333d2b36SAndroid Build Coastguard Worker			deviceCurrentApiLevelForVendorModules: "29",
1846*333d2b36SAndroid Build Coastguard Worker			expectedMinSdkVersion:                 "29",
1847*333d2b36SAndroid Build Coastguard Worker		},
1848*333d2b36SAndroid Build Coastguard Worker		{
1849*333d2b36SAndroid Build Coastguard Worker			name:                                  "current final SDK",
1850*333d2b36SAndroid Build Coastguard Worker			sdkVersion:                            "current",
1851*333d2b36SAndroid Build Coastguard Worker			platformSdkInt:                        29,
1852*333d2b36SAndroid Build Coastguard Worker			platformSdkCodename:                   "REL",
1853*333d2b36SAndroid Build Coastguard Worker			platformSdkFinal:                      true,
1854*333d2b36SAndroid Build Coastguard Worker			deviceCurrentApiLevelForVendorModules: "28",
1855*333d2b36SAndroid Build Coastguard Worker			expectedMinSdkVersion:                 "28",
1856*333d2b36SAndroid Build Coastguard Worker		},
1857*333d2b36SAndroid Build Coastguard Worker		{
1858*333d2b36SAndroid Build Coastguard Worker			name:                                  "current final SDK",
1859*333d2b36SAndroid Build Coastguard Worker			sdkVersion:                            "current",
1860*333d2b36SAndroid Build Coastguard Worker			platformSdkInt:                        29,
1861*333d2b36SAndroid Build Coastguard Worker			platformSdkCodename:                   "Q",
1862*333d2b36SAndroid Build Coastguard Worker			platformSdkFinal:                      false,
1863*333d2b36SAndroid Build Coastguard Worker			deviceCurrentApiLevelForVendorModules: "28",
1864*333d2b36SAndroid Build Coastguard Worker			expectedMinSdkVersion:                 "28",
1865*333d2b36SAndroid Build Coastguard Worker		},
1866*333d2b36SAndroid Build Coastguard Worker	}
1867*333d2b36SAndroid Build Coastguard Worker
1868*333d2b36SAndroid Build Coastguard Worker	for _, moduleType := range []string{"android_app", "android_library"} {
1869*333d2b36SAndroid Build Coastguard Worker		for _, sdkKind := range []string{"", "system_"} {
1870*333d2b36SAndroid Build Coastguard Worker			for _, test := range testCases {
1871*333d2b36SAndroid Build Coastguard Worker				t.Run(moduleType+" "+test.name, func(t *testing.T) {
1872*333d2b36SAndroid Build Coastguard Worker					bp := fmt.Sprintf(`%s {
1873*333d2b36SAndroid Build Coastguard Worker						name: "foo",
1874*333d2b36SAndroid Build Coastguard Worker						srcs: ["a.java"],
1875*333d2b36SAndroid Build Coastguard Worker						sdk_version: "%s%s",
1876*333d2b36SAndroid Build Coastguard Worker						vendor: true,
1877*333d2b36SAndroid Build Coastguard Worker					}`, moduleType, sdkKind, test.sdkVersion)
1878*333d2b36SAndroid Build Coastguard Worker
1879*333d2b36SAndroid Build Coastguard Worker					result := android.GroupFixturePreparers(
1880*333d2b36SAndroid Build Coastguard Worker						prepareForJavaTest,
1881*333d2b36SAndroid Build Coastguard Worker						android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1882*333d2b36SAndroid Build Coastguard Worker							variables.Platform_sdk_version = &test.platformSdkInt
1883*333d2b36SAndroid Build Coastguard Worker							variables.Platform_sdk_codename = &test.platformSdkCodename
1884*333d2b36SAndroid Build Coastguard Worker							variables.Platform_sdk_final = &test.platformSdkFinal
1885*333d2b36SAndroid Build Coastguard Worker							variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1886*333d2b36SAndroid Build Coastguard Worker							variables.DeviceSystemSdkVersions = []string{"28", "29"}
1887*333d2b36SAndroid Build Coastguard Worker						}),
1888*333d2b36SAndroid Build Coastguard Worker						FixtureWithPrebuiltApis(map[string][]string{
1889*333d2b36SAndroid Build Coastguard Worker							"28":      {"foo"},
1890*333d2b36SAndroid Build Coastguard Worker							"29":      {"foo"},
1891*333d2b36SAndroid Build Coastguard Worker							"current": {"foo"},
1892*333d2b36SAndroid Build Coastguard Worker						}),
1893*333d2b36SAndroid Build Coastguard Worker					).RunTestWithBp(t, bp)
1894*333d2b36SAndroid Build Coastguard Worker
1895*333d2b36SAndroid Build Coastguard Worker					checkSdkVersion(t, result, test.expectedMinSdkVersion)
1896*333d2b36SAndroid Build Coastguard Worker				})
1897*333d2b36SAndroid Build Coastguard Worker			}
1898*333d2b36SAndroid Build Coastguard Worker		}
1899*333d2b36SAndroid Build Coastguard Worker	}
1900*333d2b36SAndroid Build Coastguard Worker}
1901*333d2b36SAndroid Build Coastguard Worker
1902*333d2b36SAndroid Build Coastguard Workerfunc TestJNIABI(t *testing.T) {
1903*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
1904*333d2b36SAndroid Build Coastguard Worker		cc_library {
1905*333d2b36SAndroid Build Coastguard Worker			name: "libjni",
1906*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
1907*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
1908*333d2b36SAndroid Build Coastguard Worker			stl: "none",
1909*333d2b36SAndroid Build Coastguard Worker		}
1910*333d2b36SAndroid Build Coastguard Worker
1911*333d2b36SAndroid Build Coastguard Worker		android_test {
1912*333d2b36SAndroid Build Coastguard Worker			name: "test",
1913*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_platform",
1914*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
1915*333d2b36SAndroid Build Coastguard Worker		}
1916*333d2b36SAndroid Build Coastguard Worker
1917*333d2b36SAndroid Build Coastguard Worker		android_test {
1918*333d2b36SAndroid Build Coastguard Worker			name: "test_first",
1919*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_platform",
1920*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "first",
1921*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
1922*333d2b36SAndroid Build Coastguard Worker		}
1923*333d2b36SAndroid Build Coastguard Worker
1924*333d2b36SAndroid Build Coastguard Worker		android_test {
1925*333d2b36SAndroid Build Coastguard Worker			name: "test_both",
1926*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_platform",
1927*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
1928*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
1929*333d2b36SAndroid Build Coastguard Worker		}
1930*333d2b36SAndroid Build Coastguard Worker
1931*333d2b36SAndroid Build Coastguard Worker		android_test {
1932*333d2b36SAndroid Build Coastguard Worker			name: "test_32",
1933*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_platform",
1934*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "32",
1935*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
1936*333d2b36SAndroid Build Coastguard Worker		}
1937*333d2b36SAndroid Build Coastguard Worker
1938*333d2b36SAndroid Build Coastguard Worker		android_test {
1939*333d2b36SAndroid Build Coastguard Worker			name: "test_64",
1940*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_platform",
1941*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "64",
1942*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
1943*333d2b36SAndroid Build Coastguard Worker		}
1944*333d2b36SAndroid Build Coastguard Worker		`)
1945*333d2b36SAndroid Build Coastguard Worker
1946*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
1947*333d2b36SAndroid Build Coastguard Worker		name string
1948*333d2b36SAndroid Build Coastguard Worker		abis []string
1949*333d2b36SAndroid Build Coastguard Worker	}{
1950*333d2b36SAndroid Build Coastguard Worker		{"test", []string{"arm64-v8a"}},
1951*333d2b36SAndroid Build Coastguard Worker		{"test_first", []string{"arm64-v8a"}},
1952*333d2b36SAndroid Build Coastguard Worker		{"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1953*333d2b36SAndroid Build Coastguard Worker		{"test_32", []string{"armeabi-v7a"}},
1954*333d2b36SAndroid Build Coastguard Worker		{"test_64", []string{"arm64-v8a"}},
1955*333d2b36SAndroid Build Coastguard Worker	}
1956*333d2b36SAndroid Build Coastguard Worker
1957*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
1958*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
1959*333d2b36SAndroid Build Coastguard Worker			app := ctx.ModuleForTests(test.name, "android_common")
1960*333d2b36SAndroid Build Coastguard Worker			jniLibZip := app.Output("jnilibs.zip")
1961*333d2b36SAndroid Build Coastguard Worker			var abis []string
1962*333d2b36SAndroid Build Coastguard Worker			args := strings.Fields(jniLibZip.Args["jarArgs"])
1963*333d2b36SAndroid Build Coastguard Worker			for i := 0; i < len(args); i++ {
1964*333d2b36SAndroid Build Coastguard Worker				if args[i] == "-P" {
1965*333d2b36SAndroid Build Coastguard Worker					abis = append(abis, filepath.Base(args[i+1]))
1966*333d2b36SAndroid Build Coastguard Worker					i++
1967*333d2b36SAndroid Build Coastguard Worker				}
1968*333d2b36SAndroid Build Coastguard Worker			}
1969*333d2b36SAndroid Build Coastguard Worker			if !reflect.DeepEqual(abis, test.abis) {
1970*333d2b36SAndroid Build Coastguard Worker				t.Errorf("want abis %v, got %v", test.abis, abis)
1971*333d2b36SAndroid Build Coastguard Worker			}
1972*333d2b36SAndroid Build Coastguard Worker		})
1973*333d2b36SAndroid Build Coastguard Worker	}
1974*333d2b36SAndroid Build Coastguard Worker}
1975*333d2b36SAndroid Build Coastguard Worker
1976*333d2b36SAndroid Build Coastguard Workerfunc TestAppSdkVersionByPartition(t *testing.T) {
1977*333d2b36SAndroid Build Coastguard Worker	testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1978*333d2b36SAndroid Build Coastguard Worker		android_app {
1979*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1980*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1981*333d2b36SAndroid Build Coastguard Worker			vendor: true,
1982*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
1983*333d2b36SAndroid Build Coastguard Worker		}
1984*333d2b36SAndroid Build Coastguard Worker	`)
1985*333d2b36SAndroid Build Coastguard Worker
1986*333d2b36SAndroid Build Coastguard Worker	testJava(t, `
1987*333d2b36SAndroid Build Coastguard Worker		android_app {
1988*333d2b36SAndroid Build Coastguard Worker			name: "bar",
1989*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
1990*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
1991*333d2b36SAndroid Build Coastguard Worker		}
1992*333d2b36SAndroid Build Coastguard Worker	`)
1993*333d2b36SAndroid Build Coastguard Worker
1994*333d2b36SAndroid Build Coastguard Worker	for _, enforce := range []bool{true, false} {
1995*333d2b36SAndroid Build Coastguard Worker		bp := `
1996*333d2b36SAndroid Build Coastguard Worker			android_app {
1997*333d2b36SAndroid Build Coastguard Worker				name: "foo",
1998*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java"],
1999*333d2b36SAndroid Build Coastguard Worker				product_specific: true,
2000*333d2b36SAndroid Build Coastguard Worker				platform_apis: true,
2001*333d2b36SAndroid Build Coastguard Worker			}
2002*333d2b36SAndroid Build Coastguard Worker		`
2003*333d2b36SAndroid Build Coastguard Worker
2004*333d2b36SAndroid Build Coastguard Worker		errorHandler := android.FixtureExpectsNoErrors
2005*333d2b36SAndroid Build Coastguard Worker		if enforce {
2006*333d2b36SAndroid Build Coastguard Worker			errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern("sdk_version must have a value when the module is located at vendor or product")
2007*333d2b36SAndroid Build Coastguard Worker		}
2008*333d2b36SAndroid Build Coastguard Worker
2009*333d2b36SAndroid Build Coastguard Worker		android.GroupFixturePreparers(
2010*333d2b36SAndroid Build Coastguard Worker			PrepareForTestWithJavaDefaultModules,
2011*333d2b36SAndroid Build Coastguard Worker			android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2012*333d2b36SAndroid Build Coastguard Worker				variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
2013*333d2b36SAndroid Build Coastguard Worker			}),
2014*333d2b36SAndroid Build Coastguard Worker		).
2015*333d2b36SAndroid Build Coastguard Worker			ExtendWithErrorHandler(errorHandler).
2016*333d2b36SAndroid Build Coastguard Worker			RunTestWithBp(t, bp)
2017*333d2b36SAndroid Build Coastguard Worker	}
2018*333d2b36SAndroid Build Coastguard Worker}
2019*333d2b36SAndroid Build Coastguard Worker
2020*333d2b36SAndroid Build Coastguard Workerfunc TestJNIPackaging(t *testing.T) {
2021*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
2022*333d2b36SAndroid Build Coastguard Worker		cc_library {
2023*333d2b36SAndroid Build Coastguard Worker			name: "libjni",
2024*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
2025*333d2b36SAndroid Build Coastguard Worker			stl: "none",
2026*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2027*333d2b36SAndroid Build Coastguard Worker		}
2028*333d2b36SAndroid Build Coastguard Worker
2029*333d2b36SAndroid Build Coastguard Worker		android_app {
2030*333d2b36SAndroid Build Coastguard Worker			name: "app",
2031*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
2032*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2033*333d2b36SAndroid Build Coastguard Worker		}
2034*333d2b36SAndroid Build Coastguard Worker
2035*333d2b36SAndroid Build Coastguard Worker		android_app {
2036*333d2b36SAndroid Build Coastguard Worker			name: "app_noembed",
2037*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
2038*333d2b36SAndroid Build Coastguard Worker			use_embedded_native_libs: false,
2039*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2040*333d2b36SAndroid Build Coastguard Worker		}
2041*333d2b36SAndroid Build Coastguard Worker
2042*333d2b36SAndroid Build Coastguard Worker		android_app {
2043*333d2b36SAndroid Build Coastguard Worker			name: "app_embed",
2044*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
2045*333d2b36SAndroid Build Coastguard Worker			use_embedded_native_libs: true,
2046*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2047*333d2b36SAndroid Build Coastguard Worker		}
2048*333d2b36SAndroid Build Coastguard Worker
2049*333d2b36SAndroid Build Coastguard Worker		android_test {
2050*333d2b36SAndroid Build Coastguard Worker			name: "test",
2051*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2052*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
2053*333d2b36SAndroid Build Coastguard Worker		}
2054*333d2b36SAndroid Build Coastguard Worker
2055*333d2b36SAndroid Build Coastguard Worker		android_test {
2056*333d2b36SAndroid Build Coastguard Worker			name: "test_noembed",
2057*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2058*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
2059*333d2b36SAndroid Build Coastguard Worker			use_embedded_native_libs: false,
2060*333d2b36SAndroid Build Coastguard Worker		}
2061*333d2b36SAndroid Build Coastguard Worker
2062*333d2b36SAndroid Build Coastguard Worker		android_test_helper_app {
2063*333d2b36SAndroid Build Coastguard Worker			name: "test_helper",
2064*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2065*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
2066*333d2b36SAndroid Build Coastguard Worker		}
2067*333d2b36SAndroid Build Coastguard Worker
2068*333d2b36SAndroid Build Coastguard Worker		android_test_helper_app {
2069*333d2b36SAndroid Build Coastguard Worker			name: "test_helper_noembed",
2070*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2071*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
2072*333d2b36SAndroid Build Coastguard Worker			use_embedded_native_libs: false,
2073*333d2b36SAndroid Build Coastguard Worker		}
2074*333d2b36SAndroid Build Coastguard Worker		`)
2075*333d2b36SAndroid Build Coastguard Worker
2076*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
2077*333d2b36SAndroid Build Coastguard Worker		name       string
2078*333d2b36SAndroid Build Coastguard Worker		packaged   bool
2079*333d2b36SAndroid Build Coastguard Worker		compressed bool
2080*333d2b36SAndroid Build Coastguard Worker	}{
2081*333d2b36SAndroid Build Coastguard Worker		{"app", false, false},
2082*333d2b36SAndroid Build Coastguard Worker		{"app_noembed", false, false},
2083*333d2b36SAndroid Build Coastguard Worker		{"app_embed", true, false},
2084*333d2b36SAndroid Build Coastguard Worker		{"test", true, false},
2085*333d2b36SAndroid Build Coastguard Worker		{"test_noembed", true, true},
2086*333d2b36SAndroid Build Coastguard Worker		{"test_helper", true, false},
2087*333d2b36SAndroid Build Coastguard Worker		{"test_helper_noembed", true, true},
2088*333d2b36SAndroid Build Coastguard Worker	}
2089*333d2b36SAndroid Build Coastguard Worker
2090*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
2091*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
2092*333d2b36SAndroid Build Coastguard Worker			app := ctx.ModuleForTests(test.name, "android_common")
2093*333d2b36SAndroid Build Coastguard Worker			jniLibZip := app.MaybeOutput("jnilibs.zip")
2094*333d2b36SAndroid Build Coastguard Worker			if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
2095*333d2b36SAndroid Build Coastguard Worker				t.Errorf("expected jni packaged %v, got %v", w, g)
2096*333d2b36SAndroid Build Coastguard Worker			}
2097*333d2b36SAndroid Build Coastguard Worker
2098*333d2b36SAndroid Build Coastguard Worker			if jniLibZip.Rule != nil {
2099*333d2b36SAndroid Build Coastguard Worker				if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
2100*333d2b36SAndroid Build Coastguard Worker					t.Errorf("expected jni compressed %v, got %v", w, g)
2101*333d2b36SAndroid Build Coastguard Worker				}
2102*333d2b36SAndroid Build Coastguard Worker
2103*333d2b36SAndroid Build Coastguard Worker				if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
2104*333d2b36SAndroid Build Coastguard Worker					t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
2105*333d2b36SAndroid Build Coastguard Worker				}
2106*333d2b36SAndroid Build Coastguard Worker			}
2107*333d2b36SAndroid Build Coastguard Worker		})
2108*333d2b36SAndroid Build Coastguard Worker	}
2109*333d2b36SAndroid Build Coastguard Worker}
2110*333d2b36SAndroid Build Coastguard Worker
2111*333d2b36SAndroid Build Coastguard Workerfunc TestJNISDK(t *testing.T) {
2112*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
2113*333d2b36SAndroid Build Coastguard Worker		cc_library {
2114*333d2b36SAndroid Build Coastguard Worker			name: "libjni",
2115*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
2116*333d2b36SAndroid Build Coastguard Worker			stl: "none",
2117*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2118*333d2b36SAndroid Build Coastguard Worker		}
2119*333d2b36SAndroid Build Coastguard Worker
2120*333d2b36SAndroid Build Coastguard Worker		android_test {
2121*333d2b36SAndroid Build Coastguard Worker			name: "app_platform",
2122*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
2123*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
2124*333d2b36SAndroid Build Coastguard Worker		}
2125*333d2b36SAndroid Build Coastguard Worker
2126*333d2b36SAndroid Build Coastguard Worker		android_test {
2127*333d2b36SAndroid Build Coastguard Worker			name: "app_sdk",
2128*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
2129*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2130*333d2b36SAndroid Build Coastguard Worker		}
2131*333d2b36SAndroid Build Coastguard Worker
2132*333d2b36SAndroid Build Coastguard Worker		android_test {
2133*333d2b36SAndroid Build Coastguard Worker			name: "app_force_platform",
2134*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
2135*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2136*333d2b36SAndroid Build Coastguard Worker			jni_uses_platform_apis: true,
2137*333d2b36SAndroid Build Coastguard Worker		}
2138*333d2b36SAndroid Build Coastguard Worker
2139*333d2b36SAndroid Build Coastguard Worker		android_test {
2140*333d2b36SAndroid Build Coastguard Worker			name: "app_force_sdk",
2141*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
2142*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
2143*333d2b36SAndroid Build Coastguard Worker			jni_uses_sdk_apis: true,
2144*333d2b36SAndroid Build Coastguard Worker		}
2145*333d2b36SAndroid Build Coastguard Worker
2146*333d2b36SAndroid Build Coastguard Worker		cc_library {
2147*333d2b36SAndroid Build Coastguard Worker			name: "libvendorjni",
2148*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
2149*333d2b36SAndroid Build Coastguard Worker			stl: "none",
2150*333d2b36SAndroid Build Coastguard Worker			vendor: true,
2151*333d2b36SAndroid Build Coastguard Worker		}
2152*333d2b36SAndroid Build Coastguard Worker
2153*333d2b36SAndroid Build Coastguard Worker		android_test {
2154*333d2b36SAndroid Build Coastguard Worker			name: "app_vendor",
2155*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libvendorjni"],
2156*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2157*333d2b36SAndroid Build Coastguard Worker			vendor: true,
2158*333d2b36SAndroid Build Coastguard Worker		}
2159*333d2b36SAndroid Build Coastguard Worker	`)
2160*333d2b36SAndroid Build Coastguard Worker
2161*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
2162*333d2b36SAndroid Build Coastguard Worker		name      string
2163*333d2b36SAndroid Build Coastguard Worker		sdkJNI    bool
2164*333d2b36SAndroid Build Coastguard Worker		vendorJNI bool
2165*333d2b36SAndroid Build Coastguard Worker	}{
2166*333d2b36SAndroid Build Coastguard Worker		{name: "app_platform"},
2167*333d2b36SAndroid Build Coastguard Worker		{name: "app_sdk", sdkJNI: true},
2168*333d2b36SAndroid Build Coastguard Worker		{name: "app_force_platform"},
2169*333d2b36SAndroid Build Coastguard Worker		{name: "app_force_sdk", sdkJNI: true},
2170*333d2b36SAndroid Build Coastguard Worker		{name: "app_vendor", vendorJNI: true},
2171*333d2b36SAndroid Build Coastguard Worker	}
2172*333d2b36SAndroid Build Coastguard Worker
2173*333d2b36SAndroid Build Coastguard Worker	platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
2174*333d2b36SAndroid Build Coastguard Worker		Output("libjni.so").Output.String()
2175*333d2b36SAndroid Build Coastguard Worker	sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
2176*333d2b36SAndroid Build Coastguard Worker		Output("libjni.so").Output.String()
2177*333d2b36SAndroid Build Coastguard Worker	vendorJNI := ctx.ModuleForTests("libvendorjni", "android_vendor_arm64_armv8-a_shared").
2178*333d2b36SAndroid Build Coastguard Worker		Output("libvendorjni.so").Output.String()
2179*333d2b36SAndroid Build Coastguard Worker
2180*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
2181*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
2182*333d2b36SAndroid Build Coastguard Worker			app := ctx.ModuleForTests(test.name, "android_common")
2183*333d2b36SAndroid Build Coastguard Worker
2184*333d2b36SAndroid Build Coastguard Worker			jniLibZip := app.MaybeOutput("jnilibs.zip")
2185*333d2b36SAndroid Build Coastguard Worker			if len(jniLibZip.Implicits) != 1 {
2186*333d2b36SAndroid Build Coastguard Worker				t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
2187*333d2b36SAndroid Build Coastguard Worker			}
2188*333d2b36SAndroid Build Coastguard Worker			gotJNI := jniLibZip.Implicits[0].String()
2189*333d2b36SAndroid Build Coastguard Worker
2190*333d2b36SAndroid Build Coastguard Worker			if test.sdkJNI {
2191*333d2b36SAndroid Build Coastguard Worker				if gotJNI != sdkJNI {
2192*333d2b36SAndroid Build Coastguard Worker					t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
2193*333d2b36SAndroid Build Coastguard Worker				}
2194*333d2b36SAndroid Build Coastguard Worker			} else if test.vendorJNI {
2195*333d2b36SAndroid Build Coastguard Worker				if gotJNI != vendorJNI {
2196*333d2b36SAndroid Build Coastguard Worker					t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
2197*333d2b36SAndroid Build Coastguard Worker				}
2198*333d2b36SAndroid Build Coastguard Worker			} else {
2199*333d2b36SAndroid Build Coastguard Worker				if gotJNI != platformJNI {
2200*333d2b36SAndroid Build Coastguard Worker					t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
2201*333d2b36SAndroid Build Coastguard Worker				}
2202*333d2b36SAndroid Build Coastguard Worker			}
2203*333d2b36SAndroid Build Coastguard Worker		})
2204*333d2b36SAndroid Build Coastguard Worker	}
2205*333d2b36SAndroid Build Coastguard Worker
2206*333d2b36SAndroid Build Coastguard Worker	t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
2207*333d2b36SAndroid Build Coastguard Worker		testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
2208*333d2b36SAndroid Build Coastguard Worker			android_test {
2209*333d2b36SAndroid Build Coastguard Worker				name: "app_platform",
2210*333d2b36SAndroid Build Coastguard Worker				platform_apis: true,
2211*333d2b36SAndroid Build Coastguard Worker				jni_uses_platform_apis: true,
2212*333d2b36SAndroid Build Coastguard Worker			}
2213*333d2b36SAndroid Build Coastguard Worker		`)
2214*333d2b36SAndroid Build Coastguard Worker	})
2215*333d2b36SAndroid Build Coastguard Worker
2216*333d2b36SAndroid Build Coastguard Worker	t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
2217*333d2b36SAndroid Build Coastguard Worker		testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
2218*333d2b36SAndroid Build Coastguard Worker			android_test {
2219*333d2b36SAndroid Build Coastguard Worker				name: "app_sdk",
2220*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
2221*333d2b36SAndroid Build Coastguard Worker				jni_uses_sdk_apis: true,
2222*333d2b36SAndroid Build Coastguard Worker			}
2223*333d2b36SAndroid Build Coastguard Worker		`)
2224*333d2b36SAndroid Build Coastguard Worker	})
2225*333d2b36SAndroid Build Coastguard Worker
2226*333d2b36SAndroid Build Coastguard Worker}
2227*333d2b36SAndroid Build Coastguard Worker
2228*333d2b36SAndroid Build Coastguard Workerfunc TestCertificates(t *testing.T) {
2229*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
2230*333d2b36SAndroid Build Coastguard Worker		name                     string
2231*333d2b36SAndroid Build Coastguard Worker		bp                       string
2232*333d2b36SAndroid Build Coastguard Worker		allowMissingDependencies bool
2233*333d2b36SAndroid Build Coastguard Worker		certificateOverride      string
2234*333d2b36SAndroid Build Coastguard Worker		expectedCertSigningFlags string
2235*333d2b36SAndroid Build Coastguard Worker		expectedCertificate      string
2236*333d2b36SAndroid Build Coastguard Worker	}{
2237*333d2b36SAndroid Build Coastguard Worker		{
2238*333d2b36SAndroid Build Coastguard Worker			name: "default",
2239*333d2b36SAndroid Build Coastguard Worker			bp: `
2240*333d2b36SAndroid Build Coastguard Worker				android_app {
2241*333d2b36SAndroid Build Coastguard Worker					name: "foo",
2242*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
2243*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
2244*333d2b36SAndroid Build Coastguard Worker				}
2245*333d2b36SAndroid Build Coastguard Worker			`,
2246*333d2b36SAndroid Build Coastguard Worker			certificateOverride:      "",
2247*333d2b36SAndroid Build Coastguard Worker			expectedCertSigningFlags: "",
2248*333d2b36SAndroid Build Coastguard Worker			expectedCertificate:      "build/make/target/product/security/testkey",
2249*333d2b36SAndroid Build Coastguard Worker		},
2250*333d2b36SAndroid Build Coastguard Worker		{
2251*333d2b36SAndroid Build Coastguard Worker			name: "module certificate property",
2252*333d2b36SAndroid Build Coastguard Worker			bp: `
2253*333d2b36SAndroid Build Coastguard Worker				android_app {
2254*333d2b36SAndroid Build Coastguard Worker					name: "foo",
2255*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
2256*333d2b36SAndroid Build Coastguard Worker					certificate: ":new_certificate",
2257*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
2258*333d2b36SAndroid Build Coastguard Worker				}
2259*333d2b36SAndroid Build Coastguard Worker
2260*333d2b36SAndroid Build Coastguard Worker				android_app_certificate {
2261*333d2b36SAndroid Build Coastguard Worker					name: "new_certificate",
2262*333d2b36SAndroid Build Coastguard Worker					certificate: "cert/new_cert",
2263*333d2b36SAndroid Build Coastguard Worker				}
2264*333d2b36SAndroid Build Coastguard Worker			`,
2265*333d2b36SAndroid Build Coastguard Worker			certificateOverride:      "",
2266*333d2b36SAndroid Build Coastguard Worker			expectedCertSigningFlags: "",
2267*333d2b36SAndroid Build Coastguard Worker			expectedCertificate:      "cert/new_cert",
2268*333d2b36SAndroid Build Coastguard Worker		},
2269*333d2b36SAndroid Build Coastguard Worker		{
2270*333d2b36SAndroid Build Coastguard Worker			name: "path certificate property",
2271*333d2b36SAndroid Build Coastguard Worker			bp: `
2272*333d2b36SAndroid Build Coastguard Worker				android_app {
2273*333d2b36SAndroid Build Coastguard Worker					name: "foo",
2274*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
2275*333d2b36SAndroid Build Coastguard Worker					certificate: "expiredkey",
2276*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
2277*333d2b36SAndroid Build Coastguard Worker				}
2278*333d2b36SAndroid Build Coastguard Worker			`,
2279*333d2b36SAndroid Build Coastguard Worker			certificateOverride:      "",
2280*333d2b36SAndroid Build Coastguard Worker			expectedCertSigningFlags: "",
2281*333d2b36SAndroid Build Coastguard Worker			expectedCertificate:      "build/make/target/product/security/expiredkey",
2282*333d2b36SAndroid Build Coastguard Worker		},
2283*333d2b36SAndroid Build Coastguard Worker		{
2284*333d2b36SAndroid Build Coastguard Worker			name: "certificate overrides",
2285*333d2b36SAndroid Build Coastguard Worker			bp: `
2286*333d2b36SAndroid Build Coastguard Worker				android_app {
2287*333d2b36SAndroid Build Coastguard Worker					name: "foo",
2288*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
2289*333d2b36SAndroid Build Coastguard Worker					certificate: "expiredkey",
2290*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
2291*333d2b36SAndroid Build Coastguard Worker				}
2292*333d2b36SAndroid Build Coastguard Worker
2293*333d2b36SAndroid Build Coastguard Worker				android_app_certificate {
2294*333d2b36SAndroid Build Coastguard Worker					name: "new_certificate",
2295*333d2b36SAndroid Build Coastguard Worker					certificate: "cert/new_cert",
2296*333d2b36SAndroid Build Coastguard Worker				}
2297*333d2b36SAndroid Build Coastguard Worker			`,
2298*333d2b36SAndroid Build Coastguard Worker			certificateOverride:      "foo:new_certificate",
2299*333d2b36SAndroid Build Coastguard Worker			expectedCertSigningFlags: "",
2300*333d2b36SAndroid Build Coastguard Worker			expectedCertificate:      "cert/new_cert",
2301*333d2b36SAndroid Build Coastguard Worker		},
2302*333d2b36SAndroid Build Coastguard Worker		{
2303*333d2b36SAndroid Build Coastguard Worker			name: "certificate signing flags",
2304*333d2b36SAndroid Build Coastguard Worker			bp: `
2305*333d2b36SAndroid Build Coastguard Worker				android_app {
2306*333d2b36SAndroid Build Coastguard Worker					name: "foo",
2307*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
2308*333d2b36SAndroid Build Coastguard Worker					certificate: ":new_certificate",
2309*333d2b36SAndroid Build Coastguard Worker					lineage: "lineage.bin",
2310*333d2b36SAndroid Build Coastguard Worker					rotationMinSdkVersion: "32",
2311*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
2312*333d2b36SAndroid Build Coastguard Worker				}
2313*333d2b36SAndroid Build Coastguard Worker
2314*333d2b36SAndroid Build Coastguard Worker				android_app_certificate {
2315*333d2b36SAndroid Build Coastguard Worker					name: "new_certificate",
2316*333d2b36SAndroid Build Coastguard Worker					certificate: "cert/new_cert",
2317*333d2b36SAndroid Build Coastguard Worker				}
2318*333d2b36SAndroid Build Coastguard Worker			`,
2319*333d2b36SAndroid Build Coastguard Worker			certificateOverride:      "",
2320*333d2b36SAndroid Build Coastguard Worker			expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
2321*333d2b36SAndroid Build Coastguard Worker			expectedCertificate:      "cert/new_cert",
2322*333d2b36SAndroid Build Coastguard Worker		},
2323*333d2b36SAndroid Build Coastguard Worker		{
2324*333d2b36SAndroid Build Coastguard Worker			name: "cert signing flags from filegroup",
2325*333d2b36SAndroid Build Coastguard Worker			bp: `
2326*333d2b36SAndroid Build Coastguard Worker				android_app {
2327*333d2b36SAndroid Build Coastguard Worker					name: "foo",
2328*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
2329*333d2b36SAndroid Build Coastguard Worker					certificate: ":new_certificate",
2330*333d2b36SAndroid Build Coastguard Worker					lineage: ":lineage_bin",
2331*333d2b36SAndroid Build Coastguard Worker					rotationMinSdkVersion: "32",
2332*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
2333*333d2b36SAndroid Build Coastguard Worker				}
2334*333d2b36SAndroid Build Coastguard Worker
2335*333d2b36SAndroid Build Coastguard Worker				android_app_certificate {
2336*333d2b36SAndroid Build Coastguard Worker					name: "new_certificate",
2337*333d2b36SAndroid Build Coastguard Worker					certificate: "cert/new_cert",
2338*333d2b36SAndroid Build Coastguard Worker				}
2339*333d2b36SAndroid Build Coastguard Worker
2340*333d2b36SAndroid Build Coastguard Worker				filegroup {
2341*333d2b36SAndroid Build Coastguard Worker					name: "lineage_bin",
2342*333d2b36SAndroid Build Coastguard Worker					srcs: ["lineage.bin"],
2343*333d2b36SAndroid Build Coastguard Worker				}
2344*333d2b36SAndroid Build Coastguard Worker			`,
2345*333d2b36SAndroid Build Coastguard Worker			certificateOverride:      "",
2346*333d2b36SAndroid Build Coastguard Worker			expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
2347*333d2b36SAndroid Build Coastguard Worker			expectedCertificate:      "cert/new_cert",
2348*333d2b36SAndroid Build Coastguard Worker		},
2349*333d2b36SAndroid Build Coastguard Worker		{
2350*333d2b36SAndroid Build Coastguard Worker			name: "missing with AllowMissingDependencies",
2351*333d2b36SAndroid Build Coastguard Worker			bp: `
2352*333d2b36SAndroid Build Coastguard Worker				android_app {
2353*333d2b36SAndroid Build Coastguard Worker					name: "foo",
2354*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
2355*333d2b36SAndroid Build Coastguard Worker					certificate: ":new_certificate",
2356*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
2357*333d2b36SAndroid Build Coastguard Worker				}
2358*333d2b36SAndroid Build Coastguard Worker			`,
2359*333d2b36SAndroid Build Coastguard Worker			expectedCertificate:      "out/soong/.intermediates/foo/android_common/missing",
2360*333d2b36SAndroid Build Coastguard Worker			allowMissingDependencies: true,
2361*333d2b36SAndroid Build Coastguard Worker		},
2362*333d2b36SAndroid Build Coastguard Worker	}
2363*333d2b36SAndroid Build Coastguard Worker
2364*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
2365*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
2366*333d2b36SAndroid Build Coastguard Worker			result := android.GroupFixturePreparers(
2367*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithJavaDefaultModules,
2368*333d2b36SAndroid Build Coastguard Worker				android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2369*333d2b36SAndroid Build Coastguard Worker					if test.certificateOverride != "" {
2370*333d2b36SAndroid Build Coastguard Worker						variables.CertificateOverrides = []string{test.certificateOverride}
2371*333d2b36SAndroid Build Coastguard Worker					}
2372*333d2b36SAndroid Build Coastguard Worker					if test.allowMissingDependencies {
2373*333d2b36SAndroid Build Coastguard Worker						variables.Allow_missing_dependencies = proptools.BoolPtr(true)
2374*333d2b36SAndroid Build Coastguard Worker					}
2375*333d2b36SAndroid Build Coastguard Worker				}),
2376*333d2b36SAndroid Build Coastguard Worker				android.FixtureModifyContext(func(ctx *android.TestContext) {
2377*333d2b36SAndroid Build Coastguard Worker					ctx.SetAllowMissingDependencies(test.allowMissingDependencies)
2378*333d2b36SAndroid Build Coastguard Worker				}),
2379*333d2b36SAndroid Build Coastguard Worker			).RunTestWithBp(t, test.bp)
2380*333d2b36SAndroid Build Coastguard Worker
2381*333d2b36SAndroid Build Coastguard Worker			foo := result.ModuleForTests("foo", "android_common")
2382*333d2b36SAndroid Build Coastguard Worker
2383*333d2b36SAndroid Build Coastguard Worker			certificate := foo.Module().(*AndroidApp).certificate
2384*333d2b36SAndroid Build Coastguard Worker			android.AssertPathRelativeToTopEquals(t, "certificates key", test.expectedCertificate+".pk8", certificate.Key)
2385*333d2b36SAndroid Build Coastguard Worker			// The sign_target_files_apks and check_target_files_signatures
2386*333d2b36SAndroid Build Coastguard Worker			// tools require that certificates have a .x509.pem extension.
2387*333d2b36SAndroid Build Coastguard Worker			android.AssertPathRelativeToTopEquals(t, "certificates pem", test.expectedCertificate+".x509.pem", certificate.Pem)
2388*333d2b36SAndroid Build Coastguard Worker
2389*333d2b36SAndroid Build Coastguard Worker			signapk := foo.Output("foo.apk")
2390*333d2b36SAndroid Build Coastguard Worker			if signapk.Rule != android.ErrorRule {
2391*333d2b36SAndroid Build Coastguard Worker				signCertificateFlags := signapk.Args["certificates"]
2392*333d2b36SAndroid Build Coastguard Worker				expectedFlags := certificate.Pem.String() + " " + certificate.Key.String()
2393*333d2b36SAndroid Build Coastguard Worker				android.AssertStringEquals(t, "certificates flags", expectedFlags, signCertificateFlags)
2394*333d2b36SAndroid Build Coastguard Worker
2395*333d2b36SAndroid Build Coastguard Worker				certSigningFlags := signapk.Args["flags"]
2396*333d2b36SAndroid Build Coastguard Worker				android.AssertStringEquals(t, "cert signing flags", test.expectedCertSigningFlags, certSigningFlags)
2397*333d2b36SAndroid Build Coastguard Worker			}
2398*333d2b36SAndroid Build Coastguard Worker		})
2399*333d2b36SAndroid Build Coastguard Worker	}
2400*333d2b36SAndroid Build Coastguard Worker}
2401*333d2b36SAndroid Build Coastguard Worker
2402*333d2b36SAndroid Build Coastguard Workerfunc TestRequestV4SigningFlag(t *testing.T) {
2403*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
2404*333d2b36SAndroid Build Coastguard Worker		name     string
2405*333d2b36SAndroid Build Coastguard Worker		bp       string
2406*333d2b36SAndroid Build Coastguard Worker		expected string
2407*333d2b36SAndroid Build Coastguard Worker	}{
2408*333d2b36SAndroid Build Coastguard Worker		{
2409*333d2b36SAndroid Build Coastguard Worker			name: "default",
2410*333d2b36SAndroid Build Coastguard Worker			bp: `
2411*333d2b36SAndroid Build Coastguard Worker				android_app {
2412*333d2b36SAndroid Build Coastguard Worker					name: "foo",
2413*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
2414*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
2415*333d2b36SAndroid Build Coastguard Worker				}
2416*333d2b36SAndroid Build Coastguard Worker			`,
2417*333d2b36SAndroid Build Coastguard Worker			expected: "",
2418*333d2b36SAndroid Build Coastguard Worker		},
2419*333d2b36SAndroid Build Coastguard Worker		{
2420*333d2b36SAndroid Build Coastguard Worker			name: "default",
2421*333d2b36SAndroid Build Coastguard Worker			bp: `
2422*333d2b36SAndroid Build Coastguard Worker				android_app {
2423*333d2b36SAndroid Build Coastguard Worker					name: "foo",
2424*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
2425*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
2426*333d2b36SAndroid Build Coastguard Worker					v4_signature: false,
2427*333d2b36SAndroid Build Coastguard Worker				}
2428*333d2b36SAndroid Build Coastguard Worker			`,
2429*333d2b36SAndroid Build Coastguard Worker			expected: "",
2430*333d2b36SAndroid Build Coastguard Worker		},
2431*333d2b36SAndroid Build Coastguard Worker		{
2432*333d2b36SAndroid Build Coastguard Worker			name: "module certificate property",
2433*333d2b36SAndroid Build Coastguard Worker			bp: `
2434*333d2b36SAndroid Build Coastguard Worker				android_app {
2435*333d2b36SAndroid Build Coastguard Worker					name: "foo",
2436*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
2437*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
2438*333d2b36SAndroid Build Coastguard Worker					v4_signature: true,
2439*333d2b36SAndroid Build Coastguard Worker				}
2440*333d2b36SAndroid Build Coastguard Worker			`,
2441*333d2b36SAndroid Build Coastguard Worker			expected: "--enable-v4",
2442*333d2b36SAndroid Build Coastguard Worker		},
2443*333d2b36SAndroid Build Coastguard Worker	}
2444*333d2b36SAndroid Build Coastguard Worker
2445*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
2446*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
2447*333d2b36SAndroid Build Coastguard Worker			result := android.GroupFixturePreparers(
2448*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithJavaDefaultModules,
2449*333d2b36SAndroid Build Coastguard Worker			).RunTestWithBp(t, test.bp)
2450*333d2b36SAndroid Build Coastguard Worker
2451*333d2b36SAndroid Build Coastguard Worker			foo := result.ModuleForTests("foo", "android_common")
2452*333d2b36SAndroid Build Coastguard Worker
2453*333d2b36SAndroid Build Coastguard Worker			signapk := foo.Output("foo.apk")
2454*333d2b36SAndroid Build Coastguard Worker			signFlags := signapk.Args["flags"]
2455*333d2b36SAndroid Build Coastguard Worker			android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
2456*333d2b36SAndroid Build Coastguard Worker		})
2457*333d2b36SAndroid Build Coastguard Worker	}
2458*333d2b36SAndroid Build Coastguard Worker}
2459*333d2b36SAndroid Build Coastguard Worker
2460*333d2b36SAndroid Build Coastguard Workerfunc TestPackageNameOverride(t *testing.T) {
2461*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
2462*333d2b36SAndroid Build Coastguard Worker		name                string
2463*333d2b36SAndroid Build Coastguard Worker		bp                  string
2464*333d2b36SAndroid Build Coastguard Worker		packageNameOverride string
2465*333d2b36SAndroid Build Coastguard Worker		expected            []string
2466*333d2b36SAndroid Build Coastguard Worker	}{
2467*333d2b36SAndroid Build Coastguard Worker		{
2468*333d2b36SAndroid Build Coastguard Worker			name: "default",
2469*333d2b36SAndroid Build Coastguard Worker			bp: `
2470*333d2b36SAndroid Build Coastguard Worker				android_app {
2471*333d2b36SAndroid Build Coastguard Worker					name: "foo",
2472*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
2473*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
2474*333d2b36SAndroid Build Coastguard Worker				}
2475*333d2b36SAndroid Build Coastguard Worker			`,
2476*333d2b36SAndroid Build Coastguard Worker			packageNameOverride: "",
2477*333d2b36SAndroid Build Coastguard Worker			expected: []string{
2478*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/foo/android_common/foo.apk",
2479*333d2b36SAndroid Build Coastguard Worker				"out/soong/target/product/test_device/system/app/foo/foo.apk",
2480*333d2b36SAndroid Build Coastguard Worker			},
2481*333d2b36SAndroid Build Coastguard Worker		},
2482*333d2b36SAndroid Build Coastguard Worker		{
2483*333d2b36SAndroid Build Coastguard Worker			name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
2484*333d2b36SAndroid Build Coastguard Worker			bp: `
2485*333d2b36SAndroid Build Coastguard Worker				android_app {
2486*333d2b36SAndroid Build Coastguard Worker					name: "foo",
2487*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
2488*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
2489*333d2b36SAndroid Build Coastguard Worker				}
2490*333d2b36SAndroid Build Coastguard Worker			`,
2491*333d2b36SAndroid Build Coastguard Worker			packageNameOverride: "foo:bar",
2492*333d2b36SAndroid Build Coastguard Worker			expected: []string{
2493*333d2b36SAndroid Build Coastguard Worker				// The package apk should be still be the original name for test dependencies.
2494*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/foo/android_common/bar.apk",
2495*333d2b36SAndroid Build Coastguard Worker				"out/soong/target/product/test_device/system/app/bar/bar.apk",
2496*333d2b36SAndroid Build Coastguard Worker			},
2497*333d2b36SAndroid Build Coastguard Worker		},
2498*333d2b36SAndroid Build Coastguard Worker		{
2499*333d2b36SAndroid Build Coastguard Worker			name: "overridden via stem",
2500*333d2b36SAndroid Build Coastguard Worker			bp: `
2501*333d2b36SAndroid Build Coastguard Worker				android_app {
2502*333d2b36SAndroid Build Coastguard Worker					name: "foo",
2503*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
2504*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
2505*333d2b36SAndroid Build Coastguard Worker					stem: "bar",
2506*333d2b36SAndroid Build Coastguard Worker				}
2507*333d2b36SAndroid Build Coastguard Worker			`,
2508*333d2b36SAndroid Build Coastguard Worker			packageNameOverride: "",
2509*333d2b36SAndroid Build Coastguard Worker			expected: []string{
2510*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/foo/android_common/bar.apk",
2511*333d2b36SAndroid Build Coastguard Worker				"out/soong/target/product/test_device/system/app/bar/bar.apk",
2512*333d2b36SAndroid Build Coastguard Worker			},
2513*333d2b36SAndroid Build Coastguard Worker		},
2514*333d2b36SAndroid Build Coastguard Worker	}
2515*333d2b36SAndroid Build Coastguard Worker
2516*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
2517*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
2518*333d2b36SAndroid Build Coastguard Worker			result := android.GroupFixturePreparers(
2519*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithJavaDefaultModules,
2520*333d2b36SAndroid Build Coastguard Worker				android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2521*333d2b36SAndroid Build Coastguard Worker					if test.packageNameOverride != "" {
2522*333d2b36SAndroid Build Coastguard Worker						variables.PackageNameOverrides = []string{test.packageNameOverride}
2523*333d2b36SAndroid Build Coastguard Worker					}
2524*333d2b36SAndroid Build Coastguard Worker				}),
2525*333d2b36SAndroid Build Coastguard Worker			).RunTestWithBp(t, test.bp)
2526*333d2b36SAndroid Build Coastguard Worker
2527*333d2b36SAndroid Build Coastguard Worker			foo := result.ModuleForTests("foo", "android_common")
2528*333d2b36SAndroid Build Coastguard Worker
2529*333d2b36SAndroid Build Coastguard Worker			outSoongDir := result.Config.SoongOutDir()
2530*333d2b36SAndroid Build Coastguard Worker
2531*333d2b36SAndroid Build Coastguard Worker			outputs := foo.AllOutputs()
2532*333d2b36SAndroid Build Coastguard Worker			outputMap := make(map[string]bool)
2533*333d2b36SAndroid Build Coastguard Worker			for _, o := range outputs {
2534*333d2b36SAndroid Build Coastguard Worker				outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
2535*333d2b36SAndroid Build Coastguard Worker			}
2536*333d2b36SAndroid Build Coastguard Worker			for _, e := range test.expected {
2537*333d2b36SAndroid Build Coastguard Worker				if _, exist := outputMap[e]; !exist {
2538*333d2b36SAndroid Build Coastguard Worker					t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
2539*333d2b36SAndroid Build Coastguard Worker				}
2540*333d2b36SAndroid Build Coastguard Worker			}
2541*333d2b36SAndroid Build Coastguard Worker		})
2542*333d2b36SAndroid Build Coastguard Worker	}
2543*333d2b36SAndroid Build Coastguard Worker}
2544*333d2b36SAndroid Build Coastguard Worker
2545*333d2b36SAndroid Build Coastguard Workerfunc TestInstrumentationTargetOverridden(t *testing.T) {
2546*333d2b36SAndroid Build Coastguard Worker	bp := `
2547*333d2b36SAndroid Build Coastguard Worker		android_app {
2548*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2549*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2550*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2551*333d2b36SAndroid Build Coastguard Worker		}
2552*333d2b36SAndroid Build Coastguard Worker
2553*333d2b36SAndroid Build Coastguard Worker		android_test {
2554*333d2b36SAndroid Build Coastguard Worker			name: "bar",
2555*333d2b36SAndroid Build Coastguard Worker			instrumentation_for: "foo",
2556*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2557*333d2b36SAndroid Build Coastguard Worker		}
2558*333d2b36SAndroid Build Coastguard Worker		`
2559*333d2b36SAndroid Build Coastguard Worker
2560*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
2561*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
2562*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2563*333d2b36SAndroid Build Coastguard Worker			variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
2564*333d2b36SAndroid Build Coastguard Worker		}),
2565*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
2566*333d2b36SAndroid Build Coastguard Worker
2567*333d2b36SAndroid Build Coastguard Worker	bar := result.ModuleForTests("bar", "android_common")
2568*333d2b36SAndroid Build Coastguard Worker	res := bar.Output("package-res.apk")
2569*333d2b36SAndroid Build Coastguard Worker	aapt2Flags := res.Args["flags"]
2570*333d2b36SAndroid Build Coastguard Worker	e := "--rename-instrumentation-target-package org.dandroid.bp"
2571*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(aapt2Flags, e) {
2572*333d2b36SAndroid Build Coastguard Worker		t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
2573*333d2b36SAndroid Build Coastguard Worker	}
2574*333d2b36SAndroid Build Coastguard Worker}
2575*333d2b36SAndroid Build Coastguard Worker
2576*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideAndroidApp(t *testing.T) {
2577*333d2b36SAndroid Build Coastguard Worker	result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2578*333d2b36SAndroid Build Coastguard Worker		t, `
2579*333d2b36SAndroid Build Coastguard Worker		android_app {
2580*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2581*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2582*333d2b36SAndroid Build Coastguard Worker			certificate: "expiredkey",
2583*333d2b36SAndroid Build Coastguard Worker			overrides: ["qux"],
2584*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2585*333d2b36SAndroid Build Coastguard Worker		}
2586*333d2b36SAndroid Build Coastguard Worker
2587*333d2b36SAndroid Build Coastguard Worker		override_android_app {
2588*333d2b36SAndroid Build Coastguard Worker			name: "bar",
2589*333d2b36SAndroid Build Coastguard Worker			base: "foo",
2590*333d2b36SAndroid Build Coastguard Worker			certificate: ":new_certificate",
2591*333d2b36SAndroid Build Coastguard Worker			lineage: "lineage.bin",
2592*333d2b36SAndroid Build Coastguard Worker			rotationMinSdkVersion: "32",
2593*333d2b36SAndroid Build Coastguard Worker			logging_parent: "bah",
2594*333d2b36SAndroid Build Coastguard Worker		}
2595*333d2b36SAndroid Build Coastguard Worker
2596*333d2b36SAndroid Build Coastguard Worker		android_app_certificate {
2597*333d2b36SAndroid Build Coastguard Worker			name: "new_certificate",
2598*333d2b36SAndroid Build Coastguard Worker			certificate: "cert/new_cert",
2599*333d2b36SAndroid Build Coastguard Worker		}
2600*333d2b36SAndroid Build Coastguard Worker
2601*333d2b36SAndroid Build Coastguard Worker		override_android_app {
2602*333d2b36SAndroid Build Coastguard Worker			name: "baz",
2603*333d2b36SAndroid Build Coastguard Worker			base: "foo",
2604*333d2b36SAndroid Build Coastguard Worker			package_name: "org.dandroid.bp",
2605*333d2b36SAndroid Build Coastguard Worker		}
2606*333d2b36SAndroid Build Coastguard Worker
2607*333d2b36SAndroid Build Coastguard Worker		override_android_app {
2608*333d2b36SAndroid Build Coastguard Worker			name: "baz_no_rename_resources",
2609*333d2b36SAndroid Build Coastguard Worker			base: "foo",
2610*333d2b36SAndroid Build Coastguard Worker			package_name: "org.dandroid.bp",
2611*333d2b36SAndroid Build Coastguard Worker			rename_resources_package: false,
2612*333d2b36SAndroid Build Coastguard Worker		}
2613*333d2b36SAndroid Build Coastguard Worker
2614*333d2b36SAndroid Build Coastguard Worker		android_app {
2615*333d2b36SAndroid Build Coastguard Worker			name: "foo_no_rename_resources",
2616*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2617*333d2b36SAndroid Build Coastguard Worker			certificate: "expiredkey",
2618*333d2b36SAndroid Build Coastguard Worker			overrides: ["qux"],
2619*333d2b36SAndroid Build Coastguard Worker			rename_resources_package: false,
2620*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2621*333d2b36SAndroid Build Coastguard Worker		}
2622*333d2b36SAndroid Build Coastguard Worker
2623*333d2b36SAndroid Build Coastguard Worker		override_android_app {
2624*333d2b36SAndroid Build Coastguard Worker			name: "baz_base_no_rename_resources",
2625*333d2b36SAndroid Build Coastguard Worker			base: "foo_no_rename_resources",
2626*333d2b36SAndroid Build Coastguard Worker			package_name: "org.dandroid.bp",
2627*333d2b36SAndroid Build Coastguard Worker		}
2628*333d2b36SAndroid Build Coastguard Worker
2629*333d2b36SAndroid Build Coastguard Worker		override_android_app {
2630*333d2b36SAndroid Build Coastguard Worker			name: "baz_override_base_rename_resources",
2631*333d2b36SAndroid Build Coastguard Worker			base: "foo_no_rename_resources",
2632*333d2b36SAndroid Build Coastguard Worker			package_name: "org.dandroid.bp",
2633*333d2b36SAndroid Build Coastguard Worker			rename_resources_package: true,
2634*333d2b36SAndroid Build Coastguard Worker		}
2635*333d2b36SAndroid Build Coastguard Worker		`)
2636*333d2b36SAndroid Build Coastguard Worker
2637*333d2b36SAndroid Build Coastguard Worker	expectedVariants := []struct {
2638*333d2b36SAndroid Build Coastguard Worker		name             string
2639*333d2b36SAndroid Build Coastguard Worker		moduleName       string
2640*333d2b36SAndroid Build Coastguard Worker		variantName      string
2641*333d2b36SAndroid Build Coastguard Worker		apkName          string
2642*333d2b36SAndroid Build Coastguard Worker		apkPath          string
2643*333d2b36SAndroid Build Coastguard Worker		certFlag         string
2644*333d2b36SAndroid Build Coastguard Worker		certSigningFlags string
2645*333d2b36SAndroid Build Coastguard Worker		overrides        []string
2646*333d2b36SAndroid Build Coastguard Worker		packageFlag      string
2647*333d2b36SAndroid Build Coastguard Worker		renameResources  bool
2648*333d2b36SAndroid Build Coastguard Worker		logging_parent   string
2649*333d2b36SAndroid Build Coastguard Worker	}{
2650*333d2b36SAndroid Build Coastguard Worker		{
2651*333d2b36SAndroid Build Coastguard Worker			name:             "foo",
2652*333d2b36SAndroid Build Coastguard Worker			moduleName:       "foo",
2653*333d2b36SAndroid Build Coastguard Worker			variantName:      "android_common",
2654*333d2b36SAndroid Build Coastguard Worker			apkPath:          "out/soong/target/product/test_device/system/app/foo/foo.apk",
2655*333d2b36SAndroid Build Coastguard Worker			certFlag:         "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2656*333d2b36SAndroid Build Coastguard Worker			certSigningFlags: "",
2657*333d2b36SAndroid Build Coastguard Worker			overrides:        []string{"qux"},
2658*333d2b36SAndroid Build Coastguard Worker			packageFlag:      "",
2659*333d2b36SAndroid Build Coastguard Worker			renameResources:  false,
2660*333d2b36SAndroid Build Coastguard Worker			logging_parent:   "",
2661*333d2b36SAndroid Build Coastguard Worker		},
2662*333d2b36SAndroid Build Coastguard Worker		{
2663*333d2b36SAndroid Build Coastguard Worker			name:             "foo",
2664*333d2b36SAndroid Build Coastguard Worker			moduleName:       "bar",
2665*333d2b36SAndroid Build Coastguard Worker			variantName:      "android_common_bar",
2666*333d2b36SAndroid Build Coastguard Worker			apkPath:          "out/soong/target/product/test_device/system/app/bar/bar.apk",
2667*333d2b36SAndroid Build Coastguard Worker			certFlag:         "cert/new_cert.x509.pem cert/new_cert.pk8",
2668*333d2b36SAndroid Build Coastguard Worker			certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
2669*333d2b36SAndroid Build Coastguard Worker			overrides:        []string{"qux", "foo"},
2670*333d2b36SAndroid Build Coastguard Worker			packageFlag:      "",
2671*333d2b36SAndroid Build Coastguard Worker			renameResources:  false,
2672*333d2b36SAndroid Build Coastguard Worker			logging_parent:   "bah",
2673*333d2b36SAndroid Build Coastguard Worker		},
2674*333d2b36SAndroid Build Coastguard Worker		{
2675*333d2b36SAndroid Build Coastguard Worker			name:             "foo",
2676*333d2b36SAndroid Build Coastguard Worker			moduleName:       "baz",
2677*333d2b36SAndroid Build Coastguard Worker			variantName:      "android_common_baz",
2678*333d2b36SAndroid Build Coastguard Worker			apkPath:          "out/soong/target/product/test_device/system/app/baz/baz.apk",
2679*333d2b36SAndroid Build Coastguard Worker			certFlag:         "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2680*333d2b36SAndroid Build Coastguard Worker			certSigningFlags: "",
2681*333d2b36SAndroid Build Coastguard Worker			overrides:        []string{"qux", "foo"},
2682*333d2b36SAndroid Build Coastguard Worker			packageFlag:      "org.dandroid.bp",
2683*333d2b36SAndroid Build Coastguard Worker			renameResources:  true,
2684*333d2b36SAndroid Build Coastguard Worker			logging_parent:   "",
2685*333d2b36SAndroid Build Coastguard Worker		},
2686*333d2b36SAndroid Build Coastguard Worker		{
2687*333d2b36SAndroid Build Coastguard Worker			name:             "foo",
2688*333d2b36SAndroid Build Coastguard Worker			moduleName:       "baz_no_rename_resources",
2689*333d2b36SAndroid Build Coastguard Worker			variantName:      "android_common_baz_no_rename_resources",
2690*333d2b36SAndroid Build Coastguard Worker			apkPath:          "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
2691*333d2b36SAndroid Build Coastguard Worker			certFlag:         "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2692*333d2b36SAndroid Build Coastguard Worker			certSigningFlags: "",
2693*333d2b36SAndroid Build Coastguard Worker			overrides:        []string{"qux", "foo"},
2694*333d2b36SAndroid Build Coastguard Worker			packageFlag:      "org.dandroid.bp",
2695*333d2b36SAndroid Build Coastguard Worker			renameResources:  false,
2696*333d2b36SAndroid Build Coastguard Worker			logging_parent:   "",
2697*333d2b36SAndroid Build Coastguard Worker		},
2698*333d2b36SAndroid Build Coastguard Worker		{
2699*333d2b36SAndroid Build Coastguard Worker			name:             "foo_no_rename_resources",
2700*333d2b36SAndroid Build Coastguard Worker			moduleName:       "baz_base_no_rename_resources",
2701*333d2b36SAndroid Build Coastguard Worker			variantName:      "android_common_baz_base_no_rename_resources",
2702*333d2b36SAndroid Build Coastguard Worker			apkPath:          "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
2703*333d2b36SAndroid Build Coastguard Worker			certFlag:         "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2704*333d2b36SAndroid Build Coastguard Worker			certSigningFlags: "",
2705*333d2b36SAndroid Build Coastguard Worker			overrides:        []string{"qux", "foo_no_rename_resources"},
2706*333d2b36SAndroid Build Coastguard Worker			packageFlag:      "org.dandroid.bp",
2707*333d2b36SAndroid Build Coastguard Worker			renameResources:  false,
2708*333d2b36SAndroid Build Coastguard Worker			logging_parent:   "",
2709*333d2b36SAndroid Build Coastguard Worker		},
2710*333d2b36SAndroid Build Coastguard Worker		{
2711*333d2b36SAndroid Build Coastguard Worker			name:             "foo_no_rename_resources",
2712*333d2b36SAndroid Build Coastguard Worker			moduleName:       "baz_override_base_rename_resources",
2713*333d2b36SAndroid Build Coastguard Worker			variantName:      "android_common_baz_override_base_rename_resources",
2714*333d2b36SAndroid Build Coastguard Worker			apkPath:          "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
2715*333d2b36SAndroid Build Coastguard Worker			certFlag:         "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2716*333d2b36SAndroid Build Coastguard Worker			certSigningFlags: "",
2717*333d2b36SAndroid Build Coastguard Worker			overrides:        []string{"qux", "foo_no_rename_resources"},
2718*333d2b36SAndroid Build Coastguard Worker			packageFlag:      "org.dandroid.bp",
2719*333d2b36SAndroid Build Coastguard Worker			renameResources:  true,
2720*333d2b36SAndroid Build Coastguard Worker			logging_parent:   "",
2721*333d2b36SAndroid Build Coastguard Worker		},
2722*333d2b36SAndroid Build Coastguard Worker	}
2723*333d2b36SAndroid Build Coastguard Worker	for _, expected := range expectedVariants {
2724*333d2b36SAndroid Build Coastguard Worker		variant := result.ModuleForTests(expected.name, expected.variantName)
2725*333d2b36SAndroid Build Coastguard Worker
2726*333d2b36SAndroid Build Coastguard Worker		// Check the final apk name
2727*333d2b36SAndroid Build Coastguard Worker		variant.Output(expected.apkPath)
2728*333d2b36SAndroid Build Coastguard Worker
2729*333d2b36SAndroid Build Coastguard Worker		// Check the certificate paths
2730*333d2b36SAndroid Build Coastguard Worker		signapk := variant.Output(expected.moduleName + ".apk")
2731*333d2b36SAndroid Build Coastguard Worker		certFlag := signapk.Args["certificates"]
2732*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
2733*333d2b36SAndroid Build Coastguard Worker
2734*333d2b36SAndroid Build Coastguard Worker		// Check the cert signing flags
2735*333d2b36SAndroid Build Coastguard Worker		certSigningFlags := signapk.Args["flags"]
2736*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "cert signing flags", expected.certSigningFlags, certSigningFlags)
2737*333d2b36SAndroid Build Coastguard Worker
2738*333d2b36SAndroid Build Coastguard Worker		// Check if the overrides field values are correctly aggregated.
2739*333d2b36SAndroid Build Coastguard Worker		mod := variant.Module().(*AndroidApp)
2740*333d2b36SAndroid Build Coastguard Worker		android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2741*333d2b36SAndroid Build Coastguard Worker
2742*333d2b36SAndroid Build Coastguard Worker		// Test Overridable property: Logging_parent
2743*333d2b36SAndroid Build Coastguard Worker		logging_parent := mod.aapt.LoggingParent
2744*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
2745*333d2b36SAndroid Build Coastguard Worker
2746*333d2b36SAndroid Build Coastguard Worker		// Check the package renaming flag, if exists.
2747*333d2b36SAndroid Build Coastguard Worker		res := variant.Output("package-res.apk")
2748*333d2b36SAndroid Build Coastguard Worker		aapt2Flags := res.Args["flags"]
2749*333d2b36SAndroid Build Coastguard Worker		checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
2750*333d2b36SAndroid Build Coastguard Worker		expectedPackage := expected.packageFlag
2751*333d2b36SAndroid Build Coastguard Worker		if !expected.renameResources {
2752*333d2b36SAndroid Build Coastguard Worker			expectedPackage = ""
2753*333d2b36SAndroid Build Coastguard Worker		}
2754*333d2b36SAndroid Build Coastguard Worker		checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
2755*333d2b36SAndroid Build Coastguard Worker	}
2756*333d2b36SAndroid Build Coastguard Worker}
2757*333d2b36SAndroid Build Coastguard Worker
2758*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideAndroidAppOverrides(t *testing.T) {
2759*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(
2760*333d2b36SAndroid Build Coastguard Worker		t, `
2761*333d2b36SAndroid Build Coastguard Worker		android_app {
2762*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2763*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2764*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2765*333d2b36SAndroid Build Coastguard Worker			overrides: ["qux"]
2766*333d2b36SAndroid Build Coastguard Worker		}
2767*333d2b36SAndroid Build Coastguard Worker
2768*333d2b36SAndroid Build Coastguard Worker		android_app {
2769*333d2b36SAndroid Build Coastguard Worker			name: "bar",
2770*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
2771*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2772*333d2b36SAndroid Build Coastguard Worker			overrides: ["foo"]
2773*333d2b36SAndroid Build Coastguard Worker		}
2774*333d2b36SAndroid Build Coastguard Worker
2775*333d2b36SAndroid Build Coastguard Worker		override_android_app {
2776*333d2b36SAndroid Build Coastguard Worker			name: "foo_override",
2777*333d2b36SAndroid Build Coastguard Worker			base: "foo",
2778*333d2b36SAndroid Build Coastguard Worker			overrides: ["bar"]
2779*333d2b36SAndroid Build Coastguard Worker		}
2780*333d2b36SAndroid Build Coastguard Worker		`)
2781*333d2b36SAndroid Build Coastguard Worker
2782*333d2b36SAndroid Build Coastguard Worker	expectedVariants := []struct {
2783*333d2b36SAndroid Build Coastguard Worker		name        string
2784*333d2b36SAndroid Build Coastguard Worker		moduleName  string
2785*333d2b36SAndroid Build Coastguard Worker		variantName string
2786*333d2b36SAndroid Build Coastguard Worker		overrides   []string
2787*333d2b36SAndroid Build Coastguard Worker	}{
2788*333d2b36SAndroid Build Coastguard Worker		{
2789*333d2b36SAndroid Build Coastguard Worker			name:        "foo",
2790*333d2b36SAndroid Build Coastguard Worker			moduleName:  "foo",
2791*333d2b36SAndroid Build Coastguard Worker			variantName: "android_common",
2792*333d2b36SAndroid Build Coastguard Worker			overrides:   []string{"qux"},
2793*333d2b36SAndroid Build Coastguard Worker		},
2794*333d2b36SAndroid Build Coastguard Worker		{
2795*333d2b36SAndroid Build Coastguard Worker			name:        "bar",
2796*333d2b36SAndroid Build Coastguard Worker			moduleName:  "bar",
2797*333d2b36SAndroid Build Coastguard Worker			variantName: "android_common",
2798*333d2b36SAndroid Build Coastguard Worker			overrides:   []string{"foo"},
2799*333d2b36SAndroid Build Coastguard Worker		},
2800*333d2b36SAndroid Build Coastguard Worker		{
2801*333d2b36SAndroid Build Coastguard Worker			name:        "foo",
2802*333d2b36SAndroid Build Coastguard Worker			moduleName:  "foo_override",
2803*333d2b36SAndroid Build Coastguard Worker			variantName: "android_common_foo_override",
2804*333d2b36SAndroid Build Coastguard Worker			overrides:   []string{"bar", "foo"},
2805*333d2b36SAndroid Build Coastguard Worker		},
2806*333d2b36SAndroid Build Coastguard Worker	}
2807*333d2b36SAndroid Build Coastguard Worker	for _, expected := range expectedVariants {
2808*333d2b36SAndroid Build Coastguard Worker		variant := ctx.ModuleForTests(expected.name, expected.variantName)
2809*333d2b36SAndroid Build Coastguard Worker
2810*333d2b36SAndroid Build Coastguard Worker		// Check if the overrides field values are correctly aggregated.
2811*333d2b36SAndroid Build Coastguard Worker		mod := variant.Module().(*AndroidApp)
2812*333d2b36SAndroid Build Coastguard Worker		android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2813*333d2b36SAndroid Build Coastguard Worker	}
2814*333d2b36SAndroid Build Coastguard Worker}
2815*333d2b36SAndroid Build Coastguard Worker
2816*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideAndroidAppWithPrebuilt(t *testing.T) {
2817*333d2b36SAndroid Build Coastguard Worker	result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2818*333d2b36SAndroid Build Coastguard Worker		t, `
2819*333d2b36SAndroid Build Coastguard Worker		android_app {
2820*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2821*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2822*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2823*333d2b36SAndroid Build Coastguard Worker		}
2824*333d2b36SAndroid Build Coastguard Worker
2825*333d2b36SAndroid Build Coastguard Worker		override_android_app {
2826*333d2b36SAndroid Build Coastguard Worker			name: "bar",
2827*333d2b36SAndroid Build Coastguard Worker			base: "foo",
2828*333d2b36SAndroid Build Coastguard Worker		}
2829*333d2b36SAndroid Build Coastguard Worker
2830*333d2b36SAndroid Build Coastguard Worker		android_app_import {
2831*333d2b36SAndroid Build Coastguard Worker			name: "bar",
2832*333d2b36SAndroid Build Coastguard Worker			prefer: true,
2833*333d2b36SAndroid Build Coastguard Worker			apk: "bar.apk",
2834*333d2b36SAndroid Build Coastguard Worker			presigned: true,
2835*333d2b36SAndroid Build Coastguard Worker		}
2836*333d2b36SAndroid Build Coastguard Worker		`)
2837*333d2b36SAndroid Build Coastguard Worker
2838*333d2b36SAndroid Build Coastguard Worker	// An app that has an override that also has a prebuilt should not be hidden.
2839*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("foo", "android_common")
2840*333d2b36SAndroid Build Coastguard Worker	if foo.Module().IsHideFromMake() {
2841*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected foo to have HideFromMake false")
2842*333d2b36SAndroid Build Coastguard Worker	}
2843*333d2b36SAndroid Build Coastguard Worker
2844*333d2b36SAndroid Build Coastguard Worker	// An override that also has a prebuilt should be hidden.
2845*333d2b36SAndroid Build Coastguard Worker	barOverride := result.ModuleForTests("foo", "android_common_bar")
2846*333d2b36SAndroid Build Coastguard Worker	if !barOverride.Module().IsHideFromMake() {
2847*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected bar override variant of foo to have HideFromMake true")
2848*333d2b36SAndroid Build Coastguard Worker	}
2849*333d2b36SAndroid Build Coastguard Worker}
2850*333d2b36SAndroid Build Coastguard Worker
2851*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideAndroidAppStem(t *testing.T) {
2852*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
2853*333d2b36SAndroid Build Coastguard Worker		android_app {
2854*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2855*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2856*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2857*333d2b36SAndroid Build Coastguard Worker		}
2858*333d2b36SAndroid Build Coastguard Worker		override_android_app {
2859*333d2b36SAndroid Build Coastguard Worker			name: "bar",
2860*333d2b36SAndroid Build Coastguard Worker			base: "foo",
2861*333d2b36SAndroid Build Coastguard Worker		}
2862*333d2b36SAndroid Build Coastguard Worker		override_android_app {
2863*333d2b36SAndroid Build Coastguard Worker			name: "baz",
2864*333d2b36SAndroid Build Coastguard Worker			base: "foo",
2865*333d2b36SAndroid Build Coastguard Worker			stem: "baz_stem",
2866*333d2b36SAndroid Build Coastguard Worker		}
2867*333d2b36SAndroid Build Coastguard Worker		android_app {
2868*333d2b36SAndroid Build Coastguard Worker			name: "foo2",
2869*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2870*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2871*333d2b36SAndroid Build Coastguard Worker			stem: "foo2_stem",
2872*333d2b36SAndroid Build Coastguard Worker		}
2873*333d2b36SAndroid Build Coastguard Worker		override_android_app {
2874*333d2b36SAndroid Build Coastguard Worker			name: "bar2",
2875*333d2b36SAndroid Build Coastguard Worker			base: "foo2",
2876*333d2b36SAndroid Build Coastguard Worker		}
2877*333d2b36SAndroid Build Coastguard Worker		override_android_app {
2878*333d2b36SAndroid Build Coastguard Worker			name: "baz2",
2879*333d2b36SAndroid Build Coastguard Worker			base: "foo2",
2880*333d2b36SAndroid Build Coastguard Worker			stem: "baz2_stem",
2881*333d2b36SAndroid Build Coastguard Worker		}
2882*333d2b36SAndroid Build Coastguard Worker	`)
2883*333d2b36SAndroid Build Coastguard Worker	for _, expected := range []struct {
2884*333d2b36SAndroid Build Coastguard Worker		moduleName  string
2885*333d2b36SAndroid Build Coastguard Worker		variantName string
2886*333d2b36SAndroid Build Coastguard Worker		apkPath     string
2887*333d2b36SAndroid Build Coastguard Worker	}{
2888*333d2b36SAndroid Build Coastguard Worker		{
2889*333d2b36SAndroid Build Coastguard Worker			moduleName:  "foo",
2890*333d2b36SAndroid Build Coastguard Worker			variantName: "android_common",
2891*333d2b36SAndroid Build Coastguard Worker			apkPath:     "out/soong/target/product/test_device/system/app/foo/foo.apk",
2892*333d2b36SAndroid Build Coastguard Worker		},
2893*333d2b36SAndroid Build Coastguard Worker		{
2894*333d2b36SAndroid Build Coastguard Worker			moduleName:  "foo",
2895*333d2b36SAndroid Build Coastguard Worker			variantName: "android_common_bar",
2896*333d2b36SAndroid Build Coastguard Worker			apkPath:     "out/soong/target/product/test_device/system/app/bar/bar.apk",
2897*333d2b36SAndroid Build Coastguard Worker		},
2898*333d2b36SAndroid Build Coastguard Worker		{
2899*333d2b36SAndroid Build Coastguard Worker			moduleName:  "foo",
2900*333d2b36SAndroid Build Coastguard Worker			variantName: "android_common_baz",
2901*333d2b36SAndroid Build Coastguard Worker			apkPath:     "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk",
2902*333d2b36SAndroid Build Coastguard Worker		},
2903*333d2b36SAndroid Build Coastguard Worker		{
2904*333d2b36SAndroid Build Coastguard Worker			moduleName:  "foo2",
2905*333d2b36SAndroid Build Coastguard Worker			variantName: "android_common",
2906*333d2b36SAndroid Build Coastguard Worker			apkPath:     "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2907*333d2b36SAndroid Build Coastguard Worker		},
2908*333d2b36SAndroid Build Coastguard Worker		{
2909*333d2b36SAndroid Build Coastguard Worker			moduleName:  "foo2",
2910*333d2b36SAndroid Build Coastguard Worker			variantName: "android_common_bar2",
2911*333d2b36SAndroid Build Coastguard Worker			// Note that this may cause the duplicate output error.
2912*333d2b36SAndroid Build Coastguard Worker			apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2913*333d2b36SAndroid Build Coastguard Worker		},
2914*333d2b36SAndroid Build Coastguard Worker		{
2915*333d2b36SAndroid Build Coastguard Worker			moduleName:  "foo2",
2916*333d2b36SAndroid Build Coastguard Worker			variantName: "android_common_baz2",
2917*333d2b36SAndroid Build Coastguard Worker			apkPath:     "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
2918*333d2b36SAndroid Build Coastguard Worker		},
2919*333d2b36SAndroid Build Coastguard Worker	} {
2920*333d2b36SAndroid Build Coastguard Worker		variant := ctx.ModuleForTests(expected.moduleName, expected.variantName)
2921*333d2b36SAndroid Build Coastguard Worker		variant.Output(expected.apkPath)
2922*333d2b36SAndroid Build Coastguard Worker	}
2923*333d2b36SAndroid Build Coastguard Worker}
2924*333d2b36SAndroid Build Coastguard Worker
2925*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideAndroidAppDependency(t *testing.T) {
2926*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
2927*333d2b36SAndroid Build Coastguard Worker		android_app {
2928*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2929*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2930*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2931*333d2b36SAndroid Build Coastguard Worker		}
2932*333d2b36SAndroid Build Coastguard Worker
2933*333d2b36SAndroid Build Coastguard Worker		override_android_app {
2934*333d2b36SAndroid Build Coastguard Worker			name: "bar",
2935*333d2b36SAndroid Build Coastguard Worker			base: "foo",
2936*333d2b36SAndroid Build Coastguard Worker			package_name: "org.dandroid.bp",
2937*333d2b36SAndroid Build Coastguard Worker		}
2938*333d2b36SAndroid Build Coastguard Worker
2939*333d2b36SAndroid Build Coastguard Worker		android_test {
2940*333d2b36SAndroid Build Coastguard Worker			name: "baz",
2941*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
2942*333d2b36SAndroid Build Coastguard Worker			instrumentation_for: "foo",
2943*333d2b36SAndroid Build Coastguard Worker		}
2944*333d2b36SAndroid Build Coastguard Worker
2945*333d2b36SAndroid Build Coastguard Worker		android_test {
2946*333d2b36SAndroid Build Coastguard Worker			name: "qux",
2947*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
2948*333d2b36SAndroid Build Coastguard Worker			instrumentation_for: "bar",
2949*333d2b36SAndroid Build Coastguard Worker		}
2950*333d2b36SAndroid Build Coastguard Worker		`)
2951*333d2b36SAndroid Build Coastguard Worker
2952*333d2b36SAndroid Build Coastguard Worker	// Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
2953*333d2b36SAndroid Build Coastguard Worker	javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
2954*333d2b36SAndroid Build Coastguard Worker	fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
2955*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2956*333d2b36SAndroid Build Coastguard Worker		t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2957*333d2b36SAndroid Build Coastguard Worker	}
2958*333d2b36SAndroid Build Coastguard Worker
2959*333d2b36SAndroid Build Coastguard Worker	// Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
2960*333d2b36SAndroid Build Coastguard Worker	javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
2961*333d2b36SAndroid Build Coastguard Worker	barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
2962*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(javac.Args["classpath"], barTurbine) {
2963*333d2b36SAndroid Build Coastguard Worker		t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2964*333d2b36SAndroid Build Coastguard Worker	}
2965*333d2b36SAndroid Build Coastguard Worker}
2966*333d2b36SAndroid Build Coastguard Worker
2967*333d2b36SAndroid Build Coastguard Workerfunc TestOverrideAndroidTest(t *testing.T) {
2968*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
2969*333d2b36SAndroid Build Coastguard Worker		android_app {
2970*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2971*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2972*333d2b36SAndroid Build Coastguard Worker			package_name: "com.android.foo",
2973*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
2974*333d2b36SAndroid Build Coastguard Worker		}
2975*333d2b36SAndroid Build Coastguard Worker
2976*333d2b36SAndroid Build Coastguard Worker		override_android_app {
2977*333d2b36SAndroid Build Coastguard Worker			name: "bar",
2978*333d2b36SAndroid Build Coastguard Worker			base: "foo",
2979*333d2b36SAndroid Build Coastguard Worker			package_name: "com.android.bar",
2980*333d2b36SAndroid Build Coastguard Worker		}
2981*333d2b36SAndroid Build Coastguard Worker
2982*333d2b36SAndroid Build Coastguard Worker		android_test {
2983*333d2b36SAndroid Build Coastguard Worker			name: "foo_test",
2984*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
2985*333d2b36SAndroid Build Coastguard Worker			instrumentation_for: "foo",
2986*333d2b36SAndroid Build Coastguard Worker		}
2987*333d2b36SAndroid Build Coastguard Worker
2988*333d2b36SAndroid Build Coastguard Worker		override_android_test {
2989*333d2b36SAndroid Build Coastguard Worker			name: "bar_test",
2990*333d2b36SAndroid Build Coastguard Worker			base: "foo_test",
2991*333d2b36SAndroid Build Coastguard Worker			package_name: "com.android.bar.test",
2992*333d2b36SAndroid Build Coastguard Worker			instrumentation_for: "bar",
2993*333d2b36SAndroid Build Coastguard Worker			instrumentation_target_package: "com.android.bar",
2994*333d2b36SAndroid Build Coastguard Worker		}
2995*333d2b36SAndroid Build Coastguard Worker		`)
2996*333d2b36SAndroid Build Coastguard Worker
2997*333d2b36SAndroid Build Coastguard Worker	expectedVariants := []struct {
2998*333d2b36SAndroid Build Coastguard Worker		moduleName        string
2999*333d2b36SAndroid Build Coastguard Worker		variantName       string
3000*333d2b36SAndroid Build Coastguard Worker		apkPath           string
3001*333d2b36SAndroid Build Coastguard Worker		overrides         []string
3002*333d2b36SAndroid Build Coastguard Worker		targetVariant     string
3003*333d2b36SAndroid Build Coastguard Worker		packageFlag       string
3004*333d2b36SAndroid Build Coastguard Worker		targetPackageFlag string
3005*333d2b36SAndroid Build Coastguard Worker	}{
3006*333d2b36SAndroid Build Coastguard Worker		{
3007*333d2b36SAndroid Build Coastguard Worker			variantName:       "android_common",
3008*333d2b36SAndroid Build Coastguard Worker			apkPath:           "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
3009*333d2b36SAndroid Build Coastguard Worker			overrides:         nil,
3010*333d2b36SAndroid Build Coastguard Worker			targetVariant:     "android_common",
3011*333d2b36SAndroid Build Coastguard Worker			packageFlag:       "",
3012*333d2b36SAndroid Build Coastguard Worker			targetPackageFlag: "",
3013*333d2b36SAndroid Build Coastguard Worker		},
3014*333d2b36SAndroid Build Coastguard Worker		{
3015*333d2b36SAndroid Build Coastguard Worker			variantName:       "android_common_bar_test",
3016*333d2b36SAndroid Build Coastguard Worker			apkPath:           "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
3017*333d2b36SAndroid Build Coastguard Worker			overrides:         []string{"foo_test"},
3018*333d2b36SAndroid Build Coastguard Worker			targetVariant:     "android_common_bar",
3019*333d2b36SAndroid Build Coastguard Worker			packageFlag:       "com.android.bar.test",
3020*333d2b36SAndroid Build Coastguard Worker			targetPackageFlag: "com.android.bar",
3021*333d2b36SAndroid Build Coastguard Worker		},
3022*333d2b36SAndroid Build Coastguard Worker	}
3023*333d2b36SAndroid Build Coastguard Worker	for _, expected := range expectedVariants {
3024*333d2b36SAndroid Build Coastguard Worker		variant := ctx.ModuleForTests("foo_test", expected.variantName)
3025*333d2b36SAndroid Build Coastguard Worker
3026*333d2b36SAndroid Build Coastguard Worker		// Check the final apk name
3027*333d2b36SAndroid Build Coastguard Worker		variant.Output("out/soong" + expected.apkPath)
3028*333d2b36SAndroid Build Coastguard Worker
3029*333d2b36SAndroid Build Coastguard Worker		// Check if the overrides field values are correctly aggregated.
3030*333d2b36SAndroid Build Coastguard Worker		mod := variant.Module().(*AndroidTest)
3031*333d2b36SAndroid Build Coastguard Worker		if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
3032*333d2b36SAndroid Build Coastguard Worker			t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
3033*333d2b36SAndroid Build Coastguard Worker				expected.overrides, mod.overridableAppProperties.Overrides)
3034*333d2b36SAndroid Build Coastguard Worker		}
3035*333d2b36SAndroid Build Coastguard Worker
3036*333d2b36SAndroid Build Coastguard Worker		// Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
3037*333d2b36SAndroid Build Coastguard Worker		javac := variant.Rule("javac")
3038*333d2b36SAndroid Build Coastguard Worker		turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
3039*333d2b36SAndroid Build Coastguard Worker		if !strings.Contains(javac.Args["classpath"], turbine) {
3040*333d2b36SAndroid Build Coastguard Worker			t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
3041*333d2b36SAndroid Build Coastguard Worker		}
3042*333d2b36SAndroid Build Coastguard Worker
3043*333d2b36SAndroid Build Coastguard Worker		// Check aapt2 flags.
3044*333d2b36SAndroid Build Coastguard Worker		res := variant.Output("package-res.apk")
3045*333d2b36SAndroid Build Coastguard Worker		aapt2Flags := res.Args["flags"]
3046*333d2b36SAndroid Build Coastguard Worker		checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
3047*333d2b36SAndroid Build Coastguard Worker		checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
3048*333d2b36SAndroid Build Coastguard Worker		checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
3049*333d2b36SAndroid Build Coastguard Worker	}
3050*333d2b36SAndroid Build Coastguard Worker}
3051*333d2b36SAndroid Build Coastguard Worker
3052*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidTest_FixTestConfig(t *testing.T) {
3053*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
3054*333d2b36SAndroid Build Coastguard Worker		android_app {
3055*333d2b36SAndroid Build Coastguard Worker			name: "foo",
3056*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3057*333d2b36SAndroid Build Coastguard Worker			package_name: "com.android.foo",
3058*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3059*333d2b36SAndroid Build Coastguard Worker		}
3060*333d2b36SAndroid Build Coastguard Worker
3061*333d2b36SAndroid Build Coastguard Worker		android_test {
3062*333d2b36SAndroid Build Coastguard Worker			name: "foo_test",
3063*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
3064*333d2b36SAndroid Build Coastguard Worker			instrumentation_for: "foo",
3065*333d2b36SAndroid Build Coastguard Worker		}
3066*333d2b36SAndroid Build Coastguard Worker
3067*333d2b36SAndroid Build Coastguard Worker		android_test {
3068*333d2b36SAndroid Build Coastguard Worker			name: "bar_test",
3069*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
3070*333d2b36SAndroid Build Coastguard Worker			package_name: "com.android.bar.test",
3071*333d2b36SAndroid Build Coastguard Worker			instrumentation_for: "foo",
3072*333d2b36SAndroid Build Coastguard Worker			mainline_package_name: "com.android.bar",
3073*333d2b36SAndroid Build Coastguard Worker		}
3074*333d2b36SAndroid Build Coastguard Worker
3075*333d2b36SAndroid Build Coastguard Worker		override_android_test {
3076*333d2b36SAndroid Build Coastguard Worker			name: "baz_test",
3077*333d2b36SAndroid Build Coastguard Worker			base: "foo_test",
3078*333d2b36SAndroid Build Coastguard Worker			package_name: "com.android.baz.test",
3079*333d2b36SAndroid Build Coastguard Worker			mainline_package_name: "com.android.baz",
3080*333d2b36SAndroid Build Coastguard Worker		}
3081*333d2b36SAndroid Build Coastguard Worker		`)
3082*333d2b36SAndroid Build Coastguard Worker
3083*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
3084*333d2b36SAndroid Build Coastguard Worker		moduleName    string
3085*333d2b36SAndroid Build Coastguard Worker		variantName   string
3086*333d2b36SAndroid Build Coastguard Worker		expectedFlags []string
3087*333d2b36SAndroid Build Coastguard Worker	}{
3088*333d2b36SAndroid Build Coastguard Worker		{
3089*333d2b36SAndroid Build Coastguard Worker			moduleName:  "foo_test",
3090*333d2b36SAndroid Build Coastguard Worker			variantName: "android_common",
3091*333d2b36SAndroid Build Coastguard Worker		},
3092*333d2b36SAndroid Build Coastguard Worker		{
3093*333d2b36SAndroid Build Coastguard Worker			moduleName:  "bar_test",
3094*333d2b36SAndroid Build Coastguard Worker			variantName: "android_common",
3095*333d2b36SAndroid Build Coastguard Worker			expectedFlags: []string{
3096*333d2b36SAndroid Build Coastguard Worker				"--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
3097*333d2b36SAndroid Build Coastguard Worker				"--package-name com.android.bar.test",
3098*333d2b36SAndroid Build Coastguard Worker				"--mainline-package-name com.android.bar",
3099*333d2b36SAndroid Build Coastguard Worker			},
3100*333d2b36SAndroid Build Coastguard Worker		},
3101*333d2b36SAndroid Build Coastguard Worker		{
3102*333d2b36SAndroid Build Coastguard Worker			moduleName:  "foo_test",
3103*333d2b36SAndroid Build Coastguard Worker			variantName: "android_common_baz_test",
3104*333d2b36SAndroid Build Coastguard Worker			expectedFlags: []string{
3105*333d2b36SAndroid Build Coastguard Worker				"--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
3106*333d2b36SAndroid Build Coastguard Worker				"--package-name com.android.baz.test",
3107*333d2b36SAndroid Build Coastguard Worker				"--test-file-name baz_test.apk",
3108*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/foo_test/android_common_baz_test/test_config_fixer/AndroidTest.xml",
3109*333d2b36SAndroid Build Coastguard Worker				"--mainline-package-name com.android.baz",
3110*333d2b36SAndroid Build Coastguard Worker			},
3111*333d2b36SAndroid Build Coastguard Worker		},
3112*333d2b36SAndroid Build Coastguard Worker	}
3113*333d2b36SAndroid Build Coastguard Worker
3114*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
3115*333d2b36SAndroid Build Coastguard Worker		variant := ctx.ModuleForTests(test.moduleName, test.variantName)
3116*333d2b36SAndroid Build Coastguard Worker		params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
3117*333d2b36SAndroid Build Coastguard Worker
3118*333d2b36SAndroid Build Coastguard Worker		if len(test.expectedFlags) > 0 {
3119*333d2b36SAndroid Build Coastguard Worker			if params.Rule == nil {
3120*333d2b36SAndroid Build Coastguard Worker				t.Errorf("test_config_fixer was expected to run, but didn't")
3121*333d2b36SAndroid Build Coastguard Worker			} else {
3122*333d2b36SAndroid Build Coastguard Worker				for _, flag := range test.expectedFlags {
3123*333d2b36SAndroid Build Coastguard Worker					if !strings.Contains(params.RuleParams.Command, flag) {
3124*333d2b36SAndroid Build Coastguard Worker						t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
3125*333d2b36SAndroid Build Coastguard Worker					}
3126*333d2b36SAndroid Build Coastguard Worker				}
3127*333d2b36SAndroid Build Coastguard Worker			}
3128*333d2b36SAndroid Build Coastguard Worker		} else {
3129*333d2b36SAndroid Build Coastguard Worker			if params.Rule != nil {
3130*333d2b36SAndroid Build Coastguard Worker				t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
3131*333d2b36SAndroid Build Coastguard Worker			}
3132*333d2b36SAndroid Build Coastguard Worker		}
3133*333d2b36SAndroid Build Coastguard Worker	}
3134*333d2b36SAndroid Build Coastguard Worker}
3135*333d2b36SAndroid Build Coastguard Worker
3136*333d2b36SAndroid Build Coastguard Workerfunc TestInstrumentationTargetPrebuilt(t *testing.T) {
3137*333d2b36SAndroid Build Coastguard Worker	bp := `
3138*333d2b36SAndroid Build Coastguard Worker		android_app_import {
3139*333d2b36SAndroid Build Coastguard Worker			name: "foo",
3140*333d2b36SAndroid Build Coastguard Worker			apk: "foo.apk",
3141*333d2b36SAndroid Build Coastguard Worker			presigned: true,
3142*333d2b36SAndroid Build Coastguard Worker		}
3143*333d2b36SAndroid Build Coastguard Worker
3144*333d2b36SAndroid Build Coastguard Worker		android_test {
3145*333d2b36SAndroid Build Coastguard Worker			name: "bar",
3146*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3147*333d2b36SAndroid Build Coastguard Worker			instrumentation_for: "foo",
3148*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3149*333d2b36SAndroid Build Coastguard Worker		}
3150*333d2b36SAndroid Build Coastguard Worker		`
3151*333d2b36SAndroid Build Coastguard Worker
3152*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
3153*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
3154*333d2b36SAndroid Build Coastguard Worker	).ExtendWithErrorHandler(
3155*333d2b36SAndroid Build Coastguard Worker		android.FixtureExpectsAtLeastOneErrorMatchingPattern(
3156*333d2b36SAndroid Build Coastguard Worker			"instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
3157*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, bp)
3158*333d2b36SAndroid Build Coastguard Worker}
3159*333d2b36SAndroid Build Coastguard Worker
3160*333d2b36SAndroid Build Coastguard Workerfunc TestStl(t *testing.T) {
3161*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
3162*333d2b36SAndroid Build Coastguard Worker		cc_library {
3163*333d2b36SAndroid Build Coastguard Worker			name: "libjni",
3164*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3165*333d2b36SAndroid Build Coastguard Worker			stl: "c++_shared",
3166*333d2b36SAndroid Build Coastguard Worker		}
3167*333d2b36SAndroid Build Coastguard Worker
3168*333d2b36SAndroid Build Coastguard Worker		android_test {
3169*333d2b36SAndroid Build Coastguard Worker			name: "stl",
3170*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
3171*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
3172*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3173*333d2b36SAndroid Build Coastguard Worker			stl: "c++_shared",
3174*333d2b36SAndroid Build Coastguard Worker		}
3175*333d2b36SAndroid Build Coastguard Worker
3176*333d2b36SAndroid Build Coastguard Worker		android_test {
3177*333d2b36SAndroid Build Coastguard Worker			name: "system",
3178*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
3179*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
3180*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3181*333d2b36SAndroid Build Coastguard Worker		}
3182*333d2b36SAndroid Build Coastguard Worker		`)
3183*333d2b36SAndroid Build Coastguard Worker
3184*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
3185*333d2b36SAndroid Build Coastguard Worker		name string
3186*333d2b36SAndroid Build Coastguard Worker		jnis []string
3187*333d2b36SAndroid Build Coastguard Worker	}{
3188*333d2b36SAndroid Build Coastguard Worker		{"stl",
3189*333d2b36SAndroid Build Coastguard Worker			[]string{
3190*333d2b36SAndroid Build Coastguard Worker				"libjni.so",
3191*333d2b36SAndroid Build Coastguard Worker				"libc++_shared.so",
3192*333d2b36SAndroid Build Coastguard Worker			},
3193*333d2b36SAndroid Build Coastguard Worker		},
3194*333d2b36SAndroid Build Coastguard Worker		{"system",
3195*333d2b36SAndroid Build Coastguard Worker			[]string{
3196*333d2b36SAndroid Build Coastguard Worker				"libjni.so",
3197*333d2b36SAndroid Build Coastguard Worker			},
3198*333d2b36SAndroid Build Coastguard Worker		},
3199*333d2b36SAndroid Build Coastguard Worker	}
3200*333d2b36SAndroid Build Coastguard Worker
3201*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
3202*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
3203*333d2b36SAndroid Build Coastguard Worker			app := ctx.ModuleForTests(test.name, "android_common")
3204*333d2b36SAndroid Build Coastguard Worker			jniLibZip := app.Output("jnilibs.zip")
3205*333d2b36SAndroid Build Coastguard Worker			var jnis []string
3206*333d2b36SAndroid Build Coastguard Worker			args := strings.Fields(jniLibZip.Args["jarArgs"])
3207*333d2b36SAndroid Build Coastguard Worker			for i := 0; i < len(args); i++ {
3208*333d2b36SAndroid Build Coastguard Worker				if args[i] == "-f" {
3209*333d2b36SAndroid Build Coastguard Worker					jnis = append(jnis, args[i+1])
3210*333d2b36SAndroid Build Coastguard Worker					i += 1
3211*333d2b36SAndroid Build Coastguard Worker				}
3212*333d2b36SAndroid Build Coastguard Worker			}
3213*333d2b36SAndroid Build Coastguard Worker			jnisJoined := strings.Join(jnis, " ")
3214*333d2b36SAndroid Build Coastguard Worker			for _, jni := range test.jnis {
3215*333d2b36SAndroid Build Coastguard Worker				if !strings.Contains(jnisJoined, jni) {
3216*333d2b36SAndroid Build Coastguard Worker					t.Errorf("missing jni %q in %q", jni, jnis)
3217*333d2b36SAndroid Build Coastguard Worker				}
3218*333d2b36SAndroid Build Coastguard Worker			}
3219*333d2b36SAndroid Build Coastguard Worker		})
3220*333d2b36SAndroid Build Coastguard Worker	}
3221*333d2b36SAndroid Build Coastguard Worker}
3222*333d2b36SAndroid Build Coastguard Worker
3223*333d2b36SAndroid Build Coastguard Workerfunc TestUsesLibraries(t *testing.T) {
3224*333d2b36SAndroid Build Coastguard Worker	bp := `
3225*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
3226*333d2b36SAndroid Build Coastguard Worker			name: "foo",
3227*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3228*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
3229*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3230*333d2b36SAndroid Build Coastguard Worker		}
3231*333d2b36SAndroid Build Coastguard Worker
3232*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
3233*333d2b36SAndroid Build Coastguard Worker			name: "qux",
3234*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3235*333d2b36SAndroid Build Coastguard Worker			api_packages: ["qux"],
3236*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3237*333d2b36SAndroid Build Coastguard Worker		}
3238*333d2b36SAndroid Build Coastguard Worker
3239*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
3240*333d2b36SAndroid Build Coastguard Worker			name: "quuz",
3241*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3242*333d2b36SAndroid Build Coastguard Worker			api_packages: ["quuz"],
3243*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3244*333d2b36SAndroid Build Coastguard Worker		}
3245*333d2b36SAndroid Build Coastguard Worker
3246*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
3247*333d2b36SAndroid Build Coastguard Worker			name: "fred",
3248*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3249*333d2b36SAndroid Build Coastguard Worker			api_packages: ["fred"],
3250*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3251*333d2b36SAndroid Build Coastguard Worker		}
3252*333d2b36SAndroid Build Coastguard Worker
3253*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
3254*333d2b36SAndroid Build Coastguard Worker			name: "bar",
3255*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3256*333d2b36SAndroid Build Coastguard Worker			api_packages: ["bar"],
3257*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3258*333d2b36SAndroid Build Coastguard Worker		}
3259*333d2b36SAndroid Build Coastguard Worker
3260*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
3261*333d2b36SAndroid Build Coastguard Worker			name: "runtime-library",
3262*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3263*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3264*333d2b36SAndroid Build Coastguard Worker		}
3265*333d2b36SAndroid Build Coastguard Worker
3266*333d2b36SAndroid Build Coastguard Worker		java_library {
3267*333d2b36SAndroid Build Coastguard Worker			name: "static-runtime-helper",
3268*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3269*333d2b36SAndroid Build Coastguard Worker			libs: ["runtime-library.impl"],
3270*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3271*333d2b36SAndroid Build Coastguard Worker		}
3272*333d2b36SAndroid Build Coastguard Worker
3273*333d2b36SAndroid Build Coastguard Worker		java_library {
3274*333d2b36SAndroid Build Coastguard Worker			name: "runtime-required-x",
3275*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3276*333d2b36SAndroid Build Coastguard Worker			installable: true,
3277*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3278*333d2b36SAndroid Build Coastguard Worker		}
3279*333d2b36SAndroid Build Coastguard Worker
3280*333d2b36SAndroid Build Coastguard Worker		java_library {
3281*333d2b36SAndroid Build Coastguard Worker			name: "runtime-optional-x",
3282*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3283*333d2b36SAndroid Build Coastguard Worker			installable: true,
3284*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3285*333d2b36SAndroid Build Coastguard Worker		}
3286*333d2b36SAndroid Build Coastguard Worker
3287*333d2b36SAndroid Build Coastguard Worker		android_library {
3288*333d2b36SAndroid Build Coastguard Worker			name: "static-x",
3289*333d2b36SAndroid Build Coastguard Worker			uses_libs: ["runtime-required-x"],
3290*333d2b36SAndroid Build Coastguard Worker			optional_uses_libs: ["runtime-optional-x"],
3291*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3292*333d2b36SAndroid Build Coastguard Worker		}
3293*333d2b36SAndroid Build Coastguard Worker
3294*333d2b36SAndroid Build Coastguard Worker		java_library {
3295*333d2b36SAndroid Build Coastguard Worker			name: "runtime-required-y",
3296*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3297*333d2b36SAndroid Build Coastguard Worker			installable: true,
3298*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3299*333d2b36SAndroid Build Coastguard Worker		}
3300*333d2b36SAndroid Build Coastguard Worker
3301*333d2b36SAndroid Build Coastguard Worker		java_library {
3302*333d2b36SAndroid Build Coastguard Worker			name: "runtime-optional-y",
3303*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3304*333d2b36SAndroid Build Coastguard Worker			installable: true,
3305*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3306*333d2b36SAndroid Build Coastguard Worker		}
3307*333d2b36SAndroid Build Coastguard Worker
3308*333d2b36SAndroid Build Coastguard Worker		java_library {
3309*333d2b36SAndroid Build Coastguard Worker			name: "static-y",
3310*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3311*333d2b36SAndroid Build Coastguard Worker			uses_libs: ["runtime-required-y"],
3312*333d2b36SAndroid Build Coastguard Worker			optional_uses_libs: [
3313*333d2b36SAndroid Build Coastguard Worker				"runtime-optional-y",
3314*333d2b36SAndroid Build Coastguard Worker				"missing-lib-a",
3315*333d2b36SAndroid Build Coastguard Worker			],
3316*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3317*333d2b36SAndroid Build Coastguard Worker		}
3318*333d2b36SAndroid Build Coastguard Worker
3319*333d2b36SAndroid Build Coastguard Worker		// A library that has to use "provides_uses_lib", because:
3320*333d2b36SAndroid Build Coastguard Worker		//    - it is not an SDK library
3321*333d2b36SAndroid Build Coastguard Worker		//    - its library name is different from its module name
3322*333d2b36SAndroid Build Coastguard Worker		java_library {
3323*333d2b36SAndroid Build Coastguard Worker			name: "non-sdk-lib",
3324*333d2b36SAndroid Build Coastguard Worker			provides_uses_lib: "com.non.sdk.lib",
3325*333d2b36SAndroid Build Coastguard Worker			installable: true,
3326*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3327*333d2b36SAndroid Build Coastguard Worker		}
3328*333d2b36SAndroid Build Coastguard Worker
3329*333d2b36SAndroid Build Coastguard Worker		android_app {
3330*333d2b36SAndroid Build Coastguard Worker			name: "app",
3331*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3332*333d2b36SAndroid Build Coastguard Worker			libs: [
3333*333d2b36SAndroid Build Coastguard Worker				"qux.impl",
3334*333d2b36SAndroid Build Coastguard Worker				"quuz.stubs"
3335*333d2b36SAndroid Build Coastguard Worker			],
3336*333d2b36SAndroid Build Coastguard Worker			static_libs: [
3337*333d2b36SAndroid Build Coastguard Worker				"static-runtime-helper",
3338*333d2b36SAndroid Build Coastguard Worker				// statically linked component libraries should not pull their SDK libraries,
3339*333d2b36SAndroid Build Coastguard Worker				// so "fred" should not be added to class loader context
3340*333d2b36SAndroid Build Coastguard Worker				"fred.stubs",
3341*333d2b36SAndroid Build Coastguard Worker				"static-x",
3342*333d2b36SAndroid Build Coastguard Worker				"static-y",
3343*333d2b36SAndroid Build Coastguard Worker			],
3344*333d2b36SAndroid Build Coastguard Worker			uses_libs: [
3345*333d2b36SAndroid Build Coastguard Worker				"foo",
3346*333d2b36SAndroid Build Coastguard Worker				"non-sdk-lib"
3347*333d2b36SAndroid Build Coastguard Worker			],
3348*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3349*333d2b36SAndroid Build Coastguard Worker			optional_uses_libs: [
3350*333d2b36SAndroid Build Coastguard Worker				"bar",
3351*333d2b36SAndroid Build Coastguard Worker				"missing-lib-b",
3352*333d2b36SAndroid Build Coastguard Worker			],
3353*333d2b36SAndroid Build Coastguard Worker		}
3354*333d2b36SAndroid Build Coastguard Worker
3355*333d2b36SAndroid Build Coastguard Worker		android_app_import {
3356*333d2b36SAndroid Build Coastguard Worker			name: "prebuilt",
3357*333d2b36SAndroid Build Coastguard Worker			apk: "prebuilts/apk/app.apk",
3358*333d2b36SAndroid Build Coastguard Worker			certificate: "platform",
3359*333d2b36SAndroid Build Coastguard Worker			uses_libs: [
3360*333d2b36SAndroid Build Coastguard Worker				"foo",
3361*333d2b36SAndroid Build Coastguard Worker				"non-sdk-lib",
3362*333d2b36SAndroid Build Coastguard Worker				"android.test.runner"
3363*333d2b36SAndroid Build Coastguard Worker			],
3364*333d2b36SAndroid Build Coastguard Worker			optional_uses_libs: [
3365*333d2b36SAndroid Build Coastguard Worker				"bar",
3366*333d2b36SAndroid Build Coastguard Worker				"missing-lib-b",
3367*333d2b36SAndroid Build Coastguard Worker			],
3368*333d2b36SAndroid Build Coastguard Worker		}
3369*333d2b36SAndroid Build Coastguard Worker	`
3370*333d2b36SAndroid Build Coastguard Worker
3371*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
3372*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
3373*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
3374*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
3375*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3376*333d2b36SAndroid Build Coastguard Worker			variables.BuildWarningBadOptionalUsesLibsAllowlist = []string{"app", "prebuilt"}
3377*333d2b36SAndroid Build Coastguard Worker		}),
3378*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
3379*333d2b36SAndroid Build Coastguard Worker
3380*333d2b36SAndroid Build Coastguard Worker	app := result.ModuleForTests("app", "android_common")
3381*333d2b36SAndroid Build Coastguard Worker	prebuilt := result.ModuleForTests("prebuilt", "android_common")
3382*333d2b36SAndroid Build Coastguard Worker
3383*333d2b36SAndroid Build Coastguard Worker	// Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
3384*333d2b36SAndroid Build Coastguard Worker	// These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be
3385*333d2b36SAndroid Build Coastguard Worker	// propagated from dependencies.
3386*333d2b36SAndroid Build Coastguard Worker	actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3387*333d2b36SAndroid Build Coastguard Worker	expectManifestFixerArgs := `--extract-native-libs=true ` +
3388*333d2b36SAndroid Build Coastguard Worker		`--uses-library foo ` +
3389*333d2b36SAndroid Build Coastguard Worker		`--uses-library com.non.sdk.lib ` +
3390*333d2b36SAndroid Build Coastguard Worker		`--uses-library qux ` +
3391*333d2b36SAndroid Build Coastguard Worker		`--uses-library quuz ` +
3392*333d2b36SAndroid Build Coastguard Worker		`--uses-library runtime-library ` +
3393*333d2b36SAndroid Build Coastguard Worker		`--uses-library runtime-required-x ` +
3394*333d2b36SAndroid Build Coastguard Worker		`--uses-library runtime-required-y ` +
3395*333d2b36SAndroid Build Coastguard Worker		`--optional-uses-library bar ` +
3396*333d2b36SAndroid Build Coastguard Worker		`--optional-uses-library runtime-optional-x ` +
3397*333d2b36SAndroid Build Coastguard Worker		`--optional-uses-library runtime-optional-y`
3398*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
3399*333d2b36SAndroid Build Coastguard Worker
3400*333d2b36SAndroid Build Coastguard Worker	// Test that all libraries are verified (library order matters).
3401*333d2b36SAndroid Build Coastguard Worker	verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
3402*333d2b36SAndroid Build Coastguard Worker	verifyArgs := `--uses-library foo ` +
3403*333d2b36SAndroid Build Coastguard Worker		`--uses-library com.non.sdk.lib ` +
3404*333d2b36SAndroid Build Coastguard Worker		`--uses-library qux ` +
3405*333d2b36SAndroid Build Coastguard Worker		`--uses-library quuz ` +
3406*333d2b36SAndroid Build Coastguard Worker		`--uses-library runtime-library ` +
3407*333d2b36SAndroid Build Coastguard Worker		`--uses-library runtime-required-x ` +
3408*333d2b36SAndroid Build Coastguard Worker		`--uses-library runtime-required-y ` +
3409*333d2b36SAndroid Build Coastguard Worker		`--optional-uses-library bar ` +
3410*333d2b36SAndroid Build Coastguard Worker		`--optional-uses-library runtime-optional-x ` +
3411*333d2b36SAndroid Build Coastguard Worker		`--optional-uses-library runtime-optional-y ` +
3412*333d2b36SAndroid Build Coastguard Worker		`--missing-optional-uses-library missing-lib-b ` +
3413*333d2b36SAndroid Build Coastguard Worker		`--missing-optional-uses-library missing-lib-a`
3414*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
3415*333d2b36SAndroid Build Coastguard Worker
3416*333d2b36SAndroid Build Coastguard Worker	// Test that all libraries are verified for an APK (library order matters).
3417*333d2b36SAndroid Build Coastguard Worker	verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
3418*333d2b36SAndroid Build Coastguard Worker	verifyApkArgs := `--uses-library foo ` +
3419*333d2b36SAndroid Build Coastguard Worker		`--uses-library com.non.sdk.lib ` +
3420*333d2b36SAndroid Build Coastguard Worker		`--uses-library android.test.runner ` +
3421*333d2b36SAndroid Build Coastguard Worker		`--optional-uses-library bar ` +
3422*333d2b36SAndroid Build Coastguard Worker		`--missing-optional-uses-library missing-lib-b `
3423*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
3424*333d2b36SAndroid Build Coastguard Worker
3425*333d2b36SAndroid Build Coastguard Worker	// Test that necessary args are passed for constructing CLC in Ninja phase.
3426*333d2b36SAndroid Build Coastguard Worker	cmd := app.Rule("dexpreopt").RuleParams.Command
3427*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "dexpreopt app cmd context", cmd, "--context-json=")
3428*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "dexpreopt app cmd product_packages", cmd,
3429*333d2b36SAndroid Build Coastguard Worker		"--product-packages=out/soong/.intermediates/app/android_common/dexpreopt/app/product_packages.txt")
3430*333d2b36SAndroid Build Coastguard Worker}
3431*333d2b36SAndroid Build Coastguard Worker
3432*333d2b36SAndroid Build Coastguard Workerfunc TestDexpreoptBcp(t *testing.T) {
3433*333d2b36SAndroid Build Coastguard Worker	bp := `
3434*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
3435*333d2b36SAndroid Build Coastguard Worker			name: "foo",
3436*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3437*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
3438*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3439*333d2b36SAndroid Build Coastguard Worker		}
3440*333d2b36SAndroid Build Coastguard Worker
3441*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
3442*333d2b36SAndroid Build Coastguard Worker			name: "bar",
3443*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3444*333d2b36SAndroid Build Coastguard Worker			api_packages: ["bar"],
3445*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["bar"],
3446*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3447*333d2b36SAndroid Build Coastguard Worker		}
3448*333d2b36SAndroid Build Coastguard Worker
3449*333d2b36SAndroid Build Coastguard Worker		android_app {
3450*333d2b36SAndroid Build Coastguard Worker			name: "app",
3451*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
3452*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3453*333d2b36SAndroid Build Coastguard Worker		}
3454*333d2b36SAndroid Build Coastguard Worker	`
3455*333d2b36SAndroid Build Coastguard Worker
3456*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
3457*333d2b36SAndroid Build Coastguard Worker		name   string
3458*333d2b36SAndroid Build Coastguard Worker		with   bool
3459*333d2b36SAndroid Build Coastguard Worker		expect string
3460*333d2b36SAndroid Build Coastguard Worker	}{
3461*333d2b36SAndroid Build Coastguard Worker		{
3462*333d2b36SAndroid Build Coastguard Worker			name:   "with updatable bcp",
3463*333d2b36SAndroid Build Coastguard Worker			with:   true,
3464*333d2b36SAndroid Build Coastguard Worker			expect: "/system/framework/foo.jar:/system/framework/bar.jar",
3465*333d2b36SAndroid Build Coastguard Worker		},
3466*333d2b36SAndroid Build Coastguard Worker		{
3467*333d2b36SAndroid Build Coastguard Worker			name:   "without updatable bcp",
3468*333d2b36SAndroid Build Coastguard Worker			with:   false,
3469*333d2b36SAndroid Build Coastguard Worker			expect: "/system/framework/foo.jar",
3470*333d2b36SAndroid Build Coastguard Worker		},
3471*333d2b36SAndroid Build Coastguard Worker	}
3472*333d2b36SAndroid Build Coastguard Worker
3473*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
3474*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
3475*333d2b36SAndroid Build Coastguard Worker			result := android.GroupFixturePreparers(
3476*333d2b36SAndroid Build Coastguard Worker				prepareForJavaTest,
3477*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithJavaSdkLibraryFiles,
3478*333d2b36SAndroid Build Coastguard Worker				FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
3479*333d2b36SAndroid Build Coastguard Worker				dexpreopt.FixtureSetBootJars("platform:foo"),
3480*333d2b36SAndroid Build Coastguard Worker				dexpreopt.FixtureSetApexBootJars("platform:bar"),
3481*333d2b36SAndroid Build Coastguard Worker				dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
3482*333d2b36SAndroid Build Coastguard Worker			).RunTestWithBp(t, bp)
3483*333d2b36SAndroid Build Coastguard Worker
3484*333d2b36SAndroid Build Coastguard Worker			app := result.ModuleForTests("app", "android_common")
3485*333d2b36SAndroid Build Coastguard Worker			cmd := app.Rule("dexpreopt").RuleParams.Command
3486*333d2b36SAndroid Build Coastguard Worker			bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
3487*333d2b36SAndroid Build Coastguard Worker			android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
3488*333d2b36SAndroid Build Coastguard Worker		})
3489*333d2b36SAndroid Build Coastguard Worker	}
3490*333d2b36SAndroid Build Coastguard Worker}
3491*333d2b36SAndroid Build Coastguard Worker
3492*333d2b36SAndroid Build Coastguard Workerfunc TestCodelessApp(t *testing.T) {
3493*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
3494*333d2b36SAndroid Build Coastguard Worker		name   string
3495*333d2b36SAndroid Build Coastguard Worker		bp     string
3496*333d2b36SAndroid Build Coastguard Worker		noCode bool
3497*333d2b36SAndroid Build Coastguard Worker	}{
3498*333d2b36SAndroid Build Coastguard Worker		{
3499*333d2b36SAndroid Build Coastguard Worker			name: "normal",
3500*333d2b36SAndroid Build Coastguard Worker			bp: `
3501*333d2b36SAndroid Build Coastguard Worker				android_app {
3502*333d2b36SAndroid Build Coastguard Worker					name: "foo",
3503*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
3504*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
3505*333d2b36SAndroid Build Coastguard Worker				}
3506*333d2b36SAndroid Build Coastguard Worker			`,
3507*333d2b36SAndroid Build Coastguard Worker			noCode: false,
3508*333d2b36SAndroid Build Coastguard Worker		},
3509*333d2b36SAndroid Build Coastguard Worker		{
3510*333d2b36SAndroid Build Coastguard Worker			name: "app without sources",
3511*333d2b36SAndroid Build Coastguard Worker			bp: `
3512*333d2b36SAndroid Build Coastguard Worker				android_app {
3513*333d2b36SAndroid Build Coastguard Worker					name: "foo",
3514*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
3515*333d2b36SAndroid Build Coastguard Worker				}
3516*333d2b36SAndroid Build Coastguard Worker			`,
3517*333d2b36SAndroid Build Coastguard Worker			noCode: true,
3518*333d2b36SAndroid Build Coastguard Worker		},
3519*333d2b36SAndroid Build Coastguard Worker		{
3520*333d2b36SAndroid Build Coastguard Worker			name: "app with libraries",
3521*333d2b36SAndroid Build Coastguard Worker			bp: `
3522*333d2b36SAndroid Build Coastguard Worker				android_app {
3523*333d2b36SAndroid Build Coastguard Worker					name: "foo",
3524*333d2b36SAndroid Build Coastguard Worker					static_libs: ["lib"],
3525*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
3526*333d2b36SAndroid Build Coastguard Worker				}
3527*333d2b36SAndroid Build Coastguard Worker
3528*333d2b36SAndroid Build Coastguard Worker				java_library {
3529*333d2b36SAndroid Build Coastguard Worker					name: "lib",
3530*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
3531*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
3532*333d2b36SAndroid Build Coastguard Worker				}
3533*333d2b36SAndroid Build Coastguard Worker			`,
3534*333d2b36SAndroid Build Coastguard Worker			noCode: false,
3535*333d2b36SAndroid Build Coastguard Worker		},
3536*333d2b36SAndroid Build Coastguard Worker		{
3537*333d2b36SAndroid Build Coastguard Worker			name: "app with sourceless libraries",
3538*333d2b36SAndroid Build Coastguard Worker			bp: `
3539*333d2b36SAndroid Build Coastguard Worker				android_app {
3540*333d2b36SAndroid Build Coastguard Worker					name: "foo",
3541*333d2b36SAndroid Build Coastguard Worker					static_libs: ["lib"],
3542*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
3543*333d2b36SAndroid Build Coastguard Worker				}
3544*333d2b36SAndroid Build Coastguard Worker
3545*333d2b36SAndroid Build Coastguard Worker				java_library {
3546*333d2b36SAndroid Build Coastguard Worker					name: "lib",
3547*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
3548*333d2b36SAndroid Build Coastguard Worker				}
3549*333d2b36SAndroid Build Coastguard Worker			`,
3550*333d2b36SAndroid Build Coastguard Worker			// TODO(jungjw): this should probably be true
3551*333d2b36SAndroid Build Coastguard Worker			noCode: false,
3552*333d2b36SAndroid Build Coastguard Worker		},
3553*333d2b36SAndroid Build Coastguard Worker	}
3554*333d2b36SAndroid Build Coastguard Worker
3555*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
3556*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
3557*333d2b36SAndroid Build Coastguard Worker			ctx := testApp(t, test.bp)
3558*333d2b36SAndroid Build Coastguard Worker
3559*333d2b36SAndroid Build Coastguard Worker			foo := ctx.ModuleForTests("foo", "android_common")
3560*333d2b36SAndroid Build Coastguard Worker			manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3561*333d2b36SAndroid Build Coastguard Worker			if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
3562*333d2b36SAndroid Build Coastguard Worker				t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
3563*333d2b36SAndroid Build Coastguard Worker			}
3564*333d2b36SAndroid Build Coastguard Worker		})
3565*333d2b36SAndroid Build Coastguard Worker	}
3566*333d2b36SAndroid Build Coastguard Worker}
3567*333d2b36SAndroid Build Coastguard Worker
3568*333d2b36SAndroid Build Coastguard Workerfunc TestUncompressDex(t *testing.T) {
3569*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
3570*333d2b36SAndroid Build Coastguard Worker		name string
3571*333d2b36SAndroid Build Coastguard Worker		bp   string
3572*333d2b36SAndroid Build Coastguard Worker
3573*333d2b36SAndroid Build Coastguard Worker		uncompressedPlatform  bool
3574*333d2b36SAndroid Build Coastguard Worker		uncompressedUnbundled bool
3575*333d2b36SAndroid Build Coastguard Worker	}{
3576*333d2b36SAndroid Build Coastguard Worker		{
3577*333d2b36SAndroid Build Coastguard Worker			name: "normal",
3578*333d2b36SAndroid Build Coastguard Worker			bp: `
3579*333d2b36SAndroid Build Coastguard Worker				android_app {
3580*333d2b36SAndroid Build Coastguard Worker					name: "foo",
3581*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
3582*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
3583*333d2b36SAndroid Build Coastguard Worker				}
3584*333d2b36SAndroid Build Coastguard Worker			`,
3585*333d2b36SAndroid Build Coastguard Worker			uncompressedPlatform:  true,
3586*333d2b36SAndroid Build Coastguard Worker			uncompressedUnbundled: false,
3587*333d2b36SAndroid Build Coastguard Worker		},
3588*333d2b36SAndroid Build Coastguard Worker		{
3589*333d2b36SAndroid Build Coastguard Worker			name: "use_embedded_dex",
3590*333d2b36SAndroid Build Coastguard Worker			bp: `
3591*333d2b36SAndroid Build Coastguard Worker				android_app {
3592*333d2b36SAndroid Build Coastguard Worker					name: "foo",
3593*333d2b36SAndroid Build Coastguard Worker					use_embedded_dex: true,
3594*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
3595*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
3596*333d2b36SAndroid Build Coastguard Worker				}
3597*333d2b36SAndroid Build Coastguard Worker			`,
3598*333d2b36SAndroid Build Coastguard Worker			uncompressedPlatform:  true,
3599*333d2b36SAndroid Build Coastguard Worker			uncompressedUnbundled: true,
3600*333d2b36SAndroid Build Coastguard Worker		},
3601*333d2b36SAndroid Build Coastguard Worker		{
3602*333d2b36SAndroid Build Coastguard Worker			name: "privileged",
3603*333d2b36SAndroid Build Coastguard Worker			bp: `
3604*333d2b36SAndroid Build Coastguard Worker				android_app {
3605*333d2b36SAndroid Build Coastguard Worker					name: "foo",
3606*333d2b36SAndroid Build Coastguard Worker					privileged: true,
3607*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
3608*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
3609*333d2b36SAndroid Build Coastguard Worker				}
3610*333d2b36SAndroid Build Coastguard Worker			`,
3611*333d2b36SAndroid Build Coastguard Worker			uncompressedPlatform:  true,
3612*333d2b36SAndroid Build Coastguard Worker			uncompressedUnbundled: true,
3613*333d2b36SAndroid Build Coastguard Worker		},
3614*333d2b36SAndroid Build Coastguard Worker		{
3615*333d2b36SAndroid Build Coastguard Worker			name: "normal_uncompress_dex_true",
3616*333d2b36SAndroid Build Coastguard Worker			bp: `
3617*333d2b36SAndroid Build Coastguard Worker				android_app {
3618*333d2b36SAndroid Build Coastguard Worker					name: "foo",
3619*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
3620*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
3621*333d2b36SAndroid Build Coastguard Worker					uncompress_dex: true,
3622*333d2b36SAndroid Build Coastguard Worker				}
3623*333d2b36SAndroid Build Coastguard Worker			`,
3624*333d2b36SAndroid Build Coastguard Worker			uncompressedPlatform:  true,
3625*333d2b36SAndroid Build Coastguard Worker			uncompressedUnbundled: true,
3626*333d2b36SAndroid Build Coastguard Worker		},
3627*333d2b36SAndroid Build Coastguard Worker		{
3628*333d2b36SAndroid Build Coastguard Worker			name: "normal_uncompress_dex_false",
3629*333d2b36SAndroid Build Coastguard Worker			bp: `
3630*333d2b36SAndroid Build Coastguard Worker				android_app {
3631*333d2b36SAndroid Build Coastguard Worker					name: "foo",
3632*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
3633*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
3634*333d2b36SAndroid Build Coastguard Worker					uncompress_dex: false,
3635*333d2b36SAndroid Build Coastguard Worker				}
3636*333d2b36SAndroid Build Coastguard Worker			`,
3637*333d2b36SAndroid Build Coastguard Worker			uncompressedPlatform:  false,
3638*333d2b36SAndroid Build Coastguard Worker			uncompressedUnbundled: false,
3639*333d2b36SAndroid Build Coastguard Worker		},
3640*333d2b36SAndroid Build Coastguard Worker	}
3641*333d2b36SAndroid Build Coastguard Worker
3642*333d2b36SAndroid Build Coastguard Worker	test := func(t *testing.T, bp string, want bool, unbundled bool) {
3643*333d2b36SAndroid Build Coastguard Worker		t.Helper()
3644*333d2b36SAndroid Build Coastguard Worker
3645*333d2b36SAndroid Build Coastguard Worker		result := android.GroupFixturePreparers(
3646*333d2b36SAndroid Build Coastguard Worker			prepareForJavaTest,
3647*333d2b36SAndroid Build Coastguard Worker			PrepareForTestWithPrebuiltsOfCurrentApi,
3648*333d2b36SAndroid Build Coastguard Worker			android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3649*333d2b36SAndroid Build Coastguard Worker				if unbundled {
3650*333d2b36SAndroid Build Coastguard Worker					variables.Unbundled_build = proptools.BoolPtr(true)
3651*333d2b36SAndroid Build Coastguard Worker					variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
3652*333d2b36SAndroid Build Coastguard Worker				}
3653*333d2b36SAndroid Build Coastguard Worker			}),
3654*333d2b36SAndroid Build Coastguard Worker		).RunTestWithBp(t, bp)
3655*333d2b36SAndroid Build Coastguard Worker
3656*333d2b36SAndroid Build Coastguard Worker		foo := result.ModuleForTests("foo", "android_common")
3657*333d2b36SAndroid Build Coastguard Worker		dex := foo.Rule("r8")
3658*333d2b36SAndroid Build Coastguard Worker		uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
3659*333d2b36SAndroid Build Coastguard Worker		aligned := foo.MaybeRule("zipalign").Rule != nil
3660*333d2b36SAndroid Build Coastguard Worker
3661*333d2b36SAndroid Build Coastguard Worker		android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
3662*333d2b36SAndroid Build Coastguard Worker
3663*333d2b36SAndroid Build Coastguard Worker		android.AssertBoolEquals(t, "aligne", want, aligned)
3664*333d2b36SAndroid Build Coastguard Worker	}
3665*333d2b36SAndroid Build Coastguard Worker
3666*333d2b36SAndroid Build Coastguard Worker	for _, tt := range testCases {
3667*333d2b36SAndroid Build Coastguard Worker		t.Run(tt.name, func(t *testing.T) {
3668*333d2b36SAndroid Build Coastguard Worker			t.Run("platform", func(t *testing.T) {
3669*333d2b36SAndroid Build Coastguard Worker				test(t, tt.bp, tt.uncompressedPlatform, false)
3670*333d2b36SAndroid Build Coastguard Worker			})
3671*333d2b36SAndroid Build Coastguard Worker			t.Run("unbundled", func(t *testing.T) {
3672*333d2b36SAndroid Build Coastguard Worker				test(t, tt.bp, tt.uncompressedUnbundled, true)
3673*333d2b36SAndroid Build Coastguard Worker			})
3674*333d2b36SAndroid Build Coastguard Worker		})
3675*333d2b36SAndroid Build Coastguard Worker	}
3676*333d2b36SAndroid Build Coastguard Worker}
3677*333d2b36SAndroid Build Coastguard Worker
3678*333d2b36SAndroid Build Coastguard Workerfunc checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
3679*333d2b36SAndroid Build Coastguard Worker	if expectedValue != "" {
3680*333d2b36SAndroid Build Coastguard Worker		expectedFlag := "--" + flagName + " " + expectedValue
3681*333d2b36SAndroid Build Coastguard Worker		if !strings.Contains(aapt2Flags, expectedFlag) {
3682*333d2b36SAndroid Build Coastguard Worker			t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
3683*333d2b36SAndroid Build Coastguard Worker		}
3684*333d2b36SAndroid Build Coastguard Worker	} else {
3685*333d2b36SAndroid Build Coastguard Worker		unexpectedFlag := "--" + flagName
3686*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(aapt2Flags, unexpectedFlag) {
3687*333d2b36SAndroid Build Coastguard Worker			t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
3688*333d2b36SAndroid Build Coastguard Worker		}
3689*333d2b36SAndroid Build Coastguard Worker	}
3690*333d2b36SAndroid Build Coastguard Worker}
3691*333d2b36SAndroid Build Coastguard Worker
3692*333d2b36SAndroid Build Coastguard Workerfunc TestExportedProguardFlagFiles(t *testing.T) {
3693*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
3694*333d2b36SAndroid Build Coastguard Worker		android_app {
3695*333d2b36SAndroid Build Coastguard Worker			name: "foo",
3696*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3697*333d2b36SAndroid Build Coastguard Worker			static_libs: [
3698*333d2b36SAndroid Build Coastguard Worker				"lib1",
3699*333d2b36SAndroid Build Coastguard Worker				"lib3",
3700*333d2b36SAndroid Build Coastguard Worker			],
3701*333d2b36SAndroid Build Coastguard Worker		}
3702*333d2b36SAndroid Build Coastguard Worker
3703*333d2b36SAndroid Build Coastguard Worker		android_library {
3704*333d2b36SAndroid Build Coastguard Worker			name: "lib1",
3705*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3706*333d2b36SAndroid Build Coastguard Worker			optimize: {
3707*333d2b36SAndroid Build Coastguard Worker				proguard_flags_files: ["lib1proguard.cfg"],
3708*333d2b36SAndroid Build Coastguard Worker			},
3709*333d2b36SAndroid Build Coastguard Worker			static_libs: ["lib2"],
3710*333d2b36SAndroid Build Coastguard Worker		}
3711*333d2b36SAndroid Build Coastguard Worker
3712*333d2b36SAndroid Build Coastguard Worker		android_library {
3713*333d2b36SAndroid Build Coastguard Worker			name: "lib2",
3714*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3715*333d2b36SAndroid Build Coastguard Worker			optimize: {
3716*333d2b36SAndroid Build Coastguard Worker				proguard_flags_files: ["lib2proguard.cfg"],
3717*333d2b36SAndroid Build Coastguard Worker			}
3718*333d2b36SAndroid Build Coastguard Worker		}
3719*333d2b36SAndroid Build Coastguard Worker
3720*333d2b36SAndroid Build Coastguard Worker		android_library_import {
3721*333d2b36SAndroid Build Coastguard Worker			name: "lib3",
3722*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3723*333d2b36SAndroid Build Coastguard Worker			aars: ["lib3.aar"],
3724*333d2b36SAndroid Build Coastguard Worker			static_libs: ["lib4"],
3725*333d2b36SAndroid Build Coastguard Worker		}
3726*333d2b36SAndroid Build Coastguard Worker
3727*333d2b36SAndroid Build Coastguard Worker		android_library {
3728*333d2b36SAndroid Build Coastguard Worker			name: "lib4",
3729*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
3730*333d2b36SAndroid Build Coastguard Worker			optimize: {
3731*333d2b36SAndroid Build Coastguard Worker				proguard_flags_files: ["lib4proguard.cfg"],
3732*333d2b36SAndroid Build Coastguard Worker			}
3733*333d2b36SAndroid Build Coastguard Worker		}
3734*333d2b36SAndroid Build Coastguard Worker
3735*333d2b36SAndroid Build Coastguard Worker
3736*333d2b36SAndroid Build Coastguard Worker	`)
3737*333d2b36SAndroid Build Coastguard Worker
3738*333d2b36SAndroid Build Coastguard Worker	m := ctx.ModuleForTests("foo", "android_common")
3739*333d2b36SAndroid Build Coastguard Worker	r8 := m.Rule("java.r8")
3740*333d2b36SAndroid Build Coastguard Worker	implicits := r8.Implicits.RelativeToTop().Strings()
3741*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "r8 implicits", implicits, "lib1proguard.cfg")
3742*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "r8 implicits", implicits, "lib2proguard.cfg")
3743*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "r8 implicits", implicits, "lib4proguard.cfg")
3744*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "r8 implicits", implicits, "out/soong/.intermediates/lib3/android_common/aar/proguard.txt")
3745*333d2b36SAndroid Build Coastguard Worker
3746*333d2b36SAndroid Build Coastguard Worker	flags := r8.Args["r8Flags"]
3747*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib1proguard.cfg")
3748*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib2proguard.cfg")
3749*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib4proguard.cfg")
3750*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "r8 flags", flags, "-include out/soong/.intermediates/lib3/android_common/aar/proguard.txt")
3751*333d2b36SAndroid Build Coastguard Worker}
3752*333d2b36SAndroid Build Coastguard Worker
3753*333d2b36SAndroid Build Coastguard Workerfunc TestTargetSdkVersionManifestFixer(t *testing.T) {
3754*333d2b36SAndroid Build Coastguard Worker	platform_sdk_codename := "Tiramisu"
3755*333d2b36SAndroid Build Coastguard Worker	platform_sdk_version := 33
3756*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
3757*333d2b36SAndroid Build Coastguard Worker		name                     string
3758*333d2b36SAndroid Build Coastguard Worker		targetSdkVersionInBp     string
3759*333d2b36SAndroid Build Coastguard Worker		targetSdkVersionExpected string
3760*333d2b36SAndroid Build Coastguard Worker		unbundledBuild           bool
3761*333d2b36SAndroid Build Coastguard Worker		platformSdkFinal         bool
3762*333d2b36SAndroid Build Coastguard Worker	}{
3763*333d2b36SAndroid Build Coastguard Worker		{
3764*333d2b36SAndroid Build Coastguard Worker			name:                     "Non-Unbundled build: Android.bp has targetSdkVersion",
3765*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:     "30",
3766*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: "30",
3767*333d2b36SAndroid Build Coastguard Worker			unbundledBuild:           false,
3768*333d2b36SAndroid Build Coastguard Worker		},
3769*333d2b36SAndroid Build Coastguard Worker		{
3770*333d2b36SAndroid Build Coastguard Worker			name:                     "Unbundled build: Android.bp has targetSdkVersion",
3771*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:     "30",
3772*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: "30",
3773*333d2b36SAndroid Build Coastguard Worker			unbundledBuild:           true,
3774*333d2b36SAndroid Build Coastguard Worker		},
3775*333d2b36SAndroid Build Coastguard Worker		{
3776*333d2b36SAndroid Build Coastguard Worker			name:                     "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3777*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:     platform_sdk_codename,
3778*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: platform_sdk_codename,
3779*333d2b36SAndroid Build Coastguard Worker			unbundledBuild:           false,
3780*333d2b36SAndroid Build Coastguard Worker		},
3781*333d2b36SAndroid Build Coastguard Worker		{
3782*333d2b36SAndroid Build Coastguard Worker			name:                     "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3783*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:     platform_sdk_codename,
3784*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: "10000",
3785*333d2b36SAndroid Build Coastguard Worker			unbundledBuild:           true,
3786*333d2b36SAndroid Build Coastguard Worker		},
3787*333d2b36SAndroid Build Coastguard Worker
3788*333d2b36SAndroid Build Coastguard Worker		{
3789*333d2b36SAndroid Build Coastguard Worker			name:                     "Non-Unbundled build: Android.bp has no targetSdkVersion",
3790*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: platform_sdk_codename,
3791*333d2b36SAndroid Build Coastguard Worker			unbundledBuild:           false,
3792*333d2b36SAndroid Build Coastguard Worker		},
3793*333d2b36SAndroid Build Coastguard Worker		{
3794*333d2b36SAndroid Build Coastguard Worker			name:                     "Unbundled build: Android.bp has no targetSdkVersion",
3795*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: "10000",
3796*333d2b36SAndroid Build Coastguard Worker			unbundledBuild:           true,
3797*333d2b36SAndroid Build Coastguard Worker		},
3798*333d2b36SAndroid Build Coastguard Worker		{
3799*333d2b36SAndroid Build Coastguard Worker			name:                     "Bundled build in REL branches",
3800*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: "33",
3801*333d2b36SAndroid Build Coastguard Worker			unbundledBuild:           false,
3802*333d2b36SAndroid Build Coastguard Worker			platformSdkFinal:         true,
3803*333d2b36SAndroid Build Coastguard Worker		},
3804*333d2b36SAndroid Build Coastguard Worker	}
3805*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range testCases {
3806*333d2b36SAndroid Build Coastguard Worker		targetSdkVersionTemplate := ""
3807*333d2b36SAndroid Build Coastguard Worker		if testCase.targetSdkVersionInBp != "" {
3808*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, testCase.targetSdkVersionInBp)
3809*333d2b36SAndroid Build Coastguard Worker		}
3810*333d2b36SAndroid Build Coastguard Worker		bp := fmt.Sprintf(`
3811*333d2b36SAndroid Build Coastguard Worker			android_app {
3812*333d2b36SAndroid Build Coastguard Worker				name: "foo",
3813*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
3814*333d2b36SAndroid Build Coastguard Worker				%s
3815*333d2b36SAndroid Build Coastguard Worker			}
3816*333d2b36SAndroid Build Coastguard Worker			`, targetSdkVersionTemplate)
3817*333d2b36SAndroid Build Coastguard Worker		fixture := android.GroupFixturePreparers(
3818*333d2b36SAndroid Build Coastguard Worker			prepareForJavaTest,
3819*333d2b36SAndroid Build Coastguard Worker			android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3820*333d2b36SAndroid Build Coastguard Worker				if testCase.platformSdkFinal {
3821*333d2b36SAndroid Build Coastguard Worker					variables.Platform_sdk_final = proptools.BoolPtr(true)
3822*333d2b36SAndroid Build Coastguard Worker				}
3823*333d2b36SAndroid Build Coastguard Worker				// explicitly set platform_sdk_codename to make the test deterministic
3824*333d2b36SAndroid Build Coastguard Worker				variables.Platform_sdk_codename = &platform_sdk_codename
3825*333d2b36SAndroid Build Coastguard Worker				variables.Platform_sdk_version = &platform_sdk_version
3826*333d2b36SAndroid Build Coastguard Worker				variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3827*333d2b36SAndroid Build Coastguard Worker				// create a non-empty list if unbundledBuild==true
3828*333d2b36SAndroid Build Coastguard Worker				if testCase.unbundledBuild {
3829*333d2b36SAndroid Build Coastguard Worker					variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3830*333d2b36SAndroid Build Coastguard Worker				}
3831*333d2b36SAndroid Build Coastguard Worker			}),
3832*333d2b36SAndroid Build Coastguard Worker		)
3833*333d2b36SAndroid Build Coastguard Worker
3834*333d2b36SAndroid Build Coastguard Worker		result := fixture.RunTestWithBp(t, bp)
3835*333d2b36SAndroid Build Coastguard Worker		foo := result.ModuleForTests("foo", "android_common")
3836*333d2b36SAndroid Build Coastguard Worker
3837*333d2b36SAndroid Build Coastguard Worker		manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3838*333d2b36SAndroid Build Coastguard Worker		android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion  "+testCase.targetSdkVersionExpected)
3839*333d2b36SAndroid Build Coastguard Worker	}
3840*333d2b36SAndroid Build Coastguard Worker}
3841*333d2b36SAndroid Build Coastguard Worker
3842*333d2b36SAndroid Build Coastguard Workerfunc TestDefaultAppTargetSdkVersionForUpdatableModules(t *testing.T) {
3843*333d2b36SAndroid Build Coastguard Worker	platform_sdk_codename := "Tiramisu"
3844*333d2b36SAndroid Build Coastguard Worker	platform_sdk_version := 33
3845*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
3846*333d2b36SAndroid Build Coastguard Worker		name                     string
3847*333d2b36SAndroid Build Coastguard Worker		platform_sdk_final       bool
3848*333d2b36SAndroid Build Coastguard Worker		targetSdkVersionInBp     *string
3849*333d2b36SAndroid Build Coastguard Worker		targetSdkVersionExpected *string
3850*333d2b36SAndroid Build Coastguard Worker		updatable                bool
3851*333d2b36SAndroid Build Coastguard Worker	}{
3852*333d2b36SAndroid Build Coastguard Worker		{
3853*333d2b36SAndroid Build Coastguard Worker			name:                     "Non-Updatable Module: Android.bp has older targetSdkVersion",
3854*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:     proptools.StringPtr("29"),
3855*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: proptools.StringPtr("29"),
3856*333d2b36SAndroid Build Coastguard Worker			updatable:                false,
3857*333d2b36SAndroid Build Coastguard Worker		},
3858*333d2b36SAndroid Build Coastguard Worker		{
3859*333d2b36SAndroid Build Coastguard Worker			name:                     "Updatable Module: Android.bp has older targetSdkVersion",
3860*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:     proptools.StringPtr("30"),
3861*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: proptools.StringPtr("30"),
3862*333d2b36SAndroid Build Coastguard Worker			updatable:                true,
3863*333d2b36SAndroid Build Coastguard Worker		},
3864*333d2b36SAndroid Build Coastguard Worker		{
3865*333d2b36SAndroid Build Coastguard Worker			name:                     "Updatable Module: Android.bp has no targetSdkVersion",
3866*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: proptools.StringPtr("10000"),
3867*333d2b36SAndroid Build Coastguard Worker			updatable:                true,
3868*333d2b36SAndroid Build Coastguard Worker		},
3869*333d2b36SAndroid Build Coastguard Worker		{
3870*333d2b36SAndroid Build Coastguard Worker			name:                     "[SDK finalised] Non-Updatable Module: Android.bp has older targetSdkVersion",
3871*333d2b36SAndroid Build Coastguard Worker			platform_sdk_final:       true,
3872*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:     proptools.StringPtr("30"),
3873*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: proptools.StringPtr("30"),
3874*333d2b36SAndroid Build Coastguard Worker			updatable:                false,
3875*333d2b36SAndroid Build Coastguard Worker		},
3876*333d2b36SAndroid Build Coastguard Worker		{
3877*333d2b36SAndroid Build Coastguard Worker			name:                     "[SDK finalised] Updatable Module: Android.bp has older targetSdkVersion",
3878*333d2b36SAndroid Build Coastguard Worker			platform_sdk_final:       true,
3879*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:     proptools.StringPtr("30"),
3880*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: proptools.StringPtr("30"),
3881*333d2b36SAndroid Build Coastguard Worker			updatable:                true,
3882*333d2b36SAndroid Build Coastguard Worker		},
3883*333d2b36SAndroid Build Coastguard Worker		{
3884*333d2b36SAndroid Build Coastguard Worker			name:                     "[SDK finalised] Updatable Module: Android.bp has targetSdkVersion as platform sdk codename",
3885*333d2b36SAndroid Build Coastguard Worker			platform_sdk_final:       true,
3886*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:     proptools.StringPtr(platform_sdk_codename),
3887*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: proptools.StringPtr("33"),
3888*333d2b36SAndroid Build Coastguard Worker			updatable:                true,
3889*333d2b36SAndroid Build Coastguard Worker		},
3890*333d2b36SAndroid Build Coastguard Worker		{
3891*333d2b36SAndroid Build Coastguard Worker			name:                     "[SDK finalised] Updatable Module: Android.bp has no targetSdkVersion",
3892*333d2b36SAndroid Build Coastguard Worker			platform_sdk_final:       true,
3893*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: proptools.StringPtr("33"),
3894*333d2b36SAndroid Build Coastguard Worker			updatable:                true,
3895*333d2b36SAndroid Build Coastguard Worker		},
3896*333d2b36SAndroid Build Coastguard Worker	}
3897*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range testCases {
3898*333d2b36SAndroid Build Coastguard Worker		targetSdkVersionTemplate := ""
3899*333d2b36SAndroid Build Coastguard Worker		if testCase.targetSdkVersionInBp != nil {
3900*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, *testCase.targetSdkVersionInBp)
3901*333d2b36SAndroid Build Coastguard Worker		}
3902*333d2b36SAndroid Build Coastguard Worker		bp := fmt.Sprintf(`
3903*333d2b36SAndroid Build Coastguard Worker			android_app {
3904*333d2b36SAndroid Build Coastguard Worker				name: "foo",
3905*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
3906*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "29",
3907*333d2b36SAndroid Build Coastguard Worker				%s
3908*333d2b36SAndroid Build Coastguard Worker				updatable: %t,
3909*333d2b36SAndroid Build Coastguard Worker				enforce_default_target_sdk_version: %t
3910*333d2b36SAndroid Build Coastguard Worker			}
3911*333d2b36SAndroid Build Coastguard Worker			`, targetSdkVersionTemplate, testCase.updatable, testCase.updatable) // enforce default target sdk version if app is updatable
3912*333d2b36SAndroid Build Coastguard Worker
3913*333d2b36SAndroid Build Coastguard Worker		fixture := android.GroupFixturePreparers(
3914*333d2b36SAndroid Build Coastguard Worker			PrepareForTestWithJavaDefaultModules,
3915*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithAllowMissingDependencies,
3916*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithAndroidMk,
3917*333d2b36SAndroid Build Coastguard Worker			android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3918*333d2b36SAndroid Build Coastguard Worker				// explicitly set following platform variables to make the test deterministic
3919*333d2b36SAndroid Build Coastguard Worker				variables.Platform_sdk_final = &testCase.platform_sdk_final
3920*333d2b36SAndroid Build Coastguard Worker				variables.Platform_sdk_version = &platform_sdk_version
3921*333d2b36SAndroid Build Coastguard Worker				variables.Platform_sdk_codename = &platform_sdk_codename
3922*333d2b36SAndroid Build Coastguard Worker				variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3923*333d2b36SAndroid Build Coastguard Worker				variables.Unbundled_build = proptools.BoolPtr(true)
3924*333d2b36SAndroid Build Coastguard Worker				variables.Unbundled_build_apps = []string{"sampleModule"}
3925*333d2b36SAndroid Build Coastguard Worker			}),
3926*333d2b36SAndroid Build Coastguard Worker		)
3927*333d2b36SAndroid Build Coastguard Worker
3928*333d2b36SAndroid Build Coastguard Worker		result := fixture.RunTestWithBp(t, bp)
3929*333d2b36SAndroid Build Coastguard Worker		foo := result.ModuleForTests("foo", "android_common")
3930*333d2b36SAndroid Build Coastguard Worker
3931*333d2b36SAndroid Build Coastguard Worker		manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3932*333d2b36SAndroid Build Coastguard Worker		android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion  "+*testCase.targetSdkVersionExpected)
3933*333d2b36SAndroid Build Coastguard Worker	}
3934*333d2b36SAndroid Build Coastguard Worker}
3935*333d2b36SAndroid Build Coastguard Worker
3936*333d2b36SAndroid Build Coastguard Workerfunc TestEnforceDefaultAppTargetSdkVersionFlag(t *testing.T) {
3937*333d2b36SAndroid Build Coastguard Worker	platform_sdk_codename := "Tiramisu"
3938*333d2b36SAndroid Build Coastguard Worker	platform_sdk_version := 33
3939*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
3940*333d2b36SAndroid Build Coastguard Worker		name                           string
3941*333d2b36SAndroid Build Coastguard Worker		enforceDefaultTargetSdkVersion bool
3942*333d2b36SAndroid Build Coastguard Worker		expectedError                  string
3943*333d2b36SAndroid Build Coastguard Worker		platform_sdk_final             bool
3944*333d2b36SAndroid Build Coastguard Worker		targetSdkVersionInBp           string
3945*333d2b36SAndroid Build Coastguard Worker		targetSdkVersionExpected       string
3946*333d2b36SAndroid Build Coastguard Worker		updatable                      bool
3947*333d2b36SAndroid Build Coastguard Worker	}{
3948*333d2b36SAndroid Build Coastguard Worker		{
3949*333d2b36SAndroid Build Coastguard Worker			name:                           "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
3950*333d2b36SAndroid Build Coastguard Worker			enforceDefaultTargetSdkVersion: false,
3951*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:           "29",
3952*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected:       "29",
3953*333d2b36SAndroid Build Coastguard Worker			updatable:                      false,
3954*333d2b36SAndroid Build Coastguard Worker		},
3955*333d2b36SAndroid Build Coastguard Worker		{
3956*333d2b36SAndroid Build Coastguard Worker			name:                           "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3957*333d2b36SAndroid Build Coastguard Worker			enforceDefaultTargetSdkVersion: true,
3958*333d2b36SAndroid Build Coastguard Worker			platform_sdk_final:             true,
3959*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:           "current",
3960*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected:       "33",
3961*333d2b36SAndroid Build Coastguard Worker			updatable:                      true,
3962*333d2b36SAndroid Build Coastguard Worker		},
3963*333d2b36SAndroid Build Coastguard Worker		{
3964*333d2b36SAndroid Build Coastguard Worker			name:                           "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3965*333d2b36SAndroid Build Coastguard Worker			enforceDefaultTargetSdkVersion: true,
3966*333d2b36SAndroid Build Coastguard Worker			platform_sdk_final:             false,
3967*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:           "current",
3968*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected:       "10000",
3969*333d2b36SAndroid Build Coastguard Worker			updatable:                      false,
3970*333d2b36SAndroid Build Coastguard Worker		},
3971*333d2b36SAndroid Build Coastguard Worker		{
3972*333d2b36SAndroid Build Coastguard Worker			name:                           "Not enforcing Target SDK Version for Updatable app",
3973*333d2b36SAndroid Build Coastguard Worker			enforceDefaultTargetSdkVersion: false,
3974*333d2b36SAndroid Build Coastguard Worker			expectedError:                  "Updatable apps must enforce default target sdk version",
3975*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:           "29",
3976*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected:       "29",
3977*333d2b36SAndroid Build Coastguard Worker			updatable:                      true,
3978*333d2b36SAndroid Build Coastguard Worker		},
3979*333d2b36SAndroid Build Coastguard Worker	}
3980*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range testCases {
3981*333d2b36SAndroid Build Coastguard Worker		errExpected := testCase.expectedError != ""
3982*333d2b36SAndroid Build Coastguard Worker		bp := fmt.Sprintf(`
3983*333d2b36SAndroid Build Coastguard Worker			android_app {
3984*333d2b36SAndroid Build Coastguard Worker				name: "foo",
3985*333d2b36SAndroid Build Coastguard Worker				enforce_default_target_sdk_version: %t,
3986*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
3987*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "29",
3988*333d2b36SAndroid Build Coastguard Worker				target_sdk_version: "%v",
3989*333d2b36SAndroid Build Coastguard Worker				updatable: %t
3990*333d2b36SAndroid Build Coastguard Worker			}
3991*333d2b36SAndroid Build Coastguard Worker			`, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp, testCase.updatable)
3992*333d2b36SAndroid Build Coastguard Worker
3993*333d2b36SAndroid Build Coastguard Worker		fixture := android.GroupFixturePreparers(
3994*333d2b36SAndroid Build Coastguard Worker			PrepareForTestWithJavaDefaultModules,
3995*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithAllowMissingDependencies,
3996*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithAndroidMk,
3997*333d2b36SAndroid Build Coastguard Worker			android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3998*333d2b36SAndroid Build Coastguard Worker				// explicitly set following platform variables to make the test deterministic
3999*333d2b36SAndroid Build Coastguard Worker				variables.Platform_sdk_final = &testCase.platform_sdk_final
4000*333d2b36SAndroid Build Coastguard Worker				variables.Platform_sdk_version = &platform_sdk_version
4001*333d2b36SAndroid Build Coastguard Worker				variables.Platform_sdk_codename = &platform_sdk_codename
4002*333d2b36SAndroid Build Coastguard Worker				variables.Unbundled_build = proptools.BoolPtr(true)
4003*333d2b36SAndroid Build Coastguard Worker				variables.Unbundled_build_apps = []string{"sampleModule"}
4004*333d2b36SAndroid Build Coastguard Worker			}),
4005*333d2b36SAndroid Build Coastguard Worker		)
4006*333d2b36SAndroid Build Coastguard Worker
4007*333d2b36SAndroid Build Coastguard Worker		errorHandler := android.FixtureExpectsNoErrors
4008*333d2b36SAndroid Build Coastguard Worker		if errExpected {
4009*333d2b36SAndroid Build Coastguard Worker			errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
4010*333d2b36SAndroid Build Coastguard Worker		}
4011*333d2b36SAndroid Build Coastguard Worker		result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
4012*333d2b36SAndroid Build Coastguard Worker
4013*333d2b36SAndroid Build Coastguard Worker		if !errExpected {
4014*333d2b36SAndroid Build Coastguard Worker			foo := result.ModuleForTests("foo", "android_common")
4015*333d2b36SAndroid Build Coastguard Worker			manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4016*333d2b36SAndroid Build Coastguard Worker			android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion  "+testCase.targetSdkVersionExpected)
4017*333d2b36SAndroid Build Coastguard Worker		}
4018*333d2b36SAndroid Build Coastguard Worker	}
4019*333d2b36SAndroid Build Coastguard Worker}
4020*333d2b36SAndroid Build Coastguard Worker
4021*333d2b36SAndroid Build Coastguard Workerfunc TestEnforceDefaultAppTargetSdkVersionFlagForTests(t *testing.T) {
4022*333d2b36SAndroid Build Coastguard Worker	platform_sdk_codename := "Tiramisu"
4023*333d2b36SAndroid Build Coastguard Worker	platform_sdk_version := 33
4024*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
4025*333d2b36SAndroid Build Coastguard Worker		name                           string
4026*333d2b36SAndroid Build Coastguard Worker		enforceDefaultTargetSdkVersion bool
4027*333d2b36SAndroid Build Coastguard Worker		expectedError                  string
4028*333d2b36SAndroid Build Coastguard Worker		platform_sdk_final             bool
4029*333d2b36SAndroid Build Coastguard Worker		targetSdkVersionInBp           string
4030*333d2b36SAndroid Build Coastguard Worker		targetSdkVersionExpected       string
4031*333d2b36SAndroid Build Coastguard Worker	}{
4032*333d2b36SAndroid Build Coastguard Worker		{
4033*333d2b36SAndroid Build Coastguard Worker			name:                           "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
4034*333d2b36SAndroid Build Coastguard Worker			enforceDefaultTargetSdkVersion: false,
4035*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:           "29",
4036*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected:       "29",
4037*333d2b36SAndroid Build Coastguard Worker		},
4038*333d2b36SAndroid Build Coastguard Worker		{
4039*333d2b36SAndroid Build Coastguard Worker			name:                           "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4040*333d2b36SAndroid Build Coastguard Worker			enforceDefaultTargetSdkVersion: true,
4041*333d2b36SAndroid Build Coastguard Worker			platform_sdk_final:             true,
4042*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:           "current",
4043*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected:       "33",
4044*333d2b36SAndroid Build Coastguard Worker		},
4045*333d2b36SAndroid Build Coastguard Worker		{
4046*333d2b36SAndroid Build Coastguard Worker			name:                           "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4047*333d2b36SAndroid Build Coastguard Worker			enforceDefaultTargetSdkVersion: true,
4048*333d2b36SAndroid Build Coastguard Worker			platform_sdk_final:             false,
4049*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:           "current",
4050*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected:       "10000",
4051*333d2b36SAndroid Build Coastguard Worker		},
4052*333d2b36SAndroid Build Coastguard Worker	}
4053*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range testCases {
4054*333d2b36SAndroid Build Coastguard Worker		errExpected := testCase.expectedError != ""
4055*333d2b36SAndroid Build Coastguard Worker		bp := fmt.Sprintf(`
4056*333d2b36SAndroid Build Coastguard Worker			android_test {
4057*333d2b36SAndroid Build Coastguard Worker				name: "foo",
4058*333d2b36SAndroid Build Coastguard Worker				enforce_default_target_sdk_version: %t,
4059*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "29",
4060*333d2b36SAndroid Build Coastguard Worker				target_sdk_version: "%v",
4061*333d2b36SAndroid Build Coastguard Worker			}
4062*333d2b36SAndroid Build Coastguard Worker		`, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp)
4063*333d2b36SAndroid Build Coastguard Worker
4064*333d2b36SAndroid Build Coastguard Worker		fixture := android.GroupFixturePreparers(
4065*333d2b36SAndroid Build Coastguard Worker			PrepareForTestWithJavaDefaultModules,
4066*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithAllowMissingDependencies,
4067*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithAndroidMk,
4068*333d2b36SAndroid Build Coastguard Worker			android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4069*333d2b36SAndroid Build Coastguard Worker				// explicitly set following platform variables to make the test deterministic
4070*333d2b36SAndroid Build Coastguard Worker				variables.Platform_sdk_final = &testCase.platform_sdk_final
4071*333d2b36SAndroid Build Coastguard Worker				variables.Platform_sdk_version = &platform_sdk_version
4072*333d2b36SAndroid Build Coastguard Worker				variables.Platform_sdk_codename = &platform_sdk_codename
4073*333d2b36SAndroid Build Coastguard Worker				variables.Unbundled_build = proptools.BoolPtr(true)
4074*333d2b36SAndroid Build Coastguard Worker				variables.Unbundled_build_apps = []string{"sampleModule"}
4075*333d2b36SAndroid Build Coastguard Worker			}),
4076*333d2b36SAndroid Build Coastguard Worker		)
4077*333d2b36SAndroid Build Coastguard Worker
4078*333d2b36SAndroid Build Coastguard Worker		errorHandler := android.FixtureExpectsNoErrors
4079*333d2b36SAndroid Build Coastguard Worker		if errExpected {
4080*333d2b36SAndroid Build Coastguard Worker			errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
4081*333d2b36SAndroid Build Coastguard Worker		}
4082*333d2b36SAndroid Build Coastguard Worker		result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
4083*333d2b36SAndroid Build Coastguard Worker
4084*333d2b36SAndroid Build Coastguard Worker		if !errExpected {
4085*333d2b36SAndroid Build Coastguard Worker			foo := result.ModuleForTests("foo", "android_common")
4086*333d2b36SAndroid Build Coastguard Worker			manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4087*333d2b36SAndroid Build Coastguard Worker			android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion  "+testCase.targetSdkVersionExpected)
4088*333d2b36SAndroid Build Coastguard Worker		}
4089*333d2b36SAndroid Build Coastguard Worker	}
4090*333d2b36SAndroid Build Coastguard Worker}
4091*333d2b36SAndroid Build Coastguard Worker
4092*333d2b36SAndroid Build Coastguard Workerfunc TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
4093*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
4094*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
4095*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAllowMissingDependencies,
4096*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAndroidMk,
4097*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
4098*333d2b36SAndroid Build Coastguard Worker		android_app {
4099*333d2b36SAndroid Build Coastguard Worker			name: "foo",
4100*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
4101*333d2b36SAndroid Build Coastguard Worker			certificate: ":missing_certificate",
4102*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4103*333d2b36SAndroid Build Coastguard Worker		}
4104*333d2b36SAndroid Build Coastguard Worker
4105*333d2b36SAndroid Build Coastguard Worker		android_app {
4106*333d2b36SAndroid Build Coastguard Worker			name: "bar",
4107*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
4108*333d2b36SAndroid Build Coastguard Worker			certificate: ":missing_certificate",
4109*333d2b36SAndroid Build Coastguard Worker			product_specific: true,
4110*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4111*333d2b36SAndroid Build Coastguard Worker		}`)
4112*333d2b36SAndroid Build Coastguard Worker
4113*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("foo", "android_common")
4114*333d2b36SAndroid Build Coastguard Worker	fooApk := foo.Output("foo.apk")
4115*333d2b36SAndroid Build Coastguard Worker	if fooApk.Rule != android.ErrorRule {
4116*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
4117*333d2b36SAndroid Build Coastguard Worker	}
4118*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
4119*333d2b36SAndroid Build Coastguard Worker}
4120*333d2b36SAndroid Build Coastguard Worker
4121*333d2b36SAndroid Build Coastguard Workerfunc TestAppIncludesJniPackages(t *testing.T) {
4122*333d2b36SAndroid Build Coastguard Worker	ctx := android.GroupFixturePreparers(
4123*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
4124*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
4125*333d2b36SAndroid Build Coastguard Worker		android_library_import {
4126*333d2b36SAndroid Build Coastguard Worker			name: "aary-nodeps",
4127*333d2b36SAndroid Build Coastguard Worker			aars: ["aary.aar"],
4128*333d2b36SAndroid Build Coastguard Worker			extract_jni: true,
4129*333d2b36SAndroid Build Coastguard Worker		}
4130*333d2b36SAndroid Build Coastguard Worker
4131*333d2b36SAndroid Build Coastguard Worker		android_library {
4132*333d2b36SAndroid Build Coastguard Worker			name: "aary-lib",
4133*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4134*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "21",
4135*333d2b36SAndroid Build Coastguard Worker			static_libs: ["aary-nodeps"],
4136*333d2b36SAndroid Build Coastguard Worker		}
4137*333d2b36SAndroid Build Coastguard Worker
4138*333d2b36SAndroid Build Coastguard Worker		android_app {
4139*333d2b36SAndroid Build Coastguard Worker			name: "aary-lib-dep",
4140*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4141*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "21",
4142*333d2b36SAndroid Build Coastguard Worker			manifest: "AndroidManifest.xml",
4143*333d2b36SAndroid Build Coastguard Worker			static_libs: ["aary-lib"],
4144*333d2b36SAndroid Build Coastguard Worker			use_embedded_native_libs: true,
4145*333d2b36SAndroid Build Coastguard Worker		}
4146*333d2b36SAndroid Build Coastguard Worker
4147*333d2b36SAndroid Build Coastguard Worker		android_app {
4148*333d2b36SAndroid Build Coastguard Worker			name: "aary-import-dep",
4149*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4150*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "21",
4151*333d2b36SAndroid Build Coastguard Worker			manifest: "AndroidManifest.xml",
4152*333d2b36SAndroid Build Coastguard Worker			static_libs: ["aary-nodeps"],
4153*333d2b36SAndroid Build Coastguard Worker			use_embedded_native_libs: true,
4154*333d2b36SAndroid Build Coastguard Worker		}
4155*333d2b36SAndroid Build Coastguard Worker
4156*333d2b36SAndroid Build Coastguard Worker		android_app {
4157*333d2b36SAndroid Build Coastguard Worker			name: "aary-no-use-embedded",
4158*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4159*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "21",
4160*333d2b36SAndroid Build Coastguard Worker			manifest: "AndroidManifest.xml",
4161*333d2b36SAndroid Build Coastguard Worker			static_libs: ["aary-nodeps"],
4162*333d2b36SAndroid Build Coastguard Worker		}`)
4163*333d2b36SAndroid Build Coastguard Worker
4164*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
4165*333d2b36SAndroid Build Coastguard Worker		name       string
4166*333d2b36SAndroid Build Coastguard Worker		hasPackage bool
4167*333d2b36SAndroid Build Coastguard Worker	}{
4168*333d2b36SAndroid Build Coastguard Worker		{
4169*333d2b36SAndroid Build Coastguard Worker			name:       "aary-import-dep",
4170*333d2b36SAndroid Build Coastguard Worker			hasPackage: true,
4171*333d2b36SAndroid Build Coastguard Worker		},
4172*333d2b36SAndroid Build Coastguard Worker		{
4173*333d2b36SAndroid Build Coastguard Worker			name:       "aary-lib-dep",
4174*333d2b36SAndroid Build Coastguard Worker			hasPackage: true,
4175*333d2b36SAndroid Build Coastguard Worker		},
4176*333d2b36SAndroid Build Coastguard Worker		{
4177*333d2b36SAndroid Build Coastguard Worker			name:       "aary-no-use-embedded",
4178*333d2b36SAndroid Build Coastguard Worker			hasPackage: false,
4179*333d2b36SAndroid Build Coastguard Worker		},
4180*333d2b36SAndroid Build Coastguard Worker	}
4181*333d2b36SAndroid Build Coastguard Worker
4182*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
4183*333d2b36SAndroid Build Coastguard Worker		t.Run(tc.name, func(t *testing.T) {
4184*333d2b36SAndroid Build Coastguard Worker			app := ctx.ModuleForTests(tc.name, "android_common")
4185*333d2b36SAndroid Build Coastguard Worker
4186*333d2b36SAndroid Build Coastguard Worker			outputFile := "jnilibs.zip"
4187*333d2b36SAndroid Build Coastguard Worker			jniOutputLibZip := app.MaybeOutput(outputFile)
4188*333d2b36SAndroid Build Coastguard Worker			if jniOutputLibZip.Rule == nil && !tc.hasPackage {
4189*333d2b36SAndroid Build Coastguard Worker				return
4190*333d2b36SAndroid Build Coastguard Worker			}
4191*333d2b36SAndroid Build Coastguard Worker
4192*333d2b36SAndroid Build Coastguard Worker			jniPackage := "arm64-v8a_jni.zip"
4193*333d2b36SAndroid Build Coastguard Worker			inputs := jniOutputLibZip.Inputs
4194*333d2b36SAndroid Build Coastguard Worker			foundPackage := false
4195*333d2b36SAndroid Build Coastguard Worker			for i := 0; i < len(inputs); i++ {
4196*333d2b36SAndroid Build Coastguard Worker				if strings.Contains(inputs[i].String(), jniPackage) {
4197*333d2b36SAndroid Build Coastguard Worker					foundPackage = true
4198*333d2b36SAndroid Build Coastguard Worker				}
4199*333d2b36SAndroid Build Coastguard Worker			}
4200*333d2b36SAndroid Build Coastguard Worker			if foundPackage != tc.hasPackage {
4201*333d2b36SAndroid Build Coastguard Worker				t.Errorf("expected to find %v in %v inputs; inputs = %v", jniPackage, outputFile, inputs)
4202*333d2b36SAndroid Build Coastguard Worker			}
4203*333d2b36SAndroid Build Coastguard Worker		})
4204*333d2b36SAndroid Build Coastguard Worker	}
4205*333d2b36SAndroid Build Coastguard Worker}
4206*333d2b36SAndroid Build Coastguard Worker
4207*333d2b36SAndroid Build Coastguard Workerfunc TestTargetSdkVersionMtsTests(t *testing.T) {
4208*333d2b36SAndroid Build Coastguard Worker	platformSdkCodename := "Tiramisu"
4209*333d2b36SAndroid Build Coastguard Worker	android_test := "android_test"
4210*333d2b36SAndroid Build Coastguard Worker	android_test_helper_app := "android_test_helper_app"
4211*333d2b36SAndroid Build Coastguard Worker	bpTemplate := `
4212*333d2b36SAndroid Build Coastguard Worker	%v {
4213*333d2b36SAndroid Build Coastguard Worker		name: "mytest",
4214*333d2b36SAndroid Build Coastguard Worker		min_sdk_version: "34",
4215*333d2b36SAndroid Build Coastguard Worker		target_sdk_version: "%v",
4216*333d2b36SAndroid Build Coastguard Worker		test_suites: ["othersuite", "%v"],
4217*333d2b36SAndroid Build Coastguard Worker	}
4218*333d2b36SAndroid Build Coastguard Worker	`
4219*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
4220*333d2b36SAndroid Build Coastguard Worker		desc                     string
4221*333d2b36SAndroid Build Coastguard Worker		moduleType               string
4222*333d2b36SAndroid Build Coastguard Worker		targetSdkVersionInBp     string
4223*333d2b36SAndroid Build Coastguard Worker		targetSdkVersionExpected string
4224*333d2b36SAndroid Build Coastguard Worker		testSuites               string
4225*333d2b36SAndroid Build Coastguard Worker	}{
4226*333d2b36SAndroid Build Coastguard Worker		{
4227*333d2b36SAndroid Build Coastguard Worker			desc:                     "Non-MTS android_test_apps targeting current should not be upgraded to 10000",
4228*333d2b36SAndroid Build Coastguard Worker			moduleType:               android_test,
4229*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:     "current",
4230*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: platformSdkCodename,
4231*333d2b36SAndroid Build Coastguard Worker			testSuites:               "non-mts-suite",
4232*333d2b36SAndroid Build Coastguard Worker		},
4233*333d2b36SAndroid Build Coastguard Worker		{
4234*333d2b36SAndroid Build Coastguard Worker			desc:                     "MTS android_test_apps targeting released sdks should not be upgraded to 10000",
4235*333d2b36SAndroid Build Coastguard Worker			moduleType:               android_test,
4236*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:     "29",
4237*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: "29",
4238*333d2b36SAndroid Build Coastguard Worker			testSuites:               "mts-suite",
4239*333d2b36SAndroid Build Coastguard Worker		},
4240*333d2b36SAndroid Build Coastguard Worker		{
4241*333d2b36SAndroid Build Coastguard Worker			desc:                     "MTS android_test_apps targeting current should be upgraded to 10000",
4242*333d2b36SAndroid Build Coastguard Worker			moduleType:               android_test,
4243*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:     "current",
4244*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: "10000",
4245*333d2b36SAndroid Build Coastguard Worker			testSuites:               "mts-suite",
4246*333d2b36SAndroid Build Coastguard Worker		},
4247*333d2b36SAndroid Build Coastguard Worker		{
4248*333d2b36SAndroid Build Coastguard Worker			desc:                     "MTS android_test_helper_apps targeting current should be upgraded to 10000",
4249*333d2b36SAndroid Build Coastguard Worker			moduleType:               android_test_helper_app,
4250*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionInBp:     "current",
4251*333d2b36SAndroid Build Coastguard Worker			targetSdkVersionExpected: "10000",
4252*333d2b36SAndroid Build Coastguard Worker			testSuites:               "mts-suite",
4253*333d2b36SAndroid Build Coastguard Worker		},
4254*333d2b36SAndroid Build Coastguard Worker	}
4255*333d2b36SAndroid Build Coastguard Worker	fixture := android.GroupFixturePreparers(
4256*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
4257*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4258*333d2b36SAndroid Build Coastguard Worker			variables.Platform_sdk_codename = &platformSdkCodename
4259*333d2b36SAndroid Build Coastguard Worker			variables.Platform_version_active_codenames = []string{platformSdkCodename}
4260*333d2b36SAndroid Build Coastguard Worker		}),
4261*333d2b36SAndroid Build Coastguard Worker	)
4262*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range testCases {
4263*333d2b36SAndroid Build Coastguard Worker		result := fixture.RunTestWithBp(t, fmt.Sprintf(bpTemplate, testCase.moduleType, testCase.targetSdkVersionInBp, testCase.testSuites))
4264*333d2b36SAndroid Build Coastguard Worker		mytest := result.ModuleForTests("mytest", "android_common")
4265*333d2b36SAndroid Build Coastguard Worker		manifestFixerArgs := mytest.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4266*333d2b36SAndroid Build Coastguard Worker		android.AssertStringDoesContain(t, testCase.desc, manifestFixerArgs, "--targetSdkVersion  "+testCase.targetSdkVersionExpected)
4267*333d2b36SAndroid Build Coastguard Worker	}
4268*333d2b36SAndroid Build Coastguard Worker}
4269*333d2b36SAndroid Build Coastguard Worker
4270*333d2b36SAndroid Build Coastguard Workerfunc TestPrivappAllowlist(t *testing.T) {
4271*333d2b36SAndroid Build Coastguard Worker	testJavaError(t, "privileged must be set in order to use privapp_allowlist", `
4272*333d2b36SAndroid Build Coastguard Worker		android_app {
4273*333d2b36SAndroid Build Coastguard Worker			name: "foo",
4274*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
4275*333d2b36SAndroid Build Coastguard Worker			privapp_allowlist: "perms.xml",
4276*333d2b36SAndroid Build Coastguard Worker		}
4277*333d2b36SAndroid Build Coastguard Worker	`)
4278*333d2b36SAndroid Build Coastguard Worker
4279*333d2b36SAndroid Build Coastguard Worker	result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
4280*333d2b36SAndroid Build Coastguard Worker		t,
4281*333d2b36SAndroid Build Coastguard Worker		`
4282*333d2b36SAndroid Build Coastguard Worker		android_app {
4283*333d2b36SAndroid Build Coastguard Worker			name: "foo",
4284*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
4285*333d2b36SAndroid Build Coastguard Worker			privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
4286*333d2b36SAndroid Build Coastguard Worker			privileged: true,
4287*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4288*333d2b36SAndroid Build Coastguard Worker		}
4289*333d2b36SAndroid Build Coastguard Worker		override_android_app {
4290*333d2b36SAndroid Build Coastguard Worker			name: "bar",
4291*333d2b36SAndroid Build Coastguard Worker			base: "foo",
4292*333d2b36SAndroid Build Coastguard Worker			package_name: "com.google.android.foo",
4293*333d2b36SAndroid Build Coastguard Worker		}
4294*333d2b36SAndroid Build Coastguard Worker		`,
4295*333d2b36SAndroid Build Coastguard Worker	)
4296*333d2b36SAndroid Build Coastguard Worker	app := result.ModuleForTests("foo", "android_common")
4297*333d2b36SAndroid Build Coastguard Worker	overrideApp := result.ModuleForTests("foo", "android_common_bar")
4298*333d2b36SAndroid Build Coastguard Worker
4299*333d2b36SAndroid Build Coastguard Worker	// verify that privapp allowlist is created for override apps
4300*333d2b36SAndroid Build Coastguard Worker	overrideApp.Output("out/soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml")
4301*333d2b36SAndroid Build Coastguard Worker	expectedAllowlistInput := "privapp_allowlist_com.android.foo.xml"
4302*333d2b36SAndroid Build Coastguard Worker	overrideActualAllowlistInput := overrideApp.Rule("modifyAllowlist").Input.String()
4303*333d2b36SAndroid Build Coastguard Worker	if expectedAllowlistInput != overrideActualAllowlistInput {
4304*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected override allowlist to be %q; got %q", expectedAllowlistInput, overrideActualAllowlistInput)
4305*333d2b36SAndroid Build Coastguard Worker	}
4306*333d2b36SAndroid Build Coastguard Worker
4307*333d2b36SAndroid Build Coastguard Worker	// verify that permissions are copied to device
4308*333d2b36SAndroid Build Coastguard Worker	app.Output("out/soong/target/product/test_device/system/etc/permissions/foo.xml")
4309*333d2b36SAndroid Build Coastguard Worker	overrideApp.Output("out/soong/target/product/test_device/system/etc/permissions/bar.xml")
4310*333d2b36SAndroid Build Coastguard Worker}
4311*333d2b36SAndroid Build Coastguard Worker
4312*333d2b36SAndroid Build Coastguard Workerfunc TestPrivappAllowlistAndroidMk(t *testing.T) {
4313*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
4314*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
4315*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAndroidMk,
4316*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(
4317*333d2b36SAndroid Build Coastguard Worker		t,
4318*333d2b36SAndroid Build Coastguard Worker		`
4319*333d2b36SAndroid Build Coastguard Worker		android_app {
4320*333d2b36SAndroid Build Coastguard Worker			name: "foo",
4321*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
4322*333d2b36SAndroid Build Coastguard Worker			privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
4323*333d2b36SAndroid Build Coastguard Worker			privileged: true,
4324*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4325*333d2b36SAndroid Build Coastguard Worker		}
4326*333d2b36SAndroid Build Coastguard Worker		override_android_app {
4327*333d2b36SAndroid Build Coastguard Worker			name: "bar",
4328*333d2b36SAndroid Build Coastguard Worker			base: "foo",
4329*333d2b36SAndroid Build Coastguard Worker			package_name: "com.google.android.foo",
4330*333d2b36SAndroid Build Coastguard Worker		}
4331*333d2b36SAndroid Build Coastguard Worker		`,
4332*333d2b36SAndroid Build Coastguard Worker	)
4333*333d2b36SAndroid Build Coastguard Worker	baseApp := result.ModuleForTests("foo", "android_common")
4334*333d2b36SAndroid Build Coastguard Worker	overrideApp := result.ModuleForTests("foo", "android_common_bar")
4335*333d2b36SAndroid Build Coastguard Worker
4336*333d2b36SAndroid Build Coastguard Worker	baseAndroidApp := baseApp.Module().(*AndroidApp)
4337*333d2b36SAndroid Build Coastguard Worker	baseEntries := android.AndroidMkEntriesForTest(t, result.TestContext, baseAndroidApp)[0]
4338*333d2b36SAndroid Build Coastguard Worker	android.AssertStringMatches(
4339*333d2b36SAndroid Build Coastguard Worker		t,
4340*333d2b36SAndroid Build Coastguard Worker		"androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find foo.apk",
4341*333d2b36SAndroid Build Coastguard Worker		baseEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4342*333d2b36SAndroid Build Coastguard Worker		"\\S+foo.apk",
4343*333d2b36SAndroid Build Coastguard Worker	)
4344*333d2b36SAndroid Build Coastguard Worker	android.AssertStringMatches(
4345*333d2b36SAndroid Build Coastguard Worker		t,
4346*333d2b36SAndroid Build Coastguard Worker		"androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include foo.apk",
4347*333d2b36SAndroid Build Coastguard Worker		baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4348*333d2b36SAndroid Build Coastguard Worker		"\\S+foo.apk",
4349*333d2b36SAndroid Build Coastguard Worker	)
4350*333d2b36SAndroid Build Coastguard Worker	android.AssertStringMatches(
4351*333d2b36SAndroid Build Coastguard Worker		t,
4352*333d2b36SAndroid Build Coastguard Worker		"androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4353*333d2b36SAndroid Build Coastguard Worker		baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4354*333d2b36SAndroid Build Coastguard Worker		"\\S+foo.apk:\\S+/target/product/test_device/system/priv-app/foo/foo.apk",
4355*333d2b36SAndroid Build Coastguard Worker	)
4356*333d2b36SAndroid Build Coastguard Worker	android.AssertStringMatches(
4357*333d2b36SAndroid Build Coastguard Worker		t,
4358*333d2b36SAndroid Build Coastguard Worker		"androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4359*333d2b36SAndroid Build Coastguard Worker		baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4360*333d2b36SAndroid Build Coastguard Worker		"privapp_allowlist_com.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/foo.xml",
4361*333d2b36SAndroid Build Coastguard Worker	)
4362*333d2b36SAndroid Build Coastguard Worker
4363*333d2b36SAndroid Build Coastguard Worker	overrideAndroidApp := overrideApp.Module().(*AndroidApp)
4364*333d2b36SAndroid Build Coastguard Worker	overrideEntries := android.AndroidMkEntriesForTest(t, result.TestContext, overrideAndroidApp)[0]
4365*333d2b36SAndroid Build Coastguard Worker	android.AssertStringMatches(
4366*333d2b36SAndroid Build Coastguard Worker		t,
4367*333d2b36SAndroid Build Coastguard Worker		"androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find bar.apk",
4368*333d2b36SAndroid Build Coastguard Worker		overrideEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4369*333d2b36SAndroid Build Coastguard Worker		"\\S+bar.apk",
4370*333d2b36SAndroid Build Coastguard Worker	)
4371*333d2b36SAndroid Build Coastguard Worker	android.AssertStringMatches(
4372*333d2b36SAndroid Build Coastguard Worker		t,
4373*333d2b36SAndroid Build Coastguard Worker		"androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include bar.apk",
4374*333d2b36SAndroid Build Coastguard Worker		overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4375*333d2b36SAndroid Build Coastguard Worker		"\\S+bar.apk",
4376*333d2b36SAndroid Build Coastguard Worker	)
4377*333d2b36SAndroid Build Coastguard Worker	android.AssertStringMatches(
4378*333d2b36SAndroid Build Coastguard Worker		t,
4379*333d2b36SAndroid Build Coastguard Worker		"androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4380*333d2b36SAndroid Build Coastguard Worker		overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4381*333d2b36SAndroid Build Coastguard Worker		"\\S+bar.apk:\\S+/target/product/test_device/system/priv-app/bar/bar.apk",
4382*333d2b36SAndroid Build Coastguard Worker	)
4383*333d2b36SAndroid Build Coastguard Worker	android.AssertStringMatches(
4384*333d2b36SAndroid Build Coastguard Worker		t,
4385*333d2b36SAndroid Build Coastguard Worker		"androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4386*333d2b36SAndroid Build Coastguard Worker		overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4387*333d2b36SAndroid Build Coastguard Worker		"\\S+soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/bar.xml",
4388*333d2b36SAndroid Build Coastguard Worker	)
4389*333d2b36SAndroid Build Coastguard Worker}
4390*333d2b36SAndroid Build Coastguard Worker
4391*333d2b36SAndroid Build Coastguard Workerfunc TestAppFlagsPackages(t *testing.T) {
4392*333d2b36SAndroid Build Coastguard Worker	ctx := android.GroupFixturePreparers(
4393*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
4394*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(
4395*333d2b36SAndroid Build Coastguard Worker			map[string][]byte{
4396*333d2b36SAndroid Build Coastguard Worker				"res/layout/layout.xml":         nil,
4397*333d2b36SAndroid Build Coastguard Worker				"res/values/strings.xml":        nil,
4398*333d2b36SAndroid Build Coastguard Worker				"res/values-en-rUS/strings.xml": nil,
4399*333d2b36SAndroid Build Coastguard Worker			},
4400*333d2b36SAndroid Build Coastguard Worker		),
4401*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
4402*333d2b36SAndroid Build Coastguard Worker		android_app {
4403*333d2b36SAndroid Build Coastguard Worker			name: "foo",
4404*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
4405*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4406*333d2b36SAndroid Build Coastguard Worker			flags_packages: [
4407*333d2b36SAndroid Build Coastguard Worker				"bar",
4408*333d2b36SAndroid Build Coastguard Worker				"baz",
4409*333d2b36SAndroid Build Coastguard Worker			],
4410*333d2b36SAndroid Build Coastguard Worker		}
4411*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
4412*333d2b36SAndroid Build Coastguard Worker			name: "bar",
4413*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package.bar",
4414*333d2b36SAndroid Build Coastguard Worker			container: "com.android.foo",
4415*333d2b36SAndroid Build Coastguard Worker			srcs: [
4416*333d2b36SAndroid Build Coastguard Worker				"bar.aconfig",
4417*333d2b36SAndroid Build Coastguard Worker			],
4418*333d2b36SAndroid Build Coastguard Worker		}
4419*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
4420*333d2b36SAndroid Build Coastguard Worker			name: "baz",
4421*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package.baz",
4422*333d2b36SAndroid Build Coastguard Worker			container: "com.android.foo",
4423*333d2b36SAndroid Build Coastguard Worker			srcs: [
4424*333d2b36SAndroid Build Coastguard Worker				"baz.aconfig",
4425*333d2b36SAndroid Build Coastguard Worker			],
4426*333d2b36SAndroid Build Coastguard Worker		}
4427*333d2b36SAndroid Build Coastguard Worker	`)
4428*333d2b36SAndroid Build Coastguard Worker
4429*333d2b36SAndroid Build Coastguard Worker	foo := ctx.ModuleForTests("foo", "android_common")
4430*333d2b36SAndroid Build Coastguard Worker
4431*333d2b36SAndroid Build Coastguard Worker	// android_app module depends on aconfig_declarations listed in flags_packages
4432*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(t, "foo expected to depend on bar", true,
4433*333d2b36SAndroid Build Coastguard Worker		CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "bar"))
4434*333d2b36SAndroid Build Coastguard Worker
4435*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(t, "foo expected to depend on baz", true,
4436*333d2b36SAndroid Build Coastguard Worker		CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "baz"))
4437*333d2b36SAndroid Build Coastguard Worker
4438*333d2b36SAndroid Build Coastguard Worker	aapt2LinkRule := foo.Rule("android/soong/java.aapt2Link")
4439*333d2b36SAndroid Build Coastguard Worker	linkInFlags := aapt2LinkRule.Args["inFlags"]
4440*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t,
4441*333d2b36SAndroid Build Coastguard Worker		"aapt2 link command expected to pass feature flags arguments",
4442*333d2b36SAndroid Build Coastguard Worker		linkInFlags,
4443*333d2b36SAndroid Build Coastguard Worker		"--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4444*333d2b36SAndroid Build Coastguard Worker	)
4445*333d2b36SAndroid Build Coastguard Worker
4446*333d2b36SAndroid Build Coastguard Worker	aapt2CompileRule := foo.Rule("android/soong/java.aapt2Compile")
4447*333d2b36SAndroid Build Coastguard Worker	compileFlags := aapt2CompileRule.Args["cFlags"]
4448*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t,
4449*333d2b36SAndroid Build Coastguard Worker		"aapt2 compile command expected to pass feature flags arguments",
4450*333d2b36SAndroid Build Coastguard Worker		compileFlags,
4451*333d2b36SAndroid Build Coastguard Worker		"--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4452*333d2b36SAndroid Build Coastguard Worker	)
4453*333d2b36SAndroid Build Coastguard Worker}
4454*333d2b36SAndroid Build Coastguard Worker
4455*333d2b36SAndroid Build Coastguard Workerfunc TestAppFlagsPackagesPropagation(t *testing.T) {
4456*333d2b36SAndroid Build Coastguard Worker	ctx := testApp(t, `
4457*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
4458*333d2b36SAndroid Build Coastguard Worker			name: "foo",
4459*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package.foo",
4460*333d2b36SAndroid Build Coastguard Worker			container: "com.android.foo",
4461*333d2b36SAndroid Build Coastguard Worker			srcs: [
4462*333d2b36SAndroid Build Coastguard Worker				"foo.aconfig",
4463*333d2b36SAndroid Build Coastguard Worker			],
4464*333d2b36SAndroid Build Coastguard Worker		}
4465*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
4466*333d2b36SAndroid Build Coastguard Worker			name: "bar",
4467*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package.bar",
4468*333d2b36SAndroid Build Coastguard Worker			container: "com.android.bar",
4469*333d2b36SAndroid Build Coastguard Worker			srcs: [
4470*333d2b36SAndroid Build Coastguard Worker				"bar.aconfig",
4471*333d2b36SAndroid Build Coastguard Worker			],
4472*333d2b36SAndroid Build Coastguard Worker		}
4473*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
4474*333d2b36SAndroid Build Coastguard Worker			name: "baz",
4475*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package.baz",
4476*333d2b36SAndroid Build Coastguard Worker			container: "com.android.baz",
4477*333d2b36SAndroid Build Coastguard Worker			srcs: [
4478*333d2b36SAndroid Build Coastguard Worker				"baz.aconfig",
4479*333d2b36SAndroid Build Coastguard Worker			],
4480*333d2b36SAndroid Build Coastguard Worker		}
4481*333d2b36SAndroid Build Coastguard Worker		android_library {
4482*333d2b36SAndroid Build Coastguard Worker			name: "foo_lib",
4483*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
4484*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4485*333d2b36SAndroid Build Coastguard Worker			flags_packages: [
4486*333d2b36SAndroid Build Coastguard Worker				"foo",
4487*333d2b36SAndroid Build Coastguard Worker			],
4488*333d2b36SAndroid Build Coastguard Worker		}
4489*333d2b36SAndroid Build Coastguard Worker		android_library {
4490*333d2b36SAndroid Build Coastguard Worker			name: "bar_lib",
4491*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
4492*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4493*333d2b36SAndroid Build Coastguard Worker			flags_packages: [
4494*333d2b36SAndroid Build Coastguard Worker				"bar",
4495*333d2b36SAndroid Build Coastguard Worker			],
4496*333d2b36SAndroid Build Coastguard Worker		}
4497*333d2b36SAndroid Build Coastguard Worker		android_app {
4498*333d2b36SAndroid Build Coastguard Worker			name: "baz_app",
4499*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
4500*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4501*333d2b36SAndroid Build Coastguard Worker			flags_packages: [
4502*333d2b36SAndroid Build Coastguard Worker				"baz",
4503*333d2b36SAndroid Build Coastguard Worker			],
4504*333d2b36SAndroid Build Coastguard Worker			static_libs: [
4505*333d2b36SAndroid Build Coastguard Worker				"bar_lib",
4506*333d2b36SAndroid Build Coastguard Worker			],
4507*333d2b36SAndroid Build Coastguard Worker			libs: [
4508*333d2b36SAndroid Build Coastguard Worker				"foo_lib",
4509*333d2b36SAndroid Build Coastguard Worker			],
4510*333d2b36SAndroid Build Coastguard Worker		}
4511*333d2b36SAndroid Build Coastguard Worker	`)
4512*333d2b36SAndroid Build Coastguard Worker
4513*333d2b36SAndroid Build Coastguard Worker	bazApp := ctx.ModuleForTests("baz_app", "android_common")
4514*333d2b36SAndroid Build Coastguard Worker
4515*333d2b36SAndroid Build Coastguard Worker	// android_app module depends on aconfig_declarations listed in flags_packages
4516*333d2b36SAndroid Build Coastguard Worker	// and that of static libs, but not libs
4517*333d2b36SAndroid Build Coastguard Worker	aapt2LinkRule := bazApp.Rule("android/soong/java.aapt2Link")
4518*333d2b36SAndroid Build Coastguard Worker	linkInFlags := aapt2LinkRule.Args["inFlags"]
4519*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t,
4520*333d2b36SAndroid Build Coastguard Worker		"aapt2 link command expected to pass feature flags arguments of flags_packages and that of its static libs",
4521*333d2b36SAndroid Build Coastguard Worker		linkInFlags,
4522*333d2b36SAndroid Build Coastguard Worker		"--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4523*333d2b36SAndroid Build Coastguard Worker	)
4524*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t,
4525*333d2b36SAndroid Build Coastguard Worker		"aapt2 link command expected to not pass feature flags arguments of flags_packages of its libs",
4526*333d2b36SAndroid Build Coastguard Worker		linkInFlags,
4527*333d2b36SAndroid Build Coastguard Worker		"--feature-flags @out/soong/.intermediates/foo/intermediate.txt",
4528*333d2b36SAndroid Build Coastguard Worker	)
4529*333d2b36SAndroid Build Coastguard Worker}
4530*333d2b36SAndroid Build Coastguard Worker
4531*333d2b36SAndroid Build Coastguard Worker// Test that dexpreopt is disabled if an optional_uses_libs exists, but does not provide an implementation.
4532*333d2b36SAndroid Build Coastguard Workerfunc TestNoDexpreoptOptionalUsesLibDoesNotHaveImpl(t *testing.T) {
4533*333d2b36SAndroid Build Coastguard Worker	bp := `
4534*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
4535*333d2b36SAndroid Build Coastguard Worker			name: "sdklib_noimpl",
4536*333d2b36SAndroid Build Coastguard Worker			public: {
4537*333d2b36SAndroid Build Coastguard Worker				jars: ["stub.jar"],
4538*333d2b36SAndroid Build Coastguard Worker			},
4539*333d2b36SAndroid Build Coastguard Worker		}
4540*333d2b36SAndroid Build Coastguard Worker		android_app {
4541*333d2b36SAndroid Build Coastguard Worker			name: "app",
4542*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
4543*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4544*333d2b36SAndroid Build Coastguard Worker			optional_uses_libs: [
4545*333d2b36SAndroid Build Coastguard Worker				"sdklib_noimpl",
4546*333d2b36SAndroid Build Coastguard Worker			],
4547*333d2b36SAndroid Build Coastguard Worker		}
4548*333d2b36SAndroid Build Coastguard Worker	`
4549*333d2b36SAndroid Build Coastguard Worker	result := prepareForJavaTest.RunTestWithBp(t, bp)
4550*333d2b36SAndroid Build Coastguard Worker	dexpreopt := result.ModuleForTests("app", "android_common").MaybeRule("dexpreopt").Rule
4551*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(t, "dexpreopt should be disabled if optional_uses_libs does not have an implementation", true, dexpreopt == nil)
4552*333d2b36SAndroid Build Coastguard Worker}
4553*333d2b36SAndroid Build Coastguard Worker
4554*333d2b36SAndroid Build Coastguard Workerfunc TestTestOnlyApp(t *testing.T) {
4555*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4556*333d2b36SAndroid Build Coastguard Worker	ctx := android.GroupFixturePreparers(
4557*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
4558*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
4559*333d2b36SAndroid Build Coastguard Worker                // These should be test-only
4560*333d2b36SAndroid Build Coastguard Worker                android_test {
4561*333d2b36SAndroid Build Coastguard Worker                        name: "android-test",
4562*333d2b36SAndroid Build Coastguard Worker                }
4563*333d2b36SAndroid Build Coastguard Worker                android_test_helper_app {
4564*333d2b36SAndroid Build Coastguard Worker                        name: "helper-app",
4565*333d2b36SAndroid Build Coastguard Worker                }
4566*333d2b36SAndroid Build Coastguard Worker                override_android_test {
4567*333d2b36SAndroid Build Coastguard Worker                        name: "override-test",
4568*333d2b36SAndroid Build Coastguard Worker                        base: "android-app",
4569*333d2b36SAndroid Build Coastguard Worker                }
4570*333d2b36SAndroid Build Coastguard Worker                // And these should not be
4571*333d2b36SAndroid Build Coastguard Worker		android_app {
4572*333d2b36SAndroid Build Coastguard Worker			name: "android-app",
4573*333d2b36SAndroid Build Coastguard Worker                        srcs: ["b.java"],
4574*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4575*333d2b36SAndroid Build Coastguard Worker		}
4576*333d2b36SAndroid Build Coastguard Worker	`)
4577*333d2b36SAndroid Build Coastguard Worker
4578*333d2b36SAndroid Build Coastguard Worker	expectedTestOnly := []string{
4579*333d2b36SAndroid Build Coastguard Worker		"android-test",
4580*333d2b36SAndroid Build Coastguard Worker		"helper-app",
4581*333d2b36SAndroid Build Coastguard Worker		"override-test",
4582*333d2b36SAndroid Build Coastguard Worker	}
4583*333d2b36SAndroid Build Coastguard Worker
4584*333d2b36SAndroid Build Coastguard Worker	expectedTopLevel := []string{
4585*333d2b36SAndroid Build Coastguard Worker		"android-test",
4586*333d2b36SAndroid Build Coastguard Worker		"override-test",
4587*333d2b36SAndroid Build Coastguard Worker	}
4588*333d2b36SAndroid Build Coastguard Worker
4589*333d2b36SAndroid Build Coastguard Worker	assertTestOnlyAndTopLevel(t, ctx, expectedTestOnly, expectedTopLevel)
4590*333d2b36SAndroid Build Coastguard Worker}
4591*333d2b36SAndroid Build Coastguard Worker
4592*333d2b36SAndroid Build Coastguard Workerfunc TestAppStem(t *testing.T) {
4593*333d2b36SAndroid Build Coastguard Worker	ctx := testApp(t, `
4594*333d2b36SAndroid Build Coastguard Worker				android_app {
4595*333d2b36SAndroid Build Coastguard Worker					name: "foo",
4596*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
4597*333d2b36SAndroid Build Coastguard Worker					stem: "foo-new",
4598*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
4599*333d2b36SAndroid Build Coastguard Worker				}`)
4600*333d2b36SAndroid Build Coastguard Worker
4601*333d2b36SAndroid Build Coastguard Worker	foo := ctx.ModuleForTests("foo", "android_common")
4602*333d2b36SAndroid Build Coastguard Worker
4603*333d2b36SAndroid Build Coastguard Worker	outputs := fmt.Sprint(foo.AllOutputs())
4604*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(outputs, "foo-new.apk") {
4605*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Module output does not contain expected apk %s", "foo-new.apk")
4606*333d2b36SAndroid Build Coastguard Worker	}
4607*333d2b36SAndroid Build Coastguard Worker}
4608*333d2b36SAndroid Build Coastguard Worker
4609*333d2b36SAndroid Build Coastguard Workerfunc TestAppMinSdkVersionOverride(t *testing.T) {
4610*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
4611*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
4612*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
4613*333d2b36SAndroid Build Coastguard Worker		android_app {
4614*333d2b36SAndroid Build Coastguard Worker			name: "com.android.foo",
4615*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
4616*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4617*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "31",
4618*333d2b36SAndroid Build Coastguard Worker			updatable: true,
4619*333d2b36SAndroid Build Coastguard Worker		}
4620*333d2b36SAndroid Build Coastguard Worker		override_android_app {
4621*333d2b36SAndroid Build Coastguard Worker			name: "com.android.go.foo",
4622*333d2b36SAndroid Build Coastguard Worker			base: "com.android.foo",
4623*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "33",
4624*333d2b36SAndroid Build Coastguard Worker		}
4625*333d2b36SAndroid Build Coastguard Worker	`)
4626*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
4627*333d2b36SAndroid Build Coastguard Worker	fooOverride := result.ModuleForTests("com.android.foo", "android_common_com.android.go.foo").Rule("manifestFixer")
4628*333d2b36SAndroid Build Coastguard Worker
4629*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t,
4630*333d2b36SAndroid Build Coastguard Worker		"com.android.foo: expected manifest fixer to set minSdkVersion to T",
4631*333d2b36SAndroid Build Coastguard Worker		foo.BuildParams.Args["args"],
4632*333d2b36SAndroid Build Coastguard Worker		"--minSdkVersion  31",
4633*333d2b36SAndroid Build Coastguard Worker	)
4634*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t,
4635*333d2b36SAndroid Build Coastguard Worker		"com.android.go.foo: expected manifest fixer to set minSdkVersion to T",
4636*333d2b36SAndroid Build Coastguard Worker		fooOverride.BuildParams.Args["args"],
4637*333d2b36SAndroid Build Coastguard Worker		"--minSdkVersion  33",
4638*333d2b36SAndroid Build Coastguard Worker	)
4639*333d2b36SAndroid Build Coastguard Worker
4640*333d2b36SAndroid Build Coastguard Worker}
4641*333d2b36SAndroid Build Coastguard Worker
4642*333d2b36SAndroid Build Coastguard Workerfunc TestNotApplyDefaultUpdatableModuleVersion(t *testing.T) {
4643*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
4644*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
4645*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
4646*333d2b36SAndroid Build Coastguard Worker		android_app {
4647*333d2b36SAndroid Build Coastguard Worker			name: "com.android.foo",
4648*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
4649*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4650*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "31",
4651*333d2b36SAndroid Build Coastguard Worker		}
4652*333d2b36SAndroid Build Coastguard Worker	`)
4653*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
4654*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t,
4655*333d2b36SAndroid Build Coastguard Worker		"com.android.foo: expected manifest fixer to not set override-placeholder-version",
4656*333d2b36SAndroid Build Coastguard Worker		foo.BuildParams.Args["args"],
4657*333d2b36SAndroid Build Coastguard Worker		"--override-placeholder-version",
4658*333d2b36SAndroid Build Coastguard Worker	)
4659*333d2b36SAndroid Build Coastguard Worker}
4660*333d2b36SAndroid Build Coastguard Worker
4661*333d2b36SAndroid Build Coastguard Workerfunc TestNotApplyOverrideApexManifestDefaultVersion(t *testing.T) {
4662*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
4663*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
4664*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeEnv(map[string]string{
4665*333d2b36SAndroid Build Coastguard Worker			"OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4666*333d2b36SAndroid Build Coastguard Worker		}),
4667*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
4668*333d2b36SAndroid Build Coastguard Worker		android_app {
4669*333d2b36SAndroid Build Coastguard Worker			name: "com.android.foo",
4670*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
4671*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
4672*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "31",
4673*333d2b36SAndroid Build Coastguard Worker		}
4674*333d2b36SAndroid Build Coastguard Worker	`)
4675*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
4676*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t,
4677*333d2b36SAndroid Build Coastguard Worker		"com.android.foo: expected manifest fixer to not set override-placeholder-version",
4678*333d2b36SAndroid Build Coastguard Worker		foo.BuildParams.Args["args"],
4679*333d2b36SAndroid Build Coastguard Worker		"--override-placeholder-version",
4680*333d2b36SAndroid Build Coastguard Worker	)
4681*333d2b36SAndroid Build Coastguard Worker}
4682*333d2b36SAndroid Build Coastguard Worker
4683*333d2b36SAndroid Build Coastguard Workerfunc TestResourcesWithFlagDirectories(t *testing.T) {
4684*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
4685*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
4686*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(android.MockFS{
4687*333d2b36SAndroid Build Coastguard Worker			"res/flag(test.package.flag1)/values/bools.xml":                          nil,
4688*333d2b36SAndroid Build Coastguard Worker			"res/flag(!test.package.flag2)/values/bools.xml":                         nil,
4689*333d2b36SAndroid Build Coastguard Worker			"res/flag(test.package.flag1)/values-config/strings_google_services.xml": nil,
4690*333d2b36SAndroid Build Coastguard Worker			"res/flags(test.package.flag1)/values/strings.xml":                       nil,
4691*333d2b36SAndroid Build Coastguard Worker		}),
4692*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
4693*333d2b36SAndroid Build Coastguard Worker		android_library {
4694*333d2b36SAndroid Build Coastguard Worker			name: "foo",
4695*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
4696*333d2b36SAndroid Build Coastguard Worker			use_resource_processor: true,
4697*333d2b36SAndroid Build Coastguard Worker			resource_dirs: [
4698*333d2b36SAndroid Build Coastguard Worker				"res",
4699*333d2b36SAndroid Build Coastguard Worker			],
4700*333d2b36SAndroid Build Coastguard Worker		}
4701*333d2b36SAndroid Build Coastguard Worker	`)
4702*333d2b36SAndroid Build Coastguard Worker	fooModule := result.ModuleForTests("foo", "android_common")
4703*333d2b36SAndroid Build Coastguard Worker	compileOutputPaths := fooModule.Rule("aapt2Compile").Outputs.Strings()
4704*333d2b36SAndroid Build Coastguard Worker
4705*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(
4706*333d2b36SAndroid Build Coastguard Worker		t,
4707*333d2b36SAndroid Build Coastguard Worker		"Expected to generate flag path",
4708*333d2b36SAndroid Build Coastguard Worker		compileOutputPaths,
4709*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/foo/android_common/aapt2/res/values_bools.(test.package.flag1).arsc.flat",
4710*333d2b36SAndroid Build Coastguard Worker	)
4711*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(
4712*333d2b36SAndroid Build Coastguard Worker		t,
4713*333d2b36SAndroid Build Coastguard Worker		"Expected to generate flag path with ! prefix in name",
4714*333d2b36SAndroid Build Coastguard Worker		compileOutputPaths,
4715*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/foo/android_common/aapt2/res/values_bools.(!test.package.flag2).arsc.flat",
4716*333d2b36SAndroid Build Coastguard Worker	)
4717*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(
4718*333d2b36SAndroid Build Coastguard Worker		t,
4719*333d2b36SAndroid Build Coastguard Worker		"Expected to generate flag path with configs",
4720*333d2b36SAndroid Build Coastguard Worker		compileOutputPaths,
4721*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/foo/android_common/aapt2/res/values-config_strings_google_services.(test.package.flag1).arsc.flat",
4722*333d2b36SAndroid Build Coastguard Worker	)
4723*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListDoesNotContain(
4724*333d2b36SAndroid Build Coastguard Worker		t,
4725*333d2b36SAndroid Build Coastguard Worker		"Expected to not generate flag path with non-flag(flag_name) pattern",
4726*333d2b36SAndroid Build Coastguard Worker		compileOutputPaths,
4727*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/foo/android_common/aapt2/res/values_strings.(test.package.flag1).arsc.flat",
4728*333d2b36SAndroid Build Coastguard Worker	)
4729*333d2b36SAndroid Build Coastguard Worker}
4730*333d2b36SAndroid Build Coastguard Worker
4731*333d2b36SAndroid Build Coastguard Workerfunc TestAutogeneratedStaticRro(t *testing.T) {
4732*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4733*333d2b36SAndroid Build Coastguard Worker	bp := `
4734*333d2b36SAndroid Build Coastguard Workerandroid_app {
4735*333d2b36SAndroid Build Coastguard Worker	name: "foo",
4736*333d2b36SAndroid Build Coastguard Worker	srcs: ["foo.java"],
4737*333d2b36SAndroid Build Coastguard Worker	platform_apis: true,
4738*333d2b36SAndroid Build Coastguard Worker}
4739*333d2b36SAndroid Build Coastguard Workeroverride_android_app {
4740*333d2b36SAndroid Build Coastguard Worker	name: "override_foo",
4741*333d2b36SAndroid Build Coastguard Worker	base: "foo",
4742*333d2b36SAndroid Build Coastguard Worker}
4743*333d2b36SAndroid Build Coastguard Worker`
4744*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
4745*333d2b36SAndroid Build Coastguard Worker		desc               string
4746*333d2b36SAndroid Build Coastguard Worker		preparer           android.FixturePreparer
4747*333d2b36SAndroid Build Coastguard Worker		overlayApkExpected bool
4748*333d2b36SAndroid Build Coastguard Worker	}{
4749*333d2b36SAndroid Build Coastguard Worker		{
4750*333d2b36SAndroid Build Coastguard Worker			desc:               "No DEVICE_PACKAGE_OVERLAYS, no overlay .apk file",
4751*333d2b36SAndroid Build Coastguard Worker			overlayApkExpected: false,
4752*333d2b36SAndroid Build Coastguard Worker		},
4753*333d2b36SAndroid Build Coastguard Worker		{
4754*333d2b36SAndroid Build Coastguard Worker			desc:               "DEVICE_PACKAGE_OVERLAYS exists, but the directory is empty",
4755*333d2b36SAndroid Build Coastguard Worker			overlayApkExpected: false,
4756*333d2b36SAndroid Build Coastguard Worker			preparer: android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4757*333d2b36SAndroid Build Coastguard Worker				variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4758*333d2b36SAndroid Build Coastguard Worker			}),
4759*333d2b36SAndroid Build Coastguard Worker		},
4760*333d2b36SAndroid Build Coastguard Worker		{
4761*333d2b36SAndroid Build Coastguard Worker			desc:               "DEVICE_PACKAGE_OVERLAYS exists, directory is non-empty, but does not contain a matching resource dir",
4762*333d2b36SAndroid Build Coastguard Worker			overlayApkExpected: false,
4763*333d2b36SAndroid Build Coastguard Worker			preparer: android.GroupFixturePreparers(
4764*333d2b36SAndroid Build Coastguard Worker				android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4765*333d2b36SAndroid Build Coastguard Worker					variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4766*333d2b36SAndroid Build Coastguard Worker				}),
4767*333d2b36SAndroid Build Coastguard Worker				android.MockFS{
4768*333d2b36SAndroid Build Coastguard Worker					"res/foo.xml": nil,
4769*333d2b36SAndroid Build Coastguard Worker					"device/company/test_product/different_res/foo.xml": nil, // different dir
4770*333d2b36SAndroid Build Coastguard Worker				}.AddToFixture(),
4771*333d2b36SAndroid Build Coastguard Worker			),
4772*333d2b36SAndroid Build Coastguard Worker		},
4773*333d2b36SAndroid Build Coastguard Worker		{
4774*333d2b36SAndroid Build Coastguard Worker			desc:               "DEVICE_PACKAGE_OVERLAYS and the directory contain a matching resource dir",
4775*333d2b36SAndroid Build Coastguard Worker			overlayApkExpected: true,
4776*333d2b36SAndroid Build Coastguard Worker			preparer: android.GroupFixturePreparers(
4777*333d2b36SAndroid Build Coastguard Worker				android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4778*333d2b36SAndroid Build Coastguard Worker					variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4779*333d2b36SAndroid Build Coastguard Worker				}),
4780*333d2b36SAndroid Build Coastguard Worker				android.MockFS{
4781*333d2b36SAndroid Build Coastguard Worker					"res/foo.xml": nil,
4782*333d2b36SAndroid Build Coastguard Worker					"device/company/test_product/res/foo.xml": nil,
4783*333d2b36SAndroid Build Coastguard Worker				}.AddToFixture(),
4784*333d2b36SAndroid Build Coastguard Worker			),
4785*333d2b36SAndroid Build Coastguard Worker		},
4786*333d2b36SAndroid Build Coastguard Worker	}
4787*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
4788*333d2b36SAndroid Build Coastguard Worker		result := android.GroupFixturePreparers(
4789*333d2b36SAndroid Build Coastguard Worker			PrepareForTestWithJavaDefaultModules,
4790*333d2b36SAndroid Build Coastguard Worker			android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4791*333d2b36SAndroid Build Coastguard Worker				variables.EnforceRROTargets = []string{"*"}
4792*333d2b36SAndroid Build Coastguard Worker			}),
4793*333d2b36SAndroid Build Coastguard Worker			android.OptionalFixturePreparer(tc.preparer),
4794*333d2b36SAndroid Build Coastguard Worker		).RunTestWithBp(t, bp)
4795*333d2b36SAndroid Build Coastguard Worker		vendorOverlayApk := result.ModuleForTests("foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").MaybeOutput("foo__test_product__auto_generated_rro_vendor.apk")
4796*333d2b36SAndroid Build Coastguard Worker		android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, vendorOverlayApk.Rule != nil)
4797*333d2b36SAndroid Build Coastguard Worker		overrideVendorOverlayApk := result.ModuleForTests("override_foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").MaybeOutput("override_foo__test_product__auto_generated_rro_vendor.apk")
4798*333d2b36SAndroid Build Coastguard Worker		android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, overrideVendorOverlayApk.Rule != nil)
4799*333d2b36SAndroid Build Coastguard Worker	}
4800*333d2b36SAndroid Build Coastguard Worker}
4801*333d2b36SAndroid Build Coastguard Worker
4802*333d2b36SAndroid Build Coastguard Workerfunc TestNoAutogeneratedStaticRroForDisabledOverrideApps(t *testing.T) {
4803*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
4804*333d2b36SAndroid Build Coastguard Worker	bp := `
4805*333d2b36SAndroid Build Coastguard Workersoong_config_module_type {
4806*333d2b36SAndroid Build Coastguard Worker	name: "my_custom_override_android_app",
4807*333d2b36SAndroid Build Coastguard Worker	module_type: "override_android_app",
4808*333d2b36SAndroid Build Coastguard Worker	config_namespace: "my_namespace",
4809*333d2b36SAndroid Build Coastguard Worker	value_variables: ["my_app_enabled"],
4810*333d2b36SAndroid Build Coastguard Worker	properties: ["enabled"],
4811*333d2b36SAndroid Build Coastguard Worker}
4812*333d2b36SAndroid Build Coastguard Workersoong_config_bool_variable {
4813*333d2b36SAndroid Build Coastguard Worker	name: "my_app_enabled",
4814*333d2b36SAndroid Build Coastguard Worker}
4815*333d2b36SAndroid Build Coastguard Workerandroid_app {
4816*333d2b36SAndroid Build Coastguard Worker	name: "foo",
4817*333d2b36SAndroid Build Coastguard Worker	srcs: ["foo.java"],
4818*333d2b36SAndroid Build Coastguard Worker	platform_apis: true,
4819*333d2b36SAndroid Build Coastguard Worker}
4820*333d2b36SAndroid Build Coastguard Workermy_custom_override_android_app {
4821*333d2b36SAndroid Build Coastguard Worker	name: "override_foo",
4822*333d2b36SAndroid Build Coastguard Worker	base: "foo",
4823*333d2b36SAndroid Build Coastguard Worker	soong_config_variables: {
4824*333d2b36SAndroid Build Coastguard Worker		my_app_enabled: {
4825*333d2b36SAndroid Build Coastguard Worker			enabled: true,
4826*333d2b36SAndroid Build Coastguard Worker			conditions_default: {
4827*333d2b36SAndroid Build Coastguard Worker				enabled: false
4828*333d2b36SAndroid Build Coastguard Worker			},
4829*333d2b36SAndroid Build Coastguard Worker		},
4830*333d2b36SAndroid Build Coastguard Worker	}
4831*333d2b36SAndroid Build Coastguard Worker}
4832*333d2b36SAndroid Build Coastguard Worker`
4833*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
4834*333d2b36SAndroid Build Coastguard Worker		desc               string
4835*333d2b36SAndroid Build Coastguard Worker		preparer           android.FixturePreparer
4836*333d2b36SAndroid Build Coastguard Worker		overlayApkExpected bool
4837*333d2b36SAndroid Build Coastguard Worker	}{
4838*333d2b36SAndroid Build Coastguard Worker		{
4839*333d2b36SAndroid Build Coastguard Worker			desc:               "my_app_enabled is empty",
4840*333d2b36SAndroid Build Coastguard Worker			overlayApkExpected: false,
4841*333d2b36SAndroid Build Coastguard Worker		},
4842*333d2b36SAndroid Build Coastguard Worker		{
4843*333d2b36SAndroid Build Coastguard Worker			desc:               "my_app_enabled is true",
4844*333d2b36SAndroid Build Coastguard Worker			overlayApkExpected: true,
4845*333d2b36SAndroid Build Coastguard Worker			preparer: android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4846*333d2b36SAndroid Build Coastguard Worker				variables.VendorVars = map[string]map[string]string{
4847*333d2b36SAndroid Build Coastguard Worker					"my_namespace": {
4848*333d2b36SAndroid Build Coastguard Worker						"my_app_enabled": "true",
4849*333d2b36SAndroid Build Coastguard Worker					},
4850*333d2b36SAndroid Build Coastguard Worker				}
4851*333d2b36SAndroid Build Coastguard Worker			}),
4852*333d2b36SAndroid Build Coastguard Worker		},
4853*333d2b36SAndroid Build Coastguard Worker	}
4854*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
4855*333d2b36SAndroid Build Coastguard Worker		result := android.GroupFixturePreparers(
4856*333d2b36SAndroid Build Coastguard Worker			PrepareForTestWithJavaDefaultModules,
4857*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithSoongConfigModuleBuildComponents,
4858*333d2b36SAndroid Build Coastguard Worker			android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4859*333d2b36SAndroid Build Coastguard Worker				variables.EnforceRROTargets = []string{"*"}
4860*333d2b36SAndroid Build Coastguard Worker			}),
4861*333d2b36SAndroid Build Coastguard Worker			android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4862*333d2b36SAndroid Build Coastguard Worker				variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4863*333d2b36SAndroid Build Coastguard Worker			}),
4864*333d2b36SAndroid Build Coastguard Worker			android.MockFS{
4865*333d2b36SAndroid Build Coastguard Worker				"res/foo.xml": nil,
4866*333d2b36SAndroid Build Coastguard Worker				"device/company/test_product/res/foo.xml": nil,
4867*333d2b36SAndroid Build Coastguard Worker			}.AddToFixture(),
4868*333d2b36SAndroid Build Coastguard Worker			android.OptionalFixturePreparer(tc.preparer),
4869*333d2b36SAndroid Build Coastguard Worker		).RunTestWithBp(t, bp)
4870*333d2b36SAndroid Build Coastguard Worker		overrideVendorOverlayApk := result.ModuleForTests("override_foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").Module().(*AutogenRuntimeResourceOverlay)
4871*333d2b36SAndroid Build Coastguard Worker		android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, overrideVendorOverlayApk.exportPackage != nil)
4872*333d2b36SAndroid Build Coastguard Worker	}
4873*333d2b36SAndroid Build Coastguard Worker}
4874