blob: 6b7d522f33c6bf12c9b3b6ed01b30ba1ce987e4c [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"
Colin Crossb69301e2017-12-01 10:48:26 -080021 "sort"
Colin Crossd09b0b62018-04-18 11:06:47 -070022 "strings"
Colin Cross3bc7ffa2017-11-22 16:19:37 -080023 "testing"
Jaewoong Junga5e5abc2019-04-26 14:31:50 -070024
25 "github.com/google/blueprint/proptools"
26
27 "android/soong/android"
28 "android/soong/cc"
Ulya Trafimovich9023b022021-03-22 16:02:28 +000029 "android/soong/dexpreopt"
Colin Cross3bc7ffa2017-11-22 16:19:37 -080030)
31
Paul Duffin71ae5942021-03-22 15:36:52 +000032// testApp runs tests using the prepareForJavaTest
Paul Duffin0ed42d32021-03-13 02:19:32 +000033//
34// See testJava for an explanation as to how to stop using this deprecated method.
35//
36// deprecated
37func testApp(t *testing.T, bp string) *android.TestContext {
38 t.Helper()
Paul Duffin71ae5942021-03-22 15:36:52 +000039 result := prepareForJavaTest.RunTestWithBp(t, bp)
Paul Duffin0ed42d32021-03-13 02:19:32 +000040 return result.TestContext
41}
42
43func TestApp(t *testing.T) {
44 resourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080045 "res/layout/layout.xml",
46 "res/values/strings.xml",
47 "res/values-en-rUS/strings.xml",
48 }
49
Paul Duffin0ed42d32021-03-13 02:19:32 +000050 compiledResourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080051 "aapt2/res/layout_layout.xml.flat",
52 "aapt2/res/values_strings.arsc.flat",
53 "aapt2/res/values-en-rUS_strings.arsc.flat",
54 }
Colin Cross3bc7ffa2017-11-22 16:19:37 -080055
Colin Crossa97c5d32018-03-28 14:58:31 -070056 for _, moduleType := range []string{"android_app", "android_library"} {
57 t.Run(moduleType, func(t *testing.T) {
Paul Duffin71ae5942021-03-22 15:36:52 +000058 result := android.GroupFixturePreparers(
59 prepareForJavaTest,
Paul Duffin0ed42d32021-03-13 02:19:32 +000060 android.FixtureModifyMockFS(func(fs android.MockFS) {
61 for _, file := range resourceFiles {
62 fs[file] = nil
63 }
64 }),
65 ).RunTestWithBp(t, moduleType+` {
Colin Crossa97c5d32018-03-28 14:58:31 -070066 name: "foo",
67 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090068 sdk_version: "current"
Colin Crossa97c5d32018-03-28 14:58:31 -070069 }
70 `)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080071
Paul Duffin0ed42d32021-03-13 02:19:32 +000072 foo := result.ModuleForTests("foo", "android_common")
Colin Cross3bc7ffa2017-11-22 16:19:37 -080073
Colin Cross31656952018-05-24 16:11:20 -070074 var expectedLinkImplicits []string
75
76 manifestFixer := foo.Output("manifest_fixer/AndroidManifest.xml")
77 expectedLinkImplicits = append(expectedLinkImplicits, manifestFixer.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080078
Paul Duffin0ed42d32021-03-13 02:19:32 +000079 frameworkRes := result.ModuleForTests("framework-res", "android_common")
Colin Crossa97c5d32018-03-28 14:58:31 -070080 expectedLinkImplicits = append(expectedLinkImplicits,
81 frameworkRes.Output("package-res.apk").Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080082
Colin Crossa97c5d32018-03-28 14:58:31 -070083 // Test the mapping from input files to compiled output file names
84 compile := foo.Output(compiledResourceFiles[0])
Paul Duffin0ed42d32021-03-13 02:19:32 +000085 android.AssertDeepEquals(t, "aapt2 compile inputs", resourceFiles, compile.Inputs.Strings())
Colin Crossb69301e2017-12-01 10:48:26 -080086
Colin Crossa97c5d32018-03-28 14:58:31 -070087 compiledResourceOutputs := compile.Outputs.Strings()
88 sort.Strings(compiledResourceOutputs)
Colin Crossb69301e2017-12-01 10:48:26 -080089
Colin Crossa97c5d32018-03-28 14:58:31 -070090 expectedLinkImplicits = append(expectedLinkImplicits, compiledResourceOutputs...)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080091
Colin Crossa97c5d32018-03-28 14:58:31 -070092 list := foo.Output("aapt2/res.list")
93 expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080094
Colin Crossa97c5d32018-03-28 14:58:31 -070095 // Check that the link rule uses
Paul Duffin0ed42d32021-03-13 02:19:32 +000096 res := result.ModuleForTests("foo", "android_common").Output("package-res.apk")
97 android.AssertDeepEquals(t, "aapt2 link implicits", expectedLinkImplicits, res.Implicits.Strings())
Colin Crossa97c5d32018-03-28 14:58:31 -070098 })
Colin Cross3bc7ffa2017-11-22 16:19:37 -080099 }
100}
Colin Cross890ff552017-11-30 20:13:19 -0800101
Colin Crosse560c4a2019-03-19 16:03:11 -0700102func TestAppSplits(t *testing.T) {
103 ctx := testApp(t, `
104 android_app {
105 name: "foo",
106 srcs: ["a.java"],
107 package_splits: ["v4", "v7,hdpi"],
Jeongik Cha538c0d02019-07-11 15:54:27 +0900108 sdk_version: "current"
Colin Crosse560c4a2019-03-19 16:03:11 -0700109 }`)
110
111 foo := ctx.ModuleForTests("foo", "android_common")
112
113 expectedOutputs := []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000114 "out/soong/.intermediates/foo/android_common/foo.apk",
115 "out/soong/.intermediates/foo/android_common/foo_v4.apk",
116 "out/soong/.intermediates/foo/android_common/foo_v7_hdpi.apk",
Colin Crosse560c4a2019-03-19 16:03:11 -0700117 }
118 for _, expectedOutput := range expectedOutputs {
119 foo.Output(expectedOutput)
120 }
121
mrziwang9f7b9f42024-07-10 12:18:06 -0700122 outputFiles := foo.OutputFiles(t, "")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000123 android.AssertPathsRelativeToTopEquals(t, `OutputFiles("")`, expectedOutputs, outputFiles)
Colin Crosse560c4a2019-03-19 16:03:11 -0700124}
125
Jeongik Cha538c0d02019-07-11 15:54:27 +0900126func TestPlatformAPIs(t *testing.T) {
127 testJava(t, `
128 android_app {
129 name: "foo",
130 srcs: ["a.java"],
131 platform_apis: true,
132 }
133 `)
134
135 testJava(t, `
136 android_app {
137 name: "foo",
138 srcs: ["a.java"],
139 sdk_version: "current",
140 }
141 `)
142
Spandan Das60999342021-11-16 04:15:33 +0000143 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 +0900144 android_app {
145 name: "bar",
146 srcs: ["b.java"],
147 }
148 `)
149
Spandan Das60999342021-11-16 04:15:33 +0000150 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 +0900151 android_app {
152 name: "bar",
153 srcs: ["b.java"],
154 sdk_version: "system_current",
155 platform_apis: true,
156 }
157 `)
158}
159
Jeongik Chae403e9e2019-12-07 00:16:24 +0900160func TestAndroidAppLinkType(t *testing.T) {
161 testJava(t, `
162 android_app {
163 name: "foo",
164 srcs: ["a.java"],
165 libs: ["bar"],
166 static_libs: ["baz"],
167 platform_apis: true,
168 }
169
170 java_library {
171 name: "bar",
172 sdk_version: "current",
173 srcs: ["b.java"],
174 }
175
176 android_library {
177 name: "baz",
178 sdk_version: "system_current",
179 srcs: ["c.java"],
180 }
181 `)
182
Steven Moreland00298982020-11-17 21:44:36 +0000183 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900184 android_app {
185 name: "foo",
186 srcs: ["a.java"],
187 libs: ["bar"],
188 sdk_version: "current",
189 static_libs: ["baz"],
190 }
191
192 java_library {
193 name: "bar",
194 sdk_version: "current",
195 srcs: ["b.java"],
196 }
197
198 android_library {
199 name: "baz",
200 sdk_version: "system_current",
201 srcs: ["c.java"],
202 }
203 `)
204
205 testJava(t, `
206 android_app {
207 name: "foo",
208 srcs: ["a.java"],
209 libs: ["bar"],
210 sdk_version: "system_current",
211 static_libs: ["baz"],
212 }
213
214 java_library {
215 name: "bar",
216 sdk_version: "current",
217 srcs: ["b.java"],
218 }
219
220 android_library {
221 name: "baz",
222 sdk_version: "system_current",
223 srcs: ["c.java"],
224 }
225 `)
226
Steven Moreland00298982020-11-17 21:44:36 +0000227 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900228 android_app {
229 name: "foo",
230 srcs: ["a.java"],
231 libs: ["bar"],
232 sdk_version: "system_current",
233 static_libs: ["baz"],
234 }
235
236 java_library {
237 name: "bar",
238 sdk_version: "current",
239 srcs: ["b.java"],
240 }
241
242 android_library {
243 name: "baz",
244 srcs: ["c.java"],
245 }
246 `)
247}
248
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100249func TestUpdatableApps(t *testing.T) {
250 testCases := []struct {
251 name string
252 bp string
253 expectedError string
254 }{
255 {
256 name: "Stable public SDK",
257 bp: `android_app {
258 name: "foo",
259 srcs: ["a.java"],
260 sdk_version: "29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100261 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100262 updatable: true,
263 }`,
264 },
265 {
266 name: "Stable system SDK",
267 bp: `android_app {
268 name: "foo",
269 srcs: ["a.java"],
270 sdk_version: "system_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: "Current public SDK",
277 bp: `android_app {
278 name: "foo",
279 srcs: ["a.java"],
280 sdk_version: "current",
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 system SDK",
287 bp: `android_app {
288 name: "foo",
289 srcs: ["a.java"],
290 sdk_version: "system_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 module SDK",
297 bp: `android_app {
298 name: "foo",
299 srcs: ["a.java"],
300 sdk_version: "module_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 core SDK",
307 bp: `android_app {
308 name: "foo",
309 srcs: ["a.java"],
310 sdk_version: "core_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: "No Platform APIs",
317 bp: `android_app {
318 name: "foo",
319 srcs: ["a.java"],
320 platform_apis: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100321 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100322 updatable: true,
323 }`,
324 expectedError: "Updatable apps must use stable SDKs",
325 },
326 {
327 name: "No Core Platform APIs",
328 bp: `android_app {
329 name: "foo",
330 srcs: ["a.java"],
331 sdk_version: "core_platform",
Artur Satayevf40fc852020-04-16 13:43:02 +0100332 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100333 updatable: true,
334 }`,
335 expectedError: "Updatable apps must use stable SDKs",
336 },
337 {
338 name: "No unspecified APIs",
339 bp: `android_app {
340 name: "foo",
341 srcs: ["a.java"],
342 updatable: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100343 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100344 }`,
345 expectedError: "Updatable apps must use stable SDK",
346 },
Artur Satayevf40fc852020-04-16 13:43:02 +0100347 {
348 name: "Must specify min_sdk_version",
349 bp: `android_app {
350 name: "app_without_min_sdk_version",
351 srcs: ["a.java"],
352 sdk_version: "29",
353 updatable: true,
354 }`,
355 expectedError: "updatable apps must set min_sdk_version.",
356 },
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100357 }
358
359 for _, test := range testCases {
360 t.Run(test.name, func(t *testing.T) {
Paul Duffincdb88a92021-03-14 00:36:50 +0000361 errorHandler := android.FixtureExpectsNoErrors
362 if test.expectedError != "" {
363 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100364 }
Paul Duffin71ae5942021-03-22 15:36:52 +0000365 android.GroupFixturePreparers(
366 prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{
Paul Duffin2645a292021-03-13 02:36:00 +0000367 "29": {"foo"},
368 })).
Paul Duffincdb88a92021-03-14 00:36:50 +0000369 ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, test.bp)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100370 })
371 }
372}
373
Jooyung Han749dc692020-04-15 11:03:39 +0900374func TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) {
375 testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+`
376 android_app {
377 name: "foo",
378 srcs: ["a.java"],
379 updatable: true,
380 sdk_version: "current",
381 min_sdk_version: "29",
382 static_libs: ["bar"],
383 }
384
385 java_library {
386 name: "bar",
387 sdk_version: "current",
388 }
389 `)
390}
391
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900392func TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) {
393 testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
394 android_app {
395 name: "foo",
396 srcs: ["a.java"],
397 updatable: true,
398 sdk_version: "current",
399 min_sdk_version: "current",
400 jni_libs: ["libjni"],
401 }
402
403 cc_library {
404 name: "libjni",
405 stl: "none",
406 system_shared_libs: [],
407 sdk_version: "current",
408 }
409 `)
410}
411
412func TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) {
413 bp := cc.GatherRequiredDepsForTest(android.Android) + `
414 android_app {
415 name: "foo",
416 srcs: ["a.java"],
417 updatable: true,
418 sdk_version: "current",
419 min_sdk_version: "29",
420 jni_libs: ["libjni"],
421 }
422
423 cc_library {
424 name: "libjni",
425 stl: "none",
426 system_shared_libs: [],
Spandan Das2e8c0442022-05-08 00:39:35 +0000427 sdk_version: "current",
428 min_sdk_version: "29",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900429 }
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900430 `
431 fs := map[string][]byte{
432 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
433 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil,
434 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil,
435 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil,
436 }
437
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000438 ctx, _ := testJavaWithFS(t, bp, fs)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900439
440 inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
441 var crtbeginFound, crtendFound bool
Dan Albert92fe7402020-07-15 13:33:30 -0700442 expectedCrtBegin := ctx.ModuleForTests("crtbegin_so",
Colin Crossdea1d032022-12-06 14:50:08 -0800443 "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
Dan Albert92fe7402020-07-15 13:33:30 -0700444 expectedCrtEnd := ctx.ModuleForTests("crtend_so",
Colin Crossdea1d032022-12-06 14:50:08 -0800445 "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
Dan Albert92fe7402020-07-15 13:33:30 -0700446 implicits := []string{}
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900447 for _, input := range inputs {
Dan Albert92fe7402020-07-15 13:33:30 -0700448 implicits = append(implicits, input.String())
449 if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900450 crtbeginFound = true
Dan Albert92fe7402020-07-15 13:33:30 -0700451 } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900452 crtendFound = true
453 }
454 }
Dan Albert92fe7402020-07-15 13:33:30 -0700455 if !crtbeginFound {
456 t.Error(fmt.Sprintf(
457 "expected implicit with suffix %q, have the following implicits:\n%s",
458 expectedCrtBegin, strings.Join(implicits, "\n")))
459 }
460 if !crtendFound {
461 t.Error(fmt.Sprintf(
462 "expected implicit with suffix %q, have the following implicits:\n%s",
463 expectedCrtEnd, strings.Join(implicits, "\n")))
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900464 }
465}
466
467func TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
468 bp := cc.GatherRequiredDepsForTest(android.Android) + `
469 android_app {
470 name: "foo",
471 srcs: ["a.java"],
472 updatable: true,
473 sdk_version: "current",
474 min_sdk_version: "29", // this APK should support 29
475 jni_libs: ["libjni"],
476 }
477
478 cc_library {
479 name: "libjni",
480 stl: "none",
481 sdk_version: "current",
Spandan Das2e8c0442022-05-08 00:39:35 +0000482 min_sdk_version: "current",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900483 }
484 `
Spandan Das2e8c0442022-05-08 00:39:35 +0000485 testJavaError(t, `"libjni" .*: min_sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900486}
487
Spandan Das2e8c0442022-05-08 00:39:35 +0000488func TestUpdatableApps_ErrorIfDepMinSdkVersionIsHigher(t *testing.T) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900489 bp := cc.GatherRequiredDepsForTest(android.Android) + `
490 android_app {
491 name: "foo",
492 srcs: ["a.java"],
493 updatable: true,
494 sdk_version: "current",
495 min_sdk_version: "29", // this APK should support 29
496 jni_libs: ["libjni"],
497 }
498
499 cc_library {
500 name: "libjni",
501 stl: "none",
502 shared_libs: ["libbar"],
503 system_shared_libs: [],
504 sdk_version: "27",
Spandan Das2e8c0442022-05-08 00:39:35 +0000505 min_sdk_version: "27",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900506 }
507
508 cc_library {
509 name: "libbar",
510 stl: "none",
511 system_shared_libs: [],
512 sdk_version: "current",
Spandan Das2e8c0442022-05-08 00:39:35 +0000513 min_sdk_version: "current",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900514 }
515 `
516 testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
517}
518
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +0000519func TestUpdatableApps_ApplyDefaultUpdatableModuleVersion(t *testing.T) {
520 result := android.GroupFixturePreparers(
521 PrepareForTestWithJavaDefaultModules,
522 ).RunTestWithBp(t, `
523 android_app {
524 name: "com.android.foo",
525 srcs: ["a.java"],
526 sdk_version: "current",
527 min_sdk_version: "31",
528 updatable: true,
529 }
530 `)
531 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
532 android.AssertStringDoesContain(t,
533 "com.android.foo: expected manifest fixer to set override-placeholder-version to android.DefaultUpdatableModuleVersion",
534 foo.BuildParams.Args["args"],
535 fmt.Sprintf("--override-placeholder-version %s", android.DefaultUpdatableModuleVersion),
536 )
537}
538
539func TestUpdatableApps_ApplyOverrideApexManifestDefaultVersion(t *testing.T) {
540 result := android.GroupFixturePreparers(
541 PrepareForTestWithJavaDefaultModules,
542 android.FixtureMergeEnv(map[string]string{
543 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
544 }),
545 ).RunTestWithBp(t, `
546 android_app {
547 name: "com.android.foo",
548 srcs: ["a.java"],
549 sdk_version: "current",
550 min_sdk_version: "31",
551 updatable: true,
552 }
553 `)
554 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
555 android.AssertStringDoesContain(t,
556 "com.android.foo: expected manifest fixer to set override-placeholder-version to 1234",
557 foo.BuildParams.Args["args"],
558 "--override-placeholder-version 1234",
559 )
560}
561
Colin Cross0ddae7f2019-02-07 15:30:01 -0800562func TestResourceDirs(t *testing.T) {
563 testCases := []struct {
564 name string
565 prop string
566 resources []string
567 }{
568 {
569 name: "no resource_dirs",
570 prop: "",
571 resources: []string{"res/res/values/strings.xml"},
572 },
573 {
574 name: "resource_dirs",
575 prop: `resource_dirs: ["res"]`,
576 resources: []string{"res/res/values/strings.xml"},
577 },
578 {
579 name: "empty resource_dirs",
580 prop: `resource_dirs: []`,
581 resources: nil,
582 },
583 }
584
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000585 fs := android.MockFS{
Colin Cross0ddae7f2019-02-07 15:30:01 -0800586 "res/res/values/strings.xml": nil,
587 }
588
589 bp := `
590 android_app {
591 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900592 sdk_version: "current",
Colin Cross0ddae7f2019-02-07 15:30:01 -0800593 %s
594 }
595 `
596
597 for _, testCase := range testCases {
598 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000599 result := android.GroupFixturePreparers(
600 PrepareForTestWithJavaDefaultModules,
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000601 fs.AddToFixture(),
602 ).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop))
Colin Cross0ddae7f2019-02-07 15:30:01 -0800603
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000604 module := result.ModuleForTests("foo", "android_common")
Colin Cross0ddae7f2019-02-07 15:30:01 -0800605 resourceList := module.MaybeOutput("aapt2/res.list")
606
607 var resources []string
608 if resourceList.Rule != nil {
609 for _, compiledResource := range resourceList.Inputs.Strings() {
610 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
611 }
612 }
613
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000614 android.AssertDeepEquals(t, "resource files", testCase.resources, resources)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800615 })
616 }
617}
618
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800619func TestLibraryAssets(t *testing.T) {
620 bp := `
621 android_app {
622 name: "foo",
623 sdk_version: "current",
624 static_libs: ["lib1", "lib2", "lib3"],
625 }
626
627 android_library {
628 name: "lib1",
629 sdk_version: "current",
630 asset_dirs: ["assets_a"],
631 }
632
633 android_library {
634 name: "lib2",
635 sdk_version: "current",
636 }
637
638 android_library {
639 name: "lib3",
640 sdk_version: "current",
Colin Crossab8d1382023-07-14 17:23:41 +0000641 static_libs: ["lib4", "import"],
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800642 }
643
644 android_library {
645 name: "lib4",
646 sdk_version: "current",
647 asset_dirs: ["assets_b"],
648 }
Colin Crossab8d1382023-07-14 17:23:41 +0000649
Jiakai Zhangba82e282023-10-13 18:08:59 +0100650 android_library {
651 name: "lib5",
652 sdk_version: "current",
653 assets: [
654 "path/to/asset_file_1",
655 "path/to/asset_file_2",
656 ],
657 }
658
Colin Crossab8d1382023-07-14 17:23:41 +0000659 android_library_import {
660 name: "import",
661 sdk_version: "current",
662 aars: ["import.aar"],
663 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800664 `
665
666 testCases := []struct {
Jiakai Zhangba82e282023-10-13 18:08:59 +0100667 name string
668 assetFlag string
669 assetPackages []string
670 tmpAssetDirInputs []string
671 tmpAssetDirOutputs []string
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800672 }{
673 {
674 name: "foo",
Colin Crossab8d1382023-07-14 17:23:41 +0000675 // lib1 has its own assets. lib3 doesn't have any, but lib4 and import have assets.
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800676 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000677 "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
678 "out/soong/.intermediates/lib1/android_common/assets.zip",
Colin Crossab8d1382023-07-14 17:23:41 +0000679 "out/soong/.intermediates/lib4/android_common/assets.zip",
680 "out/soong/.intermediates/import/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800681 },
682 },
683 {
684 name: "lib1",
685 assetFlag: "-A assets_a",
686 },
687 {
688 name: "lib2",
689 },
690 {
691 name: "lib3",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800692 },
693 {
694 name: "lib4",
695 assetFlag: "-A assets_b",
696 },
Jiakai Zhangba82e282023-10-13 18:08:59 +0100697 {
698 name: "lib5",
699 assetFlag: "-A out/soong/.intermediates/lib5/android_common/tmp_asset_dir",
700 tmpAssetDirInputs: []string{
701 "path/to/asset_file_1",
702 "path/to/asset_file_2",
703 },
704 tmpAssetDirOutputs: []string{
705 "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_1",
706 "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_2",
707 },
708 },
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800709 }
710 ctx := testApp(t, bp)
711
712 for _, test := range testCases {
713 t.Run(test.name, func(t *testing.T) {
714 m := ctx.ModuleForTests(test.name, "android_common")
715
716 // Check asset flag in aapt2 link flags
717 var aapt2link android.TestingBuildParams
718 if len(test.assetPackages) > 0 {
719 aapt2link = m.Output("aapt2/package-res.apk")
720 } else {
721 aapt2link = m.Output("package-res.apk")
722 }
Paul Duffina71a67a2021-03-29 00:42:57 +0100723 aapt2link = aapt2link
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800724 aapt2Flags := aapt2link.Args["flags"]
725 if test.assetFlag != "" {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000726 android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800727 } else {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000728 android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800729 }
730
731 // Check asset merge rule.
732 if len(test.assetPackages) > 0 {
733 mergeAssets := m.Output("package-res.apk")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000734 android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800735 }
Jiakai Zhangba82e282023-10-13 18:08:59 +0100736
737 if len(test.tmpAssetDirInputs) > 0 {
738 rule := m.Rule("tmp_asset_dir")
739 inputs := rule.Implicits
740 outputs := append(android.WritablePaths{rule.Output}, rule.ImplicitOutputs...).Paths()
741 android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir inputs", test.tmpAssetDirInputs, inputs)
742 android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir outputs", test.tmpAssetDirOutputs, outputs)
743 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800744 })
745 }
746}
747
Colin Crossb014f072021-02-26 14:54:36 -0800748func TestAppJavaResources(t *testing.T) {
749 bp := `
750 android_app {
751 name: "foo",
752 sdk_version: "current",
753 java_resources: ["resources/a"],
754 srcs: ["a.java"],
755 }
756
757 android_app {
758 name: "bar",
759 sdk_version: "current",
760 java_resources: ["resources/a"],
761 }
762 `
763
764 ctx := testApp(t, bp)
765
766 foo := ctx.ModuleForTests("foo", "android_common")
767 fooResources := foo.Output("res/foo.jar")
768 fooDexJar := foo.Output("dex-withres/foo.jar")
769 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
770 fooApk := foo.Rule("combineApk")
771
772 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
773 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
774 }
775
776 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
777 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
778 }
779
780 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
781 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
782 }
783
784 bar := ctx.ModuleForTests("bar", "android_common")
785 barResources := bar.Output("res/bar.jar")
786 barApk := bar.Rule("combineApk")
787
788 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
789 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
790 }
791}
792
Colin Crossff3ff7f2023-07-05 14:04:12 -0700793func TestAndroidResourceProcessor(t *testing.T) {
794 testCases := []struct {
Colin Cross8676c8c2023-10-12 15:58:57 -0700795 name string
796 appUsesRP bool
797 directLibUsesRP bool
798 transitiveLibUsesRP bool
799 sharedLibUsesRP bool
800 sharedTransitiveStaticLibUsesRP bool
801 sharedTransitiveSharedLibUsesRP bool
Colin Crossff3ff7f2023-07-05 14:04:12 -0700802
803 dontVerifyApp bool
804 appResources []string
805 appOverlays []string
806 appImports []string
807 appSrcJars []string
808 appClasspath []string
809 appCombined []string
810
811 dontVerifyDirect bool
812 directResources []string
813 directOverlays []string
814 directImports []string
815 directSrcJars []string
816 directClasspath []string
817 directCombined []string
818
819 dontVerifyTransitive bool
820 transitiveResources []string
821 transitiveOverlays []string
822 transitiveImports []string
823 transitiveSrcJars []string
824 transitiveClasspath []string
825 transitiveCombined []string
826
827 dontVerifyDirectImport bool
828 directImportResources []string
829 directImportOverlays []string
830 directImportImports []string
831
832 dontVerifyTransitiveImport bool
833 transitiveImportResources []string
834 transitiveImportOverlays []string
835 transitiveImportImports []string
Colin Cross8676c8c2023-10-12 15:58:57 -0700836
837 dontVerifyShared bool
838 sharedResources []string
839 sharedOverlays []string
840 sharedImports []string
841 sharedSrcJars []string
842 sharedClasspath []string
843 sharedCombined []string
Colin Crossff3ff7f2023-07-05 14:04:12 -0700844 }{
845 {
Colin Cross4eae06d2023-06-20 22:40:02 -0700846 // Test with all modules set to use_resource_processor: false (except android_library_import modules,
847 // which always use resource processor).
848 name: "legacy",
849 appUsesRP: false,
850 directLibUsesRP: false,
851 transitiveLibUsesRP: false,
Colin Crossff3ff7f2023-07-05 14:04:12 -0700852
853 appResources: nil,
854 appOverlays: []string{
855 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000856 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700857 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
858 "out/soong/.intermediates/direct/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000859 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700860 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
861 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
862 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700863 appImports: []string{
864 "out/soong/.intermediates/shared/android_common/package-res.apk",
865 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
866 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700867 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
868 appClasspath: []string{
869 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700870 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700871 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000872 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700873 },
874 appCombined: []string{
875 "out/soong/.intermediates/app/android_common/javac/app.jar",
876 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000877 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700878 },
879
880 directResources: nil,
881 directOverlays: []string{
882 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000883 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700884 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
885 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
886 },
887 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
888 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
889 directClasspath: []string{
890 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
891 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000892 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700893 },
894 directCombined: []string{
895 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
896 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000897 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700898 },
899
900 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
901 transitiveOverlays: nil,
902 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
903 transitiveSrcJars: []string{"out/soong/.intermediates/transitive/android_common/gen/android/R.srcjar"},
904 transitiveClasspath: []string{"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar"},
905 transitiveCombined: nil,
906
Colin Cross8676c8c2023-10-12 15:58:57 -0700907 sharedResources: nil,
908 sharedOverlays: []string{
909 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
910 "out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat",
911 },
912 sharedImports: []string{
913 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
914 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
915 },
916 sharedSrcJars: []string{"out/soong/.intermediates/shared/android_common/gen/android/R.srcjar"},
917 sharedClasspath: []string{
918 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
919 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar",
920 "out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar",
921 },
922 sharedCombined: []string{
923 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
924 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
925 },
926
Colin Crossff3ff7f2023-07-05 14:04:12 -0700927 directImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700928 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
929 directImportImports: []string{
930 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700931 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
932 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700933
934 transitiveImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700935 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
936 transitiveImportImports: []string{
937 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700938 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
939 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700940 },
941 {
942 // Test with all modules set to use_resource_processor: true.
Colin Cross8676c8c2023-10-12 15:58:57 -0700943 name: "resource_processor",
944 appUsesRP: true,
945 directLibUsesRP: true,
946 transitiveLibUsesRP: true,
947 sharedLibUsesRP: true,
948 sharedTransitiveSharedLibUsesRP: true,
949 sharedTransitiveStaticLibUsesRP: true,
Colin Cross4eae06d2023-06-20 22:40:02 -0700950
951 appResources: nil,
952 appOverlays: []string{
953 "out/soong/.intermediates/transitive/android_common/package-res.apk",
954 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
955 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
956 "out/soong/.intermediates/direct/android_common/package-res.apk",
957 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
958 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
959 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
960 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700961 appImports: []string{
962 "out/soong/.intermediates/shared/android_common/package-res.apk",
963 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
964 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700965 appSrcJars: nil,
966 appClasspath: []string{
967 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
968 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700969 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700970 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000971 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700972 },
973 appCombined: []string{
Colin Cross4eae06d2023-06-20 22:40:02 -0700974 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Crossfd620b22024-02-23 10:05:21 -0800975 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700976 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000977 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700978 },
979
980 directResources: nil,
981 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
982 directImports: []string{
983 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
984 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
985 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
986 "out/soong/.intermediates/transitive/android_common/package-res.apk",
987 },
988 directSrcJars: nil,
989 directClasspath: []string{
990 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700991 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -0800992 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
993 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
994 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700995 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000996 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700997 },
998 directCombined: []string{
999 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1000 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001001 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001002 },
1003
1004 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1005 transitiveOverlays: nil,
1006 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1007 transitiveSrcJars: nil,
1008 transitiveClasspath: []string{
1009 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1010 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1011 },
1012 transitiveCombined: nil,
1013
Colin Cross8676c8c2023-10-12 15:58:57 -07001014 sharedResources: nil,
1015 sharedOverlays: []string{"out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat"},
1016 sharedImports: []string{
1017 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
1018 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1019 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
1020 },
1021 sharedSrcJars: nil,
1022 sharedClasspath: []string{
1023 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -08001024 "out/soong/.intermediates/shared/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001025 "out/soong/.intermediates/shared_transitive_static/android_common/busybox/R.jar",
1026 "out/soong/.intermediates/shared_transitive_shared/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001027 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar",
1028 "out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar",
1029 },
1030 sharedCombined: []string{
1031 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
1032 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
1033 },
1034
Colin Cross4eae06d2023-06-20 22:40:02 -07001035 directImportResources: nil,
1036 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
1037 directImportImports: []string{
1038 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1039 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1040 },
1041
1042 transitiveImportResources: nil,
1043 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
1044 transitiveImportImports: []string{
1045 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1046 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1047 },
1048 }, {
1049 // Test an app building with resource processor enabled but with dependencies built without
1050 // resource processor.
1051 name: "app_resource_processor",
1052 appUsesRP: true,
1053 directLibUsesRP: false,
1054 transitiveLibUsesRP: false,
1055
1056 appResources: nil,
1057 appOverlays: []string{
1058 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1059 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1060 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1061 "out/soong/.intermediates/direct/android_common/package-res.apk",
1062 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1063 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1064 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1065 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001066 appImports: []string{
1067 "out/soong/.intermediates/shared/android_common/package-res.apk",
1068 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1069 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001070 appSrcJars: nil,
1071 appClasspath: []string{
1072 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1073 // R.jar has to come before direct.jar
1074 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001075 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001076 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001077 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001078 },
1079 appCombined: []string{
Colin Cross4eae06d2023-06-20 22:40:02 -07001080 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Crossfd620b22024-02-23 10:05:21 -08001081 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001082 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001083 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001084 },
1085
1086 dontVerifyDirect: true,
1087 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001088 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001089 dontVerifyDirectImport: true,
1090 dontVerifyTransitiveImport: true,
1091 },
1092 {
1093 // Test an app building without resource processor enabled but with a dependency built with
1094 // resource processor.
1095 name: "app_dependency_lib_resource_processor",
1096 appUsesRP: false,
1097 directLibUsesRP: true,
1098 transitiveLibUsesRP: false,
1099
1100 appOverlays: []string{
1101 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1102 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1103 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1104 "out/soong/.intermediates/direct/android_common/package-res.apk",
1105 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1106 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1107 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1108 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001109 appImports: []string{
1110 "out/soong/.intermediates/shared/android_common/package-res.apk",
1111 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1112 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001113 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1114 appClasspath: []string{
1115 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001116 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001117 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001118 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001119 },
1120 appCombined: []string{
1121 "out/soong/.intermediates/app/android_common/javac/app.jar",
1122 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001123 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001124 },
1125
1126 directResources: nil,
1127 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
1128 directImports: []string{
1129 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1130 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1131 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1132 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1133 },
1134 directSrcJars: nil,
1135 directClasspath: []string{
1136 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001137 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -08001138 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
1139 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001140 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001141 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001142 },
1143 directCombined: []string{
1144 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1145 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001146 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001147 },
1148
1149 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001150 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001151 dontVerifyDirectImport: true,
1152 dontVerifyTransitiveImport: true,
1153 },
1154 {
1155 // Test a library building without resource processor enabled but with a dependency built with
1156 // resource processor.
1157 name: "lib_dependency_lib_resource_processor",
1158 appUsesRP: false,
1159 directLibUsesRP: false,
1160 transitiveLibUsesRP: true,
1161
1162 appOverlays: []string{
1163 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1164 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1165 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1166 "out/soong/.intermediates/direct/android_common/package-res.apk",
1167 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1168 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1169 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1170 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001171 appImports: []string{
1172 "out/soong/.intermediates/shared/android_common/package-res.apk",
1173 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1174 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001175 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1176 appClasspath: []string{
1177 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001178 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001179 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001180 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001181 },
1182 appCombined: []string{
1183 "out/soong/.intermediates/app/android_common/javac/app.jar",
1184 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001185 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001186 },
1187
1188 directResources: nil,
1189 directOverlays: []string{
1190 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1191 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1192 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1193 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
1194 },
1195 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1196 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
1197 directClasspath: []string{
1198 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1199 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001200 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001201 },
1202 directCombined: []string{
1203 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1204 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001205 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001206 },
1207
1208 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1209 transitiveOverlays: nil,
1210 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1211 transitiveSrcJars: nil,
1212 transitiveClasspath: []string{
1213 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1214 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1215 },
1216 transitiveCombined: nil,
1217
Colin Cross8676c8c2023-10-12 15:58:57 -07001218 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001219 dontVerifyDirectImport: true,
1220 dontVerifyTransitiveImport: true,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001221 },
1222 }
1223
1224 for _, testCase := range testCases {
1225 t.Run(testCase.name, func(t *testing.T) {
1226 bp := fmt.Sprintf(`
1227 android_app {
1228 name: "app",
1229 sdk_version: "current",
1230 srcs: ["app/app.java"],
1231 resource_dirs: ["app/res"],
1232 manifest: "app/AndroidManifest.xml",
Colin Cross8676c8c2023-10-12 15:58:57 -07001233 libs: ["shared"],
Colin Crossff3ff7f2023-07-05 14:04:12 -07001234 static_libs: ["direct", "direct_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001235 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001236 }
1237
1238 android_library {
1239 name: "direct",
1240 sdk_version: "current",
1241 srcs: ["direct/direct.java"],
1242 resource_dirs: ["direct/res"],
1243 manifest: "direct/AndroidManifest.xml",
1244 static_libs: ["transitive", "transitive_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001245 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001246 }
1247
1248 android_library {
1249 name: "transitive",
1250 sdk_version: "current",
1251 srcs: ["transitive/transitive.java"],
1252 resource_dirs: ["transitive/res"],
1253 manifest: "transitive/AndroidManifest.xml",
Colin Cross4eae06d2023-06-20 22:40:02 -07001254 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001255 }
1256
Colin Cross8676c8c2023-10-12 15:58:57 -07001257 android_library {
1258 name: "shared",
1259 sdk_version: "current",
1260 srcs: ["shared/shared.java"],
1261 resource_dirs: ["shared/res"],
1262 manifest: "shared/AndroidManifest.xml",
1263 use_resource_processor: %v,
1264 libs: ["shared_transitive_shared"],
1265 static_libs: ["shared_transitive_static"],
1266 }
1267
1268 android_library {
1269 name: "shared_transitive_shared",
1270 sdk_version: "current",
1271 srcs: ["shared_transitive_shared/shared_transitive_shared.java"],
1272 resource_dirs: ["shared_transitive_shared/res"],
1273 manifest: "shared_transitive_shared/AndroidManifest.xml",
1274 use_resource_processor: %v,
1275 }
1276
1277 android_library {
1278 name: "shared_transitive_static",
1279 sdk_version: "current",
1280 srcs: ["shared_transitive_static/shared.java"],
1281 resource_dirs: ["shared_transitive_static/res"],
1282 manifest: "shared_transitive_static/AndroidManifest.xml",
1283 use_resource_processor: %v,
1284 }
1285
Colin Crossff3ff7f2023-07-05 14:04:12 -07001286 android_library_import {
1287 name: "direct_import",
1288 sdk_version: "current",
1289 aars: ["direct_import.aar"],
1290 static_libs: ["direct_import_dep"],
1291 }
1292
1293 android_library_import {
1294 name: "direct_import_dep",
1295 sdk_version: "current",
1296 aars: ["direct_import_dep.aar"],
1297 }
1298
1299 android_library_import {
1300 name: "transitive_import",
1301 sdk_version: "current",
1302 aars: ["transitive_import.aar"],
1303 static_libs: ["transitive_import_dep"],
1304 }
1305
1306 android_library_import {
1307 name: "transitive_import_dep",
1308 sdk_version: "current",
1309 aars: ["transitive_import_dep.aar"],
1310 }
Colin Cross8676c8c2023-10-12 15:58:57 -07001311 `, testCase.appUsesRP, testCase.directLibUsesRP, testCase.transitiveLibUsesRP,
1312 testCase.sharedLibUsesRP, testCase.sharedTransitiveSharedLibUsesRP, testCase.sharedTransitiveStaticLibUsesRP)
Colin Crossff3ff7f2023-07-05 14:04:12 -07001313
1314 fs := android.MockFS{
Colin Cross8676c8c2023-10-12 15:58:57 -07001315 "app/res/values/strings.xml": nil,
1316 "direct/res/values/strings.xml": nil,
1317 "transitive/res/values/strings.xml": nil,
1318 "shared/res/values/strings.xml": nil,
1319 "shared_transitive_static/res/values/strings.xml": nil,
1320 "shared_transitive_shared/res/values/strings.xml": nil,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001321 }
1322
1323 result := android.GroupFixturePreparers(
1324 PrepareForTestWithJavaDefaultModules,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001325 fs.AddToFixture(),
1326 ).RunTestWithBp(t, bp)
1327
1328 type aaptInfo struct {
1329 resources, overlays, imports, srcJars, classpath, combined android.Paths
1330 }
1331
1332 getAaptInfo := func(moduleName string) (aaptInfo aaptInfo) {
1333 mod := result.ModuleForTests(moduleName, "android_common")
1334 resourceListRule := mod.MaybeOutput("aapt2/res.list")
1335 overlayListRule := mod.MaybeOutput("aapt2/overlay.list")
1336 aaptRule := mod.Rule("aapt2Link")
1337 javacRule := mod.MaybeRule("javac")
1338 combinedRule := mod.MaybeOutput("combined/" + moduleName + ".jar")
1339
1340 aaptInfo.resources = resourceListRule.Inputs
1341 aaptInfo.overlays = overlayListRule.Inputs
1342
1343 aaptFlags := strings.Split(aaptRule.Args["flags"], " ")
1344 for i, flag := range aaptFlags {
1345 if flag == "-I" && i+1 < len(aaptFlags) {
1346 aaptInfo.imports = append(aaptInfo.imports, android.PathForTesting(aaptFlags[i+1]))
1347 }
1348 }
1349
1350 if len(javacRule.Args["srcJars"]) > 0 {
1351 aaptInfo.srcJars = android.PathsForTesting(strings.Split(javacRule.Args["srcJars"], " ")...)
1352 }
1353
1354 if len(javacRule.Args["classpath"]) > 0 {
1355 classpathArg := strings.TrimPrefix(javacRule.Args["classpath"], "-classpath ")
1356 aaptInfo.classpath = android.PathsForTesting(strings.Split(classpathArg, ":")...)
1357 }
1358
1359 aaptInfo.combined = combinedRule.Inputs
1360 return
1361 }
1362
1363 app := getAaptInfo("app")
1364 direct := getAaptInfo("direct")
1365 transitive := getAaptInfo("transitive")
Colin Cross8676c8c2023-10-12 15:58:57 -07001366 shared := getAaptInfo("shared")
Colin Crossff3ff7f2023-07-05 14:04:12 -07001367 directImport := getAaptInfo("direct_import")
1368 transitiveImport := getAaptInfo("transitive_import")
1369
1370 if !testCase.dontVerifyApp {
1371 android.AssertPathsRelativeToTopEquals(t, "app resources", testCase.appResources, app.resources)
1372 android.AssertPathsRelativeToTopEquals(t, "app overlays", testCase.appOverlays, app.overlays)
1373 android.AssertPathsRelativeToTopEquals(t, "app imports", testCase.appImports, app.imports)
1374 android.AssertPathsRelativeToTopEquals(t, "app srcjars", testCase.appSrcJars, app.srcJars)
1375 android.AssertPathsRelativeToTopEquals(t, "app classpath", testCase.appClasspath, app.classpath)
1376 android.AssertPathsRelativeToTopEquals(t, "app combined", testCase.appCombined, app.combined)
1377 }
1378
1379 if !testCase.dontVerifyDirect {
1380 android.AssertPathsRelativeToTopEquals(t, "direct resources", testCase.directResources, direct.resources)
1381 android.AssertPathsRelativeToTopEquals(t, "direct overlays", testCase.directOverlays, direct.overlays)
1382 android.AssertPathsRelativeToTopEquals(t, "direct imports", testCase.directImports, direct.imports)
1383 android.AssertPathsRelativeToTopEquals(t, "direct srcjars", testCase.directSrcJars, direct.srcJars)
1384 android.AssertPathsRelativeToTopEquals(t, "direct classpath", testCase.directClasspath, direct.classpath)
1385 android.AssertPathsRelativeToTopEquals(t, "direct combined", testCase.directCombined, direct.combined)
1386 }
1387
1388 if !testCase.dontVerifyTransitive {
1389 android.AssertPathsRelativeToTopEquals(t, "transitive resources", testCase.transitiveResources, transitive.resources)
1390 android.AssertPathsRelativeToTopEquals(t, "transitive overlays", testCase.transitiveOverlays, transitive.overlays)
1391 android.AssertPathsRelativeToTopEquals(t, "transitive imports", testCase.transitiveImports, transitive.imports)
1392 android.AssertPathsRelativeToTopEquals(t, "transitive srcjars", testCase.transitiveSrcJars, transitive.srcJars)
1393 android.AssertPathsRelativeToTopEquals(t, "transitive classpath", testCase.transitiveClasspath, transitive.classpath)
1394 android.AssertPathsRelativeToTopEquals(t, "transitive combined", testCase.transitiveCombined, transitive.combined)
1395 }
1396
Colin Cross8676c8c2023-10-12 15:58:57 -07001397 if !testCase.dontVerifyShared {
1398 android.AssertPathsRelativeToTopEquals(t, "shared resources", testCase.sharedResources, shared.resources)
1399 android.AssertPathsRelativeToTopEquals(t, "shared overlays", testCase.sharedOverlays, shared.overlays)
1400 android.AssertPathsRelativeToTopEquals(t, "shared imports", testCase.sharedImports, shared.imports)
1401 android.AssertPathsRelativeToTopEquals(t, "shared srcjars", testCase.sharedSrcJars, shared.srcJars)
1402 android.AssertPathsRelativeToTopEquals(t, "shared classpath", testCase.sharedClasspath, shared.classpath)
1403 android.AssertPathsRelativeToTopEquals(t, "shared combined", testCase.sharedCombined, shared.combined)
1404 }
1405
Colin Crossff3ff7f2023-07-05 14:04:12 -07001406 if !testCase.dontVerifyDirectImport {
1407 android.AssertPathsRelativeToTopEquals(t, "direct_import resources", testCase.directImportResources, directImport.resources)
1408 android.AssertPathsRelativeToTopEquals(t, "direct_import overlays", testCase.directImportOverlays, directImport.overlays)
1409 android.AssertPathsRelativeToTopEquals(t, "direct_import imports", testCase.directImportImports, directImport.imports)
1410 }
1411
1412 if !testCase.dontVerifyTransitiveImport {
1413 android.AssertPathsRelativeToTopEquals(t, "transitive_import resources", testCase.transitiveImportResources, transitiveImport.resources)
1414 android.AssertPathsRelativeToTopEquals(t, "transitive_import overlays", testCase.transitiveImportOverlays, transitiveImport.overlays)
1415 android.AssertPathsRelativeToTopEquals(t, "transitive_import imports", testCase.transitiveImportImports, transitiveImport.imports)
1416 }
1417 })
1418 }
1419}
1420
1421func TestAndroidResourceOverlays(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -08001422 testCases := []struct {
1423 name string
1424 enforceRROTargets []string
1425 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -08001426 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -08001427 overlayFiles map[string][]string
1428 rroDirs map[string][]string
1429 }{
1430 {
1431 name: "no RRO",
1432 enforceRROTargets: nil,
1433 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -08001434 resourceFiles: map[string][]string{
1435 "foo": nil,
1436 "bar": {"bar/res/res/values/strings.xml"},
1437 "lib": nil,
1438 "lib2": {"lib2/res/res/values/strings.xml"},
1439 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001440 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001441 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001442 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1443 "out/soong/.intermediates/lib/android_common/package-res.apk",
1444 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001445 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001446 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1447 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +00001448 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001449 },
Colin Crossbec85302019-02-13 13:15:46 -08001450 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -08001451 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1452 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1453 },
Colin Crossbec85302019-02-13 13:15:46 -08001454 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001455 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001456 "lib/res/res/values/strings.xml",
1457 "device/vendor/blah/overlay/lib/res/values/strings.xml",
1458 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001459 },
1460 rroDirs: map[string][]string{
1461 "foo": nil,
1462 "bar": nil,
1463 },
1464 },
1465 {
1466 name: "enforce RRO on foo",
1467 enforceRROTargets: []string{"foo"},
1468 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -08001469 resourceFiles: map[string][]string{
1470 "foo": nil,
1471 "bar": {"bar/res/res/values/strings.xml"},
1472 "lib": nil,
1473 "lib2": {"lib2/res/res/values/strings.xml"},
1474 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001475 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001476 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001477 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1478 "out/soong/.intermediates/lib/android_common/package-res.apk",
1479 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001480 "foo/res/res/values/strings.xml",
1481 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1482 },
Colin Crossbec85302019-02-13 13:15:46 -08001483 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -08001484 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1485 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1486 },
Colin Crossbec85302019-02-13 13:15:46 -08001487 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001488 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001489 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -08001490 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001491 },
Colin Crossc1c37552019-01-31 11:42:41 -08001492
Colin Cross5c4791c2019-02-01 11:44:44 -08001493 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001494 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +00001495 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +00001496 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001497 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001498 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001499 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001500 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001501 },
1502 },
1503 {
1504 name: "enforce RRO on all",
1505 enforceRROTargets: []string{"*"},
1506 enforceRROExcludedOverlays: []string{
1507 // Excluding specific apps/res directories also allowed.
1508 "device/vendor/blah/static_overlay/foo",
1509 "device/vendor/blah/static_overlay/bar/res",
1510 },
Colin Crossbec85302019-02-13 13:15:46 -08001511 resourceFiles: map[string][]string{
1512 "foo": nil,
1513 "bar": {"bar/res/res/values/strings.xml"},
1514 "lib": nil,
1515 "lib2": {"lib2/res/res/values/strings.xml"},
1516 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001517 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001518 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001519 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1520 "out/soong/.intermediates/lib/android_common/package-res.apk",
1521 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001522 "foo/res/res/values/strings.xml",
1523 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1524 },
Colin Crossbec85302019-02-13 13:15:46 -08001525 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
1526 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001527 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001528 "lib/res/res/values/strings.xml",
1529 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001530 },
1531 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001532 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +00001533 "device:device/vendor/blah/overlay/foo/res",
1534 "product:product/vendor/blah/overlay/foo/res",
1535 // Lib dep comes after the direct deps
1536 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001537 },
Anton Hansson53c88442019-03-18 15:53:16 +00001538 "bar": {"device:device/vendor/blah/overlay/bar/res"},
1539 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001540 },
1541 },
1542 }
1543
Anton Hansson53c88442019-03-18 15:53:16 +00001544 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -08001545 "device/vendor/blah/overlay",
1546 "device/vendor/blah/overlay2",
1547 "device/vendor/blah/static_overlay",
1548 }
1549
Anton Hansson53c88442019-03-18 15:53:16 +00001550 productResourceOverlays := []string{
1551 "product/vendor/blah/overlay",
1552 }
1553
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001554 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -08001555 "foo/res/res/values/strings.xml": nil,
1556 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001557 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -08001558 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001559 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
1560 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001561 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001562 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
1563 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
1564 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +00001565 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001566 }
1567
1568 bp := `
1569 android_app {
1570 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001571 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001572 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +00001573 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -08001574 }
1575
1576 android_app {
1577 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001578 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001579 resource_dirs: ["bar/res"],
1580 }
Colin Cross6ed7dea2019-01-31 14:44:30 -08001581
1582 android_library {
1583 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001584 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001585 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -08001586 static_libs: ["lib2"],
1587 }
1588
1589 android_library {
1590 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001591 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -08001592 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -08001593 }
Anton Hansson53c88442019-03-18 15:53:16 +00001594
1595 // This library has the same resources as lib (should not lead to dupe RROs)
1596 android_library {
1597 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001598 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +00001599 resource_dirs: ["lib/res"]
1600 }
Colin Cross890ff552017-11-30 20:13:19 -08001601 `
1602
Colin Cross5c4791c2019-02-01 11:44:44 -08001603 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -08001604 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001605 result := android.GroupFixturePreparers(
1606 PrepareForTestWithJavaDefaultModules,
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001607 fs.AddToFixture(),
1608 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1609 variables.DeviceResourceOverlays = deviceResourceOverlays
1610 variables.ProductResourceOverlays = productResourceOverlays
1611 if testCase.enforceRROTargets != nil {
1612 variables.EnforceRROTargets = testCase.enforceRROTargets
1613 }
1614 if testCase.enforceRROExcludedOverlays != nil {
1615 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
1616 }
1617 }),
1618 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -08001619
Colin Crossbec85302019-02-13 13:15:46 -08001620 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
1621 for _, o := range list {
1622 res := module.MaybeOutput(o)
1623 if res.Rule != nil {
1624 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
1625 // verify the inputs to the .arsc.flat rule.
1626 files = append(files, res.Inputs.Strings()...)
1627 } else {
1628 // Otherwise, verify the full path to the output of the other module
1629 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +00001630 }
Colin Cross890ff552017-11-30 20:13:19 -08001631 }
Colin Crossbec85302019-02-13 13:15:46 -08001632 return files
Colin Cross890ff552017-11-30 20:13:19 -08001633 }
1634
Colin Crossbec85302019-02-13 13:15:46 -08001635 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001636 module := result.ModuleForTests(moduleName, "android_common")
Colin Crossbec85302019-02-13 13:15:46 -08001637 resourceList := module.MaybeOutput("aapt2/res.list")
1638 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001639 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +00001640 }
Colin Crossbec85302019-02-13 13:15:46 -08001641 overlayList := module.MaybeOutput("aapt2/overlay.list")
1642 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001643 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -08001644 }
1645
Colin Crossab8d1382023-07-14 17:23:41 +00001646 for _, d := range module.Module().(AndroidLibraryDependency).RRODirsDepSet().ToList() {
Anton Hansson53c88442019-03-18 15:53:16 +00001647 var prefix string
1648 if d.overlayType == device {
1649 prefix = "device:"
1650 } else if d.overlayType == product {
1651 prefix = "product:"
1652 } else {
1653 t.Fatalf("Unexpected overlayType %d", d.overlayType)
1654 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001655 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +00001656 }
Colin Crossbec85302019-02-13 13:15:46 -08001657
1658 return resourceFiles, overlayFiles, rroDirs
1659 }
1660
1661 modules := []string{"foo", "bar", "lib", "lib2"}
1662 for _, module := range modules {
1663 resourceFiles, overlayFiles, rroDirs := getResources(module)
1664
1665 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
1666 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
1667 module, testCase.resourceFiles[module], resourceFiles)
1668 }
1669 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
1670 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
1671 module, testCase.overlayFiles[module], overlayFiles)
1672 }
1673 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +00001674 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -08001675 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +00001676 }
Colin Cross890ff552017-11-30 20:13:19 -08001677 }
Colin Cross890ff552017-11-30 20:13:19 -08001678 })
1679 }
1680}
Colin Crossd09b0b62018-04-18 11:06:47 -07001681
Paul Duffincdb88a92021-03-14 00:36:50 +00001682func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
1683 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +09001684 link := foo.Output("package-res.apk")
1685 linkFlags := strings.Split(link.Args["flags"], " ")
1686 min := android.IndexList("--min-sdk-version", linkFlags)
1687 target := android.IndexList("--target-sdk-version", linkFlags)
1688
1689 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
1690 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
1691 }
1692
1693 gotMinSdkVersion := linkFlags[min+1]
1694 gotTargetSdkVersion := linkFlags[target+1]
1695
Paul Duffincdb88a92021-03-14 00:36:50 +00001696 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001697
Paul Duffincdb88a92021-03-14 00:36:50 +00001698 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001699}
1700
Colin Crossd09b0b62018-04-18 11:06:47 -07001701func TestAppSdkVersion(t *testing.T) {
1702 testCases := []struct {
1703 name string
1704 sdkVersion string
1705 platformSdkInt int
1706 platformSdkCodename string
1707 platformSdkFinal bool
Spandan Dasffb31af2023-03-01 19:46:18 +00001708 minSdkVersionBp string
Colin Crossd09b0b62018-04-18 11:06:47 -07001709 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001710 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001711 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001712 }{
1713 {
1714 name: "current final SDK",
1715 sdkVersion: "current",
1716 platformSdkInt: 27,
1717 platformSdkCodename: "REL",
1718 platformSdkFinal: true,
1719 expectedMinSdkVersion: "27",
1720 },
1721 {
1722 name: "current non-final SDK",
1723 sdkVersion: "current",
1724 platformSdkInt: 27,
1725 platformSdkCodename: "OMR1",
1726 platformSdkFinal: false,
1727 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001728 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001729 },
1730 {
1731 name: "default final SDK",
1732 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001733 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001734 platformSdkInt: 27,
1735 platformSdkCodename: "REL",
1736 platformSdkFinal: true,
1737 expectedMinSdkVersion: "27",
1738 },
1739 {
1740 name: "default non-final SDK",
1741 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001742 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001743 platformSdkInt: 27,
1744 platformSdkCodename: "OMR1",
1745 platformSdkFinal: false,
1746 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001747 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001748 },
1749 {
1750 name: "14",
1751 sdkVersion: "14",
1752 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001753 platformSdkCodename: "S",
1754 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001755 },
Spandan Dasffb31af2023-03-01 19:46:18 +00001756 {
1757 name: "two active SDKs",
1758 sdkVersion: "module_current",
1759 minSdkVersionBp: "UpsideDownCake",
1760 expectedMinSdkVersion: "UpsideDownCake", // And not VanillaIceCream
1761 platformSdkCodename: "VanillaIceCream",
1762 activeCodenames: []string{"UpsideDownCake", "VanillaIceCream"},
1763 },
Colin Crossd09b0b62018-04-18 11:06:47 -07001764 }
1765
1766 for _, moduleType := range []string{"android_app", "android_library"} {
1767 for _, test := range testCases {
1768 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001769 platformApiProp := ""
1770 if test.platformApis {
1771 platformApiProp = "platform_apis: true,"
1772 }
Spandan Dasffb31af2023-03-01 19:46:18 +00001773 minSdkVersionProp := ""
1774 if test.minSdkVersionBp != "" {
1775 minSdkVersionProp = fmt.Sprintf(` min_sdk_version: "%s",`, test.minSdkVersionBp)
1776 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001777 bp := fmt.Sprintf(`%s {
1778 name: "foo",
1779 srcs: ["a.java"],
1780 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001781 %s
Spandan Dasffb31af2023-03-01 19:46:18 +00001782 %s
1783 }`, moduleType, test.sdkVersion, platformApiProp, minSdkVersionProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001784
Paul Duffin71ae5942021-03-22 15:36:52 +00001785 result := android.GroupFixturePreparers(
1786 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001787 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1788 variables.Platform_sdk_version = &test.platformSdkInt
1789 variables.Platform_sdk_codename = &test.platformSdkCodename
1790 variables.Platform_version_active_codenames = test.activeCodenames
1791 variables.Platform_sdk_final = &test.platformSdkFinal
1792 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001793 FixtureWithPrebuiltApis(map[string][]string{
1794 "14": {"foo"},
1795 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001796 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001797
Paul Duffincdb88a92021-03-14 00:36:50 +00001798 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001799 })
1800 }
1801 }
1802}
Colin Crossa4f08812018-10-02 22:03:40 -07001803
Jeongik Cha219141c2020-08-06 23:00:37 +09001804func TestVendorAppSdkVersion(t *testing.T) {
1805 testCases := []struct {
1806 name string
1807 sdkVersion string
1808 platformSdkInt int
1809 platformSdkCodename string
1810 platformSdkFinal bool
1811 deviceCurrentApiLevelForVendorModules string
1812 expectedMinSdkVersion string
1813 }{
1814 {
1815 name: "current final SDK",
1816 sdkVersion: "current",
1817 platformSdkInt: 29,
1818 platformSdkCodename: "REL",
1819 platformSdkFinal: true,
1820 deviceCurrentApiLevelForVendorModules: "29",
1821 expectedMinSdkVersion: "29",
1822 },
1823 {
1824 name: "current final SDK",
1825 sdkVersion: "current",
1826 platformSdkInt: 29,
1827 platformSdkCodename: "REL",
1828 platformSdkFinal: true,
1829 deviceCurrentApiLevelForVendorModules: "28",
1830 expectedMinSdkVersion: "28",
1831 },
1832 {
1833 name: "current final SDK",
1834 sdkVersion: "current",
1835 platformSdkInt: 29,
1836 platformSdkCodename: "Q",
1837 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001838 deviceCurrentApiLevelForVendorModules: "28",
1839 expectedMinSdkVersion: "28",
1840 },
1841 }
1842
1843 for _, moduleType := range []string{"android_app", "android_library"} {
1844 for _, sdkKind := range []string{"", "system_"} {
1845 for _, test := range testCases {
1846 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1847 bp := fmt.Sprintf(`%s {
1848 name: "foo",
1849 srcs: ["a.java"],
1850 sdk_version: "%s%s",
1851 vendor: true,
1852 }`, moduleType, sdkKind, test.sdkVersion)
1853
Paul Duffin71ae5942021-03-22 15:36:52 +00001854 result := android.GroupFixturePreparers(
1855 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001856 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1857 variables.Platform_sdk_version = &test.platformSdkInt
1858 variables.Platform_sdk_codename = &test.platformSdkCodename
1859 variables.Platform_sdk_final = &test.platformSdkFinal
1860 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1861 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1862 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001863 FixtureWithPrebuiltApis(map[string][]string{
1864 "28": {"foo"},
1865 "29": {"foo"},
1866 "current": {"foo"},
1867 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001868 ).RunTestWithBp(t, bp)
1869
1870 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001871 })
1872 }
1873 }
1874 }
1875}
1876
Paul Duffin50c217c2019-06-12 13:25:22 +01001877func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001878 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001879 cc_library {
1880 name: "libjni",
1881 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001882 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001883 stl: "none",
1884 }
1885
1886 android_test {
1887 name: "test",
1888 sdk_version: "core_platform",
1889 jni_libs: ["libjni"],
1890 }
1891
1892 android_test {
1893 name: "test_first",
1894 sdk_version: "core_platform",
1895 compile_multilib: "first",
1896 jni_libs: ["libjni"],
1897 }
1898
1899 android_test {
1900 name: "test_both",
1901 sdk_version: "core_platform",
1902 compile_multilib: "both",
1903 jni_libs: ["libjni"],
1904 }
1905
1906 android_test {
1907 name: "test_32",
1908 sdk_version: "core_platform",
1909 compile_multilib: "32",
1910 jni_libs: ["libjni"],
1911 }
1912
1913 android_test {
1914 name: "test_64",
1915 sdk_version: "core_platform",
1916 compile_multilib: "64",
1917 jni_libs: ["libjni"],
1918 }
1919 `)
1920
1921 testCases := []struct {
1922 name string
1923 abis []string
1924 }{
1925 {"test", []string{"arm64-v8a"}},
1926 {"test_first", []string{"arm64-v8a"}},
1927 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1928 {"test_32", []string{"armeabi-v7a"}},
1929 {"test_64", []string{"arm64-v8a"}},
1930 }
1931
1932 for _, test := range testCases {
1933 t.Run(test.name, func(t *testing.T) {
1934 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07001935 jniLibZip := app.Output("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01001936 var abis []string
1937 args := strings.Fields(jniLibZip.Args["jarArgs"])
1938 for i := 0; i < len(args); i++ {
1939 if args[i] == "-P" {
1940 abis = append(abis, filepath.Base(args[i+1]))
1941 i++
1942 }
1943 }
1944 if !reflect.DeepEqual(abis, test.abis) {
1945 t.Errorf("want abis %v, got %v", test.abis, abis)
1946 }
1947 })
1948 }
1949}
1950
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001951func TestAppSdkVersionByPartition(t *testing.T) {
1952 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1953 android_app {
1954 name: "foo",
1955 srcs: ["a.java"],
1956 vendor: true,
1957 platform_apis: true,
1958 }
1959 `)
1960
1961 testJava(t, `
1962 android_app {
1963 name: "bar",
1964 srcs: ["b.java"],
1965 platform_apis: true,
1966 }
1967 `)
1968
1969 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001970 bp := `
1971 android_app {
1972 name: "foo",
1973 srcs: ["a.java"],
1974 product_specific: true,
1975 platform_apis: true,
1976 }
1977 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001978
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001979 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001980 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001981 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 +09001982 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001983
1984 android.GroupFixturePreparers(
1985 PrepareForTestWithJavaDefaultModules,
1986 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1987 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
1988 }),
1989 ).
1990 ExtendWithErrorHandler(errorHandler).
1991 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001992 }
1993}
1994
Paul Duffin50c217c2019-06-12 13:25:22 +01001995func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001996 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001997 cc_library {
1998 name: "libjni",
1999 system_shared_libs: [],
2000 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08002001 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002002 }
2003
2004 android_app {
2005 name: "app",
2006 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002007 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002008 }
2009
2010 android_app {
2011 name: "app_noembed",
2012 jni_libs: ["libjni"],
2013 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002014 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002015 }
2016
2017 android_app {
2018 name: "app_embed",
2019 jni_libs: ["libjni"],
2020 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002021 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002022 }
2023
2024 android_test {
2025 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00002026 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002027 jni_libs: ["libjni"],
2028 }
2029
2030 android_test {
2031 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00002032 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002033 jni_libs: ["libjni"],
2034 use_embedded_native_libs: false,
2035 }
2036
2037 android_test_helper_app {
2038 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00002039 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002040 jni_libs: ["libjni"],
2041 }
2042
2043 android_test_helper_app {
2044 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00002045 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002046 jni_libs: ["libjni"],
2047 use_embedded_native_libs: false,
2048 }
2049 `)
2050
2051 testCases := []struct {
2052 name string
2053 packaged bool
2054 compressed bool
2055 }{
Jiyong Parkd044bb42024-05-15 02:09:54 +09002056 {"app", false, false},
2057 {"app_noembed", false, false},
Paul Duffin50c217c2019-06-12 13:25:22 +01002058 {"app_embed", true, false},
2059 {"test", true, false},
2060 {"test_noembed", true, true},
2061 {"test_helper", true, false},
2062 {"test_helper_noembed", true, true},
2063 }
2064
2065 for _, test := range testCases {
2066 t.Run(test.name, func(t *testing.T) {
2067 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07002068 jniLibZip := app.MaybeOutput("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01002069 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
2070 t.Errorf("expected jni packaged %v, got %v", w, g)
2071 }
2072
2073 if jniLibZip.Rule != nil {
2074 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
2075 t.Errorf("expected jni compressed %v, got %v", w, g)
2076 }
Colin Crossc511bc52020-04-07 16:50:32 +00002077
2078 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
2079 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
2080 }
Paul Duffin50c217c2019-06-12 13:25:22 +01002081 }
2082 })
2083 }
Colin Cross47fa9d32019-03-26 10:51:39 -07002084}
2085
Colin Cross3c007702020-05-08 11:20:24 -07002086func TestJNISDK(t *testing.T) {
2087 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
2088 cc_library {
2089 name: "libjni",
2090 system_shared_libs: [],
2091 stl: "none",
2092 sdk_version: "current",
2093 }
2094
2095 android_test {
2096 name: "app_platform",
2097 jni_libs: ["libjni"],
2098 platform_apis: true,
2099 }
2100
2101 android_test {
2102 name: "app_sdk",
2103 jni_libs: ["libjni"],
2104 sdk_version: "current",
2105 }
2106
2107 android_test {
2108 name: "app_force_platform",
2109 jni_libs: ["libjni"],
2110 sdk_version: "current",
2111 jni_uses_platform_apis: true,
2112 }
2113
2114 android_test {
2115 name: "app_force_sdk",
2116 jni_libs: ["libjni"],
2117 platform_apis: true,
2118 jni_uses_sdk_apis: true,
2119 }
Colin Crossc2d24052020-05-13 11:05:02 -07002120
2121 cc_library {
2122 name: "libvendorjni",
2123 system_shared_libs: [],
2124 stl: "none",
2125 vendor: true,
2126 }
2127
2128 android_test {
2129 name: "app_vendor",
2130 jni_libs: ["libvendorjni"],
2131 sdk_version: "current",
2132 vendor: true,
2133 }
Colin Cross3c007702020-05-08 11:20:24 -07002134 `)
2135
2136 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07002137 name string
2138 sdkJNI bool
2139 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07002140 }{
Colin Crossc2d24052020-05-13 11:05:02 -07002141 {name: "app_platform"},
2142 {name: "app_sdk", sdkJNI: true},
2143 {name: "app_force_platform"},
2144 {name: "app_force_sdk", sdkJNI: true},
2145 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07002146 }
2147
Colin Crossc2d24052020-05-13 11:05:02 -07002148 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
2149 Output("libjni.so").Output.String()
2150 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
2151 Output("libjni.so").Output.String()
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +09002152 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_vendor_arm64_armv8-a_shared").
Colin Crossc2d24052020-05-13 11:05:02 -07002153 Output("libvendorjni.so").Output.String()
2154
Colin Cross3c007702020-05-08 11:20:24 -07002155 for _, test := range testCases {
2156 t.Run(test.name, func(t *testing.T) {
2157 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07002158
Colin Crossb3168ba2023-07-26 16:14:56 -07002159 jniLibZip := app.MaybeOutput("jnilibs.zip")
Colin Cross3c007702020-05-08 11:20:24 -07002160 if len(jniLibZip.Implicits) != 1 {
2161 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
2162 }
2163 gotJNI := jniLibZip.Implicits[0].String()
2164
2165 if test.sdkJNI {
2166 if gotJNI != sdkJNI {
2167 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
2168 }
Colin Crossc2d24052020-05-13 11:05:02 -07002169 } else if test.vendorJNI {
2170 if gotJNI != vendorJNI {
2171 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
2172 }
Colin Cross3c007702020-05-08 11:20:24 -07002173 } else {
2174 if gotJNI != platformJNI {
2175 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
2176 }
2177 }
2178 })
2179 }
2180
2181 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
2182 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
2183 android_test {
2184 name: "app_platform",
2185 platform_apis: true,
2186 jni_uses_platform_apis: true,
2187 }
2188 `)
2189 })
2190
2191 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
2192 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
2193 android_test {
2194 name: "app_sdk",
2195 sdk_version: "current",
2196 jni_uses_sdk_apis: true,
2197 }
2198 `)
2199 })
2200
2201}
2202
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002203func TestCertificates(t *testing.T) {
2204 testCases := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002205 name string
2206 bp string
Colin Cross5caad2b2022-12-12 15:11:46 -08002207 allowMissingDependencies bool
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002208 certificateOverride string
2209 expectedCertSigningFlags string
2210 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002211 }{
2212 {
2213 name: "default",
2214 bp: `
2215 android_app {
2216 name: "foo",
2217 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002218 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002219 }
2220 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002221 certificateOverride: "",
2222 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002223 expectedCertificate: "build/make/target/product/security/testkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002224 },
2225 {
2226 name: "module certificate property",
2227 bp: `
2228 android_app {
2229 name: "foo",
2230 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002231 certificate: ":new_certificate",
2232 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002233 }
2234
2235 android_app_certificate {
2236 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002237 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002238 }
2239 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002240 certificateOverride: "",
2241 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002242 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002243 },
2244 {
2245 name: "path certificate property",
2246 bp: `
2247 android_app {
2248 name: "foo",
2249 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002250 certificate: "expiredkey",
2251 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002252 }
2253 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002254 certificateOverride: "",
2255 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002256 expectedCertificate: "build/make/target/product/security/expiredkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002257 },
2258 {
2259 name: "certificate overrides",
2260 bp: `
2261 android_app {
2262 name: "foo",
2263 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002264 certificate: "expiredkey",
2265 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002266 }
2267
2268 android_app_certificate {
2269 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002270 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002271 }
2272 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002273 certificateOverride: "foo:new_certificate",
2274 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002275 expectedCertificate: "cert/new_cert",
Liz Kammere2b27f42020-05-07 13:24:05 -07002276 },
2277 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002278 name: "certificate signing flags",
Liz Kammere2b27f42020-05-07 13:24:05 -07002279 bp: `
2280 android_app {
2281 name: "foo",
2282 srcs: ["a.java"],
2283 certificate: ":new_certificate",
2284 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002285 rotationMinSdkVersion: "32",
Liz Kammere2b27f42020-05-07 13:24:05 -07002286 sdk_version: "current",
2287 }
2288
2289 android_app_certificate {
2290 name: "new_certificate",
2291 certificate: "cert/new_cert",
2292 }
2293 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002294 certificateOverride: "",
2295 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002296 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002297 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002298 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002299 name: "cert signing flags from filegroup",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002300 bp: `
2301 android_app {
2302 name: "foo",
2303 srcs: ["a.java"],
2304 certificate: ":new_certificate",
2305 lineage: ":lineage_bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002306 rotationMinSdkVersion: "32",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002307 sdk_version: "current",
2308 }
2309
2310 android_app_certificate {
2311 name: "new_certificate",
2312 certificate: "cert/new_cert",
2313 }
2314
2315 filegroup {
2316 name: "lineage_bin",
2317 srcs: ["lineage.bin"],
2318 }
2319 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002320 certificateOverride: "",
2321 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002322 expectedCertificate: "cert/new_cert",
2323 },
2324 {
2325 name: "missing with AllowMissingDependencies",
2326 bp: `
2327 android_app {
2328 name: "foo",
2329 srcs: ["a.java"],
2330 certificate: ":new_certificate",
2331 sdk_version: "current",
2332 }
2333 `,
2334 expectedCertificate: "out/soong/.intermediates/foo/android_common/missing",
2335 allowMissingDependencies: true,
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002336 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002337 }
2338
2339 for _, test := range testCases {
2340 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002341 result := android.GroupFixturePreparers(
2342 PrepareForTestWithJavaDefaultModules,
2343 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2344 if test.certificateOverride != "" {
2345 variables.CertificateOverrides = []string{test.certificateOverride}
2346 }
Colin Cross5caad2b2022-12-12 15:11:46 -08002347 if test.allowMissingDependencies {
2348 variables.Allow_missing_dependencies = proptools.BoolPtr(true)
2349 }
2350 }),
2351 android.FixtureModifyContext(func(ctx *android.TestContext) {
2352 ctx.SetAllowMissingDependencies(test.allowMissingDependencies)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002353 }),
2354 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002355
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002356 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002357
Colin Cross5caad2b2022-12-12 15:11:46 -08002358 certificate := foo.Module().(*AndroidApp).certificate
2359 android.AssertPathRelativeToTopEquals(t, "certificates key", test.expectedCertificate+".pk8", certificate.Key)
2360 // The sign_target_files_apks and check_target_files_signatures
2361 // tools require that certificates have a .x509.pem extension.
2362 android.AssertPathRelativeToTopEquals(t, "certificates pem", test.expectedCertificate+".x509.pem", certificate.Pem)
Liz Kammere2b27f42020-05-07 13:24:05 -07002363
Colin Cross5caad2b2022-12-12 15:11:46 -08002364 signapk := foo.Output("foo.apk")
2365 if signapk.Rule != android.ErrorRule {
2366 signCertificateFlags := signapk.Args["certificates"]
2367 expectedFlags := certificate.Pem.String() + " " + certificate.Key.String()
2368 android.AssertStringEquals(t, "certificates flags", expectedFlags, signCertificateFlags)
2369
2370 certSigningFlags := signapk.Args["flags"]
2371 android.AssertStringEquals(t, "cert signing flags", test.expectedCertSigningFlags, certSigningFlags)
2372 }
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002373 })
2374 }
2375}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002376
Songchun Fan688de9a2020-03-24 20:32:24 -07002377func TestRequestV4SigningFlag(t *testing.T) {
2378 testCases := []struct {
2379 name string
2380 bp string
2381 expected string
2382 }{
2383 {
2384 name: "default",
2385 bp: `
2386 android_app {
2387 name: "foo",
2388 srcs: ["a.java"],
2389 sdk_version: "current",
2390 }
2391 `,
2392 expected: "",
2393 },
2394 {
2395 name: "default",
2396 bp: `
2397 android_app {
2398 name: "foo",
2399 srcs: ["a.java"],
2400 sdk_version: "current",
2401 v4_signature: false,
2402 }
2403 `,
2404 expected: "",
2405 },
2406 {
2407 name: "module certificate property",
2408 bp: `
2409 android_app {
2410 name: "foo",
2411 srcs: ["a.java"],
2412 sdk_version: "current",
2413 v4_signature: true,
2414 }
2415 `,
2416 expected: "--enable-v4",
2417 },
2418 }
2419
2420 for _, test := range testCases {
2421 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002422 result := android.GroupFixturePreparers(
2423 PrepareForTestWithJavaDefaultModules,
2424 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07002425
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002426 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07002427
2428 signapk := foo.Output("foo.apk")
2429 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002430 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07002431 })
2432 }
2433}
2434
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002435func TestPackageNameOverride(t *testing.T) {
2436 testCases := []struct {
2437 name string
2438 bp string
2439 packageNameOverride string
2440 expected []string
2441 }{
2442 {
2443 name: "default",
2444 bp: `
2445 android_app {
2446 name: "foo",
2447 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002448 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002449 }
2450 `,
2451 packageNameOverride: "",
2452 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002453 "out/soong/.intermediates/foo/android_common/foo.apk",
2454 "out/soong/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002455 },
2456 },
2457 {
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002458 name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002459 bp: `
2460 android_app {
2461 name: "foo",
2462 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002463 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002464 }
2465 `,
2466 packageNameOverride: "foo:bar",
2467 expected: []string{
2468 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002469 "out/soong/.intermediates/foo/android_common/bar.apk",
2470 "out/soong/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002471 },
2472 },
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002473 {
2474 name: "overridden via stem",
2475 bp: `
2476 android_app {
2477 name: "foo",
2478 srcs: ["a.java"],
2479 sdk_version: "current",
2480 stem: "bar",
2481 }
2482 `,
2483 packageNameOverride: "",
2484 expected: []string{
2485 "out/soong/.intermediates/foo/android_common/bar.apk",
2486 "out/soong/target/product/test_device/system/app/bar/bar.apk",
2487 },
2488 },
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002489 }
2490
2491 for _, test := range testCases {
2492 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002493 result := android.GroupFixturePreparers(
2494 PrepareForTestWithJavaDefaultModules,
2495 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2496 if test.packageNameOverride != "" {
2497 variables.PackageNameOverrides = []string{test.packageNameOverride}
2498 }
2499 }),
2500 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002501
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002502 foo := result.ModuleForTests("foo", "android_common")
2503
Lukacs T. Berkifbaf7252021-08-19 09:36:42 +02002504 outSoongDir := result.Config.SoongOutDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002505
2506 outputs := foo.AllOutputs()
2507 outputMap := make(map[string]bool)
2508 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002509 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002510 }
2511 for _, e := range test.expected {
2512 if _, exist := outputMap[e]; !exist {
2513 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
2514 }
2515 }
2516 })
2517 }
2518}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002519
2520func TestInstrumentationTargetOverridden(t *testing.T) {
2521 bp := `
2522 android_app {
2523 name: "foo",
2524 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002525 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002526 }
2527
2528 android_test {
2529 name: "bar",
2530 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002531 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002532 }
2533 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002534
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002535 result := android.GroupFixturePreparers(
2536 PrepareForTestWithJavaDefaultModules,
2537 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2538 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
2539 }),
2540 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002541
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002542 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002543 res := bar.Output("package-res.apk")
2544 aapt2Flags := res.Args["flags"]
2545 e := "--rename-instrumentation-target-package org.dandroid.bp"
2546 if !strings.Contains(aapt2Flags, e) {
2547 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
2548 }
2549}
Jaewoong Jung525443a2019-02-28 15:35:54 -08002550
2551func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002552 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2553 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08002554 android_app {
2555 name: "foo",
2556 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07002557 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002558 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002559 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002560 }
2561
2562 override_android_app {
2563 name: "bar",
2564 base: "foo",
2565 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07002566 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002567 rotationMinSdkVersion: "32",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002568 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002569 }
2570
2571 android_app_certificate {
2572 name: "new_certificate",
2573 certificate: "cert/new_cert",
2574 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002575
2576 override_android_app {
2577 name: "baz",
2578 base: "foo",
2579 package_name: "org.dandroid.bp",
2580 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002581
2582 override_android_app {
2583 name: "baz_no_rename_resources",
2584 base: "foo",
2585 package_name: "org.dandroid.bp",
2586 rename_resources_package: false,
2587 }
2588
2589 android_app {
2590 name: "foo_no_rename_resources",
2591 srcs: ["a.java"],
2592 certificate: "expiredkey",
2593 overrides: ["qux"],
2594 rename_resources_package: false,
2595 sdk_version: "current",
2596 }
2597
2598 override_android_app {
2599 name: "baz_base_no_rename_resources",
2600 base: "foo_no_rename_resources",
2601 package_name: "org.dandroid.bp",
2602 }
2603
2604 override_android_app {
2605 name: "baz_override_base_rename_resources",
2606 base: "foo_no_rename_resources",
2607 package_name: "org.dandroid.bp",
2608 rename_resources_package: true,
2609 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08002610 `)
2611
2612 expectedVariants := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002613 name string
2614 moduleName string
2615 variantName string
2616 apkName string
2617 apkPath string
2618 certFlag string
2619 certSigningFlags string
2620 overrides []string
2621 packageFlag string
2622 renameResources bool
2623 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08002624 }{
2625 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002626 name: "foo",
2627 moduleName: "foo",
2628 variantName: "android_common",
2629 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2630 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2631 certSigningFlags: "",
2632 overrides: []string{"qux"},
2633 packageFlag: "",
2634 renameResources: false,
2635 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002636 },
2637 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002638 name: "foo",
2639 moduleName: "bar",
2640 variantName: "android_common_bar",
2641 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2642 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
2643 certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
2644 overrides: []string{"qux", "foo"},
2645 packageFlag: "",
2646 renameResources: false,
2647 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002648 },
2649 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002650 name: "foo",
2651 moduleName: "baz",
2652 variantName: "android_common_baz",
2653 apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk",
2654 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2655 certSigningFlags: "",
2656 overrides: []string{"qux", "foo"},
2657 packageFlag: "org.dandroid.bp",
2658 renameResources: true,
2659 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002660 },
2661 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002662 name: "foo",
2663 moduleName: "baz_no_rename_resources",
2664 variantName: "android_common_baz_no_rename_resources",
2665 apkPath: "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
2666 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2667 certSigningFlags: "",
2668 overrides: []string{"qux", "foo"},
2669 packageFlag: "org.dandroid.bp",
2670 renameResources: false,
2671 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002672 },
2673 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002674 name: "foo_no_rename_resources",
2675 moduleName: "baz_base_no_rename_resources",
2676 variantName: "android_common_baz_base_no_rename_resources",
2677 apkPath: "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
2678 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2679 certSigningFlags: "",
2680 overrides: []string{"qux", "foo_no_rename_resources"},
2681 packageFlag: "org.dandroid.bp",
2682 renameResources: false,
2683 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002684 },
2685 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002686 name: "foo_no_rename_resources",
2687 moduleName: "baz_override_base_rename_resources",
2688 variantName: "android_common_baz_override_base_rename_resources",
2689 apkPath: "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
2690 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2691 certSigningFlags: "",
2692 overrides: []string{"qux", "foo_no_rename_resources"},
2693 packageFlag: "org.dandroid.bp",
2694 renameResources: true,
2695 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002696 },
2697 }
2698 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002699 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002700
2701 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002702 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002703
2704 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08002705 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07002706 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002707 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07002708
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002709 // Check the cert signing flags
2710 certSigningFlags := signapk.Args["flags"]
2711 android.AssertStringEquals(t, "cert signing flags", expected.certSigningFlags, certSigningFlags)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002712
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002713 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08002714 mod := variant.Module().(*AndroidApp)
zhidoua2ce78f2022-02-17 02:33:12 +00002715 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002716
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002717 // Test Overridable property: Logging_parent
2718 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002719 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002720
Liz Kammer1d5983b2020-05-19 19:15:37 +00002721 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002722 res := variant.Output("package-res.apk")
2723 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00002724 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
2725 expectedPackage := expected.packageFlag
2726 if !expected.renameResources {
2727 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00002728 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002729 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002730 }
2731}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07002732
zhidoua2ce78f2022-02-17 02:33:12 +00002733func TestOverrideAndroidAppOverrides(t *testing.T) {
2734 ctx, _ := testJava(
2735 t, `
2736 android_app {
2737 name: "foo",
2738 srcs: ["a.java"],
2739 sdk_version: "current",
2740 overrides: ["qux"]
2741 }
2742
2743 android_app {
2744 name: "bar",
2745 srcs: ["b.java"],
2746 sdk_version: "current",
2747 overrides: ["foo"]
2748 }
2749
2750 override_android_app {
2751 name: "foo_override",
2752 base: "foo",
2753 overrides: ["bar"]
2754 }
2755 `)
2756
2757 expectedVariants := []struct {
2758 name string
2759 moduleName string
2760 variantName string
2761 overrides []string
2762 }{
2763 {
2764 name: "foo",
2765 moduleName: "foo",
2766 variantName: "android_common",
2767 overrides: []string{"qux"},
2768 },
2769 {
2770 name: "bar",
2771 moduleName: "bar",
2772 variantName: "android_common",
2773 overrides: []string{"foo"},
2774 },
2775 {
2776 name: "foo",
2777 moduleName: "foo_override",
2778 variantName: "android_common_foo_override",
2779 overrides: []string{"bar", "foo"},
2780 },
2781 }
2782 for _, expected := range expectedVariants {
2783 variant := ctx.ModuleForTests(expected.name, expected.variantName)
2784
2785 // Check if the overrides field values are correctly aggregated.
2786 mod := variant.Module().(*AndroidApp)
2787 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2788 }
2789}
2790
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002791func TestOverrideAndroidAppWithPrebuilt(t *testing.T) {
2792 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2793 t, `
2794 android_app {
2795 name: "foo",
2796 srcs: ["a.java"],
2797 sdk_version: "current",
2798 }
2799
2800 override_android_app {
2801 name: "bar",
2802 base: "foo",
2803 }
2804
2805 android_app_import {
2806 name: "bar",
2807 prefer: true,
2808 apk: "bar.apk",
2809 presigned: true,
2810 }
2811 `)
2812
2813 // An app that has an override that also has a prebuilt should not be hidden.
2814 foo := result.ModuleForTests("foo", "android_common")
2815 if foo.Module().IsHideFromMake() {
2816 t.Errorf("expected foo to have HideFromMake false")
2817 }
2818
2819 // An override that also has a prebuilt should be hidden.
2820 barOverride := result.ModuleForTests("foo", "android_common_bar")
2821 if !barOverride.Module().IsHideFromMake() {
2822 t.Errorf("expected bar override variant of foo to have HideFromMake true")
2823 }
2824}
2825
Jooyung Han01d80d82022-01-08 12:16:32 +09002826func TestOverrideAndroidAppStem(t *testing.T) {
2827 ctx, _ := testJava(t, `
2828 android_app {
2829 name: "foo",
2830 srcs: ["a.java"],
2831 sdk_version: "current",
2832 }
2833 override_android_app {
2834 name: "bar",
2835 base: "foo",
2836 }
2837 override_android_app {
2838 name: "baz",
2839 base: "foo",
2840 stem: "baz_stem",
2841 }
2842 android_app {
2843 name: "foo2",
2844 srcs: ["a.java"],
2845 sdk_version: "current",
2846 stem: "foo2_stem",
2847 }
2848 override_android_app {
2849 name: "bar2",
2850 base: "foo2",
2851 }
2852 override_android_app {
2853 name: "baz2",
2854 base: "foo2",
2855 stem: "baz2_stem",
2856 }
2857 `)
2858 for _, expected := range []struct {
2859 moduleName string
2860 variantName string
2861 apkPath string
2862 }{
2863 {
2864 moduleName: "foo",
2865 variantName: "android_common",
2866 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2867 },
2868 {
2869 moduleName: "foo",
2870 variantName: "android_common_bar",
2871 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2872 },
2873 {
2874 moduleName: "foo",
2875 variantName: "android_common_baz",
2876 apkPath: "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk",
2877 },
2878 {
2879 moduleName: "foo2",
2880 variantName: "android_common",
2881 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2882 },
2883 {
2884 moduleName: "foo2",
2885 variantName: "android_common_bar2",
2886 // Note that this may cause the duplicate output error.
2887 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2888 },
2889 {
2890 moduleName: "foo2",
2891 variantName: "android_common_baz2",
2892 apkPath: "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
2893 },
2894 } {
2895 variant := ctx.ModuleForTests(expected.moduleName, expected.variantName)
2896 variant.Output(expected.apkPath)
2897 }
2898}
2899
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002900func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002901 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002902 android_app {
2903 name: "foo",
2904 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002905 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002906 }
2907
2908 override_android_app {
2909 name: "bar",
2910 base: "foo",
2911 package_name: "org.dandroid.bp",
2912 }
2913
2914 android_test {
2915 name: "baz",
2916 srcs: ["b.java"],
2917 instrumentation_for: "foo",
2918 }
2919
2920 android_test {
2921 name: "qux",
2922 srcs: ["b.java"],
2923 instrumentation_for: "bar",
2924 }
2925 `)
2926
2927 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002928 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002929 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002930 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2931 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2932 }
2933
2934 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002935 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002936 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002937 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2938 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2939 }
2940}
2941
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002942func TestOverrideAndroidTest(t *testing.T) {
2943 ctx, _ := testJava(t, `
2944 android_app {
2945 name: "foo",
2946 srcs: ["a.java"],
2947 package_name: "com.android.foo",
2948 sdk_version: "current",
2949 }
2950
2951 override_android_app {
2952 name: "bar",
2953 base: "foo",
2954 package_name: "com.android.bar",
2955 }
2956
2957 android_test {
2958 name: "foo_test",
2959 srcs: ["b.java"],
2960 instrumentation_for: "foo",
2961 }
2962
2963 override_android_test {
2964 name: "bar_test",
2965 base: "foo_test",
2966 package_name: "com.android.bar.test",
2967 instrumentation_for: "bar",
2968 instrumentation_target_package: "com.android.bar",
2969 }
2970 `)
2971
2972 expectedVariants := []struct {
2973 moduleName string
2974 variantName string
2975 apkPath string
2976 overrides []string
2977 targetVariant string
2978 packageFlag string
2979 targetPackageFlag string
2980 }{
2981 {
2982 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002983 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002984 overrides: nil,
2985 targetVariant: "android_common",
2986 packageFlag: "",
2987 targetPackageFlag: "",
2988 },
2989 {
2990 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002991 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002992 overrides: []string{"foo_test"},
2993 targetVariant: "android_common_bar",
2994 packageFlag: "com.android.bar.test",
2995 targetPackageFlag: "com.android.bar",
2996 },
2997 }
2998 for _, expected := range expectedVariants {
2999 variant := ctx.ModuleForTests("foo_test", expected.variantName)
3000
3001 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003002 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003003
3004 // Check if the overrides field values are correctly aggregated.
3005 mod := variant.Module().(*AndroidTest)
zhidoua2ce78f2022-02-17 02:33:12 +00003006 if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003007 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
zhidoua2ce78f2022-02-17 02:33:12 +00003008 expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003009 }
3010
3011 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01003012 javac := variant.Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003013 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003014 if !strings.Contains(javac.Args["classpath"], turbine) {
3015 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
3016 }
3017
3018 // Check aapt2 flags.
3019 res := variant.Output("package-res.apk")
3020 aapt2Flags := res.Args["flags"]
3021 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00003022 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003023 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
3024 }
3025}
3026
Jaewoong Jung39982342020-01-14 10:27:18 -08003027func TestAndroidTest_FixTestConfig(t *testing.T) {
3028 ctx, _ := testJava(t, `
3029 android_app {
3030 name: "foo",
3031 srcs: ["a.java"],
3032 package_name: "com.android.foo",
3033 sdk_version: "current",
3034 }
3035
3036 android_test {
3037 name: "foo_test",
3038 srcs: ["b.java"],
3039 instrumentation_for: "foo",
3040 }
3041
3042 android_test {
3043 name: "bar_test",
3044 srcs: ["b.java"],
3045 package_name: "com.android.bar.test",
3046 instrumentation_for: "foo",
Seth Moorec6f4b532023-02-02 13:22:26 -08003047 mainline_package_name: "com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08003048 }
3049
3050 override_android_test {
3051 name: "baz_test",
3052 base: "foo_test",
3053 package_name: "com.android.baz.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08003054 mainline_package_name: "com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08003055 }
3056 `)
3057
3058 testCases := []struct {
3059 moduleName string
3060 variantName string
3061 expectedFlags []string
3062 }{
3063 {
3064 moduleName: "foo_test",
3065 variantName: "android_common",
3066 },
3067 {
3068 moduleName: "bar_test",
3069 variantName: "android_common",
3070 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003071 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003072 "--package-name com.android.bar.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08003073 "--mainline-package-name com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08003074 },
3075 },
3076 {
3077 moduleName: "foo_test",
3078 variantName: "android_common_baz_test",
3079 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003080 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003081 "--package-name com.android.baz.test",
3082 "--test-file-name baz_test.apk",
Seth Moorec6f4b532023-02-02 13:22:26 -08003083 "out/soong/.intermediates/foo_test/android_common_baz_test/test_config_fixer/AndroidTest.xml",
3084 "--mainline-package-name com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08003085 },
3086 },
3087 }
3088
3089 for _, test := range testCases {
3090 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01003091 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08003092
3093 if len(test.expectedFlags) > 0 {
3094 if params.Rule == nil {
3095 t.Errorf("test_config_fixer was expected to run, but didn't")
3096 } else {
3097 for _, flag := range test.expectedFlags {
3098 if !strings.Contains(params.RuleParams.Command, flag) {
3099 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
3100 }
3101 }
3102 }
3103 } else {
3104 if params.Rule != nil {
3105 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
3106 }
3107 }
Jaewoong Jung39982342020-01-14 10:27:18 -08003108 }
3109}
3110
Paul Duffin53a70a42022-01-11 14:35:55 +00003111func TestInstrumentationTargetPrebuilt(t *testing.T) {
3112 bp := `
3113 android_app_import {
3114 name: "foo",
3115 apk: "foo.apk",
3116 presigned: true,
3117 }
3118
3119 android_test {
3120 name: "bar",
3121 srcs: ["a.java"],
3122 instrumentation_for: "foo",
3123 sdk_version: "current",
3124 }
3125 `
3126
3127 android.GroupFixturePreparers(
3128 PrepareForTestWithJavaDefaultModules,
3129 ).ExtendWithErrorHandler(
3130 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
3131 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
3132 RunTestWithBp(t, bp)
3133}
3134
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003135func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07003136 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003137 cc_library {
3138 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08003139 sdk_version: "current",
3140 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003141 }
3142
3143 android_test {
3144 name: "stl",
3145 jni_libs: ["libjni"],
3146 compile_multilib: "both",
3147 sdk_version: "current",
3148 stl: "c++_shared",
3149 }
3150
3151 android_test {
3152 name: "system",
3153 jni_libs: ["libjni"],
3154 compile_multilib: "both",
3155 sdk_version: "current",
3156 }
3157 `)
3158
3159 testCases := []struct {
3160 name string
3161 jnis []string
3162 }{
3163 {"stl",
3164 []string{
3165 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07003166 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003167 },
3168 },
3169 {"system",
3170 []string{
3171 "libjni.so",
3172 },
3173 },
3174 }
3175
3176 for _, test := range testCases {
3177 t.Run(test.name, func(t *testing.T) {
3178 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07003179 jniLibZip := app.Output("jnilibs.zip")
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003180 var jnis []string
3181 args := strings.Fields(jniLibZip.Args["jarArgs"])
3182 for i := 0; i < len(args); i++ {
3183 if args[i] == "-f" {
3184 jnis = append(jnis, args[i+1])
3185 i += 1
3186 }
3187 }
3188 jnisJoined := strings.Join(jnis, " ")
3189 for _, jni := range test.jnis {
3190 if !strings.Contains(jnisJoined, jni) {
3191 t.Errorf("missing jni %q in %q", jni, jnis)
3192 }
3193 }
3194 })
3195 }
3196}
Colin Cross50ddcc42019-05-16 12:28:22 -07003197
3198func TestUsesLibraries(t *testing.T) {
3199 bp := `
3200 java_sdk_library {
3201 name: "foo",
3202 srcs: ["a.java"],
3203 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003204 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003205 }
3206
3207 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01003208 name: "qux",
3209 srcs: ["a.java"],
3210 api_packages: ["qux"],
3211 sdk_version: "current",
3212 }
3213
3214 java_sdk_library {
3215 name: "quuz",
3216 srcs: ["a.java"],
3217 api_packages: ["quuz"],
3218 sdk_version: "current",
3219 }
3220
3221 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003222 name: "fred",
3223 srcs: ["a.java"],
3224 api_packages: ["fred"],
3225 sdk_version: "current",
3226 }
3227
3228 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07003229 name: "bar",
3230 srcs: ["a.java"],
3231 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003232 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003233 }
3234
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01003235 java_sdk_library {
3236 name: "runtime-library",
3237 srcs: ["a.java"],
3238 sdk_version: "current",
3239 }
3240
3241 java_library {
3242 name: "static-runtime-helper",
3243 srcs: ["a.java"],
3244 libs: ["runtime-library"],
3245 sdk_version: "current",
3246 }
3247
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003248 java_library {
3249 name: "runtime-required-x",
3250 srcs: ["a.java"],
3251 installable: true,
3252 sdk_version: "current",
3253 }
3254
3255 java_library {
3256 name: "runtime-optional-x",
3257 srcs: ["a.java"],
3258 installable: true,
3259 sdk_version: "current",
3260 }
3261
3262 android_library {
3263 name: "static-x",
3264 uses_libs: ["runtime-required-x"],
3265 optional_uses_libs: ["runtime-optional-x"],
3266 sdk_version: "current",
3267 }
3268
3269 java_library {
3270 name: "runtime-required-y",
3271 srcs: ["a.java"],
3272 installable: true,
3273 sdk_version: "current",
3274 }
3275
3276 java_library {
3277 name: "runtime-optional-y",
3278 srcs: ["a.java"],
3279 installable: true,
3280 sdk_version: "current",
3281 }
3282
3283 java_library {
3284 name: "static-y",
3285 srcs: ["a.java"],
3286 uses_libs: ["runtime-required-y"],
Jiakai Zhang36937082024-04-15 11:15:50 +00003287 optional_uses_libs: [
3288 "runtime-optional-y",
3289 "missing-lib-a",
3290 ],
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003291 sdk_version: "current",
3292 }
3293
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003294 // A library that has to use "provides_uses_lib", because:
3295 // - it is not an SDK library
3296 // - its library name is different from its module name
3297 java_library {
3298 name: "non-sdk-lib",
3299 provides_uses_lib: "com.non.sdk.lib",
3300 installable: true,
3301 srcs: ["a.java"],
3302 }
3303
Colin Cross50ddcc42019-05-16 12:28:22 -07003304 android_app {
3305 name: "app",
3306 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003307 libs: [
3308 "qux",
3309 "quuz.stubs"
3310 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003311 static_libs: [
3312 "static-runtime-helper",
3313 // statically linked component libraries should not pull their SDK libraries,
3314 // so "fred" should not be added to class loader context
3315 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003316 "static-x",
3317 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003318 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003319 uses_libs: [
3320 "foo",
3321 "non-sdk-lib"
3322 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003323 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003324 optional_uses_libs: [
3325 "bar",
Jiakai Zhangf98da192024-04-15 11:15:41 +00003326 "missing-lib-b",
Colin Cross50ddcc42019-05-16 12:28:22 -07003327 ],
3328 }
3329
3330 android_app_import {
3331 name: "prebuilt",
3332 apk: "prebuilts/apk/app.apk",
3333 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003334 uses_libs: [
3335 "foo",
3336 "non-sdk-lib",
3337 "android.test.runner"
3338 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07003339 optional_uses_libs: [
3340 "bar",
Jiakai Zhangf98da192024-04-15 11:15:41 +00003341 "missing-lib-b",
Colin Cross50ddcc42019-05-16 12:28:22 -07003342 ],
3343 }
3344 `
3345
Paul Duffin71ae5942021-03-22 15:36:52 +00003346 result := android.GroupFixturePreparers(
3347 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003348 PrepareForTestWithJavaSdkLibraryFiles,
3349 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Jiakai Zhang48203e32023-06-02 23:42:21 +01003350 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3351 variables.BuildWarningBadOptionalUsesLibsAllowlist = []string{"app", "prebuilt"}
3352 }),
Paul Duffind234b412021-03-12 23:04:46 +00003353 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07003354
Paul Duffind234b412021-03-12 23:04:46 +00003355 app := result.ModuleForTests("app", "android_common")
3356 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07003357
Paul Duffin859fe962020-05-15 10:20:31 +01003358 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003359 // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be
3360 // propagated from dependencies.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003361 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
Jiyong Parkd044bb42024-05-15 02:09:54 +09003362 expectManifestFixerArgs := `--extract-native-libs=true ` +
3363 `--uses-library foo ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003364 `--uses-library com.non.sdk.lib ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003365 `--uses-library qux ` +
3366 `--uses-library quuz ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003367 `--uses-library runtime-library ` +
3368 `--uses-library runtime-required-x ` +
3369 `--uses-library runtime-required-y ` +
3370 `--optional-uses-library bar ` +
3371 `--optional-uses-library runtime-optional-x ` +
3372 `--optional-uses-library runtime-optional-y`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003373 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01003374
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003375 // Test that all libraries are verified (library order matters).
3376 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
3377 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00003378 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003379 `--uses-library qux ` +
3380 `--uses-library quuz ` +
3381 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003382 `--uses-library runtime-required-x ` +
3383 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003384 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003385 `--optional-uses-library runtime-optional-x ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003386 `--optional-uses-library runtime-optional-y ` +
Jiakai Zhang36937082024-04-15 11:15:50 +00003387 `--missing-optional-uses-library missing-lib-b ` +
3388 `--missing-optional-uses-library missing-lib-a`
Paul Duffind234b412021-03-12 23:04:46 +00003389 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003390
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003391 // Test that all libraries are verified for an APK (library order matters).
3392 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00003393 verifyApkArgs := `--uses-library foo ` +
3394 `--uses-library com.non.sdk.lib ` +
3395 `--uses-library android.test.runner ` +
3396 `--optional-uses-library bar ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003397 `--missing-optional-uses-library missing-lib-b `
Paul Duffind234b412021-03-12 23:04:46 +00003398 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003399
Jiakai Zhanga4496782023-05-17 16:57:30 +01003400 // Test that necessary args are passed for constructing CLC in Ninja phase.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003401 cmd := app.Rule("dexpreopt").RuleParams.Command
Jiakai Zhanga4496782023-05-17 16:57:30 +01003402 android.AssertStringDoesContain(t, "dexpreopt app cmd context", cmd, "--context-json=")
3403 android.AssertStringDoesContain(t, "dexpreopt app cmd product_packages", cmd,
Spandan Das2069c3f2023-12-06 19:40:24 +00003404 "--product-packages=out/soong/.intermediates/app/android_common/dexpreopt/app/product_packages.txt")
Colin Cross50ddcc42019-05-16 12:28:22 -07003405}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003406
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003407func TestDexpreoptBcp(t *testing.T) {
3408 bp := `
3409 java_sdk_library {
3410 name: "foo",
3411 srcs: ["a.java"],
3412 api_packages: ["foo"],
3413 sdk_version: "current",
3414 }
3415
3416 java_sdk_library {
3417 name: "bar",
3418 srcs: ["a.java"],
3419 api_packages: ["bar"],
3420 permitted_packages: ["bar"],
3421 sdk_version: "current",
3422 }
3423
3424 android_app {
3425 name: "app",
3426 srcs: ["a.java"],
3427 sdk_version: "current",
3428 }
3429 `
3430
3431 testCases := []struct {
3432 name string
3433 with bool
3434 expect string
3435 }{
3436 {
3437 name: "with updatable bcp",
3438 with: true,
3439 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
3440 },
3441 {
3442 name: "without updatable bcp",
3443 with: false,
3444 expect: "/system/framework/foo.jar",
3445 },
3446 }
3447
3448 for _, test := range testCases {
3449 t.Run(test.name, func(t *testing.T) {
3450 result := android.GroupFixturePreparers(
3451 prepareForJavaTest,
3452 PrepareForTestWithJavaSdkLibraryFiles,
3453 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
3454 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01003455 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003456 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
3457 ).RunTestWithBp(t, bp)
3458
3459 app := result.ModuleForTests("app", "android_common")
3460 cmd := app.Rule("dexpreopt").RuleParams.Command
3461 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
3462 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
3463 })
3464 }
3465}
3466
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003467func TestCodelessApp(t *testing.T) {
3468 testCases := []struct {
3469 name string
3470 bp string
3471 noCode bool
3472 }{
3473 {
3474 name: "normal",
3475 bp: `
3476 android_app {
3477 name: "foo",
3478 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003479 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003480 }
3481 `,
3482 noCode: false,
3483 },
3484 {
3485 name: "app without sources",
3486 bp: `
3487 android_app {
3488 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003489 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003490 }
3491 `,
3492 noCode: true,
3493 },
3494 {
3495 name: "app with libraries",
3496 bp: `
3497 android_app {
3498 name: "foo",
3499 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003500 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003501 }
3502
3503 java_library {
3504 name: "lib",
3505 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003506 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003507 }
3508 `,
3509 noCode: false,
3510 },
3511 {
3512 name: "app with sourceless libraries",
3513 bp: `
3514 android_app {
3515 name: "foo",
3516 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003517 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003518 }
3519
3520 java_library {
3521 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003522 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003523 }
3524 `,
3525 // TODO(jungjw): this should probably be true
3526 noCode: false,
3527 },
3528 }
3529
3530 for _, test := range testCases {
3531 t.Run(test.name, func(t *testing.T) {
3532 ctx := testApp(t, test.bp)
3533
3534 foo := ctx.ModuleForTests("foo", "android_common")
3535 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3536 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
3537 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
3538 }
3539 })
3540 }
3541}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07003542
Colin Cross53a87f52019-06-25 13:35:30 -07003543func TestUncompressDex(t *testing.T) {
3544 testCases := []struct {
3545 name string
3546 bp string
3547
3548 uncompressedPlatform bool
3549 uncompressedUnbundled bool
3550 }{
3551 {
3552 name: "normal",
3553 bp: `
3554 android_app {
3555 name: "foo",
3556 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003557 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003558 }
3559 `,
3560 uncompressedPlatform: true,
3561 uncompressedUnbundled: false,
3562 },
3563 {
3564 name: "use_embedded_dex",
3565 bp: `
3566 android_app {
3567 name: "foo",
3568 use_embedded_dex: true,
3569 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003570 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003571 }
3572 `,
3573 uncompressedPlatform: true,
3574 uncompressedUnbundled: true,
3575 },
3576 {
3577 name: "privileged",
3578 bp: `
3579 android_app {
3580 name: "foo",
3581 privileged: true,
3582 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003583 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003584 }
3585 `,
3586 uncompressedPlatform: true,
3587 uncompressedUnbundled: true,
3588 },
David Srbeckye033cba2020-05-20 22:20:28 +01003589 {
3590 name: "normal_uncompress_dex_true",
3591 bp: `
3592 android_app {
3593 name: "foo",
3594 srcs: ["a.java"],
3595 sdk_version: "current",
3596 uncompress_dex: true,
3597 }
3598 `,
3599 uncompressedPlatform: true,
3600 uncompressedUnbundled: true,
3601 },
3602 {
3603 name: "normal_uncompress_dex_false",
3604 bp: `
3605 android_app {
3606 name: "foo",
3607 srcs: ["a.java"],
3608 sdk_version: "current",
3609 uncompress_dex: false,
3610 }
3611 `,
3612 uncompressedPlatform: false,
3613 uncompressedUnbundled: false,
3614 },
Colin Cross53a87f52019-06-25 13:35:30 -07003615 }
3616
3617 test := func(t *testing.T, bp string, want bool, unbundled bool) {
3618 t.Helper()
3619
Paul Duffin71ae5942021-03-22 15:36:52 +00003620 result := android.GroupFixturePreparers(
3621 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003622 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00003623 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3624 if unbundled {
3625 variables.Unbundled_build = proptools.BoolPtr(true)
3626 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
3627 }
3628 }),
3629 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07003630
Paul Duffincdb88a92021-03-14 00:36:50 +00003631 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07003632 dex := foo.Rule("r8")
3633 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
3634 aligned := foo.MaybeRule("zipalign").Rule != nil
3635
Paul Duffincdb88a92021-03-14 00:36:50 +00003636 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07003637
Paul Duffincdb88a92021-03-14 00:36:50 +00003638 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07003639 }
3640
3641 for _, tt := range testCases {
3642 t.Run(tt.name, func(t *testing.T) {
3643 t.Run("platform", func(t *testing.T) {
3644 test(t, tt.bp, tt.uncompressedPlatform, false)
3645 })
3646 t.Run("unbundled", func(t *testing.T) {
3647 test(t, tt.bp, tt.uncompressedUnbundled, true)
3648 })
3649 })
3650 }
3651}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003652
3653func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
3654 if expectedValue != "" {
3655 expectedFlag := "--" + flagName + " " + expectedValue
3656 if !strings.Contains(aapt2Flags, expectedFlag) {
3657 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
3658 }
3659 } else {
3660 unexpectedFlag := "--" + flagName
3661 if strings.Contains(aapt2Flags, unexpectedFlag) {
3662 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
3663 }
3664 }
3665}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08003666
Cole Faust9a631312020-10-22 21:05:24 +00003667func TestExportedProguardFlagFiles(t *testing.T) {
3668 ctx, _ := testJava(t, `
3669 android_app {
3670 name: "foo",
3671 sdk_version: "current",
Colin Crosscde55342024-03-27 14:11:51 -07003672 static_libs: [
3673 "lib1",
3674 "lib3",
3675 ],
Cole Faust9a631312020-10-22 21:05:24 +00003676 }
3677
3678 android_library {
3679 name: "lib1",
3680 sdk_version: "current",
3681 optimize: {
3682 proguard_flags_files: ["lib1proguard.cfg"],
Colin Crosscde55342024-03-27 14:11:51 -07003683 },
3684 static_libs: ["lib2"],
3685 }
3686
3687 android_library {
3688 name: "lib2",
3689 sdk_version: "current",
3690 optimize: {
3691 proguard_flags_files: ["lib2proguard.cfg"],
Cole Faust9a631312020-10-22 21:05:24 +00003692 }
3693 }
Colin Crosscde55342024-03-27 14:11:51 -07003694
3695 android_library_import {
3696 name: "lib3",
3697 sdk_version: "current",
3698 aars: ["lib3.aar"],
3699 static_libs: ["lib4"],
3700 }
3701
3702 android_library {
3703 name: "lib4",
3704 sdk_version: "current",
3705 optimize: {
3706 proguard_flags_files: ["lib4proguard.cfg"],
3707 }
3708 }
3709
3710
Cole Faust9a631312020-10-22 21:05:24 +00003711 `)
3712
3713 m := ctx.ModuleForTests("foo", "android_common")
Colin Crosscde55342024-03-27 14:11:51 -07003714 r8 := m.Rule("java.r8")
3715 implicits := r8.Implicits.RelativeToTop().Strings()
3716 android.AssertStringListContains(t, "r8 implicits", implicits, "lib1proguard.cfg")
3717 android.AssertStringListContains(t, "r8 implicits", implicits, "lib2proguard.cfg")
3718 android.AssertStringListContains(t, "r8 implicits", implicits, "lib4proguard.cfg")
3719 android.AssertStringListContains(t, "r8 implicits", implicits, "out/soong/.intermediates/lib3/android_common/aar/proguard.txt")
Cole Faust9a631312020-10-22 21:05:24 +00003720
Colin Crosscde55342024-03-27 14:11:51 -07003721 flags := r8.Args["r8Flags"]
3722 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib1proguard.cfg")
3723 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib2proguard.cfg")
3724 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib4proguard.cfg")
3725 android.AssertStringDoesContain(t, "r8 flags", flags, "-include out/soong/.intermediates/lib3/android_common/aar/proguard.txt")
Cole Faust9a631312020-10-22 21:05:24 +00003726}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003727
3728func TestTargetSdkVersionManifestFixer(t *testing.T) {
3729 platform_sdk_codename := "Tiramisu"
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003730 platform_sdk_version := 33
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003731 testCases := []struct {
3732 name string
3733 targetSdkVersionInBp string
3734 targetSdkVersionExpected string
3735 unbundledBuild bool
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003736 platformSdkFinal bool
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003737 }{
3738 {
3739 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
3740 targetSdkVersionInBp: "30",
3741 targetSdkVersionExpected: "30",
3742 unbundledBuild: false,
3743 },
3744 {
3745 name: "Unbundled build: Android.bp has targetSdkVersion",
3746 targetSdkVersionInBp: "30",
3747 targetSdkVersionExpected: "30",
3748 unbundledBuild: true,
3749 },
3750 {
3751 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3752 targetSdkVersionInBp: platform_sdk_codename,
3753 targetSdkVersionExpected: platform_sdk_codename,
3754 unbundledBuild: false,
3755 },
3756 {
3757 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3758 targetSdkVersionInBp: platform_sdk_codename,
3759 targetSdkVersionExpected: "10000",
3760 unbundledBuild: true,
3761 },
3762
3763 {
3764 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
3765 targetSdkVersionExpected: platform_sdk_codename,
3766 unbundledBuild: false,
3767 },
3768 {
3769 name: "Unbundled build: Android.bp has no targetSdkVersion",
3770 targetSdkVersionExpected: "10000",
3771 unbundledBuild: true,
3772 },
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003773 {
3774 name: "Bundled build in REL branches",
3775 targetSdkVersionExpected: "33",
3776 unbundledBuild: false,
3777 platformSdkFinal: true,
3778 },
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003779 }
3780 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003781 targetSdkVersionTemplate := ""
3782 if testCase.targetSdkVersionInBp != "" {
3783 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, testCase.targetSdkVersionInBp)
3784 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003785 bp := fmt.Sprintf(`
3786 android_app {
3787 name: "foo",
3788 sdk_version: "current",
Spandan Dasca70fc42023-03-01 23:38:49 +00003789 %s
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003790 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003791 `, targetSdkVersionTemplate)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003792 fixture := android.GroupFixturePreparers(
3793 prepareForJavaTest,
3794 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003795 if testCase.platformSdkFinal {
3796 variables.Platform_sdk_final = proptools.BoolPtr(true)
3797 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003798 // explicitly set platform_sdk_codename to make the test deterministic
3799 variables.Platform_sdk_codename = &platform_sdk_codename
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003800 variables.Platform_sdk_version = &platform_sdk_version
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003801 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3802 // create a non-empty list if unbundledBuild==true
3803 if testCase.unbundledBuild {
3804 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3805 }
3806 }),
3807 )
3808
3809 result := fixture.RunTestWithBp(t, bp)
3810 foo := result.ModuleForTests("foo", "android_common")
3811
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003812 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3813 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003814 }
3815}
Colin Cross412436f2022-04-07 17:40:07 -07003816
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003817func TestDefaultAppTargetSdkVersionForUpdatableModules(t *testing.T) {
3818 platform_sdk_codename := "Tiramisu"
3819 platform_sdk_version := 33
3820 testCases := []struct {
3821 name string
3822 platform_sdk_final bool
3823 targetSdkVersionInBp *string
3824 targetSdkVersionExpected *string
3825 updatable bool
3826 }{
3827 {
3828 name: "Non-Updatable Module: Android.bp has older targetSdkVersion",
3829 targetSdkVersionInBp: proptools.StringPtr("29"),
3830 targetSdkVersionExpected: proptools.StringPtr("29"),
3831 updatable: false,
3832 },
3833 {
3834 name: "Updatable Module: Android.bp has older targetSdkVersion",
3835 targetSdkVersionInBp: proptools.StringPtr("30"),
3836 targetSdkVersionExpected: proptools.StringPtr("30"),
3837 updatable: true,
3838 },
3839 {
3840 name: "Updatable Module: Android.bp has no targetSdkVersion",
3841 targetSdkVersionExpected: proptools.StringPtr("10000"),
3842 updatable: true,
3843 },
3844 {
3845 name: "[SDK finalised] Non-Updatable Module: Android.bp has older targetSdkVersion",
3846 platform_sdk_final: true,
3847 targetSdkVersionInBp: proptools.StringPtr("30"),
3848 targetSdkVersionExpected: proptools.StringPtr("30"),
3849 updatable: false,
3850 },
3851 {
3852 name: "[SDK finalised] Updatable Module: Android.bp has older targetSdkVersion",
3853 platform_sdk_final: true,
3854 targetSdkVersionInBp: proptools.StringPtr("30"),
3855 targetSdkVersionExpected: proptools.StringPtr("30"),
3856 updatable: true,
3857 },
3858 {
3859 name: "[SDK finalised] Updatable Module: Android.bp has targetSdkVersion as platform sdk codename",
3860 platform_sdk_final: true,
3861 targetSdkVersionInBp: proptools.StringPtr(platform_sdk_codename),
3862 targetSdkVersionExpected: proptools.StringPtr("33"),
3863 updatable: true,
3864 },
3865 {
3866 name: "[SDK finalised] Updatable Module: Android.bp has no targetSdkVersion",
3867 platform_sdk_final: true,
3868 targetSdkVersionExpected: proptools.StringPtr("33"),
3869 updatable: true,
3870 },
3871 }
3872 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003873 targetSdkVersionTemplate := ""
3874 if testCase.targetSdkVersionInBp != nil {
3875 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, *testCase.targetSdkVersionInBp)
3876 }
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003877 bp := fmt.Sprintf(`
3878 android_app {
3879 name: "foo",
3880 sdk_version: "current",
3881 min_sdk_version: "29",
Spandan Dasca70fc42023-03-01 23:38:49 +00003882 %s
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003883 updatable: %t,
3884 enforce_default_target_sdk_version: %t
3885 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003886 `, targetSdkVersionTemplate, testCase.updatable, testCase.updatable) // enforce default target sdk version if app is updatable
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003887
3888 fixture := android.GroupFixturePreparers(
3889 PrepareForTestWithJavaDefaultModules,
3890 android.PrepareForTestWithAllowMissingDependencies,
3891 android.PrepareForTestWithAndroidMk,
3892 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3893 // explicitly set following platform variables to make the test deterministic
3894 variables.Platform_sdk_final = &testCase.platform_sdk_final
3895 variables.Platform_sdk_version = &platform_sdk_version
3896 variables.Platform_sdk_codename = &platform_sdk_codename
3897 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
Harshit Mahajan18845d02023-01-11 18:39:12 +00003898 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003899 variables.Unbundled_build_apps = []string{"sampleModule"}
3900 }),
3901 )
3902
3903 result := fixture.RunTestWithBp(t, bp)
3904 foo := result.ModuleForTests("foo", "android_common")
3905
3906 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3907 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+*testCase.targetSdkVersionExpected)
3908 }
3909}
3910
3911func TestEnforceDefaultAppTargetSdkVersionFlag(t *testing.T) {
3912 platform_sdk_codename := "Tiramisu"
3913 platform_sdk_version := 33
3914 testCases := []struct {
3915 name string
3916 enforceDefaultTargetSdkVersion bool
3917 expectedError string
3918 platform_sdk_final bool
3919 targetSdkVersionInBp string
3920 targetSdkVersionExpected string
3921 updatable bool
3922 }{
3923 {
3924 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
3925 enforceDefaultTargetSdkVersion: false,
3926 targetSdkVersionInBp: "29",
3927 targetSdkVersionExpected: "29",
3928 updatable: false,
3929 },
3930 {
3931 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3932 enforceDefaultTargetSdkVersion: true,
3933 platform_sdk_final: true,
3934 targetSdkVersionInBp: "current",
3935 targetSdkVersionExpected: "33",
3936 updatable: true,
3937 },
3938 {
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003939 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003940 enforceDefaultTargetSdkVersion: true,
3941 platform_sdk_final: false,
3942 targetSdkVersionInBp: "current",
3943 targetSdkVersionExpected: "10000",
3944 updatable: false,
3945 },
3946 {
3947 name: "Not enforcing Target SDK Version for Updatable app",
3948 enforceDefaultTargetSdkVersion: false,
3949 expectedError: "Updatable apps must enforce default target sdk version",
3950 targetSdkVersionInBp: "29",
3951 targetSdkVersionExpected: "29",
3952 updatable: true,
3953 },
3954 }
3955 for _, testCase := range testCases {
3956 errExpected := testCase.expectedError != ""
3957 bp := fmt.Sprintf(`
3958 android_app {
3959 name: "foo",
3960 enforce_default_target_sdk_version: %t,
3961 sdk_version: "current",
3962 min_sdk_version: "29",
3963 target_sdk_version: "%v",
3964 updatable: %t
3965 }
3966 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp, testCase.updatable)
3967
3968 fixture := android.GroupFixturePreparers(
3969 PrepareForTestWithJavaDefaultModules,
3970 android.PrepareForTestWithAllowMissingDependencies,
3971 android.PrepareForTestWithAndroidMk,
3972 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3973 // explicitly set following platform variables to make the test deterministic
3974 variables.Platform_sdk_final = &testCase.platform_sdk_final
3975 variables.Platform_sdk_version = &platform_sdk_version
3976 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00003977 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003978 variables.Unbundled_build_apps = []string{"sampleModule"}
3979 }),
3980 )
3981
3982 errorHandler := android.FixtureExpectsNoErrors
3983 if errExpected {
3984 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
3985 }
3986 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
3987
3988 if !errExpected {
3989 foo := result.ModuleForTests("foo", "android_common")
3990 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3991 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3992 }
3993 }
3994}
3995
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003996func TestEnforceDefaultAppTargetSdkVersionFlagForTests(t *testing.T) {
3997 platform_sdk_codename := "Tiramisu"
3998 platform_sdk_version := 33
3999 testCases := []struct {
4000 name string
4001 enforceDefaultTargetSdkVersion bool
4002 expectedError string
4003 platform_sdk_final bool
4004 targetSdkVersionInBp string
4005 targetSdkVersionExpected string
4006 }{
4007 {
4008 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
4009 enforceDefaultTargetSdkVersion: false,
4010 targetSdkVersionInBp: "29",
4011 targetSdkVersionExpected: "29",
4012 },
4013 {
4014 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4015 enforceDefaultTargetSdkVersion: true,
4016 platform_sdk_final: true,
4017 targetSdkVersionInBp: "current",
4018 targetSdkVersionExpected: "33",
4019 },
4020 {
4021 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4022 enforceDefaultTargetSdkVersion: true,
4023 platform_sdk_final: false,
4024 targetSdkVersionInBp: "current",
4025 targetSdkVersionExpected: "10000",
4026 },
4027 }
4028 for _, testCase := range testCases {
4029 errExpected := testCase.expectedError != ""
4030 bp := fmt.Sprintf(`
4031 android_test {
4032 name: "foo",
4033 enforce_default_target_sdk_version: %t,
4034 min_sdk_version: "29",
4035 target_sdk_version: "%v",
4036 }
4037 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp)
4038
4039 fixture := android.GroupFixturePreparers(
4040 PrepareForTestWithJavaDefaultModules,
4041 android.PrepareForTestWithAllowMissingDependencies,
4042 android.PrepareForTestWithAndroidMk,
4043 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4044 // explicitly set following platform variables to make the test deterministic
4045 variables.Platform_sdk_final = &testCase.platform_sdk_final
4046 variables.Platform_sdk_version = &platform_sdk_version
4047 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00004048 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004049 variables.Unbundled_build_apps = []string{"sampleModule"}
4050 }),
4051 )
4052
4053 errorHandler := android.FixtureExpectsNoErrors
4054 if errExpected {
4055 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
4056 }
4057 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
4058
4059 if !errExpected {
4060 foo := result.ModuleForTests("foo", "android_common")
4061 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4062 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4063 }
4064 }
4065}
4066
Colin Cross412436f2022-04-07 17:40:07 -07004067func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
4068 result := android.GroupFixturePreparers(
4069 PrepareForTestWithJavaDefaultModules,
4070 android.PrepareForTestWithAllowMissingDependencies,
4071 android.PrepareForTestWithAndroidMk,
4072 ).RunTestWithBp(t, `
4073 android_app {
4074 name: "foo",
4075 srcs: ["a.java"],
4076 certificate: ":missing_certificate",
4077 sdk_version: "current",
Zyan Wub7550aa2023-05-18 15:46:31 +08004078 }
4079
4080 android_app {
4081 name: "bar",
4082 srcs: ["a.java"],
4083 certificate: ":missing_certificate",
4084 product_specific: true,
4085 sdk_version: "current",
Colin Cross412436f2022-04-07 17:40:07 -07004086 }`)
4087
4088 foo := result.ModuleForTests("foo", "android_common")
4089 fooApk := foo.Output("foo.apk")
4090 if fooApk.Rule != android.ErrorRule {
4091 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
4092 }
4093 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
4094}
Sam Delmerico82602492022-06-10 17:05:42 +00004095
4096func TestAppIncludesJniPackages(t *testing.T) {
4097 ctx := android.GroupFixturePreparers(
4098 PrepareForTestWithJavaDefaultModules,
4099 ).RunTestWithBp(t, `
4100 android_library_import {
4101 name: "aary-nodeps",
4102 aars: ["aary.aar"],
4103 extract_jni: true,
4104 }
4105
4106 android_library {
4107 name: "aary-lib",
4108 sdk_version: "current",
4109 min_sdk_version: "21",
4110 static_libs: ["aary-nodeps"],
4111 }
4112
4113 android_app {
4114 name: "aary-lib-dep",
4115 sdk_version: "current",
4116 min_sdk_version: "21",
4117 manifest: "AndroidManifest.xml",
4118 static_libs: ["aary-lib"],
4119 use_embedded_native_libs: true,
4120 }
4121
4122 android_app {
4123 name: "aary-import-dep",
4124 sdk_version: "current",
4125 min_sdk_version: "21",
4126 manifest: "AndroidManifest.xml",
4127 static_libs: ["aary-nodeps"],
4128 use_embedded_native_libs: true,
4129 }
4130
4131 android_app {
4132 name: "aary-no-use-embedded",
4133 sdk_version: "current",
4134 min_sdk_version: "21",
4135 manifest: "AndroidManifest.xml",
4136 static_libs: ["aary-nodeps"],
4137 }`)
4138
4139 testCases := []struct {
4140 name string
4141 hasPackage bool
4142 }{
4143 {
4144 name: "aary-import-dep",
4145 hasPackage: true,
4146 },
4147 {
4148 name: "aary-lib-dep",
4149 hasPackage: true,
4150 },
4151 {
4152 name: "aary-no-use-embedded",
Jiyong Parkd044bb42024-05-15 02:09:54 +09004153 hasPackage: false,
Sam Delmerico82602492022-06-10 17:05:42 +00004154 },
4155 }
4156
4157 for _, tc := range testCases {
4158 t.Run(tc.name, func(t *testing.T) {
4159 app := ctx.ModuleForTests(tc.name, "android_common")
4160
4161 outputFile := "jnilibs.zip"
4162 jniOutputLibZip := app.MaybeOutput(outputFile)
4163 if jniOutputLibZip.Rule == nil && !tc.hasPackage {
4164 return
4165 }
4166
4167 jniPackage := "arm64-v8a_jni.zip"
4168 inputs := jniOutputLibZip.Inputs
4169 foundPackage := false
4170 for i := 0; i < len(inputs); i++ {
4171 if strings.Contains(inputs[i].String(), jniPackage) {
4172 foundPackage = true
4173 }
4174 }
4175 if foundPackage != tc.hasPackage {
4176 t.Errorf("expected to find %v in %v inputs; inputs = %v", jniPackage, outputFile, inputs)
4177 }
4178 })
4179 }
4180}
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004181
4182func TestTargetSdkVersionMtsTests(t *testing.T) {
4183 platformSdkCodename := "Tiramisu"
4184 android_test := "android_test"
4185 android_test_helper_app := "android_test_helper_app"
4186 bpTemplate := `
4187 %v {
4188 name: "mytest",
Spandan Dasb0410872024-06-25 03:30:03 +00004189 min_sdk_version: "34",
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004190 target_sdk_version: "%v",
4191 test_suites: ["othersuite", "%v"],
4192 }
4193 `
4194 testCases := []struct {
4195 desc string
4196 moduleType string
4197 targetSdkVersionInBp string
4198 targetSdkVersionExpected string
4199 testSuites string
4200 }{
4201 {
4202 desc: "Non-MTS android_test_apps targeting current should not be upgraded to 10000",
4203 moduleType: android_test,
4204 targetSdkVersionInBp: "current",
4205 targetSdkVersionExpected: platformSdkCodename,
4206 testSuites: "non-mts-suite",
4207 },
4208 {
4209 desc: "MTS android_test_apps targeting released sdks should not be upgraded to 10000",
4210 moduleType: android_test,
4211 targetSdkVersionInBp: "29",
4212 targetSdkVersionExpected: "29",
4213 testSuites: "mts-suite",
4214 },
4215 {
4216 desc: "MTS android_test_apps targeting current should be upgraded to 10000",
4217 moduleType: android_test,
4218 targetSdkVersionInBp: "current",
4219 targetSdkVersionExpected: "10000",
4220 testSuites: "mts-suite",
4221 },
4222 {
4223 desc: "MTS android_test_helper_apps targeting current should be upgraded to 10000",
4224 moduleType: android_test_helper_app,
4225 targetSdkVersionInBp: "current",
4226 targetSdkVersionExpected: "10000",
4227 testSuites: "mts-suite",
4228 },
4229 }
4230 fixture := android.GroupFixturePreparers(
4231 prepareForJavaTest,
4232 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4233 variables.Platform_sdk_codename = &platformSdkCodename
4234 variables.Platform_version_active_codenames = []string{platformSdkCodename}
4235 }),
4236 )
4237 for _, testCase := range testCases {
4238 result := fixture.RunTestWithBp(t, fmt.Sprintf(bpTemplate, testCase.moduleType, testCase.targetSdkVersionInBp, testCase.testSuites))
4239 mytest := result.ModuleForTests("mytest", "android_common")
4240 manifestFixerArgs := mytest.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4241 android.AssertStringDoesContain(t, testCase.desc, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4242 }
4243}
Andrei Onea580636b2022-08-17 16:53:46 +00004244
4245func TestPrivappAllowlist(t *testing.T) {
4246 testJavaError(t, "privileged must be set in order to use privapp_allowlist", `
4247 android_app {
4248 name: "foo",
4249 srcs: ["a.java"],
4250 privapp_allowlist: "perms.xml",
4251 }
4252 `)
4253
4254 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
4255 t,
4256 `
4257 android_app {
4258 name: "foo",
4259 srcs: ["a.java"],
Sam Delmerico15809f82023-05-15 17:21:47 -04004260 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
Andrei Onea580636b2022-08-17 16:53:46 +00004261 privileged: true,
Andrei Onea580636b2022-08-17 16:53:46 +00004262 sdk_version: "current",
4263 }
4264 override_android_app {
4265 name: "bar",
4266 base: "foo",
4267 package_name: "com.google.android.foo",
4268 }
4269 `,
4270 )
4271 app := result.ModuleForTests("foo", "android_common")
4272 overrideApp := result.ModuleForTests("foo", "android_common_bar")
4273
Sam Delmerico15809f82023-05-15 17:21:47 -04004274 // verify that privapp allowlist is created for override apps
Andrei Onea580636b2022-08-17 16:53:46 +00004275 overrideApp.Output("out/soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml")
Sam Delmerico15809f82023-05-15 17:21:47 -04004276 expectedAllowlistInput := "privapp_allowlist_com.android.foo.xml"
4277 overrideActualAllowlistInput := overrideApp.Rule("modifyAllowlist").Input.String()
4278 if expectedAllowlistInput != overrideActualAllowlistInput {
4279 t.Errorf("expected override allowlist to be %q; got %q", expectedAllowlistInput, overrideActualAllowlistInput)
Andrei Onea580636b2022-08-17 16:53:46 +00004280 }
4281
4282 // verify that permissions are copied to device
Anton Hansson0e486a42023-06-01 16:38:35 +00004283 app.Output("out/soong/target/product/test_device/system/etc/permissions/foo.xml")
4284 overrideApp.Output("out/soong/target/product/test_device/system/etc/permissions/bar.xml")
Andrei Onea580636b2022-08-17 16:53:46 +00004285}
Sam Delmericob1daccd2023-05-25 14:45:30 -04004286
4287func TestPrivappAllowlistAndroidMk(t *testing.T) {
4288 result := android.GroupFixturePreparers(
4289 PrepareForTestWithJavaDefaultModules,
4290 android.PrepareForTestWithAndroidMk,
4291 ).RunTestWithBp(
4292 t,
4293 `
4294 android_app {
4295 name: "foo",
4296 srcs: ["a.java"],
4297 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
4298 privileged: true,
4299 sdk_version: "current",
4300 }
4301 override_android_app {
4302 name: "bar",
4303 base: "foo",
4304 package_name: "com.google.android.foo",
4305 }
4306 `,
4307 )
4308 baseApp := result.ModuleForTests("foo", "android_common")
4309 overrideApp := result.ModuleForTests("foo", "android_common_bar")
4310
4311 baseAndroidApp := baseApp.Module().(*AndroidApp)
4312 baseEntries := android.AndroidMkEntriesForTest(t, result.TestContext, baseAndroidApp)[0]
4313 android.AssertStringMatches(
4314 t,
4315 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find foo.apk",
4316 baseEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4317 "\\S+foo.apk",
4318 )
4319 android.AssertStringMatches(
4320 t,
4321 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include foo.apk",
4322 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4323 "\\S+foo.apk",
4324 )
4325 android.AssertStringMatches(
4326 t,
4327 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4328 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4329 "\\S+foo.apk:\\S+/target/product/test_device/system/priv-app/foo/foo.apk",
4330 )
4331 android.AssertStringMatches(
4332 t,
4333 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4334 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004335 "privapp_allowlist_com.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/foo.xml",
Sam Delmericob1daccd2023-05-25 14:45:30 -04004336 )
4337
4338 overrideAndroidApp := overrideApp.Module().(*AndroidApp)
4339 overrideEntries := android.AndroidMkEntriesForTest(t, result.TestContext, overrideAndroidApp)[0]
4340 android.AssertStringMatches(
4341 t,
4342 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find bar.apk",
4343 overrideEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4344 "\\S+bar.apk",
4345 )
4346 android.AssertStringMatches(
4347 t,
4348 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include bar.apk",
4349 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4350 "\\S+bar.apk",
4351 )
4352 android.AssertStringMatches(
4353 t,
4354 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4355 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4356 "\\S+bar.apk:\\S+/target/product/test_device/system/priv-app/bar/bar.apk",
4357 )
4358 android.AssertStringMatches(
4359 t,
4360 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4361 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004362 "\\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 -04004363 )
4364}
Sam Delmerico0e0d96e2023-08-18 22:43:28 +00004365
Jihoon Kang84b25892023-12-01 22:01:06 +00004366func TestAppFlagsPackages(t *testing.T) {
Jihoon Kang98ea8362024-07-16 18:20:03 +00004367 ctx := android.GroupFixturePreparers(
4368 prepareForJavaTest,
4369 android.FixtureMergeMockFs(
4370 map[string][]byte{
4371 "res/layout/layout.xml": nil,
4372 "res/values/strings.xml": nil,
4373 "res/values-en-rUS/strings.xml": nil,
4374 },
4375 ),
4376 ).RunTestWithBp(t, `
Jihoon Kang84b25892023-12-01 22:01:06 +00004377 android_app {
4378 name: "foo",
4379 srcs: ["a.java"],
4380 sdk_version: "current",
4381 flags_packages: [
4382 "bar",
4383 "baz",
4384 ],
4385 }
4386 aconfig_declarations {
4387 name: "bar",
Dennis Shen4e7773d2024-01-05 19:06:50 +00004388 package: "com.example.package.bar",
Yu Liu315a53c2024-04-24 16:41:57 +00004389 container: "com.android.foo",
Jihoon Kang84b25892023-12-01 22:01:06 +00004390 srcs: [
4391 "bar.aconfig",
4392 ],
4393 }
4394 aconfig_declarations {
4395 name: "baz",
Dennis Shen4e7773d2024-01-05 19:06:50 +00004396 package: "com.example.package.baz",
Yu Liu315a53c2024-04-24 16:41:57 +00004397 container: "com.android.foo",
Jihoon Kang84b25892023-12-01 22:01:06 +00004398 srcs: [
4399 "baz.aconfig",
4400 ],
4401 }
4402 `)
4403
4404 foo := ctx.ModuleForTests("foo", "android_common")
4405
4406 // android_app module depends on aconfig_declarations listed in flags_packages
4407 android.AssertBoolEquals(t, "foo expected to depend on bar", true,
Jihoon Kang98ea8362024-07-16 18:20:03 +00004408 CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "bar"))
Jihoon Kang84b25892023-12-01 22:01:06 +00004409
4410 android.AssertBoolEquals(t, "foo expected to depend on baz", true,
Jihoon Kang98ea8362024-07-16 18:20:03 +00004411 CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "baz"))
Jihoon Kang84b25892023-12-01 22:01:06 +00004412
4413 aapt2LinkRule := foo.Rule("android/soong/java.aapt2Link")
4414 linkInFlags := aapt2LinkRule.Args["inFlags"]
4415 android.AssertStringDoesContain(t,
4416 "aapt2 link command expected to pass feature flags arguments",
4417 linkInFlags,
4418 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4419 )
Jihoon Kang98ea8362024-07-16 18:20:03 +00004420
4421 aapt2CompileRule := foo.Rule("android/soong/java.aapt2Compile")
4422 compileFlags := aapt2CompileRule.Args["cFlags"]
4423 android.AssertStringDoesContain(t,
4424 "aapt2 compile command expected to pass feature flags arguments",
4425 compileFlags,
4426 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4427 )
Jihoon Kang84b25892023-12-01 22:01:06 +00004428}
Spandan Das0727ba72024-02-13 16:37:43 +00004429
Jihoon Kang9aef7772024-06-14 23:45:06 +00004430func TestAppFlagsPackagesPropagation(t *testing.T) {
4431 ctx := testApp(t, `
4432 aconfig_declarations {
4433 name: "foo",
4434 package: "com.example.package.foo",
4435 container: "com.android.foo",
4436 srcs: [
4437 "foo.aconfig",
4438 ],
4439 }
4440 aconfig_declarations {
4441 name: "bar",
4442 package: "com.example.package.bar",
4443 container: "com.android.bar",
4444 srcs: [
4445 "bar.aconfig",
4446 ],
4447 }
4448 aconfig_declarations {
4449 name: "baz",
4450 package: "com.example.package.baz",
4451 container: "com.android.baz",
4452 srcs: [
4453 "baz.aconfig",
4454 ],
4455 }
4456 android_library {
4457 name: "foo_lib",
4458 srcs: ["a.java"],
4459 sdk_version: "current",
4460 flags_packages: [
4461 "foo",
4462 ],
4463 }
4464 android_library {
4465 name: "bar_lib",
4466 srcs: ["a.java"],
4467 sdk_version: "current",
4468 flags_packages: [
4469 "bar",
4470 ],
4471 }
4472 android_app {
4473 name: "baz_app",
4474 srcs: ["a.java"],
4475 sdk_version: "current",
4476 flags_packages: [
4477 "baz",
4478 ],
4479 static_libs: [
4480 "bar_lib",
4481 ],
4482 libs: [
4483 "foo_lib",
4484 ],
4485 }
4486 `)
4487
4488 bazApp := ctx.ModuleForTests("baz_app", "android_common")
4489
4490 // android_app module depends on aconfig_declarations listed in flags_packages
4491 // and that of static libs, but not libs
4492 aapt2LinkRule := bazApp.Rule("android/soong/java.aapt2Link")
4493 linkInFlags := aapt2LinkRule.Args["inFlags"]
4494 android.AssertStringDoesContain(t,
4495 "aapt2 link command expected to pass feature flags arguments of flags_packages and that of its static libs",
4496 linkInFlags,
4497 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4498 )
4499 android.AssertStringDoesNotContain(t,
4500 "aapt2 link command expected to not pass feature flags arguments of flags_packages of its libs",
4501 linkInFlags,
4502 "--feature-flags @out/soong/.intermediates/foo/intermediate.txt",
4503 )
4504}
4505
Spandan Das0727ba72024-02-13 16:37:43 +00004506// Test that dexpreopt is disabled if an optional_uses_libs exists, but does not provide an implementation.
4507func TestNoDexpreoptOptionalUsesLibDoesNotHaveImpl(t *testing.T) {
4508 bp := `
4509 java_sdk_library_import {
4510 name: "sdklib_noimpl",
4511 public: {
4512 jars: ["stub.jar"],
4513 },
4514 }
4515 android_app {
4516 name: "app",
4517 srcs: ["a.java"],
4518 sdk_version: "current",
4519 optional_uses_libs: [
4520 "sdklib_noimpl",
4521 ],
4522 }
4523 `
4524 result := prepareForJavaTest.RunTestWithBp(t, bp)
4525 dexpreopt := result.ModuleForTests("app", "android_common").MaybeRule("dexpreopt").Rule
4526 android.AssertBoolEquals(t, "dexpreopt should be disabled if optional_uses_libs does not have an implementation", true, dexpreopt == nil)
4527}
yangbill2af0b6e2024-03-15 09:29:29 +00004528
Ronald Braunsteincdc66f42024-04-12 11:23:19 -07004529func TestTestOnlyApp(t *testing.T) {
4530 t.Parallel()
4531 ctx := android.GroupFixturePreparers(
4532 prepareForJavaTest,
4533 ).RunTestWithBp(t, `
4534 // These should be test-only
4535 android_test {
4536 name: "android-test",
4537 }
4538 android_test_helper_app {
4539 name: "helper-app",
4540 }
4541 override_android_test {
4542 name: "override-test",
4543 base: "android-app",
4544 }
4545 // And these should not be
4546 android_app {
4547 name: "android-app",
4548 srcs: ["b.java"],
4549 sdk_version: "current",
4550 }
4551 `)
4552
4553 expectedTestOnly := []string{
4554 "android-test",
4555 "helper-app",
4556 "override-test",
4557 }
4558
4559 expectedTopLevel := []string{
4560 "android-test",
4561 "override-test",
4562 }
4563
4564 assertTestOnlyAndTopLevel(t, ctx, expectedTestOnly, expectedTopLevel)
4565}
4566
yangbill2af0b6e2024-03-15 09:29:29 +00004567func TestAppStem(t *testing.T) {
4568 ctx := testApp(t, `
4569 android_app {
4570 name: "foo",
4571 srcs: ["a.java"],
4572 stem: "foo-new",
4573 sdk_version: "current",
4574 }`)
4575
4576 foo := ctx.ModuleForTests("foo", "android_common")
4577
4578 outputs := fmt.Sprint(foo.AllOutputs())
4579 if !strings.Contains(outputs, "foo-new.apk") {
4580 t.Errorf("Module output does not contain expected apk %s", "foo-new.apk")
4581 }
4582}
Spandan Dasb9c58352024-05-13 18:29:45 +00004583
4584func TestAppMinSdkVersionOverride(t *testing.T) {
4585 result := android.GroupFixturePreparers(
4586 PrepareForTestWithJavaDefaultModules,
4587 ).RunTestWithBp(t, `
4588 android_app {
4589 name: "com.android.foo",
4590 srcs: ["a.java"],
4591 sdk_version: "current",
4592 min_sdk_version: "31",
4593 updatable: true,
4594 }
4595 override_android_app {
4596 name: "com.android.go.foo",
4597 base: "com.android.foo",
4598 min_sdk_version: "33",
4599 }
4600 `)
4601 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
4602 fooOverride := result.ModuleForTests("com.android.foo", "android_common_com.android.go.foo").Rule("manifestFixer")
4603
4604 android.AssertStringDoesContain(t,
4605 "com.android.foo: expected manifest fixer to set minSdkVersion to T",
4606 foo.BuildParams.Args["args"],
4607 "--minSdkVersion 31",
4608 )
4609 android.AssertStringDoesContain(t,
4610 "com.android.go.foo: expected manifest fixer to set minSdkVersion to T",
4611 fooOverride.BuildParams.Args["args"],
4612 "--minSdkVersion 33",
4613 )
4614
4615}
Alyssa Ketpreechasawatee8b44e2024-07-04 10:45:04 +00004616
4617func TestNotApplyDefaultUpdatableModuleVersion(t *testing.T) {
4618 result := android.GroupFixturePreparers(
4619 PrepareForTestWithJavaDefaultModules,
4620 ).RunTestWithBp(t, `
4621 android_app {
4622 name: "com.android.foo",
4623 srcs: ["a.java"],
4624 sdk_version: "current",
4625 min_sdk_version: "31",
4626 }
4627 `)
4628 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
4629 android.AssertStringDoesNotContain(t,
4630 "com.android.foo: expected manifest fixer to not set override-placeholder-version",
4631 foo.BuildParams.Args["args"],
4632 "--override-placeholder-version",
4633 )
4634}
4635
4636func TestNotApplyOverrideApexManifestDefaultVersion(t *testing.T) {
4637 result := android.GroupFixturePreparers(
4638 PrepareForTestWithJavaDefaultModules,
4639 android.FixtureMergeEnv(map[string]string{
4640 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4641 }),
4642 ).RunTestWithBp(t, `
4643 android_app {
4644 name: "com.android.foo",
4645 srcs: ["a.java"],
4646 sdk_version: "current",
4647 min_sdk_version: "31",
4648 }
4649 `)
4650 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
4651 android.AssertStringDoesNotContain(t,
4652 "com.android.foo: expected manifest fixer to not set override-placeholder-version",
4653 foo.BuildParams.Args["args"],
4654 "--override-placeholder-version",
4655 )
4656}