blob: c6b22c7a5c0aa0c77a3c109c8cf7de969491d8e3 [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")
micky387867c6af2025-06-17 17:40:05 -040083 omniromRes := result.ModuleForTests(t,"omnirom-res", "android_common")
Colin Crossa97c5d32018-03-28 14:58:31 -070084 expectedLinkImplicits = append(expectedLinkImplicits,
85 frameworkRes.Output("package-res.apk").Output.String())
Rashed Abdel-Tawab5b948ab2018-08-09 14:08:53 -070086 expectedLinkImplicits = append(expectedLinkImplicits,
87 omniromRes.Output("package-res.apk").Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080088
Colin Crossa97c5d32018-03-28 14:58:31 -070089 // Test the mapping from input files to compiled output file names
90 compile := foo.Output(compiledResourceFiles[0])
Paul Duffin0ed42d32021-03-13 02:19:32 +000091 android.AssertDeepEquals(t, "aapt2 compile inputs", resourceFiles, compile.Inputs.Strings())
Colin Crossb69301e2017-12-01 10:48:26 -080092
Colin Crossa97c5d32018-03-28 14:58:31 -070093 compiledResourceOutputs := compile.Outputs.Strings()
94 sort.Strings(compiledResourceOutputs)
Colin Crossb69301e2017-12-01 10:48:26 -080095
Colin Crossa97c5d32018-03-28 14:58:31 -070096 expectedLinkImplicits = append(expectedLinkImplicits, compiledResourceOutputs...)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080097
Colin Crossa97c5d32018-03-28 14:58:31 -070098 list := foo.Output("aapt2/res.list")
99 expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800100
Colin Crossa97c5d32018-03-28 14:58:31 -0700101 // Check that the link rule uses
Colin Cross90607e92025-02-11 14:58:07 -0800102 res := result.ModuleForTests(t, "foo", "android_common").Output("package-res.apk")
Paul Duffin0ed42d32021-03-13 02:19:32 +0000103 android.AssertDeepEquals(t, "aapt2 link implicits", expectedLinkImplicits, res.Implicits.Strings())
Colin Crossa97c5d32018-03-28 14:58:31 -0700104 })
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800105 }
106}
Colin Cross890ff552017-11-30 20:13:19 -0800107
Colin Crosse560c4a2019-03-19 16:03:11 -0700108func TestAppSplits(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800109 t.Parallel()
Colin Crosse560c4a2019-03-19 16:03:11 -0700110 ctx := testApp(t, `
111 android_app {
112 name: "foo",
113 srcs: ["a.java"],
114 package_splits: ["v4", "v7,hdpi"],
Jeongik Cha538c0d02019-07-11 15:54:27 +0900115 sdk_version: "current"
Colin Crosse560c4a2019-03-19 16:03:11 -0700116 }`)
117
Colin Cross90607e92025-02-11 14:58:07 -0800118 foo := ctx.ModuleForTests(t, "foo", "android_common")
Colin Crosse560c4a2019-03-19 16:03:11 -0700119
120 expectedOutputs := []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000121 "out/soong/.intermediates/foo/android_common/foo.apk",
122 "out/soong/.intermediates/foo/android_common/foo_v4.apk",
123 "out/soong/.intermediates/foo/android_common/foo_v7_hdpi.apk",
Colin Crosse560c4a2019-03-19 16:03:11 -0700124 }
125 for _, expectedOutput := range expectedOutputs {
126 foo.Output(expectedOutput)
127 }
128
Yu Liu51c22312024-08-20 23:56:15 +0000129 outputFiles := foo.OutputFiles(ctx, t, "")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000130 android.AssertPathsRelativeToTopEquals(t, `OutputFiles("")`, expectedOutputs, outputFiles)
Colin Crosse560c4a2019-03-19 16:03:11 -0700131}
132
Jeongik Cha538c0d02019-07-11 15:54:27 +0900133func TestPlatformAPIs(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800134 t.Parallel()
Jeongik Cha538c0d02019-07-11 15:54:27 +0900135 testJava(t, `
136 android_app {
137 name: "foo",
138 srcs: ["a.java"],
139 platform_apis: true,
140 }
141 `)
142
143 testJava(t, `
144 android_app {
145 name: "foo",
146 srcs: ["a.java"],
147 sdk_version: "current",
148 }
149 `)
150
Spandan Das60999342021-11-16 04:15:33 +0000151 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 +0900152 android_app {
153 name: "bar",
154 srcs: ["b.java"],
155 }
156 `)
157
Spandan Das60999342021-11-16 04:15:33 +0000158 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 +0900159 android_app {
160 name: "bar",
161 srcs: ["b.java"],
162 sdk_version: "system_current",
163 platform_apis: true,
164 }
165 `)
166}
167
Jeongik Chae403e9e2019-12-07 00:16:24 +0900168func TestAndroidAppLinkType(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800169 t.Parallel()
Jeongik Chae403e9e2019-12-07 00:16:24 +0900170 testJava(t, `
171 android_app {
172 name: "foo",
173 srcs: ["a.java"],
174 libs: ["bar"],
175 static_libs: ["baz"],
176 platform_apis: true,
177 }
178
179 java_library {
180 name: "bar",
181 sdk_version: "current",
182 srcs: ["b.java"],
183 }
184
185 android_library {
186 name: "baz",
187 sdk_version: "system_current",
188 srcs: ["c.java"],
189 }
190 `)
191
Steven Moreland00298982020-11-17 21:44:36 +0000192 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900193 android_app {
194 name: "foo",
195 srcs: ["a.java"],
196 libs: ["bar"],
197 sdk_version: "current",
198 static_libs: ["baz"],
199 }
200
201 java_library {
202 name: "bar",
203 sdk_version: "current",
204 srcs: ["b.java"],
205 }
206
207 android_library {
208 name: "baz",
209 sdk_version: "system_current",
210 srcs: ["c.java"],
211 }
212 `)
213
214 testJava(t, `
215 android_app {
216 name: "foo",
217 srcs: ["a.java"],
218 libs: ["bar"],
219 sdk_version: "system_current",
220 static_libs: ["baz"],
221 }
222
223 java_library {
224 name: "bar",
225 sdk_version: "current",
226 srcs: ["b.java"],
227 }
228
229 android_library {
230 name: "baz",
231 sdk_version: "system_current",
232 srcs: ["c.java"],
233 }
234 `)
235
Steven Moreland00298982020-11-17 21:44:36 +0000236 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900237 android_app {
238 name: "foo",
239 srcs: ["a.java"],
240 libs: ["bar"],
241 sdk_version: "system_current",
242 static_libs: ["baz"],
243 }
244
245 java_library {
246 name: "bar",
247 sdk_version: "current",
248 srcs: ["b.java"],
249 }
250
251 android_library {
252 name: "baz",
253 srcs: ["c.java"],
254 }
255 `)
256}
257
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100258func TestUpdatableApps(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800259 t.Parallel()
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100260 testCases := []struct {
261 name string
262 bp string
263 expectedError string
264 }{
265 {
266 name: "Stable public SDK",
267 bp: `android_app {
268 name: "foo",
269 srcs: ["a.java"],
270 sdk_version: "29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100271 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100272 updatable: true,
273 }`,
274 },
275 {
276 name: "Stable system SDK",
277 bp: `android_app {
278 name: "foo",
279 srcs: ["a.java"],
280 sdk_version: "system_29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100281 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100282 updatable: true,
283 }`,
284 },
285 {
286 name: "Current public SDK",
287 bp: `android_app {
288 name: "foo",
289 srcs: ["a.java"],
290 sdk_version: "current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100291 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100292 updatable: true,
293 }`,
294 },
295 {
296 name: "Current system SDK",
297 bp: `android_app {
298 name: "foo",
299 srcs: ["a.java"],
300 sdk_version: "system_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100301 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100302 updatable: true,
303 }`,
304 },
305 {
306 name: "Current module SDK",
307 bp: `android_app {
308 name: "foo",
309 srcs: ["a.java"],
310 sdk_version: "module_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100311 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100312 updatable: true,
313 }`,
314 },
315 {
316 name: "Current core SDK",
317 bp: `android_app {
318 name: "foo",
319 srcs: ["a.java"],
320 sdk_version: "core_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100321 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100322 updatable: true,
323 }`,
324 },
325 {
326 name: "No Platform APIs",
327 bp: `android_app {
328 name: "foo",
329 srcs: ["a.java"],
330 platform_apis: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100331 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100332 updatable: true,
333 }`,
334 expectedError: "Updatable apps must use stable SDKs",
335 },
336 {
337 name: "No Core Platform APIs",
338 bp: `android_app {
339 name: "foo",
340 srcs: ["a.java"],
341 sdk_version: "core_platform",
Artur Satayevf40fc852020-04-16 13:43:02 +0100342 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100343 updatable: true,
344 }`,
345 expectedError: "Updatable apps must use stable SDKs",
346 },
347 {
348 name: "No unspecified APIs",
349 bp: `android_app {
350 name: "foo",
351 srcs: ["a.java"],
352 updatable: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100353 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100354 }`,
355 expectedError: "Updatable apps must use stable SDK",
356 },
Artur Satayevf40fc852020-04-16 13:43:02 +0100357 {
358 name: "Must specify min_sdk_version",
359 bp: `android_app {
360 name: "app_without_min_sdk_version",
361 srcs: ["a.java"],
362 sdk_version: "29",
363 updatable: true,
364 }`,
365 expectedError: "updatable apps must set min_sdk_version.",
366 },
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100367 }
368
369 for _, test := range testCases {
370 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800371 t.Parallel()
Paul Duffincdb88a92021-03-14 00:36:50 +0000372 errorHandler := android.FixtureExpectsNoErrors
373 if test.expectedError != "" {
374 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100375 }
Paul Duffin71ae5942021-03-22 15:36:52 +0000376 android.GroupFixturePreparers(
377 prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{
Paul Duffin2645a292021-03-13 02:36:00 +0000378 "29": {"foo"},
379 })).
Paul Duffincdb88a92021-03-14 00:36:50 +0000380 ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, test.bp)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100381 })
382 }
383}
384
Jooyung Han749dc692020-04-15 11:03:39 +0900385func TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800386 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +0900387 testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+`
388 android_app {
389 name: "foo",
390 srcs: ["a.java"],
391 updatable: true,
392 sdk_version: "current",
393 min_sdk_version: "29",
394 static_libs: ["bar"],
395 }
396
397 java_library {
398 name: "bar",
399 sdk_version: "current",
400 }
401 `)
402}
403
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900404func TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800405 t.Parallel()
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900406 testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
407 android_app {
408 name: "foo",
409 srcs: ["a.java"],
410 updatable: true,
411 sdk_version: "current",
412 min_sdk_version: "current",
413 jni_libs: ["libjni"],
414 }
415
416 cc_library {
417 name: "libjni",
418 stl: "none",
419 system_shared_libs: [],
420 sdk_version: "current",
421 }
422 `)
423}
424
425func TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800426 t.Parallel()
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900427 bp := cc.GatherRequiredDepsForTest(android.Android) + `
428 android_app {
429 name: "foo",
430 srcs: ["a.java"],
431 updatable: true,
432 sdk_version: "current",
433 min_sdk_version: "29",
434 jni_libs: ["libjni"],
435 }
436
437 cc_library {
438 name: "libjni",
439 stl: "none",
440 system_shared_libs: [],
Spandan Das2e8c0442022-05-08 00:39:35 +0000441 sdk_version: "current",
442 min_sdk_version: "29",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900443 }
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900444 `
445 fs := map[string][]byte{
446 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
447 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil,
448 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil,
449 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil,
450 }
451
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000452 ctx, _ := testJavaWithFS(t, bp, fs)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900453
Colin Cross90607e92025-02-11 14:58:07 -0800454 inputs := ctx.ModuleForTests(t, "libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900455 var crtbeginFound, crtendFound bool
Colin Cross90607e92025-02-11 14:58:07 -0800456 expectedCrtBegin := ctx.ModuleForTests(t, "crtbegin_so",
Colin Crossdea1d032022-12-06 14:50:08 -0800457 "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
Colin Cross90607e92025-02-11 14:58:07 -0800458 expectedCrtEnd := ctx.ModuleForTests(t, "crtend_so",
Colin Crossdea1d032022-12-06 14:50:08 -0800459 "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
Dan Albert92fe7402020-07-15 13:33:30 -0700460 implicits := []string{}
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900461 for _, input := range inputs {
Dan Albert92fe7402020-07-15 13:33:30 -0700462 implicits = append(implicits, input.String())
463 if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900464 crtbeginFound = true
Dan Albert92fe7402020-07-15 13:33:30 -0700465 } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900466 crtendFound = true
467 }
468 }
Dan Albert92fe7402020-07-15 13:33:30 -0700469 if !crtbeginFound {
470 t.Error(fmt.Sprintf(
471 "expected implicit with suffix %q, have the following implicits:\n%s",
472 expectedCrtBegin, strings.Join(implicits, "\n")))
473 }
474 if !crtendFound {
475 t.Error(fmt.Sprintf(
476 "expected implicit with suffix %q, have the following implicits:\n%s",
477 expectedCrtEnd, strings.Join(implicits, "\n")))
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900478 }
479}
480
481func TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800482 t.Parallel()
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900483 bp := cc.GatherRequiredDepsForTest(android.Android) + `
484 android_app {
485 name: "foo",
486 srcs: ["a.java"],
487 updatable: true,
488 sdk_version: "current",
489 min_sdk_version: "29", // this APK should support 29
490 jni_libs: ["libjni"],
491 }
492
493 cc_library {
494 name: "libjni",
495 stl: "none",
496 sdk_version: "current",
Spandan Das2e8c0442022-05-08 00:39:35 +0000497 min_sdk_version: "current",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900498 }
499 `
Spandan Das2e8c0442022-05-08 00:39:35 +0000500 testJavaError(t, `"libjni" .*: min_sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900501}
502
Spandan Das2e8c0442022-05-08 00:39:35 +0000503func TestUpdatableApps_ErrorIfDepMinSdkVersionIsHigher(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800504 t.Parallel()
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900505 bp := cc.GatherRequiredDepsForTest(android.Android) + `
506 android_app {
507 name: "foo",
508 srcs: ["a.java"],
509 updatable: true,
510 sdk_version: "current",
511 min_sdk_version: "29", // this APK should support 29
512 jni_libs: ["libjni"],
513 }
514
515 cc_library {
516 name: "libjni",
517 stl: "none",
518 shared_libs: ["libbar"],
519 system_shared_libs: [],
520 sdk_version: "27",
Spandan Das2e8c0442022-05-08 00:39:35 +0000521 min_sdk_version: "27",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900522 }
523
524 cc_library {
525 name: "libbar",
526 stl: "none",
527 system_shared_libs: [],
528 sdk_version: "current",
Spandan Das2e8c0442022-05-08 00:39:35 +0000529 min_sdk_version: "current",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900530 }
531 `
532 testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
533}
534
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +0000535func TestUpdatableApps_ApplyDefaultUpdatableModuleVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800536 t.Parallel()
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +0000537 result := android.GroupFixturePreparers(
538 PrepareForTestWithJavaDefaultModules,
539 ).RunTestWithBp(t, `
540 android_app {
541 name: "com.android.foo",
542 srcs: ["a.java"],
543 sdk_version: "current",
544 min_sdk_version: "31",
545 updatable: true,
546 }
547 `)
Colin Cross90607e92025-02-11 14:58:07 -0800548 foo := result.ModuleForTests(t, "com.android.foo", "android_common").Rule("manifestFixer")
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +0000549 android.AssertStringDoesContain(t,
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +0000550 "com.android.foo: expected manifest fixer to set override-placeholder-version to RELEASE_DEFAULT_UPDATABLE_MODULE_VERSION",
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +0000551 foo.BuildParams.Args["args"],
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +0000552 fmt.Sprintf("--override-placeholder-version %s", testDefaultUpdatableModuleVersion),
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +0000553 )
554}
555
556func TestUpdatableApps_ApplyOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800557 t.Parallel()
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +0000558 result := android.GroupFixturePreparers(
559 PrepareForTestWithJavaDefaultModules,
560 android.FixtureMergeEnv(map[string]string{
561 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
562 }),
563 ).RunTestWithBp(t, `
564 android_app {
565 name: "com.android.foo",
566 srcs: ["a.java"],
567 sdk_version: "current",
568 min_sdk_version: "31",
569 updatable: true,
570 }
571 `)
Colin Cross90607e92025-02-11 14:58:07 -0800572 foo := result.ModuleForTests(t, "com.android.foo", "android_common").Rule("manifestFixer")
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +0000573 android.AssertStringDoesContain(t,
574 "com.android.foo: expected manifest fixer to set override-placeholder-version to 1234",
575 foo.BuildParams.Args["args"],
576 "--override-placeholder-version 1234",
577 )
578}
579
Colin Cross0ddae7f2019-02-07 15:30:01 -0800580func TestResourceDirs(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800581 t.Parallel()
Colin Cross0ddae7f2019-02-07 15:30:01 -0800582 testCases := []struct {
583 name string
584 prop string
585 resources []string
586 }{
587 {
588 name: "no resource_dirs",
589 prop: "",
590 resources: []string{"res/res/values/strings.xml"},
591 },
592 {
593 name: "resource_dirs",
594 prop: `resource_dirs: ["res"]`,
595 resources: []string{"res/res/values/strings.xml"},
596 },
597 {
598 name: "empty resource_dirs",
599 prop: `resource_dirs: []`,
600 resources: nil,
601 },
602 }
603
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000604 fs := android.MockFS{
Colin Cross0ddae7f2019-02-07 15:30:01 -0800605 "res/res/values/strings.xml": nil,
606 }
607
608 bp := `
609 android_app {
610 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900611 sdk_version: "current",
Colin Cross0ddae7f2019-02-07 15:30:01 -0800612 %s
613 }
614 `
615
616 for _, testCase := range testCases {
617 t.Run(testCase.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800618 t.Parallel()
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000619 result := android.GroupFixturePreparers(
620 PrepareForTestWithJavaDefaultModules,
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000621 fs.AddToFixture(),
622 ).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop))
Colin Cross0ddae7f2019-02-07 15:30:01 -0800623
Colin Cross90607e92025-02-11 14:58:07 -0800624 module := result.ModuleForTests(t, "foo", "android_common")
Colin Cross0ddae7f2019-02-07 15:30:01 -0800625 resourceList := module.MaybeOutput("aapt2/res.list")
626
627 var resources []string
628 if resourceList.Rule != nil {
629 for _, compiledResource := range resourceList.Inputs.Strings() {
630 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
631 }
632 }
633
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000634 android.AssertDeepEquals(t, "resource files", testCase.resources, resources)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800635 })
636 }
637}
638
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800639func TestLibraryAssets(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800640 t.Parallel()
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800641 bp := `
642 android_app {
643 name: "foo",
644 sdk_version: "current",
645 static_libs: ["lib1", "lib2", "lib3"],
646 }
647
648 android_library {
649 name: "lib1",
650 sdk_version: "current",
651 asset_dirs: ["assets_a"],
652 }
653
654 android_library {
655 name: "lib2",
656 sdk_version: "current",
657 }
658
659 android_library {
660 name: "lib3",
661 sdk_version: "current",
Colin Crossab8d1382023-07-14 17:23:41 +0000662 static_libs: ["lib4", "import"],
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800663 }
664
665 android_library {
666 name: "lib4",
667 sdk_version: "current",
668 asset_dirs: ["assets_b"],
669 }
Colin Crossab8d1382023-07-14 17:23:41 +0000670
Jiakai Zhangba82e282023-10-13 18:08:59 +0100671 android_library {
672 name: "lib5",
673 sdk_version: "current",
674 assets: [
675 "path/to/asset_file_1",
676 "path/to/asset_file_2",
677 ],
678 }
679
Colin Crossab8d1382023-07-14 17:23:41 +0000680 android_library_import {
681 name: "import",
682 sdk_version: "current",
683 aars: ["import.aar"],
684 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800685 `
686
687 testCases := []struct {
Jiakai Zhangba82e282023-10-13 18:08:59 +0100688 name string
689 assetFlag string
690 assetPackages []string
691 tmpAssetDirInputs []string
692 tmpAssetDirOutputs []string
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800693 }{
694 {
695 name: "foo",
Colin Crossab8d1382023-07-14 17:23:41 +0000696 // lib1 has its own assets. lib3 doesn't have any, but lib4 and import have assets.
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800697 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000698 "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
699 "out/soong/.intermediates/lib1/android_common/assets.zip",
Colin Crossab8d1382023-07-14 17:23:41 +0000700 "out/soong/.intermediates/lib4/android_common/assets.zip",
701 "out/soong/.intermediates/import/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800702 },
703 },
704 {
705 name: "lib1",
706 assetFlag: "-A assets_a",
707 },
708 {
709 name: "lib2",
710 },
711 {
712 name: "lib3",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800713 },
714 {
715 name: "lib4",
716 assetFlag: "-A assets_b",
717 },
Jiakai Zhangba82e282023-10-13 18:08:59 +0100718 {
719 name: "lib5",
720 assetFlag: "-A out/soong/.intermediates/lib5/android_common/tmp_asset_dir",
721 tmpAssetDirInputs: []string{
722 "path/to/asset_file_1",
723 "path/to/asset_file_2",
724 },
725 tmpAssetDirOutputs: []string{
726 "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_1",
727 "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_2",
728 },
729 },
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800730 }
731 ctx := testApp(t, bp)
732
733 for _, test := range testCases {
734 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800735 t.Parallel()
Colin Cross90607e92025-02-11 14:58:07 -0800736 m := ctx.ModuleForTests(t, test.name, "android_common")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800737
738 // Check asset flag in aapt2 link flags
739 var aapt2link android.TestingBuildParams
740 if len(test.assetPackages) > 0 {
741 aapt2link = m.Output("aapt2/package-res.apk")
742 } else {
743 aapt2link = m.Output("package-res.apk")
744 }
Paul Duffina71a67a2021-03-29 00:42:57 +0100745 aapt2link = aapt2link
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800746 aapt2Flags := aapt2link.Args["flags"]
747 if test.assetFlag != "" {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000748 android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800749 } else {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000750 android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800751 }
752
753 // Check asset merge rule.
754 if len(test.assetPackages) > 0 {
755 mergeAssets := m.Output("package-res.apk")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000756 android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800757 }
Jiakai Zhangba82e282023-10-13 18:08:59 +0100758
759 if len(test.tmpAssetDirInputs) > 0 {
760 rule := m.Rule("tmp_asset_dir")
761 inputs := rule.Implicits
762 outputs := append(android.WritablePaths{rule.Output}, rule.ImplicitOutputs...).Paths()
763 android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir inputs", test.tmpAssetDirInputs, inputs)
764 android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir outputs", test.tmpAssetDirOutputs, outputs)
765 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800766 })
767 }
768}
769
Colin Crossb014f072021-02-26 14:54:36 -0800770func TestAppJavaResources(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800771 t.Parallel()
Colin Crossb014f072021-02-26 14:54:36 -0800772 bp := `
773 android_app {
774 name: "foo",
775 sdk_version: "current",
776 java_resources: ["resources/a"],
777 srcs: ["a.java"],
778 }
779
780 android_app {
781 name: "bar",
782 sdk_version: "current",
783 java_resources: ["resources/a"],
784 }
785 `
786
787 ctx := testApp(t, bp)
788
Colin Cross90607e92025-02-11 14:58:07 -0800789 foo := ctx.ModuleForTests(t, "foo", "android_common")
Colin Crossb014f072021-02-26 14:54:36 -0800790 fooResources := foo.Output("res/foo.jar")
791 fooDexJar := foo.Output("dex-withres/foo.jar")
792 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
793 fooApk := foo.Rule("combineApk")
794
795 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
796 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
797 }
798
799 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
800 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
801 }
802
803 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
804 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
805 }
806
Colin Cross90607e92025-02-11 14:58:07 -0800807 bar := ctx.ModuleForTests(t, "bar", "android_common")
Colin Crossb014f072021-02-26 14:54:36 -0800808 barResources := bar.Output("res/bar.jar")
809 barApk := bar.Rule("combineApk")
810
811 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
812 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
813 }
814}
815
Colin Crossff3ff7f2023-07-05 14:04:12 -0700816func TestAndroidResourceProcessor(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800817 t.Parallel()
Colin Crossff3ff7f2023-07-05 14:04:12 -0700818 testCases := []struct {
Colin Cross8676c8c2023-10-12 15:58:57 -0700819 name string
820 appUsesRP bool
821 directLibUsesRP bool
822 transitiveLibUsesRP bool
823 sharedLibUsesRP bool
824 sharedTransitiveStaticLibUsesRP bool
825 sharedTransitiveSharedLibUsesRP bool
Colin Crossff3ff7f2023-07-05 14:04:12 -0700826
827 dontVerifyApp bool
828 appResources []string
829 appOverlays []string
830 appImports []string
831 appSrcJars []string
832 appClasspath []string
833 appCombined []string
834
835 dontVerifyDirect bool
836 directResources []string
837 directOverlays []string
838 directImports []string
839 directSrcJars []string
840 directClasspath []string
841 directCombined []string
842
843 dontVerifyTransitive bool
844 transitiveResources []string
845 transitiveOverlays []string
846 transitiveImports []string
847 transitiveSrcJars []string
848 transitiveClasspath []string
849 transitiveCombined []string
850
851 dontVerifyDirectImport bool
852 directImportResources []string
853 directImportOverlays []string
854 directImportImports []string
855
856 dontVerifyTransitiveImport bool
857 transitiveImportResources []string
858 transitiveImportOverlays []string
859 transitiveImportImports []string
Colin Cross8676c8c2023-10-12 15:58:57 -0700860
861 dontVerifyShared bool
862 sharedResources []string
863 sharedOverlays []string
864 sharedImports []string
865 sharedSrcJars []string
866 sharedClasspath []string
867 sharedCombined []string
Colin Crossff3ff7f2023-07-05 14:04:12 -0700868 }{
869 {
Colin Cross4eae06d2023-06-20 22:40:02 -0700870 // Test with all modules set to use_resource_processor: false (except android_library_import modules,
871 // which always use resource processor).
872 name: "legacy",
873 appUsesRP: false,
874 directLibUsesRP: false,
875 transitiveLibUsesRP: false,
Colin Crossff3ff7f2023-07-05 14:04:12 -0700876
877 appResources: nil,
878 appOverlays: []string{
879 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000880 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700881 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
882 "out/soong/.intermediates/direct/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000883 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700884 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
885 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
886 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700887 appImports: []string{
888 "out/soong/.intermediates/shared/android_common/package-res.apk",
889 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
890 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700891 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
892 appClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -0800893 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
894 "out/soong/.intermediates/shared/android_common/turbine/shared.jar",
895 "out/soong/.intermediates/shared_transitive_static/android_common/turbine/shared_transitive_static.jar",
896 "out/soong/.intermediates/direct/android_common/turbine/direct.jar",
897 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
898 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
899 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
900 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
901 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700902 },
903 appCombined: []string{
904 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -0800905 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
906 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
907 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
908 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
909 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
910 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700911 },
912
913 directResources: nil,
914 directOverlays: []string{
915 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000916 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700917 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
918 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
919 },
920 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
921 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
922 directClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -0800923 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
924 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
925 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
926 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700927 },
928 directCombined: []string{
929 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
930 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -0800931 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
932 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700933 },
934
935 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
936 transitiveOverlays: nil,
937 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
938 transitiveSrcJars: []string{"out/soong/.intermediates/transitive/android_common/gen/android/R.srcjar"},
Colin Cross8ff4af32025-02-19 15:17:02 -0800939 transitiveClasspath: []string{"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar"},
Colin Crossff3ff7f2023-07-05 14:04:12 -0700940 transitiveCombined: nil,
941
Colin Cross8676c8c2023-10-12 15:58:57 -0700942 sharedResources: nil,
943 sharedOverlays: []string{
944 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
945 "out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat",
946 },
947 sharedImports: []string{
948 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
949 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
950 },
951 sharedSrcJars: []string{"out/soong/.intermediates/shared/android_common/gen/android/R.srcjar"},
952 sharedClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -0800953 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
954 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine/shared_transitive_shared.jar",
955 "out/soong/.intermediates/shared_transitive_static/android_common/turbine/shared_transitive_static.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700956 },
957 sharedCombined: []string{
958 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
959 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
960 },
961
Colin Crossff3ff7f2023-07-05 14:04:12 -0700962 directImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700963 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
964 directImportImports: []string{
965 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700966 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
967 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700968
969 transitiveImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700970 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
971 transitiveImportImports: []string{
972 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700973 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
974 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700975 },
976 {
977 // Test with all modules set to use_resource_processor: true.
Colin Cross8676c8c2023-10-12 15:58:57 -0700978 name: "resource_processor",
979 appUsesRP: true,
980 directLibUsesRP: true,
981 transitiveLibUsesRP: true,
982 sharedLibUsesRP: true,
983 sharedTransitiveSharedLibUsesRP: true,
984 sharedTransitiveStaticLibUsesRP: true,
Colin Cross4eae06d2023-06-20 22:40:02 -0700985
986 appResources: nil,
987 appOverlays: []string{
988 "out/soong/.intermediates/transitive/android_common/package-res.apk",
989 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
990 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
991 "out/soong/.intermediates/direct/android_common/package-res.apk",
992 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
993 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
994 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
995 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700996 appImports: []string{
997 "out/soong/.intermediates/shared/android_common/package-res.apk",
998 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
999 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001000 appSrcJars: nil,
1001 appClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001002 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001003 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001004 "out/soong/.intermediates/shared/android_common/turbine/shared.jar",
1005 "out/soong/.intermediates/shared_transitive_static/android_common/turbine/shared_transitive_static.jar",
1006 "out/soong/.intermediates/direct/android_common/turbine/direct.jar",
1007 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
1008 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1009 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1010 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1011 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001012 },
1013 appCombined: []string{
Colin Cross4eae06d2023-06-20 22:40:02 -07001014 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Crossfd620b22024-02-23 10:05:21 -08001015 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001016 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1017 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1018 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1019 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1020 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1021 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001022 },
1023
1024 directResources: nil,
1025 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
1026 directImports: []string{
1027 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1028 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1029 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1030 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1031 },
1032 directSrcJars: nil,
1033 directClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001034 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001035 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -08001036 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1037 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
1038 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001039 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
1040 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1041 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001042 },
1043 directCombined: []string{
1044 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1045 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001046 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1047 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001048 },
1049
1050 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1051 transitiveOverlays: nil,
1052 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1053 transitiveSrcJars: nil,
1054 transitiveClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001055 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001056 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1057 },
1058 transitiveCombined: nil,
1059
Colin Cross8676c8c2023-10-12 15:58:57 -07001060 sharedResources: nil,
1061 sharedOverlays: []string{"out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat"},
1062 sharedImports: []string{
1063 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
1064 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1065 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
1066 },
1067 sharedSrcJars: nil,
1068 sharedClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001069 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -08001070 "out/soong/.intermediates/shared/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001071 "out/soong/.intermediates/shared_transitive_static/android_common/busybox/R.jar",
1072 "out/soong/.intermediates/shared_transitive_shared/android_common/busybox/R.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001073 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine/shared_transitive_shared.jar",
1074 "out/soong/.intermediates/shared_transitive_static/android_common/turbine/shared_transitive_static.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001075 },
1076 sharedCombined: []string{
1077 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
1078 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
1079 },
1080
Colin Cross4eae06d2023-06-20 22:40:02 -07001081 directImportResources: nil,
1082 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
1083 directImportImports: []string{
1084 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1085 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1086 },
1087
1088 transitiveImportResources: nil,
1089 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
1090 transitiveImportImports: []string{
1091 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1092 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1093 },
1094 }, {
1095 // Test an app building with resource processor enabled but with dependencies built without
1096 // resource processor.
1097 name: "app_resource_processor",
1098 appUsesRP: true,
1099 directLibUsesRP: false,
1100 transitiveLibUsesRP: false,
1101
1102 appResources: nil,
1103 appOverlays: []string{
1104 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1105 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1106 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1107 "out/soong/.intermediates/direct/android_common/package-res.apk",
1108 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1109 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1110 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1111 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001112 appImports: []string{
1113 "out/soong/.intermediates/shared/android_common/package-res.apk",
1114 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1115 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001116 appSrcJars: nil,
1117 appClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001118 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001119 // R.jar has to come before direct.jar
1120 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001121 "out/soong/.intermediates/shared/android_common/turbine/shared.jar",
1122 "out/soong/.intermediates/shared_transitive_static/android_common/turbine/shared_transitive_static.jar",
1123 "out/soong/.intermediates/direct/android_common/turbine/direct.jar",
1124 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
1125 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1126 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1127 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1128 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001129 },
1130 appCombined: []string{
Colin Cross4eae06d2023-06-20 22:40:02 -07001131 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Crossfd620b22024-02-23 10:05:21 -08001132 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001133 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1134 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1135 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1136 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1137 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1138 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001139 },
1140
1141 dontVerifyDirect: true,
1142 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001143 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001144 dontVerifyDirectImport: true,
1145 dontVerifyTransitiveImport: true,
1146 },
1147 {
1148 // Test an app building without resource processor enabled but with a dependency built with
1149 // resource processor.
1150 name: "app_dependency_lib_resource_processor",
1151 appUsesRP: false,
1152 directLibUsesRP: true,
1153 transitiveLibUsesRP: false,
1154
1155 appOverlays: []string{
1156 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1157 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1158 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1159 "out/soong/.intermediates/direct/android_common/package-res.apk",
1160 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1161 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1162 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1163 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001164 appImports: []string{
1165 "out/soong/.intermediates/shared/android_common/package-res.apk",
1166 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1167 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001168 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1169 appClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001170 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
1171 "out/soong/.intermediates/shared/android_common/turbine/shared.jar",
1172 "out/soong/.intermediates/shared_transitive_static/android_common/turbine/shared_transitive_static.jar",
1173 "out/soong/.intermediates/direct/android_common/turbine/direct.jar",
1174 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
1175 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1176 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1177 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1178 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001179 },
1180 appCombined: []string{
1181 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001182 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1183 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1184 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1185 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1186 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1187 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001188 },
1189
1190 directResources: nil,
1191 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
1192 directImports: []string{
1193 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1194 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1195 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1196 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1197 },
1198 directSrcJars: nil,
1199 directClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001200 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001201 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -08001202 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
1203 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001204 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
1205 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1206 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001207 },
1208 directCombined: []string{
1209 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1210 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001211 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1212 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001213 },
1214
1215 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001216 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001217 dontVerifyDirectImport: true,
1218 dontVerifyTransitiveImport: true,
1219 },
1220 {
1221 // Test a library building without resource processor enabled but with a dependency built with
1222 // resource processor.
1223 name: "lib_dependency_lib_resource_processor",
1224 appUsesRP: false,
1225 directLibUsesRP: false,
1226 transitiveLibUsesRP: true,
1227
1228 appOverlays: []string{
1229 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1230 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1231 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1232 "out/soong/.intermediates/direct/android_common/package-res.apk",
1233 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1234 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1235 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1236 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001237 appImports: []string{
1238 "out/soong/.intermediates/shared/android_common/package-res.apk",
1239 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1240 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001241 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1242 appClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001243 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
1244 "out/soong/.intermediates/shared/android_common/turbine/shared.jar",
1245 "out/soong/.intermediates/shared_transitive_static/android_common/turbine/shared_transitive_static.jar",
1246 "out/soong/.intermediates/direct/android_common/turbine/direct.jar",
1247 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
1248 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1249 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1250 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1251 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001252 },
1253 appCombined: []string{
1254 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001255 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1256 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1257 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1258 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
1259 "out/soong/.intermediates/direct_import/android_common/aar/direct_import.jar",
1260 "out/soong/.intermediates/direct_import_dep/android_common/aar/direct_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001261 },
1262
1263 directResources: nil,
1264 directOverlays: []string{
1265 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1266 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1267 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1268 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
1269 },
1270 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1271 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
1272 directClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001273 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
1274 "out/soong/.intermediates/transitive/android_common/turbine/transitive.jar",
1275 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1276 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001277 },
1278 directCombined: []string{
1279 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1280 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross8ff4af32025-02-19 15:17:02 -08001281 "out/soong/.intermediates/transitive_import/android_common/aar/transitive_import.jar",
1282 "out/soong/.intermediates/transitive_import_dep/android_common/aar/transitive_import_dep.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001283 },
1284
1285 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1286 transitiveOverlays: nil,
1287 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1288 transitiveSrcJars: nil,
1289 transitiveClasspath: []string{
Colin Cross8ff4af32025-02-19 15:17:02 -08001290 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001291 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1292 },
1293 transitiveCombined: nil,
1294
Colin Cross8676c8c2023-10-12 15:58:57 -07001295 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001296 dontVerifyDirectImport: true,
1297 dontVerifyTransitiveImport: true,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001298 },
1299 }
1300
1301 for _, testCase := range testCases {
1302 t.Run(testCase.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001303 t.Parallel()
Colin Crossff3ff7f2023-07-05 14:04:12 -07001304 bp := fmt.Sprintf(`
1305 android_app {
1306 name: "app",
1307 sdk_version: "current",
1308 srcs: ["app/app.java"],
1309 resource_dirs: ["app/res"],
1310 manifest: "app/AndroidManifest.xml",
Colin Cross8676c8c2023-10-12 15:58:57 -07001311 libs: ["shared"],
Colin Crossff3ff7f2023-07-05 14:04:12 -07001312 static_libs: ["direct", "direct_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001313 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001314 }
1315
1316 android_library {
1317 name: "direct",
1318 sdk_version: "current",
1319 srcs: ["direct/direct.java"],
1320 resource_dirs: ["direct/res"],
1321 manifest: "direct/AndroidManifest.xml",
1322 static_libs: ["transitive", "transitive_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001323 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001324 }
1325
1326 android_library {
1327 name: "transitive",
1328 sdk_version: "current",
1329 srcs: ["transitive/transitive.java"],
1330 resource_dirs: ["transitive/res"],
1331 manifest: "transitive/AndroidManifest.xml",
Colin Cross4eae06d2023-06-20 22:40:02 -07001332 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001333 }
1334
Colin Cross8676c8c2023-10-12 15:58:57 -07001335 android_library {
1336 name: "shared",
1337 sdk_version: "current",
1338 srcs: ["shared/shared.java"],
1339 resource_dirs: ["shared/res"],
1340 manifest: "shared/AndroidManifest.xml",
1341 use_resource_processor: %v,
1342 libs: ["shared_transitive_shared"],
1343 static_libs: ["shared_transitive_static"],
1344 }
1345
1346 android_library {
1347 name: "shared_transitive_shared",
1348 sdk_version: "current",
1349 srcs: ["shared_transitive_shared/shared_transitive_shared.java"],
1350 resource_dirs: ["shared_transitive_shared/res"],
1351 manifest: "shared_transitive_shared/AndroidManifest.xml",
1352 use_resource_processor: %v,
1353 }
1354
1355 android_library {
1356 name: "shared_transitive_static",
1357 sdk_version: "current",
1358 srcs: ["shared_transitive_static/shared.java"],
1359 resource_dirs: ["shared_transitive_static/res"],
1360 manifest: "shared_transitive_static/AndroidManifest.xml",
1361 use_resource_processor: %v,
1362 }
1363
Colin Crossff3ff7f2023-07-05 14:04:12 -07001364 android_library_import {
1365 name: "direct_import",
1366 sdk_version: "current",
1367 aars: ["direct_import.aar"],
1368 static_libs: ["direct_import_dep"],
1369 }
1370
1371 android_library_import {
1372 name: "direct_import_dep",
1373 sdk_version: "current",
1374 aars: ["direct_import_dep.aar"],
1375 }
1376
1377 android_library_import {
1378 name: "transitive_import",
1379 sdk_version: "current",
1380 aars: ["transitive_import.aar"],
1381 static_libs: ["transitive_import_dep"],
1382 }
1383
1384 android_library_import {
1385 name: "transitive_import_dep",
1386 sdk_version: "current",
1387 aars: ["transitive_import_dep.aar"],
1388 }
Colin Cross8676c8c2023-10-12 15:58:57 -07001389 `, testCase.appUsesRP, testCase.directLibUsesRP, testCase.transitiveLibUsesRP,
1390 testCase.sharedLibUsesRP, testCase.sharedTransitiveSharedLibUsesRP, testCase.sharedTransitiveStaticLibUsesRP)
Colin Crossff3ff7f2023-07-05 14:04:12 -07001391
1392 fs := android.MockFS{
Colin Cross8676c8c2023-10-12 15:58:57 -07001393 "app/res/values/strings.xml": nil,
1394 "direct/res/values/strings.xml": nil,
1395 "transitive/res/values/strings.xml": nil,
1396 "shared/res/values/strings.xml": nil,
1397 "shared_transitive_static/res/values/strings.xml": nil,
1398 "shared_transitive_shared/res/values/strings.xml": nil,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001399 }
1400
1401 result := android.GroupFixturePreparers(
1402 PrepareForTestWithJavaDefaultModules,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001403 fs.AddToFixture(),
1404 ).RunTestWithBp(t, bp)
1405
1406 type aaptInfo struct {
1407 resources, overlays, imports, srcJars, classpath, combined android.Paths
1408 }
1409
1410 getAaptInfo := func(moduleName string) (aaptInfo aaptInfo) {
Colin Cross90607e92025-02-11 14:58:07 -08001411 mod := result.ModuleForTests(t, moduleName, "android_common")
Colin Crossff3ff7f2023-07-05 14:04:12 -07001412 resourceListRule := mod.MaybeOutput("aapt2/res.list")
1413 overlayListRule := mod.MaybeOutput("aapt2/overlay.list")
1414 aaptRule := mod.Rule("aapt2Link")
1415 javacRule := mod.MaybeRule("javac")
1416 combinedRule := mod.MaybeOutput("combined/" + moduleName + ".jar")
1417
1418 aaptInfo.resources = resourceListRule.Inputs
1419 aaptInfo.overlays = overlayListRule.Inputs
1420
1421 aaptFlags := strings.Split(aaptRule.Args["flags"], " ")
1422 for i, flag := range aaptFlags {
1423 if flag == "-I" && i+1 < len(aaptFlags) {
1424 aaptInfo.imports = append(aaptInfo.imports, android.PathForTesting(aaptFlags[i+1]))
1425 }
1426 }
1427
1428 if len(javacRule.Args["srcJars"]) > 0 {
1429 aaptInfo.srcJars = android.PathsForTesting(strings.Split(javacRule.Args["srcJars"], " ")...)
1430 }
1431
1432 if len(javacRule.Args["classpath"]) > 0 {
1433 classpathArg := strings.TrimPrefix(javacRule.Args["classpath"], "-classpath ")
1434 aaptInfo.classpath = android.PathsForTesting(strings.Split(classpathArg, ":")...)
1435 }
1436
1437 aaptInfo.combined = combinedRule.Inputs
1438 return
1439 }
1440
1441 app := getAaptInfo("app")
1442 direct := getAaptInfo("direct")
1443 transitive := getAaptInfo("transitive")
Colin Cross8676c8c2023-10-12 15:58:57 -07001444 shared := getAaptInfo("shared")
Colin Crossff3ff7f2023-07-05 14:04:12 -07001445 directImport := getAaptInfo("direct_import")
1446 transitiveImport := getAaptInfo("transitive_import")
1447
1448 if !testCase.dontVerifyApp {
1449 android.AssertPathsRelativeToTopEquals(t, "app resources", testCase.appResources, app.resources)
1450 android.AssertPathsRelativeToTopEquals(t, "app overlays", testCase.appOverlays, app.overlays)
1451 android.AssertPathsRelativeToTopEquals(t, "app imports", testCase.appImports, app.imports)
1452 android.AssertPathsRelativeToTopEquals(t, "app srcjars", testCase.appSrcJars, app.srcJars)
1453 android.AssertPathsRelativeToTopEquals(t, "app classpath", testCase.appClasspath, app.classpath)
1454 android.AssertPathsRelativeToTopEquals(t, "app combined", testCase.appCombined, app.combined)
1455 }
1456
1457 if !testCase.dontVerifyDirect {
1458 android.AssertPathsRelativeToTopEquals(t, "direct resources", testCase.directResources, direct.resources)
1459 android.AssertPathsRelativeToTopEquals(t, "direct overlays", testCase.directOverlays, direct.overlays)
1460 android.AssertPathsRelativeToTopEquals(t, "direct imports", testCase.directImports, direct.imports)
1461 android.AssertPathsRelativeToTopEquals(t, "direct srcjars", testCase.directSrcJars, direct.srcJars)
1462 android.AssertPathsRelativeToTopEquals(t, "direct classpath", testCase.directClasspath, direct.classpath)
1463 android.AssertPathsRelativeToTopEquals(t, "direct combined", testCase.directCombined, direct.combined)
1464 }
1465
1466 if !testCase.dontVerifyTransitive {
1467 android.AssertPathsRelativeToTopEquals(t, "transitive resources", testCase.transitiveResources, transitive.resources)
1468 android.AssertPathsRelativeToTopEquals(t, "transitive overlays", testCase.transitiveOverlays, transitive.overlays)
1469 android.AssertPathsRelativeToTopEquals(t, "transitive imports", testCase.transitiveImports, transitive.imports)
1470 android.AssertPathsRelativeToTopEquals(t, "transitive srcjars", testCase.transitiveSrcJars, transitive.srcJars)
1471 android.AssertPathsRelativeToTopEquals(t, "transitive classpath", testCase.transitiveClasspath, transitive.classpath)
1472 android.AssertPathsRelativeToTopEquals(t, "transitive combined", testCase.transitiveCombined, transitive.combined)
1473 }
1474
Colin Cross8676c8c2023-10-12 15:58:57 -07001475 if !testCase.dontVerifyShared {
1476 android.AssertPathsRelativeToTopEquals(t, "shared resources", testCase.sharedResources, shared.resources)
1477 android.AssertPathsRelativeToTopEquals(t, "shared overlays", testCase.sharedOverlays, shared.overlays)
1478 android.AssertPathsRelativeToTopEquals(t, "shared imports", testCase.sharedImports, shared.imports)
1479 android.AssertPathsRelativeToTopEquals(t, "shared srcjars", testCase.sharedSrcJars, shared.srcJars)
1480 android.AssertPathsRelativeToTopEquals(t, "shared classpath", testCase.sharedClasspath, shared.classpath)
1481 android.AssertPathsRelativeToTopEquals(t, "shared combined", testCase.sharedCombined, shared.combined)
1482 }
1483
Colin Crossff3ff7f2023-07-05 14:04:12 -07001484 if !testCase.dontVerifyDirectImport {
1485 android.AssertPathsRelativeToTopEquals(t, "direct_import resources", testCase.directImportResources, directImport.resources)
1486 android.AssertPathsRelativeToTopEquals(t, "direct_import overlays", testCase.directImportOverlays, directImport.overlays)
1487 android.AssertPathsRelativeToTopEquals(t, "direct_import imports", testCase.directImportImports, directImport.imports)
1488 }
1489
1490 if !testCase.dontVerifyTransitiveImport {
1491 android.AssertPathsRelativeToTopEquals(t, "transitive_import resources", testCase.transitiveImportResources, transitiveImport.resources)
1492 android.AssertPathsRelativeToTopEquals(t, "transitive_import overlays", testCase.transitiveImportOverlays, transitiveImport.overlays)
1493 android.AssertPathsRelativeToTopEquals(t, "transitive_import imports", testCase.transitiveImportImports, transitiveImport.imports)
1494 }
1495 })
1496 }
1497}
1498
1499func TestAndroidResourceOverlays(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001500 t.Parallel()
Colin Crossc4441622024-09-18 14:55:49 -07001501 type moduleAndVariant struct {
1502 module string
1503 variant string
1504 }
1505
Colin Cross5c4791c2019-02-01 11:44:44 -08001506 testCases := []struct {
1507 name string
1508 enforceRROTargets []string
1509 enforceRROExcludedOverlays []string
Colin Crossc4441622024-09-18 14:55:49 -07001510 resourceFiles map[moduleAndVariant][]string
1511 overlayFiles map[moduleAndVariant][]string
1512 rroDirs map[moduleAndVariant][]string
Colin Cross5c4791c2019-02-01 11:44:44 -08001513 }{
1514 {
1515 name: "no RRO",
1516 enforceRROTargets: nil,
1517 enforceRROExcludedOverlays: nil,
Colin Crossc4441622024-09-18 14:55:49 -07001518 resourceFiles: map[moduleAndVariant][]string{
1519 {"foo", "android_common"}: nil,
1520 {"bar", "android_common"}: {"bar/res/res/values/strings.xml"},
1521 {"lib", "android_common"}: nil,
1522 {"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"},
Colin Crossbec85302019-02-13 13:15:46 -08001523 },
Colin Crossc4441622024-09-18 14:55:49 -07001524 overlayFiles: map[moduleAndVariant][]string{
1525 {"foo", "android_common"}: {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001526 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1527 "out/soong/.intermediates/lib/android_common/package-res.apk",
1528 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001529 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001530 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1531 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +00001532 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001533 },
Colin Crossc4441622024-09-18 14:55:49 -07001534 {"bar", "android_common"}: {
Colin Cross5c4791c2019-02-01 11:44:44 -08001535 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1536 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1537 },
Colin Crossc4441622024-09-18 14:55:49 -07001538 {"lib", "android_common"}: {
Colin Crossbec85302019-02-13 13:15:46 -08001539 "lib/res/res/values/strings.xml",
1540 "device/vendor/blah/overlay/lib/res/values/strings.xml",
1541 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001542 },
Colin Crossc4441622024-09-18 14:55:49 -07001543 rroDirs: map[moduleAndVariant][]string{
1544 {"foo", "android_common"}: nil,
1545 {"bar", "android_common"}: nil,
Colin Cross5c4791c2019-02-01 11:44:44 -08001546 },
1547 },
1548 {
1549 name: "enforce RRO on foo",
1550 enforceRROTargets: []string{"foo"},
1551 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossc4441622024-09-18 14:55:49 -07001552 resourceFiles: map[moduleAndVariant][]string{
1553 {"foo", "android_common"}: nil,
1554 {"bar", "android_common"}: {"bar/res/res/values/strings.xml"},
1555 {"lib", "android_common"}: nil,
1556 {"lib", "android_common_rro"}: nil,
1557 {"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"},
1558 {"lib2", "android_common_rro"}: {"lib2/res/res/values/strings.xml"},
Colin Crossbec85302019-02-13 13:15:46 -08001559 },
Colin Crossc4441622024-09-18 14:55:49 -07001560 overlayFiles: map[moduleAndVariant][]string{
1561 {"foo", "android_common"}: {
1562 "out/soong/.intermediates/lib2/android_common_rro/package-res.apk",
1563 "out/soong/.intermediates/lib/android_common_rro/package-res.apk",
1564 "out/soong/.intermediates/lib3/android_common_rro/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001565 "foo/res/res/values/strings.xml",
1566 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1567 },
Colin Crossc4441622024-09-18 14:55:49 -07001568 {"bar", "android_common"}: {
Colin Cross5c4791c2019-02-01 11:44:44 -08001569 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1570 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1571 },
Colin Crossc4441622024-09-18 14:55:49 -07001572 {"lib", "android_common"}: {
Colin Crossbec85302019-02-13 13:15:46 -08001573 "lib/res/res/values/strings.xml",
Colin Crossc4441622024-09-18 14:55:49 -07001574 "device/vendor/blah/overlay/lib/res/values/strings.xml",
1575 },
1576 {"lib", "android_common_rro"}: {
Colin Crossc4441622024-09-18 14:55:49 -07001577 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -08001578 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001579 },
Colin Crossc1c37552019-01-31 11:42:41 -08001580
Colin Crossc4441622024-09-18 14:55:49 -07001581 rroDirs: map[moduleAndVariant][]string{
1582 {"foo", "android_common"}: {
Anton Hansson53c88442019-03-18 15:53:16 +00001583 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +00001584 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001585 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001586 },
Colin Crossc4441622024-09-18 14:55:49 -07001587 {"bar", "android_common"}: nil,
1588 {"lib", "android_common"}: nil,
1589 {"lib", "android_common_rro"}: {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001590 },
1591 },
1592 {
1593 name: "enforce RRO on all",
1594 enforceRROTargets: []string{"*"},
1595 enforceRROExcludedOverlays: []string{
1596 // Excluding specific apps/res directories also allowed.
1597 "device/vendor/blah/static_overlay/foo",
1598 "device/vendor/blah/static_overlay/bar/res",
1599 },
Colin Crossc4441622024-09-18 14:55:49 -07001600 resourceFiles: map[moduleAndVariant][]string{
1601 {"foo", "android_common"}: nil,
1602 {"bar", "android_common"}: {"bar/res/res/values/strings.xml"},
1603 {"lib", "android_common"}: nil,
1604 {"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"},
Colin Crossbec85302019-02-13 13:15:46 -08001605 },
Colin Crossc4441622024-09-18 14:55:49 -07001606 overlayFiles: map[moduleAndVariant][]string{
1607 {"foo", "android_common"}: {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001608 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1609 "out/soong/.intermediates/lib/android_common/package-res.apk",
1610 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001611 "foo/res/res/values/strings.xml",
1612 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1613 },
Colin Crossc4441622024-09-18 14:55:49 -07001614 {"bar", "android_common"}: {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
1615 {"lib", "android_common"}: {
Colin Crossbec85302019-02-13 13:15:46 -08001616 "lib/res/res/values/strings.xml",
1617 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001618 },
Colin Crossc4441622024-09-18 14:55:49 -07001619 rroDirs: map[moduleAndVariant][]string{
1620 {"foo", "android_common"}: {
Anton Hansson53c88442019-03-18 15:53:16 +00001621 "device:device/vendor/blah/overlay/foo/res",
1622 "product:product/vendor/blah/overlay/foo/res",
1623 // Lib dep comes after the direct deps
1624 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001625 },
Colin Crossc4441622024-09-18 14:55:49 -07001626 {"bar", "android_common"}: {"device:device/vendor/blah/overlay/bar/res"},
1627 {"lib", "android_common"}: {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001628 },
1629 },
1630 }
1631
Anton Hansson53c88442019-03-18 15:53:16 +00001632 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -08001633 "device/vendor/blah/overlay",
1634 "device/vendor/blah/overlay2",
1635 "device/vendor/blah/static_overlay",
1636 }
1637
Anton Hansson53c88442019-03-18 15:53:16 +00001638 productResourceOverlays := []string{
1639 "product/vendor/blah/overlay",
1640 }
1641
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001642 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -08001643 "foo/res/res/values/strings.xml": nil,
1644 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001645 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -08001646 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001647 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
1648 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001649 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001650 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
1651 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
1652 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +00001653 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001654 }
1655
1656 bp := `
1657 android_app {
1658 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001659 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001660 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +00001661 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -08001662 }
1663
1664 android_app {
1665 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001666 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001667 resource_dirs: ["bar/res"],
1668 }
Colin Cross6ed7dea2019-01-31 14:44:30 -08001669
1670 android_library {
1671 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001672 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001673 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -08001674 static_libs: ["lib2"],
1675 }
1676
1677 android_library {
1678 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001679 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -08001680 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -08001681 }
Anton Hansson53c88442019-03-18 15:53:16 +00001682
1683 // This library has the same resources as lib (should not lead to dupe RROs)
1684 android_library {
1685 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001686 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +00001687 resource_dirs: ["lib/res"]
1688 }
Colin Cross890ff552017-11-30 20:13:19 -08001689 `
1690
Colin Cross5c4791c2019-02-01 11:44:44 -08001691 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -08001692 t.Run(testCase.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001693 t.Parallel()
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001694 result := android.GroupFixturePreparers(
1695 PrepareForTestWithJavaDefaultModules,
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001696 fs.AddToFixture(),
1697 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1698 variables.DeviceResourceOverlays = deviceResourceOverlays
1699 variables.ProductResourceOverlays = productResourceOverlays
1700 if testCase.enforceRROTargets != nil {
1701 variables.EnforceRROTargets = testCase.enforceRROTargets
1702 }
1703 if testCase.enforceRROExcludedOverlays != nil {
1704 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
1705 }
1706 }),
1707 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -08001708
Colin Crossbec85302019-02-13 13:15:46 -08001709 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
1710 for _, o := range list {
1711 res := module.MaybeOutput(o)
1712 if res.Rule != nil {
Colin Crossc4441622024-09-18 14:55:49 -07001713 // If the overlay is compiled as part of this moduleAndVariant (i.e. a .arsc.flat file),
Colin Crossbec85302019-02-13 13:15:46 -08001714 // verify the inputs to the .arsc.flat rule.
1715 files = append(files, res.Inputs.Strings()...)
1716 } else {
Colin Crossc4441622024-09-18 14:55:49 -07001717 // Otherwise, verify the full path to the output of the other moduleAndVariant
Colin Crossbec85302019-02-13 13:15:46 -08001718 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +00001719 }
Colin Cross890ff552017-11-30 20:13:19 -08001720 }
Colin Crossbec85302019-02-13 13:15:46 -08001721 return files
Colin Cross890ff552017-11-30 20:13:19 -08001722 }
1723
Colin Crossc4441622024-09-18 14:55:49 -07001724 getResources := func(moduleName, variantName string) (resourceFiles, overlayFiles, rroDirs []string) {
Colin Cross90607e92025-02-11 14:58:07 -08001725 module := result.ModuleForTests(t, moduleName, variantName)
Colin Crossbec85302019-02-13 13:15:46 -08001726 resourceList := module.MaybeOutput("aapt2/res.list")
1727 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001728 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +00001729 }
Colin Crossbec85302019-02-13 13:15:46 -08001730 overlayList := module.MaybeOutput("aapt2/overlay.list")
1731 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001732 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -08001733 }
1734
Colin Crossab8d1382023-07-14 17:23:41 +00001735 for _, d := range module.Module().(AndroidLibraryDependency).RRODirsDepSet().ToList() {
Anton Hansson53c88442019-03-18 15:53:16 +00001736 var prefix string
1737 if d.overlayType == device {
1738 prefix = "device:"
1739 } else if d.overlayType == product {
1740 prefix = "product:"
1741 } else {
1742 t.Fatalf("Unexpected overlayType %d", d.overlayType)
1743 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001744 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +00001745 }
Colin Crossbec85302019-02-13 13:15:46 -08001746
1747 return resourceFiles, overlayFiles, rroDirs
1748 }
1749
Colin Crossc4441622024-09-18 14:55:49 -07001750 modules := []moduleAndVariant{
1751 {"foo", "android_common"},
1752 {"foo", "android_common_rro"},
1753 {"bar", "android_common"},
1754 {"bar", "android_common_rro"},
1755 {"lib", "android_common"},
1756 {"lib", "android_common_rro"},
1757 {"lib2", "android_common"},
1758 {"lib2", "android_common_rro"},
1759 }
1760 for _, moduleAndVariant := range modules {
1761 if _, exists := testCase.resourceFiles[moduleAndVariant]; !exists {
1762 continue
1763 }
1764 resourceFiles, overlayFiles, rroDirs := getResources(moduleAndVariant.module, moduleAndVariant.variant)
Colin Crossbec85302019-02-13 13:15:46 -08001765
Colin Crossc4441622024-09-18 14:55:49 -07001766 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[moduleAndVariant]) {
Colin Crossbec85302019-02-13 13:15:46 -08001767 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
Colin Crossc4441622024-09-18 14:55:49 -07001768 moduleAndVariant, testCase.resourceFiles[moduleAndVariant], resourceFiles)
Colin Crossbec85302019-02-13 13:15:46 -08001769 }
Colin Crossc4441622024-09-18 14:55:49 -07001770 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[moduleAndVariant]) {
Colin Crossbec85302019-02-13 13:15:46 -08001771 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
Colin Crossc4441622024-09-18 14:55:49 -07001772 moduleAndVariant, testCase.overlayFiles[moduleAndVariant], overlayFiles)
Colin Crossbec85302019-02-13 13:15:46 -08001773 }
Colin Crossc4441622024-09-18 14:55:49 -07001774 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[moduleAndVariant]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +00001775 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossc4441622024-09-18 14:55:49 -07001776 moduleAndVariant, testCase.rroDirs[moduleAndVariant], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +00001777 }
Colin Cross890ff552017-11-30 20:13:19 -08001778 }
Colin Cross890ff552017-11-30 20:13:19 -08001779 })
1780 }
1781}
Colin Crossd09b0b62018-04-18 11:06:47 -07001782
Paul Duffincdb88a92021-03-14 00:36:50 +00001783func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
Colin Cross90607e92025-02-11 14:58:07 -08001784 foo := result.ModuleForTests(t, "foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +09001785 link := foo.Output("package-res.apk")
1786 linkFlags := strings.Split(link.Args["flags"], " ")
1787 min := android.IndexList("--min-sdk-version", linkFlags)
1788 target := android.IndexList("--target-sdk-version", linkFlags)
1789
1790 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
1791 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
1792 }
1793
1794 gotMinSdkVersion := linkFlags[min+1]
1795 gotTargetSdkVersion := linkFlags[target+1]
1796
Paul Duffincdb88a92021-03-14 00:36:50 +00001797 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001798
Paul Duffincdb88a92021-03-14 00:36:50 +00001799 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001800}
1801
Colin Crossd09b0b62018-04-18 11:06:47 -07001802func TestAppSdkVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001803 t.Parallel()
Colin Crossd09b0b62018-04-18 11:06:47 -07001804 testCases := []struct {
1805 name string
1806 sdkVersion string
1807 platformSdkInt int
1808 platformSdkCodename string
1809 platformSdkFinal bool
Spandan Dasffb31af2023-03-01 19:46:18 +00001810 minSdkVersionBp string
Colin Crossd09b0b62018-04-18 11:06:47 -07001811 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001812 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001813 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001814 }{
1815 {
1816 name: "current final SDK",
1817 sdkVersion: "current",
1818 platformSdkInt: 27,
1819 platformSdkCodename: "REL",
1820 platformSdkFinal: true,
1821 expectedMinSdkVersion: "27",
1822 },
1823 {
1824 name: "current non-final SDK",
1825 sdkVersion: "current",
1826 platformSdkInt: 27,
1827 platformSdkCodename: "OMR1",
1828 platformSdkFinal: false,
1829 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001830 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001831 },
1832 {
1833 name: "default final SDK",
1834 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001835 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001836 platformSdkInt: 27,
1837 platformSdkCodename: "REL",
1838 platformSdkFinal: true,
1839 expectedMinSdkVersion: "27",
1840 },
1841 {
1842 name: "default non-final SDK",
1843 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001844 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001845 platformSdkInt: 27,
1846 platformSdkCodename: "OMR1",
1847 platformSdkFinal: false,
1848 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001849 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001850 },
1851 {
1852 name: "14",
1853 sdkVersion: "14",
1854 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001855 platformSdkCodename: "S",
1856 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001857 },
Spandan Dasffb31af2023-03-01 19:46:18 +00001858 {
1859 name: "two active SDKs",
1860 sdkVersion: "module_current",
1861 minSdkVersionBp: "UpsideDownCake",
1862 expectedMinSdkVersion: "UpsideDownCake", // And not VanillaIceCream
1863 platformSdkCodename: "VanillaIceCream",
1864 activeCodenames: []string{"UpsideDownCake", "VanillaIceCream"},
1865 },
Colin Crossd09b0b62018-04-18 11:06:47 -07001866 }
1867
1868 for _, moduleType := range []string{"android_app", "android_library"} {
1869 for _, test := range testCases {
1870 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001871 t.Parallel()
Jeongik Cha538c0d02019-07-11 15:54:27 +09001872 platformApiProp := ""
1873 if test.platformApis {
1874 platformApiProp = "platform_apis: true,"
1875 }
Spandan Dasffb31af2023-03-01 19:46:18 +00001876 minSdkVersionProp := ""
1877 if test.minSdkVersionBp != "" {
1878 minSdkVersionProp = fmt.Sprintf(` min_sdk_version: "%s",`, test.minSdkVersionBp)
1879 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001880 bp := fmt.Sprintf(`%s {
1881 name: "foo",
1882 srcs: ["a.java"],
1883 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001884 %s
Spandan Dasffb31af2023-03-01 19:46:18 +00001885 %s
1886 }`, moduleType, test.sdkVersion, platformApiProp, minSdkVersionProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001887
Paul Duffin71ae5942021-03-22 15:36:52 +00001888 result := android.GroupFixturePreparers(
1889 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001890 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1891 variables.Platform_sdk_version = &test.platformSdkInt
1892 variables.Platform_sdk_codename = &test.platformSdkCodename
1893 variables.Platform_version_active_codenames = test.activeCodenames
1894 variables.Platform_sdk_final = &test.platformSdkFinal
1895 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001896 FixtureWithPrebuiltApis(map[string][]string{
1897 "14": {"foo"},
1898 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001899 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001900
Paul Duffincdb88a92021-03-14 00:36:50 +00001901 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001902 })
1903 }
1904 }
1905}
Colin Crossa4f08812018-10-02 22:03:40 -07001906
Jeongik Cha219141c2020-08-06 23:00:37 +09001907func TestVendorAppSdkVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001908 t.Parallel()
Jeongik Cha219141c2020-08-06 23:00:37 +09001909 testCases := []struct {
1910 name string
1911 sdkVersion string
1912 platformSdkInt int
1913 platformSdkCodename string
1914 platformSdkFinal bool
1915 deviceCurrentApiLevelForVendorModules string
1916 expectedMinSdkVersion string
1917 }{
1918 {
1919 name: "current final SDK",
1920 sdkVersion: "current",
1921 platformSdkInt: 29,
1922 platformSdkCodename: "REL",
1923 platformSdkFinal: true,
1924 deviceCurrentApiLevelForVendorModules: "29",
1925 expectedMinSdkVersion: "29",
1926 },
1927 {
1928 name: "current final SDK",
1929 sdkVersion: "current",
1930 platformSdkInt: 29,
1931 platformSdkCodename: "REL",
1932 platformSdkFinal: true,
1933 deviceCurrentApiLevelForVendorModules: "28",
1934 expectedMinSdkVersion: "28",
1935 },
1936 {
1937 name: "current final SDK",
1938 sdkVersion: "current",
1939 platformSdkInt: 29,
1940 platformSdkCodename: "Q",
1941 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001942 deviceCurrentApiLevelForVendorModules: "28",
1943 expectedMinSdkVersion: "28",
1944 },
1945 }
1946
1947 for _, moduleType := range []string{"android_app", "android_library"} {
1948 for _, sdkKind := range []string{"", "system_"} {
1949 for _, test := range testCases {
1950 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001951 t.Parallel()
Jeongik Cha219141c2020-08-06 23:00:37 +09001952 bp := fmt.Sprintf(`%s {
1953 name: "foo",
1954 srcs: ["a.java"],
1955 sdk_version: "%s%s",
1956 vendor: true,
1957 }`, moduleType, sdkKind, test.sdkVersion)
1958
Paul Duffin71ae5942021-03-22 15:36:52 +00001959 result := android.GroupFixturePreparers(
1960 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001961 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1962 variables.Platform_sdk_version = &test.platformSdkInt
1963 variables.Platform_sdk_codename = &test.platformSdkCodename
1964 variables.Platform_sdk_final = &test.platformSdkFinal
1965 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1966 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1967 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001968 FixtureWithPrebuiltApis(map[string][]string{
1969 "28": {"foo"},
1970 "29": {"foo"},
1971 "current": {"foo"},
1972 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001973 ).RunTestWithBp(t, bp)
1974
1975 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001976 })
1977 }
1978 }
1979 }
1980}
1981
Paul Duffin50c217c2019-06-12 13:25:22 +01001982func TestJNIABI(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001983 t.Parallel()
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001984 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001985 cc_library {
1986 name: "libjni",
1987 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001988 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001989 stl: "none",
1990 }
1991
1992 android_test {
1993 name: "test",
1994 sdk_version: "core_platform",
1995 jni_libs: ["libjni"],
1996 }
1997
1998 android_test {
1999 name: "test_first",
2000 sdk_version: "core_platform",
2001 compile_multilib: "first",
2002 jni_libs: ["libjni"],
2003 }
2004
2005 android_test {
2006 name: "test_both",
2007 sdk_version: "core_platform",
2008 compile_multilib: "both",
2009 jni_libs: ["libjni"],
2010 }
2011
2012 android_test {
2013 name: "test_32",
2014 sdk_version: "core_platform",
2015 compile_multilib: "32",
2016 jni_libs: ["libjni"],
2017 }
2018
2019 android_test {
2020 name: "test_64",
2021 sdk_version: "core_platform",
2022 compile_multilib: "64",
2023 jni_libs: ["libjni"],
2024 }
2025 `)
2026
2027 testCases := []struct {
2028 name string
2029 abis []string
2030 }{
2031 {"test", []string{"arm64-v8a"}},
2032 {"test_first", []string{"arm64-v8a"}},
2033 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
2034 {"test_32", []string{"armeabi-v7a"}},
2035 {"test_64", []string{"arm64-v8a"}},
2036 }
2037
2038 for _, test := range testCases {
2039 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002040 t.Parallel()
Colin Cross90607e92025-02-11 14:58:07 -08002041 app := ctx.ModuleForTests(t, test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07002042 jniLibZip := app.Output("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01002043 var abis []string
2044 args := strings.Fields(jniLibZip.Args["jarArgs"])
2045 for i := 0; i < len(args); i++ {
2046 if args[i] == "-P" {
2047 abis = append(abis, filepath.Base(args[i+1]))
2048 i++
2049 }
2050 }
2051 if !reflect.DeepEqual(abis, test.abis) {
2052 t.Errorf("want abis %v, got %v", test.abis, abis)
2053 }
2054 })
2055 }
2056}
2057
Jeongik Cha2cc570d2019-10-29 15:44:45 +09002058func TestAppSdkVersionByPartition(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002059 t.Parallel()
Jeongik Cha2cc570d2019-10-29 15:44:45 +09002060 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
2061 android_app {
2062 name: "foo",
2063 srcs: ["a.java"],
2064 vendor: true,
2065 platform_apis: true,
2066 }
2067 `)
2068
2069 testJava(t, `
2070 android_app {
2071 name: "bar",
2072 srcs: ["b.java"],
2073 platform_apis: true,
2074 }
2075 `)
2076
2077 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09002078 bp := `
2079 android_app {
2080 name: "foo",
2081 srcs: ["a.java"],
2082 product_specific: true,
2083 platform_apis: true,
2084 }
2085 `
Colin Cross98be1bb2019-12-13 20:41:13 -08002086
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002087 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09002088 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002089 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 +09002090 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002091
2092 android.GroupFixturePreparers(
2093 PrepareForTestWithJavaDefaultModules,
2094 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2095 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
2096 }),
2097 ).
2098 ExtendWithErrorHandler(errorHandler).
2099 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09002100 }
2101}
2102
Paul Duffin50c217c2019-06-12 13:25:22 +01002103func TestJNIPackaging(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002104 t.Parallel()
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002105 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01002106 cc_library {
2107 name: "libjni",
2108 system_shared_libs: [],
2109 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08002110 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002111 }
2112
2113 android_app {
2114 name: "app",
2115 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002116 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002117 }
2118
2119 android_app {
2120 name: "app_noembed",
2121 jni_libs: ["libjni"],
2122 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002123 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002124 }
2125
2126 android_app {
2127 name: "app_embed",
2128 jni_libs: ["libjni"],
2129 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002130 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002131 }
2132
2133 android_test {
2134 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00002135 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002136 jni_libs: ["libjni"],
2137 }
2138
2139 android_test {
2140 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00002141 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002142 jni_libs: ["libjni"],
2143 use_embedded_native_libs: false,
2144 }
2145
2146 android_test_helper_app {
2147 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00002148 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002149 jni_libs: ["libjni"],
2150 }
2151
2152 android_test_helper_app {
2153 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00002154 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002155 jni_libs: ["libjni"],
2156 use_embedded_native_libs: false,
2157 }
2158 `)
2159
2160 testCases := []struct {
2161 name string
2162 packaged bool
2163 compressed bool
2164 }{
Jiyong Parkd044bb42024-05-15 02:09:54 +09002165 {"app", false, false},
2166 {"app_noembed", false, false},
Paul Duffin50c217c2019-06-12 13:25:22 +01002167 {"app_embed", true, false},
2168 {"test", true, false},
2169 {"test_noembed", true, true},
2170 {"test_helper", true, false},
2171 {"test_helper_noembed", true, true},
2172 }
2173
2174 for _, test := range testCases {
2175 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002176 t.Parallel()
Colin Cross90607e92025-02-11 14:58:07 -08002177 app := ctx.ModuleForTests(t, test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07002178 jniLibZip := app.MaybeOutput("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01002179 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
2180 t.Errorf("expected jni packaged %v, got %v", w, g)
2181 }
2182
2183 if jniLibZip.Rule != nil {
2184 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
2185 t.Errorf("expected jni compressed %v, got %v", w, g)
2186 }
Colin Crossc511bc52020-04-07 16:50:32 +00002187
2188 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
2189 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
2190 }
Paul Duffin50c217c2019-06-12 13:25:22 +01002191 }
2192 })
2193 }
Colin Cross47fa9d32019-03-26 10:51:39 -07002194}
2195
Colin Cross3c007702020-05-08 11:20:24 -07002196func TestJNISDK(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002197 t.Parallel()
Colin Cross3c007702020-05-08 11:20:24 -07002198 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
2199 cc_library {
2200 name: "libjni",
2201 system_shared_libs: [],
2202 stl: "none",
2203 sdk_version: "current",
2204 }
2205
2206 android_test {
2207 name: "app_platform",
2208 jni_libs: ["libjni"],
2209 platform_apis: true,
2210 }
2211
2212 android_test {
2213 name: "app_sdk",
2214 jni_libs: ["libjni"],
2215 sdk_version: "current",
2216 }
2217
2218 android_test {
2219 name: "app_force_platform",
2220 jni_libs: ["libjni"],
2221 sdk_version: "current",
2222 jni_uses_platform_apis: true,
2223 }
2224
2225 android_test {
2226 name: "app_force_sdk",
2227 jni_libs: ["libjni"],
2228 platform_apis: true,
2229 jni_uses_sdk_apis: true,
2230 }
Colin Crossc2d24052020-05-13 11:05:02 -07002231
2232 cc_library {
2233 name: "libvendorjni",
2234 system_shared_libs: [],
2235 stl: "none",
2236 vendor: true,
2237 }
2238
2239 android_test {
2240 name: "app_vendor",
2241 jni_libs: ["libvendorjni"],
2242 sdk_version: "current",
2243 vendor: true,
2244 }
Colin Cross3c007702020-05-08 11:20:24 -07002245 `)
2246
2247 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07002248 name string
2249 sdkJNI bool
2250 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07002251 }{
Colin Crossc2d24052020-05-13 11:05:02 -07002252 {name: "app_platform"},
2253 {name: "app_sdk", sdkJNI: true},
2254 {name: "app_force_platform"},
2255 {name: "app_force_sdk", sdkJNI: true},
2256 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07002257 }
2258
Colin Cross90607e92025-02-11 14:58:07 -08002259 platformJNI := ctx.ModuleForTests(t, "libjni", "android_arm64_armv8-a_shared").
Colin Crossc2d24052020-05-13 11:05:02 -07002260 Output("libjni.so").Output.String()
Colin Cross90607e92025-02-11 14:58:07 -08002261 sdkJNI := ctx.ModuleForTests(t, "libjni", "android_arm64_armv8-a_sdk_shared").
Colin Crossc2d24052020-05-13 11:05:02 -07002262 Output("libjni.so").Output.String()
Colin Cross90607e92025-02-11 14:58:07 -08002263 vendorJNI := ctx.ModuleForTests(t, "libvendorjni", "android_vendor_arm64_armv8-a_shared").
Colin Crossc2d24052020-05-13 11:05:02 -07002264 Output("libvendorjni.so").Output.String()
2265
Colin Cross3c007702020-05-08 11:20:24 -07002266 for _, test := range testCases {
2267 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002268 t.Parallel()
Colin Cross90607e92025-02-11 14:58:07 -08002269 app := ctx.ModuleForTests(t, test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07002270
Colin Crossb3168ba2023-07-26 16:14:56 -07002271 jniLibZip := app.MaybeOutput("jnilibs.zip")
Colin Cross3c007702020-05-08 11:20:24 -07002272 if len(jniLibZip.Implicits) != 1 {
2273 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
2274 }
2275 gotJNI := jniLibZip.Implicits[0].String()
2276
2277 if test.sdkJNI {
2278 if gotJNI != sdkJNI {
2279 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
2280 }
Colin Crossc2d24052020-05-13 11:05:02 -07002281 } else if test.vendorJNI {
2282 if gotJNI != vendorJNI {
2283 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
2284 }
Colin Cross3c007702020-05-08 11:20:24 -07002285 } else {
2286 if gotJNI != platformJNI {
2287 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
2288 }
2289 }
2290 })
2291 }
2292
2293 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002294 t.Parallel()
Colin Cross3c007702020-05-08 11:20:24 -07002295 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
2296 android_test {
2297 name: "app_platform",
2298 platform_apis: true,
2299 jni_uses_platform_apis: true,
2300 }
2301 `)
2302 })
2303
2304 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002305 t.Parallel()
Colin Cross3c007702020-05-08 11:20:24 -07002306 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
2307 android_test {
2308 name: "app_sdk",
2309 sdk_version: "current",
2310 jni_uses_sdk_apis: true,
2311 }
2312 `)
2313 })
2314
2315}
2316
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002317func TestCertificates(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002318 t.Parallel()
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002319 testCases := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002320 name string
2321 bp string
Colin Cross5caad2b2022-12-12 15:11:46 -08002322 allowMissingDependencies bool
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002323 certificateOverride string
2324 expectedCertSigningFlags string
2325 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002326 }{
2327 {
2328 name: "default",
2329 bp: `
2330 android_app {
2331 name: "foo",
2332 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002333 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002334 }
2335 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002336 certificateOverride: "",
2337 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002338 expectedCertificate: "build/make/target/product/security/testkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002339 },
2340 {
2341 name: "module certificate property",
2342 bp: `
2343 android_app {
2344 name: "foo",
2345 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002346 certificate: ":new_certificate",
2347 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002348 }
2349
2350 android_app_certificate {
2351 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002352 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002353 }
2354 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002355 certificateOverride: "",
2356 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002357 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002358 },
2359 {
2360 name: "path certificate property",
2361 bp: `
2362 android_app {
2363 name: "foo",
2364 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002365 certificate: "expiredkey",
2366 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002367 }
2368 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002369 certificateOverride: "",
2370 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002371 expectedCertificate: "build/make/target/product/security/expiredkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002372 },
2373 {
2374 name: "certificate overrides",
2375 bp: `
2376 android_app {
2377 name: "foo",
2378 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002379 certificate: "expiredkey",
2380 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002381 }
2382
2383 android_app_certificate {
2384 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002385 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002386 }
2387 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002388 certificateOverride: "foo:new_certificate",
2389 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002390 expectedCertificate: "cert/new_cert",
Liz Kammere2b27f42020-05-07 13:24:05 -07002391 },
2392 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002393 name: "certificate signing flags",
Liz Kammere2b27f42020-05-07 13:24:05 -07002394 bp: `
2395 android_app {
2396 name: "foo",
2397 srcs: ["a.java"],
2398 certificate: ":new_certificate",
2399 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002400 rotationMinSdkVersion: "32",
Liz Kammere2b27f42020-05-07 13:24:05 -07002401 sdk_version: "current",
2402 }
2403
2404 android_app_certificate {
2405 name: "new_certificate",
2406 certificate: "cert/new_cert",
2407 }
2408 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002409 certificateOverride: "",
2410 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002411 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002412 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002413 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002414 name: "cert signing flags from filegroup",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002415 bp: `
2416 android_app {
2417 name: "foo",
2418 srcs: ["a.java"],
2419 certificate: ":new_certificate",
2420 lineage: ":lineage_bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002421 rotationMinSdkVersion: "32",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002422 sdk_version: "current",
2423 }
2424
2425 android_app_certificate {
2426 name: "new_certificate",
2427 certificate: "cert/new_cert",
2428 }
2429
2430 filegroup {
2431 name: "lineage_bin",
2432 srcs: ["lineage.bin"],
2433 }
2434 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002435 certificateOverride: "",
2436 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002437 expectedCertificate: "cert/new_cert",
2438 },
2439 {
2440 name: "missing with AllowMissingDependencies",
2441 bp: `
2442 android_app {
2443 name: "foo",
2444 srcs: ["a.java"],
2445 certificate: ":new_certificate",
2446 sdk_version: "current",
2447 }
2448 `,
2449 expectedCertificate: "out/soong/.intermediates/foo/android_common/missing",
2450 allowMissingDependencies: true,
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002451 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002452 }
2453
2454 for _, test := range testCases {
2455 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002456 t.Parallel()
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002457 result := android.GroupFixturePreparers(
2458 PrepareForTestWithJavaDefaultModules,
2459 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2460 if test.certificateOverride != "" {
2461 variables.CertificateOverrides = []string{test.certificateOverride}
2462 }
Colin Cross5caad2b2022-12-12 15:11:46 -08002463 if test.allowMissingDependencies {
2464 variables.Allow_missing_dependencies = proptools.BoolPtr(true)
2465 }
2466 }),
2467 android.FixtureModifyContext(func(ctx *android.TestContext) {
2468 ctx.SetAllowMissingDependencies(test.allowMissingDependencies)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002469 }),
2470 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002471
Colin Cross90607e92025-02-11 14:58:07 -08002472 foo := result.ModuleForTests(t, "foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002473
Colin Cross5caad2b2022-12-12 15:11:46 -08002474 certificate := foo.Module().(*AndroidApp).certificate
2475 android.AssertPathRelativeToTopEquals(t, "certificates key", test.expectedCertificate+".pk8", certificate.Key)
2476 // The sign_target_files_apks and check_target_files_signatures
2477 // tools require that certificates have a .x509.pem extension.
2478 android.AssertPathRelativeToTopEquals(t, "certificates pem", test.expectedCertificate+".x509.pem", certificate.Pem)
Liz Kammere2b27f42020-05-07 13:24:05 -07002479
Colin Cross5caad2b2022-12-12 15:11:46 -08002480 signapk := foo.Output("foo.apk")
2481 if signapk.Rule != android.ErrorRule {
2482 signCertificateFlags := signapk.Args["certificates"]
2483 expectedFlags := certificate.Pem.String() + " " + certificate.Key.String()
2484 android.AssertStringEquals(t, "certificates flags", expectedFlags, signCertificateFlags)
2485
2486 certSigningFlags := signapk.Args["flags"]
2487 android.AssertStringEquals(t, "cert signing flags", test.expectedCertSigningFlags, certSigningFlags)
2488 }
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002489 })
2490 }
2491}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002492
Songchun Fan688de9a2020-03-24 20:32:24 -07002493func TestRequestV4SigningFlag(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002494 t.Parallel()
Songchun Fan688de9a2020-03-24 20:32:24 -07002495 testCases := []struct {
2496 name string
2497 bp string
2498 expected string
2499 }{
2500 {
2501 name: "default",
2502 bp: `
2503 android_app {
2504 name: "foo",
2505 srcs: ["a.java"],
2506 sdk_version: "current",
2507 }
2508 `,
2509 expected: "",
2510 },
2511 {
2512 name: "default",
2513 bp: `
2514 android_app {
2515 name: "foo",
2516 srcs: ["a.java"],
2517 sdk_version: "current",
2518 v4_signature: false,
2519 }
2520 `,
2521 expected: "",
2522 },
2523 {
2524 name: "module certificate property",
2525 bp: `
2526 android_app {
2527 name: "foo",
2528 srcs: ["a.java"],
2529 sdk_version: "current",
2530 v4_signature: true,
2531 }
2532 `,
2533 expected: "--enable-v4",
2534 },
2535 }
2536
2537 for _, test := range testCases {
2538 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002539 t.Parallel()
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002540 result := android.GroupFixturePreparers(
2541 PrepareForTestWithJavaDefaultModules,
2542 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07002543
Colin Cross90607e92025-02-11 14:58:07 -08002544 foo := result.ModuleForTests(t, "foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07002545
2546 signapk := foo.Output("foo.apk")
2547 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002548 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07002549 })
2550 }
2551}
2552
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002553func TestPackageNameOverride(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002554 t.Parallel()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002555 testCases := []struct {
2556 name string
2557 bp string
2558 packageNameOverride string
2559 expected []string
2560 }{
2561 {
2562 name: "default",
2563 bp: `
2564 android_app {
2565 name: "foo",
2566 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002567 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002568 }
2569 `,
2570 packageNameOverride: "",
2571 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002572 "out/soong/.intermediates/foo/android_common/foo.apk",
Cole Faust6b7075f2024-12-17 10:42:42 -08002573 "out/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002574 },
2575 },
2576 {
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002577 name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002578 bp: `
2579 android_app {
2580 name: "foo",
2581 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002582 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002583 }
2584 `,
2585 packageNameOverride: "foo:bar",
2586 expected: []string{
2587 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002588 "out/soong/.intermediates/foo/android_common/bar.apk",
Cole Faust6b7075f2024-12-17 10:42:42 -08002589 "out/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002590 },
2591 },
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002592 {
2593 name: "overridden via stem",
2594 bp: `
2595 android_app {
2596 name: "foo",
2597 srcs: ["a.java"],
2598 sdk_version: "current",
2599 stem: "bar",
2600 }
2601 `,
2602 packageNameOverride: "",
2603 expected: []string{
2604 "out/soong/.intermediates/foo/android_common/bar.apk",
Cole Faust6b7075f2024-12-17 10:42:42 -08002605 "out/target/product/test_device/system/app/bar/bar.apk",
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002606 },
2607 },
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002608 }
2609
2610 for _, test := range testCases {
2611 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002612 t.Parallel()
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002613 result := android.GroupFixturePreparers(
2614 PrepareForTestWithJavaDefaultModules,
2615 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2616 if test.packageNameOverride != "" {
2617 variables.PackageNameOverrides = []string{test.packageNameOverride}
2618 }
2619 }),
2620 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002621
Colin Cross90607e92025-02-11 14:58:07 -08002622 foo := result.ModuleForTests(t, "foo", "android_common")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002623
Lukacs T. Berkifbaf7252021-08-19 09:36:42 +02002624 outSoongDir := result.Config.SoongOutDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002625
2626 outputs := foo.AllOutputs()
2627 outputMap := make(map[string]bool)
2628 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002629 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002630 }
2631 for _, e := range test.expected {
2632 if _, exist := outputMap[e]; !exist {
2633 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
2634 }
2635 }
2636 })
2637 }
2638}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002639
2640func TestInstrumentationTargetOverridden(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002641 t.Parallel()
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002642 bp := `
2643 android_app {
2644 name: "foo",
2645 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002646 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002647 }
2648
2649 android_test {
2650 name: "bar",
2651 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002652 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002653 }
2654 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002655
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002656 result := android.GroupFixturePreparers(
2657 PrepareForTestWithJavaDefaultModules,
2658 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2659 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
2660 }),
2661 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002662
Colin Cross90607e92025-02-11 14:58:07 -08002663 bar := result.ModuleForTests(t, "bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002664 res := bar.Output("package-res.apk")
2665 aapt2Flags := res.Args["flags"]
2666 e := "--rename-instrumentation-target-package org.dandroid.bp"
2667 if !strings.Contains(aapt2Flags, e) {
2668 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
2669 }
2670}
Jaewoong Jung525443a2019-02-28 15:35:54 -08002671
2672func TestOverrideAndroidApp(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002673 t.Parallel()
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002674 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2675 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08002676 android_app {
2677 name: "foo",
2678 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07002679 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002680 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002681 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002682 }
2683
2684 override_android_app {
2685 name: "bar",
2686 base: "foo",
2687 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07002688 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002689 rotationMinSdkVersion: "32",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002690 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002691 }
2692
2693 android_app_certificate {
2694 name: "new_certificate",
2695 certificate: "cert/new_cert",
2696 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002697
2698 override_android_app {
2699 name: "baz",
2700 base: "foo",
2701 package_name: "org.dandroid.bp",
2702 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002703
2704 override_android_app {
2705 name: "baz_no_rename_resources",
2706 base: "foo",
2707 package_name: "org.dandroid.bp",
2708 rename_resources_package: false,
2709 }
2710
2711 android_app {
2712 name: "foo_no_rename_resources",
2713 srcs: ["a.java"],
2714 certificate: "expiredkey",
2715 overrides: ["qux"],
2716 rename_resources_package: false,
2717 sdk_version: "current",
2718 }
2719
2720 override_android_app {
2721 name: "baz_base_no_rename_resources",
2722 base: "foo_no_rename_resources",
2723 package_name: "org.dandroid.bp",
2724 }
2725
2726 override_android_app {
2727 name: "baz_override_base_rename_resources",
2728 base: "foo_no_rename_resources",
2729 package_name: "org.dandroid.bp",
2730 rename_resources_package: true,
2731 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08002732 `)
2733
2734 expectedVariants := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002735 name string
2736 moduleName string
2737 variantName string
2738 apkName string
2739 apkPath string
2740 certFlag string
2741 certSigningFlags string
2742 overrides []string
2743 packageFlag string
2744 renameResources bool
2745 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08002746 }{
2747 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002748 name: "foo",
2749 moduleName: "foo",
2750 variantName: "android_common",
Cole Faust6b7075f2024-12-17 10:42:42 -08002751 apkPath: "out/target/product/test_device/system/app/foo/foo.apk",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002752 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2753 certSigningFlags: "",
2754 overrides: []string{"qux"},
2755 packageFlag: "",
2756 renameResources: false,
2757 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002758 },
2759 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002760 name: "foo",
2761 moduleName: "bar",
2762 variantName: "android_common_bar",
Cole Faust6b7075f2024-12-17 10:42:42 -08002763 apkPath: "out/target/product/test_device/system/app/bar/bar.apk",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002764 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
2765 certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
2766 overrides: []string{"qux", "foo"},
2767 packageFlag: "",
2768 renameResources: false,
2769 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002770 },
2771 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002772 name: "foo",
2773 moduleName: "baz",
2774 variantName: "android_common_baz",
Cole Faust6b7075f2024-12-17 10:42:42 -08002775 apkPath: "out/target/product/test_device/system/app/baz/baz.apk",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002776 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2777 certSigningFlags: "",
2778 overrides: []string{"qux", "foo"},
2779 packageFlag: "org.dandroid.bp",
2780 renameResources: true,
2781 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002782 },
2783 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002784 name: "foo",
2785 moduleName: "baz_no_rename_resources",
2786 variantName: "android_common_baz_no_rename_resources",
Cole Faust6b7075f2024-12-17 10:42:42 -08002787 apkPath: "out/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002788 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2789 certSigningFlags: "",
2790 overrides: []string{"qux", "foo"},
2791 packageFlag: "org.dandroid.bp",
2792 renameResources: false,
2793 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002794 },
2795 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002796 name: "foo_no_rename_resources",
2797 moduleName: "baz_base_no_rename_resources",
2798 variantName: "android_common_baz_base_no_rename_resources",
Cole Faust6b7075f2024-12-17 10:42:42 -08002799 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 -04002800 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2801 certSigningFlags: "",
2802 overrides: []string{"qux", "foo_no_rename_resources"},
2803 packageFlag: "org.dandroid.bp",
2804 renameResources: false,
2805 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002806 },
2807 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002808 name: "foo_no_rename_resources",
2809 moduleName: "baz_override_base_rename_resources",
2810 variantName: "android_common_baz_override_base_rename_resources",
Cole Faust6b7075f2024-12-17 10:42:42 -08002811 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 -04002812 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2813 certSigningFlags: "",
2814 overrides: []string{"qux", "foo_no_rename_resources"},
2815 packageFlag: "org.dandroid.bp",
2816 renameResources: true,
2817 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002818 },
2819 }
2820 for _, expected := range expectedVariants {
Colin Cross90607e92025-02-11 14:58:07 -08002821 variant := result.ModuleForTests(t, expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002822
2823 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002824 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002825
2826 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08002827 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07002828 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002829 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07002830
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002831 // Check the cert signing flags
2832 certSigningFlags := signapk.Args["flags"]
2833 android.AssertStringEquals(t, "cert signing flags", expected.certSigningFlags, certSigningFlags)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002834
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002835 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08002836 mod := variant.Module().(*AndroidApp)
zhidoua2ce78f2022-02-17 02:33:12 +00002837 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002838
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002839 // Test Overridable property: Logging_parent
2840 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002841 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002842
Liz Kammer1d5983b2020-05-19 19:15:37 +00002843 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002844 res := variant.Output("package-res.apk")
2845 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00002846 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
2847 expectedPackage := expected.packageFlag
2848 if !expected.renameResources {
2849 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00002850 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002851 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002852 }
2853}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07002854
zhidoua2ce78f2022-02-17 02:33:12 +00002855func TestOverrideAndroidAppOverrides(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002856 t.Parallel()
zhidoua2ce78f2022-02-17 02:33:12 +00002857 ctx, _ := testJava(
2858 t, `
2859 android_app {
2860 name: "foo",
2861 srcs: ["a.java"],
2862 sdk_version: "current",
2863 overrides: ["qux"]
2864 }
2865
2866 android_app {
2867 name: "bar",
2868 srcs: ["b.java"],
2869 sdk_version: "current",
2870 overrides: ["foo"]
2871 }
2872
2873 override_android_app {
2874 name: "foo_override",
2875 base: "foo",
2876 overrides: ["bar"]
2877 }
2878 `)
2879
2880 expectedVariants := []struct {
2881 name string
2882 moduleName string
2883 variantName string
2884 overrides []string
2885 }{
2886 {
2887 name: "foo",
2888 moduleName: "foo",
2889 variantName: "android_common",
2890 overrides: []string{"qux"},
2891 },
2892 {
2893 name: "bar",
2894 moduleName: "bar",
2895 variantName: "android_common",
2896 overrides: []string{"foo"},
2897 },
2898 {
2899 name: "foo",
2900 moduleName: "foo_override",
2901 variantName: "android_common_foo_override",
2902 overrides: []string{"bar", "foo"},
2903 },
2904 }
2905 for _, expected := range expectedVariants {
Colin Cross90607e92025-02-11 14:58:07 -08002906 variant := ctx.ModuleForTests(t, expected.name, expected.variantName)
zhidoua2ce78f2022-02-17 02:33:12 +00002907
2908 // Check if the overrides field values are correctly aggregated.
2909 mod := variant.Module().(*AndroidApp)
2910 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2911 }
2912}
2913
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002914func TestOverrideAndroidAppWithPrebuilt(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002915 t.Parallel()
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002916 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2917 t, `
2918 android_app {
2919 name: "foo",
2920 srcs: ["a.java"],
2921 sdk_version: "current",
2922 }
2923
2924 override_android_app {
2925 name: "bar",
2926 base: "foo",
2927 }
2928
2929 android_app_import {
2930 name: "bar",
2931 prefer: true,
2932 apk: "bar.apk",
2933 presigned: true,
2934 }
2935 `)
2936
2937 // An app that has an override that also has a prebuilt should not be hidden.
Colin Cross90607e92025-02-11 14:58:07 -08002938 foo := result.ModuleForTests(t, "foo", "android_common")
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002939 if foo.Module().IsHideFromMake() {
2940 t.Errorf("expected foo to have HideFromMake false")
2941 }
2942
2943 // An override that also has a prebuilt should be hidden.
Colin Cross90607e92025-02-11 14:58:07 -08002944 barOverride := result.ModuleForTests(t, "foo", "android_common_bar")
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002945 if !barOverride.Module().IsHideFromMake() {
2946 t.Errorf("expected bar override variant of foo to have HideFromMake true")
2947 }
2948}
2949
Jooyung Han01d80d82022-01-08 12:16:32 +09002950func TestOverrideAndroidAppStem(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08002951 t.Parallel()
Jooyung Han01d80d82022-01-08 12:16:32 +09002952 ctx, _ := testJava(t, `
2953 android_app {
2954 name: "foo",
2955 srcs: ["a.java"],
2956 sdk_version: "current",
2957 }
2958 override_android_app {
2959 name: "bar",
2960 base: "foo",
2961 }
2962 override_android_app {
2963 name: "baz",
2964 base: "foo",
2965 stem: "baz_stem",
2966 }
2967 android_app {
2968 name: "foo2",
2969 srcs: ["a.java"],
2970 sdk_version: "current",
2971 stem: "foo2_stem",
2972 }
2973 override_android_app {
2974 name: "bar2",
2975 base: "foo2",
2976 }
2977 override_android_app {
2978 name: "baz2",
2979 base: "foo2",
2980 stem: "baz2_stem",
2981 }
2982 `)
2983 for _, expected := range []struct {
2984 moduleName string
2985 variantName string
2986 apkPath string
2987 }{
2988 {
2989 moduleName: "foo",
2990 variantName: "android_common",
Cole Faust6b7075f2024-12-17 10:42:42 -08002991 apkPath: "out/target/product/test_device/system/app/foo/foo.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09002992 },
2993 {
2994 moduleName: "foo",
2995 variantName: "android_common_bar",
Cole Faust6b7075f2024-12-17 10:42:42 -08002996 apkPath: "out/target/product/test_device/system/app/bar/bar.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09002997 },
2998 {
2999 moduleName: "foo",
3000 variantName: "android_common_baz",
Cole Faust6b7075f2024-12-17 10:42:42 -08003001 apkPath: "out/target/product/test_device/system/app/baz_stem/baz_stem.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09003002 },
3003 {
3004 moduleName: "foo2",
3005 variantName: "android_common",
Cole Faust6b7075f2024-12-17 10:42:42 -08003006 apkPath: "out/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09003007 },
3008 {
3009 moduleName: "foo2",
3010 variantName: "android_common_bar2",
3011 // Note that this may cause the duplicate output error.
Cole Faust6b7075f2024-12-17 10:42:42 -08003012 apkPath: "out/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09003013 },
3014 {
3015 moduleName: "foo2",
3016 variantName: "android_common_baz2",
Cole Faust6b7075f2024-12-17 10:42:42 -08003017 apkPath: "out/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
Jooyung Han01d80d82022-01-08 12:16:32 +09003018 },
3019 } {
Colin Cross90607e92025-02-11 14:58:07 -08003020 variant := ctx.ModuleForTests(t, expected.moduleName, expected.variantName)
Jooyung Han01d80d82022-01-08 12:16:32 +09003021 variant.Output(expected.apkPath)
3022 }
3023}
3024
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07003025func TestOverrideAndroidAppDependency(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003026 t.Parallel()
Jaewoong Jungf9a04432019-07-17 11:15:09 -07003027 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07003028 android_app {
3029 name: "foo",
3030 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003031 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07003032 }
3033
3034 override_android_app {
3035 name: "bar",
3036 base: "foo",
3037 package_name: "org.dandroid.bp",
3038 }
3039
3040 android_test {
3041 name: "baz",
3042 srcs: ["b.java"],
3043 instrumentation_for: "foo",
3044 }
3045
3046 android_test {
3047 name: "qux",
3048 srcs: ["b.java"],
3049 instrumentation_for: "bar",
3050 }
3051 `)
3052
3053 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Colin Cross90607e92025-02-11 14:58:07 -08003054 javac := ctx.ModuleForTests(t, "baz", "android_common").Rule("javac")
Colin Cross8ff4af32025-02-19 15:17:02 -08003055 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07003056 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
3057 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
3058 }
3059
3060 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Colin Cross90607e92025-02-11 14:58:07 -08003061 javac = ctx.ModuleForTests(t, "qux", "android_common").Rule("javac")
Colin Cross8ff4af32025-02-19 15:17:02 -08003062 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07003063 if !strings.Contains(javac.Args["classpath"], barTurbine) {
3064 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
3065 }
3066}
3067
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003068func TestOverrideAndroidTest(t *testing.T) {
3069 ctx, _ := testJava(t, `
3070 android_app {
3071 name: "foo",
3072 srcs: ["a.java"],
3073 package_name: "com.android.foo",
3074 sdk_version: "current",
3075 }
3076
3077 override_android_app {
3078 name: "bar",
3079 base: "foo",
3080 package_name: "com.android.bar",
3081 }
3082
3083 android_test {
3084 name: "foo_test",
3085 srcs: ["b.java"],
3086 instrumentation_for: "foo",
3087 }
3088
3089 override_android_test {
3090 name: "bar_test",
3091 base: "foo_test",
3092 package_name: "com.android.bar.test",
3093 instrumentation_for: "bar",
3094 instrumentation_target_package: "com.android.bar",
3095 }
3096 `)
3097
3098 expectedVariants := []struct {
3099 moduleName string
3100 variantName string
3101 apkPath string
3102 overrides []string
3103 targetVariant string
3104 packageFlag string
3105 targetPackageFlag string
3106 }{
3107 {
3108 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08003109 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003110 overrides: nil,
3111 targetVariant: "android_common",
3112 packageFlag: "",
3113 targetPackageFlag: "",
3114 },
3115 {
3116 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08003117 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003118 overrides: []string{"foo_test"},
3119 targetVariant: "android_common_bar",
3120 packageFlag: "com.android.bar.test",
3121 targetPackageFlag: "com.android.bar",
3122 },
3123 }
3124 for _, expected := range expectedVariants {
Colin Cross90607e92025-02-11 14:58:07 -08003125 variant := ctx.ModuleForTests(t, "foo_test", expected.variantName)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003126
3127 // Check the final apk name
Cole Faust6b7075f2024-12-17 10:42:42 -08003128 variant.Output("out" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003129
3130 // Check if the overrides field values are correctly aggregated.
3131 mod := variant.Module().(*AndroidTest)
zhidoua2ce78f2022-02-17 02:33:12 +00003132 if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003133 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
zhidoua2ce78f2022-02-17 02:33:12 +00003134 expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003135 }
3136
3137 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01003138 javac := variant.Rule("javac")
Colin Cross8ff4af32025-02-19 15:17:02 -08003139 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003140 if !strings.Contains(javac.Args["classpath"], turbine) {
3141 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
3142 }
3143
3144 // Check aapt2 flags.
3145 res := variant.Output("package-res.apk")
3146 aapt2Flags := res.Args["flags"]
3147 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00003148 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003149 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
3150 }
3151}
3152
Jaewoong Jung39982342020-01-14 10:27:18 -08003153func TestAndroidTest_FixTestConfig(t *testing.T) {
3154 ctx, _ := testJava(t, `
3155 android_app {
3156 name: "foo",
3157 srcs: ["a.java"],
3158 package_name: "com.android.foo",
3159 sdk_version: "current",
3160 }
3161
3162 android_test {
3163 name: "foo_test",
3164 srcs: ["b.java"],
3165 instrumentation_for: "foo",
3166 }
3167
3168 android_test {
3169 name: "bar_test",
3170 srcs: ["b.java"],
3171 package_name: "com.android.bar.test",
3172 instrumentation_for: "foo",
Seth Moorec6f4b532023-02-02 13:22:26 -08003173 mainline_package_name: "com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08003174 }
3175
3176 override_android_test {
3177 name: "baz_test",
3178 base: "foo_test",
3179 package_name: "com.android.baz.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08003180 mainline_package_name: "com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08003181 }
3182 `)
3183
3184 testCases := []struct {
3185 moduleName string
3186 variantName string
3187 expectedFlags []string
3188 }{
3189 {
3190 moduleName: "foo_test",
3191 variantName: "android_common",
3192 },
3193 {
3194 moduleName: "bar_test",
3195 variantName: "android_common",
3196 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003197 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003198 "--package-name com.android.bar.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08003199 "--mainline-package-name com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08003200 },
3201 },
3202 {
3203 moduleName: "foo_test",
3204 variantName: "android_common_baz_test",
3205 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003206 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003207 "--package-name com.android.baz.test",
3208 "--test-file-name baz_test.apk",
Seth Moorec6f4b532023-02-02 13:22:26 -08003209 "out/soong/.intermediates/foo_test/android_common_baz_test/test_config_fixer/AndroidTest.xml",
3210 "--mainline-package-name com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08003211 },
3212 },
3213 }
3214
3215 for _, test := range testCases {
Colin Cross90607e92025-02-11 14:58:07 -08003216 variant := ctx.ModuleForTests(t, test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01003217 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08003218
3219 if len(test.expectedFlags) > 0 {
3220 if params.Rule == nil {
3221 t.Errorf("test_config_fixer was expected to run, but didn't")
3222 } else {
3223 for _, flag := range test.expectedFlags {
3224 if !strings.Contains(params.RuleParams.Command, flag) {
3225 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
3226 }
3227 }
3228 }
3229 } else {
3230 if params.Rule != nil {
3231 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
3232 }
3233 }
Jaewoong Jung39982342020-01-14 10:27:18 -08003234 }
3235}
3236
Paul Duffin53a70a42022-01-11 14:35:55 +00003237func TestInstrumentationTargetPrebuilt(t *testing.T) {
3238 bp := `
3239 android_app_import {
3240 name: "foo",
3241 apk: "foo.apk",
3242 presigned: true,
3243 }
3244
3245 android_test {
3246 name: "bar",
3247 srcs: ["a.java"],
3248 instrumentation_for: "foo",
3249 sdk_version: "current",
3250 }
3251 `
3252
3253 android.GroupFixturePreparers(
3254 PrepareForTestWithJavaDefaultModules,
3255 ).ExtendWithErrorHandler(
3256 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
3257 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
3258 RunTestWithBp(t, bp)
3259}
3260
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003261func TestStl(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003262 t.Parallel()
Jaewoong Jungf9a04432019-07-17 11:15:09 -07003263 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003264 cc_library {
3265 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08003266 sdk_version: "current",
3267 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003268 }
3269
3270 android_test {
3271 name: "stl",
3272 jni_libs: ["libjni"],
3273 compile_multilib: "both",
3274 sdk_version: "current",
3275 stl: "c++_shared",
3276 }
3277
3278 android_test {
3279 name: "system",
3280 jni_libs: ["libjni"],
3281 compile_multilib: "both",
3282 sdk_version: "current",
3283 }
3284 `)
3285
3286 testCases := []struct {
3287 name string
3288 jnis []string
3289 }{
3290 {"stl",
3291 []string{
3292 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07003293 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003294 },
3295 },
3296 {"system",
3297 []string{
3298 "libjni.so",
3299 },
3300 },
3301 }
3302
3303 for _, test := range testCases {
3304 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003305 t.Parallel()
Colin Cross90607e92025-02-11 14:58:07 -08003306 app := ctx.ModuleForTests(t, test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07003307 jniLibZip := app.Output("jnilibs.zip")
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003308 var jnis []string
3309 args := strings.Fields(jniLibZip.Args["jarArgs"])
3310 for i := 0; i < len(args); i++ {
3311 if args[i] == "-f" {
3312 jnis = append(jnis, args[i+1])
3313 i += 1
3314 }
3315 }
3316 jnisJoined := strings.Join(jnis, " ")
3317 for _, jni := range test.jnis {
3318 if !strings.Contains(jnisJoined, jni) {
3319 t.Errorf("missing jni %q in %q", jni, jnis)
3320 }
3321 }
3322 })
3323 }
3324}
Colin Cross50ddcc42019-05-16 12:28:22 -07003325
3326func TestUsesLibraries(t *testing.T) {
3327 bp := `
3328 java_sdk_library {
3329 name: "foo",
3330 srcs: ["a.java"],
3331 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003332 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003333 }
3334
3335 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01003336 name: "qux",
3337 srcs: ["a.java"],
3338 api_packages: ["qux"],
3339 sdk_version: "current",
3340 }
3341
3342 java_sdk_library {
3343 name: "quuz",
3344 srcs: ["a.java"],
3345 api_packages: ["quuz"],
3346 sdk_version: "current",
3347 }
3348
3349 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003350 name: "fred",
3351 srcs: ["a.java"],
3352 api_packages: ["fred"],
3353 sdk_version: "current",
3354 }
3355
3356 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07003357 name: "bar",
3358 srcs: ["a.java"],
3359 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003360 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003361 }
3362
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01003363 java_sdk_library {
3364 name: "runtime-library",
3365 srcs: ["a.java"],
3366 sdk_version: "current",
3367 }
3368
3369 java_library {
3370 name: "static-runtime-helper",
3371 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00003372 libs: ["runtime-library.impl"],
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01003373 sdk_version: "current",
3374 }
3375
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003376 java_library {
3377 name: "runtime-required-x",
3378 srcs: ["a.java"],
3379 installable: true,
3380 sdk_version: "current",
3381 }
3382
3383 java_library {
3384 name: "runtime-optional-x",
3385 srcs: ["a.java"],
3386 installable: true,
3387 sdk_version: "current",
3388 }
3389
3390 android_library {
3391 name: "static-x",
3392 uses_libs: ["runtime-required-x"],
3393 optional_uses_libs: ["runtime-optional-x"],
3394 sdk_version: "current",
3395 }
3396
3397 java_library {
3398 name: "runtime-required-y",
3399 srcs: ["a.java"],
3400 installable: true,
3401 sdk_version: "current",
3402 }
3403
3404 java_library {
3405 name: "runtime-optional-y",
3406 srcs: ["a.java"],
3407 installable: true,
3408 sdk_version: "current",
3409 }
3410
3411 java_library {
3412 name: "static-y",
3413 srcs: ["a.java"],
3414 uses_libs: ["runtime-required-y"],
Jiakai Zhang36937082024-04-15 11:15:50 +00003415 optional_uses_libs: [
3416 "runtime-optional-y",
3417 "missing-lib-a",
3418 ],
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003419 sdk_version: "current",
3420 }
3421
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003422 // A library that has to use "provides_uses_lib", because:
3423 // - it is not an SDK library
3424 // - its library name is different from its module name
3425 java_library {
3426 name: "non-sdk-lib",
3427 provides_uses_lib: "com.non.sdk.lib",
3428 installable: true,
3429 srcs: ["a.java"],
3430 }
3431
Colin Cross50ddcc42019-05-16 12:28:22 -07003432 android_app {
3433 name: "app",
3434 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003435 libs: [
Jihoon Kang28c96572024-09-11 23:44:44 +00003436 "qux.impl",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003437 "quuz.stubs"
3438 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003439 static_libs: [
3440 "static-runtime-helper",
3441 // statically linked component libraries should not pull their SDK libraries,
3442 // so "fred" should not be added to class loader context
3443 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003444 "static-x",
3445 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003446 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003447 uses_libs: [
3448 "foo",
3449 "non-sdk-lib"
3450 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003451 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003452 optional_uses_libs: [
3453 "bar",
Jiakai Zhangf98da192024-04-15 11:15:41 +00003454 "missing-lib-b",
Colin Cross50ddcc42019-05-16 12:28:22 -07003455 ],
3456 }
3457
3458 android_app_import {
3459 name: "prebuilt",
3460 apk: "prebuilts/apk/app.apk",
3461 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003462 uses_libs: [
3463 "foo",
3464 "non-sdk-lib",
3465 "android.test.runner"
3466 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07003467 optional_uses_libs: [
3468 "bar",
Jiakai Zhangf98da192024-04-15 11:15:41 +00003469 "missing-lib-b",
Colin Cross50ddcc42019-05-16 12:28:22 -07003470 ],
3471 }
3472 `
3473
Paul Duffin71ae5942021-03-22 15:36:52 +00003474 result := android.GroupFixturePreparers(
3475 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003476 PrepareForTestWithJavaSdkLibraryFiles,
3477 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Jiakai Zhang48203e32023-06-02 23:42:21 +01003478 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3479 variables.BuildWarningBadOptionalUsesLibsAllowlist = []string{"app", "prebuilt"}
3480 }),
Paul Duffind234b412021-03-12 23:04:46 +00003481 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07003482
Colin Cross90607e92025-02-11 14:58:07 -08003483 app := result.ModuleForTests(t, "app", "android_common")
3484 prebuilt := result.ModuleForTests(t, "prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07003485
Paul Duffin859fe962020-05-15 10:20:31 +01003486 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003487 // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be
3488 // propagated from dependencies.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003489 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
Jiyong Parkd044bb42024-05-15 02:09:54 +09003490 expectManifestFixerArgs := `--extract-native-libs=true ` +
3491 `--uses-library foo ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003492 `--uses-library com.non.sdk.lib ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003493 `--uses-library qux ` +
3494 `--uses-library quuz ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003495 `--uses-library runtime-library ` +
3496 `--uses-library runtime-required-x ` +
3497 `--uses-library runtime-required-y ` +
3498 `--optional-uses-library bar ` +
3499 `--optional-uses-library runtime-optional-x ` +
3500 `--optional-uses-library runtime-optional-y`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003501 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01003502
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003503 // Test that all libraries are verified (library order matters).
3504 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
3505 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00003506 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003507 `--uses-library qux ` +
3508 `--uses-library quuz ` +
3509 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003510 `--uses-library runtime-required-x ` +
3511 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003512 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003513 `--optional-uses-library runtime-optional-x ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003514 `--optional-uses-library runtime-optional-y ` +
Jiakai Zhang36937082024-04-15 11:15:50 +00003515 `--missing-optional-uses-library missing-lib-b ` +
3516 `--missing-optional-uses-library missing-lib-a`
Paul Duffind234b412021-03-12 23:04:46 +00003517 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003518
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003519 // Test that all libraries are verified for an APK (library order matters).
3520 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00003521 verifyApkArgs := `--uses-library foo ` +
3522 `--uses-library com.non.sdk.lib ` +
3523 `--uses-library android.test.runner ` +
3524 `--optional-uses-library bar ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003525 `--missing-optional-uses-library missing-lib-b `
Paul Duffind234b412021-03-12 23:04:46 +00003526 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003527
Jiakai Zhanga4496782023-05-17 16:57:30 +01003528 // Test that necessary args are passed for constructing CLC in Ninja phase.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003529 cmd := app.Rule("dexpreopt").RuleParams.Command
Jiakai Zhanga4496782023-05-17 16:57:30 +01003530 android.AssertStringDoesContain(t, "dexpreopt app cmd context", cmd, "--context-json=")
3531 android.AssertStringDoesContain(t, "dexpreopt app cmd product_packages", cmd,
Spandan Das2069c3f2023-12-06 19:40:24 +00003532 "--product-packages=out/soong/.intermediates/app/android_common/dexpreopt/app/product_packages.txt")
Colin Cross50ddcc42019-05-16 12:28:22 -07003533}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003534
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003535func TestDexpreoptBcp(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003536 t.Parallel()
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003537 bp := `
3538 java_sdk_library {
3539 name: "foo",
3540 srcs: ["a.java"],
3541 api_packages: ["foo"],
3542 sdk_version: "current",
3543 }
3544
3545 java_sdk_library {
3546 name: "bar",
3547 srcs: ["a.java"],
3548 api_packages: ["bar"],
3549 permitted_packages: ["bar"],
3550 sdk_version: "current",
3551 }
3552
3553 android_app {
3554 name: "app",
3555 srcs: ["a.java"],
3556 sdk_version: "current",
3557 }
3558 `
3559
3560 testCases := []struct {
3561 name string
3562 with bool
3563 expect string
3564 }{
3565 {
3566 name: "with updatable bcp",
3567 with: true,
3568 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
3569 },
3570 {
3571 name: "without updatable bcp",
3572 with: false,
3573 expect: "/system/framework/foo.jar",
3574 },
3575 }
3576
3577 for _, test := range testCases {
3578 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003579 t.Parallel()
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003580 result := android.GroupFixturePreparers(
3581 prepareForJavaTest,
3582 PrepareForTestWithJavaSdkLibraryFiles,
3583 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
3584 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01003585 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003586 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
3587 ).RunTestWithBp(t, bp)
3588
Colin Cross90607e92025-02-11 14:58:07 -08003589 app := result.ModuleForTests(t, "app", "android_common")
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003590 cmd := app.Rule("dexpreopt").RuleParams.Command
3591 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
3592 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
3593 })
3594 }
3595}
3596
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003597func TestCodelessApp(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003598 t.Parallel()
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003599 testCases := []struct {
3600 name string
3601 bp string
3602 noCode bool
3603 }{
3604 {
3605 name: "normal",
3606 bp: `
3607 android_app {
3608 name: "foo",
3609 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003610 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003611 }
3612 `,
3613 noCode: false,
3614 },
3615 {
3616 name: "app without sources",
3617 bp: `
3618 android_app {
3619 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003620 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003621 }
3622 `,
3623 noCode: true,
3624 },
3625 {
3626 name: "app with libraries",
3627 bp: `
3628 android_app {
3629 name: "foo",
3630 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003631 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003632 }
3633
3634 java_library {
3635 name: "lib",
3636 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003637 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003638 }
3639 `,
3640 noCode: false,
3641 },
3642 {
3643 name: "app with sourceless libraries",
3644 bp: `
3645 android_app {
3646 name: "foo",
3647 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003648 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003649 }
3650
3651 java_library {
3652 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003653 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003654 }
3655 `,
3656 // TODO(jungjw): this should probably be true
3657 noCode: false,
3658 },
3659 }
3660
3661 for _, test := range testCases {
3662 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003663 t.Parallel()
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003664 ctx := testApp(t, test.bp)
3665
Colin Cross90607e92025-02-11 14:58:07 -08003666 foo := ctx.ModuleForTests(t, "foo", "android_common")
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003667 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3668 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
3669 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
3670 }
3671 })
3672 }
3673}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07003674
Colin Cross53a87f52019-06-25 13:35:30 -07003675func TestUncompressDex(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003676 t.Parallel()
Colin Cross53a87f52019-06-25 13:35:30 -07003677 testCases := []struct {
3678 name string
3679 bp string
3680
3681 uncompressedPlatform bool
3682 uncompressedUnbundled bool
3683 }{
3684 {
3685 name: "normal",
3686 bp: `
3687 android_app {
3688 name: "foo",
3689 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003690 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003691 }
3692 `,
3693 uncompressedPlatform: true,
3694 uncompressedUnbundled: false,
3695 },
3696 {
3697 name: "use_embedded_dex",
3698 bp: `
3699 android_app {
3700 name: "foo",
3701 use_embedded_dex: true,
3702 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003703 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003704 }
3705 `,
3706 uncompressedPlatform: true,
3707 uncompressedUnbundled: true,
3708 },
3709 {
3710 name: "privileged",
3711 bp: `
3712 android_app {
3713 name: "foo",
3714 privileged: true,
3715 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003716 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003717 }
3718 `,
3719 uncompressedPlatform: true,
3720 uncompressedUnbundled: true,
3721 },
David Srbeckye033cba2020-05-20 22:20:28 +01003722 {
3723 name: "normal_uncompress_dex_true",
3724 bp: `
3725 android_app {
3726 name: "foo",
3727 srcs: ["a.java"],
3728 sdk_version: "current",
3729 uncompress_dex: true,
3730 }
3731 `,
3732 uncompressedPlatform: true,
3733 uncompressedUnbundled: true,
3734 },
3735 {
3736 name: "normal_uncompress_dex_false",
3737 bp: `
3738 android_app {
3739 name: "foo",
3740 srcs: ["a.java"],
3741 sdk_version: "current",
3742 uncompress_dex: false,
3743 }
3744 `,
3745 uncompressedPlatform: false,
3746 uncompressedUnbundled: false,
3747 },
Colin Cross53a87f52019-06-25 13:35:30 -07003748 }
3749
3750 test := func(t *testing.T, bp string, want bool, unbundled bool) {
3751 t.Helper()
3752
Paul Duffin71ae5942021-03-22 15:36:52 +00003753 result := android.GroupFixturePreparers(
3754 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003755 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00003756 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3757 if unbundled {
3758 variables.Unbundled_build = proptools.BoolPtr(true)
3759 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
3760 }
3761 }),
3762 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07003763
Colin Cross90607e92025-02-11 14:58:07 -08003764 foo := result.ModuleForTests(t, "foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07003765 dex := foo.Rule("r8")
3766 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
3767 aligned := foo.MaybeRule("zipalign").Rule != nil
3768
Paul Duffincdb88a92021-03-14 00:36:50 +00003769 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07003770
Paul Duffincdb88a92021-03-14 00:36:50 +00003771 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07003772 }
3773
3774 for _, tt := range testCases {
3775 t.Run(tt.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003776 t.Parallel()
Colin Cross53a87f52019-06-25 13:35:30 -07003777 t.Run("platform", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003778 t.Parallel()
Colin Cross53a87f52019-06-25 13:35:30 -07003779 test(t, tt.bp, tt.uncompressedPlatform, false)
3780 })
3781 t.Run("unbundled", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003782 t.Parallel()
Colin Cross53a87f52019-06-25 13:35:30 -07003783 test(t, tt.bp, tt.uncompressedUnbundled, true)
3784 })
3785 })
3786 }
3787}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003788
3789func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
3790 if expectedValue != "" {
3791 expectedFlag := "--" + flagName + " " + expectedValue
3792 if !strings.Contains(aapt2Flags, expectedFlag) {
3793 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
3794 }
3795 } else {
3796 unexpectedFlag := "--" + flagName
3797 if strings.Contains(aapt2Flags, unexpectedFlag) {
3798 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
3799 }
3800 }
3801}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08003802
Cole Faust9a631312020-10-22 21:05:24 +00003803func TestExportedProguardFlagFiles(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003804 t.Parallel()
Cole Faust9a631312020-10-22 21:05:24 +00003805 ctx, _ := testJava(t, `
3806 android_app {
3807 name: "foo",
3808 sdk_version: "current",
Colin Crosscde55342024-03-27 14:11:51 -07003809 static_libs: [
3810 "lib1",
3811 "lib3",
3812 ],
Cole Faust9a631312020-10-22 21:05:24 +00003813 }
3814
3815 android_library {
3816 name: "lib1",
3817 sdk_version: "current",
3818 optimize: {
3819 proguard_flags_files: ["lib1proguard.cfg"],
Colin Crosscde55342024-03-27 14:11:51 -07003820 },
3821 static_libs: ["lib2"],
3822 }
3823
3824 android_library {
3825 name: "lib2",
3826 sdk_version: "current",
3827 optimize: {
3828 proguard_flags_files: ["lib2proguard.cfg"],
Cole Faust9a631312020-10-22 21:05:24 +00003829 }
3830 }
Colin Crosscde55342024-03-27 14:11:51 -07003831
3832 android_library_import {
3833 name: "lib3",
3834 sdk_version: "current",
3835 aars: ["lib3.aar"],
3836 static_libs: ["lib4"],
3837 }
3838
3839 android_library {
3840 name: "lib4",
3841 sdk_version: "current",
3842 optimize: {
3843 proguard_flags_files: ["lib4proguard.cfg"],
3844 }
3845 }
3846
3847
Cole Faust9a631312020-10-22 21:05:24 +00003848 `)
3849
Colin Cross90607e92025-02-11 14:58:07 -08003850 m := ctx.ModuleForTests(t, "foo", "android_common")
Colin Crosscde55342024-03-27 14:11:51 -07003851 r8 := m.Rule("java.r8")
3852 implicits := r8.Implicits.RelativeToTop().Strings()
3853 android.AssertStringListContains(t, "r8 implicits", implicits, "lib1proguard.cfg")
3854 android.AssertStringListContains(t, "r8 implicits", implicits, "lib2proguard.cfg")
3855 android.AssertStringListContains(t, "r8 implicits", implicits, "lib4proguard.cfg")
3856 android.AssertStringListContains(t, "r8 implicits", implicits, "out/soong/.intermediates/lib3/android_common/aar/proguard.txt")
Cole Faust9a631312020-10-22 21:05:24 +00003857
Colin Crosscde55342024-03-27 14:11:51 -07003858 flags := r8.Args["r8Flags"]
3859 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib1proguard.cfg")
3860 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib2proguard.cfg")
3861 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib4proguard.cfg")
3862 android.AssertStringDoesContain(t, "r8 flags", flags, "-include out/soong/.intermediates/lib3/android_common/aar/proguard.txt")
Cole Faust9a631312020-10-22 21:05:24 +00003863}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003864
3865func TestTargetSdkVersionManifestFixer(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003866 t.Parallel()
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003867 platform_sdk_codename := "Tiramisu"
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003868 platform_sdk_version := 33
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003869 testCases := []struct {
3870 name string
3871 targetSdkVersionInBp string
3872 targetSdkVersionExpected string
3873 unbundledBuild bool
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003874 platformSdkFinal bool
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003875 }{
3876 {
3877 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
3878 targetSdkVersionInBp: "30",
3879 targetSdkVersionExpected: "30",
3880 unbundledBuild: false,
3881 },
3882 {
3883 name: "Unbundled build: Android.bp has targetSdkVersion",
3884 targetSdkVersionInBp: "30",
3885 targetSdkVersionExpected: "30",
3886 unbundledBuild: true,
3887 },
3888 {
3889 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3890 targetSdkVersionInBp: platform_sdk_codename,
3891 targetSdkVersionExpected: platform_sdk_codename,
3892 unbundledBuild: false,
3893 },
3894 {
3895 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3896 targetSdkVersionInBp: platform_sdk_codename,
3897 targetSdkVersionExpected: "10000",
3898 unbundledBuild: true,
3899 },
3900
3901 {
3902 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
3903 targetSdkVersionExpected: platform_sdk_codename,
3904 unbundledBuild: false,
3905 },
3906 {
3907 name: "Unbundled build: Android.bp has no targetSdkVersion",
3908 targetSdkVersionExpected: "10000",
3909 unbundledBuild: true,
3910 },
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003911 {
3912 name: "Bundled build in REL branches",
3913 targetSdkVersionExpected: "33",
3914 unbundledBuild: false,
3915 platformSdkFinal: true,
3916 },
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003917 }
3918 for _, testCase := range testCases {
Colin Cross844cb6a2025-01-29 15:53:21 -08003919 t.Run(testCase.name, func(t *testing.T) {
3920 t.Parallel()
3921 targetSdkVersionTemplate := ""
3922 if testCase.targetSdkVersionInBp != "" {
3923 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, testCase.targetSdkVersionInBp)
3924 }
3925 bp := fmt.Sprintf(`
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003926 android_app {
3927 name: "foo",
3928 sdk_version: "current",
Spandan Dasca70fc42023-03-01 23:38:49 +00003929 %s
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003930 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003931 `, targetSdkVersionTemplate)
Colin Cross844cb6a2025-01-29 15:53:21 -08003932 fixture := android.GroupFixturePreparers(
3933 prepareForJavaTest,
3934 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3935 if testCase.platformSdkFinal {
3936 variables.Platform_sdk_final = proptools.BoolPtr(true)
3937 }
3938 // explicitly set platform_sdk_codename to make the test deterministic
3939 variables.Platform_sdk_codename = &platform_sdk_codename
3940 variables.Platform_sdk_version = &platform_sdk_version
3941 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3942 // create a non-empty list if unbundledBuild==true
3943 if testCase.unbundledBuild {
3944 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3945 }
3946 }),
3947 )
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003948
Colin Cross844cb6a2025-01-29 15:53:21 -08003949 result := fixture.RunTestWithBp(t, bp)
Colin Cross90607e92025-02-11 14:58:07 -08003950 foo := result.ModuleForTests(t, "foo", "android_common")
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003951
Colin Cross844cb6a2025-01-29 15:53:21 -08003952 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3953 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3954 })
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003955 }
3956}
Colin Cross412436f2022-04-07 17:40:07 -07003957
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003958func TestDefaultAppTargetSdkVersionForUpdatableModules(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08003959 t.Parallel()
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003960 platform_sdk_codename := "Tiramisu"
3961 platform_sdk_version := 33
3962 testCases := []struct {
3963 name string
3964 platform_sdk_final bool
3965 targetSdkVersionInBp *string
3966 targetSdkVersionExpected *string
3967 updatable bool
3968 }{
3969 {
3970 name: "Non-Updatable Module: Android.bp has older targetSdkVersion",
3971 targetSdkVersionInBp: proptools.StringPtr("29"),
3972 targetSdkVersionExpected: proptools.StringPtr("29"),
3973 updatable: false,
3974 },
3975 {
3976 name: "Updatable Module: Android.bp has older targetSdkVersion",
3977 targetSdkVersionInBp: proptools.StringPtr("30"),
3978 targetSdkVersionExpected: proptools.StringPtr("30"),
3979 updatable: true,
3980 },
3981 {
3982 name: "Updatable Module: Android.bp has no targetSdkVersion",
3983 targetSdkVersionExpected: proptools.StringPtr("10000"),
3984 updatable: true,
3985 },
3986 {
3987 name: "[SDK finalised] Non-Updatable Module: Android.bp has older targetSdkVersion",
3988 platform_sdk_final: true,
3989 targetSdkVersionInBp: proptools.StringPtr("30"),
3990 targetSdkVersionExpected: proptools.StringPtr("30"),
3991 updatable: false,
3992 },
3993 {
3994 name: "[SDK finalised] Updatable Module: Android.bp has older targetSdkVersion",
3995 platform_sdk_final: true,
3996 targetSdkVersionInBp: proptools.StringPtr("30"),
3997 targetSdkVersionExpected: proptools.StringPtr("30"),
3998 updatable: true,
3999 },
4000 {
4001 name: "[SDK finalised] Updatable Module: Android.bp has targetSdkVersion as platform sdk codename",
4002 platform_sdk_final: true,
4003 targetSdkVersionInBp: proptools.StringPtr(platform_sdk_codename),
4004 targetSdkVersionExpected: proptools.StringPtr("33"),
4005 updatable: true,
4006 },
4007 {
4008 name: "[SDK finalised] Updatable Module: Android.bp has no targetSdkVersion",
4009 platform_sdk_final: true,
4010 targetSdkVersionExpected: proptools.StringPtr("33"),
4011 updatable: true,
4012 },
4013 }
4014 for _, testCase := range testCases {
Colin Cross844cb6a2025-01-29 15:53:21 -08004015 t.Run(testCase.name, func(t *testing.T) {
4016 t.Parallel()
4017 targetSdkVersionTemplate := ""
4018 if testCase.targetSdkVersionInBp != nil {
4019 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, *testCase.targetSdkVersionInBp)
4020 }
4021 bp := fmt.Sprintf(`
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004022 android_app {
4023 name: "foo",
4024 sdk_version: "current",
4025 min_sdk_version: "29",
Spandan Dasca70fc42023-03-01 23:38:49 +00004026 %s
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004027 updatable: %t,
4028 enforce_default_target_sdk_version: %t
4029 }
Spandan Dasca70fc42023-03-01 23:38:49 +00004030 `, targetSdkVersionTemplate, testCase.updatable, testCase.updatable) // enforce default target sdk version if app is updatable
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004031
Colin Cross844cb6a2025-01-29 15:53:21 -08004032 fixture := android.GroupFixturePreparers(
4033 PrepareForTestWithJavaDefaultModules,
4034 android.PrepareForTestWithAllowMissingDependencies,
4035 android.PrepareForTestWithAndroidMk,
4036 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4037 // explicitly set following platform variables to make the test deterministic
4038 variables.Platform_sdk_final = &testCase.platform_sdk_final
4039 variables.Platform_sdk_version = &platform_sdk_version
4040 variables.Platform_sdk_codename = &platform_sdk_codename
4041 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
4042 variables.Unbundled_build = proptools.BoolPtr(true)
4043 variables.Unbundled_build_apps = []string{"sampleModule"}
4044 }),
4045 )
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004046
Colin Cross844cb6a2025-01-29 15:53:21 -08004047 result := fixture.RunTestWithBp(t, bp)
Colin Cross90607e92025-02-11 14:58:07 -08004048 foo := result.ModuleForTests(t, "foo", "android_common")
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004049
Colin Cross844cb6a2025-01-29 15:53:21 -08004050 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4051 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+*testCase.targetSdkVersionExpected)
4052 })
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004053 }
4054}
4055
4056func TestEnforceDefaultAppTargetSdkVersionFlag(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004057 t.Parallel()
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004058 platform_sdk_codename := "Tiramisu"
4059 platform_sdk_version := 33
4060 testCases := []struct {
4061 name string
4062 enforceDefaultTargetSdkVersion bool
4063 expectedError string
4064 platform_sdk_final bool
4065 targetSdkVersionInBp string
4066 targetSdkVersionExpected string
4067 updatable bool
4068 }{
4069 {
4070 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
4071 enforceDefaultTargetSdkVersion: false,
4072 targetSdkVersionInBp: "29",
4073 targetSdkVersionExpected: "29",
4074 updatable: false,
4075 },
4076 {
4077 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4078 enforceDefaultTargetSdkVersion: true,
4079 platform_sdk_final: true,
4080 targetSdkVersionInBp: "current",
4081 targetSdkVersionExpected: "33",
4082 updatable: true,
4083 },
4084 {
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004085 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004086 enforceDefaultTargetSdkVersion: true,
4087 platform_sdk_final: false,
4088 targetSdkVersionInBp: "current",
4089 targetSdkVersionExpected: "10000",
4090 updatable: false,
4091 },
4092 {
4093 name: "Not enforcing Target SDK Version for Updatable app",
4094 enforceDefaultTargetSdkVersion: false,
4095 expectedError: "Updatable apps must enforce default target sdk version",
4096 targetSdkVersionInBp: "29",
4097 targetSdkVersionExpected: "29",
4098 updatable: true,
4099 },
4100 }
4101 for _, testCase := range testCases {
Colin Cross844cb6a2025-01-29 15:53:21 -08004102 t.Run(testCase.name, func(t *testing.T) {
4103 t.Parallel()
4104 errExpected := testCase.expectedError != ""
4105 bp := fmt.Sprintf(`
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004106 android_app {
4107 name: "foo",
4108 enforce_default_target_sdk_version: %t,
4109 sdk_version: "current",
4110 min_sdk_version: "29",
4111 target_sdk_version: "%v",
4112 updatable: %t
4113 }
4114 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp, testCase.updatable)
4115
Colin Cross844cb6a2025-01-29 15:53:21 -08004116 fixture := android.GroupFixturePreparers(
4117 PrepareForTestWithJavaDefaultModules,
4118 android.PrepareForTestWithAllowMissingDependencies,
4119 android.PrepareForTestWithAndroidMk,
4120 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4121 // explicitly set following platform variables to make the test deterministic
4122 variables.Platform_sdk_final = &testCase.platform_sdk_final
4123 variables.Platform_sdk_version = &platform_sdk_version
4124 variables.Platform_sdk_codename = &platform_sdk_codename
4125 variables.Unbundled_build = proptools.BoolPtr(true)
4126 variables.Unbundled_build_apps = []string{"sampleModule"}
4127 }),
4128 )
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004129
Colin Cross844cb6a2025-01-29 15:53:21 -08004130 errorHandler := android.FixtureExpectsNoErrors
4131 if errExpected {
4132 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
4133 }
4134 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004135
Colin Cross844cb6a2025-01-29 15:53:21 -08004136 if !errExpected {
Colin Cross90607e92025-02-11 14:58:07 -08004137 foo := result.ModuleForTests(t, "foo", "android_common")
Colin Cross844cb6a2025-01-29 15:53:21 -08004138 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4139 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4140 }
4141 })
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004142 }
4143}
4144
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004145func TestEnforceDefaultAppTargetSdkVersionFlagForTests(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004146 t.Parallel()
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004147 platform_sdk_codename := "Tiramisu"
4148 platform_sdk_version := 33
4149 testCases := []struct {
4150 name string
4151 enforceDefaultTargetSdkVersion bool
4152 expectedError string
4153 platform_sdk_final bool
4154 targetSdkVersionInBp string
4155 targetSdkVersionExpected string
4156 }{
4157 {
4158 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
4159 enforceDefaultTargetSdkVersion: false,
4160 targetSdkVersionInBp: "29",
4161 targetSdkVersionExpected: "29",
4162 },
4163 {
4164 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4165 enforceDefaultTargetSdkVersion: true,
4166 platform_sdk_final: true,
4167 targetSdkVersionInBp: "current",
4168 targetSdkVersionExpected: "33",
4169 },
4170 {
4171 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4172 enforceDefaultTargetSdkVersion: true,
4173 platform_sdk_final: false,
4174 targetSdkVersionInBp: "current",
4175 targetSdkVersionExpected: "10000",
4176 },
4177 }
4178 for _, testCase := range testCases {
Colin Cross844cb6a2025-01-29 15:53:21 -08004179 t.Run(testCase.name, func(t *testing.T) {
4180 t.Parallel()
4181 errExpected := testCase.expectedError != ""
4182 bp := fmt.Sprintf(`
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004183 android_test {
4184 name: "foo",
4185 enforce_default_target_sdk_version: %t,
4186 min_sdk_version: "29",
4187 target_sdk_version: "%v",
4188 }
4189 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp)
4190
Colin Cross844cb6a2025-01-29 15:53:21 -08004191 fixture := android.GroupFixturePreparers(
4192 PrepareForTestWithJavaDefaultModules,
4193 android.PrepareForTestWithAllowMissingDependencies,
4194 android.PrepareForTestWithAndroidMk,
4195 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4196 // explicitly set following platform variables to make the test deterministic
4197 variables.Platform_sdk_final = &testCase.platform_sdk_final
4198 variables.Platform_sdk_version = &platform_sdk_version
4199 variables.Platform_sdk_codename = &platform_sdk_codename
4200 variables.Unbundled_build = proptools.BoolPtr(true)
4201 variables.Unbundled_build_apps = []string{"sampleModule"}
4202 }),
4203 )
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004204
Colin Cross844cb6a2025-01-29 15:53:21 -08004205 errorHandler := android.FixtureExpectsNoErrors
4206 if errExpected {
4207 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
4208 }
4209 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004210
Colin Cross844cb6a2025-01-29 15:53:21 -08004211 if !errExpected {
Colin Cross90607e92025-02-11 14:58:07 -08004212 foo := result.ModuleForTests(t, "foo", "android_common")
Colin Cross844cb6a2025-01-29 15:53:21 -08004213 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4214 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4215 }
4216 })
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004217 }
4218}
4219
Colin Cross412436f2022-04-07 17:40:07 -07004220func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004221 t.Parallel()
Colin Cross412436f2022-04-07 17:40:07 -07004222 result := android.GroupFixturePreparers(
4223 PrepareForTestWithJavaDefaultModules,
4224 android.PrepareForTestWithAllowMissingDependencies,
4225 android.PrepareForTestWithAndroidMk,
4226 ).RunTestWithBp(t, `
4227 android_app {
4228 name: "foo",
4229 srcs: ["a.java"],
4230 certificate: ":missing_certificate",
4231 sdk_version: "current",
Zyan Wub7550aa2023-05-18 15:46:31 +08004232 }
4233
4234 android_app {
4235 name: "bar",
4236 srcs: ["a.java"],
4237 certificate: ":missing_certificate",
4238 product_specific: true,
4239 sdk_version: "current",
Colin Cross412436f2022-04-07 17:40:07 -07004240 }`)
4241
Colin Cross90607e92025-02-11 14:58:07 -08004242 foo := result.ModuleForTests(t, "foo", "android_common")
Colin Cross412436f2022-04-07 17:40:07 -07004243 fooApk := foo.Output("foo.apk")
4244 if fooApk.Rule != android.ErrorRule {
4245 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
4246 }
4247 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
4248}
Sam Delmerico82602492022-06-10 17:05:42 +00004249
4250func TestAppIncludesJniPackages(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004251 t.Parallel()
Sam Delmerico82602492022-06-10 17:05:42 +00004252 ctx := android.GroupFixturePreparers(
4253 PrepareForTestWithJavaDefaultModules,
4254 ).RunTestWithBp(t, `
4255 android_library_import {
4256 name: "aary-nodeps",
4257 aars: ["aary.aar"],
4258 extract_jni: true,
4259 }
4260
4261 android_library {
4262 name: "aary-lib",
4263 sdk_version: "current",
4264 min_sdk_version: "21",
4265 static_libs: ["aary-nodeps"],
4266 }
4267
4268 android_app {
4269 name: "aary-lib-dep",
4270 sdk_version: "current",
4271 min_sdk_version: "21",
4272 manifest: "AndroidManifest.xml",
4273 static_libs: ["aary-lib"],
4274 use_embedded_native_libs: true,
4275 }
4276
4277 android_app {
4278 name: "aary-import-dep",
4279 sdk_version: "current",
4280 min_sdk_version: "21",
4281 manifest: "AndroidManifest.xml",
4282 static_libs: ["aary-nodeps"],
4283 use_embedded_native_libs: true,
4284 }
4285
4286 android_app {
4287 name: "aary-no-use-embedded",
4288 sdk_version: "current",
4289 min_sdk_version: "21",
4290 manifest: "AndroidManifest.xml",
4291 static_libs: ["aary-nodeps"],
4292 }`)
4293
4294 testCases := []struct {
4295 name string
4296 hasPackage bool
4297 }{
4298 {
4299 name: "aary-import-dep",
4300 hasPackage: true,
4301 },
4302 {
4303 name: "aary-lib-dep",
4304 hasPackage: true,
4305 },
4306 {
4307 name: "aary-no-use-embedded",
Jiyong Parkd044bb42024-05-15 02:09:54 +09004308 hasPackage: false,
Sam Delmerico82602492022-06-10 17:05:42 +00004309 },
4310 }
4311
4312 for _, tc := range testCases {
4313 t.Run(tc.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004314 t.Parallel()
Colin Cross90607e92025-02-11 14:58:07 -08004315 app := ctx.ModuleForTests(t, tc.name, "android_common")
Sam Delmerico82602492022-06-10 17:05:42 +00004316
4317 outputFile := "jnilibs.zip"
4318 jniOutputLibZip := app.MaybeOutput(outputFile)
4319 if jniOutputLibZip.Rule == nil && !tc.hasPackage {
4320 return
4321 }
4322
4323 jniPackage := "arm64-v8a_jni.zip"
4324 inputs := jniOutputLibZip.Inputs
4325 foundPackage := false
4326 for i := 0; i < len(inputs); i++ {
4327 if strings.Contains(inputs[i].String(), jniPackage) {
4328 foundPackage = true
4329 }
4330 }
4331 if foundPackage != tc.hasPackage {
4332 t.Errorf("expected to find %v in %v inputs; inputs = %v", jniPackage, outputFile, inputs)
4333 }
4334 })
4335 }
4336}
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004337
4338func TestTargetSdkVersionMtsTests(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004339 t.Parallel()
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004340 platformSdkCodename := "Tiramisu"
4341 android_test := "android_test"
4342 android_test_helper_app := "android_test_helper_app"
4343 bpTemplate := `
4344 %v {
4345 name: "mytest",
Spandan Dasb0410872024-06-25 03:30:03 +00004346 min_sdk_version: "34",
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004347 target_sdk_version: "%v",
4348 test_suites: ["othersuite", "%v"],
4349 }
4350 `
4351 testCases := []struct {
4352 desc string
4353 moduleType string
4354 targetSdkVersionInBp string
4355 targetSdkVersionExpected string
4356 testSuites string
4357 }{
4358 {
4359 desc: "Non-MTS android_test_apps targeting current should not be upgraded to 10000",
4360 moduleType: android_test,
4361 targetSdkVersionInBp: "current",
4362 targetSdkVersionExpected: platformSdkCodename,
4363 testSuites: "non-mts-suite",
4364 },
4365 {
4366 desc: "MTS android_test_apps targeting released sdks should not be upgraded to 10000",
4367 moduleType: android_test,
4368 targetSdkVersionInBp: "29",
4369 targetSdkVersionExpected: "29",
4370 testSuites: "mts-suite",
4371 },
4372 {
4373 desc: "MTS android_test_apps targeting current should be upgraded to 10000",
4374 moduleType: android_test,
4375 targetSdkVersionInBp: "current",
4376 targetSdkVersionExpected: "10000",
4377 testSuites: "mts-suite",
4378 },
4379 {
4380 desc: "MTS android_test_helper_apps targeting current should be upgraded to 10000",
4381 moduleType: android_test_helper_app,
4382 targetSdkVersionInBp: "current",
4383 targetSdkVersionExpected: "10000",
4384 testSuites: "mts-suite",
4385 },
4386 }
4387 fixture := android.GroupFixturePreparers(
4388 prepareForJavaTest,
4389 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4390 variables.Platform_sdk_codename = &platformSdkCodename
4391 variables.Platform_version_active_codenames = []string{platformSdkCodename}
4392 }),
4393 )
4394 for _, testCase := range testCases {
Colin Cross844cb6a2025-01-29 15:53:21 -08004395 t.Run(testCase.desc, func(t *testing.T) {
4396 t.Parallel()
4397 result := fixture.RunTestWithBp(t, fmt.Sprintf(bpTemplate, testCase.moduleType, testCase.targetSdkVersionInBp, testCase.testSuites))
Colin Cross90607e92025-02-11 14:58:07 -08004398 mytest := result.ModuleForTests(t, "mytest", "android_common")
Colin Cross844cb6a2025-01-29 15:53:21 -08004399 manifestFixerArgs := mytest.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4400 android.AssertStringDoesContain(t, testCase.desc, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4401 })
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004402 }
4403}
Andrei Onea580636b2022-08-17 16:53:46 +00004404
4405func TestPrivappAllowlist(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004406 t.Parallel()
Andrei Onea580636b2022-08-17 16:53:46 +00004407 testJavaError(t, "privileged must be set in order to use privapp_allowlist", `
4408 android_app {
4409 name: "foo",
4410 srcs: ["a.java"],
4411 privapp_allowlist: "perms.xml",
4412 }
4413 `)
4414
4415 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
4416 t,
4417 `
4418 android_app {
4419 name: "foo",
4420 srcs: ["a.java"],
Sam Delmerico15809f82023-05-15 17:21:47 -04004421 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
Andrei Onea580636b2022-08-17 16:53:46 +00004422 privileged: true,
Andrei Onea580636b2022-08-17 16:53:46 +00004423 sdk_version: "current",
4424 }
4425 override_android_app {
4426 name: "bar",
4427 base: "foo",
4428 package_name: "com.google.android.foo",
4429 }
4430 `,
4431 )
Colin Cross90607e92025-02-11 14:58:07 -08004432 app := result.ModuleForTests(t, "foo", "android_common")
4433 overrideApp := result.ModuleForTests(t, "foo", "android_common_bar")
Andrei Onea580636b2022-08-17 16:53:46 +00004434
Sam Delmerico15809f82023-05-15 17:21:47 -04004435 // verify that privapp allowlist is created for override apps
Andrei Onea580636b2022-08-17 16:53:46 +00004436 overrideApp.Output("out/soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml")
Sam Delmerico15809f82023-05-15 17:21:47 -04004437 expectedAllowlistInput := "privapp_allowlist_com.android.foo.xml"
4438 overrideActualAllowlistInput := overrideApp.Rule("modifyAllowlist").Input.String()
4439 if expectedAllowlistInput != overrideActualAllowlistInput {
4440 t.Errorf("expected override allowlist to be %q; got %q", expectedAllowlistInput, overrideActualAllowlistInput)
Andrei Onea580636b2022-08-17 16:53:46 +00004441 }
4442
4443 // verify that permissions are copied to device
Cole Faust6b7075f2024-12-17 10:42:42 -08004444 app.Output("out/target/product/test_device/system/etc/permissions/foo.xml")
4445 overrideApp.Output("out/target/product/test_device/system/etc/permissions/bar.xml")
Andrei Onea580636b2022-08-17 16:53:46 +00004446}
Sam Delmericob1daccd2023-05-25 14:45:30 -04004447
4448func TestPrivappAllowlistAndroidMk(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004449 t.Parallel()
Sam Delmericob1daccd2023-05-25 14:45:30 -04004450 result := android.GroupFixturePreparers(
4451 PrepareForTestWithJavaDefaultModules,
4452 android.PrepareForTestWithAndroidMk,
4453 ).RunTestWithBp(
4454 t,
4455 `
4456 android_app {
4457 name: "foo",
4458 srcs: ["a.java"],
4459 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
4460 privileged: true,
4461 sdk_version: "current",
4462 }
4463 override_android_app {
4464 name: "bar",
4465 base: "foo",
4466 package_name: "com.google.android.foo",
4467 }
4468 `,
4469 )
Colin Cross90607e92025-02-11 14:58:07 -08004470 baseApp := result.ModuleForTests(t, "foo", "android_common")
4471 overrideApp := result.ModuleForTests(t, "foo", "android_common_bar")
Sam Delmericob1daccd2023-05-25 14:45:30 -04004472
4473 baseAndroidApp := baseApp.Module().(*AndroidApp)
4474 baseEntries := android.AndroidMkEntriesForTest(t, result.TestContext, baseAndroidApp)[0]
4475 android.AssertStringMatches(
4476 t,
4477 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find foo.apk",
4478 baseEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4479 "\\S+foo.apk",
4480 )
4481 android.AssertStringMatches(
4482 t,
4483 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include foo.apk",
4484 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4485 "\\S+foo.apk",
4486 )
4487 android.AssertStringMatches(
4488 t,
4489 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4490 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4491 "\\S+foo.apk:\\S+/target/product/test_device/system/priv-app/foo/foo.apk",
4492 )
4493 android.AssertStringMatches(
4494 t,
4495 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4496 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004497 "privapp_allowlist_com.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/foo.xml",
Sam Delmericob1daccd2023-05-25 14:45:30 -04004498 )
4499
4500 overrideAndroidApp := overrideApp.Module().(*AndroidApp)
4501 overrideEntries := android.AndroidMkEntriesForTest(t, result.TestContext, overrideAndroidApp)[0]
4502 android.AssertStringMatches(
4503 t,
4504 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find bar.apk",
4505 overrideEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4506 "\\S+bar.apk",
4507 )
4508 android.AssertStringMatches(
4509 t,
4510 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include bar.apk",
4511 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4512 "\\S+bar.apk",
4513 )
4514 android.AssertStringMatches(
4515 t,
4516 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4517 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4518 "\\S+bar.apk:\\S+/target/product/test_device/system/priv-app/bar/bar.apk",
4519 )
4520 android.AssertStringMatches(
4521 t,
4522 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4523 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004524 "\\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 -04004525 )
4526}
Sam Delmerico0e0d96e2023-08-18 22:43:28 +00004527
Jihoon Kang84b25892023-12-01 22:01:06 +00004528func TestAppFlagsPackages(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004529 t.Parallel()
Jihoon Kang98ea8362024-07-16 18:20:03 +00004530 ctx := android.GroupFixturePreparers(
4531 prepareForJavaTest,
4532 android.FixtureMergeMockFs(
4533 map[string][]byte{
4534 "res/layout/layout.xml": nil,
4535 "res/values/strings.xml": nil,
4536 "res/values-en-rUS/strings.xml": nil,
4537 },
4538 ),
4539 ).RunTestWithBp(t, `
Jihoon Kang84b25892023-12-01 22:01:06 +00004540 android_app {
4541 name: "foo",
4542 srcs: ["a.java"],
4543 sdk_version: "current",
4544 flags_packages: [
4545 "bar",
4546 "baz",
4547 ],
4548 }
4549 aconfig_declarations {
4550 name: "bar",
Dennis Shen4e7773d2024-01-05 19:06:50 +00004551 package: "com.example.package.bar",
Yu Liu315a53c2024-04-24 16:41:57 +00004552 container: "com.android.foo",
Jihoon Kang84b25892023-12-01 22:01:06 +00004553 srcs: [
4554 "bar.aconfig",
4555 ],
4556 }
4557 aconfig_declarations {
4558 name: "baz",
Dennis Shen4e7773d2024-01-05 19:06:50 +00004559 package: "com.example.package.baz",
Yu Liu315a53c2024-04-24 16:41:57 +00004560 container: "com.android.foo",
Jihoon Kang84b25892023-12-01 22:01:06 +00004561 srcs: [
4562 "baz.aconfig",
4563 ],
4564 }
4565 `)
4566
Colin Cross90607e92025-02-11 14:58:07 -08004567 foo := ctx.ModuleForTests(t, "foo", "android_common")
Jihoon Kang84b25892023-12-01 22:01:06 +00004568
4569 // android_app module depends on aconfig_declarations listed in flags_packages
4570 android.AssertBoolEquals(t, "foo expected to depend on bar", true,
Jihoon Kang98ea8362024-07-16 18:20:03 +00004571 CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "bar"))
Jihoon Kang84b25892023-12-01 22:01:06 +00004572
4573 android.AssertBoolEquals(t, "foo expected to depend on baz", true,
Jihoon Kang98ea8362024-07-16 18:20:03 +00004574 CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "baz"))
Jihoon Kang84b25892023-12-01 22:01:06 +00004575
4576 aapt2LinkRule := foo.Rule("android/soong/java.aapt2Link")
4577 linkInFlags := aapt2LinkRule.Args["inFlags"]
4578 android.AssertStringDoesContain(t,
4579 "aapt2 link command expected to pass feature flags arguments",
4580 linkInFlags,
4581 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4582 )
Jihoon Kang98ea8362024-07-16 18:20:03 +00004583
4584 aapt2CompileRule := foo.Rule("android/soong/java.aapt2Compile")
4585 compileFlags := aapt2CompileRule.Args["cFlags"]
4586 android.AssertStringDoesContain(t,
4587 "aapt2 compile command expected to pass feature flags arguments",
4588 compileFlags,
4589 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4590 )
Jihoon Kang84b25892023-12-01 22:01:06 +00004591}
Spandan Das0727ba72024-02-13 16:37:43 +00004592
Jihoon Kang9aef7772024-06-14 23:45:06 +00004593func TestAppFlagsPackagesPropagation(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004594 t.Parallel()
Jihoon Kang9aef7772024-06-14 23:45:06 +00004595 ctx := testApp(t, `
4596 aconfig_declarations {
4597 name: "foo",
4598 package: "com.example.package.foo",
4599 container: "com.android.foo",
4600 srcs: [
4601 "foo.aconfig",
4602 ],
4603 }
4604 aconfig_declarations {
4605 name: "bar",
4606 package: "com.example.package.bar",
4607 container: "com.android.bar",
4608 srcs: [
4609 "bar.aconfig",
4610 ],
4611 }
4612 aconfig_declarations {
4613 name: "baz",
4614 package: "com.example.package.baz",
4615 container: "com.android.baz",
4616 srcs: [
4617 "baz.aconfig",
4618 ],
4619 }
4620 android_library {
4621 name: "foo_lib",
4622 srcs: ["a.java"],
4623 sdk_version: "current",
4624 flags_packages: [
4625 "foo",
4626 ],
4627 }
4628 android_library {
4629 name: "bar_lib",
4630 srcs: ["a.java"],
4631 sdk_version: "current",
4632 flags_packages: [
4633 "bar",
4634 ],
4635 }
4636 android_app {
4637 name: "baz_app",
4638 srcs: ["a.java"],
4639 sdk_version: "current",
4640 flags_packages: [
4641 "baz",
4642 ],
4643 static_libs: [
4644 "bar_lib",
4645 ],
4646 libs: [
4647 "foo_lib",
4648 ],
4649 }
4650 `)
4651
Colin Cross90607e92025-02-11 14:58:07 -08004652 bazApp := ctx.ModuleForTests(t, "baz_app", "android_common")
Jihoon Kang9aef7772024-06-14 23:45:06 +00004653
4654 // android_app module depends on aconfig_declarations listed in flags_packages
4655 // and that of static libs, but not libs
4656 aapt2LinkRule := bazApp.Rule("android/soong/java.aapt2Link")
4657 linkInFlags := aapt2LinkRule.Args["inFlags"]
4658 android.AssertStringDoesContain(t,
4659 "aapt2 link command expected to pass feature flags arguments of flags_packages and that of its static libs",
4660 linkInFlags,
4661 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4662 )
4663 android.AssertStringDoesNotContain(t,
4664 "aapt2 link command expected to not pass feature flags arguments of flags_packages of its libs",
4665 linkInFlags,
4666 "--feature-flags @out/soong/.intermediates/foo/intermediate.txt",
4667 )
Colin Cross3bc7ffa2017-11-22 16:19:37 -08004668}
Spandan Das0727ba72024-02-13 16:37:43 +00004669
4670// Test that dexpreopt is disabled if an optional_uses_libs exists, but does not provide an implementation.
4671func TestNoDexpreoptOptionalUsesLibDoesNotHaveImpl(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004672 t.Parallel()
Spandan Das0727ba72024-02-13 16:37:43 +00004673 bp := `
4674 java_sdk_library_import {
4675 name: "sdklib_noimpl",
4676 public: {
4677 jars: ["stub.jar"],
4678 },
4679 }
4680 android_app {
4681 name: "app",
4682 srcs: ["a.java"],
4683 sdk_version: "current",
4684 optional_uses_libs: [
4685 "sdklib_noimpl",
4686 ],
4687 }
4688 `
4689 result := prepareForJavaTest.RunTestWithBp(t, bp)
Colin Cross90607e92025-02-11 14:58:07 -08004690 dexpreopt := result.ModuleForTests(t, "app", "android_common").MaybeRule("dexpreopt").Rule
Spandan Das0727ba72024-02-13 16:37:43 +00004691 android.AssertBoolEquals(t, "dexpreopt should be disabled if optional_uses_libs does not have an implementation", true, dexpreopt == nil)
4692}
yangbill2af0b6e2024-03-15 09:29:29 +00004693
Ronald Braunsteincdc66f42024-04-12 11:23:19 -07004694func TestTestOnlyApp(t *testing.T) {
4695 t.Parallel()
4696 ctx := android.GroupFixturePreparers(
4697 prepareForJavaTest,
4698 ).RunTestWithBp(t, `
4699 // These should be test-only
4700 android_test {
4701 name: "android-test",
4702 }
4703 android_test_helper_app {
4704 name: "helper-app",
4705 }
4706 override_android_test {
4707 name: "override-test",
4708 base: "android-app",
4709 }
4710 // And these should not be
4711 android_app {
4712 name: "android-app",
4713 srcs: ["b.java"],
4714 sdk_version: "current",
4715 }
4716 `)
4717
4718 expectedTestOnly := []string{
4719 "android-test",
4720 "helper-app",
4721 "override-test",
4722 }
4723
4724 expectedTopLevel := []string{
4725 "android-test",
4726 "override-test",
4727 }
4728
4729 assertTestOnlyAndTopLevel(t, ctx, expectedTestOnly, expectedTopLevel)
4730}
4731
Jiyong Parkf528b702024-12-30 16:01:58 +09004732func TestTestConfigTemplate(t *testing.T) {
4733 t.Parallel()
4734 ctx := android.GroupFixturePreparers(
4735 prepareForJavaTest,
4736 ).RunTestWithBp(t, `
4737 android_test {
4738 name: "android-test",
4739 test_config_template: "AndroidTestTemplate.xml",
4740 test_options: {
4741 tradefed_options: [
4742 {
4743 name: "name1",
4744 key: "key1",
4745 value: "value1",
4746 },
4747 {
4748 name: "name2",
4749 key: "key2",
4750 value: "value2",
4751 },
4752 ],
4753 test_runner_options: [
4754 {
4755 name: "name3",
4756 key: "key3",
4757 value: "value3",
4758 },
4759 {
4760 name: "name4",
4761 key: "key4",
4762 value: "value4",
4763 },
4764 ],
4765 },
4766 }
4767 `)
4768 type option struct {
4769 name string
4770 key string
4771 value string
4772 }
4773 re := regexp.MustCompile(`<option name="(.*)" key="(.*)" value="(.*)" />`)
4774 parse_options := func(optionsString string) []option {
4775 lines := strings.Split(optionsString, `\n`)
4776 var ret []option
4777 for _, l := range lines {
4778 sm := re.FindStringSubmatch(l)
4779 if sm == nil {
4780 continue
4781 }
4782 ret = append(ret, option{sm[1], sm[2], sm[3]})
4783 }
4784 return ret
4785 }
Colin Cross90607e92025-02-11 14:58:07 -08004786 rule := ctx.ModuleForTests(t, "android-test", "android_common").Rule("autogenInstrumentationTest")
Jiyong Parkf528b702024-12-30 16:01:58 +09004787 android.AssertSameArray(t, "extraConfigs mismatch",
4788 []option{
4789 {"name1", "key1", "value1"},
4790 {"name2", "key2", "value2"},
4791 },
4792 parse_options(rule.Args["extraConfigs"]))
4793 android.AssertSameArray(t, "extraTestRunnerConfigs mismatch",
4794 []option{
4795 {"name3", "key3", "value3"},
4796 {"name4", "key4", "value4"},
4797 },
4798 parse_options(rule.Args["extraTestRunnerConfigs"]))
4799}
4800
yangbill2af0b6e2024-03-15 09:29:29 +00004801func TestAppStem(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004802 t.Parallel()
yangbill2af0b6e2024-03-15 09:29:29 +00004803 ctx := testApp(t, `
4804 android_app {
4805 name: "foo",
4806 srcs: ["a.java"],
4807 stem: "foo-new",
4808 sdk_version: "current",
4809 }`)
4810
Colin Cross90607e92025-02-11 14:58:07 -08004811 foo := ctx.ModuleForTests(t, "foo", "android_common")
yangbill2af0b6e2024-03-15 09:29:29 +00004812
4813 outputs := fmt.Sprint(foo.AllOutputs())
4814 if !strings.Contains(outputs, "foo-new.apk") {
4815 t.Errorf("Module output does not contain expected apk %s", "foo-new.apk")
4816 }
4817}
Spandan Dasb9c58352024-05-13 18:29:45 +00004818
4819func TestAppMinSdkVersionOverride(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004820 t.Parallel()
Spandan Dasb9c58352024-05-13 18:29:45 +00004821 result := android.GroupFixturePreparers(
4822 PrepareForTestWithJavaDefaultModules,
4823 ).RunTestWithBp(t, `
4824 android_app {
4825 name: "com.android.foo",
4826 srcs: ["a.java"],
4827 sdk_version: "current",
4828 min_sdk_version: "31",
4829 updatable: true,
4830 }
4831 override_android_app {
4832 name: "com.android.go.foo",
4833 base: "com.android.foo",
4834 min_sdk_version: "33",
4835 }
4836 `)
Colin Cross90607e92025-02-11 14:58:07 -08004837 foo := result.ModuleForTests(t, "com.android.foo", "android_common").Rule("manifestFixer")
4838 fooOverride := result.ModuleForTests(t, "com.android.foo", "android_common_com.android.go.foo").Rule("manifestFixer")
Spandan Dasb9c58352024-05-13 18:29:45 +00004839
4840 android.AssertStringDoesContain(t,
4841 "com.android.foo: expected manifest fixer to set minSdkVersion to T",
4842 foo.BuildParams.Args["args"],
4843 "--minSdkVersion 31",
4844 )
4845 android.AssertStringDoesContain(t,
4846 "com.android.go.foo: expected manifest fixer to set minSdkVersion to T",
4847 fooOverride.BuildParams.Args["args"],
4848 "--minSdkVersion 33",
4849 )
4850
4851}
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +00004852
4853func TestNotApplyDefaultUpdatableModuleVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004854 t.Parallel()
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +00004855 result := android.GroupFixturePreparers(
4856 PrepareForTestWithJavaDefaultModules,
4857 ).RunTestWithBp(t, `
4858 android_app {
4859 name: "com.android.foo",
4860 srcs: ["a.java"],
4861 sdk_version: "current",
4862 min_sdk_version: "31",
4863 }
4864 `)
Colin Cross90607e92025-02-11 14:58:07 -08004865 foo := result.ModuleForTests(t, "com.android.foo", "android_common").Rule("manifestFixer")
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +00004866 android.AssertStringDoesNotContain(t,
4867 "com.android.foo: expected manifest fixer to not set override-placeholder-version",
4868 foo.BuildParams.Args["args"],
4869 "--override-placeholder-version",
4870 )
4871}
4872
4873func TestNotApplyOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004874 t.Parallel()
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +00004875 result := android.GroupFixturePreparers(
4876 PrepareForTestWithJavaDefaultModules,
4877 android.FixtureMergeEnv(map[string]string{
4878 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4879 }),
4880 ).RunTestWithBp(t, `
4881 android_app {
4882 name: "com.android.foo",
4883 srcs: ["a.java"],
4884 sdk_version: "current",
4885 min_sdk_version: "31",
4886 }
4887 `)
Colin Cross90607e92025-02-11 14:58:07 -08004888 foo := result.ModuleForTests(t, "com.android.foo", "android_common").Rule("manifestFixer")
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +00004889 android.AssertStringDoesNotContain(t,
4890 "com.android.foo: expected manifest fixer to not set override-placeholder-version",
4891 foo.BuildParams.Args["args"],
4892 "--override-placeholder-version",
4893 )
4894}
Jihoon Kang1c743042024-10-22 21:34:17 +00004895
4896func TestResourcesWithFlagDirectories(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08004897 t.Parallel()
Jihoon Kang1c743042024-10-22 21:34:17 +00004898 result := android.GroupFixturePreparers(
4899 PrepareForTestWithJavaDefaultModules,
4900 android.FixtureMergeMockFs(android.MockFS{
4901 "res/flag(test.package.flag1)/values/bools.xml": nil,
4902 "res/flag(!test.package.flag2)/values/bools.xml": nil,
4903 "res/flag(test.package.flag1)/values-config/strings_google_services.xml": nil,
4904 "res/flags(test.package.flag1)/values/strings.xml": nil,
4905 }),
4906 ).RunTestWithBp(t, `
4907 android_library {
4908 name: "foo",
4909 srcs: ["a.java"],
4910 use_resource_processor: true,
4911 resource_dirs: [
4912 "res",
4913 ],
4914 }
4915 `)
Colin Cross90607e92025-02-11 14:58:07 -08004916 fooModule := result.ModuleForTests(t, "foo", "android_common")
Jihoon Kang1c743042024-10-22 21:34:17 +00004917 compileOutputPaths := fooModule.Rule("aapt2Compile").Outputs.Strings()
4918
4919 android.AssertStringListContains(
4920 t,
4921 "Expected to generate flag path",
4922 compileOutputPaths,
4923 "out/soong/.intermediates/foo/android_common/aapt2/res/values_bools.(test.package.flag1).arsc.flat",
4924 )
4925 android.AssertStringListContains(
4926 t,
4927 "Expected to generate flag path with ! prefix in name",
4928 compileOutputPaths,
4929 "out/soong/.intermediates/foo/android_common/aapt2/res/values_bools.(!test.package.flag2).arsc.flat",
4930 )
4931 android.AssertStringListContains(
4932 t,
4933 "Expected to generate flag path with configs",
4934 compileOutputPaths,
4935 "out/soong/.intermediates/foo/android_common/aapt2/res/values-config_strings_google_services.(test.package.flag1).arsc.flat",
4936 )
4937 android.AssertStringListDoesNotContain(
4938 t,
4939 "Expected to not generate flag path with non-flag(flag_name) pattern",
4940 compileOutputPaths,
4941 "out/soong/.intermediates/foo/android_common/aapt2/res/values_strings.(test.package.flag1).arsc.flat",
4942 )
4943}
Spandan Dasde588a32024-12-03 22:52:24 +00004944
4945func TestAutogeneratedStaticRro(t *testing.T) {
4946 t.Parallel()
4947 bp := `
4948android_app {
4949 name: "foo",
4950 srcs: ["foo.java"],
4951 platform_apis: true,
4952}
4953override_android_app {
4954 name: "override_foo",
4955 base: "foo",
4956}
4957`
4958 testCases := []struct {
4959 desc string
4960 preparer android.FixturePreparer
4961 overlayApkExpected bool
4962 }{
4963 {
4964 desc: "No DEVICE_PACKAGE_OVERLAYS, no overlay .apk file",
4965 overlayApkExpected: false,
4966 },
4967 {
4968 desc: "DEVICE_PACKAGE_OVERLAYS exists, but the directory is empty",
4969 overlayApkExpected: false,
4970 preparer: android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4971 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4972 }),
4973 },
4974 {
4975 desc: "DEVICE_PACKAGE_OVERLAYS exists, directory is non-empty, but does not contain a matching resource dir",
4976 overlayApkExpected: false,
4977 preparer: android.GroupFixturePreparers(
4978 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4979 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4980 }),
4981 android.MockFS{
4982 "res/foo.xml": nil,
4983 "device/company/test_product/different_res/foo.xml": nil, // different dir
4984 }.AddToFixture(),
4985 ),
4986 },
4987 {
4988 desc: "DEVICE_PACKAGE_OVERLAYS and the directory contain a matching resource dir",
4989 overlayApkExpected: true,
4990 preparer: android.GroupFixturePreparers(
4991 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4992 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4993 }),
4994 android.MockFS{
4995 "res/foo.xml": nil,
4996 "device/company/test_product/res/foo.xml": nil,
4997 }.AddToFixture(),
4998 ),
4999 },
5000 }
5001 for _, tc := range testCases {
Colin Cross844cb6a2025-01-29 15:53:21 -08005002 t.Run(tc.desc, func(t *testing.T) {
5003 t.Parallel()
5004 result := android.GroupFixturePreparers(
5005 PrepareForTestWithJavaDefaultModules,
5006 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5007 variables.EnforceRROTargets = []string{"*"}
5008 }),
5009 android.OptionalFixturePreparer(tc.preparer),
5010 ).RunTestWithBp(t, bp)
Colin Cross90607e92025-02-11 14:58:07 -08005011 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 -08005012 android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, vendorOverlayApk.Rule != nil)
Colin Cross90607e92025-02-11 14:58:07 -08005013 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 -08005014 android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, overrideVendorOverlayApk.Rule != nil)
5015 })
Spandan Dasde588a32024-12-03 22:52:24 +00005016 }
5017}
Spandan Dasef8b3b22024-12-04 01:34:34 +00005018
5019func TestNoAutogeneratedStaticRroForDisabledOverrideApps(t *testing.T) {
5020 t.Parallel()
5021 bp := `
5022soong_config_module_type {
5023 name: "my_custom_override_android_app",
5024 module_type: "override_android_app",
5025 config_namespace: "my_namespace",
5026 value_variables: ["my_app_enabled"],
5027 properties: ["enabled"],
5028}
5029soong_config_bool_variable {
5030 name: "my_app_enabled",
5031}
5032android_app {
5033 name: "foo",
5034 srcs: ["foo.java"],
5035 platform_apis: true,
5036}
5037my_custom_override_android_app {
5038 name: "override_foo",
5039 base: "foo",
5040 soong_config_variables: {
5041 my_app_enabled: {
5042 enabled: true,
5043 conditions_default: {
5044 enabled: false
5045 },
5046 },
5047 }
5048}
5049`
5050 testCases := []struct {
5051 desc string
5052 preparer android.FixturePreparer
5053 overlayApkExpected bool
5054 }{
5055 {
5056 desc: "my_app_enabled is empty",
5057 overlayApkExpected: false,
5058 },
5059 {
5060 desc: "my_app_enabled is true",
5061 overlayApkExpected: true,
5062 preparer: android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5063 variables.VendorVars = map[string]map[string]string{
5064 "my_namespace": {
5065 "my_app_enabled": "true",
5066 },
5067 }
5068 }),
5069 },
5070 }
5071 for _, tc := range testCases {
Colin Cross844cb6a2025-01-29 15:53:21 -08005072 t.Run(tc.desc, func(t *testing.T) {
5073 t.Parallel()
5074 result := android.GroupFixturePreparers(
5075 PrepareForTestWithJavaDefaultModules,
5076 android.PrepareForTestWithSoongConfigModuleBuildComponents,
5077 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5078 variables.EnforceRROTargets = []string{"*"}
5079 }),
5080 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5081 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
5082 }),
5083 android.MockFS{
5084 "res/foo.xml": nil,
5085 "device/company/test_product/res/foo.xml": nil,
5086 }.AddToFixture(),
5087 android.OptionalFixturePreparer(tc.preparer),
5088 ).RunTestWithBp(t, bp)
Colin Cross90607e92025-02-11 14:58:07 -08005089 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 -08005090 android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, overrideVendorOverlayApk.exportPackage != nil)
5091 })
Spandan Dasef8b3b22024-12-04 01:34:34 +00005092 }
5093}