blob: 5f5f04d785b26f4c3648b0dac652f7117d88270c [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) {
Colin Cross844cb6a2025-01-29 15:53:21 -080045 t.Parallel()
Paul Duffin0ed42d32021-03-13 02:19:32 +000046 resourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080047 "res/layout/layout.xml",
48 "res/values/strings.xml",
49 "res/values-en-rUS/strings.xml",
50 }
51
Paul Duffin0ed42d32021-03-13 02:19:32 +000052 compiledResourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080053 "aapt2/res/layout_layout.xml.flat",
54 "aapt2/res/values_strings.arsc.flat",
55 "aapt2/res/values-en-rUS_strings.arsc.flat",
56 }
Colin Cross3bc7ffa2017-11-22 16:19:37 -080057
Colin Crossa97c5d32018-03-28 14:58:31 -070058 for _, moduleType := range []string{"android_app", "android_library"} {
59 t.Run(moduleType, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -080060 t.Parallel()
Paul Duffin71ae5942021-03-22 15:36:52 +000061 result := android.GroupFixturePreparers(
62 prepareForJavaTest,
Paul Duffin0ed42d32021-03-13 02:19:32 +000063 android.FixtureModifyMockFS(func(fs android.MockFS) {
64 for _, file := range resourceFiles {
65 fs[file] = nil
66 }
67 }),
68 ).RunTestWithBp(t, moduleType+` {
Colin Crossa97c5d32018-03-28 14:58:31 -070069 name: "foo",
70 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090071 sdk_version: "current"
Colin Crossa97c5d32018-03-28 14:58:31 -070072 }
73 `)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080074
Colin Cross90607e92025-02-11 14:58:07 -080075 foo := result.ModuleForTests(t, "foo", "android_common")
Colin Cross3bc7ffa2017-11-22 16:19:37 -080076
Colin Cross31656952018-05-24 16:11:20 -070077 var expectedLinkImplicits []string
78
79 manifestFixer := foo.Output("manifest_fixer/AndroidManifest.xml")
80 expectedLinkImplicits = append(expectedLinkImplicits, manifestFixer.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080081
Colin Cross90607e92025-02-11 14:58:07 -080082 frameworkRes := result.ModuleForTests(t, "framework-res", "android_common")
Colin Crossa97c5d32018-03-28 14:58:31 -070083 expectedLinkImplicits = append(expectedLinkImplicits,
84 frameworkRes.Output("package-res.apk").Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080085
Colin Crossa97c5d32018-03-28 14:58:31 -070086 // Test the mapping from input files to compiled output file names
87 compile := foo.Output(compiledResourceFiles[0])
Paul Duffin0ed42d32021-03-13 02:19:32 +000088 android.AssertDeepEquals(t, "aapt2 compile inputs", resourceFiles, compile.Inputs.Strings())
Colin Crossb69301e2017-12-01 10:48:26 -080089
Colin Crossa97c5d32018-03-28 14:58:31 -070090 compiledResourceOutputs := compile.Outputs.Strings()
91 sort.Strings(compiledResourceOutputs)
Colin Crossb69301e2017-12-01 10:48:26 -080092
Colin Crossa97c5d32018-03-28 14:58:31 -070093 expectedLinkImplicits = append(expectedLinkImplicits, compiledResourceOutputs...)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080094
Colin Crossa97c5d32018-03-28 14:58:31 -070095 list := foo.Output("aapt2/res.list")
96 expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080097
Colin Crossa97c5d32018-03-28 14:58:31 -070098 // Check that the link rule uses
Colin Cross90607e92025-02-11 14:58:07 -080099 res := result.ModuleForTests(t, "foo", "android_common").Output("package-res.apk")
Paul Duffin0ed42d32021-03-13 02:19:32 +0000100 android.AssertDeepEquals(t, "aapt2 link implicits", expectedLinkImplicits, res.Implicits.Strings())
Colin Crossa97c5d32018-03-28 14:58:31 -0700101 })
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800102 }
103}
Colin Cross890ff552017-11-30 20:13:19 -0800104
Colin Crosse560c4a2019-03-19 16:03:11 -0700105func TestAppSplits(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800106 t.Parallel()
Colin Crosse560c4a2019-03-19 16:03:11 -0700107 ctx := testApp(t, `
108 android_app {
109 name: "foo",
110 srcs: ["a.java"],
111 package_splits: ["v4", "v7,hdpi"],
Jeongik Cha538c0d02019-07-11 15:54:27 +0900112 sdk_version: "current"
Colin Crosse560c4a2019-03-19 16:03:11 -0700113 }`)
114
Colin Cross90607e92025-02-11 14:58:07 -0800115 foo := ctx.ModuleForTests(t, "foo", "android_common")
Colin Crosse560c4a2019-03-19 16:03:11 -0700116
117 expectedOutputs := []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000118 "out/soong/.intermediates/foo/android_common/foo.apk",
119 "out/soong/.intermediates/foo/android_common/foo_v4.apk",
120 "out/soong/.intermediates/foo/android_common/foo_v7_hdpi.apk",
Colin Crosse560c4a2019-03-19 16:03:11 -0700121 }
122 for _, expectedOutput := range expectedOutputs {
123 foo.Output(expectedOutput)
124 }
125
Yu Liu51c22312024-08-20 23:56:15 +0000126 outputFiles := foo.OutputFiles(ctx, t, "")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000127 android.AssertPathsRelativeToTopEquals(t, `OutputFiles("")`, expectedOutputs, outputFiles)
Colin Crosse560c4a2019-03-19 16:03:11 -0700128}
129
Jeongik Cha538c0d02019-07-11 15:54:27 +0900130func TestPlatformAPIs(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800131 t.Parallel()
Jeongik Cha538c0d02019-07-11 15:54:27 +0900132 testJava(t, `
133 android_app {
134 name: "foo",
135 srcs: ["a.java"],
136 platform_apis: true,
137 }
138 `)
139
140 testJava(t, `
141 android_app {
142 name: "foo",
143 srcs: ["a.java"],
144 sdk_version: "current",
145 }
146 `)
147
Spandan Das60999342021-11-16 04:15:33 +0000148 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 +0900149 android_app {
150 name: "bar",
151 srcs: ["b.java"],
152 }
153 `)
154
Spandan Das60999342021-11-16 04:15:33 +0000155 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 +0900156 android_app {
157 name: "bar",
158 srcs: ["b.java"],
159 sdk_version: "system_current",
160 platform_apis: true,
161 }
162 `)
163}
164
Jeongik Chae403e9e2019-12-07 00:16:24 +0900165func TestAndroidAppLinkType(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800166 t.Parallel()
Jeongik Chae403e9e2019-12-07 00:16:24 +0900167 testJava(t, `
168 android_app {
169 name: "foo",
170 srcs: ["a.java"],
171 libs: ["bar"],
172 static_libs: ["baz"],
173 platform_apis: true,
174 }
175
176 java_library {
177 name: "bar",
178 sdk_version: "current",
179 srcs: ["b.java"],
180 }
181
182 android_library {
183 name: "baz",
184 sdk_version: "system_current",
185 srcs: ["c.java"],
186 }
187 `)
188
Steven Moreland00298982020-11-17 21:44:36 +0000189 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900190 android_app {
191 name: "foo",
192 srcs: ["a.java"],
193 libs: ["bar"],
194 sdk_version: "current",
195 static_libs: ["baz"],
196 }
197
198 java_library {
199 name: "bar",
200 sdk_version: "current",
201 srcs: ["b.java"],
202 }
203
204 android_library {
205 name: "baz",
206 sdk_version: "system_current",
207 srcs: ["c.java"],
208 }
209 `)
210
211 testJava(t, `
212 android_app {
213 name: "foo",
214 srcs: ["a.java"],
215 libs: ["bar"],
216 sdk_version: "system_current",
217 static_libs: ["baz"],
218 }
219
220 java_library {
221 name: "bar",
222 sdk_version: "current",
223 srcs: ["b.java"],
224 }
225
226 android_library {
227 name: "baz",
228 sdk_version: "system_current",
229 srcs: ["c.java"],
230 }
231 `)
232
Steven Moreland00298982020-11-17 21:44:36 +0000233 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900234 android_app {
235 name: "foo",
236 srcs: ["a.java"],
237 libs: ["bar"],
238 sdk_version: "system_current",
239 static_libs: ["baz"],
240 }
241
242 java_library {
243 name: "bar",
244 sdk_version: "current",
245 srcs: ["b.java"],
246 }
247
248 android_library {
249 name: "baz",
250 srcs: ["c.java"],
251 }
252 `)
253}
254
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100255func TestUpdatableApps(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800256 t.Parallel()
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100257 testCases := []struct {
258 name string
259 bp string
260 expectedError string
261 }{
262 {
263 name: "Stable public SDK",
264 bp: `android_app {
265 name: "foo",
266 srcs: ["a.java"],
267 sdk_version: "29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100268 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100269 updatable: true,
270 }`,
271 },
272 {
273 name: "Stable system SDK",
274 bp: `android_app {
275 name: "foo",
276 srcs: ["a.java"],
277 sdk_version: "system_29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100278 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100279 updatable: true,
280 }`,
281 },
282 {
283 name: "Current public SDK",
284 bp: `android_app {
285 name: "foo",
286 srcs: ["a.java"],
287 sdk_version: "current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100288 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100289 updatable: true,
290 }`,
291 },
292 {
293 name: "Current system SDK",
294 bp: `android_app {
295 name: "foo",
296 srcs: ["a.java"],
297 sdk_version: "system_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100298 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100299 updatable: true,
300 }`,
301 },
302 {
303 name: "Current module SDK",
304 bp: `android_app {
305 name: "foo",
306 srcs: ["a.java"],
307 sdk_version: "module_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100308 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100309 updatable: true,
310 }`,
311 },
312 {
313 name: "Current core SDK",
314 bp: `android_app {
315 name: "foo",
316 srcs: ["a.java"],
317 sdk_version: "core_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100318 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100319 updatable: true,
320 }`,
321 },
322 {
323 name: "No Platform APIs",
324 bp: `android_app {
325 name: "foo",
326 srcs: ["a.java"],
327 platform_apis: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100328 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100329 updatable: true,
330 }`,
331 expectedError: "Updatable apps must use stable SDKs",
332 },
333 {
334 name: "No Core Platform APIs",
335 bp: `android_app {
336 name: "foo",
337 srcs: ["a.java"],
338 sdk_version: "core_platform",
Artur Satayevf40fc852020-04-16 13:43:02 +0100339 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100340 updatable: true,
341 }`,
342 expectedError: "Updatable apps must use stable SDKs",
343 },
344 {
345 name: "No unspecified APIs",
346 bp: `android_app {
347 name: "foo",
348 srcs: ["a.java"],
349 updatable: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100350 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100351 }`,
352 expectedError: "Updatable apps must use stable SDK",
353 },
Artur Satayevf40fc852020-04-16 13:43:02 +0100354 {
355 name: "Must specify min_sdk_version",
356 bp: `android_app {
357 name: "app_without_min_sdk_version",
358 srcs: ["a.java"],
359 sdk_version: "29",
360 updatable: true,
361 }`,
362 expectedError: "updatable apps must set min_sdk_version.",
363 },
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100364 }
365
366 for _, test := range testCases {
367 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800368 t.Parallel()
Paul Duffincdb88a92021-03-14 00:36:50 +0000369 errorHandler := android.FixtureExpectsNoErrors
370 if test.expectedError != "" {
371 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100372 }
Paul Duffin71ae5942021-03-22 15:36:52 +0000373 android.GroupFixturePreparers(
374 prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{
Paul Duffin2645a292021-03-13 02:36:00 +0000375 "29": {"foo"},
376 })).
Paul Duffincdb88a92021-03-14 00:36:50 +0000377 ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, test.bp)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100378 })
379 }
380}
381
Jooyung Han749dc692020-04-15 11:03:39 +0900382func TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800383 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +0900384 testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+`
385 android_app {
386 name: "foo",
387 srcs: ["a.java"],
388 updatable: true,
389 sdk_version: "current",
390 min_sdk_version: "29",
391 static_libs: ["bar"],
392 }
393
394 java_library {
395 name: "bar",
396 sdk_version: "current",
397 }
398 `)
399}
400
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900401func TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800402 t.Parallel()
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900403 testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
404 android_app {
405 name: "foo",
406 srcs: ["a.java"],
407 updatable: true,
408 sdk_version: "current",
409 min_sdk_version: "current",
410 jni_libs: ["libjni"],
411 }
412
413 cc_library {
414 name: "libjni",
415 stl: "none",
416 system_shared_libs: [],
417 sdk_version: "current",
418 }
419 `)
420}
421
422func TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800423 t.Parallel()
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900424 bp := cc.GatherRequiredDepsForTest(android.Android) + `
425 android_app {
426 name: "foo",
427 srcs: ["a.java"],
428 updatable: true,
429 sdk_version: "current",
430 min_sdk_version: "29",
431 jni_libs: ["libjni"],
432 }
433
434 cc_library {
435 name: "libjni",
436 stl: "none",
437 system_shared_libs: [],
Spandan Das2e8c0442022-05-08 00:39:35 +0000438 sdk_version: "current",
439 min_sdk_version: "29",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900440 }
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900441 `
442 fs := map[string][]byte{
443 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
444 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil,
445 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil,
446 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil,
447 }
448
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000449 ctx, _ := testJavaWithFS(t, bp, fs)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900450
Colin Cross90607e92025-02-11 14:58:07 -0800451 inputs := ctx.ModuleForTests(t, "libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900452 var crtbeginFound, crtendFound bool
Colin Cross90607e92025-02-11 14:58:07 -0800453 expectedCrtBegin := ctx.ModuleForTests(t, "crtbegin_so",
Colin Crossdea1d032022-12-06 14:50:08 -0800454 "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
Colin Cross90607e92025-02-11 14:58:07 -0800455 expectedCrtEnd := ctx.ModuleForTests(t, "crtend_so",
Colin Crossdea1d032022-12-06 14:50:08 -0800456 "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
Dan Albert92fe7402020-07-15 13:33:30 -0700457 implicits := []string{}
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900458 for _, input := range inputs {
Dan Albert92fe7402020-07-15 13:33:30 -0700459 implicits = append(implicits, input.String())
460 if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900461 crtbeginFound = true
Dan Albert92fe7402020-07-15 13:33:30 -0700462 } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900463 crtendFound = true
464 }
465 }
Dan Albert92fe7402020-07-15 13:33:30 -0700466 if !crtbeginFound {
467 t.Error(fmt.Sprintf(
468 "expected implicit with suffix %q, have the following implicits:\n%s",
469 expectedCrtBegin, strings.Join(implicits, "\n")))
470 }
471 if !crtendFound {
472 t.Error(fmt.Sprintf(
473 "expected implicit with suffix %q, have the following implicits:\n%s",
474 expectedCrtEnd, strings.Join(implicits, "\n")))
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900475 }
476}
477
478func TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800479 t.Parallel()
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900480 bp := cc.GatherRequiredDepsForTest(android.Android) + `
481 android_app {
482 name: "foo",
483 srcs: ["a.java"],
484 updatable: true,
485 sdk_version: "current",
486 min_sdk_version: "29", // this APK should support 29
487 jni_libs: ["libjni"],
488 }
489
490 cc_library {
491 name: "libjni",
492 stl: "none",
493 sdk_version: "current",
Spandan Das2e8c0442022-05-08 00:39:35 +0000494 min_sdk_version: "current",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900495 }
496 `
Spandan Das2e8c0442022-05-08 00:39:35 +0000497 testJavaError(t, `"libjni" .*: min_sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900498}
499
Spandan Das2e8c0442022-05-08 00:39:35 +0000500func TestUpdatableApps_ErrorIfDepMinSdkVersionIsHigher(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800501 t.Parallel()
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900502 bp := cc.GatherRequiredDepsForTest(android.Android) + `
503 android_app {
504 name: "foo",
505 srcs: ["a.java"],
506 updatable: true,
507 sdk_version: "current",
508 min_sdk_version: "29", // this APK should support 29
509 jni_libs: ["libjni"],
510 }
511
512 cc_library {
513 name: "libjni",
514 stl: "none",
515 shared_libs: ["libbar"],
516 system_shared_libs: [],
517 sdk_version: "27",
Spandan Das2e8c0442022-05-08 00:39:35 +0000518 min_sdk_version: "27",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900519 }
520
521 cc_library {
522 name: "libbar",
523 stl: "none",
524 system_shared_libs: [],
525 sdk_version: "current",
Spandan Das2e8c0442022-05-08 00:39:35 +0000526 min_sdk_version: "current",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900527 }
528 `
529 testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
530}
531
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +0000532func TestUpdatableApps_ApplyDefaultUpdatableModuleVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800533 t.Parallel()
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +0000534 result := android.GroupFixturePreparers(
535 PrepareForTestWithJavaDefaultModules,
536 ).RunTestWithBp(t, `
537 android_app {
538 name: "com.android.foo",
539 srcs: ["a.java"],
540 sdk_version: "current",
541 min_sdk_version: "31",
542 updatable: true,
543 }
544 `)
Colin Cross90607e92025-02-11 14:58:07 -0800545 foo := result.ModuleForTests(t, "com.android.foo", "android_common").Rule("manifestFixer")
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +0000546 android.AssertStringDoesContain(t,
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +0000547 "com.android.foo: expected manifest fixer to set override-placeholder-version to RELEASE_DEFAULT_UPDATABLE_MODULE_VERSION",
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +0000548 foo.BuildParams.Args["args"],
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +0000549 fmt.Sprintf("--override-placeholder-version %s", testDefaultUpdatableModuleVersion),
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +0000550 )
551}
552
553func TestUpdatableApps_ApplyOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800554 t.Parallel()
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +0000555 result := android.GroupFixturePreparers(
556 PrepareForTestWithJavaDefaultModules,
557 android.FixtureMergeEnv(map[string]string{
558 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
559 }),
560 ).RunTestWithBp(t, `
561 android_app {
562 name: "com.android.foo",
563 srcs: ["a.java"],
564 sdk_version: "current",
565 min_sdk_version: "31",
566 updatable: true,
567 }
568 `)
Colin Cross90607e92025-02-11 14:58:07 -0800569 foo := result.ModuleForTests(t, "com.android.foo", "android_common").Rule("manifestFixer")
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +0000570 android.AssertStringDoesContain(t,
571 "com.android.foo: expected manifest fixer to set override-placeholder-version to 1234",
572 foo.BuildParams.Args["args"],
573 "--override-placeholder-version 1234",
574 )
575}
576
Colin Cross0ddae7f2019-02-07 15:30:01 -0800577func TestResourceDirs(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800578 t.Parallel()
Colin Cross0ddae7f2019-02-07 15:30:01 -0800579 testCases := []struct {
580 name string
581 prop string
582 resources []string
583 }{
584 {
585 name: "no resource_dirs",
586 prop: "",
587 resources: []string{"res/res/values/strings.xml"},
588 },
589 {
590 name: "resource_dirs",
591 prop: `resource_dirs: ["res"]`,
592 resources: []string{"res/res/values/strings.xml"},
593 },
594 {
595 name: "empty resource_dirs",
596 prop: `resource_dirs: []`,
597 resources: nil,
598 },
599 }
600
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000601 fs := android.MockFS{
Colin Cross0ddae7f2019-02-07 15:30:01 -0800602 "res/res/values/strings.xml": nil,
603 }
604
605 bp := `
606 android_app {
607 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900608 sdk_version: "current",
Colin Cross0ddae7f2019-02-07 15:30:01 -0800609 %s
610 }
611 `
612
613 for _, testCase := range testCases {
614 t.Run(testCase.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800615 t.Parallel()
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000616 result := android.GroupFixturePreparers(
617 PrepareForTestWithJavaDefaultModules,
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000618 fs.AddToFixture(),
619 ).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop))
Colin Cross0ddae7f2019-02-07 15:30:01 -0800620
Colin Cross90607e92025-02-11 14:58:07 -0800621 module := result.ModuleForTests(t, "foo", "android_common")
Colin Cross0ddae7f2019-02-07 15:30:01 -0800622 resourceList := module.MaybeOutput("aapt2/res.list")
623
624 var resources []string
625 if resourceList.Rule != nil {
626 for _, compiledResource := range resourceList.Inputs.Strings() {
627 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
628 }
629 }
630
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000631 android.AssertDeepEquals(t, "resource files", testCase.resources, resources)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800632 })
633 }
634}
635
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800636func TestLibraryAssets(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800637 t.Parallel()
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800638 bp := `
639 android_app {
640 name: "foo",
641 sdk_version: "current",
642 static_libs: ["lib1", "lib2", "lib3"],
643 }
644
645 android_library {
646 name: "lib1",
647 sdk_version: "current",
648 asset_dirs: ["assets_a"],
649 }
650
651 android_library {
652 name: "lib2",
653 sdk_version: "current",
654 }
655
656 android_library {
657 name: "lib3",
658 sdk_version: "current",
Colin Crossab8d1382023-07-14 17:23:41 +0000659 static_libs: ["lib4", "import"],
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800660 }
661
662 android_library {
663 name: "lib4",
664 sdk_version: "current",
665 asset_dirs: ["assets_b"],
666 }
Colin Crossab8d1382023-07-14 17:23:41 +0000667
Jiakai Zhangba82e282023-10-13 18:08:59 +0100668 android_library {
669 name: "lib5",
670 sdk_version: "current",
671 assets: [
672 "path/to/asset_file_1",
673 "path/to/asset_file_2",
674 ],
675 }
676
Colin Crossab8d1382023-07-14 17:23:41 +0000677 android_library_import {
678 name: "import",
679 sdk_version: "current",
680 aars: ["import.aar"],
681 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800682 `
683
684 testCases := []struct {
Jiakai Zhangba82e282023-10-13 18:08:59 +0100685 name string
686 assetFlag string
687 assetPackages []string
688 tmpAssetDirInputs []string
689 tmpAssetDirOutputs []string
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800690 }{
691 {
692 name: "foo",
Colin Crossab8d1382023-07-14 17:23:41 +0000693 // lib1 has its own assets. lib3 doesn't have any, but lib4 and import have assets.
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800694 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000695 "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
696 "out/soong/.intermediates/lib1/android_common/assets.zip",
Colin Crossab8d1382023-07-14 17:23:41 +0000697 "out/soong/.intermediates/lib4/android_common/assets.zip",
698 "out/soong/.intermediates/import/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800699 },
700 },
701 {
702 name: "lib1",
703 assetFlag: "-A assets_a",
704 },
705 {
706 name: "lib2",
707 },
708 {
709 name: "lib3",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800710 },
711 {
712 name: "lib4",
713 assetFlag: "-A assets_b",
714 },
Jiakai Zhangba82e282023-10-13 18:08:59 +0100715 {
716 name: "lib5",
717 assetFlag: "-A out/soong/.intermediates/lib5/android_common/tmp_asset_dir",
718 tmpAssetDirInputs: []string{
719 "path/to/asset_file_1",
720 "path/to/asset_file_2",
721 },
722 tmpAssetDirOutputs: []string{
723 "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_1",
724 "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_2",
725 },
726 },
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800727 }
728 ctx := testApp(t, bp)
729
730 for _, test := range testCases {
731 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800732 t.Parallel()
Colin Cross90607e92025-02-11 14:58:07 -0800733 m := ctx.ModuleForTests(t, test.name, "android_common")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800734
735 // Check asset flag in aapt2 link flags
736 var aapt2link android.TestingBuildParams
737 if len(test.assetPackages) > 0 {
738 aapt2link = m.Output("aapt2/package-res.apk")
739 } else {
740 aapt2link = m.Output("package-res.apk")
741 }
Paul Duffina71a67a2021-03-29 00:42:57 +0100742 aapt2link = aapt2link
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800743 aapt2Flags := aapt2link.Args["flags"]
744 if test.assetFlag != "" {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000745 android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800746 } else {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000747 android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800748 }
749
750 // Check asset merge rule.
751 if len(test.assetPackages) > 0 {
752 mergeAssets := m.Output("package-res.apk")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000753 android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800754 }
Jiakai Zhangba82e282023-10-13 18:08:59 +0100755
756 if len(test.tmpAssetDirInputs) > 0 {
757 rule := m.Rule("tmp_asset_dir")
758 inputs := rule.Implicits
759 outputs := append(android.WritablePaths{rule.Output}, rule.ImplicitOutputs...).Paths()
760 android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir inputs", test.tmpAssetDirInputs, inputs)
761 android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir outputs", test.tmpAssetDirOutputs, outputs)
762 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800763 })
764 }
765}
766
Colin Crossb014f072021-02-26 14:54:36 -0800767func TestAppJavaResources(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800768 t.Parallel()
Colin Crossb014f072021-02-26 14:54:36 -0800769 bp := `
770 android_app {
771 name: "foo",
772 sdk_version: "current",
773 java_resources: ["resources/a"],
774 srcs: ["a.java"],
775 }
776
777 android_app {
778 name: "bar",
779 sdk_version: "current",
780 java_resources: ["resources/a"],
781 }
782 `
783
784 ctx := testApp(t, bp)
785
Colin Cross90607e92025-02-11 14:58:07 -0800786 foo := ctx.ModuleForTests(t, "foo", "android_common")
Colin Crossb014f072021-02-26 14:54:36 -0800787 fooResources := foo.Output("res/foo.jar")
788 fooDexJar := foo.Output("dex-withres/foo.jar")
789 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
790 fooApk := foo.Rule("combineApk")
791
792 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
793 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
794 }
795
796 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
797 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
798 }
799
800 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
801 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
802 }
803
Colin Cross90607e92025-02-11 14:58:07 -0800804 bar := ctx.ModuleForTests(t, "bar", "android_common")
Colin Crossb014f072021-02-26 14:54:36 -0800805 barResources := bar.Output("res/bar.jar")
806 barApk := bar.Rule("combineApk")
807
808 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
809 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
810 }
811}
812
Colin Crossff3ff7f2023-07-05 14:04:12 -0700813func TestAndroidResourceProcessor(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800814 t.Parallel()
Colin Crossff3ff7f2023-07-05 14:04:12 -0700815 testCases := []struct {
Colin Cross8676c8c2023-10-12 15:58:57 -0700816 name string
817 appUsesRP bool
818 directLibUsesRP bool
819 transitiveLibUsesRP bool
820 sharedLibUsesRP bool
821 sharedTransitiveStaticLibUsesRP bool
822 sharedTransitiveSharedLibUsesRP bool
Colin Crossff3ff7f2023-07-05 14:04:12 -0700823
824 dontVerifyApp bool
825 appResources []string
826 appOverlays []string
827 appImports []string
828 appSrcJars []string
829 appClasspath []string
830 appCombined []string
831
832 dontVerifyDirect bool
833 directResources []string
834 directOverlays []string
835 directImports []string
836 directSrcJars []string
837 directClasspath []string
838 directCombined []string
839
840 dontVerifyTransitive bool
841 transitiveResources []string
842 transitiveOverlays []string
843 transitiveImports []string
844 transitiveSrcJars []string
845 transitiveClasspath []string
846 transitiveCombined []string
847
848 dontVerifyDirectImport bool
849 directImportResources []string
850 directImportOverlays []string
851 directImportImports []string
852
853 dontVerifyTransitiveImport bool
854 transitiveImportResources []string
855 transitiveImportOverlays []string
856 transitiveImportImports []string
Colin Cross8676c8c2023-10-12 15:58:57 -0700857
858 dontVerifyShared bool
859 sharedResources []string
860 sharedOverlays []string
861 sharedImports []string
862 sharedSrcJars []string
863 sharedClasspath []string
864 sharedCombined []string
Colin Crossff3ff7f2023-07-05 14:04:12 -0700865 }{
866 {
Colin Cross4eae06d2023-06-20 22:40:02 -0700867 // Test with all modules set to use_resource_processor: false (except android_library_import modules,
868 // which always use resource processor).
869 name: "legacy",
870 appUsesRP: false,
871 directLibUsesRP: false,
872 transitiveLibUsesRP: false,
Colin Crossff3ff7f2023-07-05 14:04:12 -0700873
874 appResources: nil,
875 appOverlays: []string{
876 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000877 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700878 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
879 "out/soong/.intermediates/direct/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000880 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700881 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
882 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
883 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700884 appImports: []string{
885 "out/soong/.intermediates/shared/android_common/package-res.apk",
886 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
887 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700888 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
889 appClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -0800890 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
891 "out/soong/.intermediates/shared/android_common/turbine/shared.jar",
892 "out/soong/.intermediates/shared_transitive_static/android_common/turbine/shared_transitive_static.jar",
893 "out/soong/.intermediates/direct/android_common/turbine/direct.jar",
894 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
895 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
896 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
897 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
898 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700899 },
900 appCombined: []string{
901 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -0800902 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
903 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
904 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
905 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
906 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
907 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700908 },
909
910 directResources: nil,
911 directOverlays: []string{
912 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000913 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700914 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
915 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
916 },
917 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
918 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
919 directClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -0800920 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
921 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
922 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
923 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700924 },
925 directCombined: []string{
926 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
927 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -0800928 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
929 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700930 },
931
932 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
933 transitiveOverlays: nil,
934 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
935 transitiveSrcJars: []string{"out/soong/.intermediates/transitive/android_common/gen/android/R.srcjar"},
Colin Cross8ff4af32025-02-19 15:17:02 -0800936 transitiveClasspath: []string{"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar"},
Colin Crossff3ff7f2023-07-05 14:04:12 -0700937 transitiveCombined: nil,
938
Colin Cross8676c8c2023-10-12 15:58:57 -0700939 sharedResources: nil,
940 sharedOverlays: []string{
941 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
942 "out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat",
943 },
944 sharedImports: []string{
945 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
946 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
947 },
948 sharedSrcJars: []string{"out/soong/.intermediates/shared/android_common/gen/android/R.srcjar"},
949 sharedClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -0800950 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
951 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine/shared_transitive_shared.jar",
952 "out/soong/.intermediates/shared_transitive_static/android_common/turbine/shared_transitive_static.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700953 },
954 sharedCombined: []string{
955 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
956 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
957 },
958
Colin Crossff3ff7f2023-07-05 14:04:12 -0700959 directImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700960 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
961 directImportImports: []string{
962 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700963 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
964 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700965
966 transitiveImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700967 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
968 transitiveImportImports: []string{
969 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700970 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
971 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700972 },
973 {
974 // Test with all modules set to use_resource_processor: true.
Colin Cross8676c8c2023-10-12 15:58:57 -0700975 name: "resource_processor",
976 appUsesRP: true,
977 directLibUsesRP: true,
978 transitiveLibUsesRP: true,
979 sharedLibUsesRP: true,
980 sharedTransitiveSharedLibUsesRP: true,
981 sharedTransitiveStaticLibUsesRP: true,
Colin Cross4eae06d2023-06-20 22:40:02 -0700982
983 appResources: nil,
984 appOverlays: []string{
985 "out/soong/.intermediates/transitive/android_common/package-res.apk",
986 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
987 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
988 "out/soong/.intermediates/direct/android_common/package-res.apk",
989 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
990 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
991 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
992 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700993 appImports: []string{
994 "out/soong/.intermediates/shared/android_common/package-res.apk",
995 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
996 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700997 appSrcJars: nil,
998 appClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -0800999 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001000 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001001 "out/soong/.intermediates/shared/android_common/turbine/shared.jar",
1002 "out/soong/.intermediates/shared_transitive_static/android_common/turbine/shared_transitive_static.jar",
1003 "out/soong/.intermediates/direct/android_common/turbine/direct.jar",
1004 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
1005 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1006 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1007 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1008 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001009 },
1010 appCombined: []string{
Colin Cross4eae06d2023-06-20 22:40:02 -07001011 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Crossfd620b22024-02-23 10:05:21 -08001012 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001013 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1014 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1015 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1016 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1017 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1018 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001019 },
1020
1021 directResources: nil,
1022 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
1023 directImports: []string{
1024 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1025 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1026 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1027 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1028 },
1029 directSrcJars: nil,
1030 directClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001031 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001032 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -08001033 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1034 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
1035 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001036 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
1037 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1038 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001039 },
1040 directCombined: []string{
1041 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1042 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001043 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1044 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001045 },
1046
1047 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1048 transitiveOverlays: nil,
1049 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1050 transitiveSrcJars: nil,
1051 transitiveClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001052 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001053 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1054 },
1055 transitiveCombined: nil,
1056
Colin Cross8676c8c2023-10-12 15:58:57 -07001057 sharedResources: nil,
1058 sharedOverlays: []string{"out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat"},
1059 sharedImports: []string{
1060 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
1061 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1062 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
1063 },
1064 sharedSrcJars: nil,
1065 sharedClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001066 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -08001067 "out/soong/.intermediates/shared/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001068 "out/soong/.intermediates/shared_transitive_static/android_common/busybox/R.jar",
1069 "out/soong/.intermediates/shared_transitive_shared/android_common/busybox/R.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001070 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine/shared_transitive_shared.jar",
1071 "out/soong/.intermediates/shared_transitive_static/android_common/turbine/shared_transitive_static.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001072 },
1073 sharedCombined: []string{
1074 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
1075 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
1076 },
1077
Colin Cross4eae06d2023-06-20 22:40:02 -07001078 directImportResources: nil,
1079 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
1080 directImportImports: []string{
1081 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1082 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1083 },
1084
1085 transitiveImportResources: nil,
1086 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
1087 transitiveImportImports: []string{
1088 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1089 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1090 },
1091 }, {
1092 // Test an app building with resource processor enabled but with dependencies built without
1093 // resource processor.
1094 name: "app_resource_processor",
1095 appUsesRP: true,
1096 directLibUsesRP: false,
1097 transitiveLibUsesRP: false,
1098
1099 appResources: nil,
1100 appOverlays: []string{
1101 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1102 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1103 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1104 "out/soong/.intermediates/direct/android_common/package-res.apk",
1105 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1106 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1107 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1108 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001109 appImports: []string{
1110 "out/soong/.intermediates/shared/android_common/package-res.apk",
1111 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1112 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001113 appSrcJars: nil,
1114 appClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001115 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001116 // R.jar has to come before direct.jar
1117 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001118 "out/soong/.intermediates/shared/android_common/turbine/shared.jar",
1119 "out/soong/.intermediates/shared_transitive_static/android_common/turbine/shared_transitive_static.jar",
1120 "out/soong/.intermediates/direct/android_common/turbine/direct.jar",
1121 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
1122 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1123 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1124 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1125 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001126 },
1127 appCombined: []string{
Colin Cross4eae06d2023-06-20 22:40:02 -07001128 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Crossfd620b22024-02-23 10:05:21 -08001129 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001130 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1131 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1132 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1133 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1134 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1135 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001136 },
1137
1138 dontVerifyDirect: true,
1139 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001140 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001141 dontVerifyDirectImport: true,
1142 dontVerifyTransitiveImport: true,
1143 },
1144 {
1145 // Test an app building without resource processor enabled but with a dependency built with
1146 // resource processor.
1147 name: "app_dependency_lib_resource_processor",
1148 appUsesRP: false,
1149 directLibUsesRP: true,
1150 transitiveLibUsesRP: false,
1151
1152 appOverlays: []string{
1153 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1154 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1155 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1156 "out/soong/.intermediates/direct/android_common/package-res.apk",
1157 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1158 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1159 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1160 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001161 appImports: []string{
1162 "out/soong/.intermediates/shared/android_common/package-res.apk",
1163 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1164 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001165 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1166 appClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001167 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
1168 "out/soong/.intermediates/shared/android_common/turbine/shared.jar",
1169 "out/soong/.intermediates/shared_transitive_static/android_common/turbine/shared_transitive_static.jar",
1170 "out/soong/.intermediates/direct/android_common/turbine/direct.jar",
1171 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
1172 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1173 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1174 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1175 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001176 },
1177 appCombined: []string{
1178 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001179 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1180 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1181 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1182 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1183 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1184 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001185 },
1186
1187 directResources: nil,
1188 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
1189 directImports: []string{
1190 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1191 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1192 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1193 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1194 },
1195 directSrcJars: nil,
1196 directClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001197 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001198 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -08001199 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
1200 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001201 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
1202 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1203 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001204 },
1205 directCombined: []string{
1206 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1207 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001208 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1209 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001210 },
1211
1212 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001213 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001214 dontVerifyDirectImport: true,
1215 dontVerifyTransitiveImport: true,
1216 },
1217 {
1218 // Test a library building without resource processor enabled but with a dependency built with
1219 // resource processor.
1220 name: "lib_dependency_lib_resource_processor",
1221 appUsesRP: false,
1222 directLibUsesRP: false,
1223 transitiveLibUsesRP: true,
1224
1225 appOverlays: []string{
1226 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1227 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1228 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1229 "out/soong/.intermediates/direct/android_common/package-res.apk",
1230 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1231 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1232 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1233 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001234 appImports: []string{
1235 "out/soong/.intermediates/shared/android_common/package-res.apk",
1236 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1237 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001238 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1239 appClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001240 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
1241 "out/soong/.intermediates/shared/android_common/turbine/shared.jar",
1242 "out/soong/.intermediates/shared_transitive_static/android_common/turbine/shared_transitive_static.jar",
1243 "out/soong/.intermediates/direct/android_common/turbine/direct.jar",
1244 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
1245 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1246 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1247 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1248 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001249 },
1250 appCombined: []string{
1251 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001252 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1253 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1254 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1255 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1256 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1257 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001258 },
1259
1260 directResources: nil,
1261 directOverlays: []string{
1262 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1263 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1264 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1265 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
1266 },
1267 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1268 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
1269 directClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001270 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
1271 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
1272 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1273 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001274 },
1275 directCombined: []string{
1276 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1277 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001278 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1279 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001280 },
1281
1282 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1283 transitiveOverlays: nil,
1284 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1285 transitiveSrcJars: nil,
1286 transitiveClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001287 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001288 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1289 },
1290 transitiveCombined: nil,
1291
Colin Cross8676c8c2023-10-12 15:58:57 -07001292 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001293 dontVerifyDirectImport: true,
1294 dontVerifyTransitiveImport: true,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001295 },
1296 }
1297
1298 for _, testCase := range testCases {
1299 t.Run(testCase.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001300 t.Parallel()
Colin Crossff3ff7f2023-07-05 14:04:12 -07001301 bp := fmt.Sprintf(`
1302 android_app {
1303 name: "app",
1304 sdk_version: "current",
1305 srcs: ["app/app.java"],
1306 resource_dirs: ["app/res"],
1307 manifest: "app/AndroidManifest.xml",
Colin Cross8676c8c2023-10-12 15:58:57 -07001308 libs: ["shared"],
Colin Crossff3ff7f2023-07-05 14:04:12 -07001309 static_libs: ["direct", "direct_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001310 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001311 }
1312
1313 android_library {
1314 name: "direct",
1315 sdk_version: "current",
1316 srcs: ["direct/direct.java"],
1317 resource_dirs: ["direct/res"],
1318 manifest: "direct/AndroidManifest.xml",
1319 static_libs: ["transitive", "transitive_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001320 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001321 }
1322
1323 android_library {
1324 name: "transitive",
1325 sdk_version: "current",
1326 srcs: ["transitive/transitive.java"],
1327 resource_dirs: ["transitive/res"],
1328 manifest: "transitive/AndroidManifest.xml",
Colin Cross4eae06d2023-06-20 22:40:02 -07001329 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001330 }
1331
Colin Cross8676c8c2023-10-12 15:58:57 -07001332 android_library {
1333 name: "shared",
1334 sdk_version: "current",
1335 srcs: ["shared/shared.java"],
1336 resource_dirs: ["shared/res"],
1337 manifest: "shared/AndroidManifest.xml",
1338 use_resource_processor: %v,
1339 libs: ["shared_transitive_shared"],
1340 static_libs: ["shared_transitive_static"],
1341 }
1342
1343 android_library {
1344 name: "shared_transitive_shared",
1345 sdk_version: "current",
1346 srcs: ["shared_transitive_shared/shared_transitive_shared.java"],
1347 resource_dirs: ["shared_transitive_shared/res"],
1348 manifest: "shared_transitive_shared/AndroidManifest.xml",
1349 use_resource_processor: %v,
1350 }
1351
1352 android_library {
1353 name: "shared_transitive_static",
1354 sdk_version: "current",
1355 srcs: ["shared_transitive_static/shared.java"],
1356 resource_dirs: ["shared_transitive_static/res"],
1357 manifest: "shared_transitive_static/AndroidManifest.xml",
1358 use_resource_processor: %v,
1359 }
1360
Colin Crossff3ff7f2023-07-05 14:04:12 -07001361 android_library_import {
1362 name: "direct_import",
1363 sdk_version: "current",
1364 aars: ["direct_import.aar"],
1365 static_libs: ["direct_import_dep"],
1366 }
1367
1368 android_library_import {
1369 name: "direct_import_dep",
1370 sdk_version: "current",
1371 aars: ["direct_import_dep.aar"],
1372 }
1373
1374 android_library_import {
1375 name: "transitive_import",
1376 sdk_version: "current",
1377 aars: ["transitive_import.aar"],
1378 static_libs: ["transitive_import_dep"],
1379 }
1380
1381 android_library_import {
1382 name: "transitive_import_dep",
1383 sdk_version: "current",
1384 aars: ["transitive_import_dep.aar"],
1385 }
Colin Cross8676c8c2023-10-12 15:58:57 -07001386 `, testCase.appUsesRP, testCase.directLibUsesRP, testCase.transitiveLibUsesRP,
1387 testCase.sharedLibUsesRP, testCase.sharedTransitiveSharedLibUsesRP, testCase.sharedTransitiveStaticLibUsesRP)
Colin Crossff3ff7f2023-07-05 14:04:12 -07001388
1389 fs := android.MockFS{
Colin Cross8676c8c2023-10-12 15:58:57 -07001390 "app/res/values/strings.xml": nil,
1391 "direct/res/values/strings.xml": nil,
1392 "transitive/res/values/strings.xml": nil,
1393 "shared/res/values/strings.xml": nil,
1394 "shared_transitive_static/res/values/strings.xml": nil,
1395 "shared_transitive_shared/res/values/strings.xml": nil,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001396 }
1397
1398 result := android.GroupFixturePreparers(
1399 PrepareForTestWithJavaDefaultModules,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001400 fs.AddToFixture(),
1401 ).RunTestWithBp(t, bp)
1402
1403 type aaptInfo struct {
1404 resources, overlays, imports, srcJars, classpath, combined android.Paths
1405 }
1406
1407 getAaptInfo := func(moduleName string) (aaptInfo aaptInfo) {
Colin Cross90607e92025-02-11 14:58:07 -08001408 mod := result.ModuleForTests(t, moduleName, "android_common")
Colin Crossff3ff7f2023-07-05 14:04:12 -07001409 resourceListRule := mod.MaybeOutput("aapt2/res.list")
1410 overlayListRule := mod.MaybeOutput("aapt2/overlay.list")
1411 aaptRule := mod.Rule("aapt2Link")
1412 javacRule := mod.MaybeRule("javac")
1413 combinedRule := mod.MaybeOutput("combined/" + moduleName + ".jar")
1414
1415 aaptInfo.resources = resourceListRule.Inputs
1416 aaptInfo.overlays = overlayListRule.Inputs
1417
1418 aaptFlags := strings.Split(aaptRule.Args["flags"], " ")
1419 for i, flag := range aaptFlags {
1420 if flag == "-I" && i+1 < len(aaptFlags) {
1421 aaptInfo.imports = append(aaptInfo.imports, android.PathForTesting(aaptFlags[i+1]))
1422 }
1423 }
1424
1425 if len(javacRule.Args["srcJars"]) > 0 {
1426 aaptInfo.srcJars = android.PathsForTesting(strings.Split(javacRule.Args["srcJars"], " ")...)
1427 }
1428
1429 if len(javacRule.Args["classpath"]) > 0 {
1430 classpathArg := strings.TrimPrefix(javacRule.Args["classpath"], "-classpath ")
1431 aaptInfo.classpath = android.PathsForTesting(strings.Split(classpathArg, ":")...)
1432 }
1433
1434 aaptInfo.combined = combinedRule.Inputs
1435 return
1436 }
1437
1438 app := getAaptInfo("app")
1439 direct := getAaptInfo("direct")
1440 transitive := getAaptInfo("transitive")
Colin Cross8676c8c2023-10-12 15:58:57 -07001441 shared := getAaptInfo("shared")
Colin Crossff3ff7f2023-07-05 14:04:12 -07001442 directImport := getAaptInfo("direct_import")
1443 transitiveImport := getAaptInfo("transitive_import")
1444
1445 if !testCase.dontVerifyApp {
1446 android.AssertPathsRelativeToTopEquals(t, "app resources", testCase.appResources, app.resources)
1447 android.AssertPathsRelativeToTopEquals(t, "app overlays", testCase.appOverlays, app.overlays)
1448 android.AssertPathsRelativeToTopEquals(t, "app imports", testCase.appImports, app.imports)
1449 android.AssertPathsRelativeToTopEquals(t, "app srcjars", testCase.appSrcJars, app.srcJars)
1450 android.AssertPathsRelativeToTopEquals(t, "app classpath", testCase.appClasspath, app.classpath)
1451 android.AssertPathsRelativeToTopEquals(t, "app combined", testCase.appCombined, app.combined)
1452 }
1453
1454 if !testCase.dontVerifyDirect {
1455 android.AssertPathsRelativeToTopEquals(t, "direct resources", testCase.directResources, direct.resources)
1456 android.AssertPathsRelativeToTopEquals(t, "direct overlays", testCase.directOverlays, direct.overlays)
1457 android.AssertPathsRelativeToTopEquals(t, "direct imports", testCase.directImports, direct.imports)
1458 android.AssertPathsRelativeToTopEquals(t, "direct srcjars", testCase.directSrcJars, direct.srcJars)
1459 android.AssertPathsRelativeToTopEquals(t, "direct classpath", testCase.directClasspath, direct.classpath)
1460 android.AssertPathsRelativeToTopEquals(t, "direct combined", testCase.directCombined, direct.combined)
1461 }
1462
1463 if !testCase.dontVerifyTransitive {
1464 android.AssertPathsRelativeToTopEquals(t, "transitive resources", testCase.transitiveResources, transitive.resources)
1465 android.AssertPathsRelativeToTopEquals(t, "transitive overlays", testCase.transitiveOverlays, transitive.overlays)
1466 android.AssertPathsRelativeToTopEquals(t, "transitive imports", testCase.transitiveImports, transitive.imports)
1467 android.AssertPathsRelativeToTopEquals(t, "transitive srcjars", testCase.transitiveSrcJars, transitive.srcJars)
1468 android.AssertPathsRelativeToTopEquals(t, "transitive classpath", testCase.transitiveClasspath, transitive.classpath)
1469 android.AssertPathsRelativeToTopEquals(t, "transitive combined", testCase.transitiveCombined, transitive.combined)
1470 }
1471
Colin Cross8676c8c2023-10-12 15:58:57 -07001472 if !testCase.dontVerifyShared {
1473 android.AssertPathsRelativeToTopEquals(t, "shared resources", testCase.sharedResources, shared.resources)
1474 android.AssertPathsRelativeToTopEquals(t, "shared overlays", testCase.sharedOverlays, shared.overlays)
1475 android.AssertPathsRelativeToTopEquals(t, "shared imports", testCase.sharedImports, shared.imports)
1476 android.AssertPathsRelativeToTopEquals(t, "shared srcjars", testCase.sharedSrcJars, shared.srcJars)
1477 android.AssertPathsRelativeToTopEquals(t, "shared classpath", testCase.sharedClasspath, shared.classpath)
1478 android.AssertPathsRelativeToTopEquals(t, "shared combined", testCase.sharedCombined, shared.combined)
1479 }
1480
Colin Crossff3ff7f2023-07-05 14:04:12 -07001481 if !testCase.dontVerifyDirectImport {
1482 android.AssertPathsRelativeToTopEquals(t, "direct_import resources", testCase.directImportResources, directImport.resources)
1483 android.AssertPathsRelativeToTopEquals(t, "direct_import overlays", testCase.directImportOverlays, directImport.overlays)
1484 android.AssertPathsRelativeToTopEquals(t, "direct_import imports", testCase.directImportImports, directImport.imports)
1485 }
1486
1487 if !testCase.dontVerifyTransitiveImport {
1488 android.AssertPathsRelativeToTopEquals(t, "transitive_import resources", testCase.transitiveImportResources, transitiveImport.resources)
1489 android.AssertPathsRelativeToTopEquals(t, "transitive_import overlays", testCase.transitiveImportOverlays, transitiveImport.overlays)
1490 android.AssertPathsRelativeToTopEquals(t, "transitive_import imports", testCase.transitiveImportImports, transitiveImport.imports)
1491 }
1492 })
1493 }
1494}
1495
1496func TestAndroidResourceOverlays(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001497 t.Parallel()
Colin Crossc4441622024-09-18 14:55:49 -07001498 type moduleAndVariant struct {
1499 module string
1500 variant string
1501 }
1502
Colin Cross5c4791c2019-02-01 11:44:44 -08001503 testCases := []struct {
1504 name string
1505 enforceRROTargets []string
1506 enforceRROExcludedOverlays []string
Colin Crossc4441622024-09-18 14:55:49 -07001507 resourceFiles map[moduleAndVariant][]string
1508 overlayFiles map[moduleAndVariant][]string
1509 rroDirs map[moduleAndVariant][]string
Colin Cross5c4791c2019-02-01 11:44:44 -08001510 }{
1511 {
1512 name: "no RRO",
1513 enforceRROTargets: nil,
1514 enforceRROExcludedOverlays: nil,
Colin Crossc4441622024-09-18 14:55:49 -07001515 resourceFiles: map[moduleAndVariant][]string{
1516 {"foo", "android_common"}: nil,
1517 {"bar", "android_common"}: {"bar/res/res/values/strings.xml"},
1518 {"lib", "android_common"}: nil,
1519 {"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"},
Colin Crossbec85302019-02-13 13:15:46 -08001520 },
Colin Crossc4441622024-09-18 14:55:49 -07001521 overlayFiles: map[moduleAndVariant][]string{
1522 {"foo", "android_common"}: {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001523 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1524 "out/soong/.intermediates/lib/android_common/package-res.apk",
1525 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001526 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001527 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1528 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +00001529 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001530 },
Colin Crossc4441622024-09-18 14:55:49 -07001531 {"bar", "android_common"}: {
Colin Cross5c4791c2019-02-01 11:44:44 -08001532 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1533 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1534 },
Colin Crossc4441622024-09-18 14:55:49 -07001535 {"lib", "android_common"}: {
Colin Crossbec85302019-02-13 13:15:46 -08001536 "lib/res/res/values/strings.xml",
1537 "device/vendor/blah/overlay/lib/res/values/strings.xml",
1538 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001539 },
Colin Crossc4441622024-09-18 14:55:49 -07001540 rroDirs: map[moduleAndVariant][]string{
1541 {"foo", "android_common"}: nil,
1542 {"bar", "android_common"}: nil,
Colin Cross5c4791c2019-02-01 11:44:44 -08001543 },
1544 },
1545 {
1546 name: "enforce RRO on foo",
1547 enforceRROTargets: []string{"foo"},
1548 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossc4441622024-09-18 14:55:49 -07001549 resourceFiles: map[moduleAndVariant][]string{
1550 {"foo", "android_common"}: nil,
1551 {"bar", "android_common"}: {"bar/res/res/values/strings.xml"},
1552 {"lib", "android_common"}: nil,
1553 {"lib", "android_common_rro"}: nil,
1554 {"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"},
1555 {"lib2", "android_common_rro"}: {"lib2/res/res/values/strings.xml"},
Colin Crossbec85302019-02-13 13:15:46 -08001556 },
Colin Crossc4441622024-09-18 14:55:49 -07001557 overlayFiles: map[moduleAndVariant][]string{
1558 {"foo", "android_common"}: {
1559 "out/soong/.intermediates/lib2/android_common_rro/package-res.apk",
1560 "out/soong/.intermediates/lib/android_common_rro/package-res.apk",
1561 "out/soong/.intermediates/lib3/android_common_rro/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001562 "foo/res/res/values/strings.xml",
1563 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1564 },
Colin Crossc4441622024-09-18 14:55:49 -07001565 {"bar", "android_common"}: {
Colin Cross5c4791c2019-02-01 11:44:44 -08001566 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1567 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1568 },
Colin Crossc4441622024-09-18 14:55:49 -07001569 {"lib", "android_common"}: {
Colin Crossbec85302019-02-13 13:15:46 -08001570 "lib/res/res/values/strings.xml",
Colin Crossc4441622024-09-18 14:55:49 -07001571 "device/vendor/blah/overlay/lib/res/values/strings.xml",
1572 },
1573 {"lib", "android_common_rro"}: {
Colin Crossc4441622024-09-18 14:55:49 -07001574 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -08001575 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001576 },
Colin Crossc1c37552019-01-31 11:42:41 -08001577
Colin Crossc4441622024-09-18 14:55:49 -07001578 rroDirs: map[moduleAndVariant][]string{
1579 {"foo", "android_common"}: {
Anton Hansson53c88442019-03-18 15:53:16 +00001580 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +00001581 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001582 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001583 },
Colin Crossc4441622024-09-18 14:55:49 -07001584 {"bar", "android_common"}: nil,
1585 {"lib", "android_common"}: nil,
1586 {"lib", "android_common_rro"}: {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001587 },
1588 },
1589 {
1590 name: "enforce RRO on all",
1591 enforceRROTargets: []string{"*"},
1592 enforceRROExcludedOverlays: []string{
1593 // Excluding specific apps/res directories also allowed.
1594 "device/vendor/blah/static_overlay/foo",
1595 "device/vendor/blah/static_overlay/bar/res",
1596 },
Colin Crossc4441622024-09-18 14:55:49 -07001597 resourceFiles: map[moduleAndVariant][]string{
1598 {"foo", "android_common"}: nil,
1599 {"bar", "android_common"}: {"bar/res/res/values/strings.xml"},
1600 {"lib", "android_common"}: nil,
1601 {"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"},
Colin Crossbec85302019-02-13 13:15:46 -08001602 },
Colin Crossc4441622024-09-18 14:55:49 -07001603 overlayFiles: map[moduleAndVariant][]string{
1604 {"foo", "android_common"}: {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001605 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1606 "out/soong/.intermediates/lib/android_common/package-res.apk",
1607 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001608 "foo/res/res/values/strings.xml",
1609 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1610 },
Colin Crossc4441622024-09-18 14:55:49 -07001611 {"bar", "android_common"}: {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
1612 {"lib", "android_common"}: {
Colin Crossbec85302019-02-13 13:15:46 -08001613 "lib/res/res/values/strings.xml",
1614 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001615 },
Colin Crossc4441622024-09-18 14:55:49 -07001616 rroDirs: map[moduleAndVariant][]string{
1617 {"foo", "android_common"}: {
Anton Hansson53c88442019-03-18 15:53:16 +00001618 "device:device/vendor/blah/overlay/foo/res",
1619 "product:product/vendor/blah/overlay/foo/res",
1620 // Lib dep comes after the direct deps
1621 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001622 },
Colin Crossc4441622024-09-18 14:55:49 -07001623 {"bar", "android_common"}: {"device:device/vendor/blah/overlay/bar/res"},
1624 {"lib", "android_common"}: {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001625 },
1626 },
1627 }
1628
Anton Hansson53c88442019-03-18 15:53:16 +00001629 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -08001630 "device/vendor/blah/overlay",
1631 "device/vendor/blah/overlay2",
1632 "device/vendor/blah/static_overlay",
1633 }
1634
Anton Hansson53c88442019-03-18 15:53:16 +00001635 productResourceOverlays := []string{
1636 "product/vendor/blah/overlay",
1637 }
1638
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001639 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -08001640 "foo/res/res/values/strings.xml": nil,
1641 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001642 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -08001643 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001644 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
1645 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001646 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001647 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
1648 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
1649 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +00001650 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001651 }
1652
1653 bp := `
1654 android_app {
1655 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001656 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001657 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +00001658 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -08001659 }
1660
1661 android_app {
1662 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001663 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001664 resource_dirs: ["bar/res"],
1665 }
Colin Cross6ed7dea2019-01-31 14:44:30 -08001666
1667 android_library {
1668 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001669 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001670 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -08001671 static_libs: ["lib2"],
1672 }
1673
1674 android_library {
1675 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001676 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -08001677 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -08001678 }
Anton Hansson53c88442019-03-18 15:53:16 +00001679
1680 // This library has the same resources as lib (should not lead to dupe RROs)
1681 android_library {
1682 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001683 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +00001684 resource_dirs: ["lib/res"]
1685 }
Colin Cross890ff552017-11-30 20:13:19 -08001686 `
1687
Colin Cross5c4791c2019-02-01 11:44:44 -08001688 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -08001689 t.Run(testCase.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001690 t.Parallel()
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001691 result := android.GroupFixturePreparers(
1692 PrepareForTestWithJavaDefaultModules,
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001693 fs.AddToFixture(),
1694 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1695 variables.DeviceResourceOverlays = deviceResourceOverlays
1696 variables.ProductResourceOverlays = productResourceOverlays
1697 if testCase.enforceRROTargets != nil {
1698 variables.EnforceRROTargets = testCase.enforceRROTargets
1699 }
1700 if testCase.enforceRROExcludedOverlays != nil {
1701 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
1702 }
1703 }),
1704 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -08001705
Colin Crossbec85302019-02-13 13:15:46 -08001706 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
1707 for _, o := range list {
1708 res := module.MaybeOutput(o)
1709 if res.Rule != nil {
Colin Crossc4441622024-09-18 14:55:49 -07001710 // If the overlay is compiled as part of this moduleAndVariant (i.e. a .arsc.flat file),
Colin Crossbec85302019-02-13 13:15:46 -08001711 // verify the inputs to the .arsc.flat rule.
1712 files = append(files, res.Inputs.Strings()...)
1713 } else {
Colin Crossc4441622024-09-18 14:55:49 -07001714 // Otherwise, verify the full path to the output of the other moduleAndVariant
Colin Crossbec85302019-02-13 13:15:46 -08001715 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +00001716 }
Colin Cross890ff552017-11-30 20:13:19 -08001717 }
Colin Crossbec85302019-02-13 13:15:46 -08001718 return files
Colin Cross890ff552017-11-30 20:13:19 -08001719 }
1720
Colin Crossc4441622024-09-18 14:55:49 -07001721 getResources := func(moduleName, variantName string) (resourceFiles, overlayFiles, rroDirs []string) {
Colin Cross90607e92025-02-11 14:58:07 -08001722 module := result.ModuleForTests(t, moduleName, variantName)
Colin Crossbec85302019-02-13 13:15:46 -08001723 resourceList := module.MaybeOutput("aapt2/res.list")
1724 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001725 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +00001726 }
Colin Crossbec85302019-02-13 13:15:46 -08001727 overlayList := module.MaybeOutput("aapt2/overlay.list")
1728 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001729 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -08001730 }
1731
Colin Crossab8d1382023-07-14 17:23:41 +00001732 for _, d := range module.Module().(AndroidLibraryDependency).RRODirsDepSet().ToList() {
Anton Hansson53c88442019-03-18 15:53:16 +00001733 var prefix string
1734 if d.overlayType == device {
1735 prefix = "device:"
1736 } else if d.overlayType == product {
1737 prefix = "product:"
1738 } else {
1739 t.Fatalf("Unexpected overlayType %d", d.overlayType)
1740 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001741 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +00001742 }
Colin Crossbec85302019-02-13 13:15:46 -08001743
1744 return resourceFiles, overlayFiles, rroDirs
1745 }
1746
Colin Crossc4441622024-09-18 14:55:49 -07001747 modules := []moduleAndVariant{
1748 {"foo", "android_common"},
1749 {"foo", "android_common_rro"},
1750 {"bar", "android_common"},
1751 {"bar", "android_common_rro"},
1752 {"lib", "android_common"},
1753 {"lib", "android_common_rro"},
1754 {"lib2", "android_common"},
1755 {"lib2", "android_common_rro"},
1756 }
1757 for _, moduleAndVariant := range modules {
1758 if _, exists := testCase.resourceFiles[moduleAndVariant]; !exists {
1759 continue
1760 }
1761 resourceFiles, overlayFiles, rroDirs := getResources(moduleAndVariant.module, moduleAndVariant.variant)
Colin Crossbec85302019-02-13 13:15:46 -08001762
Colin Crossc4441622024-09-18 14:55:49 -07001763 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[moduleAndVariant]) {
Colin Crossbec85302019-02-13 13:15:46 -08001764 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
Colin Crossc4441622024-09-18 14:55:49 -07001765 moduleAndVariant, testCase.resourceFiles[moduleAndVariant], resourceFiles)
Colin Crossbec85302019-02-13 13:15:46 -08001766 }
Colin Crossc4441622024-09-18 14:55:49 -07001767 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[moduleAndVariant]) {
Colin Crossbec85302019-02-13 13:15:46 -08001768 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
Colin Crossc4441622024-09-18 14:55:49 -07001769 moduleAndVariant, testCase.overlayFiles[moduleAndVariant], overlayFiles)
Colin Crossbec85302019-02-13 13:15:46 -08001770 }
Colin Crossc4441622024-09-18 14:55:49 -07001771 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[moduleAndVariant]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +00001772 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossc4441622024-09-18 14:55:49 -07001773 moduleAndVariant, testCase.rroDirs[moduleAndVariant], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +00001774 }
Colin Cross890ff552017-11-30 20:13:19 -08001775 }
Colin Cross890ff552017-11-30 20:13:19 -08001776 })
1777 }
1778}
Colin Crossd09b0b62018-04-18 11:06:47 -07001779
Paul Duffincdb88a92021-03-14 00:36:50 +00001780func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
Colin Cross90607e92025-02-11 14:58:07 -08001781 foo := result.ModuleForTests(t, "foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +09001782 link := foo.Output("package-res.apk")
1783 linkFlags := strings.Split(link.Args["flags"], " ")
1784 min := android.IndexList("--min-sdk-version", linkFlags)
1785 target := android.IndexList("--target-sdk-version", linkFlags)
1786
1787 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
1788 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
1789 }
1790
1791 gotMinSdkVersion := linkFlags[min+1]
1792 gotTargetSdkVersion := linkFlags[target+1]
1793
Paul Duffincdb88a92021-03-14 00:36:50 +00001794 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001795
Paul Duffincdb88a92021-03-14 00:36:50 +00001796 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001797}
1798
Colin Crossd09b0b62018-04-18 11:06:47 -07001799func TestAppSdkVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001800 t.Parallel()
Colin Crossd09b0b62018-04-18 11:06:47 -07001801 testCases := []struct {
1802 name string
1803 sdkVersion string
1804 platformSdkInt int
1805 platformSdkCodename string
1806 platformSdkFinal bool
Spandan Dasffb31af2023-03-01 19:46:18 +00001807 minSdkVersionBp string
Colin Crossd09b0b62018-04-18 11:06:47 -07001808 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001809 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001810 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001811 }{
1812 {
1813 name: "current final SDK",
1814 sdkVersion: "current",
1815 platformSdkInt: 27,
1816 platformSdkCodename: "REL",
1817 platformSdkFinal: true,
1818 expectedMinSdkVersion: "27",
1819 },
1820 {
1821 name: "current non-final SDK",
1822 sdkVersion: "current",
1823 platformSdkInt: 27,
1824 platformSdkCodename: "OMR1",
1825 platformSdkFinal: false,
1826 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001827 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001828 },
1829 {
1830 name: "default final SDK",
1831 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001832 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001833 platformSdkInt: 27,
1834 platformSdkCodename: "REL",
1835 platformSdkFinal: true,
1836 expectedMinSdkVersion: "27",
1837 },
1838 {
1839 name: "default non-final SDK",
1840 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001841 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001842 platformSdkInt: 27,
1843 platformSdkCodename: "OMR1",
1844 platformSdkFinal: false,
1845 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001846 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001847 },
1848 {
1849 name: "14",
1850 sdkVersion: "14",
1851 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001852 platformSdkCodename: "S",
1853 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001854 },
Spandan Dasffb31af2023-03-01 19:46:18 +00001855 {
1856 name: "two active SDKs",
1857 sdkVersion: "module_current",
1858 minSdkVersionBp: "UpsideDownCake",
1859 expectedMinSdkVersion: "UpsideDownCake", // And not VanillaIceCream
1860 platformSdkCodename: "VanillaIceCream",
1861 activeCodenames: []string{"UpsideDownCake", "VanillaIceCream"},
1862 },
Colin Crossd09b0b62018-04-18 11:06:47 -07001863 }
1864
1865 for _, moduleType := range []string{"android_app", "android_library"} {
1866 for _, test := range testCases {
1867 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001868 t.Parallel()
Jeongik Cha538c0d02019-07-11 15:54:27 +09001869 platformApiProp := ""
1870 if test.platformApis {
1871 platformApiProp = "platform_apis: true,"
1872 }
Spandan Dasffb31af2023-03-01 19:46:18 +00001873 minSdkVersionProp := ""
1874 if test.minSdkVersionBp != "" {
1875 minSdkVersionProp = fmt.Sprintf(` min_sdk_version: "%s",`, test.minSdkVersionBp)
1876 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001877 bp := fmt.Sprintf(`%s {
1878 name: "foo",
1879 srcs: ["a.java"],
1880 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001881 %s
Spandan Dasffb31af2023-03-01 19:46:18 +00001882 %s
1883 }`, moduleType, test.sdkVersion, platformApiProp, minSdkVersionProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001884
Paul Duffin71ae5942021-03-22 15:36:52 +00001885 result := android.GroupFixturePreparers(
1886 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001887 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1888 variables.Platform_sdk_version = &test.platformSdkInt
1889 variables.Platform_sdk_codename = &test.platformSdkCodename
1890 variables.Platform_version_active_codenames = test.activeCodenames
1891 variables.Platform_sdk_final = &test.platformSdkFinal
1892 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001893 FixtureWithPrebuiltApis(map[string][]string{
1894 "14": {"foo"},
1895 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001896 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001897
Paul Duffincdb88a92021-03-14 00:36:50 +00001898 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001899 })
1900 }
1901 }
1902}
Colin Crossa4f08812018-10-02 22:03:40 -07001903
Jeongik Cha219141c2020-08-06 23:00:37 +09001904func TestVendorAppSdkVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001905 t.Parallel()
Jeongik Cha219141c2020-08-06 23:00:37 +09001906 testCases := []struct {
1907 name string
1908 sdkVersion string
1909 platformSdkInt int
1910 platformSdkCodename string
1911 platformSdkFinal bool
1912 deviceCurrentApiLevelForVendorModules string
1913 expectedMinSdkVersion string
1914 }{
1915 {
1916 name: "current final SDK",
1917 sdkVersion: "current",
1918 platformSdkInt: 29,
1919 platformSdkCodename: "REL",
1920 platformSdkFinal: true,
1921 deviceCurrentApiLevelForVendorModules: "29",
1922 expectedMinSdkVersion: "29",
1923 },
1924 {
1925 name: "current final SDK",
1926 sdkVersion: "current",
1927 platformSdkInt: 29,
1928 platformSdkCodename: "REL",
1929 platformSdkFinal: true,
1930 deviceCurrentApiLevelForVendorModules: "28",
1931 expectedMinSdkVersion: "28",
1932 },
1933 {
1934 name: "current final SDK",
1935 sdkVersion: "current",
1936 platformSdkInt: 29,
1937 platformSdkCodename: "Q",
1938 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001939 deviceCurrentApiLevelForVendorModules: "28",
1940 expectedMinSdkVersion: "28",
1941 },
1942 }
1943
1944 for _, moduleType := range []string{"android_app", "android_library"} {
1945 for _, sdkKind := range []string{"", "system_"} {
1946 for _, test := range testCases {
1947 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001948 t.Parallel()
Jeongik Cha219141c2020-08-06 23:00:37 +09001949 bp := fmt.Sprintf(`%s {
1950 name: "foo",
1951 srcs: ["a.java"],
1952 sdk_version: "%s%s",
1953 vendor: true,
1954 }`, moduleType, sdkKind, test.sdkVersion)
1955
Paul Duffin71ae5942021-03-22 15:36:52 +00001956 result := android.GroupFixturePreparers(
1957 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001958 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1959 variables.Platform_sdk_version = &test.platformSdkInt
1960 variables.Platform_sdk_codename = &test.platformSdkCodename
1961 variables.Platform_sdk_final = &test.platformSdkFinal
1962 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1963 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1964 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001965 FixtureWithPrebuiltApis(map[string][]string{
1966 "28": {"foo"},
1967 "29": {"foo"},
1968 "current": {"foo"},
1969 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001970 ).RunTestWithBp(t, bp)
1971
1972 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001973 })
1974 }
1975 }
1976 }
1977}
1978
Paul Duffin50c217c2019-06-12 13:25:22 +01001979func TestJNIABI(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001980 t.Parallel()
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001981 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001982 cc_library {
1983 name: "libjni",
1984 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001985 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001986 stl: "none",
1987 }
1988
1989 android_test {
1990 name: "test",
1991 sdk_version: "core_platform",
1992 jni_libs: ["libjni"],
1993 }
1994
1995 android_test {
1996 name: "test_first",
1997 sdk_version: "core_platform",
1998 compile_multilib: "first",
1999 jni_libs: ["libjni"],
2000 }
2001
2002 android_test {
2003 name: "test_both",
2004 sdk_version: "core_platform",
2005 compile_multilib: "both",
2006 jni_libs: ["libjni"],
2007 }
2008
2009 android_test {
2010 name: "test_32",
2011 sdk_version: "core_platform",
2012 compile_multilib: "32",
2013 jni_libs: ["libjni"],
2014 }
2015
2016 android_test {
2017 name: "test_64",
2018 sdk_version: "core_platform",
2019 compile_multilib: "64",
2020 jni_libs: ["libjni"],
2021 }
2022 `)
2023
2024 testCases := []struct {
2025 name string
2026 abis []string
2027 }{
2028 {"test", []string{"arm64-v8a"}},
2029 {"test_first", []string{"arm64-v8a"}},
2030 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
2031 {"test_32", []string{"armeabi-v7a"}},
2032 {"test_64", []string{"arm64-v8a"}},
2033 }
2034
2035 for _, test := range testCases {
2036 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002037 t.Parallel()
Colin Cross90607e92025-02-11 14:58:07 -08002038 app := ctx.ModuleForTests(t, test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07002039 jniLibZip := app.Output("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01002040 var abis []string
2041 args := strings.Fields(jniLibZip.Args["jarArgs"])
2042 for i := 0; i < len(args); i++ {
2043 if args[i] == "-P" {
2044 abis = append(abis, filepath.Base(args[i+1]))
2045 i++
2046 }
2047 }
2048 if !reflect.DeepEqual(abis, test.abis) {
2049 t.Errorf("want abis %v, got %v", test.abis, abis)
2050 }
2051 })
2052 }
2053}
2054
Jeongik Cha2cc570d2019-10-29 15:44:45 +09002055func TestAppSdkVersionByPartition(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002056 t.Parallel()
Jeongik Cha2cc570d2019-10-29 15:44:45 +09002057 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
2058 android_app {
2059 name: "foo",
2060 srcs: ["a.java"],
2061 vendor: true,
2062 platform_apis: true,
2063 }
2064 `)
2065
2066 testJava(t, `
2067 android_app {
2068 name: "bar",
2069 srcs: ["b.java"],
2070 platform_apis: true,
2071 }
2072 `)
2073
2074 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09002075 bp := `
2076 android_app {
2077 name: "foo",
2078 srcs: ["a.java"],
2079 product_specific: true,
2080 platform_apis: true,
2081 }
2082 `
Colin Cross98be1bb2019-12-13 20:41:13 -08002083
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002084 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09002085 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002086 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 +09002087 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002088
2089 android.GroupFixturePreparers(
2090 PrepareForTestWithJavaDefaultModules,
2091 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2092 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
2093 }),
2094 ).
2095 ExtendWithErrorHandler(errorHandler).
2096 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09002097 }
2098}
2099
Paul Duffin50c217c2019-06-12 13:25:22 +01002100func TestJNIPackaging(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002101 t.Parallel()
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002102 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01002103 cc_library {
2104 name: "libjni",
2105 system_shared_libs: [],
2106 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08002107 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002108 }
2109
2110 android_app {
2111 name: "app",
2112 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002113 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002114 }
2115
2116 android_app {
2117 name: "app_noembed",
2118 jni_libs: ["libjni"],
2119 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002120 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002121 }
2122
2123 android_app {
2124 name: "app_embed",
2125 jni_libs: ["libjni"],
2126 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002127 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002128 }
2129
2130 android_test {
2131 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00002132 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002133 jni_libs: ["libjni"],
2134 }
2135
2136 android_test {
2137 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00002138 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002139 jni_libs: ["libjni"],
2140 use_embedded_native_libs: false,
2141 }
2142
2143 android_test_helper_app {
2144 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00002145 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002146 jni_libs: ["libjni"],
2147 }
2148
2149 android_test_helper_app {
2150 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00002151 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002152 jni_libs: ["libjni"],
2153 use_embedded_native_libs: false,
2154 }
2155 `)
2156
2157 testCases := []struct {
2158 name string
2159 packaged bool
2160 compressed bool
2161 }{
Jiyong Parkd044bb42024-05-15 02:09:54 +09002162 {"app", false, false},
2163 {"app_noembed", false, false},
Paul Duffin50c217c2019-06-12 13:25:22 +01002164 {"app_embed", true, false},
2165 {"test", true, false},
2166 {"test_noembed", true, true},
2167 {"test_helper", true, false},
2168 {"test_helper_noembed", true, true},
2169 }
2170
2171 for _, test := range testCases {
2172 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002173 t.Parallel()
Colin Cross90607e92025-02-11 14:58:07 -08002174 app := ctx.ModuleForTests(t, test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07002175 jniLibZip := app.MaybeOutput("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01002176 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
2177 t.Errorf("expected jni packaged %v, got %v", w, g)
2178 }
2179
2180 if jniLibZip.Rule != nil {
2181 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
2182 t.Errorf("expected jni compressed %v, got %v", w, g)
2183 }
Colin Crossc511bc52020-04-07 16:50:32 +00002184
2185 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
2186 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
2187 }
Paul Duffin50c217c2019-06-12 13:25:22 +01002188 }
2189 })
2190 }
Colin Cross47fa9d32019-03-26 10:51:39 -07002191}
2192
Colin Cross3c007702020-05-08 11:20:24 -07002193func TestJNISDK(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002194 t.Parallel()
Colin Cross3c007702020-05-08 11:20:24 -07002195 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
2196 cc_library {
2197 name: "libjni",
2198 system_shared_libs: [],
2199 stl: "none",
2200 sdk_version: "current",
2201 }
2202
2203 android_test {
2204 name: "app_platform",
2205 jni_libs: ["libjni"],
2206 platform_apis: true,
2207 }
2208
2209 android_test {
2210 name: "app_sdk",
2211 jni_libs: ["libjni"],
2212 sdk_version: "current",
2213 }
2214
2215 android_test {
2216 name: "app_force_platform",
2217 jni_libs: ["libjni"],
2218 sdk_version: "current",
2219 jni_uses_platform_apis: true,
2220 }
2221
2222 android_test {
2223 name: "app_force_sdk",
2224 jni_libs: ["libjni"],
2225 platform_apis: true,
2226 jni_uses_sdk_apis: true,
2227 }
Colin Crossc2d24052020-05-13 11:05:02 -07002228
2229 cc_library {
2230 name: "libvendorjni",
2231 system_shared_libs: [],
2232 stl: "none",
2233 vendor: true,
2234 }
2235
2236 android_test {
2237 name: "app_vendor",
2238 jni_libs: ["libvendorjni"],
2239 sdk_version: "current",
2240 vendor: true,
2241 }
Colin Cross3c007702020-05-08 11:20:24 -07002242 `)
2243
2244 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07002245 name string
2246 sdkJNI bool
2247 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07002248 }{
Colin Crossc2d24052020-05-13 11:05:02 -07002249 {name: "app_platform"},
2250 {name: "app_sdk", sdkJNI: true},
2251 {name: "app_force_platform"},
2252 {name: "app_force_sdk", sdkJNI: true},
2253 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07002254 }
2255
Colin Cross90607e92025-02-11 14:58:07 -08002256 platformJNI := ctx.ModuleForTests(t, "libjni", "android_arm64_armv8-a_shared").
Colin Crossc2d24052020-05-13 11:05:02 -07002257 Output("libjni.so").Output.String()
Colin Cross90607e92025-02-11 14:58:07 -08002258 sdkJNI := ctx.ModuleForTests(t, "libjni", "android_arm64_armv8-a_sdk_shared").
Colin Crossc2d24052020-05-13 11:05:02 -07002259 Output("libjni.so").Output.String()
Colin Cross90607e92025-02-11 14:58:07 -08002260 vendorJNI := ctx.ModuleForTests(t, "libvendorjni", "android_vendor_arm64_armv8-a_shared").
Colin Crossc2d24052020-05-13 11:05:02 -07002261 Output("libvendorjni.so").Output.String()
2262
Colin Cross3c007702020-05-08 11:20:24 -07002263 for _, test := range testCases {
2264 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002265 t.Parallel()
Colin Cross90607e92025-02-11 14:58:07 -08002266 app := ctx.ModuleForTests(t, test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07002267
Colin Crossb3168ba2023-07-26 16:14:56 -07002268 jniLibZip := app.MaybeOutput("jnilibs.zip")
Colin Cross3c007702020-05-08 11:20:24 -07002269 if len(jniLibZip.Implicits) != 1 {
2270 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
2271 }
2272 gotJNI := jniLibZip.Implicits[0].String()
2273
2274 if test.sdkJNI {
2275 if gotJNI != sdkJNI {
2276 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
2277 }
Colin Crossc2d24052020-05-13 11:05:02 -07002278 } else if test.vendorJNI {
2279 if gotJNI != vendorJNI {
2280 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
2281 }
Colin Cross3c007702020-05-08 11:20:24 -07002282 } else {
2283 if gotJNI != platformJNI {
2284 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
2285 }
2286 }
2287 })
2288 }
2289
2290 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002291 t.Parallel()
Colin Cross3c007702020-05-08 11:20:24 -07002292 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
2293 android_test {
2294 name: "app_platform",
2295 platform_apis: true,
2296 jni_uses_platform_apis: true,
2297 }
2298 `)
2299 })
2300
2301 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002302 t.Parallel()
Colin Cross3c007702020-05-08 11:20:24 -07002303 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
2304 android_test {
2305 name: "app_sdk",
2306 sdk_version: "current",
2307 jni_uses_sdk_apis: true,
2308 }
2309 `)
2310 })
2311
2312}
2313
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002314func TestCertificates(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002315 t.Parallel()
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002316 testCases := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002317 name string
2318 bp string
Colin Cross5caad2b2022-12-12 15:11:46 -08002319 allowMissingDependencies bool
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002320 certificateOverride string
2321 expectedCertSigningFlags string
2322 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002323 }{
2324 {
2325 name: "default",
2326 bp: `
2327 android_app {
2328 name: "foo",
2329 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002330 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002331 }
2332 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002333 certificateOverride: "",
2334 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002335 expectedCertificate: "build/make/target/product/security/testkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002336 },
2337 {
2338 name: "module certificate property",
2339 bp: `
2340 android_app {
2341 name: "foo",
2342 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002343 certificate: ":new_certificate",
2344 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002345 }
2346
2347 android_app_certificate {
2348 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002349 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002350 }
2351 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002352 certificateOverride: "",
2353 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002354 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002355 },
2356 {
2357 name: "path certificate property",
2358 bp: `
2359 android_app {
2360 name: "foo",
2361 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002362 certificate: "expiredkey",
2363 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002364 }
2365 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002366 certificateOverride: "",
2367 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002368 expectedCertificate: "build/make/target/product/security/expiredkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002369 },
2370 {
2371 name: "certificate overrides",
2372 bp: `
2373 android_app {
2374 name: "foo",
2375 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002376 certificate: "expiredkey",
2377 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002378 }
2379
2380 android_app_certificate {
2381 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002382 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002383 }
2384 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002385 certificateOverride: "foo:new_certificate",
2386 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002387 expectedCertificate: "cert/new_cert",
Liz Kammere2b27f42020-05-07 13:24:05 -07002388 },
2389 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002390 name: "certificate signing flags",
Liz Kammere2b27f42020-05-07 13:24:05 -07002391 bp: `
2392 android_app {
2393 name: "foo",
2394 srcs: ["a.java"],
2395 certificate: ":new_certificate",
2396 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002397 rotationMinSdkVersion: "32",
Liz Kammere2b27f42020-05-07 13:24:05 -07002398 sdk_version: "current",
2399 }
2400
2401 android_app_certificate {
2402 name: "new_certificate",
2403 certificate: "cert/new_cert",
2404 }
2405 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002406 certificateOverride: "",
2407 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002408 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002409 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002410 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002411 name: "cert signing flags from filegroup",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002412 bp: `
2413 android_app {
2414 name: "foo",
2415 srcs: ["a.java"],
2416 certificate: ":new_certificate",
2417 lineage: ":lineage_bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002418 rotationMinSdkVersion: "32",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002419 sdk_version: "current",
2420 }
2421
2422 android_app_certificate {
2423 name: "new_certificate",
2424 certificate: "cert/new_cert",
2425 }
2426
2427 filegroup {
2428 name: "lineage_bin",
2429 srcs: ["lineage.bin"],
2430 }
2431 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002432 certificateOverride: "",
2433 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002434 expectedCertificate: "cert/new_cert",
2435 },
2436 {
2437 name: "missing with AllowMissingDependencies",
2438 bp: `
2439 android_app {
2440 name: "foo",
2441 srcs: ["a.java"],
2442 certificate: ":new_certificate",
2443 sdk_version: "current",
2444 }
2445 `,
2446 expectedCertificate: "out/soong/.intermediates/foo/android_common/missing",
2447 allowMissingDependencies: true,
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002448 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002449 }
2450
2451 for _, test := range testCases {
2452 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002453 t.Parallel()
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002454 result := android.GroupFixturePreparers(
2455 PrepareForTestWithJavaDefaultModules,
2456 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2457 if test.certificateOverride != "" {
2458 variables.CertificateOverrides = []string{test.certificateOverride}
2459 }
Colin Cross5caad2b2022-12-12 15:11:46 -08002460 if test.allowMissingDependencies {
2461 variables.Allow_missing_dependencies = proptools.BoolPtr(true)
2462 }
2463 }),
2464 android.FixtureModifyContext(func(ctx *android.TestContext) {
2465 ctx.SetAllowMissingDependencies(test.allowMissingDependencies)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002466 }),
2467 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002468
Colin Cross90607e92025-02-11 14:58:07 -08002469 foo := result.ModuleForTests(t, "foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002470
Colin Cross5caad2b2022-12-12 15:11:46 -08002471 certificate := foo.Module().(*AndroidApp).certificate
2472 android.AssertPathRelativeToTopEquals(t, "certificates key", test.expectedCertificate+".pk8", certificate.Key)
2473 // The sign_target_files_apks and check_target_files_signatures
2474 // tools require that certificates have a .x509.pem extension.
2475 android.AssertPathRelativeToTopEquals(t, "certificates pem", test.expectedCertificate+".x509.pem", certificate.Pem)
Liz Kammere2b27f42020-05-07 13:24:05 -07002476
Colin Cross5caad2b2022-12-12 15:11:46 -08002477 signapk := foo.Output("foo.apk")
2478 if signapk.Rule != android.ErrorRule {
2479 signCertificateFlags := signapk.Args["certificates"]
2480 expectedFlags := certificate.Pem.String() + " " + certificate.Key.String()
2481 android.AssertStringEquals(t, "certificates flags", expectedFlags, signCertificateFlags)
2482
2483 certSigningFlags := signapk.Args["flags"]
2484 android.AssertStringEquals(t, "cert signing flags", test.expectedCertSigningFlags, certSigningFlags)
2485 }
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002486 })
2487 }
2488}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002489
Songchun Fan688de9a2020-03-24 20:32:24 -07002490func TestRequestV4SigningFlag(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002491 t.Parallel()
Songchun Fan688de9a2020-03-24 20:32:24 -07002492 testCases := []struct {
2493 name string
2494 bp string
2495 expected string
2496 }{
2497 {
2498 name: "default",
2499 bp: `
2500 android_app {
2501 name: "foo",
2502 srcs: ["a.java"],
2503 sdk_version: "current",
2504 }
2505 `,
2506 expected: "",
2507 },
2508 {
2509 name: "default",
2510 bp: `
2511 android_app {
2512 name: "foo",
2513 srcs: ["a.java"],
2514 sdk_version: "current",
2515 v4_signature: false,
2516 }
2517 `,
2518 expected: "",
2519 },
2520 {
2521 name: "module certificate property",
2522 bp: `
2523 android_app {
2524 name: "foo",
2525 srcs: ["a.java"],
2526 sdk_version: "current",
2527 v4_signature: true,
2528 }
2529 `,
2530 expected: "--enable-v4",
2531 },
2532 }
2533
2534 for _, test := range testCases {
2535 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002536 t.Parallel()
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002537 result := android.GroupFixturePreparers(
2538 PrepareForTestWithJavaDefaultModules,
2539 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07002540
Colin Cross90607e92025-02-11 14:58:07 -08002541 foo := result.ModuleForTests(t, "foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07002542
2543 signapk := foo.Output("foo.apk")
2544 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002545 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07002546 })
2547 }
2548}
2549
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002550func TestPackageNameOverride(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002551 t.Parallel()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002552 testCases := []struct {
2553 name string
2554 bp string
2555 packageNameOverride string
2556 expected []string
2557 }{
2558 {
2559 name: "default",
2560 bp: `
2561 android_app {
2562 name: "foo",
2563 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002564 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002565 }
2566 `,
2567 packageNameOverride: "",
2568 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002569 "out/soong/.intermediates/foo/android_common/foo.apk",
Cole Faust6b7075f2024-12-17 10:42:42 -08002570 "out/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002571 },
2572 },
2573 {
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002574 name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002575 bp: `
2576 android_app {
2577 name: "foo",
2578 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002579 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002580 }
2581 `,
2582 packageNameOverride: "foo:bar",
2583 expected: []string{
2584 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002585 "out/soong/.intermediates/foo/android_common/bar.apk",
Cole Faust6b7075f2024-12-17 10:42:42 -08002586 "out/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002587 },
2588 },
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002589 {
2590 name: "overridden via stem",
2591 bp: `
2592 android_app {
2593 name: "foo",
2594 srcs: ["a.java"],
2595 sdk_version: "current",
2596 stem: "bar",
2597 }
2598 `,
2599 packageNameOverride: "",
2600 expected: []string{
2601 "out/soong/.intermediates/foo/android_common/bar.apk",
Cole Faust6b7075f2024-12-17 10:42:42 -08002602 "out/target/product/test_device/system/app/bar/bar.apk",
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002603 },
2604 },
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002605 }
2606
2607 for _, test := range testCases {
2608 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002609 t.Parallel()
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002610 result := android.GroupFixturePreparers(
2611 PrepareForTestWithJavaDefaultModules,
2612 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2613 if test.packageNameOverride != "" {
2614 variables.PackageNameOverrides = []string{test.packageNameOverride}
2615 }
2616 }),
2617 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002618
Colin Cross90607e92025-02-11 14:58:07 -08002619 foo := result.ModuleForTests(t, "foo", "android_common")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002620
Lukacs T. Berkifbaf7252021-08-19 09:36:42 +02002621 outSoongDir := result.Config.SoongOutDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002622
2623 outputs := foo.AllOutputs()
2624 outputMap := make(map[string]bool)
2625 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002626 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002627 }
2628 for _, e := range test.expected {
2629 if _, exist := outputMap[e]; !exist {
2630 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
2631 }
2632 }
2633 })
2634 }
2635}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002636
2637func TestInstrumentationTargetOverridden(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002638 t.Parallel()
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002639 bp := `
2640 android_app {
2641 name: "foo",
2642 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002643 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002644 }
2645
2646 android_test {
2647 name: "bar",
2648 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002649 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002650 }
2651 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002652
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002653 result := android.GroupFixturePreparers(
2654 PrepareForTestWithJavaDefaultModules,
2655 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2656 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
2657 }),
2658 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002659
Colin Cross90607e92025-02-11 14:58:07 -08002660 bar := result.ModuleForTests(t, "bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002661 res := bar.Output("package-res.apk")
2662 aapt2Flags := res.Args["flags"]
2663 e := "--rename-instrumentation-target-package org.dandroid.bp"
2664 if !strings.Contains(aapt2Flags, e) {
2665 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
2666 }
2667}
Jaewoong Jung525443a2019-02-28 15:35:54 -08002668
2669func TestOverrideAndroidApp(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002670 t.Parallel()
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002671 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2672 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08002673 android_app {
2674 name: "foo",
2675 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07002676 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002677 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002678 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002679 }
2680
2681 override_android_app {
2682 name: "bar",
2683 base: "foo",
2684 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07002685 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002686 rotationMinSdkVersion: "32",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002687 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002688 }
2689
2690 android_app_certificate {
2691 name: "new_certificate",
2692 certificate: "cert/new_cert",
2693 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002694
2695 override_android_app {
2696 name: "baz",
2697 base: "foo",
2698 package_name: "org.dandroid.bp",
2699 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002700
2701 override_android_app {
2702 name: "baz_no_rename_resources",
2703 base: "foo",
2704 package_name: "org.dandroid.bp",
2705 rename_resources_package: false,
2706 }
2707
2708 android_app {
2709 name: "foo_no_rename_resources",
2710 srcs: ["a.java"],
2711 certificate: "expiredkey",
2712 overrides: ["qux"],
2713 rename_resources_package: false,
2714 sdk_version: "current",
2715 }
2716
2717 override_android_app {
2718 name: "baz_base_no_rename_resources",
2719 base: "foo_no_rename_resources",
2720 package_name: "org.dandroid.bp",
2721 }
2722
2723 override_android_app {
2724 name: "baz_override_base_rename_resources",
2725 base: "foo_no_rename_resources",
2726 package_name: "org.dandroid.bp",
2727 rename_resources_package: true,
2728 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08002729 `)
2730
2731 expectedVariants := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002732 name string
2733 moduleName string
2734 variantName string
2735 apkName string
2736 apkPath string
2737 certFlag string
2738 certSigningFlags string
2739 overrides []string
2740 packageFlag string
2741 renameResources bool
2742 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08002743 }{
2744 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002745 name: "foo",
2746 moduleName: "foo",
2747 variantName: "android_common",
Cole Faust6b7075f2024-12-17 10:42:42 -08002748 apkPath: "out/target/product/test_device/system/app/foo/foo.apk",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002749 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2750 certSigningFlags: "",
2751 overrides: []string{"qux"},
2752 packageFlag: "",
2753 renameResources: false,
2754 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002755 },
2756 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002757 name: "foo",
2758 moduleName: "bar",
2759 variantName: "android_common_bar",
Cole Faust6b7075f2024-12-17 10:42:42 -08002760 apkPath: "out/target/product/test_device/system/app/bar/bar.apk",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002761 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
2762 certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
2763 overrides: []string{"qux", "foo"},
2764 packageFlag: "",
2765 renameResources: false,
2766 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002767 },
2768 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002769 name: "foo",
2770 moduleName: "baz",
2771 variantName: "android_common_baz",
Cole Faust6b7075f2024-12-17 10:42:42 -08002772 apkPath: "out/target/product/test_device/system/app/baz/baz.apk",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002773 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2774 certSigningFlags: "",
2775 overrides: []string{"qux", "foo"},
2776 packageFlag: "org.dandroid.bp",
2777 renameResources: true,
2778 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002779 },
2780 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002781 name: "foo",
2782 moduleName: "baz_no_rename_resources",
2783 variantName: "android_common_baz_no_rename_resources",
Cole Faust6b7075f2024-12-17 10:42:42 -08002784 apkPath: "out/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002785 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2786 certSigningFlags: "",
2787 overrides: []string{"qux", "foo"},
2788 packageFlag: "org.dandroid.bp",
2789 renameResources: false,
2790 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002791 },
2792 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002793 name: "foo_no_rename_resources",
2794 moduleName: "baz_base_no_rename_resources",
2795 variantName: "android_common_baz_base_no_rename_resources",
Cole Faust6b7075f2024-12-17 10:42:42 -08002796 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 -04002797 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2798 certSigningFlags: "",
2799 overrides: []string{"qux", "foo_no_rename_resources"},
2800 packageFlag: "org.dandroid.bp",
2801 renameResources: false,
2802 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002803 },
2804 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002805 name: "foo_no_rename_resources",
2806 moduleName: "baz_override_base_rename_resources",
2807 variantName: "android_common_baz_override_base_rename_resources",
Cole Faust6b7075f2024-12-17 10:42:42 -08002808 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 -04002809 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2810 certSigningFlags: "",
2811 overrides: []string{"qux", "foo_no_rename_resources"},
2812 packageFlag: "org.dandroid.bp",
2813 renameResources: true,
2814 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002815 },
2816 }
2817 for _, expected := range expectedVariants {
Colin Cross90607e92025-02-11 14:58:07 -08002818 variant := result.ModuleForTests(t, expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002819
2820 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002821 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002822
2823 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08002824 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07002825 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002826 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07002827
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002828 // Check the cert signing flags
2829 certSigningFlags := signapk.Args["flags"]
2830 android.AssertStringEquals(t, "cert signing flags", expected.certSigningFlags, certSigningFlags)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002831
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002832 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08002833 mod := variant.Module().(*AndroidApp)
zhidoua2ce78f2022-02-17 02:33:12 +00002834 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002835
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002836 // Test Overridable property: Logging_parent
2837 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002838 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002839
Liz Kammer1d5983b2020-05-19 19:15:37 +00002840 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002841 res := variant.Output("package-res.apk")
2842 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00002843 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
2844 expectedPackage := expected.packageFlag
2845 if !expected.renameResources {
2846 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00002847 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002848 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002849 }
2850}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07002851
zhidoua2ce78f2022-02-17 02:33:12 +00002852func TestOverrideAndroidAppOverrides(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002853 t.Parallel()
zhidoua2ce78f2022-02-17 02:33:12 +00002854 ctx, _ := testJava(
2855 t, `
2856 android_app {
2857 name: "foo",
2858 srcs: ["a.java"],
2859 sdk_version: "current",
2860 overrides: ["qux"]
2861 }
2862
2863 android_app {
2864 name: "bar",
2865 srcs: ["b.java"],
2866 sdk_version: "current",
2867 overrides: ["foo"]
2868 }
2869
2870 override_android_app {
2871 name: "foo_override",
2872 base: "foo",
2873 overrides: ["bar"]
2874 }
2875 `)
2876
2877 expectedVariants := []struct {
2878 name string
2879 moduleName string
2880 variantName string
2881 overrides []string
2882 }{
2883 {
2884 name: "foo",
2885 moduleName: "foo",
2886 variantName: "android_common",
2887 overrides: []string{"qux"},
2888 },
2889 {
2890 name: "bar",
2891 moduleName: "bar",
2892 variantName: "android_common",
2893 overrides: []string{"foo"},
2894 },
2895 {
2896 name: "foo",
2897 moduleName: "foo_override",
2898 variantName: "android_common_foo_override",
2899 overrides: []string{"bar", "foo"},
2900 },
2901 }
2902 for _, expected := range expectedVariants {
Colin Cross90607e92025-02-11 14:58:07 -08002903 variant := ctx.ModuleForTests(t, expected.name, expected.variantName)
zhidoua2ce78f2022-02-17 02:33:12 +00002904
2905 // Check if the overrides field values are correctly aggregated.
2906 mod := variant.Module().(*AndroidApp)
2907 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2908 }
2909}
2910
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002911func TestOverrideAndroidAppWithPrebuilt(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002912 t.Parallel()
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002913 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2914 t, `
2915 android_app {
2916 name: "foo",
2917 srcs: ["a.java"],
2918 sdk_version: "current",
2919 }
2920
2921 override_android_app {
2922 name: "bar",
2923 base: "foo",
2924 }
2925
2926 android_app_import {
2927 name: "bar",
2928 prefer: true,
2929 apk: "bar.apk",
2930 presigned: true,
2931 }
2932 `)
2933
2934 // An app that has an override that also has a prebuilt should not be hidden.
Colin Cross90607e92025-02-11 14:58:07 -08002935 foo := result.ModuleForTests(t, "foo", "android_common")
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002936 if foo.Module().IsHideFromMake() {
2937 t.Errorf("expected foo to have HideFromMake false")
2938 }
2939
2940 // An override that also has a prebuilt should be hidden.
Colin Cross90607e92025-02-11 14:58:07 -08002941 barOverride := result.ModuleForTests(t, "foo", "android_common_bar")
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002942 if !barOverride.Module().IsHideFromMake() {
2943 t.Errorf("expected bar override variant of foo to have HideFromMake true")
2944 }
2945}
2946
Jooyung Han01d80d82022-01-08 12:16:32 +09002947func TestOverrideAndroidAppStem(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002948 t.Parallel()
Jooyung Han01d80d82022-01-08 12:16:32 +09002949 ctx, _ := testJava(t, `
2950 android_app {
2951 name: "foo",
2952 srcs: ["a.java"],
2953 sdk_version: "current",
2954 }
2955 override_android_app {
2956 name: "bar",
2957 base: "foo",
2958 }
2959 override_android_app {
2960 name: "baz",
2961 base: "foo",
2962 stem: "baz_stem",
2963 }
2964 android_app {
2965 name: "foo2",
2966 srcs: ["a.java"],
2967 sdk_version: "current",
2968 stem: "foo2_stem",
2969 }
2970 override_android_app {
2971 name: "bar2",
2972 base: "foo2",
2973 }
2974 override_android_app {
2975 name: "baz2",
2976 base: "foo2",
2977 stem: "baz2_stem",
2978 }
2979 `)
2980 for _, expected := range []struct {
2981 moduleName string
2982 variantName string
2983 apkPath string
2984 }{
2985 {
2986 moduleName: "foo",
2987 variantName: "android_common",
Cole Faust6b7075f2024-12-17 10:42:42 -08002988 apkPath: "out/target/product/test_device/system/app/foo/foo.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09002989 },
2990 {
2991 moduleName: "foo",
2992 variantName: "android_common_bar",
Cole Faust6b7075f2024-12-17 10:42:42 -08002993 apkPath: "out/target/product/test_device/system/app/bar/bar.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09002994 },
2995 {
2996 moduleName: "foo",
2997 variantName: "android_common_baz",
Cole Faust6b7075f2024-12-17 10:42:42 -08002998 apkPath: "out/target/product/test_device/system/app/baz_stem/baz_stem.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09002999 },
3000 {
3001 moduleName: "foo2",
3002 variantName: "android_common",
Cole Faust6b7075f2024-12-17 10:42:42 -08003003 apkPath: "out/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09003004 },
3005 {
3006 moduleName: "foo2",
3007 variantName: "android_common_bar2",
3008 // Note that this may cause the duplicate output error.
Cole Faust6b7075f2024-12-17 10:42:42 -08003009 apkPath: "out/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09003010 },
3011 {
3012 moduleName: "foo2",
3013 variantName: "android_common_baz2",
Cole Faust6b7075f2024-12-17 10:42:42 -08003014 apkPath: "out/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09003015 },
3016 } {
Colin Cross90607e92025-02-11 14:58:07 -08003017 variant := ctx.ModuleForTests(t, expected.moduleName, expected.variantName)
Jooyung Han01d80d82022-01-08 12:16:32 +09003018 variant.Output(expected.apkPath)
3019 }
3020}
3021
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07003022func TestOverrideAndroidAppDependency(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003023 t.Parallel()
Jaewoong Jungf9a04432019-07-17 11:15:09 -07003024 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07003025 android_app {
3026 name: "foo",
3027 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003028 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07003029 }
3030
3031 override_android_app {
3032 name: "bar",
3033 base: "foo",
3034 package_name: "org.dandroid.bp",
3035 }
3036
3037 android_test {
3038 name: "baz",
3039 srcs: ["b.java"],
3040 instrumentation_for: "foo",
3041 }
3042
3043 android_test {
3044 name: "qux",
3045 srcs: ["b.java"],
3046 instrumentation_for: "bar",
3047 }
3048 `)
3049
3050 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Colin Cross90607e92025-02-11 14:58:07 -08003051 javac := ctx.ModuleForTests(t, "baz", "android_common").Rule("javac")
Colin Cross8ff4af32025-02-19 15:17:02 -08003052 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07003053 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
3054 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
3055 }
3056
3057 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Colin Cross90607e92025-02-11 14:58:07 -08003058 javac = ctx.ModuleForTests(t, "qux", "android_common").Rule("javac")
Colin Cross8ff4af32025-02-19 15:17:02 -08003059 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07003060 if !strings.Contains(javac.Args["classpath"], barTurbine) {
3061 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
3062 }
3063}
3064
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003065func TestOverrideAndroidTest(t *testing.T) {
3066 ctx, _ := testJava(t, `
3067 android_app {
3068 name: "foo",
3069 srcs: ["a.java"],
3070 package_name: "com.android.foo",
3071 sdk_version: "current",
3072 }
3073
3074 override_android_app {
3075 name: "bar",
3076 base: "foo",
3077 package_name: "com.android.bar",
3078 }
3079
3080 android_test {
3081 name: "foo_test",
3082 srcs: ["b.java"],
3083 instrumentation_for: "foo",
3084 }
3085
3086 override_android_test {
3087 name: "bar_test",
3088 base: "foo_test",
3089 package_name: "com.android.bar.test",
3090 instrumentation_for: "bar",
3091 instrumentation_target_package: "com.android.bar",
3092 }
3093 `)
3094
3095 expectedVariants := []struct {
3096 moduleName string
3097 variantName string
3098 apkPath string
3099 overrides []string
3100 targetVariant string
3101 packageFlag string
3102 targetPackageFlag string
3103 }{
3104 {
3105 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08003106 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003107 overrides: nil,
3108 targetVariant: "android_common",
3109 packageFlag: "",
3110 targetPackageFlag: "",
3111 },
3112 {
3113 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08003114 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003115 overrides: []string{"foo_test"},
3116 targetVariant: "android_common_bar",
3117 packageFlag: "com.android.bar.test",
3118 targetPackageFlag: "com.android.bar",
3119 },
3120 }
3121 for _, expected := range expectedVariants {
Colin Cross90607e92025-02-11 14:58:07 -08003122 variant := ctx.ModuleForTests(t, "foo_test", expected.variantName)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003123
3124 // Check the final apk name
Cole Faust6b7075f2024-12-17 10:42:42 -08003125 variant.Output("out" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003126
3127 // Check if the overrides field values are correctly aggregated.
3128 mod := variant.Module().(*AndroidTest)
zhidoua2ce78f2022-02-17 02:33:12 +00003129 if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003130 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
zhidoua2ce78f2022-02-17 02:33:12 +00003131 expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003132 }
3133
3134 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01003135 javac := variant.Rule("javac")
Colin Cross8ff4af32025-02-19 15:17:02 -08003136 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003137 if !strings.Contains(javac.Args["classpath"], turbine) {
3138 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
3139 }
3140
3141 // Check aapt2 flags.
3142 res := variant.Output("package-res.apk")
3143 aapt2Flags := res.Args["flags"]
3144 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00003145 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003146 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
3147 }
3148}
3149
Jaewoong Jung39982342020-01-14 10:27:18 -08003150func TestAndroidTest_FixTestConfig(t *testing.T) {
3151 ctx, _ := testJava(t, `
3152 android_app {
3153 name: "foo",
3154 srcs: ["a.java"],
3155 package_name: "com.android.foo",
3156 sdk_version: "current",
3157 }
3158
3159 android_test {
3160 name: "foo_test",
3161 srcs: ["b.java"],
3162 instrumentation_for: "foo",
3163 }
3164
3165 android_test {
3166 name: "bar_test",
3167 srcs: ["b.java"],
3168 package_name: "com.android.bar.test",
3169 instrumentation_for: "foo",
Seth Moorec6f4b532023-02-02 13:22:26 -08003170 mainline_package_name: "com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08003171 }
3172
3173 override_android_test {
3174 name: "baz_test",
3175 base: "foo_test",
3176 package_name: "com.android.baz.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08003177 mainline_package_name: "com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08003178 }
3179 `)
3180
3181 testCases := []struct {
3182 moduleName string
3183 variantName string
3184 expectedFlags []string
3185 }{
3186 {
3187 moduleName: "foo_test",
3188 variantName: "android_common",
3189 },
3190 {
3191 moduleName: "bar_test",
3192 variantName: "android_common",
3193 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003194 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003195 "--package-name com.android.bar.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08003196 "--mainline-package-name com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08003197 },
3198 },
3199 {
3200 moduleName: "foo_test",
3201 variantName: "android_common_baz_test",
3202 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003203 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003204 "--package-name com.android.baz.test",
3205 "--test-file-name baz_test.apk",
Seth Moorec6f4b532023-02-02 13:22:26 -08003206 "out/soong/.intermediates/foo_test/android_common_baz_test/test_config_fixer/AndroidTest.xml",
3207 "--mainline-package-name com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08003208 },
3209 },
3210 }
3211
3212 for _, test := range testCases {
Colin Cross90607e92025-02-11 14:58:07 -08003213 variant := ctx.ModuleForTests(t, test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01003214 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08003215
3216 if len(test.expectedFlags) > 0 {
3217 if params.Rule == nil {
3218 t.Errorf("test_config_fixer was expected to run, but didn't")
3219 } else {
3220 for _, flag := range test.expectedFlags {
3221 if !strings.Contains(params.RuleParams.Command, flag) {
3222 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
3223 }
3224 }
3225 }
3226 } else {
3227 if params.Rule != nil {
3228 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
3229 }
3230 }
Jaewoong Jung39982342020-01-14 10:27:18 -08003231 }
3232}
3233
Paul Duffin53a70a42022-01-11 14:35:55 +00003234func TestInstrumentationTargetPrebuilt(t *testing.T) {
3235 bp := `
3236 android_app_import {
3237 name: "foo",
3238 apk: "foo.apk",
3239 presigned: true,
3240 }
3241
3242 android_test {
3243 name: "bar",
3244 srcs: ["a.java"],
3245 instrumentation_for: "foo",
3246 sdk_version: "current",
3247 }
3248 `
3249
3250 android.GroupFixturePreparers(
3251 PrepareForTestWithJavaDefaultModules,
3252 ).ExtendWithErrorHandler(
3253 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
3254 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
3255 RunTestWithBp(t, bp)
3256}
3257
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003258func TestStl(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003259 t.Parallel()
Jaewoong Jungf9a04432019-07-17 11:15:09 -07003260 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003261 cc_library {
3262 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08003263 sdk_version: "current",
3264 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003265 }
3266
3267 android_test {
3268 name: "stl",
3269 jni_libs: ["libjni"],
3270 compile_multilib: "both",
3271 sdk_version: "current",
3272 stl: "c++_shared",
3273 }
3274
3275 android_test {
3276 name: "system",
3277 jni_libs: ["libjni"],
3278 compile_multilib: "both",
3279 sdk_version: "current",
3280 }
3281 `)
3282
3283 testCases := []struct {
3284 name string
3285 jnis []string
3286 }{
3287 {"stl",
3288 []string{
3289 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07003290 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003291 },
3292 },
3293 {"system",
3294 []string{
3295 "libjni.so",
3296 },
3297 },
3298 }
3299
3300 for _, test := range testCases {
3301 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003302 t.Parallel()
Colin Cross90607e92025-02-11 14:58:07 -08003303 app := ctx.ModuleForTests(t, test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07003304 jniLibZip := app.Output("jnilibs.zip")
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003305 var jnis []string
3306 args := strings.Fields(jniLibZip.Args["jarArgs"])
3307 for i := 0; i < len(args); i++ {
3308 if args[i] == "-f" {
3309 jnis = append(jnis, args[i+1])
3310 i += 1
3311 }
3312 }
3313 jnisJoined := strings.Join(jnis, " ")
3314 for _, jni := range test.jnis {
3315 if !strings.Contains(jnisJoined, jni) {
3316 t.Errorf("missing jni %q in %q", jni, jnis)
3317 }
3318 }
3319 })
3320 }
3321}
Colin Cross50ddcc42019-05-16 12:28:22 -07003322
3323func TestUsesLibraries(t *testing.T) {
3324 bp := `
3325 java_sdk_library {
3326 name: "foo",
3327 srcs: ["a.java"],
3328 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003329 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003330 }
3331
3332 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01003333 name: "qux",
3334 srcs: ["a.java"],
3335 api_packages: ["qux"],
3336 sdk_version: "current",
3337 }
3338
3339 java_sdk_library {
3340 name: "quuz",
3341 srcs: ["a.java"],
3342 api_packages: ["quuz"],
3343 sdk_version: "current",
3344 }
3345
3346 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003347 name: "fred",
3348 srcs: ["a.java"],
3349 api_packages: ["fred"],
3350 sdk_version: "current",
3351 }
3352
3353 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07003354 name: "bar",
3355 srcs: ["a.java"],
3356 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003357 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003358 }
3359
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01003360 java_sdk_library {
3361 name: "runtime-library",
3362 srcs: ["a.java"],
3363 sdk_version: "current",
3364 }
3365
3366 java_library {
3367 name: "static-runtime-helper",
3368 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00003369 libs: ["runtime-library.impl"],
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01003370 sdk_version: "current",
3371 }
3372
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003373 java_library {
3374 name: "runtime-required-x",
3375 srcs: ["a.java"],
3376 installable: true,
3377 sdk_version: "current",
3378 }
3379
3380 java_library {
3381 name: "runtime-optional-x",
3382 srcs: ["a.java"],
3383 installable: true,
3384 sdk_version: "current",
3385 }
3386
3387 android_library {
3388 name: "static-x",
3389 uses_libs: ["runtime-required-x"],
3390 optional_uses_libs: ["runtime-optional-x"],
3391 sdk_version: "current",
3392 }
3393
3394 java_library {
3395 name: "runtime-required-y",
3396 srcs: ["a.java"],
3397 installable: true,
3398 sdk_version: "current",
3399 }
3400
3401 java_library {
3402 name: "runtime-optional-y",
3403 srcs: ["a.java"],
3404 installable: true,
3405 sdk_version: "current",
3406 }
3407
3408 java_library {
3409 name: "static-y",
3410 srcs: ["a.java"],
3411 uses_libs: ["runtime-required-y"],
Jiakai Zhang36937082024-04-15 11:15:50 +00003412 optional_uses_libs: [
3413 "runtime-optional-y",
3414 "missing-lib-a",
3415 ],
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003416 sdk_version: "current",
3417 }
3418
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003419 // A library that has to use "provides_uses_lib", because:
3420 // - it is not an SDK library
3421 // - its library name is different from its module name
3422 java_library {
3423 name: "non-sdk-lib",
3424 provides_uses_lib: "com.non.sdk.lib",
3425 installable: true,
3426 srcs: ["a.java"],
3427 }
3428
Colin Cross50ddcc42019-05-16 12:28:22 -07003429 android_app {
3430 name: "app",
3431 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003432 libs: [
Jihoon Kang28c96572024-09-11 23:44:44 +00003433 "qux.impl",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003434 "quuz.stubs"
3435 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003436 static_libs: [
3437 "static-runtime-helper",
3438 // statically linked component libraries should not pull their SDK libraries,
3439 // so "fred" should not be added to class loader context
3440 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003441 "static-x",
3442 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003443 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003444 uses_libs: [
3445 "foo",
3446 "non-sdk-lib"
3447 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003448 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003449 optional_uses_libs: [
3450 "bar",
Jiakai Zhangf98da192024-04-15 11:15:41 +00003451 "missing-lib-b",
Colin Cross50ddcc42019-05-16 12:28:22 -07003452 ],
3453 }
3454
3455 android_app_import {
3456 name: "prebuilt",
3457 apk: "prebuilts/apk/app.apk",
3458 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003459 uses_libs: [
3460 "foo",
3461 "non-sdk-lib",
3462 "android.test.runner"
3463 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07003464 optional_uses_libs: [
3465 "bar",
Jiakai Zhangf98da192024-04-15 11:15:41 +00003466 "missing-lib-b",
Colin Cross50ddcc42019-05-16 12:28:22 -07003467 ],
3468 }
3469 `
3470
Paul Duffin71ae5942021-03-22 15:36:52 +00003471 result := android.GroupFixturePreparers(
3472 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003473 PrepareForTestWithJavaSdkLibraryFiles,
3474 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Jiakai Zhang48203e32023-06-02 23:42:21 +01003475 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3476 variables.BuildWarningBadOptionalUsesLibsAllowlist = []string{"app", "prebuilt"}
3477 }),
Paul Duffind234b412021-03-12 23:04:46 +00003478 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07003479
Colin Cross90607e92025-02-11 14:58:07 -08003480 app := result.ModuleForTests(t, "app", "android_common")
3481 prebuilt := result.ModuleForTests(t, "prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07003482
Paul Duffin859fe962020-05-15 10:20:31 +01003483 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003484 // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be
3485 // propagated from dependencies.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003486 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
Jiyong Parkd044bb42024-05-15 02:09:54 +09003487 expectManifestFixerArgs := `--extract-native-libs=true ` +
3488 `--uses-library foo ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003489 `--uses-library com.non.sdk.lib ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003490 `--uses-library qux ` +
3491 `--uses-library quuz ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003492 `--uses-library runtime-library ` +
3493 `--uses-library runtime-required-x ` +
3494 `--uses-library runtime-required-y ` +
3495 `--optional-uses-library bar ` +
3496 `--optional-uses-library runtime-optional-x ` +
3497 `--optional-uses-library runtime-optional-y`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003498 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01003499
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003500 // Test that all libraries are verified (library order matters).
3501 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
3502 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00003503 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003504 `--uses-library qux ` +
3505 `--uses-library quuz ` +
3506 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003507 `--uses-library runtime-required-x ` +
3508 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003509 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003510 `--optional-uses-library runtime-optional-x ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003511 `--optional-uses-library runtime-optional-y ` +
Jiakai Zhang36937082024-04-15 11:15:50 +00003512 `--missing-optional-uses-library missing-lib-b ` +
3513 `--missing-optional-uses-library missing-lib-a`
Paul Duffind234b412021-03-12 23:04:46 +00003514 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003515
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003516 // Test that all libraries are verified for an APK (library order matters).
3517 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00003518 verifyApkArgs := `--uses-library foo ` +
3519 `--uses-library com.non.sdk.lib ` +
3520 `--uses-library android.test.runner ` +
3521 `--optional-uses-library bar ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003522 `--missing-optional-uses-library missing-lib-b `
Paul Duffind234b412021-03-12 23:04:46 +00003523 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003524
Jiakai Zhanga4496782023-05-17 16:57:30 +01003525 // Test that necessary args are passed for constructing CLC in Ninja phase.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003526 cmd := app.Rule("dexpreopt").RuleParams.Command
Jiakai Zhanga4496782023-05-17 16:57:30 +01003527 android.AssertStringDoesContain(t, "dexpreopt app cmd context", cmd, "--context-json=")
3528 android.AssertStringDoesContain(t, "dexpreopt app cmd product_packages", cmd,
Spandan Das2069c3f2023-12-06 19:40:24 +00003529 "--product-packages=out/soong/.intermediates/app/android_common/dexpreopt/app/product_packages.txt")
Colin Cross50ddcc42019-05-16 12:28:22 -07003530}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003531
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003532func TestDexpreoptBcp(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003533 t.Parallel()
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003534 bp := `
3535 java_sdk_library {
3536 name: "foo",
3537 srcs: ["a.java"],
3538 api_packages: ["foo"],
3539 sdk_version: "current",
3540 }
3541
3542 java_sdk_library {
3543 name: "bar",
3544 srcs: ["a.java"],
3545 api_packages: ["bar"],
3546 permitted_packages: ["bar"],
3547 sdk_version: "current",
3548 }
3549
3550 android_app {
3551 name: "app",
3552 srcs: ["a.java"],
3553 sdk_version: "current",
3554 }
3555 `
3556
3557 testCases := []struct {
3558 name string
3559 with bool
3560 expect string
3561 }{
3562 {
3563 name: "with updatable bcp",
3564 with: true,
3565 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
3566 },
3567 {
3568 name: "without updatable bcp",
3569 with: false,
3570 expect: "/system/framework/foo.jar",
3571 },
3572 }
3573
3574 for _, test := range testCases {
3575 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003576 t.Parallel()
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003577 result := android.GroupFixturePreparers(
3578 prepareForJavaTest,
3579 PrepareForTestWithJavaSdkLibraryFiles,
3580 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
3581 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01003582 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003583 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
3584 ).RunTestWithBp(t, bp)
3585
Colin Cross90607e92025-02-11 14:58:07 -08003586 app := result.ModuleForTests(t, "app", "android_common")
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003587 cmd := app.Rule("dexpreopt").RuleParams.Command
3588 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
3589 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
3590 })
3591 }
3592}
3593
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003594func TestCodelessApp(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003595 t.Parallel()
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003596 testCases := []struct {
3597 name string
3598 bp string
3599 noCode bool
3600 }{
3601 {
3602 name: "normal",
3603 bp: `
3604 android_app {
3605 name: "foo",
3606 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003607 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003608 }
3609 `,
3610 noCode: false,
3611 },
3612 {
3613 name: "app without sources",
3614 bp: `
3615 android_app {
3616 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003617 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003618 }
3619 `,
3620 noCode: true,
3621 },
3622 {
3623 name: "app with libraries",
3624 bp: `
3625 android_app {
3626 name: "foo",
3627 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003628 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003629 }
3630
3631 java_library {
3632 name: "lib",
3633 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003634 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003635 }
3636 `,
3637 noCode: false,
3638 },
3639 {
3640 name: "app with sourceless libraries",
3641 bp: `
3642 android_app {
3643 name: "foo",
3644 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003645 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003646 }
3647
3648 java_library {
3649 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003650 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003651 }
3652 `,
3653 // TODO(jungjw): this should probably be true
3654 noCode: false,
3655 },
3656 }
3657
3658 for _, test := range testCases {
3659 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003660 t.Parallel()
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003661 ctx := testApp(t, test.bp)
3662
Colin Cross90607e92025-02-11 14:58:07 -08003663 foo := ctx.ModuleForTests(t, "foo", "android_common")
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003664 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3665 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
3666 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
3667 }
3668 })
3669 }
3670}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07003671
Colin Cross53a87f52019-06-25 13:35:30 -07003672func TestUncompressDex(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003673 t.Parallel()
Colin Cross53a87f52019-06-25 13:35:30 -07003674 testCases := []struct {
3675 name string
3676 bp string
3677
3678 uncompressedPlatform bool
3679 uncompressedUnbundled bool
3680 }{
3681 {
3682 name: "normal",
3683 bp: `
3684 android_app {
3685 name: "foo",
3686 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003687 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003688 }
3689 `,
3690 uncompressedPlatform: true,
3691 uncompressedUnbundled: false,
3692 },
3693 {
3694 name: "use_embedded_dex",
3695 bp: `
3696 android_app {
3697 name: "foo",
3698 use_embedded_dex: true,
3699 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003700 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003701 }
3702 `,
3703 uncompressedPlatform: true,
3704 uncompressedUnbundled: true,
3705 },
3706 {
3707 name: "privileged",
3708 bp: `
3709 android_app {
3710 name: "foo",
3711 privileged: true,
3712 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003713 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003714 }
3715 `,
3716 uncompressedPlatform: true,
3717 uncompressedUnbundled: true,
3718 },
David Srbeckye033cba2020-05-20 22:20:28 +01003719 {
3720 name: "normal_uncompress_dex_true",
3721 bp: `
3722 android_app {
3723 name: "foo",
3724 srcs: ["a.java"],
3725 sdk_version: "current",
3726 uncompress_dex: true,
3727 }
3728 `,
3729 uncompressedPlatform: true,
3730 uncompressedUnbundled: true,
3731 },
3732 {
3733 name: "normal_uncompress_dex_false",
3734 bp: `
3735 android_app {
3736 name: "foo",
3737 srcs: ["a.java"],
3738 sdk_version: "current",
3739 uncompress_dex: false,
3740 }
3741 `,
3742 uncompressedPlatform: false,
3743 uncompressedUnbundled: false,
3744 },
Colin Cross53a87f52019-06-25 13:35:30 -07003745 }
3746
3747 test := func(t *testing.T, bp string, want bool, unbundled bool) {
3748 t.Helper()
3749
Paul Duffin71ae5942021-03-22 15:36:52 +00003750 result := android.GroupFixturePreparers(
3751 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003752 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00003753 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3754 if unbundled {
3755 variables.Unbundled_build = proptools.BoolPtr(true)
3756 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
3757 }
3758 }),
3759 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07003760
Colin Cross90607e92025-02-11 14:58:07 -08003761 foo := result.ModuleForTests(t, "foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07003762 dex := foo.Rule("r8")
3763 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
3764 aligned := foo.MaybeRule("zipalign").Rule != nil
3765
Paul Duffincdb88a92021-03-14 00:36:50 +00003766 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07003767
Paul Duffincdb88a92021-03-14 00:36:50 +00003768 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07003769 }
3770
3771 for _, tt := range testCases {
3772 t.Run(tt.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003773 t.Parallel()
Colin Cross53a87f52019-06-25 13:35:30 -07003774 t.Run("platform", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003775 t.Parallel()
Colin Cross53a87f52019-06-25 13:35:30 -07003776 test(t, tt.bp, tt.uncompressedPlatform, false)
3777 })
3778 t.Run("unbundled", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003779 t.Parallel()
Colin Cross53a87f52019-06-25 13:35:30 -07003780 test(t, tt.bp, tt.uncompressedUnbundled, true)
3781 })
3782 })
3783 }
3784}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003785
3786func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
3787 if expectedValue != "" {
3788 expectedFlag := "--" + flagName + " " + expectedValue
3789 if !strings.Contains(aapt2Flags, expectedFlag) {
3790 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
3791 }
3792 } else {
3793 unexpectedFlag := "--" + flagName
3794 if strings.Contains(aapt2Flags, unexpectedFlag) {
3795 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
3796 }
3797 }
3798}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08003799
Cole Faust9a631312020-10-22 21:05:24 +00003800func TestExportedProguardFlagFiles(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003801 t.Parallel()
Cole Faust9a631312020-10-22 21:05:24 +00003802 ctx, _ := testJava(t, `
3803 android_app {
3804 name: "foo",
3805 sdk_version: "current",
Colin Crosscde55342024-03-27 14:11:51 -07003806 static_libs: [
3807 "lib1",
3808 "lib3",
3809 ],
Cole Faust9a631312020-10-22 21:05:24 +00003810 }
3811
3812 android_library {
3813 name: "lib1",
3814 sdk_version: "current",
3815 optimize: {
3816 proguard_flags_files: ["lib1proguard.cfg"],
Colin Crosscde55342024-03-27 14:11:51 -07003817 },
3818 static_libs: ["lib2"],
3819 }
3820
3821 android_library {
3822 name: "lib2",
3823 sdk_version: "current",
3824 optimize: {
3825 proguard_flags_files: ["lib2proguard.cfg"],
Cole Faust9a631312020-10-22 21:05:24 +00003826 }
3827 }
Colin Crosscde55342024-03-27 14:11:51 -07003828
3829 android_library_import {
3830 name: "lib3",
3831 sdk_version: "current",
3832 aars: ["lib3.aar"],
3833 static_libs: ["lib4"],
3834 }
3835
3836 android_library {
3837 name: "lib4",
3838 sdk_version: "current",
3839 optimize: {
3840 proguard_flags_files: ["lib4proguard.cfg"],
3841 }
3842 }
3843
3844
Cole Faust9a631312020-10-22 21:05:24 +00003845 `)
3846
Colin Cross90607e92025-02-11 14:58:07 -08003847 m := ctx.ModuleForTests(t, "foo", "android_common")
Colin Crosscde55342024-03-27 14:11:51 -07003848 r8 := m.Rule("java.r8")
3849 implicits := r8.Implicits.RelativeToTop().Strings()
3850 android.AssertStringListContains(t, "r8 implicits", implicits, "lib1proguard.cfg")
3851 android.AssertStringListContains(t, "r8 implicits", implicits, "lib2proguard.cfg")
3852 android.AssertStringListContains(t, "r8 implicits", implicits, "lib4proguard.cfg")
3853 android.AssertStringListContains(t, "r8 implicits", implicits, "out/soong/.intermediates/lib3/android_common/aar/proguard.txt")
Cole Faust9a631312020-10-22 21:05:24 +00003854
Colin Crosscde55342024-03-27 14:11:51 -07003855 flags := r8.Args["r8Flags"]
3856 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib1proguard.cfg")
3857 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib2proguard.cfg")
3858 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib4proguard.cfg")
3859 android.AssertStringDoesContain(t, "r8 flags", flags, "-include out/soong/.intermediates/lib3/android_common/aar/proguard.txt")
Cole Faust9a631312020-10-22 21:05:24 +00003860}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003861
3862func TestTargetSdkVersionManifestFixer(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003863 t.Parallel()
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003864 platform_sdk_codename := "Tiramisu"
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003865 platform_sdk_version := 33
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003866 testCases := []struct {
3867 name string
3868 targetSdkVersionInBp string
3869 targetSdkVersionExpected string
3870 unbundledBuild bool
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003871 platformSdkFinal bool
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003872 }{
3873 {
3874 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
3875 targetSdkVersionInBp: "30",
3876 targetSdkVersionExpected: "30",
3877 unbundledBuild: false,
3878 },
3879 {
3880 name: "Unbundled build: Android.bp has targetSdkVersion",
3881 targetSdkVersionInBp: "30",
3882 targetSdkVersionExpected: "30",
3883 unbundledBuild: true,
3884 },
3885 {
3886 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3887 targetSdkVersionInBp: platform_sdk_codename,
3888 targetSdkVersionExpected: platform_sdk_codename,
3889 unbundledBuild: false,
3890 },
3891 {
3892 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3893 targetSdkVersionInBp: platform_sdk_codename,
3894 targetSdkVersionExpected: "10000",
3895 unbundledBuild: true,
3896 },
3897
3898 {
3899 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
3900 targetSdkVersionExpected: platform_sdk_codename,
3901 unbundledBuild: false,
3902 },
3903 {
3904 name: "Unbundled build: Android.bp has no targetSdkVersion",
3905 targetSdkVersionExpected: "10000",
3906 unbundledBuild: true,
3907 },
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003908 {
3909 name: "Bundled build in REL branches",
3910 targetSdkVersionExpected: "33",
3911 unbundledBuild: false,
3912 platformSdkFinal: true,
3913 },
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003914 }
3915 for _, testCase := range testCases {
Colin Cross844cb6a2025-01-29 15:53:21 -08003916 t.Run(testCase.name, func(t *testing.T) {
3917 t.Parallel()
3918 targetSdkVersionTemplate := ""
3919 if testCase.targetSdkVersionInBp != "" {
3920 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, testCase.targetSdkVersionInBp)
3921 }
3922 bp := fmt.Sprintf(`
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003923 android_app {
3924 name: "foo",
3925 sdk_version: "current",
Spandan Dasca70fc42023-03-01 23:38:49 +00003926 %s
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003927 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003928 `, targetSdkVersionTemplate)
Colin Cross844cb6a2025-01-29 15:53:21 -08003929 fixture := android.GroupFixturePreparers(
3930 prepareForJavaTest,
3931 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3932 if testCase.platformSdkFinal {
3933 variables.Platform_sdk_final = proptools.BoolPtr(true)
3934 }
3935 // explicitly set platform_sdk_codename to make the test deterministic
3936 variables.Platform_sdk_codename = &platform_sdk_codename
3937 variables.Platform_sdk_version = &platform_sdk_version
3938 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3939 // create a non-empty list if unbundledBuild==true
3940 if testCase.unbundledBuild {
3941 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3942 }
3943 }),
3944 )
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003945
Colin Cross844cb6a2025-01-29 15:53:21 -08003946 result := fixture.RunTestWithBp(t, bp)
Colin Cross90607e92025-02-11 14:58:07 -08003947 foo := result.ModuleForTests(t, "foo", "android_common")
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003948
Colin Cross844cb6a2025-01-29 15:53:21 -08003949 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3950 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3951 })
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003952 }
3953}
Colin Cross412436f2022-04-07 17:40:07 -07003954
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003955func TestDefaultAppTargetSdkVersionForUpdatableModules(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003956 t.Parallel()
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003957 platform_sdk_codename := "Tiramisu"
3958 platform_sdk_version := 33
3959 testCases := []struct {
3960 name string
3961 platform_sdk_final bool
3962 targetSdkVersionInBp *string
3963 targetSdkVersionExpected *string
3964 updatable bool
3965 }{
3966 {
3967 name: "Non-Updatable Module: Android.bp has older targetSdkVersion",
3968 targetSdkVersionInBp: proptools.StringPtr("29"),
3969 targetSdkVersionExpected: proptools.StringPtr("29"),
3970 updatable: false,
3971 },
3972 {
3973 name: "Updatable Module: Android.bp has older targetSdkVersion",
3974 targetSdkVersionInBp: proptools.StringPtr("30"),
3975 targetSdkVersionExpected: proptools.StringPtr("30"),
3976 updatable: true,
3977 },
3978 {
3979 name: "Updatable Module: Android.bp has no targetSdkVersion",
3980 targetSdkVersionExpected: proptools.StringPtr("10000"),
3981 updatable: true,
3982 },
3983 {
3984 name: "[SDK finalised] Non-Updatable Module: Android.bp has older targetSdkVersion",
3985 platform_sdk_final: true,
3986 targetSdkVersionInBp: proptools.StringPtr("30"),
3987 targetSdkVersionExpected: proptools.StringPtr("30"),
3988 updatable: false,
3989 },
3990 {
3991 name: "[SDK finalised] Updatable Module: Android.bp has older targetSdkVersion",
3992 platform_sdk_final: true,
3993 targetSdkVersionInBp: proptools.StringPtr("30"),
3994 targetSdkVersionExpected: proptools.StringPtr("30"),
3995 updatable: true,
3996 },
3997 {
3998 name: "[SDK finalised] Updatable Module: Android.bp has targetSdkVersion as platform sdk codename",
3999 platform_sdk_final: true,
4000 targetSdkVersionInBp: proptools.StringPtr(platform_sdk_codename),
4001 targetSdkVersionExpected: proptools.StringPtr("33"),
4002 updatable: true,
4003 },
4004 {
4005 name: "[SDK finalised] Updatable Module: Android.bp has no targetSdkVersion",
4006 platform_sdk_final: true,
4007 targetSdkVersionExpected: proptools.StringPtr("33"),
4008 updatable: true,
4009 },
4010 }
4011 for _, testCase := range testCases {
Colin Cross844cb6a2025-01-29 15:53:21 -08004012 t.Run(testCase.name, func(t *testing.T) {
4013 t.Parallel()
4014 targetSdkVersionTemplate := ""
4015 if testCase.targetSdkVersionInBp != nil {
4016 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, *testCase.targetSdkVersionInBp)
4017 }
4018 bp := fmt.Sprintf(`
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004019 android_app {
4020 name: "foo",
4021 sdk_version: "current",
4022 min_sdk_version: "29",
Spandan Dasca70fc42023-03-01 23:38:49 +00004023 %s
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004024 updatable: %t,
4025 enforce_default_target_sdk_version: %t
4026 }
Spandan Dasca70fc42023-03-01 23:38:49 +00004027 `, targetSdkVersionTemplate, testCase.updatable, testCase.updatable) // enforce default target sdk version if app is updatable
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004028
Colin Cross844cb6a2025-01-29 15:53:21 -08004029 fixture := android.GroupFixturePreparers(
4030 PrepareForTestWithJavaDefaultModules,
4031 android.PrepareForTestWithAllowMissingDependencies,
4032 android.PrepareForTestWithAndroidMk,
4033 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4034 // explicitly set following platform variables to make the test deterministic
4035 variables.Platform_sdk_final = &testCase.platform_sdk_final
4036 variables.Platform_sdk_version = &platform_sdk_version
4037 variables.Platform_sdk_codename = &platform_sdk_codename
4038 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
4039 variables.Unbundled_build = proptools.BoolPtr(true)
4040 variables.Unbundled_build_apps = []string{"sampleModule"}
4041 }),
4042 )
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004043
Colin Cross844cb6a2025-01-29 15:53:21 -08004044 result := fixture.RunTestWithBp(t, bp)
Colin Cross90607e92025-02-11 14:58:07 -08004045 foo := result.ModuleForTests(t, "foo", "android_common")
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004046
Colin Cross844cb6a2025-01-29 15:53:21 -08004047 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4048 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+*testCase.targetSdkVersionExpected)
4049 })
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004050 }
4051}
4052
4053func TestEnforceDefaultAppTargetSdkVersionFlag(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004054 t.Parallel()
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004055 platform_sdk_codename := "Tiramisu"
4056 platform_sdk_version := 33
4057 testCases := []struct {
4058 name string
4059 enforceDefaultTargetSdkVersion bool
4060 expectedError string
4061 platform_sdk_final bool
4062 targetSdkVersionInBp string
4063 targetSdkVersionExpected string
4064 updatable bool
4065 }{
4066 {
4067 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
4068 enforceDefaultTargetSdkVersion: false,
4069 targetSdkVersionInBp: "29",
4070 targetSdkVersionExpected: "29",
4071 updatable: false,
4072 },
4073 {
4074 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4075 enforceDefaultTargetSdkVersion: true,
4076 platform_sdk_final: true,
4077 targetSdkVersionInBp: "current",
4078 targetSdkVersionExpected: "33",
4079 updatable: true,
4080 },
4081 {
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004082 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004083 enforceDefaultTargetSdkVersion: true,
4084 platform_sdk_final: false,
4085 targetSdkVersionInBp: "current",
4086 targetSdkVersionExpected: "10000",
4087 updatable: false,
4088 },
4089 {
4090 name: "Not enforcing Target SDK Version for Updatable app",
4091 enforceDefaultTargetSdkVersion: false,
4092 expectedError: "Updatable apps must enforce default target sdk version",
4093 targetSdkVersionInBp: "29",
4094 targetSdkVersionExpected: "29",
4095 updatable: true,
4096 },
4097 }
4098 for _, testCase := range testCases {
Colin Cross844cb6a2025-01-29 15:53:21 -08004099 t.Run(testCase.name, func(t *testing.T) {
4100 t.Parallel()
4101 errExpected := testCase.expectedError != ""
4102 bp := fmt.Sprintf(`
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004103 android_app {
4104 name: "foo",
4105 enforce_default_target_sdk_version: %t,
4106 sdk_version: "current",
4107 min_sdk_version: "29",
4108 target_sdk_version: "%v",
4109 updatable: %t
4110 }
4111 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp, testCase.updatable)
4112
Colin Cross844cb6a2025-01-29 15:53:21 -08004113 fixture := android.GroupFixturePreparers(
4114 PrepareForTestWithJavaDefaultModules,
4115 android.PrepareForTestWithAllowMissingDependencies,
4116 android.PrepareForTestWithAndroidMk,
4117 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4118 // explicitly set following platform variables to make the test deterministic
4119 variables.Platform_sdk_final = &testCase.platform_sdk_final
4120 variables.Platform_sdk_version = &platform_sdk_version
4121 variables.Platform_sdk_codename = &platform_sdk_codename
4122 variables.Unbundled_build = proptools.BoolPtr(true)
4123 variables.Unbundled_build_apps = []string{"sampleModule"}
4124 }),
4125 )
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004126
Colin Cross844cb6a2025-01-29 15:53:21 -08004127 errorHandler := android.FixtureExpectsNoErrors
4128 if errExpected {
4129 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
4130 }
4131 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004132
Colin Cross844cb6a2025-01-29 15:53:21 -08004133 if !errExpected {
Colin Cross90607e92025-02-11 14:58:07 -08004134 foo := result.ModuleForTests(t, "foo", "android_common")
Colin Cross844cb6a2025-01-29 15:53:21 -08004135 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4136 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4137 }
4138 })
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004139 }
4140}
4141
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004142func TestEnforceDefaultAppTargetSdkVersionFlagForTests(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004143 t.Parallel()
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004144 platform_sdk_codename := "Tiramisu"
4145 platform_sdk_version := 33
4146 testCases := []struct {
4147 name string
4148 enforceDefaultTargetSdkVersion bool
4149 expectedError string
4150 platform_sdk_final bool
4151 targetSdkVersionInBp string
4152 targetSdkVersionExpected string
4153 }{
4154 {
4155 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
4156 enforceDefaultTargetSdkVersion: false,
4157 targetSdkVersionInBp: "29",
4158 targetSdkVersionExpected: "29",
4159 },
4160 {
4161 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4162 enforceDefaultTargetSdkVersion: true,
4163 platform_sdk_final: true,
4164 targetSdkVersionInBp: "current",
4165 targetSdkVersionExpected: "33",
4166 },
4167 {
4168 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4169 enforceDefaultTargetSdkVersion: true,
4170 platform_sdk_final: false,
4171 targetSdkVersionInBp: "current",
4172 targetSdkVersionExpected: "10000",
4173 },
4174 }
4175 for _, testCase := range testCases {
Colin Cross844cb6a2025-01-29 15:53:21 -08004176 t.Run(testCase.name, func(t *testing.T) {
4177 t.Parallel()
4178 errExpected := testCase.expectedError != ""
4179 bp := fmt.Sprintf(`
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004180 android_test {
4181 name: "foo",
4182 enforce_default_target_sdk_version: %t,
4183 min_sdk_version: "29",
4184 target_sdk_version: "%v",
4185 }
4186 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp)
4187
Colin Cross844cb6a2025-01-29 15:53:21 -08004188 fixture := android.GroupFixturePreparers(
4189 PrepareForTestWithJavaDefaultModules,
4190 android.PrepareForTestWithAllowMissingDependencies,
4191 android.PrepareForTestWithAndroidMk,
4192 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4193 // explicitly set following platform variables to make the test deterministic
4194 variables.Platform_sdk_final = &testCase.platform_sdk_final
4195 variables.Platform_sdk_version = &platform_sdk_version
4196 variables.Platform_sdk_codename = &platform_sdk_codename
4197 variables.Unbundled_build = proptools.BoolPtr(true)
4198 variables.Unbundled_build_apps = []string{"sampleModule"}
4199 }),
4200 )
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004201
Colin Cross844cb6a2025-01-29 15:53:21 -08004202 errorHandler := android.FixtureExpectsNoErrors
4203 if errExpected {
4204 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
4205 }
4206 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004207
Colin Cross844cb6a2025-01-29 15:53:21 -08004208 if !errExpected {
Colin Cross90607e92025-02-11 14:58:07 -08004209 foo := result.ModuleForTests(t, "foo", "android_common")
Colin Cross844cb6a2025-01-29 15:53:21 -08004210 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4211 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4212 }
4213 })
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004214 }
4215}
4216
Colin Cross412436f2022-04-07 17:40:07 -07004217func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004218 t.Parallel()
Colin Cross412436f2022-04-07 17:40:07 -07004219 result := android.GroupFixturePreparers(
4220 PrepareForTestWithJavaDefaultModules,
4221 android.PrepareForTestWithAllowMissingDependencies,
4222 android.PrepareForTestWithAndroidMk,
4223 ).RunTestWithBp(t, `
4224 android_app {
4225 name: "foo",
4226 srcs: ["a.java"],
4227 certificate: ":missing_certificate",
4228 sdk_version: "current",
Zyan Wub7550aa2023-05-18 15:46:31 +08004229 }
4230
4231 android_app {
4232 name: "bar",
4233 srcs: ["a.java"],
4234 certificate: ":missing_certificate",
4235 product_specific: true,
4236 sdk_version: "current",
Colin Cross412436f2022-04-07 17:40:07 -07004237 }`)
4238
Colin Cross90607e92025-02-11 14:58:07 -08004239 foo := result.ModuleForTests(t, "foo", "android_common")
Colin Cross412436f2022-04-07 17:40:07 -07004240 fooApk := foo.Output("foo.apk")
4241 if fooApk.Rule != android.ErrorRule {
4242 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
4243 }
4244 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
4245}
Sam Delmerico82602492022-06-10 17:05:42 +00004246
4247func TestAppIncludesJniPackages(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004248 t.Parallel()
Sam Delmerico82602492022-06-10 17:05:42 +00004249 ctx := android.GroupFixturePreparers(
4250 PrepareForTestWithJavaDefaultModules,
4251 ).RunTestWithBp(t, `
4252 android_library_import {
4253 name: "aary-nodeps",
4254 aars: ["aary.aar"],
4255 extract_jni: true,
4256 }
4257
4258 android_library {
4259 name: "aary-lib",
4260 sdk_version: "current",
4261 min_sdk_version: "21",
4262 static_libs: ["aary-nodeps"],
4263 }
4264
4265 android_app {
4266 name: "aary-lib-dep",
4267 sdk_version: "current",
4268 min_sdk_version: "21",
4269 manifest: "AndroidManifest.xml",
4270 static_libs: ["aary-lib"],
4271 use_embedded_native_libs: true,
4272 }
4273
4274 android_app {
4275 name: "aary-import-dep",
4276 sdk_version: "current",
4277 min_sdk_version: "21",
4278 manifest: "AndroidManifest.xml",
4279 static_libs: ["aary-nodeps"],
4280 use_embedded_native_libs: true,
4281 }
4282
4283 android_app {
4284 name: "aary-no-use-embedded",
4285 sdk_version: "current",
4286 min_sdk_version: "21",
4287 manifest: "AndroidManifest.xml",
4288 static_libs: ["aary-nodeps"],
4289 }`)
4290
4291 testCases := []struct {
4292 name string
4293 hasPackage bool
4294 }{
4295 {
4296 name: "aary-import-dep",
4297 hasPackage: true,
4298 },
4299 {
4300 name: "aary-lib-dep",
4301 hasPackage: true,
4302 },
4303 {
4304 name: "aary-no-use-embedded",
Jiyong Parkd044bb42024-05-15 02:09:54 +09004305 hasPackage: false,
Sam Delmerico82602492022-06-10 17:05:42 +00004306 },
4307 }
4308
4309 for _, tc := range testCases {
4310 t.Run(tc.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004311 t.Parallel()
Colin Cross90607e92025-02-11 14:58:07 -08004312 app := ctx.ModuleForTests(t, tc.name, "android_common")
Sam Delmerico82602492022-06-10 17:05:42 +00004313
4314 outputFile := "jnilibs.zip"
4315 jniOutputLibZip := app.MaybeOutput(outputFile)
4316 if jniOutputLibZip.Rule == nil && !tc.hasPackage {
4317 return
4318 }
4319
4320 jniPackage := "arm64-v8a_jni.zip"
4321 inputs := jniOutputLibZip.Inputs
4322 foundPackage := false
4323 for i := 0; i < len(inputs); i++ {
4324 if strings.Contains(inputs[i].String(), jniPackage) {
4325 foundPackage = true
4326 }
4327 }
4328 if foundPackage != tc.hasPackage {
4329 t.Errorf("expected to find %v in %v inputs; inputs = %v", jniPackage, outputFile, inputs)
4330 }
4331 })
4332 }
4333}
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004334
4335func TestTargetSdkVersionMtsTests(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004336 t.Parallel()
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004337 platformSdkCodename := "Tiramisu"
4338 android_test := "android_test"
4339 android_test_helper_app := "android_test_helper_app"
4340 bpTemplate := `
4341 %v {
4342 name: "mytest",
Spandan Dasb0410872024-06-25 03:30:03 +00004343 min_sdk_version: "34",
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004344 target_sdk_version: "%v",
4345 test_suites: ["othersuite", "%v"],
4346 }
4347 `
4348 testCases := []struct {
4349 desc string
4350 moduleType string
4351 targetSdkVersionInBp string
4352 targetSdkVersionExpected string
4353 testSuites string
4354 }{
4355 {
4356 desc: "Non-MTS android_test_apps targeting current should not be upgraded to 10000",
4357 moduleType: android_test,
4358 targetSdkVersionInBp: "current",
4359 targetSdkVersionExpected: platformSdkCodename,
4360 testSuites: "non-mts-suite",
4361 },
4362 {
4363 desc: "MTS android_test_apps targeting released sdks should not be upgraded to 10000",
4364 moduleType: android_test,
4365 targetSdkVersionInBp: "29",
4366 targetSdkVersionExpected: "29",
4367 testSuites: "mts-suite",
4368 },
4369 {
4370 desc: "MTS android_test_apps targeting current should be upgraded to 10000",
4371 moduleType: android_test,
4372 targetSdkVersionInBp: "current",
4373 targetSdkVersionExpected: "10000",
4374 testSuites: "mts-suite",
4375 },
4376 {
4377 desc: "MTS android_test_helper_apps targeting current should be upgraded to 10000",
4378 moduleType: android_test_helper_app,
4379 targetSdkVersionInBp: "current",
4380 targetSdkVersionExpected: "10000",
4381 testSuites: "mts-suite",
4382 },
4383 }
4384 fixture := android.GroupFixturePreparers(
4385 prepareForJavaTest,
4386 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4387 variables.Platform_sdk_codename = &platformSdkCodename
4388 variables.Platform_version_active_codenames = []string{platformSdkCodename}
4389 }),
4390 )
4391 for _, testCase := range testCases {
Colin Cross844cb6a2025-01-29 15:53:21 -08004392 t.Run(testCase.desc, func(t *testing.T) {
4393 t.Parallel()
4394 result := fixture.RunTestWithBp(t, fmt.Sprintf(bpTemplate, testCase.moduleType, testCase.targetSdkVersionInBp, testCase.testSuites))
Colin Cross90607e92025-02-11 14:58:07 -08004395 mytest := result.ModuleForTests(t, "mytest", "android_common")
Colin Cross844cb6a2025-01-29 15:53:21 -08004396 manifestFixerArgs := mytest.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4397 android.AssertStringDoesContain(t, testCase.desc, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4398 })
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004399 }
4400}
Andrei Onea580636b2022-08-17 16:53:46 +00004401
4402func TestPrivappAllowlist(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004403 t.Parallel()
Andrei Onea580636b2022-08-17 16:53:46 +00004404 testJavaError(t, "privileged must be set in order to use privapp_allowlist", `
4405 android_app {
4406 name: "foo",
4407 srcs: ["a.java"],
4408 privapp_allowlist: "perms.xml",
4409 }
4410 `)
4411
4412 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
4413 t,
4414 `
4415 android_app {
4416 name: "foo",
4417 srcs: ["a.java"],
Sam Delmerico15809f82023-05-15 17:21:47 -04004418 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
Andrei Onea580636b2022-08-17 16:53:46 +00004419 privileged: true,
Andrei Onea580636b2022-08-17 16:53:46 +00004420 sdk_version: "current",
4421 }
4422 override_android_app {
4423 name: "bar",
4424 base: "foo",
4425 package_name: "com.google.android.foo",
4426 }
4427 `,
4428 )
Colin Cross90607e92025-02-11 14:58:07 -08004429 app := result.ModuleForTests(t, "foo", "android_common")
4430 overrideApp := result.ModuleForTests(t, "foo", "android_common_bar")
Andrei Onea580636b2022-08-17 16:53:46 +00004431
Sam Delmerico15809f82023-05-15 17:21:47 -04004432 // verify that privapp allowlist is created for override apps
Andrei Onea580636b2022-08-17 16:53:46 +00004433 overrideApp.Output("out/soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml")
Sam Delmerico15809f82023-05-15 17:21:47 -04004434 expectedAllowlistInput := "privapp_allowlist_com.android.foo.xml"
4435 overrideActualAllowlistInput := overrideApp.Rule("modifyAllowlist").Input.String()
4436 if expectedAllowlistInput != overrideActualAllowlistInput {
4437 t.Errorf("expected override allowlist to be %q; got %q", expectedAllowlistInput, overrideActualAllowlistInput)
Andrei Onea580636b2022-08-17 16:53:46 +00004438 }
4439
4440 // verify that permissions are copied to device
Cole Faust6b7075f2024-12-17 10:42:42 -08004441 app.Output("out/target/product/test_device/system/etc/permissions/foo.xml")
4442 overrideApp.Output("out/target/product/test_device/system/etc/permissions/bar.xml")
Andrei Onea580636b2022-08-17 16:53:46 +00004443}
Sam Delmericob1daccd2023-05-25 14:45:30 -04004444
4445func TestPrivappAllowlistAndroidMk(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004446 t.Parallel()
Sam Delmericob1daccd2023-05-25 14:45:30 -04004447 result := android.GroupFixturePreparers(
4448 PrepareForTestWithJavaDefaultModules,
4449 android.PrepareForTestWithAndroidMk,
4450 ).RunTestWithBp(
4451 t,
4452 `
4453 android_app {
4454 name: "foo",
4455 srcs: ["a.java"],
4456 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
4457 privileged: true,
4458 sdk_version: "current",
4459 }
4460 override_android_app {
4461 name: "bar",
4462 base: "foo",
4463 package_name: "com.google.android.foo",
4464 }
4465 `,
4466 )
Colin Cross90607e92025-02-11 14:58:07 -08004467 baseApp := result.ModuleForTests(t, "foo", "android_common")
4468 overrideApp := result.ModuleForTests(t, "foo", "android_common_bar")
Sam Delmericob1daccd2023-05-25 14:45:30 -04004469
4470 baseAndroidApp := baseApp.Module().(*AndroidApp)
4471 baseEntries := android.AndroidMkEntriesForTest(t, result.TestContext, baseAndroidApp)[0]
4472 android.AssertStringMatches(
4473 t,
4474 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find foo.apk",
4475 baseEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4476 "\\S+foo.apk",
4477 )
4478 android.AssertStringMatches(
4479 t,
4480 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include foo.apk",
4481 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4482 "\\S+foo.apk",
4483 )
4484 android.AssertStringMatches(
4485 t,
4486 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4487 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4488 "\\S+foo.apk:\\S+/target/product/test_device/system/priv-app/foo/foo.apk",
4489 )
4490 android.AssertStringMatches(
4491 t,
4492 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4493 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004494 "privapp_allowlist_com.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/foo.xml",
Sam Delmericob1daccd2023-05-25 14:45:30 -04004495 )
4496
4497 overrideAndroidApp := overrideApp.Module().(*AndroidApp)
4498 overrideEntries := android.AndroidMkEntriesForTest(t, result.TestContext, overrideAndroidApp)[0]
4499 android.AssertStringMatches(
4500 t,
4501 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find bar.apk",
4502 overrideEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4503 "\\S+bar.apk",
4504 )
4505 android.AssertStringMatches(
4506 t,
4507 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include bar.apk",
4508 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4509 "\\S+bar.apk",
4510 )
4511 android.AssertStringMatches(
4512 t,
4513 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4514 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4515 "\\S+bar.apk:\\S+/target/product/test_device/system/priv-app/bar/bar.apk",
4516 )
4517 android.AssertStringMatches(
4518 t,
4519 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4520 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004521 "\\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 -04004522 )
4523}
Sam Delmerico0e0d96e2023-08-18 22:43:28 +00004524
Jihoon Kang84b25892023-12-01 22:01:06 +00004525func TestAppFlagsPackages(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004526 t.Parallel()
Jihoon Kang98ea8362024-07-16 18:20:03 +00004527 ctx := android.GroupFixturePreparers(
4528 prepareForJavaTest,
4529 android.FixtureMergeMockFs(
4530 map[string][]byte{
4531 "res/layout/layout.xml": nil,
4532 "res/values/strings.xml": nil,
4533 "res/values-en-rUS/strings.xml": nil,
4534 },
4535 ),
4536 ).RunTestWithBp(t, `
Jihoon Kang84b25892023-12-01 22:01:06 +00004537 android_app {
4538 name: "foo",
4539 srcs: ["a.java"],
4540 sdk_version: "current",
4541 flags_packages: [
4542 "bar",
4543 "baz",
4544 ],
4545 }
4546 aconfig_declarations {
4547 name: "bar",
Dennis Shen4e7773d2024-01-05 19:06:50 +00004548 package: "com.example.package.bar",
Yu Liu315a53c2024-04-24 16:41:57 +00004549 container: "com.android.foo",
Jihoon Kang84b25892023-12-01 22:01:06 +00004550 srcs: [
4551 "bar.aconfig",
4552 ],
4553 }
4554 aconfig_declarations {
4555 name: "baz",
Dennis Shen4e7773d2024-01-05 19:06:50 +00004556 package: "com.example.package.baz",
Yu Liu315a53c2024-04-24 16:41:57 +00004557 container: "com.android.foo",
Jihoon Kang84b25892023-12-01 22:01:06 +00004558 srcs: [
4559 "baz.aconfig",
4560 ],
4561 }
4562 `)
4563
Colin Cross90607e92025-02-11 14:58:07 -08004564 foo := ctx.ModuleForTests(t, "foo", "android_common")
Jihoon Kang84b25892023-12-01 22:01:06 +00004565
4566 // android_app module depends on aconfig_declarations listed in flags_packages
4567 android.AssertBoolEquals(t, "foo expected to depend on bar", true,
Jihoon Kang98ea8362024-07-16 18:20:03 +00004568 CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "bar"))
Jihoon Kang84b25892023-12-01 22:01:06 +00004569
4570 android.AssertBoolEquals(t, "foo expected to depend on baz", true,
Jihoon Kang98ea8362024-07-16 18:20:03 +00004571 CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "baz"))
Jihoon Kang84b25892023-12-01 22:01:06 +00004572
4573 aapt2LinkRule := foo.Rule("android/soong/java.aapt2Link")
4574 linkInFlags := aapt2LinkRule.Args["inFlags"]
4575 android.AssertStringDoesContain(t,
4576 "aapt2 link command expected to pass feature flags arguments",
4577 linkInFlags,
4578 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4579 )
Jihoon Kang98ea8362024-07-16 18:20:03 +00004580
4581 aapt2CompileRule := foo.Rule("android/soong/java.aapt2Compile")
4582 compileFlags := aapt2CompileRule.Args["cFlags"]
4583 android.AssertStringDoesContain(t,
4584 "aapt2 compile command expected to pass feature flags arguments",
4585 compileFlags,
4586 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4587 )
Jihoon Kang84b25892023-12-01 22:01:06 +00004588}
Spandan Das0727ba72024-02-13 16:37:43 +00004589
Jihoon Kang9aef7772024-06-14 23:45:06 +00004590func TestAppFlagsPackagesPropagation(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004591 t.Parallel()
Jihoon Kang9aef7772024-06-14 23:45:06 +00004592 ctx := testApp(t, `
4593 aconfig_declarations {
4594 name: "foo",
4595 package: "com.example.package.foo",
4596 container: "com.android.foo",
4597 srcs: [
4598 "foo.aconfig",
4599 ],
4600 }
4601 aconfig_declarations {
4602 name: "bar",
4603 package: "com.example.package.bar",
4604 container: "com.android.bar",
4605 srcs: [
4606 "bar.aconfig",
4607 ],
4608 }
4609 aconfig_declarations {
4610 name: "baz",
4611 package: "com.example.package.baz",
4612 container: "com.android.baz",
4613 srcs: [
4614 "baz.aconfig",
4615 ],
4616 }
4617 android_library {
4618 name: "foo_lib",
4619 srcs: ["a.java"],
4620 sdk_version: "current",
4621 flags_packages: [
4622 "foo",
4623 ],
4624 }
4625 android_library {
4626 name: "bar_lib",
4627 srcs: ["a.java"],
4628 sdk_version: "current",
4629 flags_packages: [
4630 "bar",
4631 ],
4632 }
4633 android_app {
4634 name: "baz_app",
4635 srcs: ["a.java"],
4636 sdk_version: "current",
4637 flags_packages: [
4638 "baz",
4639 ],
4640 static_libs: [
4641 "bar_lib",
4642 ],
4643 libs: [
4644 "foo_lib",
4645 ],
4646 }
4647 `)
4648
Colin Cross90607e92025-02-11 14:58:07 -08004649 bazApp := ctx.ModuleForTests(t, "baz_app", "android_common")
Jihoon Kang9aef7772024-06-14 23:45:06 +00004650
4651 // android_app module depends on aconfig_declarations listed in flags_packages
4652 // and that of static libs, but not libs
4653 aapt2LinkRule := bazApp.Rule("android/soong/java.aapt2Link")
4654 linkInFlags := aapt2LinkRule.Args["inFlags"]
4655 android.AssertStringDoesContain(t,
4656 "aapt2 link command expected to pass feature flags arguments of flags_packages and that of its static libs",
4657 linkInFlags,
4658 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4659 )
4660 android.AssertStringDoesNotContain(t,
4661 "aapt2 link command expected to not pass feature flags arguments of flags_packages of its libs",
4662 linkInFlags,
4663 "--feature-flags @out/soong/.intermediates/foo/intermediate.txt",
4664 )
4665}
4666
Spandan Das0727ba72024-02-13 16:37:43 +00004667// Test that dexpreopt is disabled if an optional_uses_libs exists, but does not provide an implementation.
4668func TestNoDexpreoptOptionalUsesLibDoesNotHaveImpl(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004669 t.Parallel()
Spandan Das0727ba72024-02-13 16:37:43 +00004670 bp := `
4671 java_sdk_library_import {
4672 name: "sdklib_noimpl",
4673 public: {
4674 jars: ["stub.jar"],
4675 },
4676 }
4677 android_app {
4678 name: "app",
4679 srcs: ["a.java"],
4680 sdk_version: "current",
4681 optional_uses_libs: [
4682 "sdklib_noimpl",
4683 ],
4684 }
4685 `
4686 result := prepareForJavaTest.RunTestWithBp(t, bp)
Colin Cross90607e92025-02-11 14:58:07 -08004687 dexpreopt := result.ModuleForTests(t, "app", "android_common").MaybeRule("dexpreopt").Rule
Spandan Das0727ba72024-02-13 16:37:43 +00004688 android.AssertBoolEquals(t, "dexpreopt should be disabled if optional_uses_libs does not have an implementation", true, dexpreopt == nil)
4689}
yangbill2af0b6e2024-03-15 09:29:29 +00004690
Ronald Braunsteincdc66f42024-04-12 11:23:19 -07004691func TestTestOnlyApp(t *testing.T) {
4692 t.Parallel()
4693 ctx := android.GroupFixturePreparers(
4694 prepareForJavaTest,
4695 ).RunTestWithBp(t, `
4696 // These should be test-only
4697 android_test {
4698 name: "android-test",
4699 }
4700 android_test_helper_app {
4701 name: "helper-app",
4702 }
4703 override_android_test {
4704 name: "override-test",
4705 base: "android-app",
4706 }
4707 // And these should not be
4708 android_app {
4709 name: "android-app",
4710 srcs: ["b.java"],
4711 sdk_version: "current",
4712 }
4713 `)
4714
4715 expectedTestOnly := []string{
4716 "android-test",
4717 "helper-app",
4718 "override-test",
4719 }
4720
4721 expectedTopLevel := []string{
4722 "android-test",
4723 "override-test",
4724 }
4725
4726 assertTestOnlyAndTopLevel(t, ctx, expectedTestOnly, expectedTopLevel)
4727}
4728
Jiyong Parkf528b702024-12-30 16:01:58 +09004729func TestTestConfigTemplate(t *testing.T) {
4730 t.Parallel()
4731 ctx := android.GroupFixturePreparers(
4732 prepareForJavaTest,
4733 ).RunTestWithBp(t, `
4734 android_test {
4735 name: "android-test",
4736 test_config_template: "AndroidTestTemplate.xml",
4737 test_options: {
4738 tradefed_options: [
4739 {
4740 name: "name1",
4741 key: "key1",
4742 value: "value1",
4743 },
4744 {
4745 name: "name2",
4746 key: "key2",
4747 value: "value2",
4748 },
4749 ],
4750 test_runner_options: [
4751 {
4752 name: "name3",
4753 key: "key3",
4754 value: "value3",
4755 },
4756 {
4757 name: "name4",
4758 key: "key4",
4759 value: "value4",
4760 },
4761 ],
4762 },
4763 }
4764 `)
4765 type option struct {
4766 name string
4767 key string
4768 value string
4769 }
4770 re := regexp.MustCompile(`<option name="(.*)" key="(.*)" value="(.*)" />`)
4771 parse_options := func(optionsString string) []option {
4772 lines := strings.Split(optionsString, `\n`)
4773 var ret []option
4774 for _, l := range lines {
4775 sm := re.FindStringSubmatch(l)
4776 if sm == nil {
4777 continue
4778 }
4779 ret = append(ret, option{sm[1], sm[2], sm[3]})
4780 }
4781 return ret
4782 }
Colin Cross90607e92025-02-11 14:58:07 -08004783 rule := ctx.ModuleForTests(t, "android-test", "android_common").Rule("autogenInstrumentationTest")
Jiyong Parkf528b702024-12-30 16:01:58 +09004784 android.AssertSameArray(t, "extraConfigs mismatch",
4785 []option{
4786 {"name1", "key1", "value1"},
4787 {"name2", "key2", "value2"},
4788 },
4789 parse_options(rule.Args["extraConfigs"]))
4790 android.AssertSameArray(t, "extraTestRunnerConfigs mismatch",
4791 []option{
4792 {"name3", "key3", "value3"},
4793 {"name4", "key4", "value4"},
4794 },
4795 parse_options(rule.Args["extraTestRunnerConfigs"]))
4796}
4797
yangbill2af0b6e2024-03-15 09:29:29 +00004798func TestAppStem(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004799 t.Parallel()
yangbill2af0b6e2024-03-15 09:29:29 +00004800 ctx := testApp(t, `
4801 android_app {
4802 name: "foo",
4803 srcs: ["a.java"],
4804 stem: "foo-new",
4805 sdk_version: "current",
4806 }`)
4807
Colin Cross90607e92025-02-11 14:58:07 -08004808 foo := ctx.ModuleForTests(t, "foo", "android_common")
yangbill2af0b6e2024-03-15 09:29:29 +00004809
4810 outputs := fmt.Sprint(foo.AllOutputs())
4811 if !strings.Contains(outputs, "foo-new.apk") {
4812 t.Errorf("Module output does not contain expected apk %s", "foo-new.apk")
4813 }
4814}
Spandan Dasb9c58352024-05-13 18:29:45 +00004815
4816func TestAppMinSdkVersionOverride(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004817 t.Parallel()
Spandan Dasb9c58352024-05-13 18:29:45 +00004818 result := android.GroupFixturePreparers(
4819 PrepareForTestWithJavaDefaultModules,
4820 ).RunTestWithBp(t, `
4821 android_app {
4822 name: "com.android.foo",
4823 srcs: ["a.java"],
4824 sdk_version: "current",
4825 min_sdk_version: "31",
4826 updatable: true,
4827 }
4828 override_android_app {
4829 name: "com.android.go.foo",
4830 base: "com.android.foo",
4831 min_sdk_version: "33",
4832 }
4833 `)
Colin Cross90607e92025-02-11 14:58:07 -08004834 foo := result.ModuleForTests(t, "com.android.foo", "android_common").Rule("manifestFixer")
4835 fooOverride := result.ModuleForTests(t, "com.android.foo", "android_common_com.android.go.foo").Rule("manifestFixer")
Spandan Dasb9c58352024-05-13 18:29:45 +00004836
4837 android.AssertStringDoesContain(t,
4838 "com.android.foo: expected manifest fixer to set minSdkVersion to T",
4839 foo.BuildParams.Args["args"],
4840 "--minSdkVersion 31",
4841 )
4842 android.AssertStringDoesContain(t,
4843 "com.android.go.foo: expected manifest fixer to set minSdkVersion to T",
4844 fooOverride.BuildParams.Args["args"],
4845 "--minSdkVersion 33",
4846 )
4847
4848}
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +00004849
4850func TestNotApplyDefaultUpdatableModuleVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004851 t.Parallel()
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +00004852 result := android.GroupFixturePreparers(
4853 PrepareForTestWithJavaDefaultModules,
4854 ).RunTestWithBp(t, `
4855 android_app {
4856 name: "com.android.foo",
4857 srcs: ["a.java"],
4858 sdk_version: "current",
4859 min_sdk_version: "31",
4860 }
4861 `)
Colin Cross90607e92025-02-11 14:58:07 -08004862 foo := result.ModuleForTests(t, "com.android.foo", "android_common").Rule("manifestFixer")
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +00004863 android.AssertStringDoesNotContain(t,
4864 "com.android.foo: expected manifest fixer to not set override-placeholder-version",
4865 foo.BuildParams.Args["args"],
4866 "--override-placeholder-version",
4867 )
4868}
4869
4870func TestNotApplyOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004871 t.Parallel()
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +00004872 result := android.GroupFixturePreparers(
4873 PrepareForTestWithJavaDefaultModules,
4874 android.FixtureMergeEnv(map[string]string{
4875 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4876 }),
4877 ).RunTestWithBp(t, `
4878 android_app {
4879 name: "com.android.foo",
4880 srcs: ["a.java"],
4881 sdk_version: "current",
4882 min_sdk_version: "31",
4883 }
4884 `)
Colin Cross90607e92025-02-11 14:58:07 -08004885 foo := result.ModuleForTests(t, "com.android.foo", "android_common").Rule("manifestFixer")
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +00004886 android.AssertStringDoesNotContain(t,
4887 "com.android.foo: expected manifest fixer to not set override-placeholder-version",
4888 foo.BuildParams.Args["args"],
4889 "--override-placeholder-version",
4890 )
4891}
Jihoon Kang1c743042024-10-22 21:34:17 +00004892
4893func TestResourcesWithFlagDirectories(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004894 t.Parallel()
Jihoon Kang1c743042024-10-22 21:34:17 +00004895 result := android.GroupFixturePreparers(
4896 PrepareForTestWithJavaDefaultModules,
4897 android.FixtureMergeMockFs(android.MockFS{
4898 "res/flag(test.package.flag1)/values/bools.xml": nil,
4899 "res/flag(!test.package.flag2)/values/bools.xml": nil,
4900 "res/flag(test.package.flag1)/values-config/strings_google_services.xml": nil,
4901 "res/flags(test.package.flag1)/values/strings.xml": nil,
4902 }),
4903 ).RunTestWithBp(t, `
4904 android_library {
4905 name: "foo",
4906 srcs: ["a.java"],
4907 use_resource_processor: true,
4908 resource_dirs: [
4909 "res",
4910 ],
4911 }
4912 `)
Colin Cross90607e92025-02-11 14:58:07 -08004913 fooModule := result.ModuleForTests(t, "foo", "android_common")
Jihoon Kang1c743042024-10-22 21:34:17 +00004914 compileOutputPaths := fooModule.Rule("aapt2Compile").Outputs.Strings()
4915
4916 android.AssertStringListContains(
4917 t,
4918 "Expected to generate flag path",
4919 compileOutputPaths,
4920 "out/soong/.intermediates/foo/android_common/aapt2/res/values_bools.(test.package.flag1).arsc.flat",
4921 )
4922 android.AssertStringListContains(
4923 t,
4924 "Expected to generate flag path with ! prefix in name",
4925 compileOutputPaths,
4926 "out/soong/.intermediates/foo/android_common/aapt2/res/values_bools.(!test.package.flag2).arsc.flat",
4927 )
4928 android.AssertStringListContains(
4929 t,
4930 "Expected to generate flag path with configs",
4931 compileOutputPaths,
4932 "out/soong/.intermediates/foo/android_common/aapt2/res/values-config_strings_google_services.(test.package.flag1).arsc.flat",
4933 )
4934 android.AssertStringListDoesNotContain(
4935 t,
4936 "Expected to not generate flag path with non-flag(flag_name) pattern",
4937 compileOutputPaths,
4938 "out/soong/.intermediates/foo/android_common/aapt2/res/values_strings.(test.package.flag1).arsc.flat",
4939 )
4940}
Spandan Dasde588a32024-12-03 22:52:24 +00004941
4942func TestAutogeneratedStaticRro(t *testing.T) {
4943 t.Parallel()
4944 bp := `
4945android_app {
4946 name: "foo",
4947 srcs: ["foo.java"],
4948 platform_apis: true,
4949}
4950override_android_app {
4951 name: "override_foo",
4952 base: "foo",
4953}
4954`
4955 testCases := []struct {
4956 desc string
4957 preparer android.FixturePreparer
4958 overlayApkExpected bool
4959 }{
4960 {
4961 desc: "No DEVICE_PACKAGE_OVERLAYS, no overlay .apk file",
4962 overlayApkExpected: false,
4963 },
4964 {
4965 desc: "DEVICE_PACKAGE_OVERLAYS exists, but the directory is empty",
4966 overlayApkExpected: false,
4967 preparer: android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4968 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4969 }),
4970 },
4971 {
4972 desc: "DEVICE_PACKAGE_OVERLAYS exists, directory is non-empty, but does not contain a matching resource dir",
4973 overlayApkExpected: false,
4974 preparer: android.GroupFixturePreparers(
4975 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4976 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4977 }),
4978 android.MockFS{
4979 "res/foo.xml": nil,
4980 "device/company/test_product/different_res/foo.xml": nil, // different dir
4981 }.AddToFixture(),
4982 ),
4983 },
4984 {
4985 desc: "DEVICE_PACKAGE_OVERLAYS and the directory contain a matching resource dir",
4986 overlayApkExpected: true,
4987 preparer: android.GroupFixturePreparers(
4988 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4989 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4990 }),
4991 android.MockFS{
4992 "res/foo.xml": nil,
4993 "device/company/test_product/res/foo.xml": nil,
4994 }.AddToFixture(),
4995 ),
4996 },
4997 }
4998 for _, tc := range testCases {
Colin Cross844cb6a2025-01-29 15:53:21 -08004999 t.Run(tc.desc, func(t *testing.T) {
5000 t.Parallel()
5001 result := android.GroupFixturePreparers(
5002 PrepareForTestWithJavaDefaultModules,
5003 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5004 variables.EnforceRROTargets = []string{"*"}
5005 }),
5006 android.OptionalFixturePreparer(tc.preparer),
5007 ).RunTestWithBp(t, bp)
Colin Cross90607e92025-02-11 14:58:07 -08005008 vendorOverlayApk := result.ModuleForTests(t, "foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").MaybeOutput("foo__test_product__auto_generated_rro_vendor.apk")
Colin Cross844cb6a2025-01-29 15:53:21 -08005009 android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, vendorOverlayApk.Rule != nil)
Colin Cross90607e92025-02-11 14:58:07 -08005010 overrideVendorOverlayApk := result.ModuleForTests(t, "override_foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").MaybeOutput("override_foo__test_product__auto_generated_rro_vendor.apk")
Colin Cross844cb6a2025-01-29 15:53:21 -08005011 android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, overrideVendorOverlayApk.Rule != nil)
5012 })
Spandan Dasde588a32024-12-03 22:52:24 +00005013 }
5014}
Spandan Dasef8b3b22024-12-04 01:34:34 +00005015
5016func TestNoAutogeneratedStaticRroForDisabledOverrideApps(t *testing.T) {
5017 t.Parallel()
5018 bp := `
5019soong_config_module_type {
5020 name: "my_custom_override_android_app",
5021 module_type: "override_android_app",
5022 config_namespace: "my_namespace",
5023 value_variables: ["my_app_enabled"],
5024 properties: ["enabled"],
5025}
5026soong_config_bool_variable {
5027 name: "my_app_enabled",
5028}
5029android_app {
5030 name: "foo",
5031 srcs: ["foo.java"],
5032 platform_apis: true,
5033}
5034my_custom_override_android_app {
5035 name: "override_foo",
5036 base: "foo",
5037 soong_config_variables: {
5038 my_app_enabled: {
5039 enabled: true,
5040 conditions_default: {
5041 enabled: false
5042 },
5043 },
5044 }
5045}
5046`
5047 testCases := []struct {
5048 desc string
5049 preparer android.FixturePreparer
5050 overlayApkExpected bool
5051 }{
5052 {
5053 desc: "my_app_enabled is empty",
5054 overlayApkExpected: false,
5055 },
5056 {
5057 desc: "my_app_enabled is true",
5058 overlayApkExpected: true,
5059 preparer: android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5060 variables.VendorVars = map[string]map[string]string{
5061 "my_namespace": {
5062 "my_app_enabled": "true",
5063 },
5064 }
5065 }),
5066 },
5067 }
5068 for _, tc := range testCases {
Colin Cross844cb6a2025-01-29 15:53:21 -08005069 t.Run(tc.desc, func(t *testing.T) {
5070 t.Parallel()
5071 result := android.GroupFixturePreparers(
5072 PrepareForTestWithJavaDefaultModules,
5073 android.PrepareForTestWithSoongConfigModuleBuildComponents,
5074 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5075 variables.EnforceRROTargets = []string{"*"}
5076 }),
5077 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5078 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
5079 }),
5080 android.MockFS{
5081 "res/foo.xml": nil,
5082 "device/company/test_product/res/foo.xml": nil,
5083 }.AddToFixture(),
5084 android.OptionalFixturePreparer(tc.preparer),
5085 ).RunTestWithBp(t, bp)
Colin Cross90607e92025-02-11 14:58:07 -08005086 overrideVendorOverlayApk := result.ModuleForTests(t, "override_foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").Module().(*AutogenRuntimeResourceOverlay)
Colin Cross844cb6a2025-01-29 15:53:21 -08005087 android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, overrideVendorOverlayApk.exportPackage != nil)
5088 })
Spandan Dasef8b3b22024-12-04 01:34:34 +00005089 }
5090}