blob: e38a7247b9e0aef2556270f7e654bf9db9eeead2 [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
Colin Cross41955e82019-05-29 14:40:35 -0700122 outputFiles, err := foo.Module().(*AndroidApp).OutputFiles("")
123 if err != nil {
124 t.Fatal(err)
125 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000126 android.AssertPathsRelativeToTopEquals(t, `OutputFiles("")`, expectedOutputs, outputFiles)
Colin Crosse560c4a2019-03-19 16:03:11 -0700127}
128
Jeongik Cha538c0d02019-07-11 15:54:27 +0900129func TestPlatformAPIs(t *testing.T) {
130 testJava(t, `
131 android_app {
132 name: "foo",
133 srcs: ["a.java"],
134 platform_apis: true,
135 }
136 `)
137
138 testJava(t, `
139 android_app {
140 name: "foo",
141 srcs: ["a.java"],
142 sdk_version: "current",
143 }
144 `)
145
Spandan Das60999342021-11-16 04:15:33 +0000146 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 +0900147 android_app {
148 name: "bar",
149 srcs: ["b.java"],
150 }
151 `)
152
Spandan Das60999342021-11-16 04:15:33 +0000153 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 +0900154 android_app {
155 name: "bar",
156 srcs: ["b.java"],
157 sdk_version: "system_current",
158 platform_apis: true,
159 }
160 `)
161}
162
Jeongik Chae403e9e2019-12-07 00:16:24 +0900163func TestAndroidAppLinkType(t *testing.T) {
164 testJava(t, `
165 android_app {
166 name: "foo",
167 srcs: ["a.java"],
168 libs: ["bar"],
169 static_libs: ["baz"],
170 platform_apis: true,
171 }
172
173 java_library {
174 name: "bar",
175 sdk_version: "current",
176 srcs: ["b.java"],
177 }
178
179 android_library {
180 name: "baz",
181 sdk_version: "system_current",
182 srcs: ["c.java"],
183 }
184 `)
185
Steven Moreland00298982020-11-17 21:44:36 +0000186 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900187 android_app {
188 name: "foo",
189 srcs: ["a.java"],
190 libs: ["bar"],
191 sdk_version: "current",
192 static_libs: ["baz"],
193 }
194
195 java_library {
196 name: "bar",
197 sdk_version: "current",
198 srcs: ["b.java"],
199 }
200
201 android_library {
202 name: "baz",
203 sdk_version: "system_current",
204 srcs: ["c.java"],
205 }
206 `)
207
208 testJava(t, `
209 android_app {
210 name: "foo",
211 srcs: ["a.java"],
212 libs: ["bar"],
213 sdk_version: "system_current",
214 static_libs: ["baz"],
215 }
216
217 java_library {
218 name: "bar",
219 sdk_version: "current",
220 srcs: ["b.java"],
221 }
222
223 android_library {
224 name: "baz",
225 sdk_version: "system_current",
226 srcs: ["c.java"],
227 }
228 `)
229
Steven Moreland00298982020-11-17 21:44:36 +0000230 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900231 android_app {
232 name: "foo",
233 srcs: ["a.java"],
234 libs: ["bar"],
235 sdk_version: "system_current",
236 static_libs: ["baz"],
237 }
238
239 java_library {
240 name: "bar",
241 sdk_version: "current",
242 srcs: ["b.java"],
243 }
244
245 android_library {
246 name: "baz",
247 srcs: ["c.java"],
248 }
249 `)
250}
251
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100252func TestUpdatableApps(t *testing.T) {
253 testCases := []struct {
254 name string
255 bp string
256 expectedError string
257 }{
258 {
259 name: "Stable public SDK",
260 bp: `android_app {
261 name: "foo",
262 srcs: ["a.java"],
263 sdk_version: "29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100264 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100265 updatable: true,
266 }`,
267 },
268 {
269 name: "Stable system SDK",
270 bp: `android_app {
271 name: "foo",
272 srcs: ["a.java"],
273 sdk_version: "system_29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100274 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100275 updatable: true,
276 }`,
277 },
278 {
279 name: "Current public SDK",
280 bp: `android_app {
281 name: "foo",
282 srcs: ["a.java"],
283 sdk_version: "current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100284 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100285 updatable: true,
286 }`,
287 },
288 {
289 name: "Current system SDK",
290 bp: `android_app {
291 name: "foo",
292 srcs: ["a.java"],
293 sdk_version: "system_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100294 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100295 updatable: true,
296 }`,
297 },
298 {
299 name: "Current module SDK",
300 bp: `android_app {
301 name: "foo",
302 srcs: ["a.java"],
303 sdk_version: "module_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100304 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100305 updatable: true,
306 }`,
307 },
308 {
309 name: "Current core SDK",
310 bp: `android_app {
311 name: "foo",
312 srcs: ["a.java"],
313 sdk_version: "core_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100314 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100315 updatable: true,
316 }`,
317 },
318 {
319 name: "No Platform APIs",
320 bp: `android_app {
321 name: "foo",
322 srcs: ["a.java"],
323 platform_apis: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100324 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100325 updatable: true,
326 }`,
327 expectedError: "Updatable apps must use stable SDKs",
328 },
329 {
330 name: "No Core Platform APIs",
331 bp: `android_app {
332 name: "foo",
333 srcs: ["a.java"],
334 sdk_version: "core_platform",
Artur Satayevf40fc852020-04-16 13:43:02 +0100335 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100336 updatable: true,
337 }`,
338 expectedError: "Updatable apps must use stable SDKs",
339 },
340 {
341 name: "No unspecified APIs",
342 bp: `android_app {
343 name: "foo",
344 srcs: ["a.java"],
345 updatable: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100346 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100347 }`,
348 expectedError: "Updatable apps must use stable SDK",
349 },
Artur Satayevf40fc852020-04-16 13:43:02 +0100350 {
351 name: "Must specify min_sdk_version",
352 bp: `android_app {
353 name: "app_without_min_sdk_version",
354 srcs: ["a.java"],
355 sdk_version: "29",
356 updatable: true,
357 }`,
358 expectedError: "updatable apps must set min_sdk_version.",
359 },
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100360 }
361
362 for _, test := range testCases {
363 t.Run(test.name, func(t *testing.T) {
Paul Duffincdb88a92021-03-14 00:36:50 +0000364 errorHandler := android.FixtureExpectsNoErrors
365 if test.expectedError != "" {
366 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100367 }
Paul Duffin71ae5942021-03-22 15:36:52 +0000368 android.GroupFixturePreparers(
369 prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{
Paul Duffin2645a292021-03-13 02:36:00 +0000370 "29": {"foo"},
371 })).
Paul Duffincdb88a92021-03-14 00:36:50 +0000372 ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, test.bp)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100373 })
374 }
375}
376
Jooyung Han749dc692020-04-15 11:03:39 +0900377func TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) {
378 testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+`
379 android_app {
380 name: "foo",
381 srcs: ["a.java"],
382 updatable: true,
383 sdk_version: "current",
384 min_sdk_version: "29",
385 static_libs: ["bar"],
386 }
387
388 java_library {
389 name: "bar",
390 sdk_version: "current",
391 }
392 `)
393}
394
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900395func TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) {
396 testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
397 android_app {
398 name: "foo",
399 srcs: ["a.java"],
400 updatable: true,
401 sdk_version: "current",
402 min_sdk_version: "current",
403 jni_libs: ["libjni"],
404 }
405
406 cc_library {
407 name: "libjni",
408 stl: "none",
409 system_shared_libs: [],
410 sdk_version: "current",
411 }
412 `)
413}
414
415func TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) {
416 bp := cc.GatherRequiredDepsForTest(android.Android) + `
417 android_app {
418 name: "foo",
419 srcs: ["a.java"],
420 updatable: true,
421 sdk_version: "current",
422 min_sdk_version: "29",
423 jni_libs: ["libjni"],
424 }
425
426 cc_library {
427 name: "libjni",
428 stl: "none",
429 system_shared_libs: [],
Spandan Das2e8c0442022-05-08 00:39:35 +0000430 sdk_version: "current",
431 min_sdk_version: "29",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900432 }
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900433 `
434 fs := map[string][]byte{
435 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
436 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil,
437 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil,
438 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil,
439 }
440
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000441 ctx, _ := testJavaWithFS(t, bp, fs)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900442
443 inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
444 var crtbeginFound, crtendFound bool
Dan Albert92fe7402020-07-15 13:33:30 -0700445 expectedCrtBegin := ctx.ModuleForTests("crtbegin_so",
Colin Crossdea1d032022-12-06 14:50:08 -0800446 "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
Dan Albert92fe7402020-07-15 13:33:30 -0700447 expectedCrtEnd := ctx.ModuleForTests("crtend_so",
Colin Crossdea1d032022-12-06 14:50:08 -0800448 "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
Dan Albert92fe7402020-07-15 13:33:30 -0700449 implicits := []string{}
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900450 for _, input := range inputs {
Dan Albert92fe7402020-07-15 13:33:30 -0700451 implicits = append(implicits, input.String())
452 if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900453 crtbeginFound = true
Dan Albert92fe7402020-07-15 13:33:30 -0700454 } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900455 crtendFound = true
456 }
457 }
Dan Albert92fe7402020-07-15 13:33:30 -0700458 if !crtbeginFound {
459 t.Error(fmt.Sprintf(
460 "expected implicit with suffix %q, have the following implicits:\n%s",
461 expectedCrtBegin, strings.Join(implicits, "\n")))
462 }
463 if !crtendFound {
464 t.Error(fmt.Sprintf(
465 "expected implicit with suffix %q, have the following implicits:\n%s",
466 expectedCrtEnd, strings.Join(implicits, "\n")))
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900467 }
468}
469
470func TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
471 bp := cc.GatherRequiredDepsForTest(android.Android) + `
472 android_app {
473 name: "foo",
474 srcs: ["a.java"],
475 updatable: true,
476 sdk_version: "current",
477 min_sdk_version: "29", // this APK should support 29
478 jni_libs: ["libjni"],
479 }
480
481 cc_library {
482 name: "libjni",
483 stl: "none",
484 sdk_version: "current",
Spandan Das2e8c0442022-05-08 00:39:35 +0000485 min_sdk_version: "current",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900486 }
487 `
Spandan Das2e8c0442022-05-08 00:39:35 +0000488 testJavaError(t, `"libjni" .*: min_sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900489}
490
Spandan Das2e8c0442022-05-08 00:39:35 +0000491func TestUpdatableApps_ErrorIfDepMinSdkVersionIsHigher(t *testing.T) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900492 bp := cc.GatherRequiredDepsForTest(android.Android) + `
493 android_app {
494 name: "foo",
495 srcs: ["a.java"],
496 updatable: true,
497 sdk_version: "current",
498 min_sdk_version: "29", // this APK should support 29
499 jni_libs: ["libjni"],
500 }
501
502 cc_library {
503 name: "libjni",
504 stl: "none",
505 shared_libs: ["libbar"],
506 system_shared_libs: [],
507 sdk_version: "27",
Spandan Das2e8c0442022-05-08 00:39:35 +0000508 min_sdk_version: "27",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900509 }
510
511 cc_library {
512 name: "libbar",
513 stl: "none",
514 system_shared_libs: [],
515 sdk_version: "current",
Spandan Das2e8c0442022-05-08 00:39:35 +0000516 min_sdk_version: "current",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900517 }
518 `
519 testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
520}
521
Colin Cross0ddae7f2019-02-07 15:30:01 -0800522func TestResourceDirs(t *testing.T) {
523 testCases := []struct {
524 name string
525 prop string
526 resources []string
527 }{
528 {
529 name: "no resource_dirs",
530 prop: "",
531 resources: []string{"res/res/values/strings.xml"},
532 },
533 {
534 name: "resource_dirs",
535 prop: `resource_dirs: ["res"]`,
536 resources: []string{"res/res/values/strings.xml"},
537 },
538 {
539 name: "empty resource_dirs",
540 prop: `resource_dirs: []`,
541 resources: nil,
542 },
543 }
544
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000545 fs := android.MockFS{
Colin Cross0ddae7f2019-02-07 15:30:01 -0800546 "res/res/values/strings.xml": nil,
547 }
548
549 bp := `
550 android_app {
551 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900552 sdk_version: "current",
Colin Cross0ddae7f2019-02-07 15:30:01 -0800553 %s
554 }
555 `
556
557 for _, testCase := range testCases {
558 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000559 result := android.GroupFixturePreparers(
560 PrepareForTestWithJavaDefaultModules,
561 PrepareForTestWithOverlayBuildComponents,
562 fs.AddToFixture(),
563 ).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop))
Colin Cross0ddae7f2019-02-07 15:30:01 -0800564
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000565 module := result.ModuleForTests("foo", "android_common")
Colin Cross0ddae7f2019-02-07 15:30:01 -0800566 resourceList := module.MaybeOutput("aapt2/res.list")
567
568 var resources []string
569 if resourceList.Rule != nil {
570 for _, compiledResource := range resourceList.Inputs.Strings() {
571 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
572 }
573 }
574
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000575 android.AssertDeepEquals(t, "resource files", testCase.resources, resources)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800576 })
577 }
578}
579
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800580func TestLibraryAssets(t *testing.T) {
581 bp := `
582 android_app {
583 name: "foo",
584 sdk_version: "current",
585 static_libs: ["lib1", "lib2", "lib3"],
586 }
587
588 android_library {
589 name: "lib1",
590 sdk_version: "current",
591 asset_dirs: ["assets_a"],
592 }
593
594 android_library {
595 name: "lib2",
596 sdk_version: "current",
597 }
598
599 android_library {
600 name: "lib3",
601 sdk_version: "current",
Colin Crossab8d1382023-07-14 17:23:41 +0000602 static_libs: ["lib4", "import"],
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800603 }
604
605 android_library {
606 name: "lib4",
607 sdk_version: "current",
608 asset_dirs: ["assets_b"],
609 }
Colin Crossab8d1382023-07-14 17:23:41 +0000610
611 android_library_import {
612 name: "import",
613 sdk_version: "current",
614 aars: ["import.aar"],
615 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800616 `
617
618 testCases := []struct {
619 name string
620 assetFlag string
621 assetPackages []string
622 }{
623 {
624 name: "foo",
Colin Crossab8d1382023-07-14 17:23:41 +0000625 // lib1 has its own assets. lib3 doesn't have any, but lib4 and import have assets.
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800626 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000627 "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
628 "out/soong/.intermediates/lib1/android_common/assets.zip",
Colin Crossab8d1382023-07-14 17:23:41 +0000629 "out/soong/.intermediates/lib4/android_common/assets.zip",
630 "out/soong/.intermediates/import/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800631 },
632 },
633 {
634 name: "lib1",
635 assetFlag: "-A assets_a",
636 },
637 {
638 name: "lib2",
639 },
640 {
641 name: "lib3",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800642 },
643 {
644 name: "lib4",
645 assetFlag: "-A assets_b",
646 },
647 }
648 ctx := testApp(t, bp)
649
650 for _, test := range testCases {
651 t.Run(test.name, func(t *testing.T) {
652 m := ctx.ModuleForTests(test.name, "android_common")
653
654 // Check asset flag in aapt2 link flags
655 var aapt2link android.TestingBuildParams
656 if len(test.assetPackages) > 0 {
657 aapt2link = m.Output("aapt2/package-res.apk")
658 } else {
659 aapt2link = m.Output("package-res.apk")
660 }
Paul Duffina71a67a2021-03-29 00:42:57 +0100661 aapt2link = aapt2link
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800662 aapt2Flags := aapt2link.Args["flags"]
663 if test.assetFlag != "" {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000664 android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800665 } else {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000666 android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800667 }
668
669 // Check asset merge rule.
670 if len(test.assetPackages) > 0 {
671 mergeAssets := m.Output("package-res.apk")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000672 android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800673 }
674 })
675 }
676}
677
Colin Crossb014f072021-02-26 14:54:36 -0800678func TestAppJavaResources(t *testing.T) {
679 bp := `
680 android_app {
681 name: "foo",
682 sdk_version: "current",
683 java_resources: ["resources/a"],
684 srcs: ["a.java"],
685 }
686
687 android_app {
688 name: "bar",
689 sdk_version: "current",
690 java_resources: ["resources/a"],
691 }
692 `
693
694 ctx := testApp(t, bp)
695
696 foo := ctx.ModuleForTests("foo", "android_common")
697 fooResources := foo.Output("res/foo.jar")
698 fooDexJar := foo.Output("dex-withres/foo.jar")
699 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
700 fooApk := foo.Rule("combineApk")
701
702 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
703 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
704 }
705
706 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
707 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
708 }
709
710 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
711 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
712 }
713
714 bar := ctx.ModuleForTests("bar", "android_common")
715 barResources := bar.Output("res/bar.jar")
716 barApk := bar.Rule("combineApk")
717
718 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
719 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
720 }
721}
722
Colin Crossff3ff7f2023-07-05 14:04:12 -0700723func TestAndroidResourceProcessor(t *testing.T) {
724 testCases := []struct {
Colin Cross8676c8c2023-10-12 15:58:57 -0700725 name string
726 appUsesRP bool
727 directLibUsesRP bool
728 transitiveLibUsesRP bool
729 sharedLibUsesRP bool
730 sharedTransitiveStaticLibUsesRP bool
731 sharedTransitiveSharedLibUsesRP bool
Colin Crossff3ff7f2023-07-05 14:04:12 -0700732
733 dontVerifyApp bool
734 appResources []string
735 appOverlays []string
736 appImports []string
737 appSrcJars []string
738 appClasspath []string
739 appCombined []string
740
741 dontVerifyDirect bool
742 directResources []string
743 directOverlays []string
744 directImports []string
745 directSrcJars []string
746 directClasspath []string
747 directCombined []string
748
749 dontVerifyTransitive bool
750 transitiveResources []string
751 transitiveOverlays []string
752 transitiveImports []string
753 transitiveSrcJars []string
754 transitiveClasspath []string
755 transitiveCombined []string
756
757 dontVerifyDirectImport bool
758 directImportResources []string
759 directImportOverlays []string
760 directImportImports []string
761
762 dontVerifyTransitiveImport bool
763 transitiveImportResources []string
764 transitiveImportOverlays []string
765 transitiveImportImports []string
Colin Cross8676c8c2023-10-12 15:58:57 -0700766
767 dontVerifyShared bool
768 sharedResources []string
769 sharedOverlays []string
770 sharedImports []string
771 sharedSrcJars []string
772 sharedClasspath []string
773 sharedCombined []string
Colin Crossff3ff7f2023-07-05 14:04:12 -0700774 }{
775 {
Colin Cross4eae06d2023-06-20 22:40:02 -0700776 // Test with all modules set to use_resource_processor: false (except android_library_import modules,
777 // which always use resource processor).
778 name: "legacy",
779 appUsesRP: false,
780 directLibUsesRP: false,
781 transitiveLibUsesRP: false,
Colin Crossff3ff7f2023-07-05 14:04:12 -0700782
783 appResources: nil,
784 appOverlays: []string{
785 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000786 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700787 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
788 "out/soong/.intermediates/direct/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000789 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700790 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
791 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
792 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700793 appImports: []string{
794 "out/soong/.intermediates/shared/android_common/package-res.apk",
795 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
796 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700797 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
798 appClasspath: []string{
799 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700800 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700801 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
802 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
803 },
804 appCombined: []string{
805 "out/soong/.intermediates/app/android_common/javac/app.jar",
806 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
807 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
808 },
809
810 directResources: nil,
811 directOverlays: []string{
812 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000813 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700814 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
815 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
816 },
817 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
818 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
819 directClasspath: []string{
820 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
821 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
822 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
823 },
824 directCombined: []string{
825 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
826 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
827 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
828 },
829
830 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
831 transitiveOverlays: nil,
832 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
833 transitiveSrcJars: []string{"out/soong/.intermediates/transitive/android_common/gen/android/R.srcjar"},
834 transitiveClasspath: []string{"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar"},
835 transitiveCombined: nil,
836
Colin Cross8676c8c2023-10-12 15:58:57 -0700837 sharedResources: nil,
838 sharedOverlays: []string{
839 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
840 "out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat",
841 },
842 sharedImports: []string{
843 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
844 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
845 },
846 sharedSrcJars: []string{"out/soong/.intermediates/shared/android_common/gen/android/R.srcjar"},
847 sharedClasspath: []string{
848 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
849 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar",
850 "out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar",
851 },
852 sharedCombined: []string{
853 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
854 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
855 },
856
Colin Crossff3ff7f2023-07-05 14:04:12 -0700857 directImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700858 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
859 directImportImports: []string{
860 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700861 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
862 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700863
864 transitiveImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700865 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
866 transitiveImportImports: []string{
867 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700868 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
869 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700870 },
871 {
872 // Test with all modules set to use_resource_processor: true.
Colin Cross8676c8c2023-10-12 15:58:57 -0700873 name: "resource_processor",
874 appUsesRP: true,
875 directLibUsesRP: true,
876 transitiveLibUsesRP: true,
877 sharedLibUsesRP: true,
878 sharedTransitiveSharedLibUsesRP: true,
879 sharedTransitiveStaticLibUsesRP: true,
Colin Cross4eae06d2023-06-20 22:40:02 -0700880
881 appResources: nil,
882 appOverlays: []string{
883 "out/soong/.intermediates/transitive/android_common/package-res.apk",
884 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
885 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
886 "out/soong/.intermediates/direct/android_common/package-res.apk",
887 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
888 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
889 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
890 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700891 appImports: []string{
892 "out/soong/.intermediates/shared/android_common/package-res.apk",
893 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
894 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700895 appSrcJars: nil,
896 appClasspath: []string{
897 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
898 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700899 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700900 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
901 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
902 },
903 appCombined: []string{
904 "out/soong/.intermediates/app/android_common/busybox/R.jar",
905 "out/soong/.intermediates/app/android_common/javac/app.jar",
906 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
907 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
908 },
909
910 directResources: nil,
911 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
912 directImports: []string{
913 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
914 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
915 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
916 "out/soong/.intermediates/transitive/android_common/package-res.apk",
917 },
918 directSrcJars: nil,
919 directClasspath: []string{
920 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
921 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
922 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
923 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
924 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
925 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
926 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
927 },
928 directCombined: []string{
929 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
930 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
931 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
932 },
933
934 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
935 transitiveOverlays: nil,
936 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
937 transitiveSrcJars: nil,
938 transitiveClasspath: []string{
939 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
940 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
941 },
942 transitiveCombined: nil,
943
Colin Cross8676c8c2023-10-12 15:58:57 -0700944 sharedResources: nil,
945 sharedOverlays: []string{"out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat"},
946 sharedImports: []string{
947 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
948 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
949 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
950 },
951 sharedSrcJars: nil,
952 sharedClasspath: []string{
953 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
954 "out/soong/.intermediates/shared_transitive_static/android_common/busybox/R.jar",
955 "out/soong/.intermediates/shared_transitive_shared/android_common/busybox/R.jar",
956 "out/soong/.intermediates/shared/android_common/busybox/R.jar",
957 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar",
958 "out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar",
959 },
960 sharedCombined: []string{
961 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
962 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
963 },
964
Colin Cross4eae06d2023-06-20 22:40:02 -0700965 directImportResources: nil,
966 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
967 directImportImports: []string{
968 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
969 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
970 },
971
972 transitiveImportResources: nil,
973 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
974 transitiveImportImports: []string{
975 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
976 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
977 },
978 }, {
979 // Test an app building with resource processor enabled but with dependencies built without
980 // resource processor.
981 name: "app_resource_processor",
982 appUsesRP: true,
983 directLibUsesRP: false,
984 transitiveLibUsesRP: false,
985
986 appResources: nil,
987 appOverlays: []string{
988 "out/soong/.intermediates/transitive/android_common/package-res.apk",
989 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
990 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
991 "out/soong/.intermediates/direct/android_common/package-res.apk",
992 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
993 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
994 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
995 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700996 appImports: []string{
997 "out/soong/.intermediates/shared/android_common/package-res.apk",
998 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
999 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001000 appSrcJars: nil,
1001 appClasspath: []string{
1002 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1003 // R.jar has to come before direct.jar
1004 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001005 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001006 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
1007 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
1008 },
1009 appCombined: []string{
1010 "out/soong/.intermediates/app/android_common/busybox/R.jar",
1011 "out/soong/.intermediates/app/android_common/javac/app.jar",
1012 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
1013 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
1014 },
1015
1016 dontVerifyDirect: true,
1017 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001018 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001019 dontVerifyDirectImport: true,
1020 dontVerifyTransitiveImport: true,
1021 },
1022 {
1023 // Test an app building without resource processor enabled but with a dependency built with
1024 // resource processor.
1025 name: "app_dependency_lib_resource_processor",
1026 appUsesRP: false,
1027 directLibUsesRP: true,
1028 transitiveLibUsesRP: false,
1029
1030 appOverlays: []string{
1031 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1032 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1033 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1034 "out/soong/.intermediates/direct/android_common/package-res.apk",
1035 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1036 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1037 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1038 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001039 appImports: []string{
1040 "out/soong/.intermediates/shared/android_common/package-res.apk",
1041 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1042 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001043 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1044 appClasspath: []string{
1045 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001046 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001047 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
1048 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
1049 },
1050 appCombined: []string{
1051 "out/soong/.intermediates/app/android_common/javac/app.jar",
1052 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
1053 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
1054 },
1055
1056 directResources: nil,
1057 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
1058 directImports: []string{
1059 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1060 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1061 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1062 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1063 },
1064 directSrcJars: nil,
1065 directClasspath: []string{
1066 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1067 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
1068 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
1069 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
1070 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
1071 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
1072 },
1073 directCombined: []string{
1074 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1075 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1076 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
1077 },
1078
1079 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001080 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001081 dontVerifyDirectImport: true,
1082 dontVerifyTransitiveImport: true,
1083 },
1084 {
1085 // Test a library building without resource processor enabled but with a dependency built with
1086 // resource processor.
1087 name: "lib_dependency_lib_resource_processor",
1088 appUsesRP: false,
1089 directLibUsesRP: false,
1090 transitiveLibUsesRP: true,
1091
1092 appOverlays: []string{
1093 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1094 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1095 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1096 "out/soong/.intermediates/direct/android_common/package-res.apk",
1097 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1098 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1099 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1100 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001101 appImports: []string{
1102 "out/soong/.intermediates/shared/android_common/package-res.apk",
1103 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1104 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001105 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1106 appClasspath: []string{
1107 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001108 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001109 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
1110 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
1111 },
1112 appCombined: []string{
1113 "out/soong/.intermediates/app/android_common/javac/app.jar",
1114 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
1115 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
1116 },
1117
1118 directResources: nil,
1119 directOverlays: []string{
1120 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1121 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1122 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1123 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
1124 },
1125 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1126 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
1127 directClasspath: []string{
1128 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1129 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
1130 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
1131 },
1132 directCombined: []string{
1133 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1134 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1135 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
1136 },
1137
1138 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1139 transitiveOverlays: nil,
1140 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1141 transitiveSrcJars: nil,
1142 transitiveClasspath: []string{
1143 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1144 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1145 },
1146 transitiveCombined: nil,
1147
Colin Cross8676c8c2023-10-12 15:58:57 -07001148 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001149 dontVerifyDirectImport: true,
1150 dontVerifyTransitiveImport: true,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001151 },
1152 }
1153
1154 for _, testCase := range testCases {
1155 t.Run(testCase.name, func(t *testing.T) {
1156 bp := fmt.Sprintf(`
1157 android_app {
1158 name: "app",
1159 sdk_version: "current",
1160 srcs: ["app/app.java"],
1161 resource_dirs: ["app/res"],
1162 manifest: "app/AndroidManifest.xml",
Colin Cross8676c8c2023-10-12 15:58:57 -07001163 libs: ["shared"],
Colin Crossff3ff7f2023-07-05 14:04:12 -07001164 static_libs: ["direct", "direct_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001165 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001166 }
1167
1168 android_library {
1169 name: "direct",
1170 sdk_version: "current",
1171 srcs: ["direct/direct.java"],
1172 resource_dirs: ["direct/res"],
1173 manifest: "direct/AndroidManifest.xml",
1174 static_libs: ["transitive", "transitive_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001175 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001176 }
1177
1178 android_library {
1179 name: "transitive",
1180 sdk_version: "current",
1181 srcs: ["transitive/transitive.java"],
1182 resource_dirs: ["transitive/res"],
1183 manifest: "transitive/AndroidManifest.xml",
Colin Cross4eae06d2023-06-20 22:40:02 -07001184 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001185 }
1186
Colin Cross8676c8c2023-10-12 15:58:57 -07001187 android_library {
1188 name: "shared",
1189 sdk_version: "current",
1190 srcs: ["shared/shared.java"],
1191 resource_dirs: ["shared/res"],
1192 manifest: "shared/AndroidManifest.xml",
1193 use_resource_processor: %v,
1194 libs: ["shared_transitive_shared"],
1195 static_libs: ["shared_transitive_static"],
1196 }
1197
1198 android_library {
1199 name: "shared_transitive_shared",
1200 sdk_version: "current",
1201 srcs: ["shared_transitive_shared/shared_transitive_shared.java"],
1202 resource_dirs: ["shared_transitive_shared/res"],
1203 manifest: "shared_transitive_shared/AndroidManifest.xml",
1204 use_resource_processor: %v,
1205 }
1206
1207 android_library {
1208 name: "shared_transitive_static",
1209 sdk_version: "current",
1210 srcs: ["shared_transitive_static/shared.java"],
1211 resource_dirs: ["shared_transitive_static/res"],
1212 manifest: "shared_transitive_static/AndroidManifest.xml",
1213 use_resource_processor: %v,
1214 }
1215
Colin Crossff3ff7f2023-07-05 14:04:12 -07001216 android_library_import {
1217 name: "direct_import",
1218 sdk_version: "current",
1219 aars: ["direct_import.aar"],
1220 static_libs: ["direct_import_dep"],
1221 }
1222
1223 android_library_import {
1224 name: "direct_import_dep",
1225 sdk_version: "current",
1226 aars: ["direct_import_dep.aar"],
1227 }
1228
1229 android_library_import {
1230 name: "transitive_import",
1231 sdk_version: "current",
1232 aars: ["transitive_import.aar"],
1233 static_libs: ["transitive_import_dep"],
1234 }
1235
1236 android_library_import {
1237 name: "transitive_import_dep",
1238 sdk_version: "current",
1239 aars: ["transitive_import_dep.aar"],
1240 }
Colin Cross8676c8c2023-10-12 15:58:57 -07001241 `, testCase.appUsesRP, testCase.directLibUsesRP, testCase.transitiveLibUsesRP,
1242 testCase.sharedLibUsesRP, testCase.sharedTransitiveSharedLibUsesRP, testCase.sharedTransitiveStaticLibUsesRP)
Colin Crossff3ff7f2023-07-05 14:04:12 -07001243
1244 fs := android.MockFS{
Colin Cross8676c8c2023-10-12 15:58:57 -07001245 "app/res/values/strings.xml": nil,
1246 "direct/res/values/strings.xml": nil,
1247 "transitive/res/values/strings.xml": nil,
1248 "shared/res/values/strings.xml": nil,
1249 "shared_transitive_static/res/values/strings.xml": nil,
1250 "shared_transitive_shared/res/values/strings.xml": nil,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001251 }
1252
1253 result := android.GroupFixturePreparers(
1254 PrepareForTestWithJavaDefaultModules,
1255 PrepareForTestWithOverlayBuildComponents,
1256 fs.AddToFixture(),
1257 ).RunTestWithBp(t, bp)
1258
1259 type aaptInfo struct {
1260 resources, overlays, imports, srcJars, classpath, combined android.Paths
1261 }
1262
1263 getAaptInfo := func(moduleName string) (aaptInfo aaptInfo) {
1264 mod := result.ModuleForTests(moduleName, "android_common")
1265 resourceListRule := mod.MaybeOutput("aapt2/res.list")
1266 overlayListRule := mod.MaybeOutput("aapt2/overlay.list")
1267 aaptRule := mod.Rule("aapt2Link")
1268 javacRule := mod.MaybeRule("javac")
1269 combinedRule := mod.MaybeOutput("combined/" + moduleName + ".jar")
1270
1271 aaptInfo.resources = resourceListRule.Inputs
1272 aaptInfo.overlays = overlayListRule.Inputs
1273
1274 aaptFlags := strings.Split(aaptRule.Args["flags"], " ")
1275 for i, flag := range aaptFlags {
1276 if flag == "-I" && i+1 < len(aaptFlags) {
1277 aaptInfo.imports = append(aaptInfo.imports, android.PathForTesting(aaptFlags[i+1]))
1278 }
1279 }
1280
1281 if len(javacRule.Args["srcJars"]) > 0 {
1282 aaptInfo.srcJars = android.PathsForTesting(strings.Split(javacRule.Args["srcJars"], " ")...)
1283 }
1284
1285 if len(javacRule.Args["classpath"]) > 0 {
1286 classpathArg := strings.TrimPrefix(javacRule.Args["classpath"], "-classpath ")
1287 aaptInfo.classpath = android.PathsForTesting(strings.Split(classpathArg, ":")...)
1288 }
1289
1290 aaptInfo.combined = combinedRule.Inputs
1291 return
1292 }
1293
1294 app := getAaptInfo("app")
1295 direct := getAaptInfo("direct")
1296 transitive := getAaptInfo("transitive")
Colin Cross8676c8c2023-10-12 15:58:57 -07001297 shared := getAaptInfo("shared")
Colin Crossff3ff7f2023-07-05 14:04:12 -07001298 directImport := getAaptInfo("direct_import")
1299 transitiveImport := getAaptInfo("transitive_import")
1300
1301 if !testCase.dontVerifyApp {
1302 android.AssertPathsRelativeToTopEquals(t, "app resources", testCase.appResources, app.resources)
1303 android.AssertPathsRelativeToTopEquals(t, "app overlays", testCase.appOverlays, app.overlays)
1304 android.AssertPathsRelativeToTopEquals(t, "app imports", testCase.appImports, app.imports)
1305 android.AssertPathsRelativeToTopEquals(t, "app srcjars", testCase.appSrcJars, app.srcJars)
1306 android.AssertPathsRelativeToTopEquals(t, "app classpath", testCase.appClasspath, app.classpath)
1307 android.AssertPathsRelativeToTopEquals(t, "app combined", testCase.appCombined, app.combined)
1308 }
1309
1310 if !testCase.dontVerifyDirect {
1311 android.AssertPathsRelativeToTopEquals(t, "direct resources", testCase.directResources, direct.resources)
1312 android.AssertPathsRelativeToTopEquals(t, "direct overlays", testCase.directOverlays, direct.overlays)
1313 android.AssertPathsRelativeToTopEquals(t, "direct imports", testCase.directImports, direct.imports)
1314 android.AssertPathsRelativeToTopEquals(t, "direct srcjars", testCase.directSrcJars, direct.srcJars)
1315 android.AssertPathsRelativeToTopEquals(t, "direct classpath", testCase.directClasspath, direct.classpath)
1316 android.AssertPathsRelativeToTopEquals(t, "direct combined", testCase.directCombined, direct.combined)
1317 }
1318
1319 if !testCase.dontVerifyTransitive {
1320 android.AssertPathsRelativeToTopEquals(t, "transitive resources", testCase.transitiveResources, transitive.resources)
1321 android.AssertPathsRelativeToTopEquals(t, "transitive overlays", testCase.transitiveOverlays, transitive.overlays)
1322 android.AssertPathsRelativeToTopEquals(t, "transitive imports", testCase.transitiveImports, transitive.imports)
1323 android.AssertPathsRelativeToTopEquals(t, "transitive srcjars", testCase.transitiveSrcJars, transitive.srcJars)
1324 android.AssertPathsRelativeToTopEquals(t, "transitive classpath", testCase.transitiveClasspath, transitive.classpath)
1325 android.AssertPathsRelativeToTopEquals(t, "transitive combined", testCase.transitiveCombined, transitive.combined)
1326 }
1327
Colin Cross8676c8c2023-10-12 15:58:57 -07001328 if !testCase.dontVerifyShared {
1329 android.AssertPathsRelativeToTopEquals(t, "shared resources", testCase.sharedResources, shared.resources)
1330 android.AssertPathsRelativeToTopEquals(t, "shared overlays", testCase.sharedOverlays, shared.overlays)
1331 android.AssertPathsRelativeToTopEquals(t, "shared imports", testCase.sharedImports, shared.imports)
1332 android.AssertPathsRelativeToTopEquals(t, "shared srcjars", testCase.sharedSrcJars, shared.srcJars)
1333 android.AssertPathsRelativeToTopEquals(t, "shared classpath", testCase.sharedClasspath, shared.classpath)
1334 android.AssertPathsRelativeToTopEquals(t, "shared combined", testCase.sharedCombined, shared.combined)
1335 }
1336
Colin Crossff3ff7f2023-07-05 14:04:12 -07001337 if !testCase.dontVerifyDirectImport {
1338 android.AssertPathsRelativeToTopEquals(t, "direct_import resources", testCase.directImportResources, directImport.resources)
1339 android.AssertPathsRelativeToTopEquals(t, "direct_import overlays", testCase.directImportOverlays, directImport.overlays)
1340 android.AssertPathsRelativeToTopEquals(t, "direct_import imports", testCase.directImportImports, directImport.imports)
1341 }
1342
1343 if !testCase.dontVerifyTransitiveImport {
1344 android.AssertPathsRelativeToTopEquals(t, "transitive_import resources", testCase.transitiveImportResources, transitiveImport.resources)
1345 android.AssertPathsRelativeToTopEquals(t, "transitive_import overlays", testCase.transitiveImportOverlays, transitiveImport.overlays)
1346 android.AssertPathsRelativeToTopEquals(t, "transitive_import imports", testCase.transitiveImportImports, transitiveImport.imports)
1347 }
1348 })
1349 }
1350}
1351
1352func TestAndroidResourceOverlays(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -08001353 testCases := []struct {
1354 name string
1355 enforceRROTargets []string
1356 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -08001357 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -08001358 overlayFiles map[string][]string
1359 rroDirs map[string][]string
1360 }{
1361 {
1362 name: "no RRO",
1363 enforceRROTargets: nil,
1364 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -08001365 resourceFiles: map[string][]string{
1366 "foo": nil,
1367 "bar": {"bar/res/res/values/strings.xml"},
1368 "lib": nil,
1369 "lib2": {"lib2/res/res/values/strings.xml"},
1370 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001371 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001372 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001373 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1374 "out/soong/.intermediates/lib/android_common/package-res.apk",
1375 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001376 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001377 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1378 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +00001379 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001380 },
Colin Crossbec85302019-02-13 13:15:46 -08001381 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -08001382 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1383 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1384 },
Colin Crossbec85302019-02-13 13:15:46 -08001385 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001386 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001387 "lib/res/res/values/strings.xml",
1388 "device/vendor/blah/overlay/lib/res/values/strings.xml",
1389 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001390 },
1391 rroDirs: map[string][]string{
1392 "foo": nil,
1393 "bar": nil,
1394 },
1395 },
1396 {
1397 name: "enforce RRO on foo",
1398 enforceRROTargets: []string{"foo"},
1399 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -08001400 resourceFiles: map[string][]string{
1401 "foo": nil,
1402 "bar": {"bar/res/res/values/strings.xml"},
1403 "lib": nil,
1404 "lib2": {"lib2/res/res/values/strings.xml"},
1405 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001406 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001407 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001408 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1409 "out/soong/.intermediates/lib/android_common/package-res.apk",
1410 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001411 "foo/res/res/values/strings.xml",
1412 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1413 },
Colin Crossbec85302019-02-13 13:15:46 -08001414 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -08001415 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1416 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1417 },
Colin Crossbec85302019-02-13 13:15:46 -08001418 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001419 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001420 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -08001421 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001422 },
Colin Crossc1c37552019-01-31 11:42:41 -08001423
Colin Cross5c4791c2019-02-01 11:44:44 -08001424 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001425 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +00001426 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +00001427 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001428 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001429 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001430 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001431 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001432 },
1433 },
1434 {
1435 name: "enforce RRO on all",
1436 enforceRROTargets: []string{"*"},
1437 enforceRROExcludedOverlays: []string{
1438 // Excluding specific apps/res directories also allowed.
1439 "device/vendor/blah/static_overlay/foo",
1440 "device/vendor/blah/static_overlay/bar/res",
1441 },
Colin Crossbec85302019-02-13 13:15:46 -08001442 resourceFiles: map[string][]string{
1443 "foo": nil,
1444 "bar": {"bar/res/res/values/strings.xml"},
1445 "lib": nil,
1446 "lib2": {"lib2/res/res/values/strings.xml"},
1447 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001448 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001449 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001450 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1451 "out/soong/.intermediates/lib/android_common/package-res.apk",
1452 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001453 "foo/res/res/values/strings.xml",
1454 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1455 },
Colin Crossbec85302019-02-13 13:15:46 -08001456 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
1457 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001458 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001459 "lib/res/res/values/strings.xml",
1460 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001461 },
1462 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001463 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +00001464 "device:device/vendor/blah/overlay/foo/res",
1465 "product:product/vendor/blah/overlay/foo/res",
1466 // Lib dep comes after the direct deps
1467 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001468 },
Anton Hansson53c88442019-03-18 15:53:16 +00001469 "bar": {"device:device/vendor/blah/overlay/bar/res"},
1470 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001471 },
1472 },
1473 }
1474
Anton Hansson53c88442019-03-18 15:53:16 +00001475 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -08001476 "device/vendor/blah/overlay",
1477 "device/vendor/blah/overlay2",
1478 "device/vendor/blah/static_overlay",
1479 }
1480
Anton Hansson53c88442019-03-18 15:53:16 +00001481 productResourceOverlays := []string{
1482 "product/vendor/blah/overlay",
1483 }
1484
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001485 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -08001486 "foo/res/res/values/strings.xml": nil,
1487 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001488 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -08001489 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001490 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
1491 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001492 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001493 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
1494 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
1495 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +00001496 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001497 }
1498
1499 bp := `
1500 android_app {
1501 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001502 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001503 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +00001504 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -08001505 }
1506
1507 android_app {
1508 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001509 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001510 resource_dirs: ["bar/res"],
1511 }
Colin Cross6ed7dea2019-01-31 14:44:30 -08001512
1513 android_library {
1514 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001515 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001516 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -08001517 static_libs: ["lib2"],
1518 }
1519
1520 android_library {
1521 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001522 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -08001523 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -08001524 }
Anton Hansson53c88442019-03-18 15:53:16 +00001525
1526 // This library has the same resources as lib (should not lead to dupe RROs)
1527 android_library {
1528 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001529 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +00001530 resource_dirs: ["lib/res"]
1531 }
Colin Cross890ff552017-11-30 20:13:19 -08001532 `
1533
Colin Cross5c4791c2019-02-01 11:44:44 -08001534 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -08001535 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001536 result := android.GroupFixturePreparers(
1537 PrepareForTestWithJavaDefaultModules,
1538 PrepareForTestWithOverlayBuildComponents,
1539 fs.AddToFixture(),
1540 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1541 variables.DeviceResourceOverlays = deviceResourceOverlays
1542 variables.ProductResourceOverlays = productResourceOverlays
1543 if testCase.enforceRROTargets != nil {
1544 variables.EnforceRROTargets = testCase.enforceRROTargets
1545 }
1546 if testCase.enforceRROExcludedOverlays != nil {
1547 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
1548 }
1549 }),
1550 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -08001551
Colin Crossbec85302019-02-13 13:15:46 -08001552 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
1553 for _, o := range list {
1554 res := module.MaybeOutput(o)
1555 if res.Rule != nil {
1556 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
1557 // verify the inputs to the .arsc.flat rule.
1558 files = append(files, res.Inputs.Strings()...)
1559 } else {
1560 // Otherwise, verify the full path to the output of the other module
1561 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +00001562 }
Colin Cross890ff552017-11-30 20:13:19 -08001563 }
Colin Crossbec85302019-02-13 13:15:46 -08001564 return files
Colin Cross890ff552017-11-30 20:13:19 -08001565 }
1566
Colin Crossbec85302019-02-13 13:15:46 -08001567 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001568 module := result.ModuleForTests(moduleName, "android_common")
Colin Crossbec85302019-02-13 13:15:46 -08001569 resourceList := module.MaybeOutput("aapt2/res.list")
1570 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001571 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +00001572 }
Colin Crossbec85302019-02-13 13:15:46 -08001573 overlayList := module.MaybeOutput("aapt2/overlay.list")
1574 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001575 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -08001576 }
1577
Colin Crossab8d1382023-07-14 17:23:41 +00001578 for _, d := range module.Module().(AndroidLibraryDependency).RRODirsDepSet().ToList() {
Anton Hansson53c88442019-03-18 15:53:16 +00001579 var prefix string
1580 if d.overlayType == device {
1581 prefix = "device:"
1582 } else if d.overlayType == product {
1583 prefix = "product:"
1584 } else {
1585 t.Fatalf("Unexpected overlayType %d", d.overlayType)
1586 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001587 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +00001588 }
Colin Crossbec85302019-02-13 13:15:46 -08001589
1590 return resourceFiles, overlayFiles, rroDirs
1591 }
1592
1593 modules := []string{"foo", "bar", "lib", "lib2"}
1594 for _, module := range modules {
1595 resourceFiles, overlayFiles, rroDirs := getResources(module)
1596
1597 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
1598 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
1599 module, testCase.resourceFiles[module], resourceFiles)
1600 }
1601 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
1602 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
1603 module, testCase.overlayFiles[module], overlayFiles)
1604 }
1605 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +00001606 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -08001607 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +00001608 }
Colin Cross890ff552017-11-30 20:13:19 -08001609 }
Colin Cross890ff552017-11-30 20:13:19 -08001610 })
1611 }
1612}
Colin Crossd09b0b62018-04-18 11:06:47 -07001613
Paul Duffincdb88a92021-03-14 00:36:50 +00001614func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
1615 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +09001616 link := foo.Output("package-res.apk")
1617 linkFlags := strings.Split(link.Args["flags"], " ")
1618 min := android.IndexList("--min-sdk-version", linkFlags)
1619 target := android.IndexList("--target-sdk-version", linkFlags)
1620
1621 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
1622 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
1623 }
1624
1625 gotMinSdkVersion := linkFlags[min+1]
1626 gotTargetSdkVersion := linkFlags[target+1]
1627
Paul Duffincdb88a92021-03-14 00:36:50 +00001628 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001629
Paul Duffincdb88a92021-03-14 00:36:50 +00001630 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001631}
1632
Colin Crossd09b0b62018-04-18 11:06:47 -07001633func TestAppSdkVersion(t *testing.T) {
1634 testCases := []struct {
1635 name string
1636 sdkVersion string
1637 platformSdkInt int
1638 platformSdkCodename string
1639 platformSdkFinal bool
Spandan Dasffb31af2023-03-01 19:46:18 +00001640 minSdkVersionBp string
Colin Crossd09b0b62018-04-18 11:06:47 -07001641 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001642 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001643 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001644 }{
1645 {
1646 name: "current final SDK",
1647 sdkVersion: "current",
1648 platformSdkInt: 27,
1649 platformSdkCodename: "REL",
1650 platformSdkFinal: true,
1651 expectedMinSdkVersion: "27",
1652 },
1653 {
1654 name: "current non-final SDK",
1655 sdkVersion: "current",
1656 platformSdkInt: 27,
1657 platformSdkCodename: "OMR1",
1658 platformSdkFinal: false,
1659 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001660 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001661 },
1662 {
1663 name: "default final SDK",
1664 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001665 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001666 platformSdkInt: 27,
1667 platformSdkCodename: "REL",
1668 platformSdkFinal: true,
1669 expectedMinSdkVersion: "27",
1670 },
1671 {
1672 name: "default non-final SDK",
1673 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001674 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001675 platformSdkInt: 27,
1676 platformSdkCodename: "OMR1",
1677 platformSdkFinal: false,
1678 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001679 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001680 },
1681 {
1682 name: "14",
1683 sdkVersion: "14",
1684 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001685 platformSdkCodename: "S",
1686 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001687 },
Spandan Dasffb31af2023-03-01 19:46:18 +00001688 {
1689 name: "two active SDKs",
1690 sdkVersion: "module_current",
1691 minSdkVersionBp: "UpsideDownCake",
1692 expectedMinSdkVersion: "UpsideDownCake", // And not VanillaIceCream
1693 platformSdkCodename: "VanillaIceCream",
1694 activeCodenames: []string{"UpsideDownCake", "VanillaIceCream"},
1695 },
Colin Crossd09b0b62018-04-18 11:06:47 -07001696 }
1697
1698 for _, moduleType := range []string{"android_app", "android_library"} {
1699 for _, test := range testCases {
1700 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001701 platformApiProp := ""
1702 if test.platformApis {
1703 platformApiProp = "platform_apis: true,"
1704 }
Spandan Dasffb31af2023-03-01 19:46:18 +00001705 minSdkVersionProp := ""
1706 if test.minSdkVersionBp != "" {
1707 minSdkVersionProp = fmt.Sprintf(` min_sdk_version: "%s",`, test.minSdkVersionBp)
1708 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001709 bp := fmt.Sprintf(`%s {
1710 name: "foo",
1711 srcs: ["a.java"],
1712 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001713 %s
Spandan Dasffb31af2023-03-01 19:46:18 +00001714 %s
1715 }`, moduleType, test.sdkVersion, platformApiProp, minSdkVersionProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001716
Paul Duffin71ae5942021-03-22 15:36:52 +00001717 result := android.GroupFixturePreparers(
1718 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001719 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1720 variables.Platform_sdk_version = &test.platformSdkInt
1721 variables.Platform_sdk_codename = &test.platformSdkCodename
1722 variables.Platform_version_active_codenames = test.activeCodenames
1723 variables.Platform_sdk_final = &test.platformSdkFinal
1724 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001725 FixtureWithPrebuiltApis(map[string][]string{
1726 "14": {"foo"},
1727 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001728 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001729
Paul Duffincdb88a92021-03-14 00:36:50 +00001730 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001731 })
1732 }
1733 }
1734}
Colin Crossa4f08812018-10-02 22:03:40 -07001735
Jeongik Cha219141c2020-08-06 23:00:37 +09001736func TestVendorAppSdkVersion(t *testing.T) {
1737 testCases := []struct {
1738 name string
1739 sdkVersion string
1740 platformSdkInt int
1741 platformSdkCodename string
1742 platformSdkFinal bool
1743 deviceCurrentApiLevelForVendorModules string
1744 expectedMinSdkVersion string
1745 }{
1746 {
1747 name: "current final SDK",
1748 sdkVersion: "current",
1749 platformSdkInt: 29,
1750 platformSdkCodename: "REL",
1751 platformSdkFinal: true,
1752 deviceCurrentApiLevelForVendorModules: "29",
1753 expectedMinSdkVersion: "29",
1754 },
1755 {
1756 name: "current final SDK",
1757 sdkVersion: "current",
1758 platformSdkInt: 29,
1759 platformSdkCodename: "REL",
1760 platformSdkFinal: true,
1761 deviceCurrentApiLevelForVendorModules: "28",
1762 expectedMinSdkVersion: "28",
1763 },
1764 {
1765 name: "current final SDK",
1766 sdkVersion: "current",
1767 platformSdkInt: 29,
1768 platformSdkCodename: "Q",
1769 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001770 deviceCurrentApiLevelForVendorModules: "28",
1771 expectedMinSdkVersion: "28",
1772 },
1773 }
1774
1775 for _, moduleType := range []string{"android_app", "android_library"} {
1776 for _, sdkKind := range []string{"", "system_"} {
1777 for _, test := range testCases {
1778 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1779 bp := fmt.Sprintf(`%s {
1780 name: "foo",
1781 srcs: ["a.java"],
1782 sdk_version: "%s%s",
1783 vendor: true,
1784 }`, moduleType, sdkKind, test.sdkVersion)
1785
Paul Duffin71ae5942021-03-22 15:36:52 +00001786 result := android.GroupFixturePreparers(
1787 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001788 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1789 variables.Platform_sdk_version = &test.platformSdkInt
1790 variables.Platform_sdk_codename = &test.platformSdkCodename
1791 variables.Platform_sdk_final = &test.platformSdkFinal
1792 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1793 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1794 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001795 FixtureWithPrebuiltApis(map[string][]string{
1796 "28": {"foo"},
1797 "29": {"foo"},
1798 "current": {"foo"},
1799 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001800 ).RunTestWithBp(t, bp)
1801
1802 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001803 })
1804 }
1805 }
1806 }
1807}
1808
Paul Duffin50c217c2019-06-12 13:25:22 +01001809func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001810 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001811 cc_library {
1812 name: "libjni",
1813 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001814 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001815 stl: "none",
1816 }
1817
1818 android_test {
1819 name: "test",
1820 sdk_version: "core_platform",
1821 jni_libs: ["libjni"],
1822 }
1823
1824 android_test {
1825 name: "test_first",
1826 sdk_version: "core_platform",
1827 compile_multilib: "first",
1828 jni_libs: ["libjni"],
1829 }
1830
1831 android_test {
1832 name: "test_both",
1833 sdk_version: "core_platform",
1834 compile_multilib: "both",
1835 jni_libs: ["libjni"],
1836 }
1837
1838 android_test {
1839 name: "test_32",
1840 sdk_version: "core_platform",
1841 compile_multilib: "32",
1842 jni_libs: ["libjni"],
1843 }
1844
1845 android_test {
1846 name: "test_64",
1847 sdk_version: "core_platform",
1848 compile_multilib: "64",
1849 jni_libs: ["libjni"],
1850 }
1851 `)
1852
1853 testCases := []struct {
1854 name string
1855 abis []string
1856 }{
1857 {"test", []string{"arm64-v8a"}},
1858 {"test_first", []string{"arm64-v8a"}},
1859 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1860 {"test_32", []string{"armeabi-v7a"}},
1861 {"test_64", []string{"arm64-v8a"}},
1862 }
1863
1864 for _, test := range testCases {
1865 t.Run(test.name, func(t *testing.T) {
1866 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07001867 jniLibZip := app.Output("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01001868 var abis []string
1869 args := strings.Fields(jniLibZip.Args["jarArgs"])
1870 for i := 0; i < len(args); i++ {
1871 if args[i] == "-P" {
1872 abis = append(abis, filepath.Base(args[i+1]))
1873 i++
1874 }
1875 }
1876 if !reflect.DeepEqual(abis, test.abis) {
1877 t.Errorf("want abis %v, got %v", test.abis, abis)
1878 }
1879 })
1880 }
1881}
1882
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001883func TestAppSdkVersionByPartition(t *testing.T) {
1884 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1885 android_app {
1886 name: "foo",
1887 srcs: ["a.java"],
1888 vendor: true,
1889 platform_apis: true,
1890 }
1891 `)
1892
1893 testJava(t, `
1894 android_app {
1895 name: "bar",
1896 srcs: ["b.java"],
1897 platform_apis: true,
1898 }
1899 `)
1900
1901 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001902 bp := `
1903 android_app {
1904 name: "foo",
1905 srcs: ["a.java"],
1906 product_specific: true,
1907 platform_apis: true,
1908 }
1909 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001910
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001911 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001912 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001913 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 +09001914 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001915
1916 android.GroupFixturePreparers(
1917 PrepareForTestWithJavaDefaultModules,
1918 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1919 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
1920 }),
1921 ).
1922 ExtendWithErrorHandler(errorHandler).
1923 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001924 }
1925}
1926
Paul Duffin50c217c2019-06-12 13:25:22 +01001927func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001928 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001929 cc_library {
1930 name: "libjni",
1931 system_shared_libs: [],
1932 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08001933 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001934 }
1935
1936 android_app {
1937 name: "app",
1938 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001939 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001940 }
1941
1942 android_app {
1943 name: "app_noembed",
1944 jni_libs: ["libjni"],
1945 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001946 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001947 }
1948
1949 android_app {
1950 name: "app_embed",
1951 jni_libs: ["libjni"],
1952 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001953 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001954 }
1955
1956 android_test {
1957 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00001958 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001959 jni_libs: ["libjni"],
1960 }
1961
1962 android_test {
1963 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001964 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001965 jni_libs: ["libjni"],
1966 use_embedded_native_libs: false,
1967 }
1968
1969 android_test_helper_app {
1970 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00001971 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001972 jni_libs: ["libjni"],
1973 }
1974
1975 android_test_helper_app {
1976 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001977 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001978 jni_libs: ["libjni"],
1979 use_embedded_native_libs: false,
1980 }
1981 `)
1982
1983 testCases := []struct {
1984 name string
1985 packaged bool
1986 compressed bool
1987 }{
1988 {"app", false, false},
1989 {"app_noembed", false, false},
1990 {"app_embed", true, false},
1991 {"test", true, false},
1992 {"test_noembed", true, true},
1993 {"test_helper", true, false},
1994 {"test_helper_noembed", true, true},
1995 }
1996
1997 for _, test := range testCases {
1998 t.Run(test.name, func(t *testing.T) {
1999 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07002000 jniLibZip := app.MaybeOutput("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01002001 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
2002 t.Errorf("expected jni packaged %v, got %v", w, g)
2003 }
2004
2005 if jniLibZip.Rule != nil {
2006 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
2007 t.Errorf("expected jni compressed %v, got %v", w, g)
2008 }
Colin Crossc511bc52020-04-07 16:50:32 +00002009
2010 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
2011 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
2012 }
Paul Duffin50c217c2019-06-12 13:25:22 +01002013 }
2014 })
2015 }
Colin Cross47fa9d32019-03-26 10:51:39 -07002016}
2017
Colin Cross3c007702020-05-08 11:20:24 -07002018func TestJNISDK(t *testing.T) {
2019 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
2020 cc_library {
2021 name: "libjni",
2022 system_shared_libs: [],
2023 stl: "none",
2024 sdk_version: "current",
2025 }
2026
2027 android_test {
2028 name: "app_platform",
2029 jni_libs: ["libjni"],
2030 platform_apis: true,
2031 }
2032
2033 android_test {
2034 name: "app_sdk",
2035 jni_libs: ["libjni"],
2036 sdk_version: "current",
2037 }
2038
2039 android_test {
2040 name: "app_force_platform",
2041 jni_libs: ["libjni"],
2042 sdk_version: "current",
2043 jni_uses_platform_apis: true,
2044 }
2045
2046 android_test {
2047 name: "app_force_sdk",
2048 jni_libs: ["libjni"],
2049 platform_apis: true,
2050 jni_uses_sdk_apis: true,
2051 }
Colin Crossc2d24052020-05-13 11:05:02 -07002052
2053 cc_library {
2054 name: "libvendorjni",
2055 system_shared_libs: [],
2056 stl: "none",
2057 vendor: true,
2058 }
2059
2060 android_test {
2061 name: "app_vendor",
2062 jni_libs: ["libvendorjni"],
2063 sdk_version: "current",
2064 vendor: true,
2065 }
Colin Cross3c007702020-05-08 11:20:24 -07002066 `)
2067
2068 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07002069 name string
2070 sdkJNI bool
2071 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07002072 }{
Colin Crossc2d24052020-05-13 11:05:02 -07002073 {name: "app_platform"},
2074 {name: "app_sdk", sdkJNI: true},
2075 {name: "app_force_platform"},
2076 {name: "app_force_sdk", sdkJNI: true},
2077 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07002078 }
2079
Colin Crossc2d24052020-05-13 11:05:02 -07002080 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
2081 Output("libjni.so").Output.String()
2082 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
2083 Output("libjni.so").Output.String()
2084 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
2085 Output("libvendorjni.so").Output.String()
2086
Colin Cross3c007702020-05-08 11:20:24 -07002087 for _, test := range testCases {
2088 t.Run(test.name, func(t *testing.T) {
2089 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07002090
Colin Crossb3168ba2023-07-26 16:14:56 -07002091 jniLibZip := app.MaybeOutput("jnilibs.zip")
Colin Cross3c007702020-05-08 11:20:24 -07002092 if len(jniLibZip.Implicits) != 1 {
2093 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
2094 }
2095 gotJNI := jniLibZip.Implicits[0].String()
2096
2097 if test.sdkJNI {
2098 if gotJNI != sdkJNI {
2099 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
2100 }
Colin Crossc2d24052020-05-13 11:05:02 -07002101 } else if test.vendorJNI {
2102 if gotJNI != vendorJNI {
2103 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
2104 }
Colin Cross3c007702020-05-08 11:20:24 -07002105 } else {
2106 if gotJNI != platformJNI {
2107 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
2108 }
2109 }
2110 })
2111 }
2112
2113 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
2114 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
2115 android_test {
2116 name: "app_platform",
2117 platform_apis: true,
2118 jni_uses_platform_apis: true,
2119 }
2120 `)
2121 })
2122
2123 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
2124 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
2125 android_test {
2126 name: "app_sdk",
2127 sdk_version: "current",
2128 jni_uses_sdk_apis: true,
2129 }
2130 `)
2131 })
2132
2133}
2134
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002135func TestCertificates(t *testing.T) {
2136 testCases := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002137 name string
2138 bp string
Colin Cross5caad2b2022-12-12 15:11:46 -08002139 allowMissingDependencies bool
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002140 certificateOverride string
2141 expectedCertSigningFlags string
2142 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002143 }{
2144 {
2145 name: "default",
2146 bp: `
2147 android_app {
2148 name: "foo",
2149 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002150 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002151 }
2152 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002153 certificateOverride: "",
2154 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002155 expectedCertificate: "build/make/target/product/security/testkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002156 },
2157 {
2158 name: "module certificate property",
2159 bp: `
2160 android_app {
2161 name: "foo",
2162 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002163 certificate: ":new_certificate",
2164 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002165 }
2166
2167 android_app_certificate {
2168 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002169 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002170 }
2171 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002172 certificateOverride: "",
2173 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002174 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002175 },
2176 {
2177 name: "path certificate property",
2178 bp: `
2179 android_app {
2180 name: "foo",
2181 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002182 certificate: "expiredkey",
2183 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002184 }
2185 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002186 certificateOverride: "",
2187 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002188 expectedCertificate: "build/make/target/product/security/expiredkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002189 },
2190 {
2191 name: "certificate overrides",
2192 bp: `
2193 android_app {
2194 name: "foo",
2195 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002196 certificate: "expiredkey",
2197 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002198 }
2199
2200 android_app_certificate {
2201 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002202 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002203 }
2204 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002205 certificateOverride: "foo:new_certificate",
2206 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002207 expectedCertificate: "cert/new_cert",
Liz Kammere2b27f42020-05-07 13:24:05 -07002208 },
2209 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002210 name: "certificate signing flags",
Liz Kammere2b27f42020-05-07 13:24:05 -07002211 bp: `
2212 android_app {
2213 name: "foo",
2214 srcs: ["a.java"],
2215 certificate: ":new_certificate",
2216 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002217 rotationMinSdkVersion: "32",
Liz Kammere2b27f42020-05-07 13:24:05 -07002218 sdk_version: "current",
2219 }
2220
2221 android_app_certificate {
2222 name: "new_certificate",
2223 certificate: "cert/new_cert",
2224 }
2225 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002226 certificateOverride: "",
2227 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002228 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002229 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002230 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002231 name: "cert signing flags from filegroup",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002232 bp: `
2233 android_app {
2234 name: "foo",
2235 srcs: ["a.java"],
2236 certificate: ":new_certificate",
2237 lineage: ":lineage_bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002238 rotationMinSdkVersion: "32",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002239 sdk_version: "current",
2240 }
2241
2242 android_app_certificate {
2243 name: "new_certificate",
2244 certificate: "cert/new_cert",
2245 }
2246
2247 filegroup {
2248 name: "lineage_bin",
2249 srcs: ["lineage.bin"],
2250 }
2251 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002252 certificateOverride: "",
2253 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002254 expectedCertificate: "cert/new_cert",
2255 },
2256 {
2257 name: "missing with AllowMissingDependencies",
2258 bp: `
2259 android_app {
2260 name: "foo",
2261 srcs: ["a.java"],
2262 certificate: ":new_certificate",
2263 sdk_version: "current",
2264 }
2265 `,
2266 expectedCertificate: "out/soong/.intermediates/foo/android_common/missing",
2267 allowMissingDependencies: true,
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002268 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002269 }
2270
2271 for _, test := range testCases {
2272 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002273 result := android.GroupFixturePreparers(
2274 PrepareForTestWithJavaDefaultModules,
2275 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2276 if test.certificateOverride != "" {
2277 variables.CertificateOverrides = []string{test.certificateOverride}
2278 }
Colin Cross5caad2b2022-12-12 15:11:46 -08002279 if test.allowMissingDependencies {
2280 variables.Allow_missing_dependencies = proptools.BoolPtr(true)
2281 }
2282 }),
2283 android.FixtureModifyContext(func(ctx *android.TestContext) {
2284 ctx.SetAllowMissingDependencies(test.allowMissingDependencies)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002285 }),
2286 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002287
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002288 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002289
Colin Cross5caad2b2022-12-12 15:11:46 -08002290 certificate := foo.Module().(*AndroidApp).certificate
2291 android.AssertPathRelativeToTopEquals(t, "certificates key", test.expectedCertificate+".pk8", certificate.Key)
2292 // The sign_target_files_apks and check_target_files_signatures
2293 // tools require that certificates have a .x509.pem extension.
2294 android.AssertPathRelativeToTopEquals(t, "certificates pem", test.expectedCertificate+".x509.pem", certificate.Pem)
Liz Kammere2b27f42020-05-07 13:24:05 -07002295
Colin Cross5caad2b2022-12-12 15:11:46 -08002296 signapk := foo.Output("foo.apk")
2297 if signapk.Rule != android.ErrorRule {
2298 signCertificateFlags := signapk.Args["certificates"]
2299 expectedFlags := certificate.Pem.String() + " " + certificate.Key.String()
2300 android.AssertStringEquals(t, "certificates flags", expectedFlags, signCertificateFlags)
2301
2302 certSigningFlags := signapk.Args["flags"]
2303 android.AssertStringEquals(t, "cert signing flags", test.expectedCertSigningFlags, certSigningFlags)
2304 }
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002305 })
2306 }
2307}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002308
Songchun Fan688de9a2020-03-24 20:32:24 -07002309func TestRequestV4SigningFlag(t *testing.T) {
2310 testCases := []struct {
2311 name string
2312 bp string
2313 expected string
2314 }{
2315 {
2316 name: "default",
2317 bp: `
2318 android_app {
2319 name: "foo",
2320 srcs: ["a.java"],
2321 sdk_version: "current",
2322 }
2323 `,
2324 expected: "",
2325 },
2326 {
2327 name: "default",
2328 bp: `
2329 android_app {
2330 name: "foo",
2331 srcs: ["a.java"],
2332 sdk_version: "current",
2333 v4_signature: false,
2334 }
2335 `,
2336 expected: "",
2337 },
2338 {
2339 name: "module certificate property",
2340 bp: `
2341 android_app {
2342 name: "foo",
2343 srcs: ["a.java"],
2344 sdk_version: "current",
2345 v4_signature: true,
2346 }
2347 `,
2348 expected: "--enable-v4",
2349 },
2350 }
2351
2352 for _, test := range testCases {
2353 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002354 result := android.GroupFixturePreparers(
2355 PrepareForTestWithJavaDefaultModules,
2356 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07002357
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002358 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07002359
2360 signapk := foo.Output("foo.apk")
2361 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002362 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07002363 })
2364 }
2365}
2366
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002367func TestPackageNameOverride(t *testing.T) {
2368 testCases := []struct {
2369 name string
2370 bp string
2371 packageNameOverride string
2372 expected []string
2373 }{
2374 {
2375 name: "default",
2376 bp: `
2377 android_app {
2378 name: "foo",
2379 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002380 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002381 }
2382 `,
2383 packageNameOverride: "",
2384 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002385 "out/soong/.intermediates/foo/android_common/foo.apk",
2386 "out/soong/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002387 },
2388 },
2389 {
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002390 name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002391 bp: `
2392 android_app {
2393 name: "foo",
2394 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002395 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002396 }
2397 `,
2398 packageNameOverride: "foo:bar",
2399 expected: []string{
2400 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002401 "out/soong/.intermediates/foo/android_common/bar.apk",
2402 "out/soong/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002403 },
2404 },
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002405 {
2406 name: "overridden via stem",
2407 bp: `
2408 android_app {
2409 name: "foo",
2410 srcs: ["a.java"],
2411 sdk_version: "current",
2412 stem: "bar",
2413 }
2414 `,
2415 packageNameOverride: "",
2416 expected: []string{
2417 "out/soong/.intermediates/foo/android_common/bar.apk",
2418 "out/soong/target/product/test_device/system/app/bar/bar.apk",
2419 },
2420 },
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002421 }
2422
2423 for _, test := range testCases {
2424 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002425 result := android.GroupFixturePreparers(
2426 PrepareForTestWithJavaDefaultModules,
2427 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2428 if test.packageNameOverride != "" {
2429 variables.PackageNameOverrides = []string{test.packageNameOverride}
2430 }
2431 }),
2432 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002433
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002434 foo := result.ModuleForTests("foo", "android_common")
2435
Lukacs T. Berkifbaf7252021-08-19 09:36:42 +02002436 outSoongDir := result.Config.SoongOutDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002437
2438 outputs := foo.AllOutputs()
2439 outputMap := make(map[string]bool)
2440 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002441 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002442 }
2443 for _, e := range test.expected {
2444 if _, exist := outputMap[e]; !exist {
2445 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
2446 }
2447 }
2448 })
2449 }
2450}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002451
2452func TestInstrumentationTargetOverridden(t *testing.T) {
2453 bp := `
2454 android_app {
2455 name: "foo",
2456 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002457 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002458 }
2459
2460 android_test {
2461 name: "bar",
2462 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002463 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002464 }
2465 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002466
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002467 result := android.GroupFixturePreparers(
2468 PrepareForTestWithJavaDefaultModules,
2469 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2470 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
2471 }),
2472 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002473
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002474 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002475 res := bar.Output("package-res.apk")
2476 aapt2Flags := res.Args["flags"]
2477 e := "--rename-instrumentation-target-package org.dandroid.bp"
2478 if !strings.Contains(aapt2Flags, e) {
2479 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
2480 }
2481}
Jaewoong Jung525443a2019-02-28 15:35:54 -08002482
2483func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002484 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2485 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08002486 android_app {
2487 name: "foo",
2488 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07002489 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002490 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002491 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002492 }
2493
2494 override_android_app {
2495 name: "bar",
2496 base: "foo",
2497 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07002498 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002499 rotationMinSdkVersion: "32",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002500 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002501 }
2502
2503 android_app_certificate {
2504 name: "new_certificate",
2505 certificate: "cert/new_cert",
2506 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002507
2508 override_android_app {
2509 name: "baz",
2510 base: "foo",
2511 package_name: "org.dandroid.bp",
2512 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002513
2514 override_android_app {
2515 name: "baz_no_rename_resources",
2516 base: "foo",
2517 package_name: "org.dandroid.bp",
2518 rename_resources_package: false,
2519 }
2520
2521 android_app {
2522 name: "foo_no_rename_resources",
2523 srcs: ["a.java"],
2524 certificate: "expiredkey",
2525 overrides: ["qux"],
2526 rename_resources_package: false,
2527 sdk_version: "current",
2528 }
2529
2530 override_android_app {
2531 name: "baz_base_no_rename_resources",
2532 base: "foo_no_rename_resources",
2533 package_name: "org.dandroid.bp",
2534 }
2535
2536 override_android_app {
2537 name: "baz_override_base_rename_resources",
2538 base: "foo_no_rename_resources",
2539 package_name: "org.dandroid.bp",
2540 rename_resources_package: true,
2541 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08002542 `)
2543
2544 expectedVariants := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002545 name string
2546 moduleName string
2547 variantName string
2548 apkName string
2549 apkPath string
2550 certFlag string
2551 certSigningFlags string
2552 overrides []string
2553 packageFlag string
2554 renameResources bool
2555 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08002556 }{
2557 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002558 name: "foo",
2559 moduleName: "foo",
2560 variantName: "android_common",
2561 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2562 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2563 certSigningFlags: "",
2564 overrides: []string{"qux"},
2565 packageFlag: "",
2566 renameResources: false,
2567 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002568 },
2569 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002570 name: "foo",
2571 moduleName: "bar",
2572 variantName: "android_common_bar",
2573 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2574 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
2575 certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
2576 overrides: []string{"qux", "foo"},
2577 packageFlag: "",
2578 renameResources: false,
2579 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002580 },
2581 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002582 name: "foo",
2583 moduleName: "baz",
2584 variantName: "android_common_baz",
2585 apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk",
2586 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2587 certSigningFlags: "",
2588 overrides: []string{"qux", "foo"},
2589 packageFlag: "org.dandroid.bp",
2590 renameResources: true,
2591 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002592 },
2593 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002594 name: "foo",
2595 moduleName: "baz_no_rename_resources",
2596 variantName: "android_common_baz_no_rename_resources",
2597 apkPath: "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
2598 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2599 certSigningFlags: "",
2600 overrides: []string{"qux", "foo"},
2601 packageFlag: "org.dandroid.bp",
2602 renameResources: false,
2603 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002604 },
2605 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002606 name: "foo_no_rename_resources",
2607 moduleName: "baz_base_no_rename_resources",
2608 variantName: "android_common_baz_base_no_rename_resources",
2609 apkPath: "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
2610 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2611 certSigningFlags: "",
2612 overrides: []string{"qux", "foo_no_rename_resources"},
2613 packageFlag: "org.dandroid.bp",
2614 renameResources: false,
2615 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002616 },
2617 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002618 name: "foo_no_rename_resources",
2619 moduleName: "baz_override_base_rename_resources",
2620 variantName: "android_common_baz_override_base_rename_resources",
2621 apkPath: "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
2622 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2623 certSigningFlags: "",
2624 overrides: []string{"qux", "foo_no_rename_resources"},
2625 packageFlag: "org.dandroid.bp",
2626 renameResources: true,
2627 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002628 },
2629 }
2630 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002631 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002632
2633 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002634 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002635
2636 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08002637 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07002638 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002639 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07002640
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002641 // Check the cert signing flags
2642 certSigningFlags := signapk.Args["flags"]
2643 android.AssertStringEquals(t, "cert signing flags", expected.certSigningFlags, certSigningFlags)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002644
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002645 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08002646 mod := variant.Module().(*AndroidApp)
zhidoua2ce78f2022-02-17 02:33:12 +00002647 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002648
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002649 // Test Overridable property: Logging_parent
2650 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002651 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002652
Liz Kammer1d5983b2020-05-19 19:15:37 +00002653 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002654 res := variant.Output("package-res.apk")
2655 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00002656 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
2657 expectedPackage := expected.packageFlag
2658 if !expected.renameResources {
2659 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00002660 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002661 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002662 }
2663}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07002664
zhidoua2ce78f2022-02-17 02:33:12 +00002665func TestOverrideAndroidAppOverrides(t *testing.T) {
2666 ctx, _ := testJava(
2667 t, `
2668 android_app {
2669 name: "foo",
2670 srcs: ["a.java"],
2671 sdk_version: "current",
2672 overrides: ["qux"]
2673 }
2674
2675 android_app {
2676 name: "bar",
2677 srcs: ["b.java"],
2678 sdk_version: "current",
2679 overrides: ["foo"]
2680 }
2681
2682 override_android_app {
2683 name: "foo_override",
2684 base: "foo",
2685 overrides: ["bar"]
2686 }
2687 `)
2688
2689 expectedVariants := []struct {
2690 name string
2691 moduleName string
2692 variantName string
2693 overrides []string
2694 }{
2695 {
2696 name: "foo",
2697 moduleName: "foo",
2698 variantName: "android_common",
2699 overrides: []string{"qux"},
2700 },
2701 {
2702 name: "bar",
2703 moduleName: "bar",
2704 variantName: "android_common",
2705 overrides: []string{"foo"},
2706 },
2707 {
2708 name: "foo",
2709 moduleName: "foo_override",
2710 variantName: "android_common_foo_override",
2711 overrides: []string{"bar", "foo"},
2712 },
2713 }
2714 for _, expected := range expectedVariants {
2715 variant := ctx.ModuleForTests(expected.name, expected.variantName)
2716
2717 // Check if the overrides field values are correctly aggregated.
2718 mod := variant.Module().(*AndroidApp)
2719 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2720 }
2721}
2722
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002723func TestOverrideAndroidAppWithPrebuilt(t *testing.T) {
2724 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2725 t, `
2726 android_app {
2727 name: "foo",
2728 srcs: ["a.java"],
2729 sdk_version: "current",
2730 }
2731
2732 override_android_app {
2733 name: "bar",
2734 base: "foo",
2735 }
2736
2737 android_app_import {
2738 name: "bar",
2739 prefer: true,
2740 apk: "bar.apk",
2741 presigned: true,
2742 }
2743 `)
2744
2745 // An app that has an override that also has a prebuilt should not be hidden.
2746 foo := result.ModuleForTests("foo", "android_common")
2747 if foo.Module().IsHideFromMake() {
2748 t.Errorf("expected foo to have HideFromMake false")
2749 }
2750
2751 // An override that also has a prebuilt should be hidden.
2752 barOverride := result.ModuleForTests("foo", "android_common_bar")
2753 if !barOverride.Module().IsHideFromMake() {
2754 t.Errorf("expected bar override variant of foo to have HideFromMake true")
2755 }
2756}
2757
Jooyung Han01d80d82022-01-08 12:16:32 +09002758func TestOverrideAndroidAppStem(t *testing.T) {
2759 ctx, _ := testJava(t, `
2760 android_app {
2761 name: "foo",
2762 srcs: ["a.java"],
2763 sdk_version: "current",
2764 }
2765 override_android_app {
2766 name: "bar",
2767 base: "foo",
2768 }
2769 override_android_app {
2770 name: "baz",
2771 base: "foo",
2772 stem: "baz_stem",
2773 }
2774 android_app {
2775 name: "foo2",
2776 srcs: ["a.java"],
2777 sdk_version: "current",
2778 stem: "foo2_stem",
2779 }
2780 override_android_app {
2781 name: "bar2",
2782 base: "foo2",
2783 }
2784 override_android_app {
2785 name: "baz2",
2786 base: "foo2",
2787 stem: "baz2_stem",
2788 }
2789 `)
2790 for _, expected := range []struct {
2791 moduleName string
2792 variantName string
2793 apkPath string
2794 }{
2795 {
2796 moduleName: "foo",
2797 variantName: "android_common",
2798 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2799 },
2800 {
2801 moduleName: "foo",
2802 variantName: "android_common_bar",
2803 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2804 },
2805 {
2806 moduleName: "foo",
2807 variantName: "android_common_baz",
2808 apkPath: "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk",
2809 },
2810 {
2811 moduleName: "foo2",
2812 variantName: "android_common",
2813 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2814 },
2815 {
2816 moduleName: "foo2",
2817 variantName: "android_common_bar2",
2818 // Note that this may cause the duplicate output error.
2819 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2820 },
2821 {
2822 moduleName: "foo2",
2823 variantName: "android_common_baz2",
2824 apkPath: "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
2825 },
2826 } {
2827 variant := ctx.ModuleForTests(expected.moduleName, expected.variantName)
2828 variant.Output(expected.apkPath)
2829 }
2830}
2831
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002832func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002833 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002834 android_app {
2835 name: "foo",
2836 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002837 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002838 }
2839
2840 override_android_app {
2841 name: "bar",
2842 base: "foo",
2843 package_name: "org.dandroid.bp",
2844 }
2845
2846 android_test {
2847 name: "baz",
2848 srcs: ["b.java"],
2849 instrumentation_for: "foo",
2850 }
2851
2852 android_test {
2853 name: "qux",
2854 srcs: ["b.java"],
2855 instrumentation_for: "bar",
2856 }
2857 `)
2858
2859 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002860 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002861 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002862 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2863 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2864 }
2865
2866 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002867 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002868 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002869 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2870 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2871 }
2872}
2873
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002874func TestOverrideAndroidTest(t *testing.T) {
2875 ctx, _ := testJava(t, `
2876 android_app {
2877 name: "foo",
2878 srcs: ["a.java"],
2879 package_name: "com.android.foo",
2880 sdk_version: "current",
2881 }
2882
2883 override_android_app {
2884 name: "bar",
2885 base: "foo",
2886 package_name: "com.android.bar",
2887 }
2888
2889 android_test {
2890 name: "foo_test",
2891 srcs: ["b.java"],
2892 instrumentation_for: "foo",
2893 }
2894
2895 override_android_test {
2896 name: "bar_test",
2897 base: "foo_test",
2898 package_name: "com.android.bar.test",
2899 instrumentation_for: "bar",
2900 instrumentation_target_package: "com.android.bar",
2901 }
2902 `)
2903
2904 expectedVariants := []struct {
2905 moduleName string
2906 variantName string
2907 apkPath string
2908 overrides []string
2909 targetVariant string
2910 packageFlag string
2911 targetPackageFlag string
2912 }{
2913 {
2914 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002915 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002916 overrides: nil,
2917 targetVariant: "android_common",
2918 packageFlag: "",
2919 targetPackageFlag: "",
2920 },
2921 {
2922 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002923 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002924 overrides: []string{"foo_test"},
2925 targetVariant: "android_common_bar",
2926 packageFlag: "com.android.bar.test",
2927 targetPackageFlag: "com.android.bar",
2928 },
2929 }
2930 for _, expected := range expectedVariants {
2931 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2932
2933 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002934 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002935
2936 // Check if the overrides field values are correctly aggregated.
2937 mod := variant.Module().(*AndroidTest)
zhidoua2ce78f2022-02-17 02:33:12 +00002938 if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002939 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
zhidoua2ce78f2022-02-17 02:33:12 +00002940 expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002941 }
2942
2943 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01002944 javac := variant.Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002945 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002946 if !strings.Contains(javac.Args["classpath"], turbine) {
2947 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2948 }
2949
2950 // Check aapt2 flags.
2951 res := variant.Output("package-res.apk")
2952 aapt2Flags := res.Args["flags"]
2953 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002954 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002955 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2956 }
2957}
2958
Jaewoong Jung39982342020-01-14 10:27:18 -08002959func TestAndroidTest_FixTestConfig(t *testing.T) {
2960 ctx, _ := testJava(t, `
2961 android_app {
2962 name: "foo",
2963 srcs: ["a.java"],
2964 package_name: "com.android.foo",
2965 sdk_version: "current",
2966 }
2967
2968 android_test {
2969 name: "foo_test",
2970 srcs: ["b.java"],
2971 instrumentation_for: "foo",
2972 }
2973
2974 android_test {
2975 name: "bar_test",
2976 srcs: ["b.java"],
2977 package_name: "com.android.bar.test",
2978 instrumentation_for: "foo",
Seth Moorec6f4b532023-02-02 13:22:26 -08002979 mainline_package_name: "com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08002980 }
2981
2982 override_android_test {
2983 name: "baz_test",
2984 base: "foo_test",
2985 package_name: "com.android.baz.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08002986 mainline_package_name: "com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08002987 }
2988 `)
2989
2990 testCases := []struct {
2991 moduleName string
2992 variantName string
2993 expectedFlags []string
2994 }{
2995 {
2996 moduleName: "foo_test",
2997 variantName: "android_common",
2998 },
2999 {
3000 moduleName: "bar_test",
3001 variantName: "android_common",
3002 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003003 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003004 "--package-name com.android.bar.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08003005 "--mainline-package-name com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08003006 },
3007 },
3008 {
3009 moduleName: "foo_test",
3010 variantName: "android_common_baz_test",
3011 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003012 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003013 "--package-name com.android.baz.test",
3014 "--test-file-name baz_test.apk",
Seth Moorec6f4b532023-02-02 13:22:26 -08003015 "out/soong/.intermediates/foo_test/android_common_baz_test/test_config_fixer/AndroidTest.xml",
3016 "--mainline-package-name com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08003017 },
3018 },
3019 }
3020
3021 for _, test := range testCases {
3022 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01003023 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08003024
3025 if len(test.expectedFlags) > 0 {
3026 if params.Rule == nil {
3027 t.Errorf("test_config_fixer was expected to run, but didn't")
3028 } else {
3029 for _, flag := range test.expectedFlags {
3030 if !strings.Contains(params.RuleParams.Command, flag) {
3031 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
3032 }
3033 }
3034 }
3035 } else {
3036 if params.Rule != nil {
3037 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
3038 }
3039 }
Jaewoong Jung39982342020-01-14 10:27:18 -08003040 }
3041}
3042
Paul Duffin53a70a42022-01-11 14:35:55 +00003043func TestInstrumentationTargetPrebuilt(t *testing.T) {
3044 bp := `
3045 android_app_import {
3046 name: "foo",
3047 apk: "foo.apk",
3048 presigned: true,
3049 }
3050
3051 android_test {
3052 name: "bar",
3053 srcs: ["a.java"],
3054 instrumentation_for: "foo",
3055 sdk_version: "current",
3056 }
3057 `
3058
3059 android.GroupFixturePreparers(
3060 PrepareForTestWithJavaDefaultModules,
3061 ).ExtendWithErrorHandler(
3062 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
3063 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
3064 RunTestWithBp(t, bp)
3065}
3066
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003067func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07003068 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003069 cc_library {
3070 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08003071 sdk_version: "current",
3072 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003073 }
3074
3075 android_test {
3076 name: "stl",
3077 jni_libs: ["libjni"],
3078 compile_multilib: "both",
3079 sdk_version: "current",
3080 stl: "c++_shared",
3081 }
3082
3083 android_test {
3084 name: "system",
3085 jni_libs: ["libjni"],
3086 compile_multilib: "both",
3087 sdk_version: "current",
3088 }
3089 `)
3090
3091 testCases := []struct {
3092 name string
3093 jnis []string
3094 }{
3095 {"stl",
3096 []string{
3097 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07003098 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003099 },
3100 },
3101 {"system",
3102 []string{
3103 "libjni.so",
3104 },
3105 },
3106 }
3107
3108 for _, test := range testCases {
3109 t.Run(test.name, func(t *testing.T) {
3110 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07003111 jniLibZip := app.Output("jnilibs.zip")
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003112 var jnis []string
3113 args := strings.Fields(jniLibZip.Args["jarArgs"])
3114 for i := 0; i < len(args); i++ {
3115 if args[i] == "-f" {
3116 jnis = append(jnis, args[i+1])
3117 i += 1
3118 }
3119 }
3120 jnisJoined := strings.Join(jnis, " ")
3121 for _, jni := range test.jnis {
3122 if !strings.Contains(jnisJoined, jni) {
3123 t.Errorf("missing jni %q in %q", jni, jnis)
3124 }
3125 }
3126 })
3127 }
3128}
Colin Cross50ddcc42019-05-16 12:28:22 -07003129
3130func TestUsesLibraries(t *testing.T) {
3131 bp := `
3132 java_sdk_library {
3133 name: "foo",
3134 srcs: ["a.java"],
3135 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003136 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003137 }
3138
3139 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01003140 name: "qux",
3141 srcs: ["a.java"],
3142 api_packages: ["qux"],
3143 sdk_version: "current",
3144 }
3145
3146 java_sdk_library {
3147 name: "quuz",
3148 srcs: ["a.java"],
3149 api_packages: ["quuz"],
3150 sdk_version: "current",
3151 }
3152
3153 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003154 name: "fred",
3155 srcs: ["a.java"],
3156 api_packages: ["fred"],
3157 sdk_version: "current",
3158 }
3159
3160 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07003161 name: "bar",
3162 srcs: ["a.java"],
3163 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003164 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003165 }
3166
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01003167 java_sdk_library {
3168 name: "runtime-library",
3169 srcs: ["a.java"],
3170 sdk_version: "current",
3171 }
3172
3173 java_library {
3174 name: "static-runtime-helper",
3175 srcs: ["a.java"],
3176 libs: ["runtime-library"],
3177 sdk_version: "current",
3178 }
3179
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003180 java_library {
3181 name: "runtime-required-x",
3182 srcs: ["a.java"],
3183 installable: true,
3184 sdk_version: "current",
3185 }
3186
3187 java_library {
3188 name: "runtime-optional-x",
3189 srcs: ["a.java"],
3190 installable: true,
3191 sdk_version: "current",
3192 }
3193
3194 android_library {
3195 name: "static-x",
3196 uses_libs: ["runtime-required-x"],
3197 optional_uses_libs: ["runtime-optional-x"],
3198 sdk_version: "current",
3199 }
3200
3201 java_library {
3202 name: "runtime-required-y",
3203 srcs: ["a.java"],
3204 installable: true,
3205 sdk_version: "current",
3206 }
3207
3208 java_library {
3209 name: "runtime-optional-y",
3210 srcs: ["a.java"],
3211 installable: true,
3212 sdk_version: "current",
3213 }
3214
3215 java_library {
3216 name: "static-y",
3217 srcs: ["a.java"],
3218 uses_libs: ["runtime-required-y"],
3219 optional_uses_libs: ["runtime-optional-y"],
3220 sdk_version: "current",
3221 }
3222
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003223 // A library that has to use "provides_uses_lib", because:
3224 // - it is not an SDK library
3225 // - its library name is different from its module name
3226 java_library {
3227 name: "non-sdk-lib",
3228 provides_uses_lib: "com.non.sdk.lib",
3229 installable: true,
3230 srcs: ["a.java"],
3231 }
3232
Colin Cross50ddcc42019-05-16 12:28:22 -07003233 android_app {
3234 name: "app",
3235 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003236 libs: [
3237 "qux",
3238 "quuz.stubs"
3239 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003240 static_libs: [
3241 "static-runtime-helper",
3242 // statically linked component libraries should not pull their SDK libraries,
3243 // so "fred" should not be added to class loader context
3244 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003245 "static-x",
3246 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003247 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003248 uses_libs: [
3249 "foo",
3250 "non-sdk-lib"
3251 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003252 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003253 optional_uses_libs: [
3254 "bar",
3255 "baz",
3256 ],
3257 }
3258
3259 android_app_import {
3260 name: "prebuilt",
3261 apk: "prebuilts/apk/app.apk",
3262 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003263 uses_libs: [
3264 "foo",
3265 "non-sdk-lib",
3266 "android.test.runner"
3267 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07003268 optional_uses_libs: [
3269 "bar",
3270 "baz",
3271 ],
3272 }
3273 `
3274
Paul Duffin71ae5942021-03-22 15:36:52 +00003275 result := android.GroupFixturePreparers(
3276 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003277 PrepareForTestWithJavaSdkLibraryFiles,
3278 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Jiakai Zhang48203e32023-06-02 23:42:21 +01003279 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3280 variables.BuildWarningBadOptionalUsesLibsAllowlist = []string{"app", "prebuilt"}
3281 }),
Paul Duffind234b412021-03-12 23:04:46 +00003282 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07003283
Paul Duffind234b412021-03-12 23:04:46 +00003284 app := result.ModuleForTests("app", "android_common")
3285 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07003286
Paul Duffin859fe962020-05-15 10:20:31 +01003287 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003288 // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be
3289 // propagated from dependencies.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003290 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3291 expectManifestFixerArgs := `--extract-native-libs=true ` +
3292 `--uses-library qux ` +
3293 `--uses-library quuz ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003294 `--uses-library foo ` +
3295 `--uses-library com.non.sdk.lib ` +
3296 `--uses-library runtime-library ` +
3297 `--uses-library runtime-required-x ` +
3298 `--uses-library runtime-required-y ` +
3299 `--optional-uses-library bar ` +
3300 `--optional-uses-library runtime-optional-x ` +
3301 `--optional-uses-library runtime-optional-y`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003302 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01003303
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003304 // Test that all libraries are verified (library order matters).
3305 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
3306 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00003307 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003308 `--uses-library qux ` +
3309 `--uses-library quuz ` +
3310 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003311 `--uses-library runtime-required-x ` +
3312 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003313 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003314 `--optional-uses-library baz ` +
3315 `--optional-uses-library runtime-optional-x ` +
3316 `--optional-uses-library runtime-optional-y `
Paul Duffind234b412021-03-12 23:04:46 +00003317 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003318
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003319 // Test that all libraries are verified for an APK (library order matters).
3320 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00003321 verifyApkArgs := `--uses-library foo ` +
3322 `--uses-library com.non.sdk.lib ` +
3323 `--uses-library android.test.runner ` +
3324 `--optional-uses-library bar ` +
3325 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00003326 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003327
Jiakai Zhanga4496782023-05-17 16:57:30 +01003328 // Test that necessary args are passed for constructing CLC in Ninja phase.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003329 cmd := app.Rule("dexpreopt").RuleParams.Command
Jiakai Zhanga4496782023-05-17 16:57:30 +01003330 android.AssertStringDoesContain(t, "dexpreopt app cmd context", cmd, "--context-json=")
3331 android.AssertStringDoesContain(t, "dexpreopt app cmd product_packages", cmd,
Jiakai Zhang51b2a8b2023-06-26 16:47:38 +01003332 "--product-packages=out/soong/.intermediates/app/android_common/dexpreopt/product_packages.txt")
Colin Cross50ddcc42019-05-16 12:28:22 -07003333}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003334
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003335func TestDexpreoptBcp(t *testing.T) {
3336 bp := `
3337 java_sdk_library {
3338 name: "foo",
3339 srcs: ["a.java"],
3340 api_packages: ["foo"],
3341 sdk_version: "current",
3342 }
3343
3344 java_sdk_library {
3345 name: "bar",
3346 srcs: ["a.java"],
3347 api_packages: ["bar"],
3348 permitted_packages: ["bar"],
3349 sdk_version: "current",
3350 }
3351
3352 android_app {
3353 name: "app",
3354 srcs: ["a.java"],
3355 sdk_version: "current",
3356 }
3357 `
3358
3359 testCases := []struct {
3360 name string
3361 with bool
3362 expect string
3363 }{
3364 {
3365 name: "with updatable bcp",
3366 with: true,
3367 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
3368 },
3369 {
3370 name: "without updatable bcp",
3371 with: false,
3372 expect: "/system/framework/foo.jar",
3373 },
3374 }
3375
3376 for _, test := range testCases {
3377 t.Run(test.name, func(t *testing.T) {
3378 result := android.GroupFixturePreparers(
3379 prepareForJavaTest,
3380 PrepareForTestWithJavaSdkLibraryFiles,
3381 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
3382 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01003383 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003384 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
3385 ).RunTestWithBp(t, bp)
3386
3387 app := result.ModuleForTests("app", "android_common")
3388 cmd := app.Rule("dexpreopt").RuleParams.Command
3389 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
3390 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
3391 })
3392 }
3393}
3394
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003395func TestCodelessApp(t *testing.T) {
3396 testCases := []struct {
3397 name string
3398 bp string
3399 noCode bool
3400 }{
3401 {
3402 name: "normal",
3403 bp: `
3404 android_app {
3405 name: "foo",
3406 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003407 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003408 }
3409 `,
3410 noCode: false,
3411 },
3412 {
3413 name: "app without sources",
3414 bp: `
3415 android_app {
3416 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003417 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003418 }
3419 `,
3420 noCode: true,
3421 },
3422 {
3423 name: "app with libraries",
3424 bp: `
3425 android_app {
3426 name: "foo",
3427 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003428 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003429 }
3430
3431 java_library {
3432 name: "lib",
3433 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003434 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003435 }
3436 `,
3437 noCode: false,
3438 },
3439 {
3440 name: "app with sourceless libraries",
3441 bp: `
3442 android_app {
3443 name: "foo",
3444 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003445 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003446 }
3447
3448 java_library {
3449 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003450 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003451 }
3452 `,
3453 // TODO(jungjw): this should probably be true
3454 noCode: false,
3455 },
3456 }
3457
3458 for _, test := range testCases {
3459 t.Run(test.name, func(t *testing.T) {
3460 ctx := testApp(t, test.bp)
3461
3462 foo := ctx.ModuleForTests("foo", "android_common")
3463 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3464 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
3465 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
3466 }
3467 })
3468 }
3469}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07003470
Colin Cross53a87f52019-06-25 13:35:30 -07003471func TestUncompressDex(t *testing.T) {
3472 testCases := []struct {
3473 name string
3474 bp string
3475
3476 uncompressedPlatform bool
3477 uncompressedUnbundled bool
3478 }{
3479 {
3480 name: "normal",
3481 bp: `
3482 android_app {
3483 name: "foo",
3484 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003485 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003486 }
3487 `,
3488 uncompressedPlatform: true,
3489 uncompressedUnbundled: false,
3490 },
3491 {
3492 name: "use_embedded_dex",
3493 bp: `
3494 android_app {
3495 name: "foo",
3496 use_embedded_dex: true,
3497 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003498 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003499 }
3500 `,
3501 uncompressedPlatform: true,
3502 uncompressedUnbundled: true,
3503 },
3504 {
3505 name: "privileged",
3506 bp: `
3507 android_app {
3508 name: "foo",
3509 privileged: true,
3510 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003511 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003512 }
3513 `,
3514 uncompressedPlatform: true,
3515 uncompressedUnbundled: true,
3516 },
David Srbeckye033cba2020-05-20 22:20:28 +01003517 {
3518 name: "normal_uncompress_dex_true",
3519 bp: `
3520 android_app {
3521 name: "foo",
3522 srcs: ["a.java"],
3523 sdk_version: "current",
3524 uncompress_dex: true,
3525 }
3526 `,
3527 uncompressedPlatform: true,
3528 uncompressedUnbundled: true,
3529 },
3530 {
3531 name: "normal_uncompress_dex_false",
3532 bp: `
3533 android_app {
3534 name: "foo",
3535 srcs: ["a.java"],
3536 sdk_version: "current",
3537 uncompress_dex: false,
3538 }
3539 `,
3540 uncompressedPlatform: false,
3541 uncompressedUnbundled: false,
3542 },
Colin Cross53a87f52019-06-25 13:35:30 -07003543 }
3544
3545 test := func(t *testing.T, bp string, want bool, unbundled bool) {
3546 t.Helper()
3547
Paul Duffin71ae5942021-03-22 15:36:52 +00003548 result := android.GroupFixturePreparers(
3549 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003550 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00003551 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3552 if unbundled {
3553 variables.Unbundled_build = proptools.BoolPtr(true)
3554 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
3555 }
3556 }),
3557 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07003558
Paul Duffincdb88a92021-03-14 00:36:50 +00003559 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07003560 dex := foo.Rule("r8")
3561 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
3562 aligned := foo.MaybeRule("zipalign").Rule != nil
3563
Paul Duffincdb88a92021-03-14 00:36:50 +00003564 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07003565
Paul Duffincdb88a92021-03-14 00:36:50 +00003566 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07003567 }
3568
3569 for _, tt := range testCases {
3570 t.Run(tt.name, func(t *testing.T) {
3571 t.Run("platform", func(t *testing.T) {
3572 test(t, tt.bp, tt.uncompressedPlatform, false)
3573 })
3574 t.Run("unbundled", func(t *testing.T) {
3575 test(t, tt.bp, tt.uncompressedUnbundled, true)
3576 })
3577 })
3578 }
3579}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003580
3581func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
3582 if expectedValue != "" {
3583 expectedFlag := "--" + flagName + " " + expectedValue
3584 if !strings.Contains(aapt2Flags, expectedFlag) {
3585 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
3586 }
3587 } else {
3588 unexpectedFlag := "--" + flagName
3589 if strings.Contains(aapt2Flags, unexpectedFlag) {
3590 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
3591 }
3592 }
3593}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08003594
Cole Faust9a631312020-10-22 21:05:24 +00003595func TestExportedProguardFlagFiles(t *testing.T) {
3596 ctx, _ := testJava(t, `
3597 android_app {
3598 name: "foo",
3599 sdk_version: "current",
3600 static_libs: ["lib1"],
3601 }
3602
3603 android_library {
3604 name: "lib1",
3605 sdk_version: "current",
3606 optimize: {
3607 proguard_flags_files: ["lib1proguard.cfg"],
3608 }
3609 }
3610 `)
3611
3612 m := ctx.ModuleForTests("foo", "android_common")
3613 hasLib1Proguard := false
3614 for _, s := range m.Rule("java.r8").Implicits.Strings() {
3615 if s == "lib1proguard.cfg" {
3616 hasLib1Proguard = true
3617 break
3618 }
3619 }
3620
3621 if !hasLib1Proguard {
3622 t.Errorf("App does not use library proguard config")
3623 }
3624}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003625
3626func TestTargetSdkVersionManifestFixer(t *testing.T) {
3627 platform_sdk_codename := "Tiramisu"
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003628 platform_sdk_version := 33
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003629 testCases := []struct {
3630 name string
3631 targetSdkVersionInBp string
3632 targetSdkVersionExpected string
3633 unbundledBuild bool
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003634 platformSdkFinal bool
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003635 }{
3636 {
3637 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
3638 targetSdkVersionInBp: "30",
3639 targetSdkVersionExpected: "30",
3640 unbundledBuild: false,
3641 },
3642 {
3643 name: "Unbundled build: Android.bp has targetSdkVersion",
3644 targetSdkVersionInBp: "30",
3645 targetSdkVersionExpected: "30",
3646 unbundledBuild: true,
3647 },
3648 {
3649 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3650 targetSdkVersionInBp: platform_sdk_codename,
3651 targetSdkVersionExpected: platform_sdk_codename,
3652 unbundledBuild: false,
3653 },
3654 {
3655 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3656 targetSdkVersionInBp: platform_sdk_codename,
3657 targetSdkVersionExpected: "10000",
3658 unbundledBuild: true,
3659 },
3660
3661 {
3662 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
3663 targetSdkVersionExpected: platform_sdk_codename,
3664 unbundledBuild: false,
3665 },
3666 {
3667 name: "Unbundled build: Android.bp has no targetSdkVersion",
3668 targetSdkVersionExpected: "10000",
3669 unbundledBuild: true,
3670 },
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003671 {
3672 name: "Bundled build in REL branches",
3673 targetSdkVersionExpected: "33",
3674 unbundledBuild: false,
3675 platformSdkFinal: true,
3676 },
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003677 }
3678 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003679 targetSdkVersionTemplate := ""
3680 if testCase.targetSdkVersionInBp != "" {
3681 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, testCase.targetSdkVersionInBp)
3682 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003683 bp := fmt.Sprintf(`
3684 android_app {
3685 name: "foo",
3686 sdk_version: "current",
Spandan Dasca70fc42023-03-01 23:38:49 +00003687 %s
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003688 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003689 `, targetSdkVersionTemplate)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003690 fixture := android.GroupFixturePreparers(
3691 prepareForJavaTest,
3692 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003693 if testCase.platformSdkFinal {
3694 variables.Platform_sdk_final = proptools.BoolPtr(true)
3695 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003696 // explicitly set platform_sdk_codename to make the test deterministic
3697 variables.Platform_sdk_codename = &platform_sdk_codename
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003698 variables.Platform_sdk_version = &platform_sdk_version
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003699 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3700 // create a non-empty list if unbundledBuild==true
3701 if testCase.unbundledBuild {
3702 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3703 }
3704 }),
3705 )
3706
3707 result := fixture.RunTestWithBp(t, bp)
3708 foo := result.ModuleForTests("foo", "android_common")
3709
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003710 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3711 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003712 }
3713}
Colin Cross412436f2022-04-07 17:40:07 -07003714
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003715func TestDefaultAppTargetSdkVersionForUpdatableModules(t *testing.T) {
3716 platform_sdk_codename := "Tiramisu"
3717 platform_sdk_version := 33
3718 testCases := []struct {
3719 name string
3720 platform_sdk_final bool
3721 targetSdkVersionInBp *string
3722 targetSdkVersionExpected *string
3723 updatable bool
3724 }{
3725 {
3726 name: "Non-Updatable Module: Android.bp has older targetSdkVersion",
3727 targetSdkVersionInBp: proptools.StringPtr("29"),
3728 targetSdkVersionExpected: proptools.StringPtr("29"),
3729 updatable: false,
3730 },
3731 {
3732 name: "Updatable Module: Android.bp has older targetSdkVersion",
3733 targetSdkVersionInBp: proptools.StringPtr("30"),
3734 targetSdkVersionExpected: proptools.StringPtr("30"),
3735 updatable: true,
3736 },
3737 {
3738 name: "Updatable Module: Android.bp has no targetSdkVersion",
3739 targetSdkVersionExpected: proptools.StringPtr("10000"),
3740 updatable: true,
3741 },
3742 {
3743 name: "[SDK finalised] Non-Updatable Module: Android.bp has older targetSdkVersion",
3744 platform_sdk_final: true,
3745 targetSdkVersionInBp: proptools.StringPtr("30"),
3746 targetSdkVersionExpected: proptools.StringPtr("30"),
3747 updatable: false,
3748 },
3749 {
3750 name: "[SDK finalised] Updatable Module: Android.bp has older targetSdkVersion",
3751 platform_sdk_final: true,
3752 targetSdkVersionInBp: proptools.StringPtr("30"),
3753 targetSdkVersionExpected: proptools.StringPtr("30"),
3754 updatable: true,
3755 },
3756 {
3757 name: "[SDK finalised] Updatable Module: Android.bp has targetSdkVersion as platform sdk codename",
3758 platform_sdk_final: true,
3759 targetSdkVersionInBp: proptools.StringPtr(platform_sdk_codename),
3760 targetSdkVersionExpected: proptools.StringPtr("33"),
3761 updatable: true,
3762 },
3763 {
3764 name: "[SDK finalised] Updatable Module: Android.bp has no targetSdkVersion",
3765 platform_sdk_final: true,
3766 targetSdkVersionExpected: proptools.StringPtr("33"),
3767 updatable: true,
3768 },
3769 }
3770 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003771 targetSdkVersionTemplate := ""
3772 if testCase.targetSdkVersionInBp != nil {
3773 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, *testCase.targetSdkVersionInBp)
3774 }
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003775 bp := fmt.Sprintf(`
3776 android_app {
3777 name: "foo",
3778 sdk_version: "current",
3779 min_sdk_version: "29",
Spandan Dasca70fc42023-03-01 23:38:49 +00003780 %s
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003781 updatable: %t,
3782 enforce_default_target_sdk_version: %t
3783 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003784 `, targetSdkVersionTemplate, testCase.updatable, testCase.updatable) // enforce default target sdk version if app is updatable
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003785
3786 fixture := android.GroupFixturePreparers(
3787 PrepareForTestWithJavaDefaultModules,
3788 android.PrepareForTestWithAllowMissingDependencies,
3789 android.PrepareForTestWithAndroidMk,
3790 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3791 // explicitly set following platform variables to make the test deterministic
3792 variables.Platform_sdk_final = &testCase.platform_sdk_final
3793 variables.Platform_sdk_version = &platform_sdk_version
3794 variables.Platform_sdk_codename = &platform_sdk_codename
3795 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
Harshit Mahajan18845d02023-01-11 18:39:12 +00003796 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003797 variables.Unbundled_build_apps = []string{"sampleModule"}
3798 }),
3799 )
3800
3801 result := fixture.RunTestWithBp(t, bp)
3802 foo := result.ModuleForTests("foo", "android_common")
3803
3804 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3805 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+*testCase.targetSdkVersionExpected)
3806 }
3807}
3808
3809func TestEnforceDefaultAppTargetSdkVersionFlag(t *testing.T) {
3810 platform_sdk_codename := "Tiramisu"
3811 platform_sdk_version := 33
3812 testCases := []struct {
3813 name string
3814 enforceDefaultTargetSdkVersion bool
3815 expectedError string
3816 platform_sdk_final bool
3817 targetSdkVersionInBp string
3818 targetSdkVersionExpected string
3819 updatable bool
3820 }{
3821 {
3822 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
3823 enforceDefaultTargetSdkVersion: false,
3824 targetSdkVersionInBp: "29",
3825 targetSdkVersionExpected: "29",
3826 updatable: false,
3827 },
3828 {
3829 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3830 enforceDefaultTargetSdkVersion: true,
3831 platform_sdk_final: true,
3832 targetSdkVersionInBp: "current",
3833 targetSdkVersionExpected: "33",
3834 updatable: true,
3835 },
3836 {
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003837 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003838 enforceDefaultTargetSdkVersion: true,
3839 platform_sdk_final: false,
3840 targetSdkVersionInBp: "current",
3841 targetSdkVersionExpected: "10000",
3842 updatable: false,
3843 },
3844 {
3845 name: "Not enforcing Target SDK Version for Updatable app",
3846 enforceDefaultTargetSdkVersion: false,
3847 expectedError: "Updatable apps must enforce default target sdk version",
3848 targetSdkVersionInBp: "29",
3849 targetSdkVersionExpected: "29",
3850 updatable: true,
3851 },
3852 }
3853 for _, testCase := range testCases {
3854 errExpected := testCase.expectedError != ""
3855 bp := fmt.Sprintf(`
3856 android_app {
3857 name: "foo",
3858 enforce_default_target_sdk_version: %t,
3859 sdk_version: "current",
3860 min_sdk_version: "29",
3861 target_sdk_version: "%v",
3862 updatable: %t
3863 }
3864 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp, testCase.updatable)
3865
3866 fixture := android.GroupFixturePreparers(
3867 PrepareForTestWithJavaDefaultModules,
3868 android.PrepareForTestWithAllowMissingDependencies,
3869 android.PrepareForTestWithAndroidMk,
3870 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3871 // explicitly set following platform variables to make the test deterministic
3872 variables.Platform_sdk_final = &testCase.platform_sdk_final
3873 variables.Platform_sdk_version = &platform_sdk_version
3874 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00003875 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003876 variables.Unbundled_build_apps = []string{"sampleModule"}
3877 }),
3878 )
3879
3880 errorHandler := android.FixtureExpectsNoErrors
3881 if errExpected {
3882 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
3883 }
3884 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
3885
3886 if !errExpected {
3887 foo := result.ModuleForTests("foo", "android_common")
3888 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3889 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3890 }
3891 }
3892}
3893
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003894func TestEnforceDefaultAppTargetSdkVersionFlagForTests(t *testing.T) {
3895 platform_sdk_codename := "Tiramisu"
3896 platform_sdk_version := 33
3897 testCases := []struct {
3898 name string
3899 enforceDefaultTargetSdkVersion bool
3900 expectedError string
3901 platform_sdk_final bool
3902 targetSdkVersionInBp string
3903 targetSdkVersionExpected string
3904 }{
3905 {
3906 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
3907 enforceDefaultTargetSdkVersion: false,
3908 targetSdkVersionInBp: "29",
3909 targetSdkVersionExpected: "29",
3910 },
3911 {
3912 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3913 enforceDefaultTargetSdkVersion: true,
3914 platform_sdk_final: true,
3915 targetSdkVersionInBp: "current",
3916 targetSdkVersionExpected: "33",
3917 },
3918 {
3919 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3920 enforceDefaultTargetSdkVersion: true,
3921 platform_sdk_final: false,
3922 targetSdkVersionInBp: "current",
3923 targetSdkVersionExpected: "10000",
3924 },
3925 }
3926 for _, testCase := range testCases {
3927 errExpected := testCase.expectedError != ""
3928 bp := fmt.Sprintf(`
3929 android_test {
3930 name: "foo",
3931 enforce_default_target_sdk_version: %t,
3932 min_sdk_version: "29",
3933 target_sdk_version: "%v",
3934 }
3935 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp)
3936
3937 fixture := android.GroupFixturePreparers(
3938 PrepareForTestWithJavaDefaultModules,
3939 android.PrepareForTestWithAllowMissingDependencies,
3940 android.PrepareForTestWithAndroidMk,
3941 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3942 // explicitly set following platform variables to make the test deterministic
3943 variables.Platform_sdk_final = &testCase.platform_sdk_final
3944 variables.Platform_sdk_version = &platform_sdk_version
3945 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00003946 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003947 variables.Unbundled_build_apps = []string{"sampleModule"}
3948 }),
3949 )
3950
3951 errorHandler := android.FixtureExpectsNoErrors
3952 if errExpected {
3953 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
3954 }
3955 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
3956
3957 if !errExpected {
3958 foo := result.ModuleForTests("foo", "android_common")
3959 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3960 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3961 }
3962 }
3963}
3964
Colin Cross412436f2022-04-07 17:40:07 -07003965func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
3966 result := android.GroupFixturePreparers(
3967 PrepareForTestWithJavaDefaultModules,
3968 android.PrepareForTestWithAllowMissingDependencies,
3969 android.PrepareForTestWithAndroidMk,
3970 ).RunTestWithBp(t, `
3971 android_app {
3972 name: "foo",
3973 srcs: ["a.java"],
3974 certificate: ":missing_certificate",
3975 sdk_version: "current",
Zyan Wub7550aa2023-05-18 15:46:31 +08003976 }
3977
3978 android_app {
3979 name: "bar",
3980 srcs: ["a.java"],
3981 certificate: ":missing_certificate",
3982 product_specific: true,
3983 sdk_version: "current",
Colin Cross412436f2022-04-07 17:40:07 -07003984 }`)
3985
3986 foo := result.ModuleForTests("foo", "android_common")
3987 fooApk := foo.Output("foo.apk")
3988 if fooApk.Rule != android.ErrorRule {
3989 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
3990 }
3991 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
3992}
Sam Delmerico82602492022-06-10 17:05:42 +00003993
3994func TestAppIncludesJniPackages(t *testing.T) {
3995 ctx := android.GroupFixturePreparers(
3996 PrepareForTestWithJavaDefaultModules,
3997 ).RunTestWithBp(t, `
3998 android_library_import {
3999 name: "aary-nodeps",
4000 aars: ["aary.aar"],
4001 extract_jni: true,
4002 }
4003
4004 android_library {
4005 name: "aary-lib",
4006 sdk_version: "current",
4007 min_sdk_version: "21",
4008 static_libs: ["aary-nodeps"],
4009 }
4010
4011 android_app {
4012 name: "aary-lib-dep",
4013 sdk_version: "current",
4014 min_sdk_version: "21",
4015 manifest: "AndroidManifest.xml",
4016 static_libs: ["aary-lib"],
4017 use_embedded_native_libs: true,
4018 }
4019
4020 android_app {
4021 name: "aary-import-dep",
4022 sdk_version: "current",
4023 min_sdk_version: "21",
4024 manifest: "AndroidManifest.xml",
4025 static_libs: ["aary-nodeps"],
4026 use_embedded_native_libs: true,
4027 }
4028
4029 android_app {
4030 name: "aary-no-use-embedded",
4031 sdk_version: "current",
4032 min_sdk_version: "21",
4033 manifest: "AndroidManifest.xml",
4034 static_libs: ["aary-nodeps"],
4035 }`)
4036
4037 testCases := []struct {
4038 name string
4039 hasPackage bool
4040 }{
4041 {
4042 name: "aary-import-dep",
4043 hasPackage: true,
4044 },
4045 {
4046 name: "aary-lib-dep",
4047 hasPackage: true,
4048 },
4049 {
4050 name: "aary-no-use-embedded",
4051 hasPackage: false,
4052 },
4053 }
4054
4055 for _, tc := range testCases {
4056 t.Run(tc.name, func(t *testing.T) {
4057 app := ctx.ModuleForTests(tc.name, "android_common")
4058
4059 outputFile := "jnilibs.zip"
4060 jniOutputLibZip := app.MaybeOutput(outputFile)
4061 if jniOutputLibZip.Rule == nil && !tc.hasPackage {
4062 return
4063 }
4064
4065 jniPackage := "arm64-v8a_jni.zip"
4066 inputs := jniOutputLibZip.Inputs
4067 foundPackage := false
4068 for i := 0; i < len(inputs); i++ {
4069 if strings.Contains(inputs[i].String(), jniPackage) {
4070 foundPackage = true
4071 }
4072 }
4073 if foundPackage != tc.hasPackage {
4074 t.Errorf("expected to find %v in %v inputs; inputs = %v", jniPackage, outputFile, inputs)
4075 }
4076 })
4077 }
4078}
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004079
4080func TestTargetSdkVersionMtsTests(t *testing.T) {
4081 platformSdkCodename := "Tiramisu"
4082 android_test := "android_test"
4083 android_test_helper_app := "android_test_helper_app"
4084 bpTemplate := `
4085 %v {
4086 name: "mytest",
4087 target_sdk_version: "%v",
4088 test_suites: ["othersuite", "%v"],
4089 }
4090 `
4091 testCases := []struct {
4092 desc string
4093 moduleType string
4094 targetSdkVersionInBp string
4095 targetSdkVersionExpected string
4096 testSuites string
4097 }{
4098 {
4099 desc: "Non-MTS android_test_apps targeting current should not be upgraded to 10000",
4100 moduleType: android_test,
4101 targetSdkVersionInBp: "current",
4102 targetSdkVersionExpected: platformSdkCodename,
4103 testSuites: "non-mts-suite",
4104 },
4105 {
4106 desc: "MTS android_test_apps targeting released sdks should not be upgraded to 10000",
4107 moduleType: android_test,
4108 targetSdkVersionInBp: "29",
4109 targetSdkVersionExpected: "29",
4110 testSuites: "mts-suite",
4111 },
4112 {
4113 desc: "MTS android_test_apps targeting current should be upgraded to 10000",
4114 moduleType: android_test,
4115 targetSdkVersionInBp: "current",
4116 targetSdkVersionExpected: "10000",
4117 testSuites: "mts-suite",
4118 },
4119 {
4120 desc: "MTS android_test_helper_apps targeting current should be upgraded to 10000",
4121 moduleType: android_test_helper_app,
4122 targetSdkVersionInBp: "current",
4123 targetSdkVersionExpected: "10000",
4124 testSuites: "mts-suite",
4125 },
4126 }
4127 fixture := android.GroupFixturePreparers(
4128 prepareForJavaTest,
4129 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4130 variables.Platform_sdk_codename = &platformSdkCodename
4131 variables.Platform_version_active_codenames = []string{platformSdkCodename}
4132 }),
4133 )
4134 for _, testCase := range testCases {
4135 result := fixture.RunTestWithBp(t, fmt.Sprintf(bpTemplate, testCase.moduleType, testCase.targetSdkVersionInBp, testCase.testSuites))
4136 mytest := result.ModuleForTests("mytest", "android_common")
4137 manifestFixerArgs := mytest.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4138 android.AssertStringDoesContain(t, testCase.desc, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4139 }
4140}
Andrei Onea580636b2022-08-17 16:53:46 +00004141
4142func TestPrivappAllowlist(t *testing.T) {
4143 testJavaError(t, "privileged must be set in order to use privapp_allowlist", `
4144 android_app {
4145 name: "foo",
4146 srcs: ["a.java"],
4147 privapp_allowlist: "perms.xml",
4148 }
4149 `)
4150
4151 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
4152 t,
4153 `
4154 android_app {
4155 name: "foo",
4156 srcs: ["a.java"],
Sam Delmerico15809f82023-05-15 17:21:47 -04004157 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
Andrei Onea580636b2022-08-17 16:53:46 +00004158 privileged: true,
Andrei Onea580636b2022-08-17 16:53:46 +00004159 sdk_version: "current",
4160 }
4161 override_android_app {
4162 name: "bar",
4163 base: "foo",
4164 package_name: "com.google.android.foo",
4165 }
4166 `,
4167 )
4168 app := result.ModuleForTests("foo", "android_common")
4169 overrideApp := result.ModuleForTests("foo", "android_common_bar")
4170
Sam Delmerico15809f82023-05-15 17:21:47 -04004171 // verify that privapp allowlist is created for override apps
Andrei Onea580636b2022-08-17 16:53:46 +00004172 overrideApp.Output("out/soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml")
Sam Delmerico15809f82023-05-15 17:21:47 -04004173 expectedAllowlistInput := "privapp_allowlist_com.android.foo.xml"
4174 overrideActualAllowlistInput := overrideApp.Rule("modifyAllowlist").Input.String()
4175 if expectedAllowlistInput != overrideActualAllowlistInput {
4176 t.Errorf("expected override allowlist to be %q; got %q", expectedAllowlistInput, overrideActualAllowlistInput)
Andrei Onea580636b2022-08-17 16:53:46 +00004177 }
4178
4179 // verify that permissions are copied to device
Anton Hansson0e486a42023-06-01 16:38:35 +00004180 app.Output("out/soong/target/product/test_device/system/etc/permissions/foo.xml")
4181 overrideApp.Output("out/soong/target/product/test_device/system/etc/permissions/bar.xml")
Andrei Onea580636b2022-08-17 16:53:46 +00004182}
Sam Delmericob1daccd2023-05-25 14:45:30 -04004183
4184func TestPrivappAllowlistAndroidMk(t *testing.T) {
4185 result := android.GroupFixturePreparers(
4186 PrepareForTestWithJavaDefaultModules,
4187 android.PrepareForTestWithAndroidMk,
4188 ).RunTestWithBp(
4189 t,
4190 `
4191 android_app {
4192 name: "foo",
4193 srcs: ["a.java"],
4194 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
4195 privileged: true,
4196 sdk_version: "current",
4197 }
4198 override_android_app {
4199 name: "bar",
4200 base: "foo",
4201 package_name: "com.google.android.foo",
4202 }
4203 `,
4204 )
4205 baseApp := result.ModuleForTests("foo", "android_common")
4206 overrideApp := result.ModuleForTests("foo", "android_common_bar")
4207
4208 baseAndroidApp := baseApp.Module().(*AndroidApp)
4209 baseEntries := android.AndroidMkEntriesForTest(t, result.TestContext, baseAndroidApp)[0]
4210 android.AssertStringMatches(
4211 t,
4212 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find foo.apk",
4213 baseEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4214 "\\S+foo.apk",
4215 )
4216 android.AssertStringMatches(
4217 t,
4218 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include foo.apk",
4219 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4220 "\\S+foo.apk",
4221 )
4222 android.AssertStringMatches(
4223 t,
4224 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4225 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4226 "\\S+foo.apk:\\S+/target/product/test_device/system/priv-app/foo/foo.apk",
4227 )
4228 android.AssertStringMatches(
4229 t,
4230 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4231 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004232 "privapp_allowlist_com.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/foo.xml",
Sam Delmericob1daccd2023-05-25 14:45:30 -04004233 )
4234
4235 overrideAndroidApp := overrideApp.Module().(*AndroidApp)
4236 overrideEntries := android.AndroidMkEntriesForTest(t, result.TestContext, overrideAndroidApp)[0]
4237 android.AssertStringMatches(
4238 t,
4239 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find bar.apk",
4240 overrideEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4241 "\\S+bar.apk",
4242 )
4243 android.AssertStringMatches(
4244 t,
4245 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include bar.apk",
4246 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4247 "\\S+bar.apk",
4248 )
4249 android.AssertStringMatches(
4250 t,
4251 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4252 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4253 "\\S+bar.apk:\\S+/target/product/test_device/system/priv-app/bar/bar.apk",
4254 )
4255 android.AssertStringMatches(
4256 t,
4257 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4258 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004259 "\\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 -04004260 )
4261}
Sam Delmerico0e0d96e2023-08-18 22:43:28 +00004262
4263func TestApexGlobalMinSdkVersionOverride(t *testing.T) {
4264 result := android.GroupFixturePreparers(
4265 PrepareForTestWithJavaDefaultModules,
4266 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4267 variables.ApexGlobalMinSdkVersionOverride = proptools.StringPtr("Tiramisu")
4268 }),
4269 ).RunTestWithBp(t, `
4270 android_app {
4271 name: "com.android.bar",
4272 srcs: ["a.java"],
4273 sdk_version: "current",
4274 }
4275 android_app {
4276 name: "com.android.foo",
4277 srcs: ["a.java"],
4278 sdk_version: "current",
4279 min_sdk_version: "S",
4280 updatable: true,
4281 }
4282 override_android_app {
4283 name: "com.android.go.foo",
4284 base: "com.android.foo",
4285 }
4286 `)
4287 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
4288 fooOverride := result.ModuleForTests("com.android.foo", "android_common_com.android.go.foo").Rule("manifestFixer")
4289 bar := result.ModuleForTests("com.android.bar", "android_common").Rule("manifestFixer")
4290
4291 android.AssertStringDoesContain(t,
4292 "expected manifest fixer to set com.android.bar minSdkVersion to S",
4293 bar.BuildParams.Args["args"],
4294 "--minSdkVersion S",
4295 )
4296 android.AssertStringDoesContain(t,
4297 "com.android.foo: expected manifest fixer to set minSdkVersion to T",
4298 foo.BuildParams.Args["args"],
4299 "--minSdkVersion T",
4300 )
4301 android.AssertStringDoesContain(t,
4302 "com.android.go.foo: expected manifest fixer to set minSdkVersion to T",
4303 fooOverride.BuildParams.Args["args"],
4304 "--minSdkVersion T",
4305 )
4306
4307}