blob: bde801b32f64c5b17af63d4d5956c91f9789c8d7 [file] [log] [blame]
Colin Cross3bc7ffa2017-11-22 16:19:37 -08001// Copyright 2017 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package java
16
17import (
Colin Crossd09b0b62018-04-18 11:06:47 -070018 "fmt"
Colin Crossa4f08812018-10-02 22:03:40 -070019 "path/filepath"
Colin Cross3bc7ffa2017-11-22 16:19:37 -080020 "reflect"
Jiyong Parkf528b702024-12-30 16:01:58 +090021 "regexp"
Colin Crossb69301e2017-12-01 10:48:26 -080022 "sort"
Colin Crossd09b0b62018-04-18 11:06:47 -070023 "strings"
Colin Cross3bc7ffa2017-11-22 16:19:37 -080024 "testing"
Jaewoong Junga5e5abc2019-04-26 14:31:50 -070025
26 "github.com/google/blueprint/proptools"
27
28 "android/soong/android"
29 "android/soong/cc"
Ulya Trafimovich9023b022021-03-22 16:02:28 +000030 "android/soong/dexpreopt"
Colin Cross3bc7ffa2017-11-22 16:19:37 -080031)
32
Paul Duffin71ae5942021-03-22 15:36:52 +000033// testApp runs tests using the prepareForJavaTest
Paul Duffin0ed42d32021-03-13 02:19:32 +000034//
35// See testJava for an explanation as to how to stop using this deprecated method.
36//
37// deprecated
38func testApp(t *testing.T, bp string) *android.TestContext {
39 t.Helper()
Paul Duffin71ae5942021-03-22 15:36:52 +000040 result := prepareForJavaTest.RunTestWithBp(t, bp)
Paul Duffin0ed42d32021-03-13 02:19:32 +000041 return result.TestContext
42}
43
44func TestApp(t *testing.T) {
45 resourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080046 "res/layout/layout.xml",
47 "res/values/strings.xml",
48 "res/values-en-rUS/strings.xml",
49 }
50
Paul Duffin0ed42d32021-03-13 02:19:32 +000051 compiledResourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080052 "aapt2/res/layout_layout.xml.flat",
53 "aapt2/res/values_strings.arsc.flat",
54 "aapt2/res/values-en-rUS_strings.arsc.flat",
55 }
Colin Cross3bc7ffa2017-11-22 16:19:37 -080056
Colin Crossa97c5d32018-03-28 14:58:31 -070057 for _, moduleType := range []string{"android_app", "android_library"} {
58 t.Run(moduleType, func(t *testing.T) {
Paul Duffin71ae5942021-03-22 15:36:52 +000059 result := android.GroupFixturePreparers(
60 prepareForJavaTest,
Paul Duffin0ed42d32021-03-13 02:19:32 +000061 android.FixtureModifyMockFS(func(fs android.MockFS) {
62 for _, file := range resourceFiles {
63 fs[file] = nil
64 }
65 }),
66 ).RunTestWithBp(t, moduleType+` {
Colin Crossa97c5d32018-03-28 14:58:31 -070067 name: "foo",
68 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090069 sdk_version: "current"
Colin Crossa97c5d32018-03-28 14:58:31 -070070 }
71 `)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080072
Paul Duffin0ed42d32021-03-13 02:19:32 +000073 foo := result.ModuleForTests("foo", "android_common")
Colin Cross3bc7ffa2017-11-22 16:19:37 -080074
Colin Cross31656952018-05-24 16:11:20 -070075 var expectedLinkImplicits []string
76
77 manifestFixer := foo.Output("manifest_fixer/AndroidManifest.xml")
78 expectedLinkImplicits = append(expectedLinkImplicits, manifestFixer.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080079
Paul Duffin0ed42d32021-03-13 02:19:32 +000080 frameworkRes := result.ModuleForTests("framework-res", "android_common")
Colin Crossa97c5d32018-03-28 14:58:31 -070081 expectedLinkImplicits = append(expectedLinkImplicits,
82 frameworkRes.Output("package-res.apk").Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080083
Colin Crossa97c5d32018-03-28 14:58:31 -070084 // Test the mapping from input files to compiled output file names
85 compile := foo.Output(compiledResourceFiles[0])
Paul Duffin0ed42d32021-03-13 02:19:32 +000086 android.AssertDeepEquals(t, "aapt2 compile inputs", resourceFiles, compile.Inputs.Strings())
Colin Crossb69301e2017-12-01 10:48:26 -080087
Colin Crossa97c5d32018-03-28 14:58:31 -070088 compiledResourceOutputs := compile.Outputs.Strings()
89 sort.Strings(compiledResourceOutputs)
Colin Crossb69301e2017-12-01 10:48:26 -080090
Colin Crossa97c5d32018-03-28 14:58:31 -070091 expectedLinkImplicits = append(expectedLinkImplicits, compiledResourceOutputs...)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080092
Colin Crossa97c5d32018-03-28 14:58:31 -070093 list := foo.Output("aapt2/res.list")
94 expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080095
Colin Crossa97c5d32018-03-28 14:58:31 -070096 // Check that the link rule uses
Paul Duffin0ed42d32021-03-13 02:19:32 +000097 res := result.ModuleForTests("foo", "android_common").Output("package-res.apk")
98 android.AssertDeepEquals(t, "aapt2 link implicits", expectedLinkImplicits, res.Implicits.Strings())
Colin Crossa97c5d32018-03-28 14:58:31 -070099 })
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800100 }
101}
Colin Cross890ff552017-11-30 20:13:19 -0800102
Colin Crosse560c4a2019-03-19 16:03:11 -0700103func TestAppSplits(t *testing.T) {
104 ctx := testApp(t, `
105 android_app {
106 name: "foo",
107 srcs: ["a.java"],
108 package_splits: ["v4", "v7,hdpi"],
Jeongik Cha538c0d02019-07-11 15:54:27 +0900109 sdk_version: "current"
Colin Crosse560c4a2019-03-19 16:03:11 -0700110 }`)
111
112 foo := ctx.ModuleForTests("foo", "android_common")
113
114 expectedOutputs := []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000115 "out/soong/.intermediates/foo/android_common/foo.apk",
116 "out/soong/.intermediates/foo/android_common/foo_v4.apk",
117 "out/soong/.intermediates/foo/android_common/foo_v7_hdpi.apk",
Colin Crosse560c4a2019-03-19 16:03:11 -0700118 }
119 for _, expectedOutput := range expectedOutputs {
120 foo.Output(expectedOutput)
121 }
122
Yu Liu51c22312024-08-20 23:56:15 +0000123 outputFiles := foo.OutputFiles(ctx, t, "")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000124 android.AssertPathsRelativeToTopEquals(t, `OutputFiles("")`, expectedOutputs, outputFiles)
Colin Crosse560c4a2019-03-19 16:03:11 -0700125}
126
Jeongik Cha538c0d02019-07-11 15:54:27 +0900127func TestPlatformAPIs(t *testing.T) {
128 testJava(t, `
129 android_app {
130 name: "foo",
131 srcs: ["a.java"],
132 platform_apis: true,
133 }
134 `)
135
136 testJava(t, `
137 android_app {
138 name: "foo",
139 srcs: ["a.java"],
140 sdk_version: "current",
141 }
142 `)
143
Spandan Das60999342021-11-16 04:15:33 +0000144 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", `
Jeongik Cha538c0d02019-07-11 15:54:27 +0900145 android_app {
146 name: "bar",
147 srcs: ["b.java"],
148 }
149 `)
150
Spandan Das60999342021-11-16 04:15:33 +0000151 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.", `
Jeongik Cha538c0d02019-07-11 15:54:27 +0900152 android_app {
153 name: "bar",
154 srcs: ["b.java"],
155 sdk_version: "system_current",
156 platform_apis: true,
157 }
158 `)
159}
160
Jeongik Chae403e9e2019-12-07 00:16:24 +0900161func TestAndroidAppLinkType(t *testing.T) {
162 testJava(t, `
163 android_app {
164 name: "foo",
165 srcs: ["a.java"],
166 libs: ["bar"],
167 static_libs: ["baz"],
168 platform_apis: true,
169 }
170
171 java_library {
172 name: "bar",
173 sdk_version: "current",
174 srcs: ["b.java"],
175 }
176
177 android_library {
178 name: "baz",
179 sdk_version: "system_current",
180 srcs: ["c.java"],
181 }
182 `)
183
Steven Moreland00298982020-11-17 21:44:36 +0000184 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900185 android_app {
186 name: "foo",
187 srcs: ["a.java"],
188 libs: ["bar"],
189 sdk_version: "current",
190 static_libs: ["baz"],
191 }
192
193 java_library {
194 name: "bar",
195 sdk_version: "current",
196 srcs: ["b.java"],
197 }
198
199 android_library {
200 name: "baz",
201 sdk_version: "system_current",
202 srcs: ["c.java"],
203 }
204 `)
205
206 testJava(t, `
207 android_app {
208 name: "foo",
209 srcs: ["a.java"],
210 libs: ["bar"],
211 sdk_version: "system_current",
212 static_libs: ["baz"],
213 }
214
215 java_library {
216 name: "bar",
217 sdk_version: "current",
218 srcs: ["b.java"],
219 }
220
221 android_library {
222 name: "baz",
223 sdk_version: "system_current",
224 srcs: ["c.java"],
225 }
226 `)
227
Steven Moreland00298982020-11-17 21:44:36 +0000228 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900229 android_app {
230 name: "foo",
231 srcs: ["a.java"],
232 libs: ["bar"],
233 sdk_version: "system_current",
234 static_libs: ["baz"],
235 }
236
237 java_library {
238 name: "bar",
239 sdk_version: "current",
240 srcs: ["b.java"],
241 }
242
243 android_library {
244 name: "baz",
245 srcs: ["c.java"],
246 }
247 `)
248}
249
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100250func TestUpdatableApps(t *testing.T) {
251 testCases := []struct {
252 name string
253 bp string
254 expectedError string
255 }{
256 {
257 name: "Stable public SDK",
258 bp: `android_app {
259 name: "foo",
260 srcs: ["a.java"],
261 sdk_version: "29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100262 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100263 updatable: true,
264 }`,
265 },
266 {
267 name: "Stable system SDK",
268 bp: `android_app {
269 name: "foo",
270 srcs: ["a.java"],
271 sdk_version: "system_29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100272 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100273 updatable: true,
274 }`,
275 },
276 {
277 name: "Current public SDK",
278 bp: `android_app {
279 name: "foo",
280 srcs: ["a.java"],
281 sdk_version: "current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100282 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100283 updatable: true,
284 }`,
285 },
286 {
287 name: "Current system SDK",
288 bp: `android_app {
289 name: "foo",
290 srcs: ["a.java"],
291 sdk_version: "system_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100292 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100293 updatable: true,
294 }`,
295 },
296 {
297 name: "Current module SDK",
298 bp: `android_app {
299 name: "foo",
300 srcs: ["a.java"],
301 sdk_version: "module_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100302 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100303 updatable: true,
304 }`,
305 },
306 {
307 name: "Current core SDK",
308 bp: `android_app {
309 name: "foo",
310 srcs: ["a.java"],
311 sdk_version: "core_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100312 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100313 updatable: true,
314 }`,
315 },
316 {
317 name: "No Platform APIs",
318 bp: `android_app {
319 name: "foo",
320 srcs: ["a.java"],
321 platform_apis: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100322 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100323 updatable: true,
324 }`,
325 expectedError: "Updatable apps must use stable SDKs",
326 },
327 {
328 name: "No Core Platform APIs",
329 bp: `android_app {
330 name: "foo",
331 srcs: ["a.java"],
332 sdk_version: "core_platform",
Artur Satayevf40fc852020-04-16 13:43:02 +0100333 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100334 updatable: true,
335 }`,
336 expectedError: "Updatable apps must use stable SDKs",
337 },
338 {
339 name: "No unspecified APIs",
340 bp: `android_app {
341 name: "foo",
342 srcs: ["a.java"],
343 updatable: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100344 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100345 }`,
346 expectedError: "Updatable apps must use stable SDK",
347 },
Artur Satayevf40fc852020-04-16 13:43:02 +0100348 {
349 name: "Must specify min_sdk_version",
350 bp: `android_app {
351 name: "app_without_min_sdk_version",
352 srcs: ["a.java"],
353 sdk_version: "29",
354 updatable: true,
355 }`,
356 expectedError: "updatable apps must set min_sdk_version.",
357 },
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100358 }
359
360 for _, test := range testCases {
361 t.Run(test.name, func(t *testing.T) {
Paul Duffincdb88a92021-03-14 00:36:50 +0000362 errorHandler := android.FixtureExpectsNoErrors
363 if test.expectedError != "" {
364 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100365 }
Paul Duffin71ae5942021-03-22 15:36:52 +0000366 android.GroupFixturePreparers(
367 prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{
Paul Duffin2645a292021-03-13 02:36:00 +0000368 "29": {"foo"},
369 })).
Paul Duffincdb88a92021-03-14 00:36:50 +0000370 ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, test.bp)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100371 })
372 }
373}
374
Jooyung Han749dc692020-04-15 11:03:39 +0900375func TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) {
376 testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+`
377 android_app {
378 name: "foo",
379 srcs: ["a.java"],
380 updatable: true,
381 sdk_version: "current",
382 min_sdk_version: "29",
383 static_libs: ["bar"],
384 }
385
386 java_library {
387 name: "bar",
388 sdk_version: "current",
389 }
390 `)
391}
392
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900393func TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) {
394 testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
395 android_app {
396 name: "foo",
397 srcs: ["a.java"],
398 updatable: true,
399 sdk_version: "current",
400 min_sdk_version: "current",
401 jni_libs: ["libjni"],
402 }
403
404 cc_library {
405 name: "libjni",
406 stl: "none",
407 system_shared_libs: [],
408 sdk_version: "current",
409 }
410 `)
411}
412
413func TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) {
414 bp := cc.GatherRequiredDepsForTest(android.Android) + `
415 android_app {
416 name: "foo",
417 srcs: ["a.java"],
418 updatable: true,
419 sdk_version: "current",
420 min_sdk_version: "29",
421 jni_libs: ["libjni"],
422 }
423
424 cc_library {
425 name: "libjni",
426 stl: "none",
427 system_shared_libs: [],
Spandan Das2e8c0442022-05-08 00:39:35 +0000428 sdk_version: "current",
429 min_sdk_version: "29",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900430 }
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900431 `
432 fs := map[string][]byte{
433 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
434 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil,
435 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil,
436 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil,
437 }
438
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000439 ctx, _ := testJavaWithFS(t, bp, fs)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900440
441 inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
442 var crtbeginFound, crtendFound bool
Dan Albert92fe7402020-07-15 13:33:30 -0700443 expectedCrtBegin := ctx.ModuleForTests("crtbegin_so",
Colin Crossdea1d032022-12-06 14:50:08 -0800444 "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
Dan Albert92fe7402020-07-15 13:33:30 -0700445 expectedCrtEnd := ctx.ModuleForTests("crtend_so",
Colin Crossdea1d032022-12-06 14:50:08 -0800446 "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
Dan Albert92fe7402020-07-15 13:33:30 -0700447 implicits := []string{}
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900448 for _, input := range inputs {
Dan Albert92fe7402020-07-15 13:33:30 -0700449 implicits = append(implicits, input.String())
450 if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900451 crtbeginFound = true
Dan Albert92fe7402020-07-15 13:33:30 -0700452 } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900453 crtendFound = true
454 }
455 }
Dan Albert92fe7402020-07-15 13:33:30 -0700456 if !crtbeginFound {
457 t.Error(fmt.Sprintf(
458 "expected implicit with suffix %q, have the following implicits:\n%s",
459 expectedCrtBegin, strings.Join(implicits, "\n")))
460 }
461 if !crtendFound {
462 t.Error(fmt.Sprintf(
463 "expected implicit with suffix %q, have the following implicits:\n%s",
464 expectedCrtEnd, strings.Join(implicits, "\n")))
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900465 }
466}
467
468func TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
469 bp := cc.GatherRequiredDepsForTest(android.Android) + `
470 android_app {
471 name: "foo",
472 srcs: ["a.java"],
473 updatable: true,
474 sdk_version: "current",
475 min_sdk_version: "29", // this APK should support 29
476 jni_libs: ["libjni"],
477 }
478
479 cc_library {
480 name: "libjni",
481 stl: "none",
482 sdk_version: "current",
Spandan Das2e8c0442022-05-08 00:39:35 +0000483 min_sdk_version: "current",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900484 }
485 `
Spandan Das2e8c0442022-05-08 00:39:35 +0000486 testJavaError(t, `"libjni" .*: min_sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900487}
488
Spandan Das2e8c0442022-05-08 00:39:35 +0000489func TestUpdatableApps_ErrorIfDepMinSdkVersionIsHigher(t *testing.T) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900490 bp := cc.GatherRequiredDepsForTest(android.Android) + `
491 android_app {
492 name: "foo",
493 srcs: ["a.java"],
494 updatable: true,
495 sdk_version: "current",
496 min_sdk_version: "29", // this APK should support 29
497 jni_libs: ["libjni"],
498 }
499
500 cc_library {
501 name: "libjni",
502 stl: "none",
503 shared_libs: ["libbar"],
504 system_shared_libs: [],
505 sdk_version: "27",
Spandan Das2e8c0442022-05-08 00:39:35 +0000506 min_sdk_version: "27",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900507 }
508
509 cc_library {
510 name: "libbar",
511 stl: "none",
512 system_shared_libs: [],
513 sdk_version: "current",
Spandan Das2e8c0442022-05-08 00:39:35 +0000514 min_sdk_version: "current",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900515 }
516 `
517 testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
518}
519
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +0000520func TestUpdatableApps_ApplyDefaultUpdatableModuleVersion(t *testing.T) {
521 result := android.GroupFixturePreparers(
522 PrepareForTestWithJavaDefaultModules,
523 ).RunTestWithBp(t, `
524 android_app {
525 name: "com.android.foo",
526 srcs: ["a.java"],
527 sdk_version: "current",
528 min_sdk_version: "31",
529 updatable: true,
530 }
531 `)
532 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
533 android.AssertStringDoesContain(t,
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +0000534 "com.android.foo: expected manifest fixer to set override-placeholder-version to RELEASE_DEFAULT_UPDATABLE_MODULE_VERSION",
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +0000535 foo.BuildParams.Args["args"],
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +0000536 fmt.Sprintf("--override-placeholder-version %s", testDefaultUpdatableModuleVersion),
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +0000537 )
538}
539
540func TestUpdatableApps_ApplyOverrideApexManifestDefaultVersion(t *testing.T) {
541 result := android.GroupFixturePreparers(
542 PrepareForTestWithJavaDefaultModules,
543 android.FixtureMergeEnv(map[string]string{
544 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
545 }),
546 ).RunTestWithBp(t, `
547 android_app {
548 name: "com.android.foo",
549 srcs: ["a.java"],
550 sdk_version: "current",
551 min_sdk_version: "31",
552 updatable: true,
553 }
554 `)
555 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
556 android.AssertStringDoesContain(t,
557 "com.android.foo: expected manifest fixer to set override-placeholder-version to 1234",
558 foo.BuildParams.Args["args"],
559 "--override-placeholder-version 1234",
560 )
561}
562
Colin Cross0ddae7f2019-02-07 15:30:01 -0800563func TestResourceDirs(t *testing.T) {
564 testCases := []struct {
565 name string
566 prop string
567 resources []string
568 }{
569 {
570 name: "no resource_dirs",
571 prop: "",
572 resources: []string{"res/res/values/strings.xml"},
573 },
574 {
575 name: "resource_dirs",
576 prop: `resource_dirs: ["res"]`,
577 resources: []string{"res/res/values/strings.xml"},
578 },
579 {
580 name: "empty resource_dirs",
581 prop: `resource_dirs: []`,
582 resources: nil,
583 },
584 }
585
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000586 fs := android.MockFS{
Colin Cross0ddae7f2019-02-07 15:30:01 -0800587 "res/res/values/strings.xml": nil,
588 }
589
590 bp := `
591 android_app {
592 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900593 sdk_version: "current",
Colin Cross0ddae7f2019-02-07 15:30:01 -0800594 %s
595 }
596 `
597
598 for _, testCase := range testCases {
599 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000600 result := android.GroupFixturePreparers(
601 PrepareForTestWithJavaDefaultModules,
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000602 fs.AddToFixture(),
603 ).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop))
Colin Cross0ddae7f2019-02-07 15:30:01 -0800604
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000605 module := result.ModuleForTests("foo", "android_common")
Colin Cross0ddae7f2019-02-07 15:30:01 -0800606 resourceList := module.MaybeOutput("aapt2/res.list")
607
608 var resources []string
609 if resourceList.Rule != nil {
610 for _, compiledResource := range resourceList.Inputs.Strings() {
611 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
612 }
613 }
614
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000615 android.AssertDeepEquals(t, "resource files", testCase.resources, resources)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800616 })
617 }
618}
619
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800620func TestLibraryAssets(t *testing.T) {
621 bp := `
622 android_app {
623 name: "foo",
624 sdk_version: "current",
625 static_libs: ["lib1", "lib2", "lib3"],
626 }
627
628 android_library {
629 name: "lib1",
630 sdk_version: "current",
631 asset_dirs: ["assets_a"],
632 }
633
634 android_library {
635 name: "lib2",
636 sdk_version: "current",
637 }
638
639 android_library {
640 name: "lib3",
641 sdk_version: "current",
Colin Crossab8d1382023-07-14 17:23:41 +0000642 static_libs: ["lib4", "import"],
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800643 }
644
645 android_library {
646 name: "lib4",
647 sdk_version: "current",
648 asset_dirs: ["assets_b"],
649 }
Colin Crossab8d1382023-07-14 17:23:41 +0000650
Jiakai Zhangba82e282023-10-13 18:08:59 +0100651 android_library {
652 name: "lib5",
653 sdk_version: "current",
654 assets: [
655 "path/to/asset_file_1",
656 "path/to/asset_file_2",
657 ],
658 }
659
Colin Crossab8d1382023-07-14 17:23:41 +0000660 android_library_import {
661 name: "import",
662 sdk_version: "current",
663 aars: ["import.aar"],
664 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800665 `
666
667 testCases := []struct {
Jiakai Zhangba82e282023-10-13 18:08:59 +0100668 name string
669 assetFlag string
670 assetPackages []string
671 tmpAssetDirInputs []string
672 tmpAssetDirOutputs []string
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800673 }{
674 {
675 name: "foo",
Colin Crossab8d1382023-07-14 17:23:41 +0000676 // lib1 has its own assets. lib3 doesn't have any, but lib4 and import have assets.
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800677 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000678 "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
679 "out/soong/.intermediates/lib1/android_common/assets.zip",
Colin Crossab8d1382023-07-14 17:23:41 +0000680 "out/soong/.intermediates/lib4/android_common/assets.zip",
681 "out/soong/.intermediates/import/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800682 },
683 },
684 {
685 name: "lib1",
686 assetFlag: "-A assets_a",
687 },
688 {
689 name: "lib2",
690 },
691 {
692 name: "lib3",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800693 },
694 {
695 name: "lib4",
696 assetFlag: "-A assets_b",
697 },
Jiakai Zhangba82e282023-10-13 18:08:59 +0100698 {
699 name: "lib5",
700 assetFlag: "-A out/soong/.intermediates/lib5/android_common/tmp_asset_dir",
701 tmpAssetDirInputs: []string{
702 "path/to/asset_file_1",
703 "path/to/asset_file_2",
704 },
705 tmpAssetDirOutputs: []string{
706 "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_1",
707 "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_2",
708 },
709 },
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800710 }
711 ctx := testApp(t, bp)
712
713 for _, test := range testCases {
714 t.Run(test.name, func(t *testing.T) {
715 m := ctx.ModuleForTests(test.name, "android_common")
716
717 // Check asset flag in aapt2 link flags
718 var aapt2link android.TestingBuildParams
719 if len(test.assetPackages) > 0 {
720 aapt2link = m.Output("aapt2/package-res.apk")
721 } else {
722 aapt2link = m.Output("package-res.apk")
723 }
Paul Duffina71a67a2021-03-29 00:42:57 +0100724 aapt2link = aapt2link
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800725 aapt2Flags := aapt2link.Args["flags"]
726 if test.assetFlag != "" {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000727 android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800728 } else {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000729 android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800730 }
731
732 // Check asset merge rule.
733 if len(test.assetPackages) > 0 {
734 mergeAssets := m.Output("package-res.apk")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000735 android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800736 }
Jiakai Zhangba82e282023-10-13 18:08:59 +0100737
738 if len(test.tmpAssetDirInputs) > 0 {
739 rule := m.Rule("tmp_asset_dir")
740 inputs := rule.Implicits
741 outputs := append(android.WritablePaths{rule.Output}, rule.ImplicitOutputs...).Paths()
742 android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir inputs", test.tmpAssetDirInputs, inputs)
743 android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir outputs", test.tmpAssetDirOutputs, outputs)
744 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800745 })
746 }
747}
748
Colin Crossb014f072021-02-26 14:54:36 -0800749func TestAppJavaResources(t *testing.T) {
750 bp := `
751 android_app {
752 name: "foo",
753 sdk_version: "current",
754 java_resources: ["resources/a"],
755 srcs: ["a.java"],
756 }
757
758 android_app {
759 name: "bar",
760 sdk_version: "current",
761 java_resources: ["resources/a"],
762 }
763 `
764
765 ctx := testApp(t, bp)
766
767 foo := ctx.ModuleForTests("foo", "android_common")
768 fooResources := foo.Output("res/foo.jar")
769 fooDexJar := foo.Output("dex-withres/foo.jar")
770 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
771 fooApk := foo.Rule("combineApk")
772
773 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
774 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
775 }
776
777 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
778 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
779 }
780
781 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
782 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
783 }
784
785 bar := ctx.ModuleForTests("bar", "android_common")
786 barResources := bar.Output("res/bar.jar")
787 barApk := bar.Rule("combineApk")
788
789 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
790 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
791 }
792}
793
Colin Crossff3ff7f2023-07-05 14:04:12 -0700794func TestAndroidResourceProcessor(t *testing.T) {
795 testCases := []struct {
Colin Cross8676c8c2023-10-12 15:58:57 -0700796 name string
797 appUsesRP bool
798 directLibUsesRP bool
799 transitiveLibUsesRP bool
800 sharedLibUsesRP bool
801 sharedTransitiveStaticLibUsesRP bool
802 sharedTransitiveSharedLibUsesRP bool
Colin Crossff3ff7f2023-07-05 14:04:12 -0700803
804 dontVerifyApp bool
805 appResources []string
806 appOverlays []string
807 appImports []string
808 appSrcJars []string
809 appClasspath []string
810 appCombined []string
811
812 dontVerifyDirect bool
813 directResources []string
814 directOverlays []string
815 directImports []string
816 directSrcJars []string
817 directClasspath []string
818 directCombined []string
819
820 dontVerifyTransitive bool
821 transitiveResources []string
822 transitiveOverlays []string
823 transitiveImports []string
824 transitiveSrcJars []string
825 transitiveClasspath []string
826 transitiveCombined []string
827
828 dontVerifyDirectImport bool
829 directImportResources []string
830 directImportOverlays []string
831 directImportImports []string
832
833 dontVerifyTransitiveImport bool
834 transitiveImportResources []string
835 transitiveImportOverlays []string
836 transitiveImportImports []string
Colin Cross8676c8c2023-10-12 15:58:57 -0700837
838 dontVerifyShared bool
839 sharedResources []string
840 sharedOverlays []string
841 sharedImports []string
842 sharedSrcJars []string
843 sharedClasspath []string
844 sharedCombined []string
Colin Crossff3ff7f2023-07-05 14:04:12 -0700845 }{
846 {
Colin Cross4eae06d2023-06-20 22:40:02 -0700847 // Test with all modules set to use_resource_processor: false (except android_library_import modules,
848 // which always use resource processor).
849 name: "legacy",
850 appUsesRP: false,
851 directLibUsesRP: false,
852 transitiveLibUsesRP: false,
Colin Crossff3ff7f2023-07-05 14:04:12 -0700853
854 appResources: nil,
855 appOverlays: []string{
856 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000857 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700858 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
859 "out/soong/.intermediates/direct/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000860 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700861 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
862 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
863 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700864 appImports: []string{
865 "out/soong/.intermediates/shared/android_common/package-res.apk",
866 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
867 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700868 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
869 appClasspath: []string{
870 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700871 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700872 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000873 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700874 },
875 appCombined: []string{
876 "out/soong/.intermediates/app/android_common/javac/app.jar",
877 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000878 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700879 },
880
881 directResources: nil,
882 directOverlays: []string{
883 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000884 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700885 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
886 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
887 },
888 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
889 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
890 directClasspath: []string{
891 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
892 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000893 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700894 },
895 directCombined: []string{
896 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
897 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000898 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700899 },
900
901 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
902 transitiveOverlays: nil,
903 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
904 transitiveSrcJars: []string{"out/soong/.intermediates/transitive/android_common/gen/android/R.srcjar"},
905 transitiveClasspath: []string{"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar"},
906 transitiveCombined: nil,
907
Colin Cross8676c8c2023-10-12 15:58:57 -0700908 sharedResources: nil,
909 sharedOverlays: []string{
910 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
911 "out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat",
912 },
913 sharedImports: []string{
914 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
915 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
916 },
917 sharedSrcJars: []string{"out/soong/.intermediates/shared/android_common/gen/android/R.srcjar"},
918 sharedClasspath: []string{
919 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
920 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar",
921 "out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar",
922 },
923 sharedCombined: []string{
924 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
925 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
926 },
927
Colin Crossff3ff7f2023-07-05 14:04:12 -0700928 directImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700929 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
930 directImportImports: []string{
931 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700932 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
933 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700934
935 transitiveImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700936 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
937 transitiveImportImports: []string{
938 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700939 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
940 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700941 },
942 {
943 // Test with all modules set to use_resource_processor: true.
Colin Cross8676c8c2023-10-12 15:58:57 -0700944 name: "resource_processor",
945 appUsesRP: true,
946 directLibUsesRP: true,
947 transitiveLibUsesRP: true,
948 sharedLibUsesRP: true,
949 sharedTransitiveSharedLibUsesRP: true,
950 sharedTransitiveStaticLibUsesRP: true,
Colin Cross4eae06d2023-06-20 22:40:02 -0700951
952 appResources: nil,
953 appOverlays: []string{
954 "out/soong/.intermediates/transitive/android_common/package-res.apk",
955 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
956 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
957 "out/soong/.intermediates/direct/android_common/package-res.apk",
958 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
959 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
960 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
961 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700962 appImports: []string{
963 "out/soong/.intermediates/shared/android_common/package-res.apk",
964 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
965 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700966 appSrcJars: nil,
967 appClasspath: []string{
968 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
969 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700970 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700971 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000972 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700973 },
974 appCombined: []string{
Colin Cross4eae06d2023-06-20 22:40:02 -0700975 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Crossfd620b22024-02-23 10:05:21 -0800976 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700977 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000978 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700979 },
980
981 directResources: nil,
982 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
983 directImports: []string{
984 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
985 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
986 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
987 "out/soong/.intermediates/transitive/android_common/package-res.apk",
988 },
989 directSrcJars: nil,
990 directClasspath: []string{
991 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700992 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -0800993 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
994 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
995 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700996 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000997 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700998 },
999 directCombined: []string{
1000 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1001 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001002 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001003 },
1004
1005 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1006 transitiveOverlays: nil,
1007 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1008 transitiveSrcJars: nil,
1009 transitiveClasspath: []string{
1010 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1011 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1012 },
1013 transitiveCombined: nil,
1014
Colin Cross8676c8c2023-10-12 15:58:57 -07001015 sharedResources: nil,
1016 sharedOverlays: []string{"out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat"},
1017 sharedImports: []string{
1018 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
1019 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1020 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
1021 },
1022 sharedSrcJars: nil,
1023 sharedClasspath: []string{
1024 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -08001025 "out/soong/.intermediates/shared/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001026 "out/soong/.intermediates/shared_transitive_static/android_common/busybox/R.jar",
1027 "out/soong/.intermediates/shared_transitive_shared/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001028 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar",
1029 "out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar",
1030 },
1031 sharedCombined: []string{
1032 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
1033 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
1034 },
1035
Colin Cross4eae06d2023-06-20 22:40:02 -07001036 directImportResources: nil,
1037 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
1038 directImportImports: []string{
1039 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1040 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1041 },
1042
1043 transitiveImportResources: nil,
1044 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
1045 transitiveImportImports: []string{
1046 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1047 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1048 },
1049 }, {
1050 // Test an app building with resource processor enabled but with dependencies built without
1051 // resource processor.
1052 name: "app_resource_processor",
1053 appUsesRP: true,
1054 directLibUsesRP: false,
1055 transitiveLibUsesRP: false,
1056
1057 appResources: nil,
1058 appOverlays: []string{
1059 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1060 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1061 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1062 "out/soong/.intermediates/direct/android_common/package-res.apk",
1063 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1064 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1065 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1066 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001067 appImports: []string{
1068 "out/soong/.intermediates/shared/android_common/package-res.apk",
1069 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1070 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001071 appSrcJars: nil,
1072 appClasspath: []string{
1073 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1074 // R.jar has to come before direct.jar
1075 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001076 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001077 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001078 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001079 },
1080 appCombined: []string{
Colin Cross4eae06d2023-06-20 22:40:02 -07001081 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Crossfd620b22024-02-23 10:05:21 -08001082 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001083 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001084 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001085 },
1086
1087 dontVerifyDirect: true,
1088 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001089 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001090 dontVerifyDirectImport: true,
1091 dontVerifyTransitiveImport: true,
1092 },
1093 {
1094 // Test an app building without resource processor enabled but with a dependency built with
1095 // resource processor.
1096 name: "app_dependency_lib_resource_processor",
1097 appUsesRP: false,
1098 directLibUsesRP: true,
1099 transitiveLibUsesRP: false,
1100
1101 appOverlays: []string{
1102 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1103 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1104 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1105 "out/soong/.intermediates/direct/android_common/package-res.apk",
1106 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1107 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1108 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1109 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001110 appImports: []string{
1111 "out/soong/.intermediates/shared/android_common/package-res.apk",
1112 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1113 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001114 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1115 appClasspath: []string{
1116 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001117 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001118 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001119 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001120 },
1121 appCombined: []string{
1122 "out/soong/.intermediates/app/android_common/javac/app.jar",
1123 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001124 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001125 },
1126
1127 directResources: nil,
1128 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
1129 directImports: []string{
1130 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1131 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1132 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1133 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1134 },
1135 directSrcJars: nil,
1136 directClasspath: []string{
1137 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001138 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -08001139 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
1140 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001141 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001142 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001143 },
1144 directCombined: []string{
1145 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1146 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001147 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001148 },
1149
1150 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001151 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001152 dontVerifyDirectImport: true,
1153 dontVerifyTransitiveImport: true,
1154 },
1155 {
1156 // Test a library building without resource processor enabled but with a dependency built with
1157 // resource processor.
1158 name: "lib_dependency_lib_resource_processor",
1159 appUsesRP: false,
1160 directLibUsesRP: false,
1161 transitiveLibUsesRP: true,
1162
1163 appOverlays: []string{
1164 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1165 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1166 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1167 "out/soong/.intermediates/direct/android_common/package-res.apk",
1168 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1169 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1170 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1171 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001172 appImports: []string{
1173 "out/soong/.intermediates/shared/android_common/package-res.apk",
1174 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1175 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001176 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1177 appClasspath: []string{
1178 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001179 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001180 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001181 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001182 },
1183 appCombined: []string{
1184 "out/soong/.intermediates/app/android_common/javac/app.jar",
1185 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001186 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001187 },
1188
1189 directResources: nil,
1190 directOverlays: []string{
1191 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1192 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1193 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1194 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
1195 },
1196 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1197 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
1198 directClasspath: []string{
1199 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1200 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001201 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001202 },
1203 directCombined: []string{
1204 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1205 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001206 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001207 },
1208
1209 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1210 transitiveOverlays: nil,
1211 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1212 transitiveSrcJars: nil,
1213 transitiveClasspath: []string{
1214 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1215 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1216 },
1217 transitiveCombined: nil,
1218
Colin Cross8676c8c2023-10-12 15:58:57 -07001219 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001220 dontVerifyDirectImport: true,
1221 dontVerifyTransitiveImport: true,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001222 },
1223 }
1224
1225 for _, testCase := range testCases {
1226 t.Run(testCase.name, func(t *testing.T) {
1227 bp := fmt.Sprintf(`
1228 android_app {
1229 name: "app",
1230 sdk_version: "current",
1231 srcs: ["app/app.java"],
1232 resource_dirs: ["app/res"],
1233 manifest: "app/AndroidManifest.xml",
Colin Cross8676c8c2023-10-12 15:58:57 -07001234 libs: ["shared"],
Colin Crossff3ff7f2023-07-05 14:04:12 -07001235 static_libs: ["direct", "direct_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001236 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001237 }
1238
1239 android_library {
1240 name: "direct",
1241 sdk_version: "current",
1242 srcs: ["direct/direct.java"],
1243 resource_dirs: ["direct/res"],
1244 manifest: "direct/AndroidManifest.xml",
1245 static_libs: ["transitive", "transitive_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001246 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001247 }
1248
1249 android_library {
1250 name: "transitive",
1251 sdk_version: "current",
1252 srcs: ["transitive/transitive.java"],
1253 resource_dirs: ["transitive/res"],
1254 manifest: "transitive/AndroidManifest.xml",
Colin Cross4eae06d2023-06-20 22:40:02 -07001255 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001256 }
1257
Colin Cross8676c8c2023-10-12 15:58:57 -07001258 android_library {
1259 name: "shared",
1260 sdk_version: "current",
1261 srcs: ["shared/shared.java"],
1262 resource_dirs: ["shared/res"],
1263 manifest: "shared/AndroidManifest.xml",
1264 use_resource_processor: %v,
1265 libs: ["shared_transitive_shared"],
1266 static_libs: ["shared_transitive_static"],
1267 }
1268
1269 android_library {
1270 name: "shared_transitive_shared",
1271 sdk_version: "current",
1272 srcs: ["shared_transitive_shared/shared_transitive_shared.java"],
1273 resource_dirs: ["shared_transitive_shared/res"],
1274 manifest: "shared_transitive_shared/AndroidManifest.xml",
1275 use_resource_processor: %v,
1276 }
1277
1278 android_library {
1279 name: "shared_transitive_static",
1280 sdk_version: "current",
1281 srcs: ["shared_transitive_static/shared.java"],
1282 resource_dirs: ["shared_transitive_static/res"],
1283 manifest: "shared_transitive_static/AndroidManifest.xml",
1284 use_resource_processor: %v,
1285 }
1286
Colin Crossff3ff7f2023-07-05 14:04:12 -07001287 android_library_import {
1288 name: "direct_import",
1289 sdk_version: "current",
1290 aars: ["direct_import.aar"],
1291 static_libs: ["direct_import_dep"],
1292 }
1293
1294 android_library_import {
1295 name: "direct_import_dep",
1296 sdk_version: "current",
1297 aars: ["direct_import_dep.aar"],
1298 }
1299
1300 android_library_import {
1301 name: "transitive_import",
1302 sdk_version: "current",
1303 aars: ["transitive_import.aar"],
1304 static_libs: ["transitive_import_dep"],
1305 }
1306
1307 android_library_import {
1308 name: "transitive_import_dep",
1309 sdk_version: "current",
1310 aars: ["transitive_import_dep.aar"],
1311 }
Colin Cross8676c8c2023-10-12 15:58:57 -07001312 `, testCase.appUsesRP, testCase.directLibUsesRP, testCase.transitiveLibUsesRP,
1313 testCase.sharedLibUsesRP, testCase.sharedTransitiveSharedLibUsesRP, testCase.sharedTransitiveStaticLibUsesRP)
Colin Crossff3ff7f2023-07-05 14:04:12 -07001314
1315 fs := android.MockFS{
Colin Cross8676c8c2023-10-12 15:58:57 -07001316 "app/res/values/strings.xml": nil,
1317 "direct/res/values/strings.xml": nil,
1318 "transitive/res/values/strings.xml": nil,
1319 "shared/res/values/strings.xml": nil,
1320 "shared_transitive_static/res/values/strings.xml": nil,
1321 "shared_transitive_shared/res/values/strings.xml": nil,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001322 }
1323
1324 result := android.GroupFixturePreparers(
1325 PrepareForTestWithJavaDefaultModules,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001326 fs.AddToFixture(),
1327 ).RunTestWithBp(t, bp)
1328
1329 type aaptInfo struct {
1330 resources, overlays, imports, srcJars, classpath, combined android.Paths
1331 }
1332
1333 getAaptInfo := func(moduleName string) (aaptInfo aaptInfo) {
1334 mod := result.ModuleForTests(moduleName, "android_common")
1335 resourceListRule := mod.MaybeOutput("aapt2/res.list")
1336 overlayListRule := mod.MaybeOutput("aapt2/overlay.list")
1337 aaptRule := mod.Rule("aapt2Link")
1338 javacRule := mod.MaybeRule("javac")
1339 combinedRule := mod.MaybeOutput("combined/" + moduleName + ".jar")
1340
1341 aaptInfo.resources = resourceListRule.Inputs
1342 aaptInfo.overlays = overlayListRule.Inputs
1343
1344 aaptFlags := strings.Split(aaptRule.Args["flags"], " ")
1345 for i, flag := range aaptFlags {
1346 if flag == "-I" && i+1 < len(aaptFlags) {
1347 aaptInfo.imports = append(aaptInfo.imports, android.PathForTesting(aaptFlags[i+1]))
1348 }
1349 }
1350
1351 if len(javacRule.Args["srcJars"]) > 0 {
1352 aaptInfo.srcJars = android.PathsForTesting(strings.Split(javacRule.Args["srcJars"], " ")...)
1353 }
1354
1355 if len(javacRule.Args["classpath"]) > 0 {
1356 classpathArg := strings.TrimPrefix(javacRule.Args["classpath"], "-classpath ")
1357 aaptInfo.classpath = android.PathsForTesting(strings.Split(classpathArg, ":")...)
1358 }
1359
1360 aaptInfo.combined = combinedRule.Inputs
1361 return
1362 }
1363
1364 app := getAaptInfo("app")
1365 direct := getAaptInfo("direct")
1366 transitive := getAaptInfo("transitive")
Colin Cross8676c8c2023-10-12 15:58:57 -07001367 shared := getAaptInfo("shared")
Colin Crossff3ff7f2023-07-05 14:04:12 -07001368 directImport := getAaptInfo("direct_import")
1369 transitiveImport := getAaptInfo("transitive_import")
1370
1371 if !testCase.dontVerifyApp {
1372 android.AssertPathsRelativeToTopEquals(t, "app resources", testCase.appResources, app.resources)
1373 android.AssertPathsRelativeToTopEquals(t, "app overlays", testCase.appOverlays, app.overlays)
1374 android.AssertPathsRelativeToTopEquals(t, "app imports", testCase.appImports, app.imports)
1375 android.AssertPathsRelativeToTopEquals(t, "app srcjars", testCase.appSrcJars, app.srcJars)
1376 android.AssertPathsRelativeToTopEquals(t, "app classpath", testCase.appClasspath, app.classpath)
1377 android.AssertPathsRelativeToTopEquals(t, "app combined", testCase.appCombined, app.combined)
1378 }
1379
1380 if !testCase.dontVerifyDirect {
1381 android.AssertPathsRelativeToTopEquals(t, "direct resources", testCase.directResources, direct.resources)
1382 android.AssertPathsRelativeToTopEquals(t, "direct overlays", testCase.directOverlays, direct.overlays)
1383 android.AssertPathsRelativeToTopEquals(t, "direct imports", testCase.directImports, direct.imports)
1384 android.AssertPathsRelativeToTopEquals(t, "direct srcjars", testCase.directSrcJars, direct.srcJars)
1385 android.AssertPathsRelativeToTopEquals(t, "direct classpath", testCase.directClasspath, direct.classpath)
1386 android.AssertPathsRelativeToTopEquals(t, "direct combined", testCase.directCombined, direct.combined)
1387 }
1388
1389 if !testCase.dontVerifyTransitive {
1390 android.AssertPathsRelativeToTopEquals(t, "transitive resources", testCase.transitiveResources, transitive.resources)
1391 android.AssertPathsRelativeToTopEquals(t, "transitive overlays", testCase.transitiveOverlays, transitive.overlays)
1392 android.AssertPathsRelativeToTopEquals(t, "transitive imports", testCase.transitiveImports, transitive.imports)
1393 android.AssertPathsRelativeToTopEquals(t, "transitive srcjars", testCase.transitiveSrcJars, transitive.srcJars)
1394 android.AssertPathsRelativeToTopEquals(t, "transitive classpath", testCase.transitiveClasspath, transitive.classpath)
1395 android.AssertPathsRelativeToTopEquals(t, "transitive combined", testCase.transitiveCombined, transitive.combined)
1396 }
1397
Colin Cross8676c8c2023-10-12 15:58:57 -07001398 if !testCase.dontVerifyShared {
1399 android.AssertPathsRelativeToTopEquals(t, "shared resources", testCase.sharedResources, shared.resources)
1400 android.AssertPathsRelativeToTopEquals(t, "shared overlays", testCase.sharedOverlays, shared.overlays)
1401 android.AssertPathsRelativeToTopEquals(t, "shared imports", testCase.sharedImports, shared.imports)
1402 android.AssertPathsRelativeToTopEquals(t, "shared srcjars", testCase.sharedSrcJars, shared.srcJars)
1403 android.AssertPathsRelativeToTopEquals(t, "shared classpath", testCase.sharedClasspath, shared.classpath)
1404 android.AssertPathsRelativeToTopEquals(t, "shared combined", testCase.sharedCombined, shared.combined)
1405 }
1406
Colin Crossff3ff7f2023-07-05 14:04:12 -07001407 if !testCase.dontVerifyDirectImport {
1408 android.AssertPathsRelativeToTopEquals(t, "direct_import resources", testCase.directImportResources, directImport.resources)
1409 android.AssertPathsRelativeToTopEquals(t, "direct_import overlays", testCase.directImportOverlays, directImport.overlays)
1410 android.AssertPathsRelativeToTopEquals(t, "direct_import imports", testCase.directImportImports, directImport.imports)
1411 }
1412
1413 if !testCase.dontVerifyTransitiveImport {
1414 android.AssertPathsRelativeToTopEquals(t, "transitive_import resources", testCase.transitiveImportResources, transitiveImport.resources)
1415 android.AssertPathsRelativeToTopEquals(t, "transitive_import overlays", testCase.transitiveImportOverlays, transitiveImport.overlays)
1416 android.AssertPathsRelativeToTopEquals(t, "transitive_import imports", testCase.transitiveImportImports, transitiveImport.imports)
1417 }
1418 })
1419 }
1420}
1421
1422func TestAndroidResourceOverlays(t *testing.T) {
Colin Crossc4441622024-09-18 14:55:49 -07001423 type moduleAndVariant struct {
1424 module string
1425 variant string
1426 }
1427
Colin Cross5c4791c2019-02-01 11:44:44 -08001428 testCases := []struct {
1429 name string
1430 enforceRROTargets []string
1431 enforceRROExcludedOverlays []string
Colin Crossc4441622024-09-18 14:55:49 -07001432 resourceFiles map[moduleAndVariant][]string
1433 overlayFiles map[moduleAndVariant][]string
1434 rroDirs map[moduleAndVariant][]string
Colin Cross5c4791c2019-02-01 11:44:44 -08001435 }{
1436 {
1437 name: "no RRO",
1438 enforceRROTargets: nil,
1439 enforceRROExcludedOverlays: nil,
Colin Crossc4441622024-09-18 14:55:49 -07001440 resourceFiles: map[moduleAndVariant][]string{
1441 {"foo", "android_common"}: nil,
1442 {"bar", "android_common"}: {"bar/res/res/values/strings.xml"},
1443 {"lib", "android_common"}: nil,
1444 {"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"},
Colin Crossbec85302019-02-13 13:15:46 -08001445 },
Colin Crossc4441622024-09-18 14:55:49 -07001446 overlayFiles: map[moduleAndVariant][]string{
1447 {"foo", "android_common"}: {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001448 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1449 "out/soong/.intermediates/lib/android_common/package-res.apk",
1450 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001451 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001452 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1453 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +00001454 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001455 },
Colin Crossc4441622024-09-18 14:55:49 -07001456 {"bar", "android_common"}: {
Colin Cross5c4791c2019-02-01 11:44:44 -08001457 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1458 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1459 },
Colin Crossc4441622024-09-18 14:55:49 -07001460 {"lib", "android_common"}: {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001461 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001462 "lib/res/res/values/strings.xml",
1463 "device/vendor/blah/overlay/lib/res/values/strings.xml",
1464 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001465 },
Colin Crossc4441622024-09-18 14:55:49 -07001466 rroDirs: map[moduleAndVariant][]string{
1467 {"foo", "android_common"}: nil,
1468 {"bar", "android_common"}: nil,
Colin Cross5c4791c2019-02-01 11:44:44 -08001469 },
1470 },
1471 {
1472 name: "enforce RRO on foo",
1473 enforceRROTargets: []string{"foo"},
1474 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossc4441622024-09-18 14:55:49 -07001475 resourceFiles: map[moduleAndVariant][]string{
1476 {"foo", "android_common"}: nil,
1477 {"bar", "android_common"}: {"bar/res/res/values/strings.xml"},
1478 {"lib", "android_common"}: nil,
1479 {"lib", "android_common_rro"}: nil,
1480 {"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"},
1481 {"lib2", "android_common_rro"}: {"lib2/res/res/values/strings.xml"},
Colin Crossbec85302019-02-13 13:15:46 -08001482 },
Colin Crossc4441622024-09-18 14:55:49 -07001483 overlayFiles: map[moduleAndVariant][]string{
1484 {"foo", "android_common"}: {
1485 "out/soong/.intermediates/lib2/android_common_rro/package-res.apk",
1486 "out/soong/.intermediates/lib/android_common_rro/package-res.apk",
1487 "out/soong/.intermediates/lib3/android_common_rro/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001488 "foo/res/res/values/strings.xml",
1489 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1490 },
Colin Crossc4441622024-09-18 14:55:49 -07001491 {"bar", "android_common"}: {
Colin Cross5c4791c2019-02-01 11:44:44 -08001492 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1493 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1494 },
Colin Crossc4441622024-09-18 14:55:49 -07001495 {"lib", "android_common"}: {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001496 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001497 "lib/res/res/values/strings.xml",
Colin Crossc4441622024-09-18 14:55:49 -07001498 "device/vendor/blah/overlay/lib/res/values/strings.xml",
1499 },
1500 {"lib", "android_common_rro"}: {
1501 "out/soong/.intermediates/lib2/android_common_rro/package-res.apk",
1502 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -08001503 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001504 },
Colin Crossc1c37552019-01-31 11:42:41 -08001505
Colin Crossc4441622024-09-18 14:55:49 -07001506 rroDirs: map[moduleAndVariant][]string{
1507 {"foo", "android_common"}: {
Anton Hansson53c88442019-03-18 15:53:16 +00001508 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +00001509 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001510 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001511 },
Colin Crossc4441622024-09-18 14:55:49 -07001512 {"bar", "android_common"}: nil,
1513 {"lib", "android_common"}: nil,
1514 {"lib", "android_common_rro"}: {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001515 },
1516 },
1517 {
1518 name: "enforce RRO on all",
1519 enforceRROTargets: []string{"*"},
1520 enforceRROExcludedOverlays: []string{
1521 // Excluding specific apps/res directories also allowed.
1522 "device/vendor/blah/static_overlay/foo",
1523 "device/vendor/blah/static_overlay/bar/res",
1524 },
Colin Crossc4441622024-09-18 14:55:49 -07001525 resourceFiles: map[moduleAndVariant][]string{
1526 {"foo", "android_common"}: nil,
1527 {"bar", "android_common"}: {"bar/res/res/values/strings.xml"},
1528 {"lib", "android_common"}: nil,
1529 {"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"},
Colin Crossbec85302019-02-13 13:15:46 -08001530 },
Colin Crossc4441622024-09-18 14:55:49 -07001531 overlayFiles: map[moduleAndVariant][]string{
1532 {"foo", "android_common"}: {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001533 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1534 "out/soong/.intermediates/lib/android_common/package-res.apk",
1535 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001536 "foo/res/res/values/strings.xml",
1537 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1538 },
Colin Crossc4441622024-09-18 14:55:49 -07001539 {"bar", "android_common"}: {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
1540 {"lib", "android_common"}: {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001541 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001542 "lib/res/res/values/strings.xml",
1543 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001544 },
Colin Crossc4441622024-09-18 14:55:49 -07001545 rroDirs: map[moduleAndVariant][]string{
1546 {"foo", "android_common"}: {
Anton Hansson53c88442019-03-18 15:53:16 +00001547 "device:device/vendor/blah/overlay/foo/res",
1548 "product:product/vendor/blah/overlay/foo/res",
1549 // Lib dep comes after the direct deps
1550 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001551 },
Colin Crossc4441622024-09-18 14:55:49 -07001552 {"bar", "android_common"}: {"device:device/vendor/blah/overlay/bar/res"},
1553 {"lib", "android_common"}: {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001554 },
1555 },
1556 }
1557
Anton Hansson53c88442019-03-18 15:53:16 +00001558 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -08001559 "device/vendor/blah/overlay",
1560 "device/vendor/blah/overlay2",
1561 "device/vendor/blah/static_overlay",
1562 }
1563
Anton Hansson53c88442019-03-18 15:53:16 +00001564 productResourceOverlays := []string{
1565 "product/vendor/blah/overlay",
1566 }
1567
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001568 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -08001569 "foo/res/res/values/strings.xml": nil,
1570 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001571 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -08001572 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001573 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
1574 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001575 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001576 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
1577 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
1578 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +00001579 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001580 }
1581
1582 bp := `
1583 android_app {
1584 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001585 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001586 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +00001587 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -08001588 }
1589
1590 android_app {
1591 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001592 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001593 resource_dirs: ["bar/res"],
1594 }
Colin Cross6ed7dea2019-01-31 14:44:30 -08001595
1596 android_library {
1597 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001598 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001599 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -08001600 static_libs: ["lib2"],
1601 }
1602
1603 android_library {
1604 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001605 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -08001606 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -08001607 }
Anton Hansson53c88442019-03-18 15:53:16 +00001608
1609 // This library has the same resources as lib (should not lead to dupe RROs)
1610 android_library {
1611 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001612 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +00001613 resource_dirs: ["lib/res"]
1614 }
Colin Cross890ff552017-11-30 20:13:19 -08001615 `
1616
Colin Cross5c4791c2019-02-01 11:44:44 -08001617 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -08001618 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001619 result := android.GroupFixturePreparers(
1620 PrepareForTestWithJavaDefaultModules,
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001621 fs.AddToFixture(),
1622 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1623 variables.DeviceResourceOverlays = deviceResourceOverlays
1624 variables.ProductResourceOverlays = productResourceOverlays
1625 if testCase.enforceRROTargets != nil {
1626 variables.EnforceRROTargets = testCase.enforceRROTargets
1627 }
1628 if testCase.enforceRROExcludedOverlays != nil {
1629 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
1630 }
1631 }),
1632 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -08001633
Colin Crossbec85302019-02-13 13:15:46 -08001634 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
1635 for _, o := range list {
1636 res := module.MaybeOutput(o)
1637 if res.Rule != nil {
Colin Crossc4441622024-09-18 14:55:49 -07001638 // If the overlay is compiled as part of this moduleAndVariant (i.e. a .arsc.flat file),
Colin Crossbec85302019-02-13 13:15:46 -08001639 // verify the inputs to the .arsc.flat rule.
1640 files = append(files, res.Inputs.Strings()...)
1641 } else {
Colin Crossc4441622024-09-18 14:55:49 -07001642 // Otherwise, verify the full path to the output of the other moduleAndVariant
Colin Crossbec85302019-02-13 13:15:46 -08001643 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +00001644 }
Colin Cross890ff552017-11-30 20:13:19 -08001645 }
Colin Crossbec85302019-02-13 13:15:46 -08001646 return files
Colin Cross890ff552017-11-30 20:13:19 -08001647 }
1648
Colin Crossc4441622024-09-18 14:55:49 -07001649 getResources := func(moduleName, variantName string) (resourceFiles, overlayFiles, rroDirs []string) {
1650 module := result.ModuleForTests(moduleName, variantName)
Colin Crossbec85302019-02-13 13:15:46 -08001651 resourceList := module.MaybeOutput("aapt2/res.list")
1652 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001653 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +00001654 }
Colin Crossbec85302019-02-13 13:15:46 -08001655 overlayList := module.MaybeOutput("aapt2/overlay.list")
1656 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001657 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -08001658 }
1659
Colin Crossab8d1382023-07-14 17:23:41 +00001660 for _, d := range module.Module().(AndroidLibraryDependency).RRODirsDepSet().ToList() {
Anton Hansson53c88442019-03-18 15:53:16 +00001661 var prefix string
1662 if d.overlayType == device {
1663 prefix = "device:"
1664 } else if d.overlayType == product {
1665 prefix = "product:"
1666 } else {
1667 t.Fatalf("Unexpected overlayType %d", d.overlayType)
1668 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001669 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +00001670 }
Colin Crossbec85302019-02-13 13:15:46 -08001671
1672 return resourceFiles, overlayFiles, rroDirs
1673 }
1674
Colin Crossc4441622024-09-18 14:55:49 -07001675 modules := []moduleAndVariant{
1676 {"foo", "android_common"},
1677 {"foo", "android_common_rro"},
1678 {"bar", "android_common"},
1679 {"bar", "android_common_rro"},
1680 {"lib", "android_common"},
1681 {"lib", "android_common_rro"},
1682 {"lib2", "android_common"},
1683 {"lib2", "android_common_rro"},
1684 }
1685 for _, moduleAndVariant := range modules {
1686 if _, exists := testCase.resourceFiles[moduleAndVariant]; !exists {
1687 continue
1688 }
1689 resourceFiles, overlayFiles, rroDirs := getResources(moduleAndVariant.module, moduleAndVariant.variant)
Colin Crossbec85302019-02-13 13:15:46 -08001690
Colin Crossc4441622024-09-18 14:55:49 -07001691 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[moduleAndVariant]) {
Colin Crossbec85302019-02-13 13:15:46 -08001692 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
Colin Crossc4441622024-09-18 14:55:49 -07001693 moduleAndVariant, testCase.resourceFiles[moduleAndVariant], resourceFiles)
Colin Crossbec85302019-02-13 13:15:46 -08001694 }
Colin Crossc4441622024-09-18 14:55:49 -07001695 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[moduleAndVariant]) {
Colin Crossbec85302019-02-13 13:15:46 -08001696 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
Colin Crossc4441622024-09-18 14:55:49 -07001697 moduleAndVariant, testCase.overlayFiles[moduleAndVariant], overlayFiles)
Colin Crossbec85302019-02-13 13:15:46 -08001698 }
Colin Crossc4441622024-09-18 14:55:49 -07001699 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[moduleAndVariant]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +00001700 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossc4441622024-09-18 14:55:49 -07001701 moduleAndVariant, testCase.rroDirs[moduleAndVariant], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +00001702 }
Colin Cross890ff552017-11-30 20:13:19 -08001703 }
Colin Cross890ff552017-11-30 20:13:19 -08001704 })
1705 }
1706}
Colin Crossd09b0b62018-04-18 11:06:47 -07001707
Paul Duffincdb88a92021-03-14 00:36:50 +00001708func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
1709 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +09001710 link := foo.Output("package-res.apk")
1711 linkFlags := strings.Split(link.Args["flags"], " ")
1712 min := android.IndexList("--min-sdk-version", linkFlags)
1713 target := android.IndexList("--target-sdk-version", linkFlags)
1714
1715 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
1716 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
1717 }
1718
1719 gotMinSdkVersion := linkFlags[min+1]
1720 gotTargetSdkVersion := linkFlags[target+1]
1721
Paul Duffincdb88a92021-03-14 00:36:50 +00001722 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001723
Paul Duffincdb88a92021-03-14 00:36:50 +00001724 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001725}
1726
Colin Crossd09b0b62018-04-18 11:06:47 -07001727func TestAppSdkVersion(t *testing.T) {
1728 testCases := []struct {
1729 name string
1730 sdkVersion string
1731 platformSdkInt int
1732 platformSdkCodename string
1733 platformSdkFinal bool
Spandan Dasffb31af2023-03-01 19:46:18 +00001734 minSdkVersionBp string
Colin Crossd09b0b62018-04-18 11:06:47 -07001735 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001736 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001737 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001738 }{
1739 {
1740 name: "current final SDK",
1741 sdkVersion: "current",
1742 platformSdkInt: 27,
1743 platformSdkCodename: "REL",
1744 platformSdkFinal: true,
1745 expectedMinSdkVersion: "27",
1746 },
1747 {
1748 name: "current non-final SDK",
1749 sdkVersion: "current",
1750 platformSdkInt: 27,
1751 platformSdkCodename: "OMR1",
1752 platformSdkFinal: false,
1753 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001754 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001755 },
1756 {
1757 name: "default final SDK",
1758 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001759 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001760 platformSdkInt: 27,
1761 platformSdkCodename: "REL",
1762 platformSdkFinal: true,
1763 expectedMinSdkVersion: "27",
1764 },
1765 {
1766 name: "default non-final SDK",
1767 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001768 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001769 platformSdkInt: 27,
1770 platformSdkCodename: "OMR1",
1771 platformSdkFinal: false,
1772 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001773 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001774 },
1775 {
1776 name: "14",
1777 sdkVersion: "14",
1778 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001779 platformSdkCodename: "S",
1780 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001781 },
Spandan Dasffb31af2023-03-01 19:46:18 +00001782 {
1783 name: "two active SDKs",
1784 sdkVersion: "module_current",
1785 minSdkVersionBp: "UpsideDownCake",
1786 expectedMinSdkVersion: "UpsideDownCake", // And not VanillaIceCream
1787 platformSdkCodename: "VanillaIceCream",
1788 activeCodenames: []string{"UpsideDownCake", "VanillaIceCream"},
1789 },
Colin Crossd09b0b62018-04-18 11:06:47 -07001790 }
1791
1792 for _, moduleType := range []string{"android_app", "android_library"} {
1793 for _, test := range testCases {
1794 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001795 platformApiProp := ""
1796 if test.platformApis {
1797 platformApiProp = "platform_apis: true,"
1798 }
Spandan Dasffb31af2023-03-01 19:46:18 +00001799 minSdkVersionProp := ""
1800 if test.minSdkVersionBp != "" {
1801 minSdkVersionProp = fmt.Sprintf(` min_sdk_version: "%s",`, test.minSdkVersionBp)
1802 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001803 bp := fmt.Sprintf(`%s {
1804 name: "foo",
1805 srcs: ["a.java"],
1806 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001807 %s
Spandan Dasffb31af2023-03-01 19:46:18 +00001808 %s
1809 }`, moduleType, test.sdkVersion, platformApiProp, minSdkVersionProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001810
Paul Duffin71ae5942021-03-22 15:36:52 +00001811 result := android.GroupFixturePreparers(
1812 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001813 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1814 variables.Platform_sdk_version = &test.platformSdkInt
1815 variables.Platform_sdk_codename = &test.platformSdkCodename
1816 variables.Platform_version_active_codenames = test.activeCodenames
1817 variables.Platform_sdk_final = &test.platformSdkFinal
1818 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001819 FixtureWithPrebuiltApis(map[string][]string{
1820 "14": {"foo"},
1821 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001822 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001823
Paul Duffincdb88a92021-03-14 00:36:50 +00001824 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001825 })
1826 }
1827 }
1828}
Colin Crossa4f08812018-10-02 22:03:40 -07001829
Jeongik Cha219141c2020-08-06 23:00:37 +09001830func TestVendorAppSdkVersion(t *testing.T) {
1831 testCases := []struct {
1832 name string
1833 sdkVersion string
1834 platformSdkInt int
1835 platformSdkCodename string
1836 platformSdkFinal bool
1837 deviceCurrentApiLevelForVendorModules string
1838 expectedMinSdkVersion string
1839 }{
1840 {
1841 name: "current final SDK",
1842 sdkVersion: "current",
1843 platformSdkInt: 29,
1844 platformSdkCodename: "REL",
1845 platformSdkFinal: true,
1846 deviceCurrentApiLevelForVendorModules: "29",
1847 expectedMinSdkVersion: "29",
1848 },
1849 {
1850 name: "current final SDK",
1851 sdkVersion: "current",
1852 platformSdkInt: 29,
1853 platformSdkCodename: "REL",
1854 platformSdkFinal: true,
1855 deviceCurrentApiLevelForVendorModules: "28",
1856 expectedMinSdkVersion: "28",
1857 },
1858 {
1859 name: "current final SDK",
1860 sdkVersion: "current",
1861 platformSdkInt: 29,
1862 platformSdkCodename: "Q",
1863 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001864 deviceCurrentApiLevelForVendorModules: "28",
1865 expectedMinSdkVersion: "28",
1866 },
1867 }
1868
1869 for _, moduleType := range []string{"android_app", "android_library"} {
1870 for _, sdkKind := range []string{"", "system_"} {
1871 for _, test := range testCases {
1872 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1873 bp := fmt.Sprintf(`%s {
1874 name: "foo",
1875 srcs: ["a.java"],
1876 sdk_version: "%s%s",
1877 vendor: true,
1878 }`, moduleType, sdkKind, test.sdkVersion)
1879
Paul Duffin71ae5942021-03-22 15:36:52 +00001880 result := android.GroupFixturePreparers(
1881 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001882 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1883 variables.Platform_sdk_version = &test.platformSdkInt
1884 variables.Platform_sdk_codename = &test.platformSdkCodename
1885 variables.Platform_sdk_final = &test.platformSdkFinal
1886 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1887 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1888 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001889 FixtureWithPrebuiltApis(map[string][]string{
1890 "28": {"foo"},
1891 "29": {"foo"},
1892 "current": {"foo"},
1893 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001894 ).RunTestWithBp(t, bp)
1895
1896 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001897 })
1898 }
1899 }
1900 }
1901}
1902
Paul Duffin50c217c2019-06-12 13:25:22 +01001903func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001904 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001905 cc_library {
1906 name: "libjni",
1907 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001908 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001909 stl: "none",
1910 }
1911
1912 android_test {
1913 name: "test",
1914 sdk_version: "core_platform",
1915 jni_libs: ["libjni"],
1916 }
1917
1918 android_test {
1919 name: "test_first",
1920 sdk_version: "core_platform",
1921 compile_multilib: "first",
1922 jni_libs: ["libjni"],
1923 }
1924
1925 android_test {
1926 name: "test_both",
1927 sdk_version: "core_platform",
1928 compile_multilib: "both",
1929 jni_libs: ["libjni"],
1930 }
1931
1932 android_test {
1933 name: "test_32",
1934 sdk_version: "core_platform",
1935 compile_multilib: "32",
1936 jni_libs: ["libjni"],
1937 }
1938
1939 android_test {
1940 name: "test_64",
1941 sdk_version: "core_platform",
1942 compile_multilib: "64",
1943 jni_libs: ["libjni"],
1944 }
1945 `)
1946
1947 testCases := []struct {
1948 name string
1949 abis []string
1950 }{
1951 {"test", []string{"arm64-v8a"}},
1952 {"test_first", []string{"arm64-v8a"}},
1953 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1954 {"test_32", []string{"armeabi-v7a"}},
1955 {"test_64", []string{"arm64-v8a"}},
1956 }
1957
1958 for _, test := range testCases {
1959 t.Run(test.name, func(t *testing.T) {
1960 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07001961 jniLibZip := app.Output("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01001962 var abis []string
1963 args := strings.Fields(jniLibZip.Args["jarArgs"])
1964 for i := 0; i < len(args); i++ {
1965 if args[i] == "-P" {
1966 abis = append(abis, filepath.Base(args[i+1]))
1967 i++
1968 }
1969 }
1970 if !reflect.DeepEqual(abis, test.abis) {
1971 t.Errorf("want abis %v, got %v", test.abis, abis)
1972 }
1973 })
1974 }
1975}
1976
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001977func TestAppSdkVersionByPartition(t *testing.T) {
1978 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1979 android_app {
1980 name: "foo",
1981 srcs: ["a.java"],
1982 vendor: true,
1983 platform_apis: true,
1984 }
1985 `)
1986
1987 testJava(t, `
1988 android_app {
1989 name: "bar",
1990 srcs: ["b.java"],
1991 platform_apis: true,
1992 }
1993 `)
1994
1995 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001996 bp := `
1997 android_app {
1998 name: "foo",
1999 srcs: ["a.java"],
2000 product_specific: true,
2001 platform_apis: true,
2002 }
2003 `
Colin Cross98be1bb2019-12-13 20:41:13 -08002004
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002005 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09002006 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002007 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern("sdk_version must have a value when the module is located at vendor or product")
Jeongik Cha2cc570d2019-10-29 15:44:45 +09002008 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002009
2010 android.GroupFixturePreparers(
2011 PrepareForTestWithJavaDefaultModules,
2012 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2013 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
2014 }),
2015 ).
2016 ExtendWithErrorHandler(errorHandler).
2017 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09002018 }
2019}
2020
Paul Duffin50c217c2019-06-12 13:25:22 +01002021func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002022 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01002023 cc_library {
2024 name: "libjni",
2025 system_shared_libs: [],
2026 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08002027 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002028 }
2029
2030 android_app {
2031 name: "app",
2032 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002033 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002034 }
2035
2036 android_app {
2037 name: "app_noembed",
2038 jni_libs: ["libjni"],
2039 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002040 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002041 }
2042
2043 android_app {
2044 name: "app_embed",
2045 jni_libs: ["libjni"],
2046 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002047 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002048 }
2049
2050 android_test {
2051 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00002052 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002053 jni_libs: ["libjni"],
2054 }
2055
2056 android_test {
2057 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00002058 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002059 jni_libs: ["libjni"],
2060 use_embedded_native_libs: false,
2061 }
2062
2063 android_test_helper_app {
2064 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00002065 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002066 jni_libs: ["libjni"],
2067 }
2068
2069 android_test_helper_app {
2070 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00002071 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002072 jni_libs: ["libjni"],
2073 use_embedded_native_libs: false,
2074 }
2075 `)
2076
2077 testCases := []struct {
2078 name string
2079 packaged bool
2080 compressed bool
2081 }{
Jiyong Parkd044bb42024-05-15 02:09:54 +09002082 {"app", false, false},
2083 {"app_noembed", false, false},
Paul Duffin50c217c2019-06-12 13:25:22 +01002084 {"app_embed", true, false},
2085 {"test", true, false},
2086 {"test_noembed", true, true},
2087 {"test_helper", true, false},
2088 {"test_helper_noembed", true, true},
2089 }
2090
2091 for _, test := range testCases {
2092 t.Run(test.name, func(t *testing.T) {
2093 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07002094 jniLibZip := app.MaybeOutput("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01002095 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
2096 t.Errorf("expected jni packaged %v, got %v", w, g)
2097 }
2098
2099 if jniLibZip.Rule != nil {
2100 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
2101 t.Errorf("expected jni compressed %v, got %v", w, g)
2102 }
Colin Crossc511bc52020-04-07 16:50:32 +00002103
2104 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
2105 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
2106 }
Paul Duffin50c217c2019-06-12 13:25:22 +01002107 }
2108 })
2109 }
Colin Cross47fa9d32019-03-26 10:51:39 -07002110}
2111
Colin Cross3c007702020-05-08 11:20:24 -07002112func TestJNISDK(t *testing.T) {
2113 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
2114 cc_library {
2115 name: "libjni",
2116 system_shared_libs: [],
2117 stl: "none",
2118 sdk_version: "current",
2119 }
2120
2121 android_test {
2122 name: "app_platform",
2123 jni_libs: ["libjni"],
2124 platform_apis: true,
2125 }
2126
2127 android_test {
2128 name: "app_sdk",
2129 jni_libs: ["libjni"],
2130 sdk_version: "current",
2131 }
2132
2133 android_test {
2134 name: "app_force_platform",
2135 jni_libs: ["libjni"],
2136 sdk_version: "current",
2137 jni_uses_platform_apis: true,
2138 }
2139
2140 android_test {
2141 name: "app_force_sdk",
2142 jni_libs: ["libjni"],
2143 platform_apis: true,
2144 jni_uses_sdk_apis: true,
2145 }
Colin Crossc2d24052020-05-13 11:05:02 -07002146
2147 cc_library {
2148 name: "libvendorjni",
2149 system_shared_libs: [],
2150 stl: "none",
2151 vendor: true,
2152 }
2153
2154 android_test {
2155 name: "app_vendor",
2156 jni_libs: ["libvendorjni"],
2157 sdk_version: "current",
2158 vendor: true,
2159 }
Colin Cross3c007702020-05-08 11:20:24 -07002160 `)
2161
2162 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07002163 name string
2164 sdkJNI bool
2165 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07002166 }{
Colin Crossc2d24052020-05-13 11:05:02 -07002167 {name: "app_platform"},
2168 {name: "app_sdk", sdkJNI: true},
2169 {name: "app_force_platform"},
2170 {name: "app_force_sdk", sdkJNI: true},
2171 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07002172 }
2173
Colin Crossc2d24052020-05-13 11:05:02 -07002174 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
2175 Output("libjni.so").Output.String()
2176 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
2177 Output("libjni.so").Output.String()
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +09002178 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_vendor_arm64_armv8-a_shared").
Colin Crossc2d24052020-05-13 11:05:02 -07002179 Output("libvendorjni.so").Output.String()
2180
Colin Cross3c007702020-05-08 11:20:24 -07002181 for _, test := range testCases {
2182 t.Run(test.name, func(t *testing.T) {
2183 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07002184
Colin Crossb3168ba2023-07-26 16:14:56 -07002185 jniLibZip := app.MaybeOutput("jnilibs.zip")
Colin Cross3c007702020-05-08 11:20:24 -07002186 if len(jniLibZip.Implicits) != 1 {
2187 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
2188 }
2189 gotJNI := jniLibZip.Implicits[0].String()
2190
2191 if test.sdkJNI {
2192 if gotJNI != sdkJNI {
2193 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
2194 }
Colin Crossc2d24052020-05-13 11:05:02 -07002195 } else if test.vendorJNI {
2196 if gotJNI != vendorJNI {
2197 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
2198 }
Colin Cross3c007702020-05-08 11:20:24 -07002199 } else {
2200 if gotJNI != platformJNI {
2201 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
2202 }
2203 }
2204 })
2205 }
2206
2207 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
2208 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
2209 android_test {
2210 name: "app_platform",
2211 platform_apis: true,
2212 jni_uses_platform_apis: true,
2213 }
2214 `)
2215 })
2216
2217 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
2218 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
2219 android_test {
2220 name: "app_sdk",
2221 sdk_version: "current",
2222 jni_uses_sdk_apis: true,
2223 }
2224 `)
2225 })
2226
2227}
2228
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002229func TestCertificates(t *testing.T) {
2230 testCases := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002231 name string
2232 bp string
Colin Cross5caad2b2022-12-12 15:11:46 -08002233 allowMissingDependencies bool
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002234 certificateOverride string
2235 expectedCertSigningFlags string
2236 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002237 }{
2238 {
2239 name: "default",
2240 bp: `
2241 android_app {
2242 name: "foo",
2243 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002244 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002245 }
2246 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002247 certificateOverride: "",
2248 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002249 expectedCertificate: "build/make/target/product/security/testkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002250 },
2251 {
2252 name: "module certificate property",
2253 bp: `
2254 android_app {
2255 name: "foo",
2256 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002257 certificate: ":new_certificate",
2258 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002259 }
2260
2261 android_app_certificate {
2262 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002263 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002264 }
2265 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002266 certificateOverride: "",
2267 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002268 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002269 },
2270 {
2271 name: "path certificate property",
2272 bp: `
2273 android_app {
2274 name: "foo",
2275 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002276 certificate: "expiredkey",
2277 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002278 }
2279 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002280 certificateOverride: "",
2281 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002282 expectedCertificate: "build/make/target/product/security/expiredkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002283 },
2284 {
2285 name: "certificate overrides",
2286 bp: `
2287 android_app {
2288 name: "foo",
2289 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002290 certificate: "expiredkey",
2291 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002292 }
2293
2294 android_app_certificate {
2295 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002296 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002297 }
2298 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002299 certificateOverride: "foo:new_certificate",
2300 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002301 expectedCertificate: "cert/new_cert",
Liz Kammere2b27f42020-05-07 13:24:05 -07002302 },
2303 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002304 name: "certificate signing flags",
Liz Kammere2b27f42020-05-07 13:24:05 -07002305 bp: `
2306 android_app {
2307 name: "foo",
2308 srcs: ["a.java"],
2309 certificate: ":new_certificate",
2310 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002311 rotationMinSdkVersion: "32",
Liz Kammere2b27f42020-05-07 13:24:05 -07002312 sdk_version: "current",
2313 }
2314
2315 android_app_certificate {
2316 name: "new_certificate",
2317 certificate: "cert/new_cert",
2318 }
2319 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002320 certificateOverride: "",
2321 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002322 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002323 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002324 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002325 name: "cert signing flags from filegroup",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002326 bp: `
2327 android_app {
2328 name: "foo",
2329 srcs: ["a.java"],
2330 certificate: ":new_certificate",
2331 lineage: ":lineage_bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002332 rotationMinSdkVersion: "32",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002333 sdk_version: "current",
2334 }
2335
2336 android_app_certificate {
2337 name: "new_certificate",
2338 certificate: "cert/new_cert",
2339 }
2340
2341 filegroup {
2342 name: "lineage_bin",
2343 srcs: ["lineage.bin"],
2344 }
2345 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002346 certificateOverride: "",
2347 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002348 expectedCertificate: "cert/new_cert",
2349 },
2350 {
2351 name: "missing with AllowMissingDependencies",
2352 bp: `
2353 android_app {
2354 name: "foo",
2355 srcs: ["a.java"],
2356 certificate: ":new_certificate",
2357 sdk_version: "current",
2358 }
2359 `,
2360 expectedCertificate: "out/soong/.intermediates/foo/android_common/missing",
2361 allowMissingDependencies: true,
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002362 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002363 }
2364
2365 for _, test := range testCases {
2366 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002367 result := android.GroupFixturePreparers(
2368 PrepareForTestWithJavaDefaultModules,
2369 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2370 if test.certificateOverride != "" {
2371 variables.CertificateOverrides = []string{test.certificateOverride}
2372 }
Colin Cross5caad2b2022-12-12 15:11:46 -08002373 if test.allowMissingDependencies {
2374 variables.Allow_missing_dependencies = proptools.BoolPtr(true)
2375 }
2376 }),
2377 android.FixtureModifyContext(func(ctx *android.TestContext) {
2378 ctx.SetAllowMissingDependencies(test.allowMissingDependencies)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002379 }),
2380 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002381
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002382 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002383
Colin Cross5caad2b2022-12-12 15:11:46 -08002384 certificate := foo.Module().(*AndroidApp).certificate
2385 android.AssertPathRelativeToTopEquals(t, "certificates key", test.expectedCertificate+".pk8", certificate.Key)
2386 // The sign_target_files_apks and check_target_files_signatures
2387 // tools require that certificates have a .x509.pem extension.
2388 android.AssertPathRelativeToTopEquals(t, "certificates pem", test.expectedCertificate+".x509.pem", certificate.Pem)
Liz Kammere2b27f42020-05-07 13:24:05 -07002389
Colin Cross5caad2b2022-12-12 15:11:46 -08002390 signapk := foo.Output("foo.apk")
2391 if signapk.Rule != android.ErrorRule {
2392 signCertificateFlags := signapk.Args["certificates"]
2393 expectedFlags := certificate.Pem.String() + " " + certificate.Key.String()
2394 android.AssertStringEquals(t, "certificates flags", expectedFlags, signCertificateFlags)
2395
2396 certSigningFlags := signapk.Args["flags"]
2397 android.AssertStringEquals(t, "cert signing flags", test.expectedCertSigningFlags, certSigningFlags)
2398 }
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002399 })
2400 }
2401}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002402
Songchun Fan688de9a2020-03-24 20:32:24 -07002403func TestRequestV4SigningFlag(t *testing.T) {
2404 testCases := []struct {
2405 name string
2406 bp string
2407 expected string
2408 }{
2409 {
2410 name: "default",
2411 bp: `
2412 android_app {
2413 name: "foo",
2414 srcs: ["a.java"],
2415 sdk_version: "current",
2416 }
2417 `,
2418 expected: "",
2419 },
2420 {
2421 name: "default",
2422 bp: `
2423 android_app {
2424 name: "foo",
2425 srcs: ["a.java"],
2426 sdk_version: "current",
2427 v4_signature: false,
2428 }
2429 `,
2430 expected: "",
2431 },
2432 {
2433 name: "module certificate property",
2434 bp: `
2435 android_app {
2436 name: "foo",
2437 srcs: ["a.java"],
2438 sdk_version: "current",
2439 v4_signature: true,
2440 }
2441 `,
2442 expected: "--enable-v4",
2443 },
2444 }
2445
2446 for _, test := range testCases {
2447 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002448 result := android.GroupFixturePreparers(
2449 PrepareForTestWithJavaDefaultModules,
2450 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07002451
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002452 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07002453
2454 signapk := foo.Output("foo.apk")
2455 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002456 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07002457 })
2458 }
2459}
2460
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002461func TestPackageNameOverride(t *testing.T) {
2462 testCases := []struct {
2463 name string
2464 bp string
2465 packageNameOverride string
2466 expected []string
2467 }{
2468 {
2469 name: "default",
2470 bp: `
2471 android_app {
2472 name: "foo",
2473 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002474 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002475 }
2476 `,
2477 packageNameOverride: "",
2478 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002479 "out/soong/.intermediates/foo/android_common/foo.apk",
Cole Faust6b7075f2024-12-17 10:42:42 -08002480 "out/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002481 },
2482 },
2483 {
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002484 name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002485 bp: `
2486 android_app {
2487 name: "foo",
2488 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002489 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002490 }
2491 `,
2492 packageNameOverride: "foo:bar",
2493 expected: []string{
2494 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002495 "out/soong/.intermediates/foo/android_common/bar.apk",
Cole Faust6b7075f2024-12-17 10:42:42 -08002496 "out/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002497 },
2498 },
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002499 {
2500 name: "overridden via stem",
2501 bp: `
2502 android_app {
2503 name: "foo",
2504 srcs: ["a.java"],
2505 sdk_version: "current",
2506 stem: "bar",
2507 }
2508 `,
2509 packageNameOverride: "",
2510 expected: []string{
2511 "out/soong/.intermediates/foo/android_common/bar.apk",
Cole Faust6b7075f2024-12-17 10:42:42 -08002512 "out/target/product/test_device/system/app/bar/bar.apk",
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002513 },
2514 },
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002515 }
2516
2517 for _, test := range testCases {
2518 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002519 result := android.GroupFixturePreparers(
2520 PrepareForTestWithJavaDefaultModules,
2521 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2522 if test.packageNameOverride != "" {
2523 variables.PackageNameOverrides = []string{test.packageNameOverride}
2524 }
2525 }),
2526 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002527
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002528 foo := result.ModuleForTests("foo", "android_common")
2529
Lukacs T. Berkifbaf7252021-08-19 09:36:42 +02002530 outSoongDir := result.Config.SoongOutDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002531
2532 outputs := foo.AllOutputs()
2533 outputMap := make(map[string]bool)
2534 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002535 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002536 }
2537 for _, e := range test.expected {
2538 if _, exist := outputMap[e]; !exist {
2539 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
2540 }
2541 }
2542 })
2543 }
2544}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002545
2546func TestInstrumentationTargetOverridden(t *testing.T) {
2547 bp := `
2548 android_app {
2549 name: "foo",
2550 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002551 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002552 }
2553
2554 android_test {
2555 name: "bar",
2556 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002557 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002558 }
2559 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002560
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002561 result := android.GroupFixturePreparers(
2562 PrepareForTestWithJavaDefaultModules,
2563 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2564 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
2565 }),
2566 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002567
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002568 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002569 res := bar.Output("package-res.apk")
2570 aapt2Flags := res.Args["flags"]
2571 e := "--rename-instrumentation-target-package org.dandroid.bp"
2572 if !strings.Contains(aapt2Flags, e) {
2573 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
2574 }
2575}
Jaewoong Jung525443a2019-02-28 15:35:54 -08002576
2577func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002578 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2579 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08002580 android_app {
2581 name: "foo",
2582 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07002583 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002584 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002585 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002586 }
2587
2588 override_android_app {
2589 name: "bar",
2590 base: "foo",
2591 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07002592 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002593 rotationMinSdkVersion: "32",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002594 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002595 }
2596
2597 android_app_certificate {
2598 name: "new_certificate",
2599 certificate: "cert/new_cert",
2600 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002601
2602 override_android_app {
2603 name: "baz",
2604 base: "foo",
2605 package_name: "org.dandroid.bp",
2606 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002607
2608 override_android_app {
2609 name: "baz_no_rename_resources",
2610 base: "foo",
2611 package_name: "org.dandroid.bp",
2612 rename_resources_package: false,
2613 }
2614
2615 android_app {
2616 name: "foo_no_rename_resources",
2617 srcs: ["a.java"],
2618 certificate: "expiredkey",
2619 overrides: ["qux"],
2620 rename_resources_package: false,
2621 sdk_version: "current",
2622 }
2623
2624 override_android_app {
2625 name: "baz_base_no_rename_resources",
2626 base: "foo_no_rename_resources",
2627 package_name: "org.dandroid.bp",
2628 }
2629
2630 override_android_app {
2631 name: "baz_override_base_rename_resources",
2632 base: "foo_no_rename_resources",
2633 package_name: "org.dandroid.bp",
2634 rename_resources_package: true,
2635 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08002636 `)
2637
2638 expectedVariants := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002639 name string
2640 moduleName string
2641 variantName string
2642 apkName string
2643 apkPath string
2644 certFlag string
2645 certSigningFlags string
2646 overrides []string
2647 packageFlag string
2648 renameResources bool
2649 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08002650 }{
2651 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002652 name: "foo",
2653 moduleName: "foo",
2654 variantName: "android_common",
Cole Faust6b7075f2024-12-17 10:42:42 -08002655 apkPath: "out/target/product/test_device/system/app/foo/foo.apk",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002656 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2657 certSigningFlags: "",
2658 overrides: []string{"qux"},
2659 packageFlag: "",
2660 renameResources: false,
2661 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002662 },
2663 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002664 name: "foo",
2665 moduleName: "bar",
2666 variantName: "android_common_bar",
Cole Faust6b7075f2024-12-17 10:42:42 -08002667 apkPath: "out/target/product/test_device/system/app/bar/bar.apk",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002668 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
2669 certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
2670 overrides: []string{"qux", "foo"},
2671 packageFlag: "",
2672 renameResources: false,
2673 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002674 },
2675 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002676 name: "foo",
2677 moduleName: "baz",
2678 variantName: "android_common_baz",
Cole Faust6b7075f2024-12-17 10:42:42 -08002679 apkPath: "out/target/product/test_device/system/app/baz/baz.apk",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002680 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2681 certSigningFlags: "",
2682 overrides: []string{"qux", "foo"},
2683 packageFlag: "org.dandroid.bp",
2684 renameResources: true,
2685 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002686 },
2687 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002688 name: "foo",
2689 moduleName: "baz_no_rename_resources",
2690 variantName: "android_common_baz_no_rename_resources",
Cole Faust6b7075f2024-12-17 10:42:42 -08002691 apkPath: "out/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002692 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2693 certSigningFlags: "",
2694 overrides: []string{"qux", "foo"},
2695 packageFlag: "org.dandroid.bp",
2696 renameResources: false,
2697 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002698 },
2699 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002700 name: "foo_no_rename_resources",
2701 moduleName: "baz_base_no_rename_resources",
2702 variantName: "android_common_baz_base_no_rename_resources",
Cole Faust6b7075f2024-12-17 10:42:42 -08002703 apkPath: "out/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002704 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2705 certSigningFlags: "",
2706 overrides: []string{"qux", "foo_no_rename_resources"},
2707 packageFlag: "org.dandroid.bp",
2708 renameResources: false,
2709 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002710 },
2711 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002712 name: "foo_no_rename_resources",
2713 moduleName: "baz_override_base_rename_resources",
2714 variantName: "android_common_baz_override_base_rename_resources",
Cole Faust6b7075f2024-12-17 10:42:42 -08002715 apkPath: "out/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002716 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2717 certSigningFlags: "",
2718 overrides: []string{"qux", "foo_no_rename_resources"},
2719 packageFlag: "org.dandroid.bp",
2720 renameResources: true,
2721 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002722 },
2723 }
2724 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002725 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002726
2727 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002728 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002729
2730 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08002731 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07002732 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002733 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07002734
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002735 // Check the cert signing flags
2736 certSigningFlags := signapk.Args["flags"]
2737 android.AssertStringEquals(t, "cert signing flags", expected.certSigningFlags, certSigningFlags)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002738
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002739 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08002740 mod := variant.Module().(*AndroidApp)
zhidoua2ce78f2022-02-17 02:33:12 +00002741 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002742
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002743 // Test Overridable property: Logging_parent
2744 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002745 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002746
Liz Kammer1d5983b2020-05-19 19:15:37 +00002747 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002748 res := variant.Output("package-res.apk")
2749 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00002750 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
2751 expectedPackage := expected.packageFlag
2752 if !expected.renameResources {
2753 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00002754 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002755 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002756 }
2757}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07002758
zhidoua2ce78f2022-02-17 02:33:12 +00002759func TestOverrideAndroidAppOverrides(t *testing.T) {
2760 ctx, _ := testJava(
2761 t, `
2762 android_app {
2763 name: "foo",
2764 srcs: ["a.java"],
2765 sdk_version: "current",
2766 overrides: ["qux"]
2767 }
2768
2769 android_app {
2770 name: "bar",
2771 srcs: ["b.java"],
2772 sdk_version: "current",
2773 overrides: ["foo"]
2774 }
2775
2776 override_android_app {
2777 name: "foo_override",
2778 base: "foo",
2779 overrides: ["bar"]
2780 }
2781 `)
2782
2783 expectedVariants := []struct {
2784 name string
2785 moduleName string
2786 variantName string
2787 overrides []string
2788 }{
2789 {
2790 name: "foo",
2791 moduleName: "foo",
2792 variantName: "android_common",
2793 overrides: []string{"qux"},
2794 },
2795 {
2796 name: "bar",
2797 moduleName: "bar",
2798 variantName: "android_common",
2799 overrides: []string{"foo"},
2800 },
2801 {
2802 name: "foo",
2803 moduleName: "foo_override",
2804 variantName: "android_common_foo_override",
2805 overrides: []string{"bar", "foo"},
2806 },
2807 }
2808 for _, expected := range expectedVariants {
2809 variant := ctx.ModuleForTests(expected.name, expected.variantName)
2810
2811 // Check if the overrides field values are correctly aggregated.
2812 mod := variant.Module().(*AndroidApp)
2813 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2814 }
2815}
2816
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002817func TestOverrideAndroidAppWithPrebuilt(t *testing.T) {
2818 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2819 t, `
2820 android_app {
2821 name: "foo",
2822 srcs: ["a.java"],
2823 sdk_version: "current",
2824 }
2825
2826 override_android_app {
2827 name: "bar",
2828 base: "foo",
2829 }
2830
2831 android_app_import {
2832 name: "bar",
2833 prefer: true,
2834 apk: "bar.apk",
2835 presigned: true,
2836 }
2837 `)
2838
2839 // An app that has an override that also has a prebuilt should not be hidden.
2840 foo := result.ModuleForTests("foo", "android_common")
2841 if foo.Module().IsHideFromMake() {
2842 t.Errorf("expected foo to have HideFromMake false")
2843 }
2844
2845 // An override that also has a prebuilt should be hidden.
2846 barOverride := result.ModuleForTests("foo", "android_common_bar")
2847 if !barOverride.Module().IsHideFromMake() {
2848 t.Errorf("expected bar override variant of foo to have HideFromMake true")
2849 }
2850}
2851
Jooyung Han01d80d82022-01-08 12:16:32 +09002852func TestOverrideAndroidAppStem(t *testing.T) {
2853 ctx, _ := testJava(t, `
2854 android_app {
2855 name: "foo",
2856 srcs: ["a.java"],
2857 sdk_version: "current",
2858 }
2859 override_android_app {
2860 name: "bar",
2861 base: "foo",
2862 }
2863 override_android_app {
2864 name: "baz",
2865 base: "foo",
2866 stem: "baz_stem",
2867 }
2868 android_app {
2869 name: "foo2",
2870 srcs: ["a.java"],
2871 sdk_version: "current",
2872 stem: "foo2_stem",
2873 }
2874 override_android_app {
2875 name: "bar2",
2876 base: "foo2",
2877 }
2878 override_android_app {
2879 name: "baz2",
2880 base: "foo2",
2881 stem: "baz2_stem",
2882 }
2883 `)
2884 for _, expected := range []struct {
2885 moduleName string
2886 variantName string
2887 apkPath string
2888 }{
2889 {
2890 moduleName: "foo",
2891 variantName: "android_common",
Cole Faust6b7075f2024-12-17 10:42:42 -08002892 apkPath: "out/target/product/test_device/system/app/foo/foo.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09002893 },
2894 {
2895 moduleName: "foo",
2896 variantName: "android_common_bar",
Cole Faust6b7075f2024-12-17 10:42:42 -08002897 apkPath: "out/target/product/test_device/system/app/bar/bar.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09002898 },
2899 {
2900 moduleName: "foo",
2901 variantName: "android_common_baz",
Cole Faust6b7075f2024-12-17 10:42:42 -08002902 apkPath: "out/target/product/test_device/system/app/baz_stem/baz_stem.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09002903 },
2904 {
2905 moduleName: "foo2",
2906 variantName: "android_common",
Cole Faust6b7075f2024-12-17 10:42:42 -08002907 apkPath: "out/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09002908 },
2909 {
2910 moduleName: "foo2",
2911 variantName: "android_common_bar2",
2912 // Note that this may cause the duplicate output error.
Cole Faust6b7075f2024-12-17 10:42:42 -08002913 apkPath: "out/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09002914 },
2915 {
2916 moduleName: "foo2",
2917 variantName: "android_common_baz2",
Cole Faust6b7075f2024-12-17 10:42:42 -08002918 apkPath: "out/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09002919 },
2920 } {
2921 variant := ctx.ModuleForTests(expected.moduleName, expected.variantName)
2922 variant.Output(expected.apkPath)
2923 }
2924}
2925
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002926func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002927 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002928 android_app {
2929 name: "foo",
2930 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002931 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002932 }
2933
2934 override_android_app {
2935 name: "bar",
2936 base: "foo",
2937 package_name: "org.dandroid.bp",
2938 }
2939
2940 android_test {
2941 name: "baz",
2942 srcs: ["b.java"],
2943 instrumentation_for: "foo",
2944 }
2945
2946 android_test {
2947 name: "qux",
2948 srcs: ["b.java"],
2949 instrumentation_for: "bar",
2950 }
2951 `)
2952
2953 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002954 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002955 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002956 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2957 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2958 }
2959
2960 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002961 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002962 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002963 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2964 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2965 }
2966}
2967
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002968func TestOverrideAndroidTest(t *testing.T) {
2969 ctx, _ := testJava(t, `
2970 android_app {
2971 name: "foo",
2972 srcs: ["a.java"],
2973 package_name: "com.android.foo",
2974 sdk_version: "current",
2975 }
2976
2977 override_android_app {
2978 name: "bar",
2979 base: "foo",
2980 package_name: "com.android.bar",
2981 }
2982
2983 android_test {
2984 name: "foo_test",
2985 srcs: ["b.java"],
2986 instrumentation_for: "foo",
2987 }
2988
2989 override_android_test {
2990 name: "bar_test",
2991 base: "foo_test",
2992 package_name: "com.android.bar.test",
2993 instrumentation_for: "bar",
2994 instrumentation_target_package: "com.android.bar",
2995 }
2996 `)
2997
2998 expectedVariants := []struct {
2999 moduleName string
3000 variantName string
3001 apkPath string
3002 overrides []string
3003 targetVariant string
3004 packageFlag string
3005 targetPackageFlag string
3006 }{
3007 {
3008 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08003009 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003010 overrides: nil,
3011 targetVariant: "android_common",
3012 packageFlag: "",
3013 targetPackageFlag: "",
3014 },
3015 {
3016 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08003017 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003018 overrides: []string{"foo_test"},
3019 targetVariant: "android_common_bar",
3020 packageFlag: "com.android.bar.test",
3021 targetPackageFlag: "com.android.bar",
3022 },
3023 }
3024 for _, expected := range expectedVariants {
3025 variant := ctx.ModuleForTests("foo_test", expected.variantName)
3026
3027 // Check the final apk name
Cole Faust6b7075f2024-12-17 10:42:42 -08003028 variant.Output("out" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003029
3030 // Check if the overrides field values are correctly aggregated.
3031 mod := variant.Module().(*AndroidTest)
zhidoua2ce78f2022-02-17 02:33:12 +00003032 if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003033 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
zhidoua2ce78f2022-02-17 02:33:12 +00003034 expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003035 }
3036
3037 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01003038 javac := variant.Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003039 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003040 if !strings.Contains(javac.Args["classpath"], turbine) {
3041 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
3042 }
3043
3044 // Check aapt2 flags.
3045 res := variant.Output("package-res.apk")
3046 aapt2Flags := res.Args["flags"]
3047 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00003048 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003049 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
3050 }
3051}
3052
Jaewoong Jung39982342020-01-14 10:27:18 -08003053func TestAndroidTest_FixTestConfig(t *testing.T) {
3054 ctx, _ := testJava(t, `
3055 android_app {
3056 name: "foo",
3057 srcs: ["a.java"],
3058 package_name: "com.android.foo",
3059 sdk_version: "current",
3060 }
3061
3062 android_test {
3063 name: "foo_test",
3064 srcs: ["b.java"],
3065 instrumentation_for: "foo",
3066 }
3067
3068 android_test {
3069 name: "bar_test",
3070 srcs: ["b.java"],
3071 package_name: "com.android.bar.test",
3072 instrumentation_for: "foo",
Seth Moorec6f4b532023-02-02 13:22:26 -08003073 mainline_package_name: "com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08003074 }
3075
3076 override_android_test {
3077 name: "baz_test",
3078 base: "foo_test",
3079 package_name: "com.android.baz.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08003080 mainline_package_name: "com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08003081 }
3082 `)
3083
3084 testCases := []struct {
3085 moduleName string
3086 variantName string
3087 expectedFlags []string
3088 }{
3089 {
3090 moduleName: "foo_test",
3091 variantName: "android_common",
3092 },
3093 {
3094 moduleName: "bar_test",
3095 variantName: "android_common",
3096 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003097 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003098 "--package-name com.android.bar.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08003099 "--mainline-package-name com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08003100 },
3101 },
3102 {
3103 moduleName: "foo_test",
3104 variantName: "android_common_baz_test",
3105 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003106 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003107 "--package-name com.android.baz.test",
3108 "--test-file-name baz_test.apk",
Seth Moorec6f4b532023-02-02 13:22:26 -08003109 "out/soong/.intermediates/foo_test/android_common_baz_test/test_config_fixer/AndroidTest.xml",
3110 "--mainline-package-name com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08003111 },
3112 },
3113 }
3114
3115 for _, test := range testCases {
3116 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01003117 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08003118
3119 if len(test.expectedFlags) > 0 {
3120 if params.Rule == nil {
3121 t.Errorf("test_config_fixer was expected to run, but didn't")
3122 } else {
3123 for _, flag := range test.expectedFlags {
3124 if !strings.Contains(params.RuleParams.Command, flag) {
3125 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
3126 }
3127 }
3128 }
3129 } else {
3130 if params.Rule != nil {
3131 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
3132 }
3133 }
Jaewoong Jung39982342020-01-14 10:27:18 -08003134 }
3135}
3136
Paul Duffin53a70a42022-01-11 14:35:55 +00003137func TestInstrumentationTargetPrebuilt(t *testing.T) {
3138 bp := `
3139 android_app_import {
3140 name: "foo",
3141 apk: "foo.apk",
3142 presigned: true,
3143 }
3144
3145 android_test {
3146 name: "bar",
3147 srcs: ["a.java"],
3148 instrumentation_for: "foo",
3149 sdk_version: "current",
3150 }
3151 `
3152
3153 android.GroupFixturePreparers(
3154 PrepareForTestWithJavaDefaultModules,
3155 ).ExtendWithErrorHandler(
3156 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
3157 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
3158 RunTestWithBp(t, bp)
3159}
3160
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003161func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07003162 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003163 cc_library {
3164 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08003165 sdk_version: "current",
3166 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003167 }
3168
3169 android_test {
3170 name: "stl",
3171 jni_libs: ["libjni"],
3172 compile_multilib: "both",
3173 sdk_version: "current",
3174 stl: "c++_shared",
3175 }
3176
3177 android_test {
3178 name: "system",
3179 jni_libs: ["libjni"],
3180 compile_multilib: "both",
3181 sdk_version: "current",
3182 }
3183 `)
3184
3185 testCases := []struct {
3186 name string
3187 jnis []string
3188 }{
3189 {"stl",
3190 []string{
3191 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07003192 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003193 },
3194 },
3195 {"system",
3196 []string{
3197 "libjni.so",
3198 },
3199 },
3200 }
3201
3202 for _, test := range testCases {
3203 t.Run(test.name, func(t *testing.T) {
3204 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07003205 jniLibZip := app.Output("jnilibs.zip")
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003206 var jnis []string
3207 args := strings.Fields(jniLibZip.Args["jarArgs"])
3208 for i := 0; i < len(args); i++ {
3209 if args[i] == "-f" {
3210 jnis = append(jnis, args[i+1])
3211 i += 1
3212 }
3213 }
3214 jnisJoined := strings.Join(jnis, " ")
3215 for _, jni := range test.jnis {
3216 if !strings.Contains(jnisJoined, jni) {
3217 t.Errorf("missing jni %q in %q", jni, jnis)
3218 }
3219 }
3220 })
3221 }
3222}
Colin Cross50ddcc42019-05-16 12:28:22 -07003223
3224func TestUsesLibraries(t *testing.T) {
3225 bp := `
3226 java_sdk_library {
3227 name: "foo",
3228 srcs: ["a.java"],
3229 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003230 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003231 }
3232
3233 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01003234 name: "qux",
3235 srcs: ["a.java"],
3236 api_packages: ["qux"],
3237 sdk_version: "current",
3238 }
3239
3240 java_sdk_library {
3241 name: "quuz",
3242 srcs: ["a.java"],
3243 api_packages: ["quuz"],
3244 sdk_version: "current",
3245 }
3246
3247 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003248 name: "fred",
3249 srcs: ["a.java"],
3250 api_packages: ["fred"],
3251 sdk_version: "current",
3252 }
3253
3254 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07003255 name: "bar",
3256 srcs: ["a.java"],
3257 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003258 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003259 }
3260
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01003261 java_sdk_library {
3262 name: "runtime-library",
3263 srcs: ["a.java"],
3264 sdk_version: "current",
3265 }
3266
3267 java_library {
3268 name: "static-runtime-helper",
3269 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00003270 libs: ["runtime-library.impl"],
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01003271 sdk_version: "current",
3272 }
3273
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003274 java_library {
3275 name: "runtime-required-x",
3276 srcs: ["a.java"],
3277 installable: true,
3278 sdk_version: "current",
3279 }
3280
3281 java_library {
3282 name: "runtime-optional-x",
3283 srcs: ["a.java"],
3284 installable: true,
3285 sdk_version: "current",
3286 }
3287
3288 android_library {
3289 name: "static-x",
3290 uses_libs: ["runtime-required-x"],
3291 optional_uses_libs: ["runtime-optional-x"],
3292 sdk_version: "current",
3293 }
3294
3295 java_library {
3296 name: "runtime-required-y",
3297 srcs: ["a.java"],
3298 installable: true,
3299 sdk_version: "current",
3300 }
3301
3302 java_library {
3303 name: "runtime-optional-y",
3304 srcs: ["a.java"],
3305 installable: true,
3306 sdk_version: "current",
3307 }
3308
3309 java_library {
3310 name: "static-y",
3311 srcs: ["a.java"],
3312 uses_libs: ["runtime-required-y"],
Jiakai Zhang36937082024-04-15 11:15:50 +00003313 optional_uses_libs: [
3314 "runtime-optional-y",
3315 "missing-lib-a",
3316 ],
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003317 sdk_version: "current",
3318 }
3319
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003320 // A library that has to use "provides_uses_lib", because:
3321 // - it is not an SDK library
3322 // - its library name is different from its module name
3323 java_library {
3324 name: "non-sdk-lib",
3325 provides_uses_lib: "com.non.sdk.lib",
3326 installable: true,
3327 srcs: ["a.java"],
3328 }
3329
Colin Cross50ddcc42019-05-16 12:28:22 -07003330 android_app {
3331 name: "app",
3332 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003333 libs: [
Jihoon Kang28c96572024-09-11 23:44:44 +00003334 "qux.impl",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003335 "quuz.stubs"
3336 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003337 static_libs: [
3338 "static-runtime-helper",
3339 // statically linked component libraries should not pull their SDK libraries,
3340 // so "fred" should not be added to class loader context
3341 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003342 "static-x",
3343 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003344 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003345 uses_libs: [
3346 "foo",
3347 "non-sdk-lib"
3348 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003349 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003350 optional_uses_libs: [
3351 "bar",
Jiakai Zhangf98da192024-04-15 11:15:41 +00003352 "missing-lib-b",
Colin Cross50ddcc42019-05-16 12:28:22 -07003353 ],
3354 }
3355
3356 android_app_import {
3357 name: "prebuilt",
3358 apk: "prebuilts/apk/app.apk",
3359 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003360 uses_libs: [
3361 "foo",
3362 "non-sdk-lib",
3363 "android.test.runner"
3364 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07003365 optional_uses_libs: [
3366 "bar",
Jiakai Zhangf98da192024-04-15 11:15:41 +00003367 "missing-lib-b",
Colin Cross50ddcc42019-05-16 12:28:22 -07003368 ],
3369 }
3370 `
3371
Paul Duffin71ae5942021-03-22 15:36:52 +00003372 result := android.GroupFixturePreparers(
3373 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003374 PrepareForTestWithJavaSdkLibraryFiles,
3375 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Jiakai Zhang48203e32023-06-02 23:42:21 +01003376 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3377 variables.BuildWarningBadOptionalUsesLibsAllowlist = []string{"app", "prebuilt"}
3378 }),
Paul Duffind234b412021-03-12 23:04:46 +00003379 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07003380
Paul Duffind234b412021-03-12 23:04:46 +00003381 app := result.ModuleForTests("app", "android_common")
3382 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07003383
Paul Duffin859fe962020-05-15 10:20:31 +01003384 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003385 // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be
3386 // propagated from dependencies.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003387 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
Jiyong Parkd044bb42024-05-15 02:09:54 +09003388 expectManifestFixerArgs := `--extract-native-libs=true ` +
3389 `--uses-library foo ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003390 `--uses-library com.non.sdk.lib ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003391 `--uses-library qux ` +
3392 `--uses-library quuz ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003393 `--uses-library runtime-library ` +
3394 `--uses-library runtime-required-x ` +
3395 `--uses-library runtime-required-y ` +
3396 `--optional-uses-library bar ` +
3397 `--optional-uses-library runtime-optional-x ` +
3398 `--optional-uses-library runtime-optional-y`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003399 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01003400
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003401 // Test that all libraries are verified (library order matters).
3402 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
3403 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00003404 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003405 `--uses-library qux ` +
3406 `--uses-library quuz ` +
3407 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003408 `--uses-library runtime-required-x ` +
3409 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003410 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003411 `--optional-uses-library runtime-optional-x ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003412 `--optional-uses-library runtime-optional-y ` +
Jiakai Zhang36937082024-04-15 11:15:50 +00003413 `--missing-optional-uses-library missing-lib-b ` +
3414 `--missing-optional-uses-library missing-lib-a`
Paul Duffind234b412021-03-12 23:04:46 +00003415 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003416
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003417 // Test that all libraries are verified for an APK (library order matters).
3418 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00003419 verifyApkArgs := `--uses-library foo ` +
3420 `--uses-library com.non.sdk.lib ` +
3421 `--uses-library android.test.runner ` +
3422 `--optional-uses-library bar ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003423 `--missing-optional-uses-library missing-lib-b `
Paul Duffind234b412021-03-12 23:04:46 +00003424 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003425
Jiakai Zhanga4496782023-05-17 16:57:30 +01003426 // Test that necessary args are passed for constructing CLC in Ninja phase.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003427 cmd := app.Rule("dexpreopt").RuleParams.Command
Jiakai Zhanga4496782023-05-17 16:57:30 +01003428 android.AssertStringDoesContain(t, "dexpreopt app cmd context", cmd, "--context-json=")
3429 android.AssertStringDoesContain(t, "dexpreopt app cmd product_packages", cmd,
Spandan Das2069c3f2023-12-06 19:40:24 +00003430 "--product-packages=out/soong/.intermediates/app/android_common/dexpreopt/app/product_packages.txt")
Colin Cross50ddcc42019-05-16 12:28:22 -07003431}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003432
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003433func TestDexpreoptBcp(t *testing.T) {
3434 bp := `
3435 java_sdk_library {
3436 name: "foo",
3437 srcs: ["a.java"],
3438 api_packages: ["foo"],
3439 sdk_version: "current",
3440 }
3441
3442 java_sdk_library {
3443 name: "bar",
3444 srcs: ["a.java"],
3445 api_packages: ["bar"],
3446 permitted_packages: ["bar"],
3447 sdk_version: "current",
3448 }
3449
3450 android_app {
3451 name: "app",
3452 srcs: ["a.java"],
3453 sdk_version: "current",
3454 }
3455 `
3456
3457 testCases := []struct {
3458 name string
3459 with bool
3460 expect string
3461 }{
3462 {
3463 name: "with updatable bcp",
3464 with: true,
3465 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
3466 },
3467 {
3468 name: "without updatable bcp",
3469 with: false,
3470 expect: "/system/framework/foo.jar",
3471 },
3472 }
3473
3474 for _, test := range testCases {
3475 t.Run(test.name, func(t *testing.T) {
3476 result := android.GroupFixturePreparers(
3477 prepareForJavaTest,
3478 PrepareForTestWithJavaSdkLibraryFiles,
3479 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
3480 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01003481 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003482 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
3483 ).RunTestWithBp(t, bp)
3484
3485 app := result.ModuleForTests("app", "android_common")
3486 cmd := app.Rule("dexpreopt").RuleParams.Command
3487 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
3488 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
3489 })
3490 }
3491}
3492
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003493func TestCodelessApp(t *testing.T) {
3494 testCases := []struct {
3495 name string
3496 bp string
3497 noCode bool
3498 }{
3499 {
3500 name: "normal",
3501 bp: `
3502 android_app {
3503 name: "foo",
3504 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003505 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003506 }
3507 `,
3508 noCode: false,
3509 },
3510 {
3511 name: "app without sources",
3512 bp: `
3513 android_app {
3514 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003515 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003516 }
3517 `,
3518 noCode: true,
3519 },
3520 {
3521 name: "app with libraries",
3522 bp: `
3523 android_app {
3524 name: "foo",
3525 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003526 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003527 }
3528
3529 java_library {
3530 name: "lib",
3531 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003532 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003533 }
3534 `,
3535 noCode: false,
3536 },
3537 {
3538 name: "app with sourceless libraries",
3539 bp: `
3540 android_app {
3541 name: "foo",
3542 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003543 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003544 }
3545
3546 java_library {
3547 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003548 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003549 }
3550 `,
3551 // TODO(jungjw): this should probably be true
3552 noCode: false,
3553 },
3554 }
3555
3556 for _, test := range testCases {
3557 t.Run(test.name, func(t *testing.T) {
3558 ctx := testApp(t, test.bp)
3559
3560 foo := ctx.ModuleForTests("foo", "android_common")
3561 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3562 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
3563 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
3564 }
3565 })
3566 }
3567}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07003568
Colin Cross53a87f52019-06-25 13:35:30 -07003569func TestUncompressDex(t *testing.T) {
3570 testCases := []struct {
3571 name string
3572 bp string
3573
3574 uncompressedPlatform bool
3575 uncompressedUnbundled bool
3576 }{
3577 {
3578 name: "normal",
3579 bp: `
3580 android_app {
3581 name: "foo",
3582 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003583 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003584 }
3585 `,
3586 uncompressedPlatform: true,
3587 uncompressedUnbundled: false,
3588 },
3589 {
3590 name: "use_embedded_dex",
3591 bp: `
3592 android_app {
3593 name: "foo",
3594 use_embedded_dex: true,
3595 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003596 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003597 }
3598 `,
3599 uncompressedPlatform: true,
3600 uncompressedUnbundled: true,
3601 },
3602 {
3603 name: "privileged",
3604 bp: `
3605 android_app {
3606 name: "foo",
3607 privileged: true,
3608 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003609 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003610 }
3611 `,
3612 uncompressedPlatform: true,
3613 uncompressedUnbundled: true,
3614 },
David Srbeckye033cba2020-05-20 22:20:28 +01003615 {
3616 name: "normal_uncompress_dex_true",
3617 bp: `
3618 android_app {
3619 name: "foo",
3620 srcs: ["a.java"],
3621 sdk_version: "current",
3622 uncompress_dex: true,
3623 }
3624 `,
3625 uncompressedPlatform: true,
3626 uncompressedUnbundled: true,
3627 },
3628 {
3629 name: "normal_uncompress_dex_false",
3630 bp: `
3631 android_app {
3632 name: "foo",
3633 srcs: ["a.java"],
3634 sdk_version: "current",
3635 uncompress_dex: false,
3636 }
3637 `,
3638 uncompressedPlatform: false,
3639 uncompressedUnbundled: false,
3640 },
Colin Cross53a87f52019-06-25 13:35:30 -07003641 }
3642
3643 test := func(t *testing.T, bp string, want bool, unbundled bool) {
3644 t.Helper()
3645
Paul Duffin71ae5942021-03-22 15:36:52 +00003646 result := android.GroupFixturePreparers(
3647 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003648 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00003649 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3650 if unbundled {
3651 variables.Unbundled_build = proptools.BoolPtr(true)
3652 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
3653 }
3654 }),
3655 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07003656
Paul Duffincdb88a92021-03-14 00:36:50 +00003657 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07003658 dex := foo.Rule("r8")
3659 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
3660 aligned := foo.MaybeRule("zipalign").Rule != nil
3661
Paul Duffincdb88a92021-03-14 00:36:50 +00003662 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07003663
Paul Duffincdb88a92021-03-14 00:36:50 +00003664 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07003665 }
3666
3667 for _, tt := range testCases {
3668 t.Run(tt.name, func(t *testing.T) {
3669 t.Run("platform", func(t *testing.T) {
3670 test(t, tt.bp, tt.uncompressedPlatform, false)
3671 })
3672 t.Run("unbundled", func(t *testing.T) {
3673 test(t, tt.bp, tt.uncompressedUnbundled, true)
3674 })
3675 })
3676 }
3677}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003678
3679func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
3680 if expectedValue != "" {
3681 expectedFlag := "--" + flagName + " " + expectedValue
3682 if !strings.Contains(aapt2Flags, expectedFlag) {
3683 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
3684 }
3685 } else {
3686 unexpectedFlag := "--" + flagName
3687 if strings.Contains(aapt2Flags, unexpectedFlag) {
3688 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
3689 }
3690 }
3691}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08003692
Cole Faust9a631312020-10-22 21:05:24 +00003693func TestExportedProguardFlagFiles(t *testing.T) {
3694 ctx, _ := testJava(t, `
3695 android_app {
3696 name: "foo",
3697 sdk_version: "current",
Colin Crosscde55342024-03-27 14:11:51 -07003698 static_libs: [
3699 "lib1",
3700 "lib3",
3701 ],
Cole Faust9a631312020-10-22 21:05:24 +00003702 }
3703
3704 android_library {
3705 name: "lib1",
3706 sdk_version: "current",
3707 optimize: {
3708 proguard_flags_files: ["lib1proguard.cfg"],
Colin Crosscde55342024-03-27 14:11:51 -07003709 },
3710 static_libs: ["lib2"],
3711 }
3712
3713 android_library {
3714 name: "lib2",
3715 sdk_version: "current",
3716 optimize: {
3717 proguard_flags_files: ["lib2proguard.cfg"],
Cole Faust9a631312020-10-22 21:05:24 +00003718 }
3719 }
Colin Crosscde55342024-03-27 14:11:51 -07003720
3721 android_library_import {
3722 name: "lib3",
3723 sdk_version: "current",
3724 aars: ["lib3.aar"],
3725 static_libs: ["lib4"],
3726 }
3727
3728 android_library {
3729 name: "lib4",
3730 sdk_version: "current",
3731 optimize: {
3732 proguard_flags_files: ["lib4proguard.cfg"],
3733 }
3734 }
3735
3736
Cole Faust9a631312020-10-22 21:05:24 +00003737 `)
3738
3739 m := ctx.ModuleForTests("foo", "android_common")
Colin Crosscde55342024-03-27 14:11:51 -07003740 r8 := m.Rule("java.r8")
3741 implicits := r8.Implicits.RelativeToTop().Strings()
3742 android.AssertStringListContains(t, "r8 implicits", implicits, "lib1proguard.cfg")
3743 android.AssertStringListContains(t, "r8 implicits", implicits, "lib2proguard.cfg")
3744 android.AssertStringListContains(t, "r8 implicits", implicits, "lib4proguard.cfg")
3745 android.AssertStringListContains(t, "r8 implicits", implicits, "out/soong/.intermediates/lib3/android_common/aar/proguard.txt")
Cole Faust9a631312020-10-22 21:05:24 +00003746
Colin Crosscde55342024-03-27 14:11:51 -07003747 flags := r8.Args["r8Flags"]
3748 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib1proguard.cfg")
3749 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib2proguard.cfg")
3750 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib4proguard.cfg")
3751 android.AssertStringDoesContain(t, "r8 flags", flags, "-include out/soong/.intermediates/lib3/android_common/aar/proguard.txt")
Cole Faust9a631312020-10-22 21:05:24 +00003752}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003753
3754func TestTargetSdkVersionManifestFixer(t *testing.T) {
3755 platform_sdk_codename := "Tiramisu"
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003756 platform_sdk_version := 33
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003757 testCases := []struct {
3758 name string
3759 targetSdkVersionInBp string
3760 targetSdkVersionExpected string
3761 unbundledBuild bool
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003762 platformSdkFinal bool
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003763 }{
3764 {
3765 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
3766 targetSdkVersionInBp: "30",
3767 targetSdkVersionExpected: "30",
3768 unbundledBuild: false,
3769 },
3770 {
3771 name: "Unbundled build: Android.bp has targetSdkVersion",
3772 targetSdkVersionInBp: "30",
3773 targetSdkVersionExpected: "30",
3774 unbundledBuild: true,
3775 },
3776 {
3777 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3778 targetSdkVersionInBp: platform_sdk_codename,
3779 targetSdkVersionExpected: platform_sdk_codename,
3780 unbundledBuild: false,
3781 },
3782 {
3783 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3784 targetSdkVersionInBp: platform_sdk_codename,
3785 targetSdkVersionExpected: "10000",
3786 unbundledBuild: true,
3787 },
3788
3789 {
3790 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
3791 targetSdkVersionExpected: platform_sdk_codename,
3792 unbundledBuild: false,
3793 },
3794 {
3795 name: "Unbundled build: Android.bp has no targetSdkVersion",
3796 targetSdkVersionExpected: "10000",
3797 unbundledBuild: true,
3798 },
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003799 {
3800 name: "Bundled build in REL branches",
3801 targetSdkVersionExpected: "33",
3802 unbundledBuild: false,
3803 platformSdkFinal: true,
3804 },
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003805 }
3806 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003807 targetSdkVersionTemplate := ""
3808 if testCase.targetSdkVersionInBp != "" {
3809 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, testCase.targetSdkVersionInBp)
3810 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003811 bp := fmt.Sprintf(`
3812 android_app {
3813 name: "foo",
3814 sdk_version: "current",
Spandan Dasca70fc42023-03-01 23:38:49 +00003815 %s
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003816 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003817 `, targetSdkVersionTemplate)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003818 fixture := android.GroupFixturePreparers(
3819 prepareForJavaTest,
3820 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003821 if testCase.platformSdkFinal {
3822 variables.Platform_sdk_final = proptools.BoolPtr(true)
3823 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003824 // explicitly set platform_sdk_codename to make the test deterministic
3825 variables.Platform_sdk_codename = &platform_sdk_codename
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003826 variables.Platform_sdk_version = &platform_sdk_version
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003827 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3828 // create a non-empty list if unbundledBuild==true
3829 if testCase.unbundledBuild {
3830 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3831 }
3832 }),
3833 )
3834
3835 result := fixture.RunTestWithBp(t, bp)
3836 foo := result.ModuleForTests("foo", "android_common")
3837
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003838 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3839 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003840 }
3841}
Colin Cross412436f2022-04-07 17:40:07 -07003842
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003843func TestDefaultAppTargetSdkVersionForUpdatableModules(t *testing.T) {
3844 platform_sdk_codename := "Tiramisu"
3845 platform_sdk_version := 33
3846 testCases := []struct {
3847 name string
3848 platform_sdk_final bool
3849 targetSdkVersionInBp *string
3850 targetSdkVersionExpected *string
3851 updatable bool
3852 }{
3853 {
3854 name: "Non-Updatable Module: Android.bp has older targetSdkVersion",
3855 targetSdkVersionInBp: proptools.StringPtr("29"),
3856 targetSdkVersionExpected: proptools.StringPtr("29"),
3857 updatable: false,
3858 },
3859 {
3860 name: "Updatable Module: Android.bp has older targetSdkVersion",
3861 targetSdkVersionInBp: proptools.StringPtr("30"),
3862 targetSdkVersionExpected: proptools.StringPtr("30"),
3863 updatable: true,
3864 },
3865 {
3866 name: "Updatable Module: Android.bp has no targetSdkVersion",
3867 targetSdkVersionExpected: proptools.StringPtr("10000"),
3868 updatable: true,
3869 },
3870 {
3871 name: "[SDK finalised] Non-Updatable Module: Android.bp has older targetSdkVersion",
3872 platform_sdk_final: true,
3873 targetSdkVersionInBp: proptools.StringPtr("30"),
3874 targetSdkVersionExpected: proptools.StringPtr("30"),
3875 updatable: false,
3876 },
3877 {
3878 name: "[SDK finalised] Updatable Module: Android.bp has older targetSdkVersion",
3879 platform_sdk_final: true,
3880 targetSdkVersionInBp: proptools.StringPtr("30"),
3881 targetSdkVersionExpected: proptools.StringPtr("30"),
3882 updatable: true,
3883 },
3884 {
3885 name: "[SDK finalised] Updatable Module: Android.bp has targetSdkVersion as platform sdk codename",
3886 platform_sdk_final: true,
3887 targetSdkVersionInBp: proptools.StringPtr(platform_sdk_codename),
3888 targetSdkVersionExpected: proptools.StringPtr("33"),
3889 updatable: true,
3890 },
3891 {
3892 name: "[SDK finalised] Updatable Module: Android.bp has no targetSdkVersion",
3893 platform_sdk_final: true,
3894 targetSdkVersionExpected: proptools.StringPtr("33"),
3895 updatable: true,
3896 },
3897 }
3898 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003899 targetSdkVersionTemplate := ""
3900 if testCase.targetSdkVersionInBp != nil {
3901 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, *testCase.targetSdkVersionInBp)
3902 }
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003903 bp := fmt.Sprintf(`
3904 android_app {
3905 name: "foo",
3906 sdk_version: "current",
3907 min_sdk_version: "29",
Spandan Dasca70fc42023-03-01 23:38:49 +00003908 %s
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003909 updatable: %t,
3910 enforce_default_target_sdk_version: %t
3911 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003912 `, targetSdkVersionTemplate, testCase.updatable, testCase.updatable) // enforce default target sdk version if app is updatable
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003913
3914 fixture := android.GroupFixturePreparers(
3915 PrepareForTestWithJavaDefaultModules,
3916 android.PrepareForTestWithAllowMissingDependencies,
3917 android.PrepareForTestWithAndroidMk,
3918 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3919 // explicitly set following platform variables to make the test deterministic
3920 variables.Platform_sdk_final = &testCase.platform_sdk_final
3921 variables.Platform_sdk_version = &platform_sdk_version
3922 variables.Platform_sdk_codename = &platform_sdk_codename
3923 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
Harshit Mahajan18845d02023-01-11 18:39:12 +00003924 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003925 variables.Unbundled_build_apps = []string{"sampleModule"}
3926 }),
3927 )
3928
3929 result := fixture.RunTestWithBp(t, bp)
3930 foo := result.ModuleForTests("foo", "android_common")
3931
3932 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3933 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+*testCase.targetSdkVersionExpected)
3934 }
3935}
3936
3937func TestEnforceDefaultAppTargetSdkVersionFlag(t *testing.T) {
3938 platform_sdk_codename := "Tiramisu"
3939 platform_sdk_version := 33
3940 testCases := []struct {
3941 name string
3942 enforceDefaultTargetSdkVersion bool
3943 expectedError string
3944 platform_sdk_final bool
3945 targetSdkVersionInBp string
3946 targetSdkVersionExpected string
3947 updatable bool
3948 }{
3949 {
3950 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
3951 enforceDefaultTargetSdkVersion: false,
3952 targetSdkVersionInBp: "29",
3953 targetSdkVersionExpected: "29",
3954 updatable: false,
3955 },
3956 {
3957 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3958 enforceDefaultTargetSdkVersion: true,
3959 platform_sdk_final: true,
3960 targetSdkVersionInBp: "current",
3961 targetSdkVersionExpected: "33",
3962 updatable: true,
3963 },
3964 {
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003965 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003966 enforceDefaultTargetSdkVersion: true,
3967 platform_sdk_final: false,
3968 targetSdkVersionInBp: "current",
3969 targetSdkVersionExpected: "10000",
3970 updatable: false,
3971 },
3972 {
3973 name: "Not enforcing Target SDK Version for Updatable app",
3974 enforceDefaultTargetSdkVersion: false,
3975 expectedError: "Updatable apps must enforce default target sdk version",
3976 targetSdkVersionInBp: "29",
3977 targetSdkVersionExpected: "29",
3978 updatable: true,
3979 },
3980 }
3981 for _, testCase := range testCases {
3982 errExpected := testCase.expectedError != ""
3983 bp := fmt.Sprintf(`
3984 android_app {
3985 name: "foo",
3986 enforce_default_target_sdk_version: %t,
3987 sdk_version: "current",
3988 min_sdk_version: "29",
3989 target_sdk_version: "%v",
3990 updatable: %t
3991 }
3992 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp, testCase.updatable)
3993
3994 fixture := android.GroupFixturePreparers(
3995 PrepareForTestWithJavaDefaultModules,
3996 android.PrepareForTestWithAllowMissingDependencies,
3997 android.PrepareForTestWithAndroidMk,
3998 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3999 // explicitly set following platform variables to make the test deterministic
4000 variables.Platform_sdk_final = &testCase.platform_sdk_final
4001 variables.Platform_sdk_version = &platform_sdk_version
4002 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00004003 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004004 variables.Unbundled_build_apps = []string{"sampleModule"}
4005 }),
4006 )
4007
4008 errorHandler := android.FixtureExpectsNoErrors
4009 if errExpected {
4010 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
4011 }
4012 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
4013
4014 if !errExpected {
4015 foo := result.ModuleForTests("foo", "android_common")
4016 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4017 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4018 }
4019 }
4020}
4021
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004022func TestEnforceDefaultAppTargetSdkVersionFlagForTests(t *testing.T) {
4023 platform_sdk_codename := "Tiramisu"
4024 platform_sdk_version := 33
4025 testCases := []struct {
4026 name string
4027 enforceDefaultTargetSdkVersion bool
4028 expectedError string
4029 platform_sdk_final bool
4030 targetSdkVersionInBp string
4031 targetSdkVersionExpected string
4032 }{
4033 {
4034 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
4035 enforceDefaultTargetSdkVersion: false,
4036 targetSdkVersionInBp: "29",
4037 targetSdkVersionExpected: "29",
4038 },
4039 {
4040 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4041 enforceDefaultTargetSdkVersion: true,
4042 platform_sdk_final: true,
4043 targetSdkVersionInBp: "current",
4044 targetSdkVersionExpected: "33",
4045 },
4046 {
4047 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4048 enforceDefaultTargetSdkVersion: true,
4049 platform_sdk_final: false,
4050 targetSdkVersionInBp: "current",
4051 targetSdkVersionExpected: "10000",
4052 },
4053 }
4054 for _, testCase := range testCases {
4055 errExpected := testCase.expectedError != ""
4056 bp := fmt.Sprintf(`
4057 android_test {
4058 name: "foo",
4059 enforce_default_target_sdk_version: %t,
4060 min_sdk_version: "29",
4061 target_sdk_version: "%v",
4062 }
4063 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp)
4064
4065 fixture := android.GroupFixturePreparers(
4066 PrepareForTestWithJavaDefaultModules,
4067 android.PrepareForTestWithAllowMissingDependencies,
4068 android.PrepareForTestWithAndroidMk,
4069 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4070 // explicitly set following platform variables to make the test deterministic
4071 variables.Platform_sdk_final = &testCase.platform_sdk_final
4072 variables.Platform_sdk_version = &platform_sdk_version
4073 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00004074 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004075 variables.Unbundled_build_apps = []string{"sampleModule"}
4076 }),
4077 )
4078
4079 errorHandler := android.FixtureExpectsNoErrors
4080 if errExpected {
4081 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
4082 }
4083 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
4084
4085 if !errExpected {
4086 foo := result.ModuleForTests("foo", "android_common")
4087 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4088 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4089 }
4090 }
4091}
4092
Colin Cross412436f2022-04-07 17:40:07 -07004093func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
4094 result := android.GroupFixturePreparers(
4095 PrepareForTestWithJavaDefaultModules,
4096 android.PrepareForTestWithAllowMissingDependencies,
4097 android.PrepareForTestWithAndroidMk,
4098 ).RunTestWithBp(t, `
4099 android_app {
4100 name: "foo",
4101 srcs: ["a.java"],
4102 certificate: ":missing_certificate",
4103 sdk_version: "current",
Zyan Wub7550aa2023-05-18 15:46:31 +08004104 }
4105
4106 android_app {
4107 name: "bar",
4108 srcs: ["a.java"],
4109 certificate: ":missing_certificate",
4110 product_specific: true,
4111 sdk_version: "current",
Colin Cross412436f2022-04-07 17:40:07 -07004112 }`)
4113
4114 foo := result.ModuleForTests("foo", "android_common")
4115 fooApk := foo.Output("foo.apk")
4116 if fooApk.Rule != android.ErrorRule {
4117 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
4118 }
4119 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
4120}
Sam Delmerico82602492022-06-10 17:05:42 +00004121
4122func TestAppIncludesJniPackages(t *testing.T) {
4123 ctx := android.GroupFixturePreparers(
4124 PrepareForTestWithJavaDefaultModules,
4125 ).RunTestWithBp(t, `
4126 android_library_import {
4127 name: "aary-nodeps",
4128 aars: ["aary.aar"],
4129 extract_jni: true,
4130 }
4131
4132 android_library {
4133 name: "aary-lib",
4134 sdk_version: "current",
4135 min_sdk_version: "21",
4136 static_libs: ["aary-nodeps"],
4137 }
4138
4139 android_app {
4140 name: "aary-lib-dep",
4141 sdk_version: "current",
4142 min_sdk_version: "21",
4143 manifest: "AndroidManifest.xml",
4144 static_libs: ["aary-lib"],
4145 use_embedded_native_libs: true,
4146 }
4147
4148 android_app {
4149 name: "aary-import-dep",
4150 sdk_version: "current",
4151 min_sdk_version: "21",
4152 manifest: "AndroidManifest.xml",
4153 static_libs: ["aary-nodeps"],
4154 use_embedded_native_libs: true,
4155 }
4156
4157 android_app {
4158 name: "aary-no-use-embedded",
4159 sdk_version: "current",
4160 min_sdk_version: "21",
4161 manifest: "AndroidManifest.xml",
4162 static_libs: ["aary-nodeps"],
4163 }`)
4164
4165 testCases := []struct {
4166 name string
4167 hasPackage bool
4168 }{
4169 {
4170 name: "aary-import-dep",
4171 hasPackage: true,
4172 },
4173 {
4174 name: "aary-lib-dep",
4175 hasPackage: true,
4176 },
4177 {
4178 name: "aary-no-use-embedded",
Jiyong Parkd044bb42024-05-15 02:09:54 +09004179 hasPackage: false,
Sam Delmerico82602492022-06-10 17:05:42 +00004180 },
4181 }
4182
4183 for _, tc := range testCases {
4184 t.Run(tc.name, func(t *testing.T) {
4185 app := ctx.ModuleForTests(tc.name, "android_common")
4186
4187 outputFile := "jnilibs.zip"
4188 jniOutputLibZip := app.MaybeOutput(outputFile)
4189 if jniOutputLibZip.Rule == nil && !tc.hasPackage {
4190 return
4191 }
4192
4193 jniPackage := "arm64-v8a_jni.zip"
4194 inputs := jniOutputLibZip.Inputs
4195 foundPackage := false
4196 for i := 0; i < len(inputs); i++ {
4197 if strings.Contains(inputs[i].String(), jniPackage) {
4198 foundPackage = true
4199 }
4200 }
4201 if foundPackage != tc.hasPackage {
4202 t.Errorf("expected to find %v in %v inputs; inputs = %v", jniPackage, outputFile, inputs)
4203 }
4204 })
4205 }
4206}
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004207
4208func TestTargetSdkVersionMtsTests(t *testing.T) {
4209 platformSdkCodename := "Tiramisu"
4210 android_test := "android_test"
4211 android_test_helper_app := "android_test_helper_app"
4212 bpTemplate := `
4213 %v {
4214 name: "mytest",
Spandan Dasb0410872024-06-25 03:30:03 +00004215 min_sdk_version: "34",
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004216 target_sdk_version: "%v",
4217 test_suites: ["othersuite", "%v"],
4218 }
4219 `
4220 testCases := []struct {
4221 desc string
4222 moduleType string
4223 targetSdkVersionInBp string
4224 targetSdkVersionExpected string
4225 testSuites string
4226 }{
4227 {
4228 desc: "Non-MTS android_test_apps targeting current should not be upgraded to 10000",
4229 moduleType: android_test,
4230 targetSdkVersionInBp: "current",
4231 targetSdkVersionExpected: platformSdkCodename,
4232 testSuites: "non-mts-suite",
4233 },
4234 {
4235 desc: "MTS android_test_apps targeting released sdks should not be upgraded to 10000",
4236 moduleType: android_test,
4237 targetSdkVersionInBp: "29",
4238 targetSdkVersionExpected: "29",
4239 testSuites: "mts-suite",
4240 },
4241 {
4242 desc: "MTS android_test_apps targeting current should be upgraded to 10000",
4243 moduleType: android_test,
4244 targetSdkVersionInBp: "current",
4245 targetSdkVersionExpected: "10000",
4246 testSuites: "mts-suite",
4247 },
4248 {
4249 desc: "MTS android_test_helper_apps targeting current should be upgraded to 10000",
4250 moduleType: android_test_helper_app,
4251 targetSdkVersionInBp: "current",
4252 targetSdkVersionExpected: "10000",
4253 testSuites: "mts-suite",
4254 },
4255 }
4256 fixture := android.GroupFixturePreparers(
4257 prepareForJavaTest,
4258 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4259 variables.Platform_sdk_codename = &platformSdkCodename
4260 variables.Platform_version_active_codenames = []string{platformSdkCodename}
4261 }),
4262 )
4263 for _, testCase := range testCases {
4264 result := fixture.RunTestWithBp(t, fmt.Sprintf(bpTemplate, testCase.moduleType, testCase.targetSdkVersionInBp, testCase.testSuites))
4265 mytest := result.ModuleForTests("mytest", "android_common")
4266 manifestFixerArgs := mytest.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4267 android.AssertStringDoesContain(t, testCase.desc, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4268 }
4269}
Andrei Onea580636b2022-08-17 16:53:46 +00004270
4271func TestPrivappAllowlist(t *testing.T) {
4272 testJavaError(t, "privileged must be set in order to use privapp_allowlist", `
4273 android_app {
4274 name: "foo",
4275 srcs: ["a.java"],
4276 privapp_allowlist: "perms.xml",
4277 }
4278 `)
4279
4280 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
4281 t,
4282 `
4283 android_app {
4284 name: "foo",
4285 srcs: ["a.java"],
Sam Delmerico15809f82023-05-15 17:21:47 -04004286 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
Andrei Onea580636b2022-08-17 16:53:46 +00004287 privileged: true,
Andrei Onea580636b2022-08-17 16:53:46 +00004288 sdk_version: "current",
4289 }
4290 override_android_app {
4291 name: "bar",
4292 base: "foo",
4293 package_name: "com.google.android.foo",
4294 }
4295 `,
4296 )
4297 app := result.ModuleForTests("foo", "android_common")
4298 overrideApp := result.ModuleForTests("foo", "android_common_bar")
4299
Sam Delmerico15809f82023-05-15 17:21:47 -04004300 // verify that privapp allowlist is created for override apps
Andrei Onea580636b2022-08-17 16:53:46 +00004301 overrideApp.Output("out/soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml")
Sam Delmerico15809f82023-05-15 17:21:47 -04004302 expectedAllowlistInput := "privapp_allowlist_com.android.foo.xml"
4303 overrideActualAllowlistInput := overrideApp.Rule("modifyAllowlist").Input.String()
4304 if expectedAllowlistInput != overrideActualAllowlistInput {
4305 t.Errorf("expected override allowlist to be %q; got %q", expectedAllowlistInput, overrideActualAllowlistInput)
Andrei Onea580636b2022-08-17 16:53:46 +00004306 }
4307
4308 // verify that permissions are copied to device
Cole Faust6b7075f2024-12-17 10:42:42 -08004309 app.Output("out/target/product/test_device/system/etc/permissions/foo.xml")
4310 overrideApp.Output("out/target/product/test_device/system/etc/permissions/bar.xml")
Andrei Onea580636b2022-08-17 16:53:46 +00004311}
Sam Delmericob1daccd2023-05-25 14:45:30 -04004312
4313func TestPrivappAllowlistAndroidMk(t *testing.T) {
4314 result := android.GroupFixturePreparers(
4315 PrepareForTestWithJavaDefaultModules,
4316 android.PrepareForTestWithAndroidMk,
4317 ).RunTestWithBp(
4318 t,
4319 `
4320 android_app {
4321 name: "foo",
4322 srcs: ["a.java"],
4323 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
4324 privileged: true,
4325 sdk_version: "current",
4326 }
4327 override_android_app {
4328 name: "bar",
4329 base: "foo",
4330 package_name: "com.google.android.foo",
4331 }
4332 `,
4333 )
4334 baseApp := result.ModuleForTests("foo", "android_common")
4335 overrideApp := result.ModuleForTests("foo", "android_common_bar")
4336
4337 baseAndroidApp := baseApp.Module().(*AndroidApp)
4338 baseEntries := android.AndroidMkEntriesForTest(t, result.TestContext, baseAndroidApp)[0]
4339 android.AssertStringMatches(
4340 t,
4341 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find foo.apk",
4342 baseEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4343 "\\S+foo.apk",
4344 )
4345 android.AssertStringMatches(
4346 t,
4347 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include foo.apk",
4348 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4349 "\\S+foo.apk",
4350 )
4351 android.AssertStringMatches(
4352 t,
4353 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4354 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4355 "\\S+foo.apk:\\S+/target/product/test_device/system/priv-app/foo/foo.apk",
4356 )
4357 android.AssertStringMatches(
4358 t,
4359 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4360 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004361 "privapp_allowlist_com.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/foo.xml",
Sam Delmericob1daccd2023-05-25 14:45:30 -04004362 )
4363
4364 overrideAndroidApp := overrideApp.Module().(*AndroidApp)
4365 overrideEntries := android.AndroidMkEntriesForTest(t, result.TestContext, overrideAndroidApp)[0]
4366 android.AssertStringMatches(
4367 t,
4368 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find bar.apk",
4369 overrideEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4370 "\\S+bar.apk",
4371 )
4372 android.AssertStringMatches(
4373 t,
4374 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include bar.apk",
4375 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4376 "\\S+bar.apk",
4377 )
4378 android.AssertStringMatches(
4379 t,
4380 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4381 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4382 "\\S+bar.apk:\\S+/target/product/test_device/system/priv-app/bar/bar.apk",
4383 )
4384 android.AssertStringMatches(
4385 t,
4386 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4387 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004388 "\\S+soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/bar.xml",
Sam Delmericob1daccd2023-05-25 14:45:30 -04004389 )
4390}
Sam Delmerico0e0d96e2023-08-18 22:43:28 +00004391
Jihoon Kang84b25892023-12-01 22:01:06 +00004392func TestAppFlagsPackages(t *testing.T) {
Jihoon Kang98ea8362024-07-16 18:20:03 +00004393 ctx := android.GroupFixturePreparers(
4394 prepareForJavaTest,
4395 android.FixtureMergeMockFs(
4396 map[string][]byte{
4397 "res/layout/layout.xml": nil,
4398 "res/values/strings.xml": nil,
4399 "res/values-en-rUS/strings.xml": nil,
4400 },
4401 ),
4402 ).RunTestWithBp(t, `
Jihoon Kang84b25892023-12-01 22:01:06 +00004403 android_app {
4404 name: "foo",
4405 srcs: ["a.java"],
4406 sdk_version: "current",
4407 flags_packages: [
4408 "bar",
4409 "baz",
4410 ],
4411 }
4412 aconfig_declarations {
4413 name: "bar",
Dennis Shen4e7773d2024-01-05 19:06:50 +00004414 package: "com.example.package.bar",
Yu Liu315a53c2024-04-24 16:41:57 +00004415 container: "com.android.foo",
Jihoon Kang84b25892023-12-01 22:01:06 +00004416 srcs: [
4417 "bar.aconfig",
4418 ],
4419 }
4420 aconfig_declarations {
4421 name: "baz",
Dennis Shen4e7773d2024-01-05 19:06:50 +00004422 package: "com.example.package.baz",
Yu Liu315a53c2024-04-24 16:41:57 +00004423 container: "com.android.foo",
Jihoon Kang84b25892023-12-01 22:01:06 +00004424 srcs: [
4425 "baz.aconfig",
4426 ],
4427 }
4428 `)
4429
4430 foo := ctx.ModuleForTests("foo", "android_common")
4431
4432 // android_app module depends on aconfig_declarations listed in flags_packages
4433 android.AssertBoolEquals(t, "foo expected to depend on bar", true,
Jihoon Kang98ea8362024-07-16 18:20:03 +00004434 CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "bar"))
Jihoon Kang84b25892023-12-01 22:01:06 +00004435
4436 android.AssertBoolEquals(t, "foo expected to depend on baz", true,
Jihoon Kang98ea8362024-07-16 18:20:03 +00004437 CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "baz"))
Jihoon Kang84b25892023-12-01 22:01:06 +00004438
4439 aapt2LinkRule := foo.Rule("android/soong/java.aapt2Link")
4440 linkInFlags := aapt2LinkRule.Args["inFlags"]
4441 android.AssertStringDoesContain(t,
4442 "aapt2 link command expected to pass feature flags arguments",
4443 linkInFlags,
4444 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4445 )
Jihoon Kang98ea8362024-07-16 18:20:03 +00004446
4447 aapt2CompileRule := foo.Rule("android/soong/java.aapt2Compile")
4448 compileFlags := aapt2CompileRule.Args["cFlags"]
4449 android.AssertStringDoesContain(t,
4450 "aapt2 compile command expected to pass feature flags arguments",
4451 compileFlags,
4452 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4453 )
Jihoon Kang84b25892023-12-01 22:01:06 +00004454}
Spandan Das0727ba72024-02-13 16:37:43 +00004455
Jihoon Kang9aef7772024-06-14 23:45:06 +00004456func TestAppFlagsPackagesPropagation(t *testing.T) {
4457 ctx := testApp(t, `
4458 aconfig_declarations {
4459 name: "foo",
4460 package: "com.example.package.foo",
4461 container: "com.android.foo",
4462 srcs: [
4463 "foo.aconfig",
4464 ],
4465 }
4466 aconfig_declarations {
4467 name: "bar",
4468 package: "com.example.package.bar",
4469 container: "com.android.bar",
4470 srcs: [
4471 "bar.aconfig",
4472 ],
4473 }
4474 aconfig_declarations {
4475 name: "baz",
4476 package: "com.example.package.baz",
4477 container: "com.android.baz",
4478 srcs: [
4479 "baz.aconfig",
4480 ],
4481 }
4482 android_library {
4483 name: "foo_lib",
4484 srcs: ["a.java"],
4485 sdk_version: "current",
4486 flags_packages: [
4487 "foo",
4488 ],
4489 }
4490 android_library {
4491 name: "bar_lib",
4492 srcs: ["a.java"],
4493 sdk_version: "current",
4494 flags_packages: [
4495 "bar",
4496 ],
4497 }
4498 android_app {
4499 name: "baz_app",
4500 srcs: ["a.java"],
4501 sdk_version: "current",
4502 flags_packages: [
4503 "baz",
4504 ],
4505 static_libs: [
4506 "bar_lib",
4507 ],
4508 libs: [
4509 "foo_lib",
4510 ],
4511 }
4512 `)
4513
4514 bazApp := ctx.ModuleForTests("baz_app", "android_common")
4515
4516 // android_app module depends on aconfig_declarations listed in flags_packages
4517 // and that of static libs, but not libs
4518 aapt2LinkRule := bazApp.Rule("android/soong/java.aapt2Link")
4519 linkInFlags := aapt2LinkRule.Args["inFlags"]
4520 android.AssertStringDoesContain(t,
4521 "aapt2 link command expected to pass feature flags arguments of flags_packages and that of its static libs",
4522 linkInFlags,
4523 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4524 )
4525 android.AssertStringDoesNotContain(t,
4526 "aapt2 link command expected to not pass feature flags arguments of flags_packages of its libs",
4527 linkInFlags,
4528 "--feature-flags @out/soong/.intermediates/foo/intermediate.txt",
4529 )
4530}
4531
Spandan Das0727ba72024-02-13 16:37:43 +00004532// Test that dexpreopt is disabled if an optional_uses_libs exists, but does not provide an implementation.
4533func TestNoDexpreoptOptionalUsesLibDoesNotHaveImpl(t *testing.T) {
4534 bp := `
4535 java_sdk_library_import {
4536 name: "sdklib_noimpl",
4537 public: {
4538 jars: ["stub.jar"],
4539 },
4540 }
4541 android_app {
4542 name: "app",
4543 srcs: ["a.java"],
4544 sdk_version: "current",
4545 optional_uses_libs: [
4546 "sdklib_noimpl",
4547 ],
4548 }
4549 `
4550 result := prepareForJavaTest.RunTestWithBp(t, bp)
4551 dexpreopt := result.ModuleForTests("app", "android_common").MaybeRule("dexpreopt").Rule
4552 android.AssertBoolEquals(t, "dexpreopt should be disabled if optional_uses_libs does not have an implementation", true, dexpreopt == nil)
4553}
yangbill2af0b6e2024-03-15 09:29:29 +00004554
Ronald Braunsteincdc66f42024-04-12 11:23:19 -07004555func TestTestOnlyApp(t *testing.T) {
4556 t.Parallel()
4557 ctx := android.GroupFixturePreparers(
4558 prepareForJavaTest,
4559 ).RunTestWithBp(t, `
4560 // These should be test-only
4561 android_test {
4562 name: "android-test",
4563 }
4564 android_test_helper_app {
4565 name: "helper-app",
4566 }
4567 override_android_test {
4568 name: "override-test",
4569 base: "android-app",
4570 }
4571 // And these should not be
4572 android_app {
4573 name: "android-app",
4574 srcs: ["b.java"],
4575 sdk_version: "current",
4576 }
4577 `)
4578
4579 expectedTestOnly := []string{
4580 "android-test",
4581 "helper-app",
4582 "override-test",
4583 }
4584
4585 expectedTopLevel := []string{
4586 "android-test",
4587 "override-test",
4588 }
4589
4590 assertTestOnlyAndTopLevel(t, ctx, expectedTestOnly, expectedTopLevel)
4591}
4592
Jiyong Parkf528b702024-12-30 16:01:58 +09004593func TestTestConfigTemplate(t *testing.T) {
4594 t.Parallel()
4595 ctx := android.GroupFixturePreparers(
4596 prepareForJavaTest,
4597 ).RunTestWithBp(t, `
4598 android_test {
4599 name: "android-test",
4600 test_config_template: "AndroidTestTemplate.xml",
4601 test_options: {
4602 tradefed_options: [
4603 {
4604 name: "name1",
4605 key: "key1",
4606 value: "value1",
4607 },
4608 {
4609 name: "name2",
4610 key: "key2",
4611 value: "value2",
4612 },
4613 ],
4614 test_runner_options: [
4615 {
4616 name: "name3",
4617 key: "key3",
4618 value: "value3",
4619 },
4620 {
4621 name: "name4",
4622 key: "key4",
4623 value: "value4",
4624 },
4625 ],
4626 },
4627 }
4628 `)
4629 type option struct {
4630 name string
4631 key string
4632 value string
4633 }
4634 re := regexp.MustCompile(`<option name="(.*)" key="(.*)" value="(.*)" />`)
4635 parse_options := func(optionsString string) []option {
4636 lines := strings.Split(optionsString, `\n`)
4637 var ret []option
4638 for _, l := range lines {
4639 sm := re.FindStringSubmatch(l)
4640 if sm == nil {
4641 continue
4642 }
4643 ret = append(ret, option{sm[1], sm[2], sm[3]})
4644 }
4645 return ret
4646 }
4647 rule := ctx.ModuleForTests("android-test", "android_common").Rule("autogenInstrumentationTest")
4648 android.AssertSameArray(t, "extraConfigs mismatch",
4649 []option{
4650 {"name1", "key1", "value1"},
4651 {"name2", "key2", "value2"},
4652 },
4653 parse_options(rule.Args["extraConfigs"]))
4654 android.AssertSameArray(t, "extraTestRunnerConfigs mismatch",
4655 []option{
4656 {"name3", "key3", "value3"},
4657 {"name4", "key4", "value4"},
4658 },
4659 parse_options(rule.Args["extraTestRunnerConfigs"]))
4660}
4661
yangbill2af0b6e2024-03-15 09:29:29 +00004662func TestAppStem(t *testing.T) {
4663 ctx := testApp(t, `
4664 android_app {
4665 name: "foo",
4666 srcs: ["a.java"],
4667 stem: "foo-new",
4668 sdk_version: "current",
4669 }`)
4670
4671 foo := ctx.ModuleForTests("foo", "android_common")
4672
4673 outputs := fmt.Sprint(foo.AllOutputs())
4674 if !strings.Contains(outputs, "foo-new.apk") {
4675 t.Errorf("Module output does not contain expected apk %s", "foo-new.apk")
4676 }
4677}
Spandan Dasb9c58352024-05-13 18:29:45 +00004678
4679func TestAppMinSdkVersionOverride(t *testing.T) {
4680 result := android.GroupFixturePreparers(
4681 PrepareForTestWithJavaDefaultModules,
4682 ).RunTestWithBp(t, `
4683 android_app {
4684 name: "com.android.foo",
4685 srcs: ["a.java"],
4686 sdk_version: "current",
4687 min_sdk_version: "31",
4688 updatable: true,
4689 }
4690 override_android_app {
4691 name: "com.android.go.foo",
4692 base: "com.android.foo",
4693 min_sdk_version: "33",
4694 }
4695 `)
4696 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
4697 fooOverride := result.ModuleForTests("com.android.foo", "android_common_com.android.go.foo").Rule("manifestFixer")
4698
4699 android.AssertStringDoesContain(t,
4700 "com.android.foo: expected manifest fixer to set minSdkVersion to T",
4701 foo.BuildParams.Args["args"],
4702 "--minSdkVersion 31",
4703 )
4704 android.AssertStringDoesContain(t,
4705 "com.android.go.foo: expected manifest fixer to set minSdkVersion to T",
4706 fooOverride.BuildParams.Args["args"],
4707 "--minSdkVersion 33",
4708 )
4709
4710}
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +00004711
4712func TestNotApplyDefaultUpdatableModuleVersion(t *testing.T) {
4713 result := android.GroupFixturePreparers(
4714 PrepareForTestWithJavaDefaultModules,
4715 ).RunTestWithBp(t, `
4716 android_app {
4717 name: "com.android.foo",
4718 srcs: ["a.java"],
4719 sdk_version: "current",
4720 min_sdk_version: "31",
4721 }
4722 `)
4723 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
4724 android.AssertStringDoesNotContain(t,
4725 "com.android.foo: expected manifest fixer to not set override-placeholder-version",
4726 foo.BuildParams.Args["args"],
4727 "--override-placeholder-version",
4728 )
4729}
4730
4731func TestNotApplyOverrideApexManifestDefaultVersion(t *testing.T) {
4732 result := android.GroupFixturePreparers(
4733 PrepareForTestWithJavaDefaultModules,
4734 android.FixtureMergeEnv(map[string]string{
4735 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4736 }),
4737 ).RunTestWithBp(t, `
4738 android_app {
4739 name: "com.android.foo",
4740 srcs: ["a.java"],
4741 sdk_version: "current",
4742 min_sdk_version: "31",
4743 }
4744 `)
4745 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
4746 android.AssertStringDoesNotContain(t,
4747 "com.android.foo: expected manifest fixer to not set override-placeholder-version",
4748 foo.BuildParams.Args["args"],
4749 "--override-placeholder-version",
4750 )
4751}
Jihoon Kang1c743042024-10-22 21:34:17 +00004752
4753func TestResourcesWithFlagDirectories(t *testing.T) {
4754 result := android.GroupFixturePreparers(
4755 PrepareForTestWithJavaDefaultModules,
4756 android.FixtureMergeMockFs(android.MockFS{
4757 "res/flag(test.package.flag1)/values/bools.xml": nil,
4758 "res/flag(!test.package.flag2)/values/bools.xml": nil,
4759 "res/flag(test.package.flag1)/values-config/strings_google_services.xml": nil,
4760 "res/flags(test.package.flag1)/values/strings.xml": nil,
4761 }),
4762 ).RunTestWithBp(t, `
4763 android_library {
4764 name: "foo",
4765 srcs: ["a.java"],
4766 use_resource_processor: true,
4767 resource_dirs: [
4768 "res",
4769 ],
4770 }
4771 `)
4772 fooModule := result.ModuleForTests("foo", "android_common")
4773 compileOutputPaths := fooModule.Rule("aapt2Compile").Outputs.Strings()
4774
4775 android.AssertStringListContains(
4776 t,
4777 "Expected to generate flag path",
4778 compileOutputPaths,
4779 "out/soong/.intermediates/foo/android_common/aapt2/res/values_bools.(test.package.flag1).arsc.flat",
4780 )
4781 android.AssertStringListContains(
4782 t,
4783 "Expected to generate flag path with ! prefix in name",
4784 compileOutputPaths,
4785 "out/soong/.intermediates/foo/android_common/aapt2/res/values_bools.(!test.package.flag2).arsc.flat",
4786 )
4787 android.AssertStringListContains(
4788 t,
4789 "Expected to generate flag path with configs",
4790 compileOutputPaths,
4791 "out/soong/.intermediates/foo/android_common/aapt2/res/values-config_strings_google_services.(test.package.flag1).arsc.flat",
4792 )
4793 android.AssertStringListDoesNotContain(
4794 t,
4795 "Expected to not generate flag path with non-flag(flag_name) pattern",
4796 compileOutputPaths,
4797 "out/soong/.intermediates/foo/android_common/aapt2/res/values_strings.(test.package.flag1).arsc.flat",
4798 )
4799}
Spandan Dasde588a32024-12-03 22:52:24 +00004800
4801func TestAutogeneratedStaticRro(t *testing.T) {
4802 t.Parallel()
4803 bp := `
4804android_app {
4805 name: "foo",
4806 srcs: ["foo.java"],
4807 platform_apis: true,
4808}
4809override_android_app {
4810 name: "override_foo",
4811 base: "foo",
4812}
4813`
4814 testCases := []struct {
4815 desc string
4816 preparer android.FixturePreparer
4817 overlayApkExpected bool
4818 }{
4819 {
4820 desc: "No DEVICE_PACKAGE_OVERLAYS, no overlay .apk file",
4821 overlayApkExpected: false,
4822 },
4823 {
4824 desc: "DEVICE_PACKAGE_OVERLAYS exists, but the directory is empty",
4825 overlayApkExpected: false,
4826 preparer: android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4827 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4828 }),
4829 },
4830 {
4831 desc: "DEVICE_PACKAGE_OVERLAYS exists, directory is non-empty, but does not contain a matching resource dir",
4832 overlayApkExpected: false,
4833 preparer: android.GroupFixturePreparers(
4834 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4835 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4836 }),
4837 android.MockFS{
4838 "res/foo.xml": nil,
4839 "device/company/test_product/different_res/foo.xml": nil, // different dir
4840 }.AddToFixture(),
4841 ),
4842 },
4843 {
4844 desc: "DEVICE_PACKAGE_OVERLAYS and the directory contain a matching resource dir",
4845 overlayApkExpected: true,
4846 preparer: android.GroupFixturePreparers(
4847 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4848 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4849 }),
4850 android.MockFS{
4851 "res/foo.xml": nil,
4852 "device/company/test_product/res/foo.xml": nil,
4853 }.AddToFixture(),
4854 ),
4855 },
4856 }
4857 for _, tc := range testCases {
4858 result := android.GroupFixturePreparers(
4859 PrepareForTestWithJavaDefaultModules,
4860 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4861 variables.EnforceRROTargets = []string{"*"}
4862 }),
4863 android.OptionalFixturePreparer(tc.preparer),
4864 ).RunTestWithBp(t, bp)
4865 vendorOverlayApk := result.ModuleForTests("foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").MaybeOutput("foo__test_product__auto_generated_rro_vendor.apk")
4866 android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, vendorOverlayApk.Rule != nil)
4867 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")
4868 android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, overrideVendorOverlayApk.Rule != nil)
4869 }
4870}
Spandan Dasef8b3b22024-12-04 01:34:34 +00004871
4872func TestNoAutogeneratedStaticRroForDisabledOverrideApps(t *testing.T) {
4873 t.Parallel()
4874 bp := `
4875soong_config_module_type {
4876 name: "my_custom_override_android_app",
4877 module_type: "override_android_app",
4878 config_namespace: "my_namespace",
4879 value_variables: ["my_app_enabled"],
4880 properties: ["enabled"],
4881}
4882soong_config_bool_variable {
4883 name: "my_app_enabled",
4884}
4885android_app {
4886 name: "foo",
4887 srcs: ["foo.java"],
4888 platform_apis: true,
4889}
4890my_custom_override_android_app {
4891 name: "override_foo",
4892 base: "foo",
4893 soong_config_variables: {
4894 my_app_enabled: {
4895 enabled: true,
4896 conditions_default: {
4897 enabled: false
4898 },
4899 },
4900 }
4901}
4902`
4903 testCases := []struct {
4904 desc string
4905 preparer android.FixturePreparer
4906 overlayApkExpected bool
4907 }{
4908 {
4909 desc: "my_app_enabled is empty",
4910 overlayApkExpected: false,
4911 },
4912 {
4913 desc: "my_app_enabled is true",
4914 overlayApkExpected: true,
4915 preparer: android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4916 variables.VendorVars = map[string]map[string]string{
4917 "my_namespace": {
4918 "my_app_enabled": "true",
4919 },
4920 }
4921 }),
4922 },
4923 }
4924 for _, tc := range testCases {
4925 result := android.GroupFixturePreparers(
4926 PrepareForTestWithJavaDefaultModules,
4927 android.PrepareForTestWithSoongConfigModuleBuildComponents,
4928 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4929 variables.EnforceRROTargets = []string{"*"}
4930 }),
4931 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4932 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4933 }),
4934 android.MockFS{
4935 "res/foo.xml": nil,
4936 "device/company/test_product/res/foo.xml": nil,
4937 }.AddToFixture(),
4938 android.OptionalFixturePreparer(tc.preparer),
4939 ).RunTestWithBp(t, bp)
4940 overrideVendorOverlayApk := result.ModuleForTests("override_foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").Module().(*AutogenRuntimeResourceOverlay)
4941 android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, overrideVendorOverlayApk.exportPackage != nil)
4942 }
4943}