blob: 4d3b2dc4d2a476ba32c3cdde23b4916016448e09 [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
Jiakai Zhangba82e282023-10-13 18:08:59 +0100611 android_library {
612 name: "lib5",
613 sdk_version: "current",
614 assets: [
615 "path/to/asset_file_1",
616 "path/to/asset_file_2",
617 ],
618 }
619
Colin Crossab8d1382023-07-14 17:23:41 +0000620 android_library_import {
621 name: "import",
622 sdk_version: "current",
623 aars: ["import.aar"],
624 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800625 `
626
627 testCases := []struct {
Jiakai Zhangba82e282023-10-13 18:08:59 +0100628 name string
629 assetFlag string
630 assetPackages []string
631 tmpAssetDirInputs []string
632 tmpAssetDirOutputs []string
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800633 }{
634 {
635 name: "foo",
Colin Crossab8d1382023-07-14 17:23:41 +0000636 // lib1 has its own assets. lib3 doesn't have any, but lib4 and import have assets.
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800637 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000638 "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
639 "out/soong/.intermediates/lib1/android_common/assets.zip",
Colin Crossab8d1382023-07-14 17:23:41 +0000640 "out/soong/.intermediates/lib4/android_common/assets.zip",
641 "out/soong/.intermediates/import/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800642 },
643 },
644 {
645 name: "lib1",
646 assetFlag: "-A assets_a",
647 },
648 {
649 name: "lib2",
650 },
651 {
652 name: "lib3",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800653 },
654 {
655 name: "lib4",
656 assetFlag: "-A assets_b",
657 },
Jiakai Zhangba82e282023-10-13 18:08:59 +0100658 {
659 name: "lib5",
660 assetFlag: "-A out/soong/.intermediates/lib5/android_common/tmp_asset_dir",
661 tmpAssetDirInputs: []string{
662 "path/to/asset_file_1",
663 "path/to/asset_file_2",
664 },
665 tmpAssetDirOutputs: []string{
666 "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_1",
667 "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_2",
668 },
669 },
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800670 }
671 ctx := testApp(t, bp)
672
673 for _, test := range testCases {
674 t.Run(test.name, func(t *testing.T) {
675 m := ctx.ModuleForTests(test.name, "android_common")
676
677 // Check asset flag in aapt2 link flags
678 var aapt2link android.TestingBuildParams
679 if len(test.assetPackages) > 0 {
680 aapt2link = m.Output("aapt2/package-res.apk")
681 } else {
682 aapt2link = m.Output("package-res.apk")
683 }
Paul Duffina71a67a2021-03-29 00:42:57 +0100684 aapt2link = aapt2link
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800685 aapt2Flags := aapt2link.Args["flags"]
686 if test.assetFlag != "" {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000687 android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800688 } else {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000689 android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800690 }
691
692 // Check asset merge rule.
693 if len(test.assetPackages) > 0 {
694 mergeAssets := m.Output("package-res.apk")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000695 android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800696 }
Jiakai Zhangba82e282023-10-13 18:08:59 +0100697
698 if len(test.tmpAssetDirInputs) > 0 {
699 rule := m.Rule("tmp_asset_dir")
700 inputs := rule.Implicits
701 outputs := append(android.WritablePaths{rule.Output}, rule.ImplicitOutputs...).Paths()
702 android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir inputs", test.tmpAssetDirInputs, inputs)
703 android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir outputs", test.tmpAssetDirOutputs, outputs)
704 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800705 })
706 }
707}
708
Colin Crossb014f072021-02-26 14:54:36 -0800709func TestAppJavaResources(t *testing.T) {
710 bp := `
711 android_app {
712 name: "foo",
713 sdk_version: "current",
714 java_resources: ["resources/a"],
715 srcs: ["a.java"],
716 }
717
718 android_app {
719 name: "bar",
720 sdk_version: "current",
721 java_resources: ["resources/a"],
722 }
723 `
724
725 ctx := testApp(t, bp)
726
727 foo := ctx.ModuleForTests("foo", "android_common")
728 fooResources := foo.Output("res/foo.jar")
729 fooDexJar := foo.Output("dex-withres/foo.jar")
730 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
731 fooApk := foo.Rule("combineApk")
732
733 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
734 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
735 }
736
737 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
738 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
739 }
740
741 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
742 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
743 }
744
745 bar := ctx.ModuleForTests("bar", "android_common")
746 barResources := bar.Output("res/bar.jar")
747 barApk := bar.Rule("combineApk")
748
749 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
750 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
751 }
752}
753
Colin Crossff3ff7f2023-07-05 14:04:12 -0700754func TestAndroidResourceProcessor(t *testing.T) {
755 testCases := []struct {
Colin Cross8676c8c2023-10-12 15:58:57 -0700756 name string
757 appUsesRP bool
758 directLibUsesRP bool
759 transitiveLibUsesRP bool
760 sharedLibUsesRP bool
761 sharedTransitiveStaticLibUsesRP bool
762 sharedTransitiveSharedLibUsesRP bool
Colin Crossff3ff7f2023-07-05 14:04:12 -0700763
764 dontVerifyApp bool
765 appResources []string
766 appOverlays []string
767 appImports []string
768 appSrcJars []string
769 appClasspath []string
770 appCombined []string
771
772 dontVerifyDirect bool
773 directResources []string
774 directOverlays []string
775 directImports []string
776 directSrcJars []string
777 directClasspath []string
778 directCombined []string
779
780 dontVerifyTransitive bool
781 transitiveResources []string
782 transitiveOverlays []string
783 transitiveImports []string
784 transitiveSrcJars []string
785 transitiveClasspath []string
786 transitiveCombined []string
787
788 dontVerifyDirectImport bool
789 directImportResources []string
790 directImportOverlays []string
791 directImportImports []string
792
793 dontVerifyTransitiveImport bool
794 transitiveImportResources []string
795 transitiveImportOverlays []string
796 transitiveImportImports []string
Colin Cross8676c8c2023-10-12 15:58:57 -0700797
798 dontVerifyShared bool
799 sharedResources []string
800 sharedOverlays []string
801 sharedImports []string
802 sharedSrcJars []string
803 sharedClasspath []string
804 sharedCombined []string
Colin Crossff3ff7f2023-07-05 14:04:12 -0700805 }{
806 {
Colin Cross4eae06d2023-06-20 22:40:02 -0700807 // Test with all modules set to use_resource_processor: false (except android_library_import modules,
808 // which always use resource processor).
809 name: "legacy",
810 appUsesRP: false,
811 directLibUsesRP: false,
812 transitiveLibUsesRP: false,
Colin Crossff3ff7f2023-07-05 14:04:12 -0700813
814 appResources: nil,
815 appOverlays: []string{
816 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000817 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700818 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
819 "out/soong/.intermediates/direct/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000820 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700821 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
822 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
823 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700824 appImports: []string{
825 "out/soong/.intermediates/shared/android_common/package-res.apk",
826 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
827 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700828 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
829 appClasspath: []string{
830 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700831 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700832 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
833 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
834 },
835 appCombined: []string{
836 "out/soong/.intermediates/app/android_common/javac/app.jar",
837 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
838 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
839 },
840
841 directResources: nil,
842 directOverlays: []string{
843 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000844 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700845 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
846 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
847 },
848 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
849 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
850 directClasspath: []string{
851 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
852 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
853 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
854 },
855 directCombined: []string{
856 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
857 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
858 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
859 },
860
861 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
862 transitiveOverlays: nil,
863 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
864 transitiveSrcJars: []string{"out/soong/.intermediates/transitive/android_common/gen/android/R.srcjar"},
865 transitiveClasspath: []string{"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar"},
866 transitiveCombined: nil,
867
Colin Cross8676c8c2023-10-12 15:58:57 -0700868 sharedResources: nil,
869 sharedOverlays: []string{
870 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
871 "out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat",
872 },
873 sharedImports: []string{
874 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
875 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
876 },
877 sharedSrcJars: []string{"out/soong/.intermediates/shared/android_common/gen/android/R.srcjar"},
878 sharedClasspath: []string{
879 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
880 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar",
881 "out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar",
882 },
883 sharedCombined: []string{
884 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
885 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
886 },
887
Colin Crossff3ff7f2023-07-05 14:04:12 -0700888 directImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700889 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
890 directImportImports: []string{
891 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700892 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
893 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700894
895 transitiveImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700896 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
897 transitiveImportImports: []string{
898 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700899 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
900 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700901 },
902 {
903 // Test with all modules set to use_resource_processor: true.
Colin Cross8676c8c2023-10-12 15:58:57 -0700904 name: "resource_processor",
905 appUsesRP: true,
906 directLibUsesRP: true,
907 transitiveLibUsesRP: true,
908 sharedLibUsesRP: true,
909 sharedTransitiveSharedLibUsesRP: true,
910 sharedTransitiveStaticLibUsesRP: true,
Colin Cross4eae06d2023-06-20 22:40:02 -0700911
912 appResources: nil,
913 appOverlays: []string{
914 "out/soong/.intermediates/transitive/android_common/package-res.apk",
915 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
916 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
917 "out/soong/.intermediates/direct/android_common/package-res.apk",
918 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
919 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
920 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
921 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700922 appImports: []string{
923 "out/soong/.intermediates/shared/android_common/package-res.apk",
924 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
925 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700926 appSrcJars: nil,
927 appClasspath: []string{
928 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
929 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700930 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700931 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
932 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
933 },
934 appCombined: []string{
935 "out/soong/.intermediates/app/android_common/busybox/R.jar",
936 "out/soong/.intermediates/app/android_common/javac/app.jar",
937 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
938 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
939 },
940
941 directResources: nil,
942 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
943 directImports: []string{
944 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
945 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
946 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
947 "out/soong/.intermediates/transitive/android_common/package-res.apk",
948 },
949 directSrcJars: nil,
950 directClasspath: []string{
951 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
952 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
953 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
954 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
955 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
956 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
957 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
958 },
959 directCombined: []string{
960 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
961 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
962 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
963 },
964
965 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
966 transitiveOverlays: nil,
967 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
968 transitiveSrcJars: nil,
969 transitiveClasspath: []string{
970 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
971 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
972 },
973 transitiveCombined: nil,
974
Colin Cross8676c8c2023-10-12 15:58:57 -0700975 sharedResources: nil,
976 sharedOverlays: []string{"out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat"},
977 sharedImports: []string{
978 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
979 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
980 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
981 },
982 sharedSrcJars: nil,
983 sharedClasspath: []string{
984 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
985 "out/soong/.intermediates/shared_transitive_static/android_common/busybox/R.jar",
986 "out/soong/.intermediates/shared_transitive_shared/android_common/busybox/R.jar",
987 "out/soong/.intermediates/shared/android_common/busybox/R.jar",
988 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar",
989 "out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar",
990 },
991 sharedCombined: []string{
992 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
993 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
994 },
995
Colin Cross4eae06d2023-06-20 22:40:02 -0700996 directImportResources: nil,
997 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
998 directImportImports: []string{
999 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1000 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1001 },
1002
1003 transitiveImportResources: nil,
1004 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
1005 transitiveImportImports: []string{
1006 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1007 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1008 },
1009 }, {
1010 // Test an app building with resource processor enabled but with dependencies built without
1011 // resource processor.
1012 name: "app_resource_processor",
1013 appUsesRP: true,
1014 directLibUsesRP: false,
1015 transitiveLibUsesRP: false,
1016
1017 appResources: nil,
1018 appOverlays: []string{
1019 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1020 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1021 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1022 "out/soong/.intermediates/direct/android_common/package-res.apk",
1023 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1024 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1025 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1026 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001027 appImports: []string{
1028 "out/soong/.intermediates/shared/android_common/package-res.apk",
1029 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1030 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001031 appSrcJars: nil,
1032 appClasspath: []string{
1033 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1034 // R.jar has to come before direct.jar
1035 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001036 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001037 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
1038 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
1039 },
1040 appCombined: []string{
1041 "out/soong/.intermediates/app/android_common/busybox/R.jar",
1042 "out/soong/.intermediates/app/android_common/javac/app.jar",
1043 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
1044 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
1045 },
1046
1047 dontVerifyDirect: true,
1048 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001049 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001050 dontVerifyDirectImport: true,
1051 dontVerifyTransitiveImport: true,
1052 },
1053 {
1054 // Test an app building without resource processor enabled but with a dependency built with
1055 // resource processor.
1056 name: "app_dependency_lib_resource_processor",
1057 appUsesRP: false,
1058 directLibUsesRP: true,
1059 transitiveLibUsesRP: false,
1060
1061 appOverlays: []string{
1062 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1063 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1064 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1065 "out/soong/.intermediates/direct/android_common/package-res.apk",
1066 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1067 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1068 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1069 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001070 appImports: []string{
1071 "out/soong/.intermediates/shared/android_common/package-res.apk",
1072 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1073 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001074 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1075 appClasspath: []string{
1076 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001077 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001078 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
1079 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
1080 },
1081 appCombined: []string{
1082 "out/soong/.intermediates/app/android_common/javac/app.jar",
1083 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
1084 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
1085 },
1086
1087 directResources: nil,
1088 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
1089 directImports: []string{
1090 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1091 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1092 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1093 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1094 },
1095 directSrcJars: nil,
1096 directClasspath: []string{
1097 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1098 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
1099 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
1100 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
1101 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
1102 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
1103 },
1104 directCombined: []string{
1105 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1106 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1107 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
1108 },
1109
1110 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001111 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001112 dontVerifyDirectImport: true,
1113 dontVerifyTransitiveImport: true,
1114 },
1115 {
1116 // Test a library building without resource processor enabled but with a dependency built with
1117 // resource processor.
1118 name: "lib_dependency_lib_resource_processor",
1119 appUsesRP: false,
1120 directLibUsesRP: false,
1121 transitiveLibUsesRP: true,
1122
1123 appOverlays: []string{
1124 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1125 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1126 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1127 "out/soong/.intermediates/direct/android_common/package-res.apk",
1128 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1129 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1130 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1131 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001132 appImports: []string{
1133 "out/soong/.intermediates/shared/android_common/package-res.apk",
1134 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1135 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001136 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1137 appClasspath: []string{
1138 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001139 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001140 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
1141 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
1142 },
1143 appCombined: []string{
1144 "out/soong/.intermediates/app/android_common/javac/app.jar",
1145 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
1146 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
1147 },
1148
1149 directResources: nil,
1150 directOverlays: []string{
1151 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1152 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1153 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1154 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
1155 },
1156 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1157 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
1158 directClasspath: []string{
1159 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1160 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
1161 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
1162 },
1163 directCombined: []string{
1164 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1165 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1166 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
1167 },
1168
1169 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1170 transitiveOverlays: nil,
1171 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1172 transitiveSrcJars: nil,
1173 transitiveClasspath: []string{
1174 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1175 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1176 },
1177 transitiveCombined: nil,
1178
Colin Cross8676c8c2023-10-12 15:58:57 -07001179 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001180 dontVerifyDirectImport: true,
1181 dontVerifyTransitiveImport: true,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001182 },
1183 }
1184
1185 for _, testCase := range testCases {
1186 t.Run(testCase.name, func(t *testing.T) {
1187 bp := fmt.Sprintf(`
1188 android_app {
1189 name: "app",
1190 sdk_version: "current",
1191 srcs: ["app/app.java"],
1192 resource_dirs: ["app/res"],
1193 manifest: "app/AndroidManifest.xml",
Colin Cross8676c8c2023-10-12 15:58:57 -07001194 libs: ["shared"],
Colin Crossff3ff7f2023-07-05 14:04:12 -07001195 static_libs: ["direct", "direct_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001196 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001197 }
1198
1199 android_library {
1200 name: "direct",
1201 sdk_version: "current",
1202 srcs: ["direct/direct.java"],
1203 resource_dirs: ["direct/res"],
1204 manifest: "direct/AndroidManifest.xml",
1205 static_libs: ["transitive", "transitive_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001206 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001207 }
1208
1209 android_library {
1210 name: "transitive",
1211 sdk_version: "current",
1212 srcs: ["transitive/transitive.java"],
1213 resource_dirs: ["transitive/res"],
1214 manifest: "transitive/AndroidManifest.xml",
Colin Cross4eae06d2023-06-20 22:40:02 -07001215 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001216 }
1217
Colin Cross8676c8c2023-10-12 15:58:57 -07001218 android_library {
1219 name: "shared",
1220 sdk_version: "current",
1221 srcs: ["shared/shared.java"],
1222 resource_dirs: ["shared/res"],
1223 manifest: "shared/AndroidManifest.xml",
1224 use_resource_processor: %v,
1225 libs: ["shared_transitive_shared"],
1226 static_libs: ["shared_transitive_static"],
1227 }
1228
1229 android_library {
1230 name: "shared_transitive_shared",
1231 sdk_version: "current",
1232 srcs: ["shared_transitive_shared/shared_transitive_shared.java"],
1233 resource_dirs: ["shared_transitive_shared/res"],
1234 manifest: "shared_transitive_shared/AndroidManifest.xml",
1235 use_resource_processor: %v,
1236 }
1237
1238 android_library {
1239 name: "shared_transitive_static",
1240 sdk_version: "current",
1241 srcs: ["shared_transitive_static/shared.java"],
1242 resource_dirs: ["shared_transitive_static/res"],
1243 manifest: "shared_transitive_static/AndroidManifest.xml",
1244 use_resource_processor: %v,
1245 }
1246
Colin Crossff3ff7f2023-07-05 14:04:12 -07001247 android_library_import {
1248 name: "direct_import",
1249 sdk_version: "current",
1250 aars: ["direct_import.aar"],
1251 static_libs: ["direct_import_dep"],
1252 }
1253
1254 android_library_import {
1255 name: "direct_import_dep",
1256 sdk_version: "current",
1257 aars: ["direct_import_dep.aar"],
1258 }
1259
1260 android_library_import {
1261 name: "transitive_import",
1262 sdk_version: "current",
1263 aars: ["transitive_import.aar"],
1264 static_libs: ["transitive_import_dep"],
1265 }
1266
1267 android_library_import {
1268 name: "transitive_import_dep",
1269 sdk_version: "current",
1270 aars: ["transitive_import_dep.aar"],
1271 }
Colin Cross8676c8c2023-10-12 15:58:57 -07001272 `, testCase.appUsesRP, testCase.directLibUsesRP, testCase.transitiveLibUsesRP,
1273 testCase.sharedLibUsesRP, testCase.sharedTransitiveSharedLibUsesRP, testCase.sharedTransitiveStaticLibUsesRP)
Colin Crossff3ff7f2023-07-05 14:04:12 -07001274
1275 fs := android.MockFS{
Colin Cross8676c8c2023-10-12 15:58:57 -07001276 "app/res/values/strings.xml": nil,
1277 "direct/res/values/strings.xml": nil,
1278 "transitive/res/values/strings.xml": nil,
1279 "shared/res/values/strings.xml": nil,
1280 "shared_transitive_static/res/values/strings.xml": nil,
1281 "shared_transitive_shared/res/values/strings.xml": nil,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001282 }
1283
1284 result := android.GroupFixturePreparers(
1285 PrepareForTestWithJavaDefaultModules,
1286 PrepareForTestWithOverlayBuildComponents,
1287 fs.AddToFixture(),
1288 ).RunTestWithBp(t, bp)
1289
1290 type aaptInfo struct {
1291 resources, overlays, imports, srcJars, classpath, combined android.Paths
1292 }
1293
1294 getAaptInfo := func(moduleName string) (aaptInfo aaptInfo) {
1295 mod := result.ModuleForTests(moduleName, "android_common")
1296 resourceListRule := mod.MaybeOutput("aapt2/res.list")
1297 overlayListRule := mod.MaybeOutput("aapt2/overlay.list")
1298 aaptRule := mod.Rule("aapt2Link")
1299 javacRule := mod.MaybeRule("javac")
1300 combinedRule := mod.MaybeOutput("combined/" + moduleName + ".jar")
1301
1302 aaptInfo.resources = resourceListRule.Inputs
1303 aaptInfo.overlays = overlayListRule.Inputs
1304
1305 aaptFlags := strings.Split(aaptRule.Args["flags"], " ")
1306 for i, flag := range aaptFlags {
1307 if flag == "-I" && i+1 < len(aaptFlags) {
1308 aaptInfo.imports = append(aaptInfo.imports, android.PathForTesting(aaptFlags[i+1]))
1309 }
1310 }
1311
1312 if len(javacRule.Args["srcJars"]) > 0 {
1313 aaptInfo.srcJars = android.PathsForTesting(strings.Split(javacRule.Args["srcJars"], " ")...)
1314 }
1315
1316 if len(javacRule.Args["classpath"]) > 0 {
1317 classpathArg := strings.TrimPrefix(javacRule.Args["classpath"], "-classpath ")
1318 aaptInfo.classpath = android.PathsForTesting(strings.Split(classpathArg, ":")...)
1319 }
1320
1321 aaptInfo.combined = combinedRule.Inputs
1322 return
1323 }
1324
1325 app := getAaptInfo("app")
1326 direct := getAaptInfo("direct")
1327 transitive := getAaptInfo("transitive")
Colin Cross8676c8c2023-10-12 15:58:57 -07001328 shared := getAaptInfo("shared")
Colin Crossff3ff7f2023-07-05 14:04:12 -07001329 directImport := getAaptInfo("direct_import")
1330 transitiveImport := getAaptInfo("transitive_import")
1331
1332 if !testCase.dontVerifyApp {
1333 android.AssertPathsRelativeToTopEquals(t, "app resources", testCase.appResources, app.resources)
1334 android.AssertPathsRelativeToTopEquals(t, "app overlays", testCase.appOverlays, app.overlays)
1335 android.AssertPathsRelativeToTopEquals(t, "app imports", testCase.appImports, app.imports)
1336 android.AssertPathsRelativeToTopEquals(t, "app srcjars", testCase.appSrcJars, app.srcJars)
1337 android.AssertPathsRelativeToTopEquals(t, "app classpath", testCase.appClasspath, app.classpath)
1338 android.AssertPathsRelativeToTopEquals(t, "app combined", testCase.appCombined, app.combined)
1339 }
1340
1341 if !testCase.dontVerifyDirect {
1342 android.AssertPathsRelativeToTopEquals(t, "direct resources", testCase.directResources, direct.resources)
1343 android.AssertPathsRelativeToTopEquals(t, "direct overlays", testCase.directOverlays, direct.overlays)
1344 android.AssertPathsRelativeToTopEquals(t, "direct imports", testCase.directImports, direct.imports)
1345 android.AssertPathsRelativeToTopEquals(t, "direct srcjars", testCase.directSrcJars, direct.srcJars)
1346 android.AssertPathsRelativeToTopEquals(t, "direct classpath", testCase.directClasspath, direct.classpath)
1347 android.AssertPathsRelativeToTopEquals(t, "direct combined", testCase.directCombined, direct.combined)
1348 }
1349
1350 if !testCase.dontVerifyTransitive {
1351 android.AssertPathsRelativeToTopEquals(t, "transitive resources", testCase.transitiveResources, transitive.resources)
1352 android.AssertPathsRelativeToTopEquals(t, "transitive overlays", testCase.transitiveOverlays, transitive.overlays)
1353 android.AssertPathsRelativeToTopEquals(t, "transitive imports", testCase.transitiveImports, transitive.imports)
1354 android.AssertPathsRelativeToTopEquals(t, "transitive srcjars", testCase.transitiveSrcJars, transitive.srcJars)
1355 android.AssertPathsRelativeToTopEquals(t, "transitive classpath", testCase.transitiveClasspath, transitive.classpath)
1356 android.AssertPathsRelativeToTopEquals(t, "transitive combined", testCase.transitiveCombined, transitive.combined)
1357 }
1358
Colin Cross8676c8c2023-10-12 15:58:57 -07001359 if !testCase.dontVerifyShared {
1360 android.AssertPathsRelativeToTopEquals(t, "shared resources", testCase.sharedResources, shared.resources)
1361 android.AssertPathsRelativeToTopEquals(t, "shared overlays", testCase.sharedOverlays, shared.overlays)
1362 android.AssertPathsRelativeToTopEquals(t, "shared imports", testCase.sharedImports, shared.imports)
1363 android.AssertPathsRelativeToTopEquals(t, "shared srcjars", testCase.sharedSrcJars, shared.srcJars)
1364 android.AssertPathsRelativeToTopEquals(t, "shared classpath", testCase.sharedClasspath, shared.classpath)
1365 android.AssertPathsRelativeToTopEquals(t, "shared combined", testCase.sharedCombined, shared.combined)
1366 }
1367
Colin Crossff3ff7f2023-07-05 14:04:12 -07001368 if !testCase.dontVerifyDirectImport {
1369 android.AssertPathsRelativeToTopEquals(t, "direct_import resources", testCase.directImportResources, directImport.resources)
1370 android.AssertPathsRelativeToTopEquals(t, "direct_import overlays", testCase.directImportOverlays, directImport.overlays)
1371 android.AssertPathsRelativeToTopEquals(t, "direct_import imports", testCase.directImportImports, directImport.imports)
1372 }
1373
1374 if !testCase.dontVerifyTransitiveImport {
1375 android.AssertPathsRelativeToTopEquals(t, "transitive_import resources", testCase.transitiveImportResources, transitiveImport.resources)
1376 android.AssertPathsRelativeToTopEquals(t, "transitive_import overlays", testCase.transitiveImportOverlays, transitiveImport.overlays)
1377 android.AssertPathsRelativeToTopEquals(t, "transitive_import imports", testCase.transitiveImportImports, transitiveImport.imports)
1378 }
1379 })
1380 }
1381}
1382
1383func TestAndroidResourceOverlays(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -08001384 testCases := []struct {
1385 name string
1386 enforceRROTargets []string
1387 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -08001388 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -08001389 overlayFiles map[string][]string
1390 rroDirs map[string][]string
1391 }{
1392 {
1393 name: "no RRO",
1394 enforceRROTargets: nil,
1395 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -08001396 resourceFiles: map[string][]string{
1397 "foo": nil,
1398 "bar": {"bar/res/res/values/strings.xml"},
1399 "lib": nil,
1400 "lib2": {"lib2/res/res/values/strings.xml"},
1401 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001402 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001403 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001404 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1405 "out/soong/.intermediates/lib/android_common/package-res.apk",
1406 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001407 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001408 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1409 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +00001410 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001411 },
Colin Crossbec85302019-02-13 13:15:46 -08001412 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -08001413 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1414 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1415 },
Colin Crossbec85302019-02-13 13:15:46 -08001416 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001417 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001418 "lib/res/res/values/strings.xml",
1419 "device/vendor/blah/overlay/lib/res/values/strings.xml",
1420 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001421 },
1422 rroDirs: map[string][]string{
1423 "foo": nil,
1424 "bar": nil,
1425 },
1426 },
1427 {
1428 name: "enforce RRO on foo",
1429 enforceRROTargets: []string{"foo"},
1430 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -08001431 resourceFiles: map[string][]string{
1432 "foo": nil,
1433 "bar": {"bar/res/res/values/strings.xml"},
1434 "lib": nil,
1435 "lib2": {"lib2/res/res/values/strings.xml"},
1436 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001437 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001438 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001439 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1440 "out/soong/.intermediates/lib/android_common/package-res.apk",
1441 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001442 "foo/res/res/values/strings.xml",
1443 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1444 },
Colin Crossbec85302019-02-13 13:15:46 -08001445 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -08001446 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1447 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1448 },
Colin Crossbec85302019-02-13 13:15:46 -08001449 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001450 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001451 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -08001452 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001453 },
Colin Crossc1c37552019-01-31 11:42:41 -08001454
Colin Cross5c4791c2019-02-01 11:44:44 -08001455 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001456 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +00001457 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +00001458 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001459 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001460 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001461 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001462 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001463 },
1464 },
1465 {
1466 name: "enforce RRO on all",
1467 enforceRROTargets: []string{"*"},
1468 enforceRROExcludedOverlays: []string{
1469 // Excluding specific apps/res directories also allowed.
1470 "device/vendor/blah/static_overlay/foo",
1471 "device/vendor/blah/static_overlay/bar/res",
1472 },
Colin Crossbec85302019-02-13 13:15:46 -08001473 resourceFiles: map[string][]string{
1474 "foo": nil,
1475 "bar": {"bar/res/res/values/strings.xml"},
1476 "lib": nil,
1477 "lib2": {"lib2/res/res/values/strings.xml"},
1478 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001479 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001480 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001481 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1482 "out/soong/.intermediates/lib/android_common/package-res.apk",
1483 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001484 "foo/res/res/values/strings.xml",
1485 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1486 },
Colin Crossbec85302019-02-13 13:15:46 -08001487 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
1488 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001489 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001490 "lib/res/res/values/strings.xml",
1491 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001492 },
1493 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001494 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +00001495 "device:device/vendor/blah/overlay/foo/res",
1496 "product:product/vendor/blah/overlay/foo/res",
1497 // Lib dep comes after the direct deps
1498 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001499 },
Anton Hansson53c88442019-03-18 15:53:16 +00001500 "bar": {"device:device/vendor/blah/overlay/bar/res"},
1501 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001502 },
1503 },
1504 }
1505
Anton Hansson53c88442019-03-18 15:53:16 +00001506 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -08001507 "device/vendor/blah/overlay",
1508 "device/vendor/blah/overlay2",
1509 "device/vendor/blah/static_overlay",
1510 }
1511
Anton Hansson53c88442019-03-18 15:53:16 +00001512 productResourceOverlays := []string{
1513 "product/vendor/blah/overlay",
1514 }
1515
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001516 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -08001517 "foo/res/res/values/strings.xml": nil,
1518 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001519 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -08001520 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001521 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
1522 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001523 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001524 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
1525 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
1526 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +00001527 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001528 }
1529
1530 bp := `
1531 android_app {
1532 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001533 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001534 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +00001535 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -08001536 }
1537
1538 android_app {
1539 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001540 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001541 resource_dirs: ["bar/res"],
1542 }
Colin Cross6ed7dea2019-01-31 14:44:30 -08001543
1544 android_library {
1545 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001546 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001547 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -08001548 static_libs: ["lib2"],
1549 }
1550
1551 android_library {
1552 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001553 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -08001554 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -08001555 }
Anton Hansson53c88442019-03-18 15:53:16 +00001556
1557 // This library has the same resources as lib (should not lead to dupe RROs)
1558 android_library {
1559 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001560 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +00001561 resource_dirs: ["lib/res"]
1562 }
Colin Cross890ff552017-11-30 20:13:19 -08001563 `
1564
Colin Cross5c4791c2019-02-01 11:44:44 -08001565 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -08001566 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001567 result := android.GroupFixturePreparers(
1568 PrepareForTestWithJavaDefaultModules,
1569 PrepareForTestWithOverlayBuildComponents,
1570 fs.AddToFixture(),
1571 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1572 variables.DeviceResourceOverlays = deviceResourceOverlays
1573 variables.ProductResourceOverlays = productResourceOverlays
1574 if testCase.enforceRROTargets != nil {
1575 variables.EnforceRROTargets = testCase.enforceRROTargets
1576 }
1577 if testCase.enforceRROExcludedOverlays != nil {
1578 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
1579 }
1580 }),
1581 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -08001582
Colin Crossbec85302019-02-13 13:15:46 -08001583 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
1584 for _, o := range list {
1585 res := module.MaybeOutput(o)
1586 if res.Rule != nil {
1587 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
1588 // verify the inputs to the .arsc.flat rule.
1589 files = append(files, res.Inputs.Strings()...)
1590 } else {
1591 // Otherwise, verify the full path to the output of the other module
1592 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +00001593 }
Colin Cross890ff552017-11-30 20:13:19 -08001594 }
Colin Crossbec85302019-02-13 13:15:46 -08001595 return files
Colin Cross890ff552017-11-30 20:13:19 -08001596 }
1597
Colin Crossbec85302019-02-13 13:15:46 -08001598 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001599 module := result.ModuleForTests(moduleName, "android_common")
Colin Crossbec85302019-02-13 13:15:46 -08001600 resourceList := module.MaybeOutput("aapt2/res.list")
1601 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001602 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +00001603 }
Colin Crossbec85302019-02-13 13:15:46 -08001604 overlayList := module.MaybeOutput("aapt2/overlay.list")
1605 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001606 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -08001607 }
1608
Colin Crossab8d1382023-07-14 17:23:41 +00001609 for _, d := range module.Module().(AndroidLibraryDependency).RRODirsDepSet().ToList() {
Anton Hansson53c88442019-03-18 15:53:16 +00001610 var prefix string
1611 if d.overlayType == device {
1612 prefix = "device:"
1613 } else if d.overlayType == product {
1614 prefix = "product:"
1615 } else {
1616 t.Fatalf("Unexpected overlayType %d", d.overlayType)
1617 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001618 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +00001619 }
Colin Crossbec85302019-02-13 13:15:46 -08001620
1621 return resourceFiles, overlayFiles, rroDirs
1622 }
1623
1624 modules := []string{"foo", "bar", "lib", "lib2"}
1625 for _, module := range modules {
1626 resourceFiles, overlayFiles, rroDirs := getResources(module)
1627
1628 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
1629 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
1630 module, testCase.resourceFiles[module], resourceFiles)
1631 }
1632 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
1633 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
1634 module, testCase.overlayFiles[module], overlayFiles)
1635 }
1636 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +00001637 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -08001638 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +00001639 }
Colin Cross890ff552017-11-30 20:13:19 -08001640 }
Colin Cross890ff552017-11-30 20:13:19 -08001641 })
1642 }
1643}
Colin Crossd09b0b62018-04-18 11:06:47 -07001644
Paul Duffincdb88a92021-03-14 00:36:50 +00001645func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
1646 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +09001647 link := foo.Output("package-res.apk")
1648 linkFlags := strings.Split(link.Args["flags"], " ")
1649 min := android.IndexList("--min-sdk-version", linkFlags)
1650 target := android.IndexList("--target-sdk-version", linkFlags)
1651
1652 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
1653 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
1654 }
1655
1656 gotMinSdkVersion := linkFlags[min+1]
1657 gotTargetSdkVersion := linkFlags[target+1]
1658
Paul Duffincdb88a92021-03-14 00:36:50 +00001659 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001660
Paul Duffincdb88a92021-03-14 00:36:50 +00001661 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001662}
1663
Colin Crossd09b0b62018-04-18 11:06:47 -07001664func TestAppSdkVersion(t *testing.T) {
1665 testCases := []struct {
1666 name string
1667 sdkVersion string
1668 platformSdkInt int
1669 platformSdkCodename string
1670 platformSdkFinal bool
Spandan Dasffb31af2023-03-01 19:46:18 +00001671 minSdkVersionBp string
Colin Crossd09b0b62018-04-18 11:06:47 -07001672 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001673 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001674 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001675 }{
1676 {
1677 name: "current final SDK",
1678 sdkVersion: "current",
1679 platformSdkInt: 27,
1680 platformSdkCodename: "REL",
1681 platformSdkFinal: true,
1682 expectedMinSdkVersion: "27",
1683 },
1684 {
1685 name: "current non-final SDK",
1686 sdkVersion: "current",
1687 platformSdkInt: 27,
1688 platformSdkCodename: "OMR1",
1689 platformSdkFinal: false,
1690 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001691 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001692 },
1693 {
1694 name: "default final SDK",
1695 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001696 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001697 platformSdkInt: 27,
1698 platformSdkCodename: "REL",
1699 platformSdkFinal: true,
1700 expectedMinSdkVersion: "27",
1701 },
1702 {
1703 name: "default non-final SDK",
1704 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001705 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001706 platformSdkInt: 27,
1707 platformSdkCodename: "OMR1",
1708 platformSdkFinal: false,
1709 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001710 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001711 },
1712 {
1713 name: "14",
1714 sdkVersion: "14",
1715 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001716 platformSdkCodename: "S",
1717 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001718 },
Spandan Dasffb31af2023-03-01 19:46:18 +00001719 {
1720 name: "two active SDKs",
1721 sdkVersion: "module_current",
1722 minSdkVersionBp: "UpsideDownCake",
1723 expectedMinSdkVersion: "UpsideDownCake", // And not VanillaIceCream
1724 platformSdkCodename: "VanillaIceCream",
1725 activeCodenames: []string{"UpsideDownCake", "VanillaIceCream"},
1726 },
Colin Crossd09b0b62018-04-18 11:06:47 -07001727 }
1728
1729 for _, moduleType := range []string{"android_app", "android_library"} {
1730 for _, test := range testCases {
1731 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001732 platformApiProp := ""
1733 if test.platformApis {
1734 platformApiProp = "platform_apis: true,"
1735 }
Spandan Dasffb31af2023-03-01 19:46:18 +00001736 minSdkVersionProp := ""
1737 if test.minSdkVersionBp != "" {
1738 minSdkVersionProp = fmt.Sprintf(` min_sdk_version: "%s",`, test.minSdkVersionBp)
1739 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001740 bp := fmt.Sprintf(`%s {
1741 name: "foo",
1742 srcs: ["a.java"],
1743 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001744 %s
Spandan Dasffb31af2023-03-01 19:46:18 +00001745 %s
1746 }`, moduleType, test.sdkVersion, platformApiProp, minSdkVersionProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001747
Paul Duffin71ae5942021-03-22 15:36:52 +00001748 result := android.GroupFixturePreparers(
1749 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001750 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1751 variables.Platform_sdk_version = &test.platformSdkInt
1752 variables.Platform_sdk_codename = &test.platformSdkCodename
1753 variables.Platform_version_active_codenames = test.activeCodenames
1754 variables.Platform_sdk_final = &test.platformSdkFinal
1755 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001756 FixtureWithPrebuiltApis(map[string][]string{
1757 "14": {"foo"},
1758 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001759 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001760
Paul Duffincdb88a92021-03-14 00:36:50 +00001761 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001762 })
1763 }
1764 }
1765}
Colin Crossa4f08812018-10-02 22:03:40 -07001766
Jeongik Cha219141c2020-08-06 23:00:37 +09001767func TestVendorAppSdkVersion(t *testing.T) {
1768 testCases := []struct {
1769 name string
1770 sdkVersion string
1771 platformSdkInt int
1772 platformSdkCodename string
1773 platformSdkFinal bool
1774 deviceCurrentApiLevelForVendorModules string
1775 expectedMinSdkVersion string
1776 }{
1777 {
1778 name: "current final SDK",
1779 sdkVersion: "current",
1780 platformSdkInt: 29,
1781 platformSdkCodename: "REL",
1782 platformSdkFinal: true,
1783 deviceCurrentApiLevelForVendorModules: "29",
1784 expectedMinSdkVersion: "29",
1785 },
1786 {
1787 name: "current final SDK",
1788 sdkVersion: "current",
1789 platformSdkInt: 29,
1790 platformSdkCodename: "REL",
1791 platformSdkFinal: true,
1792 deviceCurrentApiLevelForVendorModules: "28",
1793 expectedMinSdkVersion: "28",
1794 },
1795 {
1796 name: "current final SDK",
1797 sdkVersion: "current",
1798 platformSdkInt: 29,
1799 platformSdkCodename: "Q",
1800 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001801 deviceCurrentApiLevelForVendorModules: "28",
1802 expectedMinSdkVersion: "28",
1803 },
1804 }
1805
1806 for _, moduleType := range []string{"android_app", "android_library"} {
1807 for _, sdkKind := range []string{"", "system_"} {
1808 for _, test := range testCases {
1809 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1810 bp := fmt.Sprintf(`%s {
1811 name: "foo",
1812 srcs: ["a.java"],
1813 sdk_version: "%s%s",
1814 vendor: true,
1815 }`, moduleType, sdkKind, test.sdkVersion)
1816
Paul Duffin71ae5942021-03-22 15:36:52 +00001817 result := android.GroupFixturePreparers(
1818 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001819 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1820 variables.Platform_sdk_version = &test.platformSdkInt
1821 variables.Platform_sdk_codename = &test.platformSdkCodename
1822 variables.Platform_sdk_final = &test.platformSdkFinal
1823 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1824 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1825 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001826 FixtureWithPrebuiltApis(map[string][]string{
1827 "28": {"foo"},
1828 "29": {"foo"},
1829 "current": {"foo"},
1830 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001831 ).RunTestWithBp(t, bp)
1832
1833 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001834 })
1835 }
1836 }
1837 }
1838}
1839
Paul Duffin50c217c2019-06-12 13:25:22 +01001840func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001841 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001842 cc_library {
1843 name: "libjni",
1844 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001845 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001846 stl: "none",
1847 }
1848
1849 android_test {
1850 name: "test",
1851 sdk_version: "core_platform",
1852 jni_libs: ["libjni"],
1853 }
1854
1855 android_test {
1856 name: "test_first",
1857 sdk_version: "core_platform",
1858 compile_multilib: "first",
1859 jni_libs: ["libjni"],
1860 }
1861
1862 android_test {
1863 name: "test_both",
1864 sdk_version: "core_platform",
1865 compile_multilib: "both",
1866 jni_libs: ["libjni"],
1867 }
1868
1869 android_test {
1870 name: "test_32",
1871 sdk_version: "core_platform",
1872 compile_multilib: "32",
1873 jni_libs: ["libjni"],
1874 }
1875
1876 android_test {
1877 name: "test_64",
1878 sdk_version: "core_platform",
1879 compile_multilib: "64",
1880 jni_libs: ["libjni"],
1881 }
1882 `)
1883
1884 testCases := []struct {
1885 name string
1886 abis []string
1887 }{
1888 {"test", []string{"arm64-v8a"}},
1889 {"test_first", []string{"arm64-v8a"}},
1890 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1891 {"test_32", []string{"armeabi-v7a"}},
1892 {"test_64", []string{"arm64-v8a"}},
1893 }
1894
1895 for _, test := range testCases {
1896 t.Run(test.name, func(t *testing.T) {
1897 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07001898 jniLibZip := app.Output("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01001899 var abis []string
1900 args := strings.Fields(jniLibZip.Args["jarArgs"])
1901 for i := 0; i < len(args); i++ {
1902 if args[i] == "-P" {
1903 abis = append(abis, filepath.Base(args[i+1]))
1904 i++
1905 }
1906 }
1907 if !reflect.DeepEqual(abis, test.abis) {
1908 t.Errorf("want abis %v, got %v", test.abis, abis)
1909 }
1910 })
1911 }
1912}
1913
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001914func TestAppSdkVersionByPartition(t *testing.T) {
1915 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1916 android_app {
1917 name: "foo",
1918 srcs: ["a.java"],
1919 vendor: true,
1920 platform_apis: true,
1921 }
1922 `)
1923
1924 testJava(t, `
1925 android_app {
1926 name: "bar",
1927 srcs: ["b.java"],
1928 platform_apis: true,
1929 }
1930 `)
1931
1932 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001933 bp := `
1934 android_app {
1935 name: "foo",
1936 srcs: ["a.java"],
1937 product_specific: true,
1938 platform_apis: true,
1939 }
1940 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001941
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001942 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001943 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001944 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 +09001945 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001946
1947 android.GroupFixturePreparers(
1948 PrepareForTestWithJavaDefaultModules,
1949 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1950 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
1951 }),
1952 ).
1953 ExtendWithErrorHandler(errorHandler).
1954 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001955 }
1956}
1957
Paul Duffin50c217c2019-06-12 13:25:22 +01001958func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001959 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001960 cc_library {
1961 name: "libjni",
1962 system_shared_libs: [],
1963 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08001964 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001965 }
1966
1967 android_app {
1968 name: "app",
1969 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001970 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001971 }
1972
1973 android_app {
1974 name: "app_noembed",
1975 jni_libs: ["libjni"],
1976 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001977 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001978 }
1979
1980 android_app {
1981 name: "app_embed",
1982 jni_libs: ["libjni"],
1983 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001984 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001985 }
1986
1987 android_test {
1988 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00001989 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001990 jni_libs: ["libjni"],
1991 }
1992
1993 android_test {
1994 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001995 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001996 jni_libs: ["libjni"],
1997 use_embedded_native_libs: false,
1998 }
1999
2000 android_test_helper_app {
2001 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00002002 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002003 jni_libs: ["libjni"],
2004 }
2005
2006 android_test_helper_app {
2007 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00002008 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002009 jni_libs: ["libjni"],
2010 use_embedded_native_libs: false,
2011 }
2012 `)
2013
2014 testCases := []struct {
2015 name string
2016 packaged bool
2017 compressed bool
2018 }{
2019 {"app", false, false},
2020 {"app_noembed", false, false},
2021 {"app_embed", true, false},
2022 {"test", true, false},
2023 {"test_noembed", true, true},
2024 {"test_helper", true, false},
2025 {"test_helper_noembed", true, true},
2026 }
2027
2028 for _, test := range testCases {
2029 t.Run(test.name, func(t *testing.T) {
2030 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07002031 jniLibZip := app.MaybeOutput("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01002032 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
2033 t.Errorf("expected jni packaged %v, got %v", w, g)
2034 }
2035
2036 if jniLibZip.Rule != nil {
2037 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
2038 t.Errorf("expected jni compressed %v, got %v", w, g)
2039 }
Colin Crossc511bc52020-04-07 16:50:32 +00002040
2041 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
2042 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
2043 }
Paul Duffin50c217c2019-06-12 13:25:22 +01002044 }
2045 })
2046 }
Colin Cross47fa9d32019-03-26 10:51:39 -07002047}
2048
Colin Cross3c007702020-05-08 11:20:24 -07002049func TestJNISDK(t *testing.T) {
2050 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
2051 cc_library {
2052 name: "libjni",
2053 system_shared_libs: [],
2054 stl: "none",
2055 sdk_version: "current",
2056 }
2057
2058 android_test {
2059 name: "app_platform",
2060 jni_libs: ["libjni"],
2061 platform_apis: true,
2062 }
2063
2064 android_test {
2065 name: "app_sdk",
2066 jni_libs: ["libjni"],
2067 sdk_version: "current",
2068 }
2069
2070 android_test {
2071 name: "app_force_platform",
2072 jni_libs: ["libjni"],
2073 sdk_version: "current",
2074 jni_uses_platform_apis: true,
2075 }
2076
2077 android_test {
2078 name: "app_force_sdk",
2079 jni_libs: ["libjni"],
2080 platform_apis: true,
2081 jni_uses_sdk_apis: true,
2082 }
Colin Crossc2d24052020-05-13 11:05:02 -07002083
2084 cc_library {
2085 name: "libvendorjni",
2086 system_shared_libs: [],
2087 stl: "none",
2088 vendor: true,
2089 }
2090
2091 android_test {
2092 name: "app_vendor",
2093 jni_libs: ["libvendorjni"],
2094 sdk_version: "current",
2095 vendor: true,
2096 }
Colin Cross3c007702020-05-08 11:20:24 -07002097 `)
2098
2099 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07002100 name string
2101 sdkJNI bool
2102 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07002103 }{
Colin Crossc2d24052020-05-13 11:05:02 -07002104 {name: "app_platform"},
2105 {name: "app_sdk", sdkJNI: true},
2106 {name: "app_force_platform"},
2107 {name: "app_force_sdk", sdkJNI: true},
2108 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07002109 }
2110
Colin Crossc2d24052020-05-13 11:05:02 -07002111 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
2112 Output("libjni.so").Output.String()
2113 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
2114 Output("libjni.so").Output.String()
2115 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
2116 Output("libvendorjni.so").Output.String()
2117
Colin Cross3c007702020-05-08 11:20:24 -07002118 for _, test := range testCases {
2119 t.Run(test.name, func(t *testing.T) {
2120 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07002121
Colin Crossb3168ba2023-07-26 16:14:56 -07002122 jniLibZip := app.MaybeOutput("jnilibs.zip")
Colin Cross3c007702020-05-08 11:20:24 -07002123 if len(jniLibZip.Implicits) != 1 {
2124 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
2125 }
2126 gotJNI := jniLibZip.Implicits[0].String()
2127
2128 if test.sdkJNI {
2129 if gotJNI != sdkJNI {
2130 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
2131 }
Colin Crossc2d24052020-05-13 11:05:02 -07002132 } else if test.vendorJNI {
2133 if gotJNI != vendorJNI {
2134 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
2135 }
Colin Cross3c007702020-05-08 11:20:24 -07002136 } else {
2137 if gotJNI != platformJNI {
2138 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
2139 }
2140 }
2141 })
2142 }
2143
2144 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
2145 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
2146 android_test {
2147 name: "app_platform",
2148 platform_apis: true,
2149 jni_uses_platform_apis: true,
2150 }
2151 `)
2152 })
2153
2154 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
2155 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
2156 android_test {
2157 name: "app_sdk",
2158 sdk_version: "current",
2159 jni_uses_sdk_apis: true,
2160 }
2161 `)
2162 })
2163
2164}
2165
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002166func TestCertificates(t *testing.T) {
2167 testCases := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002168 name string
2169 bp string
Colin Cross5caad2b2022-12-12 15:11:46 -08002170 allowMissingDependencies bool
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002171 certificateOverride string
2172 expectedCertSigningFlags string
2173 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002174 }{
2175 {
2176 name: "default",
2177 bp: `
2178 android_app {
2179 name: "foo",
2180 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002181 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002182 }
2183 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002184 certificateOverride: "",
2185 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002186 expectedCertificate: "build/make/target/product/security/testkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002187 },
2188 {
2189 name: "module certificate property",
2190 bp: `
2191 android_app {
2192 name: "foo",
2193 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002194 certificate: ":new_certificate",
2195 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002196 }
2197
2198 android_app_certificate {
2199 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002200 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002201 }
2202 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002203 certificateOverride: "",
2204 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002205 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002206 },
2207 {
2208 name: "path certificate property",
2209 bp: `
2210 android_app {
2211 name: "foo",
2212 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002213 certificate: "expiredkey",
2214 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002215 }
2216 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002217 certificateOverride: "",
2218 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002219 expectedCertificate: "build/make/target/product/security/expiredkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002220 },
2221 {
2222 name: "certificate overrides",
2223 bp: `
2224 android_app {
2225 name: "foo",
2226 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002227 certificate: "expiredkey",
2228 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002229 }
2230
2231 android_app_certificate {
2232 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002233 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002234 }
2235 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002236 certificateOverride: "foo:new_certificate",
2237 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002238 expectedCertificate: "cert/new_cert",
Liz Kammere2b27f42020-05-07 13:24:05 -07002239 },
2240 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002241 name: "certificate signing flags",
Liz Kammere2b27f42020-05-07 13:24:05 -07002242 bp: `
2243 android_app {
2244 name: "foo",
2245 srcs: ["a.java"],
2246 certificate: ":new_certificate",
2247 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002248 rotationMinSdkVersion: "32",
Liz Kammere2b27f42020-05-07 13:24:05 -07002249 sdk_version: "current",
2250 }
2251
2252 android_app_certificate {
2253 name: "new_certificate",
2254 certificate: "cert/new_cert",
2255 }
2256 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002257 certificateOverride: "",
2258 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002259 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002260 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002261 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002262 name: "cert signing flags from filegroup",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002263 bp: `
2264 android_app {
2265 name: "foo",
2266 srcs: ["a.java"],
2267 certificate: ":new_certificate",
2268 lineage: ":lineage_bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002269 rotationMinSdkVersion: "32",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002270 sdk_version: "current",
2271 }
2272
2273 android_app_certificate {
2274 name: "new_certificate",
2275 certificate: "cert/new_cert",
2276 }
2277
2278 filegroup {
2279 name: "lineage_bin",
2280 srcs: ["lineage.bin"],
2281 }
2282 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002283 certificateOverride: "",
2284 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002285 expectedCertificate: "cert/new_cert",
2286 },
2287 {
2288 name: "missing with AllowMissingDependencies",
2289 bp: `
2290 android_app {
2291 name: "foo",
2292 srcs: ["a.java"],
2293 certificate: ":new_certificate",
2294 sdk_version: "current",
2295 }
2296 `,
2297 expectedCertificate: "out/soong/.intermediates/foo/android_common/missing",
2298 allowMissingDependencies: true,
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002299 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002300 }
2301
2302 for _, test := range testCases {
2303 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002304 result := android.GroupFixturePreparers(
2305 PrepareForTestWithJavaDefaultModules,
2306 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2307 if test.certificateOverride != "" {
2308 variables.CertificateOverrides = []string{test.certificateOverride}
2309 }
Colin Cross5caad2b2022-12-12 15:11:46 -08002310 if test.allowMissingDependencies {
2311 variables.Allow_missing_dependencies = proptools.BoolPtr(true)
2312 }
2313 }),
2314 android.FixtureModifyContext(func(ctx *android.TestContext) {
2315 ctx.SetAllowMissingDependencies(test.allowMissingDependencies)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002316 }),
2317 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002318
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002319 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002320
Colin Cross5caad2b2022-12-12 15:11:46 -08002321 certificate := foo.Module().(*AndroidApp).certificate
2322 android.AssertPathRelativeToTopEquals(t, "certificates key", test.expectedCertificate+".pk8", certificate.Key)
2323 // The sign_target_files_apks and check_target_files_signatures
2324 // tools require that certificates have a .x509.pem extension.
2325 android.AssertPathRelativeToTopEquals(t, "certificates pem", test.expectedCertificate+".x509.pem", certificate.Pem)
Liz Kammere2b27f42020-05-07 13:24:05 -07002326
Colin Cross5caad2b2022-12-12 15:11:46 -08002327 signapk := foo.Output("foo.apk")
2328 if signapk.Rule != android.ErrorRule {
2329 signCertificateFlags := signapk.Args["certificates"]
2330 expectedFlags := certificate.Pem.String() + " " + certificate.Key.String()
2331 android.AssertStringEquals(t, "certificates flags", expectedFlags, signCertificateFlags)
2332
2333 certSigningFlags := signapk.Args["flags"]
2334 android.AssertStringEquals(t, "cert signing flags", test.expectedCertSigningFlags, certSigningFlags)
2335 }
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002336 })
2337 }
2338}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002339
Songchun Fan688de9a2020-03-24 20:32:24 -07002340func TestRequestV4SigningFlag(t *testing.T) {
2341 testCases := []struct {
2342 name string
2343 bp string
2344 expected string
2345 }{
2346 {
2347 name: "default",
2348 bp: `
2349 android_app {
2350 name: "foo",
2351 srcs: ["a.java"],
2352 sdk_version: "current",
2353 }
2354 `,
2355 expected: "",
2356 },
2357 {
2358 name: "default",
2359 bp: `
2360 android_app {
2361 name: "foo",
2362 srcs: ["a.java"],
2363 sdk_version: "current",
2364 v4_signature: false,
2365 }
2366 `,
2367 expected: "",
2368 },
2369 {
2370 name: "module certificate property",
2371 bp: `
2372 android_app {
2373 name: "foo",
2374 srcs: ["a.java"],
2375 sdk_version: "current",
2376 v4_signature: true,
2377 }
2378 `,
2379 expected: "--enable-v4",
2380 },
2381 }
2382
2383 for _, test := range testCases {
2384 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002385 result := android.GroupFixturePreparers(
2386 PrepareForTestWithJavaDefaultModules,
2387 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07002388
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002389 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07002390
2391 signapk := foo.Output("foo.apk")
2392 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002393 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07002394 })
2395 }
2396}
2397
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002398func TestPackageNameOverride(t *testing.T) {
2399 testCases := []struct {
2400 name string
2401 bp string
2402 packageNameOverride string
2403 expected []string
2404 }{
2405 {
2406 name: "default",
2407 bp: `
2408 android_app {
2409 name: "foo",
2410 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002411 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002412 }
2413 `,
2414 packageNameOverride: "",
2415 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002416 "out/soong/.intermediates/foo/android_common/foo.apk",
2417 "out/soong/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002418 },
2419 },
2420 {
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002421 name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002422 bp: `
2423 android_app {
2424 name: "foo",
2425 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002426 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002427 }
2428 `,
2429 packageNameOverride: "foo:bar",
2430 expected: []string{
2431 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002432 "out/soong/.intermediates/foo/android_common/bar.apk",
2433 "out/soong/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002434 },
2435 },
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002436 {
2437 name: "overridden via stem",
2438 bp: `
2439 android_app {
2440 name: "foo",
2441 srcs: ["a.java"],
2442 sdk_version: "current",
2443 stem: "bar",
2444 }
2445 `,
2446 packageNameOverride: "",
2447 expected: []string{
2448 "out/soong/.intermediates/foo/android_common/bar.apk",
2449 "out/soong/target/product/test_device/system/app/bar/bar.apk",
2450 },
2451 },
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002452 }
2453
2454 for _, test := range testCases {
2455 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002456 result := android.GroupFixturePreparers(
2457 PrepareForTestWithJavaDefaultModules,
2458 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2459 if test.packageNameOverride != "" {
2460 variables.PackageNameOverrides = []string{test.packageNameOverride}
2461 }
2462 }),
2463 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002464
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002465 foo := result.ModuleForTests("foo", "android_common")
2466
Lukacs T. Berkifbaf7252021-08-19 09:36:42 +02002467 outSoongDir := result.Config.SoongOutDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002468
2469 outputs := foo.AllOutputs()
2470 outputMap := make(map[string]bool)
2471 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002472 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002473 }
2474 for _, e := range test.expected {
2475 if _, exist := outputMap[e]; !exist {
2476 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
2477 }
2478 }
2479 })
2480 }
2481}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002482
2483func TestInstrumentationTargetOverridden(t *testing.T) {
2484 bp := `
2485 android_app {
2486 name: "foo",
2487 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002488 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002489 }
2490
2491 android_test {
2492 name: "bar",
2493 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002494 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002495 }
2496 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002497
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002498 result := android.GroupFixturePreparers(
2499 PrepareForTestWithJavaDefaultModules,
2500 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2501 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
2502 }),
2503 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002504
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002505 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002506 res := bar.Output("package-res.apk")
2507 aapt2Flags := res.Args["flags"]
2508 e := "--rename-instrumentation-target-package org.dandroid.bp"
2509 if !strings.Contains(aapt2Flags, e) {
2510 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
2511 }
2512}
Jaewoong Jung525443a2019-02-28 15:35:54 -08002513
2514func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002515 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2516 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08002517 android_app {
2518 name: "foo",
2519 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07002520 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002521 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002522 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002523 }
2524
2525 override_android_app {
2526 name: "bar",
2527 base: "foo",
2528 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07002529 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002530 rotationMinSdkVersion: "32",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002531 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002532 }
2533
2534 android_app_certificate {
2535 name: "new_certificate",
2536 certificate: "cert/new_cert",
2537 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002538
2539 override_android_app {
2540 name: "baz",
2541 base: "foo",
2542 package_name: "org.dandroid.bp",
2543 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002544
2545 override_android_app {
2546 name: "baz_no_rename_resources",
2547 base: "foo",
2548 package_name: "org.dandroid.bp",
2549 rename_resources_package: false,
2550 }
2551
2552 android_app {
2553 name: "foo_no_rename_resources",
2554 srcs: ["a.java"],
2555 certificate: "expiredkey",
2556 overrides: ["qux"],
2557 rename_resources_package: false,
2558 sdk_version: "current",
2559 }
2560
2561 override_android_app {
2562 name: "baz_base_no_rename_resources",
2563 base: "foo_no_rename_resources",
2564 package_name: "org.dandroid.bp",
2565 }
2566
2567 override_android_app {
2568 name: "baz_override_base_rename_resources",
2569 base: "foo_no_rename_resources",
2570 package_name: "org.dandroid.bp",
2571 rename_resources_package: true,
2572 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08002573 `)
2574
2575 expectedVariants := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002576 name string
2577 moduleName string
2578 variantName string
2579 apkName string
2580 apkPath string
2581 certFlag string
2582 certSigningFlags string
2583 overrides []string
2584 packageFlag string
2585 renameResources bool
2586 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08002587 }{
2588 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002589 name: "foo",
2590 moduleName: "foo",
2591 variantName: "android_common",
2592 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2593 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2594 certSigningFlags: "",
2595 overrides: []string{"qux"},
2596 packageFlag: "",
2597 renameResources: false,
2598 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002599 },
2600 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002601 name: "foo",
2602 moduleName: "bar",
2603 variantName: "android_common_bar",
2604 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2605 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
2606 certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
2607 overrides: []string{"qux", "foo"},
2608 packageFlag: "",
2609 renameResources: false,
2610 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002611 },
2612 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002613 name: "foo",
2614 moduleName: "baz",
2615 variantName: "android_common_baz",
2616 apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk",
2617 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2618 certSigningFlags: "",
2619 overrides: []string{"qux", "foo"},
2620 packageFlag: "org.dandroid.bp",
2621 renameResources: true,
2622 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002623 },
2624 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002625 name: "foo",
2626 moduleName: "baz_no_rename_resources",
2627 variantName: "android_common_baz_no_rename_resources",
2628 apkPath: "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
2629 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2630 certSigningFlags: "",
2631 overrides: []string{"qux", "foo"},
2632 packageFlag: "org.dandroid.bp",
2633 renameResources: false,
2634 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002635 },
2636 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002637 name: "foo_no_rename_resources",
2638 moduleName: "baz_base_no_rename_resources",
2639 variantName: "android_common_baz_base_no_rename_resources",
2640 apkPath: "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
2641 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2642 certSigningFlags: "",
2643 overrides: []string{"qux", "foo_no_rename_resources"},
2644 packageFlag: "org.dandroid.bp",
2645 renameResources: false,
2646 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002647 },
2648 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002649 name: "foo_no_rename_resources",
2650 moduleName: "baz_override_base_rename_resources",
2651 variantName: "android_common_baz_override_base_rename_resources",
2652 apkPath: "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
2653 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2654 certSigningFlags: "",
2655 overrides: []string{"qux", "foo_no_rename_resources"},
2656 packageFlag: "org.dandroid.bp",
2657 renameResources: true,
2658 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002659 },
2660 }
2661 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002662 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002663
2664 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002665 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002666
2667 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08002668 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07002669 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002670 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07002671
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002672 // Check the cert signing flags
2673 certSigningFlags := signapk.Args["flags"]
2674 android.AssertStringEquals(t, "cert signing flags", expected.certSigningFlags, certSigningFlags)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002675
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002676 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08002677 mod := variant.Module().(*AndroidApp)
zhidoua2ce78f2022-02-17 02:33:12 +00002678 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002679
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002680 // Test Overridable property: Logging_parent
2681 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002682 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002683
Liz Kammer1d5983b2020-05-19 19:15:37 +00002684 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002685 res := variant.Output("package-res.apk")
2686 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00002687 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
2688 expectedPackage := expected.packageFlag
2689 if !expected.renameResources {
2690 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00002691 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002692 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002693 }
2694}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07002695
zhidoua2ce78f2022-02-17 02:33:12 +00002696func TestOverrideAndroidAppOverrides(t *testing.T) {
2697 ctx, _ := testJava(
2698 t, `
2699 android_app {
2700 name: "foo",
2701 srcs: ["a.java"],
2702 sdk_version: "current",
2703 overrides: ["qux"]
2704 }
2705
2706 android_app {
2707 name: "bar",
2708 srcs: ["b.java"],
2709 sdk_version: "current",
2710 overrides: ["foo"]
2711 }
2712
2713 override_android_app {
2714 name: "foo_override",
2715 base: "foo",
2716 overrides: ["bar"]
2717 }
2718 `)
2719
2720 expectedVariants := []struct {
2721 name string
2722 moduleName string
2723 variantName string
2724 overrides []string
2725 }{
2726 {
2727 name: "foo",
2728 moduleName: "foo",
2729 variantName: "android_common",
2730 overrides: []string{"qux"},
2731 },
2732 {
2733 name: "bar",
2734 moduleName: "bar",
2735 variantName: "android_common",
2736 overrides: []string{"foo"},
2737 },
2738 {
2739 name: "foo",
2740 moduleName: "foo_override",
2741 variantName: "android_common_foo_override",
2742 overrides: []string{"bar", "foo"},
2743 },
2744 }
2745 for _, expected := range expectedVariants {
2746 variant := ctx.ModuleForTests(expected.name, expected.variantName)
2747
2748 // Check if the overrides field values are correctly aggregated.
2749 mod := variant.Module().(*AndroidApp)
2750 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2751 }
2752}
2753
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002754func TestOverrideAndroidAppWithPrebuilt(t *testing.T) {
2755 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2756 t, `
2757 android_app {
2758 name: "foo",
2759 srcs: ["a.java"],
2760 sdk_version: "current",
2761 }
2762
2763 override_android_app {
2764 name: "bar",
2765 base: "foo",
2766 }
2767
2768 android_app_import {
2769 name: "bar",
2770 prefer: true,
2771 apk: "bar.apk",
2772 presigned: true,
2773 }
2774 `)
2775
2776 // An app that has an override that also has a prebuilt should not be hidden.
2777 foo := result.ModuleForTests("foo", "android_common")
2778 if foo.Module().IsHideFromMake() {
2779 t.Errorf("expected foo to have HideFromMake false")
2780 }
2781
2782 // An override that also has a prebuilt should be hidden.
2783 barOverride := result.ModuleForTests("foo", "android_common_bar")
2784 if !barOverride.Module().IsHideFromMake() {
2785 t.Errorf("expected bar override variant of foo to have HideFromMake true")
2786 }
2787}
2788
Jooyung Han01d80d82022-01-08 12:16:32 +09002789func TestOverrideAndroidAppStem(t *testing.T) {
2790 ctx, _ := testJava(t, `
2791 android_app {
2792 name: "foo",
2793 srcs: ["a.java"],
2794 sdk_version: "current",
2795 }
2796 override_android_app {
2797 name: "bar",
2798 base: "foo",
2799 }
2800 override_android_app {
2801 name: "baz",
2802 base: "foo",
2803 stem: "baz_stem",
2804 }
2805 android_app {
2806 name: "foo2",
2807 srcs: ["a.java"],
2808 sdk_version: "current",
2809 stem: "foo2_stem",
2810 }
2811 override_android_app {
2812 name: "bar2",
2813 base: "foo2",
2814 }
2815 override_android_app {
2816 name: "baz2",
2817 base: "foo2",
2818 stem: "baz2_stem",
2819 }
2820 `)
2821 for _, expected := range []struct {
2822 moduleName string
2823 variantName string
2824 apkPath string
2825 }{
2826 {
2827 moduleName: "foo",
2828 variantName: "android_common",
2829 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2830 },
2831 {
2832 moduleName: "foo",
2833 variantName: "android_common_bar",
2834 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2835 },
2836 {
2837 moduleName: "foo",
2838 variantName: "android_common_baz",
2839 apkPath: "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk",
2840 },
2841 {
2842 moduleName: "foo2",
2843 variantName: "android_common",
2844 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2845 },
2846 {
2847 moduleName: "foo2",
2848 variantName: "android_common_bar2",
2849 // Note that this may cause the duplicate output error.
2850 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2851 },
2852 {
2853 moduleName: "foo2",
2854 variantName: "android_common_baz2",
2855 apkPath: "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
2856 },
2857 } {
2858 variant := ctx.ModuleForTests(expected.moduleName, expected.variantName)
2859 variant.Output(expected.apkPath)
2860 }
2861}
2862
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002863func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002864 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002865 android_app {
2866 name: "foo",
2867 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002868 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002869 }
2870
2871 override_android_app {
2872 name: "bar",
2873 base: "foo",
2874 package_name: "org.dandroid.bp",
2875 }
2876
2877 android_test {
2878 name: "baz",
2879 srcs: ["b.java"],
2880 instrumentation_for: "foo",
2881 }
2882
2883 android_test {
2884 name: "qux",
2885 srcs: ["b.java"],
2886 instrumentation_for: "bar",
2887 }
2888 `)
2889
2890 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002891 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002892 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002893 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2894 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2895 }
2896
2897 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002898 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002899 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002900 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2901 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2902 }
2903}
2904
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002905func TestOverrideAndroidTest(t *testing.T) {
2906 ctx, _ := testJava(t, `
2907 android_app {
2908 name: "foo",
2909 srcs: ["a.java"],
2910 package_name: "com.android.foo",
2911 sdk_version: "current",
2912 }
2913
2914 override_android_app {
2915 name: "bar",
2916 base: "foo",
2917 package_name: "com.android.bar",
2918 }
2919
2920 android_test {
2921 name: "foo_test",
2922 srcs: ["b.java"],
2923 instrumentation_for: "foo",
2924 }
2925
2926 override_android_test {
2927 name: "bar_test",
2928 base: "foo_test",
2929 package_name: "com.android.bar.test",
2930 instrumentation_for: "bar",
2931 instrumentation_target_package: "com.android.bar",
2932 }
2933 `)
2934
2935 expectedVariants := []struct {
2936 moduleName string
2937 variantName string
2938 apkPath string
2939 overrides []string
2940 targetVariant string
2941 packageFlag string
2942 targetPackageFlag string
2943 }{
2944 {
2945 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002946 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002947 overrides: nil,
2948 targetVariant: "android_common",
2949 packageFlag: "",
2950 targetPackageFlag: "",
2951 },
2952 {
2953 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002954 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002955 overrides: []string{"foo_test"},
2956 targetVariant: "android_common_bar",
2957 packageFlag: "com.android.bar.test",
2958 targetPackageFlag: "com.android.bar",
2959 },
2960 }
2961 for _, expected := range expectedVariants {
2962 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2963
2964 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002965 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002966
2967 // Check if the overrides field values are correctly aggregated.
2968 mod := variant.Module().(*AndroidTest)
zhidoua2ce78f2022-02-17 02:33:12 +00002969 if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002970 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
zhidoua2ce78f2022-02-17 02:33:12 +00002971 expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002972 }
2973
2974 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01002975 javac := variant.Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002976 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002977 if !strings.Contains(javac.Args["classpath"], turbine) {
2978 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2979 }
2980
2981 // Check aapt2 flags.
2982 res := variant.Output("package-res.apk")
2983 aapt2Flags := res.Args["flags"]
2984 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002985 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002986 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2987 }
2988}
2989
Jaewoong Jung39982342020-01-14 10:27:18 -08002990func TestAndroidTest_FixTestConfig(t *testing.T) {
2991 ctx, _ := testJava(t, `
2992 android_app {
2993 name: "foo",
2994 srcs: ["a.java"],
2995 package_name: "com.android.foo",
2996 sdk_version: "current",
2997 }
2998
2999 android_test {
3000 name: "foo_test",
3001 srcs: ["b.java"],
3002 instrumentation_for: "foo",
3003 }
3004
3005 android_test {
3006 name: "bar_test",
3007 srcs: ["b.java"],
3008 package_name: "com.android.bar.test",
3009 instrumentation_for: "foo",
Seth Moorec6f4b532023-02-02 13:22:26 -08003010 mainline_package_name: "com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08003011 }
3012
3013 override_android_test {
3014 name: "baz_test",
3015 base: "foo_test",
3016 package_name: "com.android.baz.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08003017 mainline_package_name: "com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08003018 }
3019 `)
3020
3021 testCases := []struct {
3022 moduleName string
3023 variantName string
3024 expectedFlags []string
3025 }{
3026 {
3027 moduleName: "foo_test",
3028 variantName: "android_common",
3029 },
3030 {
3031 moduleName: "bar_test",
3032 variantName: "android_common",
3033 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003034 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003035 "--package-name com.android.bar.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08003036 "--mainline-package-name com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08003037 },
3038 },
3039 {
3040 moduleName: "foo_test",
3041 variantName: "android_common_baz_test",
3042 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003043 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003044 "--package-name com.android.baz.test",
3045 "--test-file-name baz_test.apk",
Seth Moorec6f4b532023-02-02 13:22:26 -08003046 "out/soong/.intermediates/foo_test/android_common_baz_test/test_config_fixer/AndroidTest.xml",
3047 "--mainline-package-name com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08003048 },
3049 },
3050 }
3051
3052 for _, test := range testCases {
3053 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01003054 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08003055
3056 if len(test.expectedFlags) > 0 {
3057 if params.Rule == nil {
3058 t.Errorf("test_config_fixer was expected to run, but didn't")
3059 } else {
3060 for _, flag := range test.expectedFlags {
3061 if !strings.Contains(params.RuleParams.Command, flag) {
3062 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
3063 }
3064 }
3065 }
3066 } else {
3067 if params.Rule != nil {
3068 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
3069 }
3070 }
Jaewoong Jung39982342020-01-14 10:27:18 -08003071 }
3072}
3073
Paul Duffin53a70a42022-01-11 14:35:55 +00003074func TestInstrumentationTargetPrebuilt(t *testing.T) {
3075 bp := `
3076 android_app_import {
3077 name: "foo",
3078 apk: "foo.apk",
3079 presigned: true,
3080 }
3081
3082 android_test {
3083 name: "bar",
3084 srcs: ["a.java"],
3085 instrumentation_for: "foo",
3086 sdk_version: "current",
3087 }
3088 `
3089
3090 android.GroupFixturePreparers(
3091 PrepareForTestWithJavaDefaultModules,
3092 ).ExtendWithErrorHandler(
3093 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
3094 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
3095 RunTestWithBp(t, bp)
3096}
3097
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003098func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07003099 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003100 cc_library {
3101 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08003102 sdk_version: "current",
3103 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003104 }
3105
3106 android_test {
3107 name: "stl",
3108 jni_libs: ["libjni"],
3109 compile_multilib: "both",
3110 sdk_version: "current",
3111 stl: "c++_shared",
3112 }
3113
3114 android_test {
3115 name: "system",
3116 jni_libs: ["libjni"],
3117 compile_multilib: "both",
3118 sdk_version: "current",
3119 }
3120 `)
3121
3122 testCases := []struct {
3123 name string
3124 jnis []string
3125 }{
3126 {"stl",
3127 []string{
3128 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07003129 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003130 },
3131 },
3132 {"system",
3133 []string{
3134 "libjni.so",
3135 },
3136 },
3137 }
3138
3139 for _, test := range testCases {
3140 t.Run(test.name, func(t *testing.T) {
3141 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07003142 jniLibZip := app.Output("jnilibs.zip")
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003143 var jnis []string
3144 args := strings.Fields(jniLibZip.Args["jarArgs"])
3145 for i := 0; i < len(args); i++ {
3146 if args[i] == "-f" {
3147 jnis = append(jnis, args[i+1])
3148 i += 1
3149 }
3150 }
3151 jnisJoined := strings.Join(jnis, " ")
3152 for _, jni := range test.jnis {
3153 if !strings.Contains(jnisJoined, jni) {
3154 t.Errorf("missing jni %q in %q", jni, jnis)
3155 }
3156 }
3157 })
3158 }
3159}
Colin Cross50ddcc42019-05-16 12:28:22 -07003160
3161func TestUsesLibraries(t *testing.T) {
3162 bp := `
3163 java_sdk_library {
3164 name: "foo",
3165 srcs: ["a.java"],
3166 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003167 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003168 }
3169
3170 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01003171 name: "qux",
3172 srcs: ["a.java"],
3173 api_packages: ["qux"],
3174 sdk_version: "current",
3175 }
3176
3177 java_sdk_library {
3178 name: "quuz",
3179 srcs: ["a.java"],
3180 api_packages: ["quuz"],
3181 sdk_version: "current",
3182 }
3183
3184 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003185 name: "fred",
3186 srcs: ["a.java"],
3187 api_packages: ["fred"],
3188 sdk_version: "current",
3189 }
3190
3191 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07003192 name: "bar",
3193 srcs: ["a.java"],
3194 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003195 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003196 }
3197
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01003198 java_sdk_library {
3199 name: "runtime-library",
3200 srcs: ["a.java"],
3201 sdk_version: "current",
3202 }
3203
3204 java_library {
3205 name: "static-runtime-helper",
3206 srcs: ["a.java"],
3207 libs: ["runtime-library"],
3208 sdk_version: "current",
3209 }
3210
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003211 java_library {
3212 name: "runtime-required-x",
3213 srcs: ["a.java"],
3214 installable: true,
3215 sdk_version: "current",
3216 }
3217
3218 java_library {
3219 name: "runtime-optional-x",
3220 srcs: ["a.java"],
3221 installable: true,
3222 sdk_version: "current",
3223 }
3224
3225 android_library {
3226 name: "static-x",
3227 uses_libs: ["runtime-required-x"],
3228 optional_uses_libs: ["runtime-optional-x"],
3229 sdk_version: "current",
3230 }
3231
3232 java_library {
3233 name: "runtime-required-y",
3234 srcs: ["a.java"],
3235 installable: true,
3236 sdk_version: "current",
3237 }
3238
3239 java_library {
3240 name: "runtime-optional-y",
3241 srcs: ["a.java"],
3242 installable: true,
3243 sdk_version: "current",
3244 }
3245
3246 java_library {
3247 name: "static-y",
3248 srcs: ["a.java"],
3249 uses_libs: ["runtime-required-y"],
3250 optional_uses_libs: ["runtime-optional-y"],
3251 sdk_version: "current",
3252 }
3253
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003254 // A library that has to use "provides_uses_lib", because:
3255 // - it is not an SDK library
3256 // - its library name is different from its module name
3257 java_library {
3258 name: "non-sdk-lib",
3259 provides_uses_lib: "com.non.sdk.lib",
3260 installable: true,
3261 srcs: ["a.java"],
3262 }
3263
Colin Cross50ddcc42019-05-16 12:28:22 -07003264 android_app {
3265 name: "app",
3266 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003267 libs: [
3268 "qux",
3269 "quuz.stubs"
3270 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003271 static_libs: [
3272 "static-runtime-helper",
3273 // statically linked component libraries should not pull their SDK libraries,
3274 // so "fred" should not be added to class loader context
3275 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003276 "static-x",
3277 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003278 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003279 uses_libs: [
3280 "foo",
3281 "non-sdk-lib"
3282 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003283 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003284 optional_uses_libs: [
3285 "bar",
3286 "baz",
3287 ],
3288 }
3289
3290 android_app_import {
3291 name: "prebuilt",
3292 apk: "prebuilts/apk/app.apk",
3293 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003294 uses_libs: [
3295 "foo",
3296 "non-sdk-lib",
3297 "android.test.runner"
3298 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07003299 optional_uses_libs: [
3300 "bar",
3301 "baz",
3302 ],
3303 }
3304 `
3305
Paul Duffin71ae5942021-03-22 15:36:52 +00003306 result := android.GroupFixturePreparers(
3307 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003308 PrepareForTestWithJavaSdkLibraryFiles,
3309 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Jiakai Zhang48203e32023-06-02 23:42:21 +01003310 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3311 variables.BuildWarningBadOptionalUsesLibsAllowlist = []string{"app", "prebuilt"}
3312 }),
Paul Duffind234b412021-03-12 23:04:46 +00003313 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07003314
Paul Duffind234b412021-03-12 23:04:46 +00003315 app := result.ModuleForTests("app", "android_common")
3316 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07003317
Paul Duffin859fe962020-05-15 10:20:31 +01003318 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003319 // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be
3320 // propagated from dependencies.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003321 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3322 expectManifestFixerArgs := `--extract-native-libs=true ` +
3323 `--uses-library qux ` +
3324 `--uses-library quuz ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003325 `--uses-library foo ` +
3326 `--uses-library com.non.sdk.lib ` +
3327 `--uses-library runtime-library ` +
3328 `--uses-library runtime-required-x ` +
3329 `--uses-library runtime-required-y ` +
3330 `--optional-uses-library bar ` +
3331 `--optional-uses-library runtime-optional-x ` +
3332 `--optional-uses-library runtime-optional-y`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003333 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01003334
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003335 // Test that all libraries are verified (library order matters).
3336 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
3337 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00003338 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003339 `--uses-library qux ` +
3340 `--uses-library quuz ` +
3341 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003342 `--uses-library runtime-required-x ` +
3343 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003344 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003345 `--optional-uses-library baz ` +
3346 `--optional-uses-library runtime-optional-x ` +
3347 `--optional-uses-library runtime-optional-y `
Paul Duffind234b412021-03-12 23:04:46 +00003348 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003349
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003350 // Test that all libraries are verified for an APK (library order matters).
3351 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00003352 verifyApkArgs := `--uses-library foo ` +
3353 `--uses-library com.non.sdk.lib ` +
3354 `--uses-library android.test.runner ` +
3355 `--optional-uses-library bar ` +
3356 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00003357 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003358
Jiakai Zhanga4496782023-05-17 16:57:30 +01003359 // Test that necessary args are passed for constructing CLC in Ninja phase.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003360 cmd := app.Rule("dexpreopt").RuleParams.Command
Jiakai Zhanga4496782023-05-17 16:57:30 +01003361 android.AssertStringDoesContain(t, "dexpreopt app cmd context", cmd, "--context-json=")
3362 android.AssertStringDoesContain(t, "dexpreopt app cmd product_packages", cmd,
Jiakai Zhang51b2a8b2023-06-26 16:47:38 +01003363 "--product-packages=out/soong/.intermediates/app/android_common/dexpreopt/product_packages.txt")
Colin Cross50ddcc42019-05-16 12:28:22 -07003364}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003365
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003366func TestDexpreoptBcp(t *testing.T) {
3367 bp := `
3368 java_sdk_library {
3369 name: "foo",
3370 srcs: ["a.java"],
3371 api_packages: ["foo"],
3372 sdk_version: "current",
3373 }
3374
3375 java_sdk_library {
3376 name: "bar",
3377 srcs: ["a.java"],
3378 api_packages: ["bar"],
3379 permitted_packages: ["bar"],
3380 sdk_version: "current",
3381 }
3382
3383 android_app {
3384 name: "app",
3385 srcs: ["a.java"],
3386 sdk_version: "current",
3387 }
3388 `
3389
3390 testCases := []struct {
3391 name string
3392 with bool
3393 expect string
3394 }{
3395 {
3396 name: "with updatable bcp",
3397 with: true,
3398 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
3399 },
3400 {
3401 name: "without updatable bcp",
3402 with: false,
3403 expect: "/system/framework/foo.jar",
3404 },
3405 }
3406
3407 for _, test := range testCases {
3408 t.Run(test.name, func(t *testing.T) {
3409 result := android.GroupFixturePreparers(
3410 prepareForJavaTest,
3411 PrepareForTestWithJavaSdkLibraryFiles,
3412 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
3413 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01003414 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003415 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
3416 ).RunTestWithBp(t, bp)
3417
3418 app := result.ModuleForTests("app", "android_common")
3419 cmd := app.Rule("dexpreopt").RuleParams.Command
3420 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
3421 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
3422 })
3423 }
3424}
3425
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003426func TestCodelessApp(t *testing.T) {
3427 testCases := []struct {
3428 name string
3429 bp string
3430 noCode bool
3431 }{
3432 {
3433 name: "normal",
3434 bp: `
3435 android_app {
3436 name: "foo",
3437 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003438 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003439 }
3440 `,
3441 noCode: false,
3442 },
3443 {
3444 name: "app without sources",
3445 bp: `
3446 android_app {
3447 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003448 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003449 }
3450 `,
3451 noCode: true,
3452 },
3453 {
3454 name: "app with libraries",
3455 bp: `
3456 android_app {
3457 name: "foo",
3458 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003459 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003460 }
3461
3462 java_library {
3463 name: "lib",
3464 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003465 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003466 }
3467 `,
3468 noCode: false,
3469 },
3470 {
3471 name: "app with sourceless libraries",
3472 bp: `
3473 android_app {
3474 name: "foo",
3475 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003476 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003477 }
3478
3479 java_library {
3480 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003481 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003482 }
3483 `,
3484 // TODO(jungjw): this should probably be true
3485 noCode: false,
3486 },
3487 }
3488
3489 for _, test := range testCases {
3490 t.Run(test.name, func(t *testing.T) {
3491 ctx := testApp(t, test.bp)
3492
3493 foo := ctx.ModuleForTests("foo", "android_common")
3494 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3495 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
3496 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
3497 }
3498 })
3499 }
3500}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07003501
Colin Cross53a87f52019-06-25 13:35:30 -07003502func TestUncompressDex(t *testing.T) {
3503 testCases := []struct {
3504 name string
3505 bp string
3506
3507 uncompressedPlatform bool
3508 uncompressedUnbundled bool
3509 }{
3510 {
3511 name: "normal",
3512 bp: `
3513 android_app {
3514 name: "foo",
3515 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003516 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003517 }
3518 `,
3519 uncompressedPlatform: true,
3520 uncompressedUnbundled: false,
3521 },
3522 {
3523 name: "use_embedded_dex",
3524 bp: `
3525 android_app {
3526 name: "foo",
3527 use_embedded_dex: true,
3528 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003529 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003530 }
3531 `,
3532 uncompressedPlatform: true,
3533 uncompressedUnbundled: true,
3534 },
3535 {
3536 name: "privileged",
3537 bp: `
3538 android_app {
3539 name: "foo",
3540 privileged: true,
3541 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003542 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003543 }
3544 `,
3545 uncompressedPlatform: true,
3546 uncompressedUnbundled: true,
3547 },
David Srbeckye033cba2020-05-20 22:20:28 +01003548 {
3549 name: "normal_uncompress_dex_true",
3550 bp: `
3551 android_app {
3552 name: "foo",
3553 srcs: ["a.java"],
3554 sdk_version: "current",
3555 uncompress_dex: true,
3556 }
3557 `,
3558 uncompressedPlatform: true,
3559 uncompressedUnbundled: true,
3560 },
3561 {
3562 name: "normal_uncompress_dex_false",
3563 bp: `
3564 android_app {
3565 name: "foo",
3566 srcs: ["a.java"],
3567 sdk_version: "current",
3568 uncompress_dex: false,
3569 }
3570 `,
3571 uncompressedPlatform: false,
3572 uncompressedUnbundled: false,
3573 },
Colin Cross53a87f52019-06-25 13:35:30 -07003574 }
3575
3576 test := func(t *testing.T, bp string, want bool, unbundled bool) {
3577 t.Helper()
3578
Paul Duffin71ae5942021-03-22 15:36:52 +00003579 result := android.GroupFixturePreparers(
3580 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003581 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00003582 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3583 if unbundled {
3584 variables.Unbundled_build = proptools.BoolPtr(true)
3585 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
3586 }
3587 }),
3588 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07003589
Paul Duffincdb88a92021-03-14 00:36:50 +00003590 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07003591 dex := foo.Rule("r8")
3592 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
3593 aligned := foo.MaybeRule("zipalign").Rule != nil
3594
Paul Duffincdb88a92021-03-14 00:36:50 +00003595 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07003596
Paul Duffincdb88a92021-03-14 00:36:50 +00003597 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07003598 }
3599
3600 for _, tt := range testCases {
3601 t.Run(tt.name, func(t *testing.T) {
3602 t.Run("platform", func(t *testing.T) {
3603 test(t, tt.bp, tt.uncompressedPlatform, false)
3604 })
3605 t.Run("unbundled", func(t *testing.T) {
3606 test(t, tt.bp, tt.uncompressedUnbundled, true)
3607 })
3608 })
3609 }
3610}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003611
3612func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
3613 if expectedValue != "" {
3614 expectedFlag := "--" + flagName + " " + expectedValue
3615 if !strings.Contains(aapt2Flags, expectedFlag) {
3616 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
3617 }
3618 } else {
3619 unexpectedFlag := "--" + flagName
3620 if strings.Contains(aapt2Flags, unexpectedFlag) {
3621 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
3622 }
3623 }
3624}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08003625
Cole Faust9a631312020-10-22 21:05:24 +00003626func TestExportedProguardFlagFiles(t *testing.T) {
3627 ctx, _ := testJava(t, `
3628 android_app {
3629 name: "foo",
3630 sdk_version: "current",
3631 static_libs: ["lib1"],
3632 }
3633
3634 android_library {
3635 name: "lib1",
3636 sdk_version: "current",
3637 optimize: {
3638 proguard_flags_files: ["lib1proguard.cfg"],
3639 }
3640 }
3641 `)
3642
3643 m := ctx.ModuleForTests("foo", "android_common")
3644 hasLib1Proguard := false
3645 for _, s := range m.Rule("java.r8").Implicits.Strings() {
3646 if s == "lib1proguard.cfg" {
3647 hasLib1Proguard = true
3648 break
3649 }
3650 }
3651
3652 if !hasLib1Proguard {
3653 t.Errorf("App does not use library proguard config")
3654 }
3655}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003656
3657func TestTargetSdkVersionManifestFixer(t *testing.T) {
3658 platform_sdk_codename := "Tiramisu"
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003659 platform_sdk_version := 33
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003660 testCases := []struct {
3661 name string
3662 targetSdkVersionInBp string
3663 targetSdkVersionExpected string
3664 unbundledBuild bool
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003665 platformSdkFinal bool
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003666 }{
3667 {
3668 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
3669 targetSdkVersionInBp: "30",
3670 targetSdkVersionExpected: "30",
3671 unbundledBuild: false,
3672 },
3673 {
3674 name: "Unbundled build: Android.bp has targetSdkVersion",
3675 targetSdkVersionInBp: "30",
3676 targetSdkVersionExpected: "30",
3677 unbundledBuild: true,
3678 },
3679 {
3680 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3681 targetSdkVersionInBp: platform_sdk_codename,
3682 targetSdkVersionExpected: platform_sdk_codename,
3683 unbundledBuild: false,
3684 },
3685 {
3686 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3687 targetSdkVersionInBp: platform_sdk_codename,
3688 targetSdkVersionExpected: "10000",
3689 unbundledBuild: true,
3690 },
3691
3692 {
3693 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
3694 targetSdkVersionExpected: platform_sdk_codename,
3695 unbundledBuild: false,
3696 },
3697 {
3698 name: "Unbundled build: Android.bp has no targetSdkVersion",
3699 targetSdkVersionExpected: "10000",
3700 unbundledBuild: true,
3701 },
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003702 {
3703 name: "Bundled build in REL branches",
3704 targetSdkVersionExpected: "33",
3705 unbundledBuild: false,
3706 platformSdkFinal: true,
3707 },
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003708 }
3709 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003710 targetSdkVersionTemplate := ""
3711 if testCase.targetSdkVersionInBp != "" {
3712 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, testCase.targetSdkVersionInBp)
3713 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003714 bp := fmt.Sprintf(`
3715 android_app {
3716 name: "foo",
3717 sdk_version: "current",
Spandan Dasca70fc42023-03-01 23:38:49 +00003718 %s
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003719 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003720 `, targetSdkVersionTemplate)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003721 fixture := android.GroupFixturePreparers(
3722 prepareForJavaTest,
3723 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003724 if testCase.platformSdkFinal {
3725 variables.Platform_sdk_final = proptools.BoolPtr(true)
3726 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003727 // explicitly set platform_sdk_codename to make the test deterministic
3728 variables.Platform_sdk_codename = &platform_sdk_codename
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003729 variables.Platform_sdk_version = &platform_sdk_version
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003730 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3731 // create a non-empty list if unbundledBuild==true
3732 if testCase.unbundledBuild {
3733 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3734 }
3735 }),
3736 )
3737
3738 result := fixture.RunTestWithBp(t, bp)
3739 foo := result.ModuleForTests("foo", "android_common")
3740
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003741 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3742 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003743 }
3744}
Colin Cross412436f2022-04-07 17:40:07 -07003745
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003746func TestDefaultAppTargetSdkVersionForUpdatableModules(t *testing.T) {
3747 platform_sdk_codename := "Tiramisu"
3748 platform_sdk_version := 33
3749 testCases := []struct {
3750 name string
3751 platform_sdk_final bool
3752 targetSdkVersionInBp *string
3753 targetSdkVersionExpected *string
3754 updatable bool
3755 }{
3756 {
3757 name: "Non-Updatable Module: Android.bp has older targetSdkVersion",
3758 targetSdkVersionInBp: proptools.StringPtr("29"),
3759 targetSdkVersionExpected: proptools.StringPtr("29"),
3760 updatable: false,
3761 },
3762 {
3763 name: "Updatable Module: Android.bp has older targetSdkVersion",
3764 targetSdkVersionInBp: proptools.StringPtr("30"),
3765 targetSdkVersionExpected: proptools.StringPtr("30"),
3766 updatable: true,
3767 },
3768 {
3769 name: "Updatable Module: Android.bp has no targetSdkVersion",
3770 targetSdkVersionExpected: proptools.StringPtr("10000"),
3771 updatable: true,
3772 },
3773 {
3774 name: "[SDK finalised] Non-Updatable Module: Android.bp has older targetSdkVersion",
3775 platform_sdk_final: true,
3776 targetSdkVersionInBp: proptools.StringPtr("30"),
3777 targetSdkVersionExpected: proptools.StringPtr("30"),
3778 updatable: false,
3779 },
3780 {
3781 name: "[SDK finalised] Updatable Module: Android.bp has older targetSdkVersion",
3782 platform_sdk_final: true,
3783 targetSdkVersionInBp: proptools.StringPtr("30"),
3784 targetSdkVersionExpected: proptools.StringPtr("30"),
3785 updatable: true,
3786 },
3787 {
3788 name: "[SDK finalised] Updatable Module: Android.bp has targetSdkVersion as platform sdk codename",
3789 platform_sdk_final: true,
3790 targetSdkVersionInBp: proptools.StringPtr(platform_sdk_codename),
3791 targetSdkVersionExpected: proptools.StringPtr("33"),
3792 updatable: true,
3793 },
3794 {
3795 name: "[SDK finalised] Updatable Module: Android.bp has no targetSdkVersion",
3796 platform_sdk_final: true,
3797 targetSdkVersionExpected: proptools.StringPtr("33"),
3798 updatable: true,
3799 },
3800 }
3801 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003802 targetSdkVersionTemplate := ""
3803 if testCase.targetSdkVersionInBp != nil {
3804 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, *testCase.targetSdkVersionInBp)
3805 }
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003806 bp := fmt.Sprintf(`
3807 android_app {
3808 name: "foo",
3809 sdk_version: "current",
3810 min_sdk_version: "29",
Spandan Dasca70fc42023-03-01 23:38:49 +00003811 %s
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003812 updatable: %t,
3813 enforce_default_target_sdk_version: %t
3814 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003815 `, targetSdkVersionTemplate, testCase.updatable, testCase.updatable) // enforce default target sdk version if app is updatable
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003816
3817 fixture := android.GroupFixturePreparers(
3818 PrepareForTestWithJavaDefaultModules,
3819 android.PrepareForTestWithAllowMissingDependencies,
3820 android.PrepareForTestWithAndroidMk,
3821 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3822 // explicitly set following platform variables to make the test deterministic
3823 variables.Platform_sdk_final = &testCase.platform_sdk_final
3824 variables.Platform_sdk_version = &platform_sdk_version
3825 variables.Platform_sdk_codename = &platform_sdk_codename
3826 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
Harshit Mahajan18845d02023-01-11 18:39:12 +00003827 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003828 variables.Unbundled_build_apps = []string{"sampleModule"}
3829 }),
3830 )
3831
3832 result := fixture.RunTestWithBp(t, bp)
3833 foo := result.ModuleForTests("foo", "android_common")
3834
3835 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3836 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+*testCase.targetSdkVersionExpected)
3837 }
3838}
3839
3840func TestEnforceDefaultAppTargetSdkVersionFlag(t *testing.T) {
3841 platform_sdk_codename := "Tiramisu"
3842 platform_sdk_version := 33
3843 testCases := []struct {
3844 name string
3845 enforceDefaultTargetSdkVersion bool
3846 expectedError string
3847 platform_sdk_final bool
3848 targetSdkVersionInBp string
3849 targetSdkVersionExpected string
3850 updatable bool
3851 }{
3852 {
3853 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
3854 enforceDefaultTargetSdkVersion: false,
3855 targetSdkVersionInBp: "29",
3856 targetSdkVersionExpected: "29",
3857 updatable: false,
3858 },
3859 {
3860 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3861 enforceDefaultTargetSdkVersion: true,
3862 platform_sdk_final: true,
3863 targetSdkVersionInBp: "current",
3864 targetSdkVersionExpected: "33",
3865 updatable: true,
3866 },
3867 {
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003868 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003869 enforceDefaultTargetSdkVersion: true,
3870 platform_sdk_final: false,
3871 targetSdkVersionInBp: "current",
3872 targetSdkVersionExpected: "10000",
3873 updatable: false,
3874 },
3875 {
3876 name: "Not enforcing Target SDK Version for Updatable app",
3877 enforceDefaultTargetSdkVersion: false,
3878 expectedError: "Updatable apps must enforce default target sdk version",
3879 targetSdkVersionInBp: "29",
3880 targetSdkVersionExpected: "29",
3881 updatable: true,
3882 },
3883 }
3884 for _, testCase := range testCases {
3885 errExpected := testCase.expectedError != ""
3886 bp := fmt.Sprintf(`
3887 android_app {
3888 name: "foo",
3889 enforce_default_target_sdk_version: %t,
3890 sdk_version: "current",
3891 min_sdk_version: "29",
3892 target_sdk_version: "%v",
3893 updatable: %t
3894 }
3895 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp, testCase.updatable)
3896
3897 fixture := android.GroupFixturePreparers(
3898 PrepareForTestWithJavaDefaultModules,
3899 android.PrepareForTestWithAllowMissingDependencies,
3900 android.PrepareForTestWithAndroidMk,
3901 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3902 // explicitly set following platform variables to make the test deterministic
3903 variables.Platform_sdk_final = &testCase.platform_sdk_final
3904 variables.Platform_sdk_version = &platform_sdk_version
3905 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00003906 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003907 variables.Unbundled_build_apps = []string{"sampleModule"}
3908 }),
3909 )
3910
3911 errorHandler := android.FixtureExpectsNoErrors
3912 if errExpected {
3913 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
3914 }
3915 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
3916
3917 if !errExpected {
3918 foo := result.ModuleForTests("foo", "android_common")
3919 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3920 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3921 }
3922 }
3923}
3924
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003925func TestEnforceDefaultAppTargetSdkVersionFlagForTests(t *testing.T) {
3926 platform_sdk_codename := "Tiramisu"
3927 platform_sdk_version := 33
3928 testCases := []struct {
3929 name string
3930 enforceDefaultTargetSdkVersion bool
3931 expectedError string
3932 platform_sdk_final bool
3933 targetSdkVersionInBp string
3934 targetSdkVersionExpected string
3935 }{
3936 {
3937 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
3938 enforceDefaultTargetSdkVersion: false,
3939 targetSdkVersionInBp: "29",
3940 targetSdkVersionExpected: "29",
3941 },
3942 {
3943 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3944 enforceDefaultTargetSdkVersion: true,
3945 platform_sdk_final: true,
3946 targetSdkVersionInBp: "current",
3947 targetSdkVersionExpected: "33",
3948 },
3949 {
3950 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3951 enforceDefaultTargetSdkVersion: true,
3952 platform_sdk_final: false,
3953 targetSdkVersionInBp: "current",
3954 targetSdkVersionExpected: "10000",
3955 },
3956 }
3957 for _, testCase := range testCases {
3958 errExpected := testCase.expectedError != ""
3959 bp := fmt.Sprintf(`
3960 android_test {
3961 name: "foo",
3962 enforce_default_target_sdk_version: %t,
3963 min_sdk_version: "29",
3964 target_sdk_version: "%v",
3965 }
3966 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp)
3967
3968 fixture := android.GroupFixturePreparers(
3969 PrepareForTestWithJavaDefaultModules,
3970 android.PrepareForTestWithAllowMissingDependencies,
3971 android.PrepareForTestWithAndroidMk,
3972 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3973 // explicitly set following platform variables to make the test deterministic
3974 variables.Platform_sdk_final = &testCase.platform_sdk_final
3975 variables.Platform_sdk_version = &platform_sdk_version
3976 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00003977 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003978 variables.Unbundled_build_apps = []string{"sampleModule"}
3979 }),
3980 )
3981
3982 errorHandler := android.FixtureExpectsNoErrors
3983 if errExpected {
3984 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
3985 }
3986 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
3987
3988 if !errExpected {
3989 foo := result.ModuleForTests("foo", "android_common")
3990 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3991 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3992 }
3993 }
3994}
3995
Colin Cross412436f2022-04-07 17:40:07 -07003996func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
3997 result := android.GroupFixturePreparers(
3998 PrepareForTestWithJavaDefaultModules,
3999 android.PrepareForTestWithAllowMissingDependencies,
4000 android.PrepareForTestWithAndroidMk,
4001 ).RunTestWithBp(t, `
4002 android_app {
4003 name: "foo",
4004 srcs: ["a.java"],
4005 certificate: ":missing_certificate",
4006 sdk_version: "current",
Zyan Wub7550aa2023-05-18 15:46:31 +08004007 }
4008
4009 android_app {
4010 name: "bar",
4011 srcs: ["a.java"],
4012 certificate: ":missing_certificate",
4013 product_specific: true,
4014 sdk_version: "current",
Colin Cross412436f2022-04-07 17:40:07 -07004015 }`)
4016
4017 foo := result.ModuleForTests("foo", "android_common")
4018 fooApk := foo.Output("foo.apk")
4019 if fooApk.Rule != android.ErrorRule {
4020 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
4021 }
4022 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
4023}
Sam Delmerico82602492022-06-10 17:05:42 +00004024
4025func TestAppIncludesJniPackages(t *testing.T) {
4026 ctx := android.GroupFixturePreparers(
4027 PrepareForTestWithJavaDefaultModules,
4028 ).RunTestWithBp(t, `
4029 android_library_import {
4030 name: "aary-nodeps",
4031 aars: ["aary.aar"],
4032 extract_jni: true,
4033 }
4034
4035 android_library {
4036 name: "aary-lib",
4037 sdk_version: "current",
4038 min_sdk_version: "21",
4039 static_libs: ["aary-nodeps"],
4040 }
4041
4042 android_app {
4043 name: "aary-lib-dep",
4044 sdk_version: "current",
4045 min_sdk_version: "21",
4046 manifest: "AndroidManifest.xml",
4047 static_libs: ["aary-lib"],
4048 use_embedded_native_libs: true,
4049 }
4050
4051 android_app {
4052 name: "aary-import-dep",
4053 sdk_version: "current",
4054 min_sdk_version: "21",
4055 manifest: "AndroidManifest.xml",
4056 static_libs: ["aary-nodeps"],
4057 use_embedded_native_libs: true,
4058 }
4059
4060 android_app {
4061 name: "aary-no-use-embedded",
4062 sdk_version: "current",
4063 min_sdk_version: "21",
4064 manifest: "AndroidManifest.xml",
4065 static_libs: ["aary-nodeps"],
4066 }`)
4067
4068 testCases := []struct {
4069 name string
4070 hasPackage bool
4071 }{
4072 {
4073 name: "aary-import-dep",
4074 hasPackage: true,
4075 },
4076 {
4077 name: "aary-lib-dep",
4078 hasPackage: true,
4079 },
4080 {
4081 name: "aary-no-use-embedded",
4082 hasPackage: false,
4083 },
4084 }
4085
4086 for _, tc := range testCases {
4087 t.Run(tc.name, func(t *testing.T) {
4088 app := ctx.ModuleForTests(tc.name, "android_common")
4089
4090 outputFile := "jnilibs.zip"
4091 jniOutputLibZip := app.MaybeOutput(outputFile)
4092 if jniOutputLibZip.Rule == nil && !tc.hasPackage {
4093 return
4094 }
4095
4096 jniPackage := "arm64-v8a_jni.zip"
4097 inputs := jniOutputLibZip.Inputs
4098 foundPackage := false
4099 for i := 0; i < len(inputs); i++ {
4100 if strings.Contains(inputs[i].String(), jniPackage) {
4101 foundPackage = true
4102 }
4103 }
4104 if foundPackage != tc.hasPackage {
4105 t.Errorf("expected to find %v in %v inputs; inputs = %v", jniPackage, outputFile, inputs)
4106 }
4107 })
4108 }
4109}
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004110
4111func TestTargetSdkVersionMtsTests(t *testing.T) {
4112 platformSdkCodename := "Tiramisu"
4113 android_test := "android_test"
4114 android_test_helper_app := "android_test_helper_app"
4115 bpTemplate := `
4116 %v {
4117 name: "mytest",
4118 target_sdk_version: "%v",
4119 test_suites: ["othersuite", "%v"],
4120 }
4121 `
4122 testCases := []struct {
4123 desc string
4124 moduleType string
4125 targetSdkVersionInBp string
4126 targetSdkVersionExpected string
4127 testSuites string
4128 }{
4129 {
4130 desc: "Non-MTS android_test_apps targeting current should not be upgraded to 10000",
4131 moduleType: android_test,
4132 targetSdkVersionInBp: "current",
4133 targetSdkVersionExpected: platformSdkCodename,
4134 testSuites: "non-mts-suite",
4135 },
4136 {
4137 desc: "MTS android_test_apps targeting released sdks should not be upgraded to 10000",
4138 moduleType: android_test,
4139 targetSdkVersionInBp: "29",
4140 targetSdkVersionExpected: "29",
4141 testSuites: "mts-suite",
4142 },
4143 {
4144 desc: "MTS android_test_apps targeting current should be upgraded to 10000",
4145 moduleType: android_test,
4146 targetSdkVersionInBp: "current",
4147 targetSdkVersionExpected: "10000",
4148 testSuites: "mts-suite",
4149 },
4150 {
4151 desc: "MTS android_test_helper_apps targeting current should be upgraded to 10000",
4152 moduleType: android_test_helper_app,
4153 targetSdkVersionInBp: "current",
4154 targetSdkVersionExpected: "10000",
4155 testSuites: "mts-suite",
4156 },
4157 }
4158 fixture := android.GroupFixturePreparers(
4159 prepareForJavaTest,
4160 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4161 variables.Platform_sdk_codename = &platformSdkCodename
4162 variables.Platform_version_active_codenames = []string{platformSdkCodename}
4163 }),
4164 )
4165 for _, testCase := range testCases {
4166 result := fixture.RunTestWithBp(t, fmt.Sprintf(bpTemplate, testCase.moduleType, testCase.targetSdkVersionInBp, testCase.testSuites))
4167 mytest := result.ModuleForTests("mytest", "android_common")
4168 manifestFixerArgs := mytest.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4169 android.AssertStringDoesContain(t, testCase.desc, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4170 }
4171}
Andrei Onea580636b2022-08-17 16:53:46 +00004172
4173func TestPrivappAllowlist(t *testing.T) {
4174 testJavaError(t, "privileged must be set in order to use privapp_allowlist", `
4175 android_app {
4176 name: "foo",
4177 srcs: ["a.java"],
4178 privapp_allowlist: "perms.xml",
4179 }
4180 `)
4181
4182 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
4183 t,
4184 `
4185 android_app {
4186 name: "foo",
4187 srcs: ["a.java"],
Sam Delmerico15809f82023-05-15 17:21:47 -04004188 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
Andrei Onea580636b2022-08-17 16:53:46 +00004189 privileged: true,
Andrei Onea580636b2022-08-17 16:53:46 +00004190 sdk_version: "current",
4191 }
4192 override_android_app {
4193 name: "bar",
4194 base: "foo",
4195 package_name: "com.google.android.foo",
4196 }
4197 `,
4198 )
4199 app := result.ModuleForTests("foo", "android_common")
4200 overrideApp := result.ModuleForTests("foo", "android_common_bar")
4201
Sam Delmerico15809f82023-05-15 17:21:47 -04004202 // verify that privapp allowlist is created for override apps
Andrei Onea580636b2022-08-17 16:53:46 +00004203 overrideApp.Output("out/soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml")
Sam Delmerico15809f82023-05-15 17:21:47 -04004204 expectedAllowlistInput := "privapp_allowlist_com.android.foo.xml"
4205 overrideActualAllowlistInput := overrideApp.Rule("modifyAllowlist").Input.String()
4206 if expectedAllowlistInput != overrideActualAllowlistInput {
4207 t.Errorf("expected override allowlist to be %q; got %q", expectedAllowlistInput, overrideActualAllowlistInput)
Andrei Onea580636b2022-08-17 16:53:46 +00004208 }
4209
4210 // verify that permissions are copied to device
Anton Hansson0e486a42023-06-01 16:38:35 +00004211 app.Output("out/soong/target/product/test_device/system/etc/permissions/foo.xml")
4212 overrideApp.Output("out/soong/target/product/test_device/system/etc/permissions/bar.xml")
Andrei Onea580636b2022-08-17 16:53:46 +00004213}
Sam Delmericob1daccd2023-05-25 14:45:30 -04004214
4215func TestPrivappAllowlistAndroidMk(t *testing.T) {
4216 result := android.GroupFixturePreparers(
4217 PrepareForTestWithJavaDefaultModules,
4218 android.PrepareForTestWithAndroidMk,
4219 ).RunTestWithBp(
4220 t,
4221 `
4222 android_app {
4223 name: "foo",
4224 srcs: ["a.java"],
4225 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
4226 privileged: true,
4227 sdk_version: "current",
4228 }
4229 override_android_app {
4230 name: "bar",
4231 base: "foo",
4232 package_name: "com.google.android.foo",
4233 }
4234 `,
4235 )
4236 baseApp := result.ModuleForTests("foo", "android_common")
4237 overrideApp := result.ModuleForTests("foo", "android_common_bar")
4238
4239 baseAndroidApp := baseApp.Module().(*AndroidApp)
4240 baseEntries := android.AndroidMkEntriesForTest(t, result.TestContext, baseAndroidApp)[0]
4241 android.AssertStringMatches(
4242 t,
4243 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find foo.apk",
4244 baseEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4245 "\\S+foo.apk",
4246 )
4247 android.AssertStringMatches(
4248 t,
4249 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include foo.apk",
4250 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4251 "\\S+foo.apk",
4252 )
4253 android.AssertStringMatches(
4254 t,
4255 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4256 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4257 "\\S+foo.apk:\\S+/target/product/test_device/system/priv-app/foo/foo.apk",
4258 )
4259 android.AssertStringMatches(
4260 t,
4261 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4262 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004263 "privapp_allowlist_com.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/foo.xml",
Sam Delmericob1daccd2023-05-25 14:45:30 -04004264 )
4265
4266 overrideAndroidApp := overrideApp.Module().(*AndroidApp)
4267 overrideEntries := android.AndroidMkEntriesForTest(t, result.TestContext, overrideAndroidApp)[0]
4268 android.AssertStringMatches(
4269 t,
4270 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find bar.apk",
4271 overrideEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4272 "\\S+bar.apk",
4273 )
4274 android.AssertStringMatches(
4275 t,
4276 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include bar.apk",
4277 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4278 "\\S+bar.apk",
4279 )
4280 android.AssertStringMatches(
4281 t,
4282 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4283 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4284 "\\S+bar.apk:\\S+/target/product/test_device/system/priv-app/bar/bar.apk",
4285 )
4286 android.AssertStringMatches(
4287 t,
4288 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4289 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004290 "\\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 -04004291 )
4292}
Sam Delmerico0e0d96e2023-08-18 22:43:28 +00004293
4294func TestApexGlobalMinSdkVersionOverride(t *testing.T) {
4295 result := android.GroupFixturePreparers(
4296 PrepareForTestWithJavaDefaultModules,
4297 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4298 variables.ApexGlobalMinSdkVersionOverride = proptools.StringPtr("Tiramisu")
4299 }),
4300 ).RunTestWithBp(t, `
4301 android_app {
4302 name: "com.android.bar",
4303 srcs: ["a.java"],
4304 sdk_version: "current",
4305 }
4306 android_app {
4307 name: "com.android.foo",
4308 srcs: ["a.java"],
4309 sdk_version: "current",
4310 min_sdk_version: "S",
4311 updatable: true,
4312 }
4313 override_android_app {
4314 name: "com.android.go.foo",
4315 base: "com.android.foo",
4316 }
4317 `)
4318 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
4319 fooOverride := result.ModuleForTests("com.android.foo", "android_common_com.android.go.foo").Rule("manifestFixer")
4320 bar := result.ModuleForTests("com.android.bar", "android_common").Rule("manifestFixer")
4321
4322 android.AssertStringDoesContain(t,
4323 "expected manifest fixer to set com.android.bar minSdkVersion to S",
4324 bar.BuildParams.Args["args"],
4325 "--minSdkVersion S",
4326 )
4327 android.AssertStringDoesContain(t,
4328 "com.android.foo: expected manifest fixer to set minSdkVersion to T",
4329 foo.BuildParams.Args["args"],
4330 "--minSdkVersion T",
4331 )
4332 android.AssertStringDoesContain(t,
4333 "com.android.go.foo: expected manifest fixer to set minSdkVersion to T",
4334 fooOverride.BuildParams.Args["args"],
4335 "--minSdkVersion T",
4336 )
4337
4338}