blob: e9422a69697542ca230c894955d1c8469b3516d5 [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")
Rashed Abdel-Tawab5b948ab2018-08-09 14:08:53 -070080 omniromRes := result.ModuleForTests("omnirom-res", "android_common")
Colin Crossa97c5d32018-03-28 14:58:31 -070081 expectedLinkImplicits = append(expectedLinkImplicits,
82 frameworkRes.Output("package-res.apk").Output.String())
Rashed Abdel-Tawab5b948ab2018-08-09 14:08:53 -070083 expectedLinkImplicits = append(expectedLinkImplicits,
84 omniromRes.Output("package-res.apk").Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080085
Colin Crossa97c5d32018-03-28 14:58:31 -070086 // Test the mapping from input files to compiled output file names
87 compile := foo.Output(compiledResourceFiles[0])
Paul Duffin0ed42d32021-03-13 02:19:32 +000088 android.AssertDeepEquals(t, "aapt2 compile inputs", resourceFiles, compile.Inputs.Strings())
Colin Crossb69301e2017-12-01 10:48:26 -080089
Colin Crossa97c5d32018-03-28 14:58:31 -070090 compiledResourceOutputs := compile.Outputs.Strings()
91 sort.Strings(compiledResourceOutputs)
Colin Crossb69301e2017-12-01 10:48:26 -080092
Colin Crossa97c5d32018-03-28 14:58:31 -070093 expectedLinkImplicits = append(expectedLinkImplicits, compiledResourceOutputs...)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080094
Colin Crossa97c5d32018-03-28 14:58:31 -070095 list := foo.Output("aapt2/res.list")
96 expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080097
Colin Crossa97c5d32018-03-28 14:58:31 -070098 // Check that the link rule uses
Paul Duffin0ed42d32021-03-13 02:19:32 +000099 res := result.ModuleForTests("foo", "android_common").Output("package-res.apk")
100 android.AssertDeepEquals(t, "aapt2 link implicits", expectedLinkImplicits, res.Implicits.Strings())
Colin Crossa97c5d32018-03-28 14:58:31 -0700101 })
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800102 }
103}
Colin Cross890ff552017-11-30 20:13:19 -0800104
Colin Crosse560c4a2019-03-19 16:03:11 -0700105func TestAppSplits(t *testing.T) {
106 ctx := testApp(t, `
107 android_app {
108 name: "foo",
109 srcs: ["a.java"],
110 package_splits: ["v4", "v7,hdpi"],
Jeongik Cha538c0d02019-07-11 15:54:27 +0900111 sdk_version: "current"
Colin Crosse560c4a2019-03-19 16:03:11 -0700112 }`)
113
114 foo := ctx.ModuleForTests("foo", "android_common")
115
116 expectedOutputs := []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000117 "out/soong/.intermediates/foo/android_common/foo.apk",
118 "out/soong/.intermediates/foo/android_common/foo_v4.apk",
119 "out/soong/.intermediates/foo/android_common/foo_v7_hdpi.apk",
Colin Crosse560c4a2019-03-19 16:03:11 -0700120 }
121 for _, expectedOutput := range expectedOutputs {
122 foo.Output(expectedOutput)
123 }
124
Yu Liu51c22312024-08-20 23:56:15 +0000125 outputFiles := foo.OutputFiles(ctx, t, "")
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
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +0000522func TestUpdatableApps_ApplyDefaultUpdatableModuleVersion(t *testing.T) {
523 result := android.GroupFixturePreparers(
524 PrepareForTestWithJavaDefaultModules,
525 ).RunTestWithBp(t, `
526 android_app {
527 name: "com.android.foo",
528 srcs: ["a.java"],
529 sdk_version: "current",
530 min_sdk_version: "31",
531 updatable: true,
532 }
533 `)
534 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
535 android.AssertStringDoesContain(t,
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +0000536 "com.android.foo: expected manifest fixer to set override-placeholder-version to RELEASE_DEFAULT_UPDATABLE_MODULE_VERSION",
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +0000537 foo.BuildParams.Args["args"],
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +0000538 fmt.Sprintf("--override-placeholder-version %s", testDefaultUpdatableModuleVersion),
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +0000539 )
540}
541
542func TestUpdatableApps_ApplyOverrideApexManifestDefaultVersion(t *testing.T) {
543 result := android.GroupFixturePreparers(
544 PrepareForTestWithJavaDefaultModules,
545 android.FixtureMergeEnv(map[string]string{
546 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
547 }),
548 ).RunTestWithBp(t, `
549 android_app {
550 name: "com.android.foo",
551 srcs: ["a.java"],
552 sdk_version: "current",
553 min_sdk_version: "31",
554 updatable: true,
555 }
556 `)
557 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
558 android.AssertStringDoesContain(t,
559 "com.android.foo: expected manifest fixer to set override-placeholder-version to 1234",
560 foo.BuildParams.Args["args"],
561 "--override-placeholder-version 1234",
562 )
563}
564
Colin Cross0ddae7f2019-02-07 15:30:01 -0800565func TestResourceDirs(t *testing.T) {
566 testCases := []struct {
567 name string
568 prop string
569 resources []string
570 }{
571 {
572 name: "no resource_dirs",
573 prop: "",
574 resources: []string{"res/res/values/strings.xml"},
575 },
576 {
577 name: "resource_dirs",
578 prop: `resource_dirs: ["res"]`,
579 resources: []string{"res/res/values/strings.xml"},
580 },
581 {
582 name: "empty resource_dirs",
583 prop: `resource_dirs: []`,
584 resources: nil,
585 },
586 }
587
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000588 fs := android.MockFS{
Colin Cross0ddae7f2019-02-07 15:30:01 -0800589 "res/res/values/strings.xml": nil,
590 }
591
592 bp := `
593 android_app {
594 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900595 sdk_version: "current",
Colin Cross0ddae7f2019-02-07 15:30:01 -0800596 %s
597 }
598 `
599
600 for _, testCase := range testCases {
601 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000602 result := android.GroupFixturePreparers(
603 PrepareForTestWithJavaDefaultModules,
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000604 fs.AddToFixture(),
605 ).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop))
Colin Cross0ddae7f2019-02-07 15:30:01 -0800606
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000607 module := result.ModuleForTests("foo", "android_common")
Colin Cross0ddae7f2019-02-07 15:30:01 -0800608 resourceList := module.MaybeOutput("aapt2/res.list")
609
610 var resources []string
611 if resourceList.Rule != nil {
612 for _, compiledResource := range resourceList.Inputs.Strings() {
613 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
614 }
615 }
616
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000617 android.AssertDeepEquals(t, "resource files", testCase.resources, resources)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800618 })
619 }
620}
621
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800622func TestLibraryAssets(t *testing.T) {
623 bp := `
624 android_app {
625 name: "foo",
626 sdk_version: "current",
627 static_libs: ["lib1", "lib2", "lib3"],
628 }
629
630 android_library {
631 name: "lib1",
632 sdk_version: "current",
633 asset_dirs: ["assets_a"],
634 }
635
636 android_library {
637 name: "lib2",
638 sdk_version: "current",
639 }
640
641 android_library {
642 name: "lib3",
643 sdk_version: "current",
Colin Crossab8d1382023-07-14 17:23:41 +0000644 static_libs: ["lib4", "import"],
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800645 }
646
647 android_library {
648 name: "lib4",
649 sdk_version: "current",
650 asset_dirs: ["assets_b"],
651 }
Colin Crossab8d1382023-07-14 17:23:41 +0000652
Jiakai Zhangba82e282023-10-13 18:08:59 +0100653 android_library {
654 name: "lib5",
655 sdk_version: "current",
656 assets: [
657 "path/to/asset_file_1",
658 "path/to/asset_file_2",
659 ],
660 }
661
Colin Crossab8d1382023-07-14 17:23:41 +0000662 android_library_import {
663 name: "import",
664 sdk_version: "current",
665 aars: ["import.aar"],
666 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800667 `
668
669 testCases := []struct {
Jiakai Zhangba82e282023-10-13 18:08:59 +0100670 name string
671 assetFlag string
672 assetPackages []string
673 tmpAssetDirInputs []string
674 tmpAssetDirOutputs []string
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800675 }{
676 {
677 name: "foo",
Colin Crossab8d1382023-07-14 17:23:41 +0000678 // lib1 has its own assets. lib3 doesn't have any, but lib4 and import have assets.
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800679 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000680 "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
681 "out/soong/.intermediates/lib1/android_common/assets.zip",
Colin Crossab8d1382023-07-14 17:23:41 +0000682 "out/soong/.intermediates/lib4/android_common/assets.zip",
683 "out/soong/.intermediates/import/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800684 },
685 },
686 {
687 name: "lib1",
688 assetFlag: "-A assets_a",
689 },
690 {
691 name: "lib2",
692 },
693 {
694 name: "lib3",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800695 },
696 {
697 name: "lib4",
698 assetFlag: "-A assets_b",
699 },
Jiakai Zhangba82e282023-10-13 18:08:59 +0100700 {
701 name: "lib5",
702 assetFlag: "-A out/soong/.intermediates/lib5/android_common/tmp_asset_dir",
703 tmpAssetDirInputs: []string{
704 "path/to/asset_file_1",
705 "path/to/asset_file_2",
706 },
707 tmpAssetDirOutputs: []string{
708 "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_1",
709 "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_2",
710 },
711 },
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800712 }
713 ctx := testApp(t, bp)
714
715 for _, test := range testCases {
716 t.Run(test.name, func(t *testing.T) {
717 m := ctx.ModuleForTests(test.name, "android_common")
718
719 // Check asset flag in aapt2 link flags
720 var aapt2link android.TestingBuildParams
721 if len(test.assetPackages) > 0 {
722 aapt2link = m.Output("aapt2/package-res.apk")
723 } else {
724 aapt2link = m.Output("package-res.apk")
725 }
Paul Duffina71a67a2021-03-29 00:42:57 +0100726 aapt2link = aapt2link
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800727 aapt2Flags := aapt2link.Args["flags"]
728 if test.assetFlag != "" {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000729 android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800730 } else {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000731 android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800732 }
733
734 // Check asset merge rule.
735 if len(test.assetPackages) > 0 {
736 mergeAssets := m.Output("package-res.apk")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000737 android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800738 }
Jiakai Zhangba82e282023-10-13 18:08:59 +0100739
740 if len(test.tmpAssetDirInputs) > 0 {
741 rule := m.Rule("tmp_asset_dir")
742 inputs := rule.Implicits
743 outputs := append(android.WritablePaths{rule.Output}, rule.ImplicitOutputs...).Paths()
744 android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir inputs", test.tmpAssetDirInputs, inputs)
745 android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir outputs", test.tmpAssetDirOutputs, outputs)
746 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800747 })
748 }
749}
750
Colin Crossb014f072021-02-26 14:54:36 -0800751func TestAppJavaResources(t *testing.T) {
752 bp := `
753 android_app {
754 name: "foo",
755 sdk_version: "current",
756 java_resources: ["resources/a"],
757 srcs: ["a.java"],
758 }
759
760 android_app {
761 name: "bar",
762 sdk_version: "current",
763 java_resources: ["resources/a"],
764 }
765 `
766
767 ctx := testApp(t, bp)
768
769 foo := ctx.ModuleForTests("foo", "android_common")
770 fooResources := foo.Output("res/foo.jar")
771 fooDexJar := foo.Output("dex-withres/foo.jar")
772 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
773 fooApk := foo.Rule("combineApk")
774
775 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
776 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
777 }
778
779 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
780 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
781 }
782
783 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
784 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
785 }
786
787 bar := ctx.ModuleForTests("bar", "android_common")
788 barResources := bar.Output("res/bar.jar")
789 barApk := bar.Rule("combineApk")
790
791 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
792 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
793 }
794}
795
Colin Crossff3ff7f2023-07-05 14:04:12 -0700796func TestAndroidResourceProcessor(t *testing.T) {
797 testCases := []struct {
Colin Cross8676c8c2023-10-12 15:58:57 -0700798 name string
799 appUsesRP bool
800 directLibUsesRP bool
801 transitiveLibUsesRP bool
802 sharedLibUsesRP bool
803 sharedTransitiveStaticLibUsesRP bool
804 sharedTransitiveSharedLibUsesRP bool
Colin Crossff3ff7f2023-07-05 14:04:12 -0700805
806 dontVerifyApp bool
807 appResources []string
808 appOverlays []string
809 appImports []string
810 appSrcJars []string
811 appClasspath []string
812 appCombined []string
813
814 dontVerifyDirect bool
815 directResources []string
816 directOverlays []string
817 directImports []string
818 directSrcJars []string
819 directClasspath []string
820 directCombined []string
821
822 dontVerifyTransitive bool
823 transitiveResources []string
824 transitiveOverlays []string
825 transitiveImports []string
826 transitiveSrcJars []string
827 transitiveClasspath []string
828 transitiveCombined []string
829
830 dontVerifyDirectImport bool
831 directImportResources []string
832 directImportOverlays []string
833 directImportImports []string
834
835 dontVerifyTransitiveImport bool
836 transitiveImportResources []string
837 transitiveImportOverlays []string
838 transitiveImportImports []string
Colin Cross8676c8c2023-10-12 15:58:57 -0700839
840 dontVerifyShared bool
841 sharedResources []string
842 sharedOverlays []string
843 sharedImports []string
844 sharedSrcJars []string
845 sharedClasspath []string
846 sharedCombined []string
Colin Crossff3ff7f2023-07-05 14:04:12 -0700847 }{
848 {
Colin Cross4eae06d2023-06-20 22:40:02 -0700849 // Test with all modules set to use_resource_processor: false (except android_library_import modules,
850 // which always use resource processor).
851 name: "legacy",
852 appUsesRP: false,
853 directLibUsesRP: false,
854 transitiveLibUsesRP: false,
Colin Crossff3ff7f2023-07-05 14:04:12 -0700855
856 appResources: nil,
857 appOverlays: []string{
858 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000859 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700860 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
861 "out/soong/.intermediates/direct/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000862 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700863 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
864 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
865 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700866 appImports: []string{
867 "out/soong/.intermediates/shared/android_common/package-res.apk",
868 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
869 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700870 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
871 appClasspath: []string{
872 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700873 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700874 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000875 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700876 },
877 appCombined: []string{
878 "out/soong/.intermediates/app/android_common/javac/app.jar",
879 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000880 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700881 },
882
883 directResources: nil,
884 directOverlays: []string{
885 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000886 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700887 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
888 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
889 },
890 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
891 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
892 directClasspath: []string{
893 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
894 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000895 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700896 },
897 directCombined: []string{
898 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
899 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000900 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700901 },
902
903 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
904 transitiveOverlays: nil,
905 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
906 transitiveSrcJars: []string{"out/soong/.intermediates/transitive/android_common/gen/android/R.srcjar"},
907 transitiveClasspath: []string{"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar"},
908 transitiveCombined: nil,
909
Colin Cross8676c8c2023-10-12 15:58:57 -0700910 sharedResources: nil,
911 sharedOverlays: []string{
912 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
913 "out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat",
914 },
915 sharedImports: []string{
916 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
917 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
918 },
919 sharedSrcJars: []string{"out/soong/.intermediates/shared/android_common/gen/android/R.srcjar"},
920 sharedClasspath: []string{
921 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
922 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar",
923 "out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar",
924 },
925 sharedCombined: []string{
926 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
927 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
928 },
929
Colin Crossff3ff7f2023-07-05 14:04:12 -0700930 directImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700931 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
932 directImportImports: []string{
933 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700934 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
935 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700936
937 transitiveImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700938 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
939 transitiveImportImports: []string{
940 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700941 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
942 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700943 },
944 {
945 // Test with all modules set to use_resource_processor: true.
Colin Cross8676c8c2023-10-12 15:58:57 -0700946 name: "resource_processor",
947 appUsesRP: true,
948 directLibUsesRP: true,
949 transitiveLibUsesRP: true,
950 sharedLibUsesRP: true,
951 sharedTransitiveSharedLibUsesRP: true,
952 sharedTransitiveStaticLibUsesRP: true,
Colin Cross4eae06d2023-06-20 22:40:02 -0700953
954 appResources: nil,
955 appOverlays: []string{
956 "out/soong/.intermediates/transitive/android_common/package-res.apk",
957 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
958 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
959 "out/soong/.intermediates/direct/android_common/package-res.apk",
960 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
961 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
962 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
963 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700964 appImports: []string{
965 "out/soong/.intermediates/shared/android_common/package-res.apk",
966 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
967 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700968 appSrcJars: nil,
969 appClasspath: []string{
970 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
971 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700972 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700973 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000974 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700975 },
976 appCombined: []string{
Colin Cross4eae06d2023-06-20 22:40:02 -0700977 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Crossfd620b22024-02-23 10:05:21 -0800978 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700979 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000980 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700981 },
982
983 directResources: nil,
984 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
985 directImports: []string{
986 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
987 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
988 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
989 "out/soong/.intermediates/transitive/android_common/package-res.apk",
990 },
991 directSrcJars: nil,
992 directClasspath: []string{
993 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700994 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -0800995 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
996 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
997 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700998 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000999 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001000 },
1001 directCombined: []string{
1002 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1003 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001004 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001005 },
1006
1007 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1008 transitiveOverlays: nil,
1009 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1010 transitiveSrcJars: nil,
1011 transitiveClasspath: []string{
1012 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1013 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1014 },
1015 transitiveCombined: nil,
1016
Colin Cross8676c8c2023-10-12 15:58:57 -07001017 sharedResources: nil,
1018 sharedOverlays: []string{"out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat"},
1019 sharedImports: []string{
1020 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
1021 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1022 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
1023 },
1024 sharedSrcJars: nil,
1025 sharedClasspath: []string{
1026 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -08001027 "out/soong/.intermediates/shared/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001028 "out/soong/.intermediates/shared_transitive_static/android_common/busybox/R.jar",
1029 "out/soong/.intermediates/shared_transitive_shared/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001030 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar",
1031 "out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar",
1032 },
1033 sharedCombined: []string{
1034 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
1035 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
1036 },
1037
Colin Cross4eae06d2023-06-20 22:40:02 -07001038 directImportResources: nil,
1039 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
1040 directImportImports: []string{
1041 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1042 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1043 },
1044
1045 transitiveImportResources: nil,
1046 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
1047 transitiveImportImports: []string{
1048 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1049 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1050 },
1051 }, {
1052 // Test an app building with resource processor enabled but with dependencies built without
1053 // resource processor.
1054 name: "app_resource_processor",
1055 appUsesRP: true,
1056 directLibUsesRP: false,
1057 transitiveLibUsesRP: false,
1058
1059 appResources: nil,
1060 appOverlays: []string{
1061 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1062 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1063 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1064 "out/soong/.intermediates/direct/android_common/package-res.apk",
1065 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1066 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1067 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1068 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001069 appImports: []string{
1070 "out/soong/.intermediates/shared/android_common/package-res.apk",
1071 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1072 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001073 appSrcJars: nil,
1074 appClasspath: []string{
1075 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1076 // R.jar has to come before direct.jar
1077 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001078 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001079 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001080 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001081 },
1082 appCombined: []string{
Colin Cross4eae06d2023-06-20 22:40:02 -07001083 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Crossfd620b22024-02-23 10:05:21 -08001084 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001085 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001086 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001087 },
1088
1089 dontVerifyDirect: true,
1090 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001091 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001092 dontVerifyDirectImport: true,
1093 dontVerifyTransitiveImport: true,
1094 },
1095 {
1096 // Test an app building without resource processor enabled but with a dependency built with
1097 // resource processor.
1098 name: "app_dependency_lib_resource_processor",
1099 appUsesRP: false,
1100 directLibUsesRP: true,
1101 transitiveLibUsesRP: false,
1102
1103 appOverlays: []string{
1104 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1105 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1106 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1107 "out/soong/.intermediates/direct/android_common/package-res.apk",
1108 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1109 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1110 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1111 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001112 appImports: []string{
1113 "out/soong/.intermediates/shared/android_common/package-res.apk",
1114 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1115 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001116 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1117 appClasspath: []string{
1118 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001119 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001120 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001121 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001122 },
1123 appCombined: []string{
1124 "out/soong/.intermediates/app/android_common/javac/app.jar",
1125 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001126 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001127 },
1128
1129 directResources: nil,
1130 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
1131 directImports: []string{
1132 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1133 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1134 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1135 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1136 },
1137 directSrcJars: nil,
1138 directClasspath: []string{
1139 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001140 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -08001141 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
1142 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001143 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001144 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001145 },
1146 directCombined: []string{
1147 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1148 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001149 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001150 },
1151
1152 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001153 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001154 dontVerifyDirectImport: true,
1155 dontVerifyTransitiveImport: true,
1156 },
1157 {
1158 // Test a library building without resource processor enabled but with a dependency built with
1159 // resource processor.
1160 name: "lib_dependency_lib_resource_processor",
1161 appUsesRP: false,
1162 directLibUsesRP: false,
1163 transitiveLibUsesRP: true,
1164
1165 appOverlays: []string{
1166 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1167 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1168 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1169 "out/soong/.intermediates/direct/android_common/package-res.apk",
1170 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1171 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1172 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1173 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001174 appImports: []string{
1175 "out/soong/.intermediates/shared/android_common/package-res.apk",
1176 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1177 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001178 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1179 appClasspath: []string{
1180 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001181 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001182 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001183 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001184 },
1185 appCombined: []string{
1186 "out/soong/.intermediates/app/android_common/javac/app.jar",
1187 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001188 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001189 },
1190
1191 directResources: nil,
1192 directOverlays: []string{
1193 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1194 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1195 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1196 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
1197 },
1198 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1199 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
1200 directClasspath: []string{
1201 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1202 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001203 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001204 },
1205 directCombined: []string{
1206 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1207 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001208 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001209 },
1210
1211 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1212 transitiveOverlays: nil,
1213 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1214 transitiveSrcJars: nil,
1215 transitiveClasspath: []string{
1216 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1217 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1218 },
1219 transitiveCombined: nil,
1220
Colin Cross8676c8c2023-10-12 15:58:57 -07001221 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001222 dontVerifyDirectImport: true,
1223 dontVerifyTransitiveImport: true,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001224 },
1225 }
1226
1227 for _, testCase := range testCases {
1228 t.Run(testCase.name, func(t *testing.T) {
1229 bp := fmt.Sprintf(`
1230 android_app {
1231 name: "app",
1232 sdk_version: "current",
1233 srcs: ["app/app.java"],
1234 resource_dirs: ["app/res"],
1235 manifest: "app/AndroidManifest.xml",
Colin Cross8676c8c2023-10-12 15:58:57 -07001236 libs: ["shared"],
Colin Crossff3ff7f2023-07-05 14:04:12 -07001237 static_libs: ["direct", "direct_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001238 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001239 }
1240
1241 android_library {
1242 name: "direct",
1243 sdk_version: "current",
1244 srcs: ["direct/direct.java"],
1245 resource_dirs: ["direct/res"],
1246 manifest: "direct/AndroidManifest.xml",
1247 static_libs: ["transitive", "transitive_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001248 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001249 }
1250
1251 android_library {
1252 name: "transitive",
1253 sdk_version: "current",
1254 srcs: ["transitive/transitive.java"],
1255 resource_dirs: ["transitive/res"],
1256 manifest: "transitive/AndroidManifest.xml",
Colin Cross4eae06d2023-06-20 22:40:02 -07001257 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001258 }
1259
Colin Cross8676c8c2023-10-12 15:58:57 -07001260 android_library {
1261 name: "shared",
1262 sdk_version: "current",
1263 srcs: ["shared/shared.java"],
1264 resource_dirs: ["shared/res"],
1265 manifest: "shared/AndroidManifest.xml",
1266 use_resource_processor: %v,
1267 libs: ["shared_transitive_shared"],
1268 static_libs: ["shared_transitive_static"],
1269 }
1270
1271 android_library {
1272 name: "shared_transitive_shared",
1273 sdk_version: "current",
1274 srcs: ["shared_transitive_shared/shared_transitive_shared.java"],
1275 resource_dirs: ["shared_transitive_shared/res"],
1276 manifest: "shared_transitive_shared/AndroidManifest.xml",
1277 use_resource_processor: %v,
1278 }
1279
1280 android_library {
1281 name: "shared_transitive_static",
1282 sdk_version: "current",
1283 srcs: ["shared_transitive_static/shared.java"],
1284 resource_dirs: ["shared_transitive_static/res"],
1285 manifest: "shared_transitive_static/AndroidManifest.xml",
1286 use_resource_processor: %v,
1287 }
1288
Colin Crossff3ff7f2023-07-05 14:04:12 -07001289 android_library_import {
1290 name: "direct_import",
1291 sdk_version: "current",
1292 aars: ["direct_import.aar"],
1293 static_libs: ["direct_import_dep"],
1294 }
1295
1296 android_library_import {
1297 name: "direct_import_dep",
1298 sdk_version: "current",
1299 aars: ["direct_import_dep.aar"],
1300 }
1301
1302 android_library_import {
1303 name: "transitive_import",
1304 sdk_version: "current",
1305 aars: ["transitive_import.aar"],
1306 static_libs: ["transitive_import_dep"],
1307 }
1308
1309 android_library_import {
1310 name: "transitive_import_dep",
1311 sdk_version: "current",
1312 aars: ["transitive_import_dep.aar"],
1313 }
Colin Cross8676c8c2023-10-12 15:58:57 -07001314 `, testCase.appUsesRP, testCase.directLibUsesRP, testCase.transitiveLibUsesRP,
1315 testCase.sharedLibUsesRP, testCase.sharedTransitiveSharedLibUsesRP, testCase.sharedTransitiveStaticLibUsesRP)
Colin Crossff3ff7f2023-07-05 14:04:12 -07001316
1317 fs := android.MockFS{
Colin Cross8676c8c2023-10-12 15:58:57 -07001318 "app/res/values/strings.xml": nil,
1319 "direct/res/values/strings.xml": nil,
1320 "transitive/res/values/strings.xml": nil,
1321 "shared/res/values/strings.xml": nil,
1322 "shared_transitive_static/res/values/strings.xml": nil,
1323 "shared_transitive_shared/res/values/strings.xml": nil,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001324 }
1325
1326 result := android.GroupFixturePreparers(
1327 PrepareForTestWithJavaDefaultModules,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001328 fs.AddToFixture(),
1329 ).RunTestWithBp(t, bp)
1330
1331 type aaptInfo struct {
1332 resources, overlays, imports, srcJars, classpath, combined android.Paths
1333 }
1334
1335 getAaptInfo := func(moduleName string) (aaptInfo aaptInfo) {
1336 mod := result.ModuleForTests(moduleName, "android_common")
1337 resourceListRule := mod.MaybeOutput("aapt2/res.list")
1338 overlayListRule := mod.MaybeOutput("aapt2/overlay.list")
1339 aaptRule := mod.Rule("aapt2Link")
1340 javacRule := mod.MaybeRule("javac")
1341 combinedRule := mod.MaybeOutput("combined/" + moduleName + ".jar")
1342
1343 aaptInfo.resources = resourceListRule.Inputs
1344 aaptInfo.overlays = overlayListRule.Inputs
1345
1346 aaptFlags := strings.Split(aaptRule.Args["flags"], " ")
1347 for i, flag := range aaptFlags {
1348 if flag == "-I" && i+1 < len(aaptFlags) {
1349 aaptInfo.imports = append(aaptInfo.imports, android.PathForTesting(aaptFlags[i+1]))
1350 }
1351 }
1352
1353 if len(javacRule.Args["srcJars"]) > 0 {
1354 aaptInfo.srcJars = android.PathsForTesting(strings.Split(javacRule.Args["srcJars"], " ")...)
1355 }
1356
1357 if len(javacRule.Args["classpath"]) > 0 {
1358 classpathArg := strings.TrimPrefix(javacRule.Args["classpath"], "-classpath ")
1359 aaptInfo.classpath = android.PathsForTesting(strings.Split(classpathArg, ":")...)
1360 }
1361
1362 aaptInfo.combined = combinedRule.Inputs
1363 return
1364 }
1365
1366 app := getAaptInfo("app")
1367 direct := getAaptInfo("direct")
1368 transitive := getAaptInfo("transitive")
Colin Cross8676c8c2023-10-12 15:58:57 -07001369 shared := getAaptInfo("shared")
Colin Crossff3ff7f2023-07-05 14:04:12 -07001370 directImport := getAaptInfo("direct_import")
1371 transitiveImport := getAaptInfo("transitive_import")
1372
1373 if !testCase.dontVerifyApp {
1374 android.AssertPathsRelativeToTopEquals(t, "app resources", testCase.appResources, app.resources)
1375 android.AssertPathsRelativeToTopEquals(t, "app overlays", testCase.appOverlays, app.overlays)
1376 android.AssertPathsRelativeToTopEquals(t, "app imports", testCase.appImports, app.imports)
1377 android.AssertPathsRelativeToTopEquals(t, "app srcjars", testCase.appSrcJars, app.srcJars)
1378 android.AssertPathsRelativeToTopEquals(t, "app classpath", testCase.appClasspath, app.classpath)
1379 android.AssertPathsRelativeToTopEquals(t, "app combined", testCase.appCombined, app.combined)
1380 }
1381
1382 if !testCase.dontVerifyDirect {
1383 android.AssertPathsRelativeToTopEquals(t, "direct resources", testCase.directResources, direct.resources)
1384 android.AssertPathsRelativeToTopEquals(t, "direct overlays", testCase.directOverlays, direct.overlays)
1385 android.AssertPathsRelativeToTopEquals(t, "direct imports", testCase.directImports, direct.imports)
1386 android.AssertPathsRelativeToTopEquals(t, "direct srcjars", testCase.directSrcJars, direct.srcJars)
1387 android.AssertPathsRelativeToTopEquals(t, "direct classpath", testCase.directClasspath, direct.classpath)
1388 android.AssertPathsRelativeToTopEquals(t, "direct combined", testCase.directCombined, direct.combined)
1389 }
1390
1391 if !testCase.dontVerifyTransitive {
1392 android.AssertPathsRelativeToTopEquals(t, "transitive resources", testCase.transitiveResources, transitive.resources)
1393 android.AssertPathsRelativeToTopEquals(t, "transitive overlays", testCase.transitiveOverlays, transitive.overlays)
1394 android.AssertPathsRelativeToTopEquals(t, "transitive imports", testCase.transitiveImports, transitive.imports)
1395 android.AssertPathsRelativeToTopEquals(t, "transitive srcjars", testCase.transitiveSrcJars, transitive.srcJars)
1396 android.AssertPathsRelativeToTopEquals(t, "transitive classpath", testCase.transitiveClasspath, transitive.classpath)
1397 android.AssertPathsRelativeToTopEquals(t, "transitive combined", testCase.transitiveCombined, transitive.combined)
1398 }
1399
Colin Cross8676c8c2023-10-12 15:58:57 -07001400 if !testCase.dontVerifyShared {
1401 android.AssertPathsRelativeToTopEquals(t, "shared resources", testCase.sharedResources, shared.resources)
1402 android.AssertPathsRelativeToTopEquals(t, "shared overlays", testCase.sharedOverlays, shared.overlays)
1403 android.AssertPathsRelativeToTopEquals(t, "shared imports", testCase.sharedImports, shared.imports)
1404 android.AssertPathsRelativeToTopEquals(t, "shared srcjars", testCase.sharedSrcJars, shared.srcJars)
1405 android.AssertPathsRelativeToTopEquals(t, "shared classpath", testCase.sharedClasspath, shared.classpath)
1406 android.AssertPathsRelativeToTopEquals(t, "shared combined", testCase.sharedCombined, shared.combined)
1407 }
1408
Colin Crossff3ff7f2023-07-05 14:04:12 -07001409 if !testCase.dontVerifyDirectImport {
1410 android.AssertPathsRelativeToTopEquals(t, "direct_import resources", testCase.directImportResources, directImport.resources)
1411 android.AssertPathsRelativeToTopEquals(t, "direct_import overlays", testCase.directImportOverlays, directImport.overlays)
1412 android.AssertPathsRelativeToTopEquals(t, "direct_import imports", testCase.directImportImports, directImport.imports)
1413 }
1414
1415 if !testCase.dontVerifyTransitiveImport {
1416 android.AssertPathsRelativeToTopEquals(t, "transitive_import resources", testCase.transitiveImportResources, transitiveImport.resources)
1417 android.AssertPathsRelativeToTopEquals(t, "transitive_import overlays", testCase.transitiveImportOverlays, transitiveImport.overlays)
1418 android.AssertPathsRelativeToTopEquals(t, "transitive_import imports", testCase.transitiveImportImports, transitiveImport.imports)
1419 }
1420 })
1421 }
1422}
1423
1424func TestAndroidResourceOverlays(t *testing.T) {
Colin Crossc4441622024-09-18 14:55:49 -07001425 type moduleAndVariant struct {
1426 module string
1427 variant string
1428 }
1429
Colin Cross5c4791c2019-02-01 11:44:44 -08001430 testCases := []struct {
1431 name string
1432 enforceRROTargets []string
1433 enforceRROExcludedOverlays []string
Colin Crossc4441622024-09-18 14:55:49 -07001434 resourceFiles map[moduleAndVariant][]string
1435 overlayFiles map[moduleAndVariant][]string
1436 rroDirs map[moduleAndVariant][]string
Colin Cross5c4791c2019-02-01 11:44:44 -08001437 }{
1438 {
1439 name: "no RRO",
1440 enforceRROTargets: nil,
1441 enforceRROExcludedOverlays: nil,
Colin Crossc4441622024-09-18 14:55:49 -07001442 resourceFiles: map[moduleAndVariant][]string{
1443 {"foo", "android_common"}: nil,
1444 {"bar", "android_common"}: {"bar/res/res/values/strings.xml"},
1445 {"lib", "android_common"}: nil,
1446 {"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"},
Colin Crossbec85302019-02-13 13:15:46 -08001447 },
Colin Crossc4441622024-09-18 14:55:49 -07001448 overlayFiles: map[moduleAndVariant][]string{
1449 {"foo", "android_common"}: {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001450 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1451 "out/soong/.intermediates/lib/android_common/package-res.apk",
1452 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001453 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001454 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1455 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +00001456 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001457 },
Colin Crossc4441622024-09-18 14:55:49 -07001458 {"bar", "android_common"}: {
Colin Cross5c4791c2019-02-01 11:44:44 -08001459 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1460 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1461 },
Colin Crossc4441622024-09-18 14:55:49 -07001462 {"lib", "android_common"}: {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001463 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001464 "lib/res/res/values/strings.xml",
1465 "device/vendor/blah/overlay/lib/res/values/strings.xml",
1466 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001467 },
Colin Crossc4441622024-09-18 14:55:49 -07001468 rroDirs: map[moduleAndVariant][]string{
1469 {"foo", "android_common"}: nil,
1470 {"bar", "android_common"}: nil,
Colin Cross5c4791c2019-02-01 11:44:44 -08001471 },
1472 },
1473 {
1474 name: "enforce RRO on foo",
1475 enforceRROTargets: []string{"foo"},
1476 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossc4441622024-09-18 14:55:49 -07001477 resourceFiles: map[moduleAndVariant][]string{
1478 {"foo", "android_common"}: nil,
1479 {"bar", "android_common"}: {"bar/res/res/values/strings.xml"},
1480 {"lib", "android_common"}: nil,
1481 {"lib", "android_common_rro"}: nil,
1482 {"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"},
1483 {"lib2", "android_common_rro"}: {"lib2/res/res/values/strings.xml"},
Colin Crossbec85302019-02-13 13:15:46 -08001484 },
Colin Crossc4441622024-09-18 14:55:49 -07001485 overlayFiles: map[moduleAndVariant][]string{
1486 {"foo", "android_common"}: {
1487 "out/soong/.intermediates/lib2/android_common_rro/package-res.apk",
1488 "out/soong/.intermediates/lib/android_common_rro/package-res.apk",
1489 "out/soong/.intermediates/lib3/android_common_rro/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001490 "foo/res/res/values/strings.xml",
1491 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1492 },
Colin Crossc4441622024-09-18 14:55:49 -07001493 {"bar", "android_common"}: {
Colin Cross5c4791c2019-02-01 11:44:44 -08001494 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1495 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1496 },
Colin Crossc4441622024-09-18 14:55:49 -07001497 {"lib", "android_common"}: {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001498 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001499 "lib/res/res/values/strings.xml",
Colin Crossc4441622024-09-18 14:55:49 -07001500 "device/vendor/blah/overlay/lib/res/values/strings.xml",
1501 },
1502 {"lib", "android_common_rro"}: {
1503 "out/soong/.intermediates/lib2/android_common_rro/package-res.apk",
1504 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -08001505 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001506 },
Colin Crossc1c37552019-01-31 11:42:41 -08001507
Colin Crossc4441622024-09-18 14:55:49 -07001508 rroDirs: map[moduleAndVariant][]string{
1509 {"foo", "android_common"}: {
Anton Hansson53c88442019-03-18 15:53:16 +00001510 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +00001511 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001512 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001513 },
Colin Crossc4441622024-09-18 14:55:49 -07001514 {"bar", "android_common"}: nil,
1515 {"lib", "android_common"}: nil,
1516 {"lib", "android_common_rro"}: {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001517 },
1518 },
1519 {
1520 name: "enforce RRO on all",
1521 enforceRROTargets: []string{"*"},
1522 enforceRROExcludedOverlays: []string{
1523 // Excluding specific apps/res directories also allowed.
1524 "device/vendor/blah/static_overlay/foo",
1525 "device/vendor/blah/static_overlay/bar/res",
1526 },
Colin Crossc4441622024-09-18 14:55:49 -07001527 resourceFiles: map[moduleAndVariant][]string{
1528 {"foo", "android_common"}: nil,
1529 {"bar", "android_common"}: {"bar/res/res/values/strings.xml"},
1530 {"lib", "android_common"}: nil,
1531 {"lib2", "android_common"}: {"lib2/res/res/values/strings.xml"},
Colin Crossbec85302019-02-13 13:15:46 -08001532 },
Colin Crossc4441622024-09-18 14:55:49 -07001533 overlayFiles: map[moduleAndVariant][]string{
1534 {"foo", "android_common"}: {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001535 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1536 "out/soong/.intermediates/lib/android_common/package-res.apk",
1537 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001538 "foo/res/res/values/strings.xml",
1539 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1540 },
Colin Crossc4441622024-09-18 14:55:49 -07001541 {"bar", "android_common"}: {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
1542 {"lib", "android_common"}: {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001543 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001544 "lib/res/res/values/strings.xml",
1545 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001546 },
Colin Crossc4441622024-09-18 14:55:49 -07001547 rroDirs: map[moduleAndVariant][]string{
1548 {"foo", "android_common"}: {
Anton Hansson53c88442019-03-18 15:53:16 +00001549 "device:device/vendor/blah/overlay/foo/res",
1550 "product:product/vendor/blah/overlay/foo/res",
1551 // Lib dep comes after the direct deps
1552 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001553 },
Colin Crossc4441622024-09-18 14:55:49 -07001554 {"bar", "android_common"}: {"device:device/vendor/blah/overlay/bar/res"},
1555 {"lib", "android_common"}: {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001556 },
1557 },
1558 }
1559
Anton Hansson53c88442019-03-18 15:53:16 +00001560 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -08001561 "device/vendor/blah/overlay",
1562 "device/vendor/blah/overlay2",
1563 "device/vendor/blah/static_overlay",
1564 }
1565
Anton Hansson53c88442019-03-18 15:53:16 +00001566 productResourceOverlays := []string{
1567 "product/vendor/blah/overlay",
1568 }
1569
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001570 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -08001571 "foo/res/res/values/strings.xml": nil,
1572 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001573 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -08001574 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001575 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
1576 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001577 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001578 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
1579 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
1580 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +00001581 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001582 }
1583
1584 bp := `
1585 android_app {
1586 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001587 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001588 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +00001589 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -08001590 }
1591
1592 android_app {
1593 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001594 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001595 resource_dirs: ["bar/res"],
1596 }
Colin Cross6ed7dea2019-01-31 14:44:30 -08001597
1598 android_library {
1599 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001600 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001601 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -08001602 static_libs: ["lib2"],
1603 }
1604
1605 android_library {
1606 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001607 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -08001608 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -08001609 }
Anton Hansson53c88442019-03-18 15:53:16 +00001610
1611 // This library has the same resources as lib (should not lead to dupe RROs)
1612 android_library {
1613 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001614 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +00001615 resource_dirs: ["lib/res"]
1616 }
Colin Cross890ff552017-11-30 20:13:19 -08001617 `
1618
Colin Cross5c4791c2019-02-01 11:44:44 -08001619 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -08001620 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001621 result := android.GroupFixturePreparers(
1622 PrepareForTestWithJavaDefaultModules,
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001623 fs.AddToFixture(),
1624 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1625 variables.DeviceResourceOverlays = deviceResourceOverlays
1626 variables.ProductResourceOverlays = productResourceOverlays
1627 if testCase.enforceRROTargets != nil {
1628 variables.EnforceRROTargets = testCase.enforceRROTargets
1629 }
1630 if testCase.enforceRROExcludedOverlays != nil {
1631 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
1632 }
1633 }),
1634 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -08001635
Colin Crossbec85302019-02-13 13:15:46 -08001636 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
1637 for _, o := range list {
1638 res := module.MaybeOutput(o)
1639 if res.Rule != nil {
Colin Crossc4441622024-09-18 14:55:49 -07001640 // If the overlay is compiled as part of this moduleAndVariant (i.e. a .arsc.flat file),
Colin Crossbec85302019-02-13 13:15:46 -08001641 // verify the inputs to the .arsc.flat rule.
1642 files = append(files, res.Inputs.Strings()...)
1643 } else {
Colin Crossc4441622024-09-18 14:55:49 -07001644 // Otherwise, verify the full path to the output of the other moduleAndVariant
Colin Crossbec85302019-02-13 13:15:46 -08001645 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +00001646 }
Colin Cross890ff552017-11-30 20:13:19 -08001647 }
Colin Crossbec85302019-02-13 13:15:46 -08001648 return files
Colin Cross890ff552017-11-30 20:13:19 -08001649 }
1650
Colin Crossc4441622024-09-18 14:55:49 -07001651 getResources := func(moduleName, variantName string) (resourceFiles, overlayFiles, rroDirs []string) {
1652 module := result.ModuleForTests(moduleName, variantName)
Colin Crossbec85302019-02-13 13:15:46 -08001653 resourceList := module.MaybeOutput("aapt2/res.list")
1654 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001655 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +00001656 }
Colin Crossbec85302019-02-13 13:15:46 -08001657 overlayList := module.MaybeOutput("aapt2/overlay.list")
1658 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001659 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -08001660 }
1661
Colin Crossab8d1382023-07-14 17:23:41 +00001662 for _, d := range module.Module().(AndroidLibraryDependency).RRODirsDepSet().ToList() {
Anton Hansson53c88442019-03-18 15:53:16 +00001663 var prefix string
1664 if d.overlayType == device {
1665 prefix = "device:"
1666 } else if d.overlayType == product {
1667 prefix = "product:"
1668 } else {
1669 t.Fatalf("Unexpected overlayType %d", d.overlayType)
1670 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001671 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +00001672 }
Colin Crossbec85302019-02-13 13:15:46 -08001673
1674 return resourceFiles, overlayFiles, rroDirs
1675 }
1676
Colin Crossc4441622024-09-18 14:55:49 -07001677 modules := []moduleAndVariant{
1678 {"foo", "android_common"},
1679 {"foo", "android_common_rro"},
1680 {"bar", "android_common"},
1681 {"bar", "android_common_rro"},
1682 {"lib", "android_common"},
1683 {"lib", "android_common_rro"},
1684 {"lib2", "android_common"},
1685 {"lib2", "android_common_rro"},
1686 }
1687 for _, moduleAndVariant := range modules {
1688 if _, exists := testCase.resourceFiles[moduleAndVariant]; !exists {
1689 continue
1690 }
1691 resourceFiles, overlayFiles, rroDirs := getResources(moduleAndVariant.module, moduleAndVariant.variant)
Colin Crossbec85302019-02-13 13:15:46 -08001692
Colin Crossc4441622024-09-18 14:55:49 -07001693 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[moduleAndVariant]) {
Colin Crossbec85302019-02-13 13:15:46 -08001694 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
Colin Crossc4441622024-09-18 14:55:49 -07001695 moduleAndVariant, testCase.resourceFiles[moduleAndVariant], resourceFiles)
Colin Crossbec85302019-02-13 13:15:46 -08001696 }
Colin Crossc4441622024-09-18 14:55:49 -07001697 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[moduleAndVariant]) {
Colin Crossbec85302019-02-13 13:15:46 -08001698 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
Colin Crossc4441622024-09-18 14:55:49 -07001699 moduleAndVariant, testCase.overlayFiles[moduleAndVariant], overlayFiles)
Colin Crossbec85302019-02-13 13:15:46 -08001700 }
Colin Crossc4441622024-09-18 14:55:49 -07001701 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[moduleAndVariant]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +00001702 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossc4441622024-09-18 14:55:49 -07001703 moduleAndVariant, testCase.rroDirs[moduleAndVariant], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +00001704 }
Colin Cross890ff552017-11-30 20:13:19 -08001705 }
Colin Cross890ff552017-11-30 20:13:19 -08001706 })
1707 }
1708}
Colin Crossd09b0b62018-04-18 11:06:47 -07001709
Paul Duffincdb88a92021-03-14 00:36:50 +00001710func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
1711 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +09001712 link := foo.Output("package-res.apk")
1713 linkFlags := strings.Split(link.Args["flags"], " ")
1714 min := android.IndexList("--min-sdk-version", linkFlags)
1715 target := android.IndexList("--target-sdk-version", linkFlags)
1716
1717 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
1718 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
1719 }
1720
1721 gotMinSdkVersion := linkFlags[min+1]
1722 gotTargetSdkVersion := linkFlags[target+1]
1723
Paul Duffincdb88a92021-03-14 00:36:50 +00001724 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001725
Paul Duffincdb88a92021-03-14 00:36:50 +00001726 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001727}
1728
Colin Crossd09b0b62018-04-18 11:06:47 -07001729func TestAppSdkVersion(t *testing.T) {
1730 testCases := []struct {
1731 name string
1732 sdkVersion string
1733 platformSdkInt int
1734 platformSdkCodename string
1735 platformSdkFinal bool
Spandan Dasffb31af2023-03-01 19:46:18 +00001736 minSdkVersionBp string
Colin Crossd09b0b62018-04-18 11:06:47 -07001737 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001738 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001739 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001740 }{
1741 {
1742 name: "current final SDK",
1743 sdkVersion: "current",
1744 platformSdkInt: 27,
1745 platformSdkCodename: "REL",
1746 platformSdkFinal: true,
1747 expectedMinSdkVersion: "27",
1748 },
1749 {
1750 name: "current non-final SDK",
1751 sdkVersion: "current",
1752 platformSdkInt: 27,
1753 platformSdkCodename: "OMR1",
1754 platformSdkFinal: false,
1755 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001756 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001757 },
1758 {
1759 name: "default final SDK",
1760 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001761 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001762 platformSdkInt: 27,
1763 platformSdkCodename: "REL",
1764 platformSdkFinal: true,
1765 expectedMinSdkVersion: "27",
1766 },
1767 {
1768 name: "default non-final SDK",
1769 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001770 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001771 platformSdkInt: 27,
1772 platformSdkCodename: "OMR1",
1773 platformSdkFinal: false,
1774 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001775 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001776 },
1777 {
1778 name: "14",
1779 sdkVersion: "14",
1780 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001781 platformSdkCodename: "S",
1782 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001783 },
Spandan Dasffb31af2023-03-01 19:46:18 +00001784 {
1785 name: "two active SDKs",
1786 sdkVersion: "module_current",
1787 minSdkVersionBp: "UpsideDownCake",
1788 expectedMinSdkVersion: "UpsideDownCake", // And not VanillaIceCream
1789 platformSdkCodename: "VanillaIceCream",
1790 activeCodenames: []string{"UpsideDownCake", "VanillaIceCream"},
1791 },
Colin Crossd09b0b62018-04-18 11:06:47 -07001792 }
1793
1794 for _, moduleType := range []string{"android_app", "android_library"} {
1795 for _, test := range testCases {
1796 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001797 platformApiProp := ""
1798 if test.platformApis {
1799 platformApiProp = "platform_apis: true,"
1800 }
Spandan Dasffb31af2023-03-01 19:46:18 +00001801 minSdkVersionProp := ""
1802 if test.minSdkVersionBp != "" {
1803 minSdkVersionProp = fmt.Sprintf(` min_sdk_version: "%s",`, test.minSdkVersionBp)
1804 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001805 bp := fmt.Sprintf(`%s {
1806 name: "foo",
1807 srcs: ["a.java"],
1808 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001809 %s
Spandan Dasffb31af2023-03-01 19:46:18 +00001810 %s
1811 }`, moduleType, test.sdkVersion, platformApiProp, minSdkVersionProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001812
Paul Duffin71ae5942021-03-22 15:36:52 +00001813 result := android.GroupFixturePreparers(
1814 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001815 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1816 variables.Platform_sdk_version = &test.platformSdkInt
1817 variables.Platform_sdk_codename = &test.platformSdkCodename
1818 variables.Platform_version_active_codenames = test.activeCodenames
1819 variables.Platform_sdk_final = &test.platformSdkFinal
1820 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001821 FixtureWithPrebuiltApis(map[string][]string{
1822 "14": {"foo"},
1823 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001824 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001825
Paul Duffincdb88a92021-03-14 00:36:50 +00001826 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001827 })
1828 }
1829 }
1830}
Colin Crossa4f08812018-10-02 22:03:40 -07001831
Jeongik Cha219141c2020-08-06 23:00:37 +09001832func TestVendorAppSdkVersion(t *testing.T) {
1833 testCases := []struct {
1834 name string
1835 sdkVersion string
1836 platformSdkInt int
1837 platformSdkCodename string
1838 platformSdkFinal bool
1839 deviceCurrentApiLevelForVendorModules string
1840 expectedMinSdkVersion string
1841 }{
1842 {
1843 name: "current final SDK",
1844 sdkVersion: "current",
1845 platformSdkInt: 29,
1846 platformSdkCodename: "REL",
1847 platformSdkFinal: true,
1848 deviceCurrentApiLevelForVendorModules: "29",
1849 expectedMinSdkVersion: "29",
1850 },
1851 {
1852 name: "current final SDK",
1853 sdkVersion: "current",
1854 platformSdkInt: 29,
1855 platformSdkCodename: "REL",
1856 platformSdkFinal: true,
1857 deviceCurrentApiLevelForVendorModules: "28",
1858 expectedMinSdkVersion: "28",
1859 },
1860 {
1861 name: "current final SDK",
1862 sdkVersion: "current",
1863 platformSdkInt: 29,
1864 platformSdkCodename: "Q",
1865 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001866 deviceCurrentApiLevelForVendorModules: "28",
1867 expectedMinSdkVersion: "28",
1868 },
1869 }
1870
1871 for _, moduleType := range []string{"android_app", "android_library"} {
1872 for _, sdkKind := range []string{"", "system_"} {
1873 for _, test := range testCases {
1874 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1875 bp := fmt.Sprintf(`%s {
1876 name: "foo",
1877 srcs: ["a.java"],
1878 sdk_version: "%s%s",
1879 vendor: true,
1880 }`, moduleType, sdkKind, test.sdkVersion)
1881
Paul Duffin71ae5942021-03-22 15:36:52 +00001882 result := android.GroupFixturePreparers(
1883 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001884 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1885 variables.Platform_sdk_version = &test.platformSdkInt
1886 variables.Platform_sdk_codename = &test.platformSdkCodename
1887 variables.Platform_sdk_final = &test.platformSdkFinal
1888 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1889 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1890 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001891 FixtureWithPrebuiltApis(map[string][]string{
1892 "28": {"foo"},
1893 "29": {"foo"},
1894 "current": {"foo"},
1895 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001896 ).RunTestWithBp(t, bp)
1897
1898 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001899 })
1900 }
1901 }
1902 }
1903}
1904
Paul Duffin50c217c2019-06-12 13:25:22 +01001905func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001906 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001907 cc_library {
1908 name: "libjni",
1909 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001910 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001911 stl: "none",
1912 }
1913
1914 android_test {
1915 name: "test",
1916 sdk_version: "core_platform",
1917 jni_libs: ["libjni"],
1918 }
1919
1920 android_test {
1921 name: "test_first",
1922 sdk_version: "core_platform",
1923 compile_multilib: "first",
1924 jni_libs: ["libjni"],
1925 }
1926
1927 android_test {
1928 name: "test_both",
1929 sdk_version: "core_platform",
1930 compile_multilib: "both",
1931 jni_libs: ["libjni"],
1932 }
1933
1934 android_test {
1935 name: "test_32",
1936 sdk_version: "core_platform",
1937 compile_multilib: "32",
1938 jni_libs: ["libjni"],
1939 }
1940
1941 android_test {
1942 name: "test_64",
1943 sdk_version: "core_platform",
1944 compile_multilib: "64",
1945 jni_libs: ["libjni"],
1946 }
1947 `)
1948
1949 testCases := []struct {
1950 name string
1951 abis []string
1952 }{
1953 {"test", []string{"arm64-v8a"}},
1954 {"test_first", []string{"arm64-v8a"}},
1955 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1956 {"test_32", []string{"armeabi-v7a"}},
1957 {"test_64", []string{"arm64-v8a"}},
1958 }
1959
1960 for _, test := range testCases {
1961 t.Run(test.name, func(t *testing.T) {
1962 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07001963 jniLibZip := app.Output("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01001964 var abis []string
1965 args := strings.Fields(jniLibZip.Args["jarArgs"])
1966 for i := 0; i < len(args); i++ {
1967 if args[i] == "-P" {
1968 abis = append(abis, filepath.Base(args[i+1]))
1969 i++
1970 }
1971 }
1972 if !reflect.DeepEqual(abis, test.abis) {
1973 t.Errorf("want abis %v, got %v", test.abis, abis)
1974 }
1975 })
1976 }
1977}
1978
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001979func TestAppSdkVersionByPartition(t *testing.T) {
1980 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1981 android_app {
1982 name: "foo",
1983 srcs: ["a.java"],
1984 vendor: true,
1985 platform_apis: true,
1986 }
1987 `)
1988
1989 testJava(t, `
1990 android_app {
1991 name: "bar",
1992 srcs: ["b.java"],
1993 platform_apis: true,
1994 }
1995 `)
1996
1997 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001998 bp := `
1999 android_app {
2000 name: "foo",
2001 srcs: ["a.java"],
2002 product_specific: true,
2003 platform_apis: true,
2004 }
2005 `
Colin Cross98be1bb2019-12-13 20:41:13 -08002006
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002007 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09002008 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002009 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 +09002010 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002011
2012 android.GroupFixturePreparers(
2013 PrepareForTestWithJavaDefaultModules,
2014 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2015 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
2016 }),
2017 ).
2018 ExtendWithErrorHandler(errorHandler).
2019 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09002020 }
2021}
2022
Paul Duffin50c217c2019-06-12 13:25:22 +01002023func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002024 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01002025 cc_library {
2026 name: "libjni",
2027 system_shared_libs: [],
2028 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08002029 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002030 }
2031
2032 android_app {
2033 name: "app",
2034 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002035 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002036 }
2037
2038 android_app {
2039 name: "app_noembed",
2040 jni_libs: ["libjni"],
2041 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002042 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002043 }
2044
2045 android_app {
2046 name: "app_embed",
2047 jni_libs: ["libjni"],
2048 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002049 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002050 }
2051
2052 android_test {
2053 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00002054 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002055 jni_libs: ["libjni"],
2056 }
2057
2058 android_test {
2059 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00002060 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002061 jni_libs: ["libjni"],
2062 use_embedded_native_libs: false,
2063 }
2064
2065 android_test_helper_app {
2066 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00002067 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002068 jni_libs: ["libjni"],
2069 }
2070
2071 android_test_helper_app {
2072 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00002073 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002074 jni_libs: ["libjni"],
2075 use_embedded_native_libs: false,
2076 }
2077 `)
2078
2079 testCases := []struct {
2080 name string
2081 packaged bool
2082 compressed bool
2083 }{
Jiyong Parkd044bb42024-05-15 02:09:54 +09002084 {"app", false, false},
2085 {"app_noembed", false, false},
Paul Duffin50c217c2019-06-12 13:25:22 +01002086 {"app_embed", true, false},
2087 {"test", true, false},
2088 {"test_noembed", true, true},
2089 {"test_helper", true, false},
2090 {"test_helper_noembed", true, true},
2091 }
2092
2093 for _, test := range testCases {
2094 t.Run(test.name, func(t *testing.T) {
2095 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07002096 jniLibZip := app.MaybeOutput("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01002097 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
2098 t.Errorf("expected jni packaged %v, got %v", w, g)
2099 }
2100
2101 if jniLibZip.Rule != nil {
2102 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
2103 t.Errorf("expected jni compressed %v, got %v", w, g)
2104 }
Colin Crossc511bc52020-04-07 16:50:32 +00002105
2106 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
2107 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
2108 }
Paul Duffin50c217c2019-06-12 13:25:22 +01002109 }
2110 })
2111 }
Colin Cross47fa9d32019-03-26 10:51:39 -07002112}
2113
Colin Cross3c007702020-05-08 11:20:24 -07002114func TestJNISDK(t *testing.T) {
2115 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
2116 cc_library {
2117 name: "libjni",
2118 system_shared_libs: [],
2119 stl: "none",
2120 sdk_version: "current",
2121 }
2122
2123 android_test {
2124 name: "app_platform",
2125 jni_libs: ["libjni"],
2126 platform_apis: true,
2127 }
2128
2129 android_test {
2130 name: "app_sdk",
2131 jni_libs: ["libjni"],
2132 sdk_version: "current",
2133 }
2134
2135 android_test {
2136 name: "app_force_platform",
2137 jni_libs: ["libjni"],
2138 sdk_version: "current",
2139 jni_uses_platform_apis: true,
2140 }
2141
2142 android_test {
2143 name: "app_force_sdk",
2144 jni_libs: ["libjni"],
2145 platform_apis: true,
2146 jni_uses_sdk_apis: true,
2147 }
Colin Crossc2d24052020-05-13 11:05:02 -07002148
2149 cc_library {
2150 name: "libvendorjni",
2151 system_shared_libs: [],
2152 stl: "none",
2153 vendor: true,
2154 }
2155
2156 android_test {
2157 name: "app_vendor",
2158 jni_libs: ["libvendorjni"],
2159 sdk_version: "current",
2160 vendor: true,
2161 }
Colin Cross3c007702020-05-08 11:20:24 -07002162 `)
2163
2164 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07002165 name string
2166 sdkJNI bool
2167 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07002168 }{
Colin Crossc2d24052020-05-13 11:05:02 -07002169 {name: "app_platform"},
2170 {name: "app_sdk", sdkJNI: true},
2171 {name: "app_force_platform"},
2172 {name: "app_force_sdk", sdkJNI: true},
2173 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07002174 }
2175
Colin Crossc2d24052020-05-13 11:05:02 -07002176 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
2177 Output("libjni.so").Output.String()
2178 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
2179 Output("libjni.so").Output.String()
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +09002180 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_vendor_arm64_armv8-a_shared").
Colin Crossc2d24052020-05-13 11:05:02 -07002181 Output("libvendorjni.so").Output.String()
2182
Colin Cross3c007702020-05-08 11:20:24 -07002183 for _, test := range testCases {
2184 t.Run(test.name, func(t *testing.T) {
2185 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07002186
Colin Crossb3168ba2023-07-26 16:14:56 -07002187 jniLibZip := app.MaybeOutput("jnilibs.zip")
Colin Cross3c007702020-05-08 11:20:24 -07002188 if len(jniLibZip.Implicits) != 1 {
2189 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
2190 }
2191 gotJNI := jniLibZip.Implicits[0].String()
2192
2193 if test.sdkJNI {
2194 if gotJNI != sdkJNI {
2195 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
2196 }
Colin Crossc2d24052020-05-13 11:05:02 -07002197 } else if test.vendorJNI {
2198 if gotJNI != vendorJNI {
2199 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
2200 }
Colin Cross3c007702020-05-08 11:20:24 -07002201 } else {
2202 if gotJNI != platformJNI {
2203 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
2204 }
2205 }
2206 })
2207 }
2208
2209 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
2210 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
2211 android_test {
2212 name: "app_platform",
2213 platform_apis: true,
2214 jni_uses_platform_apis: true,
2215 }
2216 `)
2217 })
2218
2219 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
2220 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
2221 android_test {
2222 name: "app_sdk",
2223 sdk_version: "current",
2224 jni_uses_sdk_apis: true,
2225 }
2226 `)
2227 })
2228
2229}
2230
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002231func TestCertificates(t *testing.T) {
2232 testCases := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002233 name string
2234 bp string
Colin Cross5caad2b2022-12-12 15:11:46 -08002235 allowMissingDependencies bool
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002236 certificateOverride string
2237 expectedCertSigningFlags string
2238 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002239 }{
2240 {
2241 name: "default",
2242 bp: `
2243 android_app {
2244 name: "foo",
2245 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002246 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002247 }
2248 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002249 certificateOverride: "",
2250 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002251 expectedCertificate: "build/make/target/product/security/testkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002252 },
2253 {
2254 name: "module certificate property",
2255 bp: `
2256 android_app {
2257 name: "foo",
2258 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002259 certificate: ":new_certificate",
2260 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002261 }
2262
2263 android_app_certificate {
2264 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002265 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002266 }
2267 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002268 certificateOverride: "",
2269 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002270 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002271 },
2272 {
2273 name: "path certificate property",
2274 bp: `
2275 android_app {
2276 name: "foo",
2277 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002278 certificate: "expiredkey",
2279 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002280 }
2281 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002282 certificateOverride: "",
2283 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002284 expectedCertificate: "build/make/target/product/security/expiredkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002285 },
2286 {
2287 name: "certificate overrides",
2288 bp: `
2289 android_app {
2290 name: "foo",
2291 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002292 certificate: "expiredkey",
2293 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002294 }
2295
2296 android_app_certificate {
2297 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002298 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002299 }
2300 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002301 certificateOverride: "foo:new_certificate",
2302 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002303 expectedCertificate: "cert/new_cert",
Liz Kammere2b27f42020-05-07 13:24:05 -07002304 },
2305 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002306 name: "certificate signing flags",
Liz Kammere2b27f42020-05-07 13:24:05 -07002307 bp: `
2308 android_app {
2309 name: "foo",
2310 srcs: ["a.java"],
2311 certificate: ":new_certificate",
2312 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002313 rotationMinSdkVersion: "32",
Liz Kammere2b27f42020-05-07 13:24:05 -07002314 sdk_version: "current",
2315 }
2316
2317 android_app_certificate {
2318 name: "new_certificate",
2319 certificate: "cert/new_cert",
2320 }
2321 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002322 certificateOverride: "",
2323 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002324 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002325 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002326 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002327 name: "cert signing flags from filegroup",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002328 bp: `
2329 android_app {
2330 name: "foo",
2331 srcs: ["a.java"],
2332 certificate: ":new_certificate",
2333 lineage: ":lineage_bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002334 rotationMinSdkVersion: "32",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002335 sdk_version: "current",
2336 }
2337
2338 android_app_certificate {
2339 name: "new_certificate",
2340 certificate: "cert/new_cert",
2341 }
2342
2343 filegroup {
2344 name: "lineage_bin",
2345 srcs: ["lineage.bin"],
2346 }
2347 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002348 certificateOverride: "",
2349 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002350 expectedCertificate: "cert/new_cert",
2351 },
2352 {
2353 name: "missing with AllowMissingDependencies",
2354 bp: `
2355 android_app {
2356 name: "foo",
2357 srcs: ["a.java"],
2358 certificate: ":new_certificate",
2359 sdk_version: "current",
2360 }
2361 `,
2362 expectedCertificate: "out/soong/.intermediates/foo/android_common/missing",
2363 allowMissingDependencies: true,
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002364 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002365 }
2366
2367 for _, test := range testCases {
2368 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002369 result := android.GroupFixturePreparers(
2370 PrepareForTestWithJavaDefaultModules,
2371 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2372 if test.certificateOverride != "" {
2373 variables.CertificateOverrides = []string{test.certificateOverride}
2374 }
Colin Cross5caad2b2022-12-12 15:11:46 -08002375 if test.allowMissingDependencies {
2376 variables.Allow_missing_dependencies = proptools.BoolPtr(true)
2377 }
2378 }),
2379 android.FixtureModifyContext(func(ctx *android.TestContext) {
2380 ctx.SetAllowMissingDependencies(test.allowMissingDependencies)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002381 }),
2382 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002383
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002384 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002385
Colin Cross5caad2b2022-12-12 15:11:46 -08002386 certificate := foo.Module().(*AndroidApp).certificate
2387 android.AssertPathRelativeToTopEquals(t, "certificates key", test.expectedCertificate+".pk8", certificate.Key)
2388 // The sign_target_files_apks and check_target_files_signatures
2389 // tools require that certificates have a .x509.pem extension.
2390 android.AssertPathRelativeToTopEquals(t, "certificates pem", test.expectedCertificate+".x509.pem", certificate.Pem)
Liz Kammere2b27f42020-05-07 13:24:05 -07002391
Colin Cross5caad2b2022-12-12 15:11:46 -08002392 signapk := foo.Output("foo.apk")
2393 if signapk.Rule != android.ErrorRule {
2394 signCertificateFlags := signapk.Args["certificates"]
2395 expectedFlags := certificate.Pem.String() + " " + certificate.Key.String()
2396 android.AssertStringEquals(t, "certificates flags", expectedFlags, signCertificateFlags)
2397
2398 certSigningFlags := signapk.Args["flags"]
2399 android.AssertStringEquals(t, "cert signing flags", test.expectedCertSigningFlags, certSigningFlags)
2400 }
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002401 })
2402 }
2403}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002404
Songchun Fan688de9a2020-03-24 20:32:24 -07002405func TestRequestV4SigningFlag(t *testing.T) {
2406 testCases := []struct {
2407 name string
2408 bp string
2409 expected string
2410 }{
2411 {
2412 name: "default",
2413 bp: `
2414 android_app {
2415 name: "foo",
2416 srcs: ["a.java"],
2417 sdk_version: "current",
2418 }
2419 `,
2420 expected: "",
2421 },
2422 {
2423 name: "default",
2424 bp: `
2425 android_app {
2426 name: "foo",
2427 srcs: ["a.java"],
2428 sdk_version: "current",
2429 v4_signature: false,
2430 }
2431 `,
2432 expected: "",
2433 },
2434 {
2435 name: "module certificate property",
2436 bp: `
2437 android_app {
2438 name: "foo",
2439 srcs: ["a.java"],
2440 sdk_version: "current",
2441 v4_signature: true,
2442 }
2443 `,
2444 expected: "--enable-v4",
2445 },
2446 }
2447
2448 for _, test := range testCases {
2449 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002450 result := android.GroupFixturePreparers(
2451 PrepareForTestWithJavaDefaultModules,
2452 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07002453
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002454 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07002455
2456 signapk := foo.Output("foo.apk")
2457 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002458 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07002459 })
2460 }
2461}
2462
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002463func TestPackageNameOverride(t *testing.T) {
2464 testCases := []struct {
2465 name string
2466 bp string
2467 packageNameOverride string
2468 expected []string
2469 }{
2470 {
2471 name: "default",
2472 bp: `
2473 android_app {
2474 name: "foo",
2475 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002476 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002477 }
2478 `,
2479 packageNameOverride: "",
2480 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002481 "out/soong/.intermediates/foo/android_common/foo.apk",
2482 "out/soong/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002483 },
2484 },
2485 {
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002486 name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002487 bp: `
2488 android_app {
2489 name: "foo",
2490 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002491 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002492 }
2493 `,
2494 packageNameOverride: "foo:bar",
2495 expected: []string{
2496 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002497 "out/soong/.intermediates/foo/android_common/bar.apk",
2498 "out/soong/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002499 },
2500 },
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002501 {
2502 name: "overridden via stem",
2503 bp: `
2504 android_app {
2505 name: "foo",
2506 srcs: ["a.java"],
2507 sdk_version: "current",
2508 stem: "bar",
2509 }
2510 `,
2511 packageNameOverride: "",
2512 expected: []string{
2513 "out/soong/.intermediates/foo/android_common/bar.apk",
2514 "out/soong/target/product/test_device/system/app/bar/bar.apk",
2515 },
2516 },
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002517 }
2518
2519 for _, test := range testCases {
2520 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002521 result := android.GroupFixturePreparers(
2522 PrepareForTestWithJavaDefaultModules,
2523 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2524 if test.packageNameOverride != "" {
2525 variables.PackageNameOverrides = []string{test.packageNameOverride}
2526 }
2527 }),
2528 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002529
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002530 foo := result.ModuleForTests("foo", "android_common")
2531
Lukacs T. Berkifbaf7252021-08-19 09:36:42 +02002532 outSoongDir := result.Config.SoongOutDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002533
2534 outputs := foo.AllOutputs()
2535 outputMap := make(map[string]bool)
2536 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002537 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002538 }
2539 for _, e := range test.expected {
2540 if _, exist := outputMap[e]; !exist {
2541 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
2542 }
2543 }
2544 })
2545 }
2546}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002547
2548func TestInstrumentationTargetOverridden(t *testing.T) {
2549 bp := `
2550 android_app {
2551 name: "foo",
2552 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002553 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002554 }
2555
2556 android_test {
2557 name: "bar",
2558 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002559 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002560 }
2561 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002562
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002563 result := android.GroupFixturePreparers(
2564 PrepareForTestWithJavaDefaultModules,
2565 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2566 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
2567 }),
2568 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002569
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002570 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002571 res := bar.Output("package-res.apk")
2572 aapt2Flags := res.Args["flags"]
2573 e := "--rename-instrumentation-target-package org.dandroid.bp"
2574 if !strings.Contains(aapt2Flags, e) {
2575 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
2576 }
2577}
Jaewoong Jung525443a2019-02-28 15:35:54 -08002578
2579func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002580 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2581 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08002582 android_app {
2583 name: "foo",
2584 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07002585 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002586 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002587 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002588 }
2589
2590 override_android_app {
2591 name: "bar",
2592 base: "foo",
2593 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07002594 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002595 rotationMinSdkVersion: "32",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002596 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002597 }
2598
2599 android_app_certificate {
2600 name: "new_certificate",
2601 certificate: "cert/new_cert",
2602 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002603
2604 override_android_app {
2605 name: "baz",
2606 base: "foo",
2607 package_name: "org.dandroid.bp",
2608 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002609
2610 override_android_app {
2611 name: "baz_no_rename_resources",
2612 base: "foo",
2613 package_name: "org.dandroid.bp",
2614 rename_resources_package: false,
2615 }
2616
2617 android_app {
2618 name: "foo_no_rename_resources",
2619 srcs: ["a.java"],
2620 certificate: "expiredkey",
2621 overrides: ["qux"],
2622 rename_resources_package: false,
2623 sdk_version: "current",
2624 }
2625
2626 override_android_app {
2627 name: "baz_base_no_rename_resources",
2628 base: "foo_no_rename_resources",
2629 package_name: "org.dandroid.bp",
2630 }
2631
2632 override_android_app {
2633 name: "baz_override_base_rename_resources",
2634 base: "foo_no_rename_resources",
2635 package_name: "org.dandroid.bp",
2636 rename_resources_package: true,
2637 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08002638 `)
2639
2640 expectedVariants := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002641 name string
2642 moduleName string
2643 variantName string
2644 apkName string
2645 apkPath string
2646 certFlag string
2647 certSigningFlags string
2648 overrides []string
2649 packageFlag string
2650 renameResources bool
2651 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08002652 }{
2653 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002654 name: "foo",
2655 moduleName: "foo",
2656 variantName: "android_common",
2657 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2658 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2659 certSigningFlags: "",
2660 overrides: []string{"qux"},
2661 packageFlag: "",
2662 renameResources: false,
2663 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002664 },
2665 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002666 name: "foo",
2667 moduleName: "bar",
2668 variantName: "android_common_bar",
2669 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2670 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
2671 certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
2672 overrides: []string{"qux", "foo"},
2673 packageFlag: "",
2674 renameResources: false,
2675 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002676 },
2677 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002678 name: "foo",
2679 moduleName: "baz",
2680 variantName: "android_common_baz",
2681 apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk",
2682 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2683 certSigningFlags: "",
2684 overrides: []string{"qux", "foo"},
2685 packageFlag: "org.dandroid.bp",
2686 renameResources: true,
2687 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002688 },
2689 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002690 name: "foo",
2691 moduleName: "baz_no_rename_resources",
2692 variantName: "android_common_baz_no_rename_resources",
2693 apkPath: "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
2694 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2695 certSigningFlags: "",
2696 overrides: []string{"qux", "foo"},
2697 packageFlag: "org.dandroid.bp",
2698 renameResources: false,
2699 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002700 },
2701 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002702 name: "foo_no_rename_resources",
2703 moduleName: "baz_base_no_rename_resources",
2704 variantName: "android_common_baz_base_no_rename_resources",
2705 apkPath: "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
2706 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2707 certSigningFlags: "",
2708 overrides: []string{"qux", "foo_no_rename_resources"},
2709 packageFlag: "org.dandroid.bp",
2710 renameResources: false,
2711 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002712 },
2713 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002714 name: "foo_no_rename_resources",
2715 moduleName: "baz_override_base_rename_resources",
2716 variantName: "android_common_baz_override_base_rename_resources",
2717 apkPath: "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
2718 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2719 certSigningFlags: "",
2720 overrides: []string{"qux", "foo_no_rename_resources"},
2721 packageFlag: "org.dandroid.bp",
2722 renameResources: true,
2723 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002724 },
2725 }
2726 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002727 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002728
2729 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002730 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002731
2732 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08002733 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07002734 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002735 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07002736
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002737 // Check the cert signing flags
2738 certSigningFlags := signapk.Args["flags"]
2739 android.AssertStringEquals(t, "cert signing flags", expected.certSigningFlags, certSigningFlags)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002740
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002741 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08002742 mod := variant.Module().(*AndroidApp)
zhidoua2ce78f2022-02-17 02:33:12 +00002743 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002744
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002745 // Test Overridable property: Logging_parent
2746 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002747 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002748
Liz Kammer1d5983b2020-05-19 19:15:37 +00002749 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002750 res := variant.Output("package-res.apk")
2751 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00002752 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
2753 expectedPackage := expected.packageFlag
2754 if !expected.renameResources {
2755 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00002756 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002757 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002758 }
2759}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07002760
zhidoua2ce78f2022-02-17 02:33:12 +00002761func TestOverrideAndroidAppOverrides(t *testing.T) {
2762 ctx, _ := testJava(
2763 t, `
2764 android_app {
2765 name: "foo",
2766 srcs: ["a.java"],
2767 sdk_version: "current",
2768 overrides: ["qux"]
2769 }
2770
2771 android_app {
2772 name: "bar",
2773 srcs: ["b.java"],
2774 sdk_version: "current",
2775 overrides: ["foo"]
2776 }
2777
2778 override_android_app {
2779 name: "foo_override",
2780 base: "foo",
2781 overrides: ["bar"]
2782 }
2783 `)
2784
2785 expectedVariants := []struct {
2786 name string
2787 moduleName string
2788 variantName string
2789 overrides []string
2790 }{
2791 {
2792 name: "foo",
2793 moduleName: "foo",
2794 variantName: "android_common",
2795 overrides: []string{"qux"},
2796 },
2797 {
2798 name: "bar",
2799 moduleName: "bar",
2800 variantName: "android_common",
2801 overrides: []string{"foo"},
2802 },
2803 {
2804 name: "foo",
2805 moduleName: "foo_override",
2806 variantName: "android_common_foo_override",
2807 overrides: []string{"bar", "foo"},
2808 },
2809 }
2810 for _, expected := range expectedVariants {
2811 variant := ctx.ModuleForTests(expected.name, expected.variantName)
2812
2813 // Check if the overrides field values are correctly aggregated.
2814 mod := variant.Module().(*AndroidApp)
2815 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2816 }
2817}
2818
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002819func TestOverrideAndroidAppWithPrebuilt(t *testing.T) {
2820 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2821 t, `
2822 android_app {
2823 name: "foo",
2824 srcs: ["a.java"],
2825 sdk_version: "current",
2826 }
2827
2828 override_android_app {
2829 name: "bar",
2830 base: "foo",
2831 }
2832
2833 android_app_import {
2834 name: "bar",
2835 prefer: true,
2836 apk: "bar.apk",
2837 presigned: true,
2838 }
2839 `)
2840
2841 // An app that has an override that also has a prebuilt should not be hidden.
2842 foo := result.ModuleForTests("foo", "android_common")
2843 if foo.Module().IsHideFromMake() {
2844 t.Errorf("expected foo to have HideFromMake false")
2845 }
2846
2847 // An override that also has a prebuilt should be hidden.
2848 barOverride := result.ModuleForTests("foo", "android_common_bar")
2849 if !barOverride.Module().IsHideFromMake() {
2850 t.Errorf("expected bar override variant of foo to have HideFromMake true")
2851 }
2852}
2853
Jooyung Han01d80d82022-01-08 12:16:32 +09002854func TestOverrideAndroidAppStem(t *testing.T) {
2855 ctx, _ := testJava(t, `
2856 android_app {
2857 name: "foo",
2858 srcs: ["a.java"],
2859 sdk_version: "current",
2860 }
2861 override_android_app {
2862 name: "bar",
2863 base: "foo",
2864 }
2865 override_android_app {
2866 name: "baz",
2867 base: "foo",
2868 stem: "baz_stem",
2869 }
2870 android_app {
2871 name: "foo2",
2872 srcs: ["a.java"],
2873 sdk_version: "current",
2874 stem: "foo2_stem",
2875 }
2876 override_android_app {
2877 name: "bar2",
2878 base: "foo2",
2879 }
2880 override_android_app {
2881 name: "baz2",
2882 base: "foo2",
2883 stem: "baz2_stem",
2884 }
2885 `)
2886 for _, expected := range []struct {
2887 moduleName string
2888 variantName string
2889 apkPath string
2890 }{
2891 {
2892 moduleName: "foo",
2893 variantName: "android_common",
2894 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2895 },
2896 {
2897 moduleName: "foo",
2898 variantName: "android_common_bar",
2899 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2900 },
2901 {
2902 moduleName: "foo",
2903 variantName: "android_common_baz",
2904 apkPath: "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk",
2905 },
2906 {
2907 moduleName: "foo2",
2908 variantName: "android_common",
2909 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2910 },
2911 {
2912 moduleName: "foo2",
2913 variantName: "android_common_bar2",
2914 // Note that this may cause the duplicate output error.
2915 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2916 },
2917 {
2918 moduleName: "foo2",
2919 variantName: "android_common_baz2",
2920 apkPath: "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
2921 },
2922 } {
2923 variant := ctx.ModuleForTests(expected.moduleName, expected.variantName)
2924 variant.Output(expected.apkPath)
2925 }
2926}
2927
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002928func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002929 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002930 android_app {
2931 name: "foo",
2932 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002933 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002934 }
2935
2936 override_android_app {
2937 name: "bar",
2938 base: "foo",
2939 package_name: "org.dandroid.bp",
2940 }
2941
2942 android_test {
2943 name: "baz",
2944 srcs: ["b.java"],
2945 instrumentation_for: "foo",
2946 }
2947
2948 android_test {
2949 name: "qux",
2950 srcs: ["b.java"],
2951 instrumentation_for: "bar",
2952 }
2953 `)
2954
2955 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002956 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002957 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002958 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2959 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2960 }
2961
2962 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002963 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002964 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002965 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2966 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2967 }
2968}
2969
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002970func TestOverrideAndroidTest(t *testing.T) {
2971 ctx, _ := testJava(t, `
2972 android_app {
2973 name: "foo",
2974 srcs: ["a.java"],
2975 package_name: "com.android.foo",
2976 sdk_version: "current",
2977 }
2978
2979 override_android_app {
2980 name: "bar",
2981 base: "foo",
2982 package_name: "com.android.bar",
2983 }
2984
2985 android_test {
2986 name: "foo_test",
2987 srcs: ["b.java"],
2988 instrumentation_for: "foo",
2989 }
2990
2991 override_android_test {
2992 name: "bar_test",
2993 base: "foo_test",
2994 package_name: "com.android.bar.test",
2995 instrumentation_for: "bar",
2996 instrumentation_target_package: "com.android.bar",
2997 }
2998 `)
2999
3000 expectedVariants := []struct {
3001 moduleName string
3002 variantName string
3003 apkPath string
3004 overrides []string
3005 targetVariant string
3006 packageFlag string
3007 targetPackageFlag string
3008 }{
3009 {
3010 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08003011 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003012 overrides: nil,
3013 targetVariant: "android_common",
3014 packageFlag: "",
3015 targetPackageFlag: "",
3016 },
3017 {
3018 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08003019 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003020 overrides: []string{"foo_test"},
3021 targetVariant: "android_common_bar",
3022 packageFlag: "com.android.bar.test",
3023 targetPackageFlag: "com.android.bar",
3024 },
3025 }
3026 for _, expected := range expectedVariants {
3027 variant := ctx.ModuleForTests("foo_test", expected.variantName)
3028
3029 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003030 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003031
3032 // Check if the overrides field values are correctly aggregated.
3033 mod := variant.Module().(*AndroidTest)
zhidoua2ce78f2022-02-17 02:33:12 +00003034 if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003035 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
zhidoua2ce78f2022-02-17 02:33:12 +00003036 expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003037 }
3038
3039 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01003040 javac := variant.Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003041 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003042 if !strings.Contains(javac.Args["classpath"], turbine) {
3043 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
3044 }
3045
3046 // Check aapt2 flags.
3047 res := variant.Output("package-res.apk")
3048 aapt2Flags := res.Args["flags"]
3049 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00003050 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003051 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
3052 }
3053}
3054
Jaewoong Jung39982342020-01-14 10:27:18 -08003055func TestAndroidTest_FixTestConfig(t *testing.T) {
3056 ctx, _ := testJava(t, `
3057 android_app {
3058 name: "foo",
3059 srcs: ["a.java"],
3060 package_name: "com.android.foo",
3061 sdk_version: "current",
3062 }
3063
3064 android_test {
3065 name: "foo_test",
3066 srcs: ["b.java"],
3067 instrumentation_for: "foo",
3068 }
3069
3070 android_test {
3071 name: "bar_test",
3072 srcs: ["b.java"],
3073 package_name: "com.android.bar.test",
3074 instrumentation_for: "foo",
Seth Moorec6f4b532023-02-02 13:22:26 -08003075 mainline_package_name: "com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08003076 }
3077
3078 override_android_test {
3079 name: "baz_test",
3080 base: "foo_test",
3081 package_name: "com.android.baz.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08003082 mainline_package_name: "com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08003083 }
3084 `)
3085
3086 testCases := []struct {
3087 moduleName string
3088 variantName string
3089 expectedFlags []string
3090 }{
3091 {
3092 moduleName: "foo_test",
3093 variantName: "android_common",
3094 },
3095 {
3096 moduleName: "bar_test",
3097 variantName: "android_common",
3098 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003099 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003100 "--package-name com.android.bar.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08003101 "--mainline-package-name com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08003102 },
3103 },
3104 {
3105 moduleName: "foo_test",
3106 variantName: "android_common_baz_test",
3107 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003108 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003109 "--package-name com.android.baz.test",
3110 "--test-file-name baz_test.apk",
Seth Moorec6f4b532023-02-02 13:22:26 -08003111 "out/soong/.intermediates/foo_test/android_common_baz_test/test_config_fixer/AndroidTest.xml",
3112 "--mainline-package-name com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08003113 },
3114 },
3115 }
3116
3117 for _, test := range testCases {
3118 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01003119 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08003120
3121 if len(test.expectedFlags) > 0 {
3122 if params.Rule == nil {
3123 t.Errorf("test_config_fixer was expected to run, but didn't")
3124 } else {
3125 for _, flag := range test.expectedFlags {
3126 if !strings.Contains(params.RuleParams.Command, flag) {
3127 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
3128 }
3129 }
3130 }
3131 } else {
3132 if params.Rule != nil {
3133 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
3134 }
3135 }
Jaewoong Jung39982342020-01-14 10:27:18 -08003136 }
3137}
3138
Paul Duffin53a70a42022-01-11 14:35:55 +00003139func TestInstrumentationTargetPrebuilt(t *testing.T) {
3140 bp := `
3141 android_app_import {
3142 name: "foo",
3143 apk: "foo.apk",
3144 presigned: true,
3145 }
3146
3147 android_test {
3148 name: "bar",
3149 srcs: ["a.java"],
3150 instrumentation_for: "foo",
3151 sdk_version: "current",
3152 }
3153 `
3154
3155 android.GroupFixturePreparers(
3156 PrepareForTestWithJavaDefaultModules,
3157 ).ExtendWithErrorHandler(
3158 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
3159 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
3160 RunTestWithBp(t, bp)
3161}
3162
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003163func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07003164 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003165 cc_library {
3166 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08003167 sdk_version: "current",
3168 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003169 }
3170
3171 android_test {
3172 name: "stl",
3173 jni_libs: ["libjni"],
3174 compile_multilib: "both",
3175 sdk_version: "current",
3176 stl: "c++_shared",
3177 }
3178
3179 android_test {
3180 name: "system",
3181 jni_libs: ["libjni"],
3182 compile_multilib: "both",
3183 sdk_version: "current",
3184 }
3185 `)
3186
3187 testCases := []struct {
3188 name string
3189 jnis []string
3190 }{
3191 {"stl",
3192 []string{
3193 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07003194 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003195 },
3196 },
3197 {"system",
3198 []string{
3199 "libjni.so",
3200 },
3201 },
3202 }
3203
3204 for _, test := range testCases {
3205 t.Run(test.name, func(t *testing.T) {
3206 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07003207 jniLibZip := app.Output("jnilibs.zip")
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003208 var jnis []string
3209 args := strings.Fields(jniLibZip.Args["jarArgs"])
3210 for i := 0; i < len(args); i++ {
3211 if args[i] == "-f" {
3212 jnis = append(jnis, args[i+1])
3213 i += 1
3214 }
3215 }
3216 jnisJoined := strings.Join(jnis, " ")
3217 for _, jni := range test.jnis {
3218 if !strings.Contains(jnisJoined, jni) {
3219 t.Errorf("missing jni %q in %q", jni, jnis)
3220 }
3221 }
3222 })
3223 }
3224}
Colin Cross50ddcc42019-05-16 12:28:22 -07003225
3226func TestUsesLibraries(t *testing.T) {
3227 bp := `
3228 java_sdk_library {
3229 name: "foo",
3230 srcs: ["a.java"],
3231 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003232 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003233 }
3234
3235 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01003236 name: "qux",
3237 srcs: ["a.java"],
3238 api_packages: ["qux"],
3239 sdk_version: "current",
3240 }
3241
3242 java_sdk_library {
3243 name: "quuz",
3244 srcs: ["a.java"],
3245 api_packages: ["quuz"],
3246 sdk_version: "current",
3247 }
3248
3249 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003250 name: "fred",
3251 srcs: ["a.java"],
3252 api_packages: ["fred"],
3253 sdk_version: "current",
3254 }
3255
3256 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07003257 name: "bar",
3258 srcs: ["a.java"],
3259 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003260 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003261 }
3262
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01003263 java_sdk_library {
3264 name: "runtime-library",
3265 srcs: ["a.java"],
3266 sdk_version: "current",
3267 }
3268
3269 java_library {
3270 name: "static-runtime-helper",
3271 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00003272 libs: ["runtime-library.impl"],
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01003273 sdk_version: "current",
3274 }
3275
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003276 java_library {
3277 name: "runtime-required-x",
3278 srcs: ["a.java"],
3279 installable: true,
3280 sdk_version: "current",
3281 }
3282
3283 java_library {
3284 name: "runtime-optional-x",
3285 srcs: ["a.java"],
3286 installable: true,
3287 sdk_version: "current",
3288 }
3289
3290 android_library {
3291 name: "static-x",
3292 uses_libs: ["runtime-required-x"],
3293 optional_uses_libs: ["runtime-optional-x"],
3294 sdk_version: "current",
3295 }
3296
3297 java_library {
3298 name: "runtime-required-y",
3299 srcs: ["a.java"],
3300 installable: true,
3301 sdk_version: "current",
3302 }
3303
3304 java_library {
3305 name: "runtime-optional-y",
3306 srcs: ["a.java"],
3307 installable: true,
3308 sdk_version: "current",
3309 }
3310
3311 java_library {
3312 name: "static-y",
3313 srcs: ["a.java"],
3314 uses_libs: ["runtime-required-y"],
Jiakai Zhang36937082024-04-15 11:15:50 +00003315 optional_uses_libs: [
3316 "runtime-optional-y",
3317 "missing-lib-a",
3318 ],
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003319 sdk_version: "current",
3320 }
3321
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003322 // A library that has to use "provides_uses_lib", because:
3323 // - it is not an SDK library
3324 // - its library name is different from its module name
3325 java_library {
3326 name: "non-sdk-lib",
3327 provides_uses_lib: "com.non.sdk.lib",
3328 installable: true,
3329 srcs: ["a.java"],
3330 }
3331
Colin Cross50ddcc42019-05-16 12:28:22 -07003332 android_app {
3333 name: "app",
3334 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003335 libs: [
Jihoon Kang28c96572024-09-11 23:44:44 +00003336 "qux.impl",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003337 "quuz.stubs"
3338 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003339 static_libs: [
3340 "static-runtime-helper",
3341 // statically linked component libraries should not pull their SDK libraries,
3342 // so "fred" should not be added to class loader context
3343 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003344 "static-x",
3345 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003346 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003347 uses_libs: [
3348 "foo",
3349 "non-sdk-lib"
3350 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003351 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003352 optional_uses_libs: [
3353 "bar",
Jiakai Zhangf98da192024-04-15 11:15:41 +00003354 "missing-lib-b",
Colin Cross50ddcc42019-05-16 12:28:22 -07003355 ],
3356 }
3357
3358 android_app_import {
3359 name: "prebuilt",
3360 apk: "prebuilts/apk/app.apk",
3361 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003362 uses_libs: [
3363 "foo",
3364 "non-sdk-lib",
3365 "android.test.runner"
3366 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07003367 optional_uses_libs: [
3368 "bar",
Jiakai Zhangf98da192024-04-15 11:15:41 +00003369 "missing-lib-b",
Colin Cross50ddcc42019-05-16 12:28:22 -07003370 ],
3371 }
3372 `
3373
Paul Duffin71ae5942021-03-22 15:36:52 +00003374 result := android.GroupFixturePreparers(
3375 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003376 PrepareForTestWithJavaSdkLibraryFiles,
3377 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Jiakai Zhang48203e32023-06-02 23:42:21 +01003378 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3379 variables.BuildWarningBadOptionalUsesLibsAllowlist = []string{"app", "prebuilt"}
3380 }),
Paul Duffind234b412021-03-12 23:04:46 +00003381 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07003382
Paul Duffind234b412021-03-12 23:04:46 +00003383 app := result.ModuleForTests("app", "android_common")
3384 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07003385
Paul Duffin859fe962020-05-15 10:20:31 +01003386 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003387 // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be
3388 // propagated from dependencies.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003389 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
Jiyong Parkd044bb42024-05-15 02:09:54 +09003390 expectManifestFixerArgs := `--extract-native-libs=true ` +
3391 `--uses-library foo ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003392 `--uses-library com.non.sdk.lib ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003393 `--uses-library qux ` +
3394 `--uses-library quuz ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003395 `--uses-library runtime-library ` +
3396 `--uses-library runtime-required-x ` +
3397 `--uses-library runtime-required-y ` +
3398 `--optional-uses-library bar ` +
3399 `--optional-uses-library runtime-optional-x ` +
3400 `--optional-uses-library runtime-optional-y`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003401 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01003402
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003403 // Test that all libraries are verified (library order matters).
3404 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
3405 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00003406 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003407 `--uses-library qux ` +
3408 `--uses-library quuz ` +
3409 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003410 `--uses-library runtime-required-x ` +
3411 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003412 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003413 `--optional-uses-library runtime-optional-x ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003414 `--optional-uses-library runtime-optional-y ` +
Jiakai Zhang36937082024-04-15 11:15:50 +00003415 `--missing-optional-uses-library missing-lib-b ` +
3416 `--missing-optional-uses-library missing-lib-a`
Paul Duffind234b412021-03-12 23:04:46 +00003417 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003418
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003419 // Test that all libraries are verified for an APK (library order matters).
3420 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00003421 verifyApkArgs := `--uses-library foo ` +
3422 `--uses-library com.non.sdk.lib ` +
3423 `--uses-library android.test.runner ` +
3424 `--optional-uses-library bar ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003425 `--missing-optional-uses-library missing-lib-b `
Paul Duffind234b412021-03-12 23:04:46 +00003426 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003427
Jiakai Zhanga4496782023-05-17 16:57:30 +01003428 // Test that necessary args are passed for constructing CLC in Ninja phase.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003429 cmd := app.Rule("dexpreopt").RuleParams.Command
Jiakai Zhanga4496782023-05-17 16:57:30 +01003430 android.AssertStringDoesContain(t, "dexpreopt app cmd context", cmd, "--context-json=")
3431 android.AssertStringDoesContain(t, "dexpreopt app cmd product_packages", cmd,
Spandan Das2069c3f2023-12-06 19:40:24 +00003432 "--product-packages=out/soong/.intermediates/app/android_common/dexpreopt/app/product_packages.txt")
Colin Cross50ddcc42019-05-16 12:28:22 -07003433}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003434
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003435func TestDexpreoptBcp(t *testing.T) {
3436 bp := `
3437 java_sdk_library {
3438 name: "foo",
3439 srcs: ["a.java"],
3440 api_packages: ["foo"],
3441 sdk_version: "current",
3442 }
3443
3444 java_sdk_library {
3445 name: "bar",
3446 srcs: ["a.java"],
3447 api_packages: ["bar"],
3448 permitted_packages: ["bar"],
3449 sdk_version: "current",
3450 }
3451
3452 android_app {
3453 name: "app",
3454 srcs: ["a.java"],
3455 sdk_version: "current",
3456 }
3457 `
3458
3459 testCases := []struct {
3460 name string
3461 with bool
3462 expect string
3463 }{
3464 {
3465 name: "with updatable bcp",
3466 with: true,
3467 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
3468 },
3469 {
3470 name: "without updatable bcp",
3471 with: false,
3472 expect: "/system/framework/foo.jar",
3473 },
3474 }
3475
3476 for _, test := range testCases {
3477 t.Run(test.name, func(t *testing.T) {
3478 result := android.GroupFixturePreparers(
3479 prepareForJavaTest,
3480 PrepareForTestWithJavaSdkLibraryFiles,
3481 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
3482 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01003483 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003484 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
3485 ).RunTestWithBp(t, bp)
3486
3487 app := result.ModuleForTests("app", "android_common")
3488 cmd := app.Rule("dexpreopt").RuleParams.Command
3489 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
3490 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
3491 })
3492 }
3493}
3494
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003495func TestCodelessApp(t *testing.T) {
3496 testCases := []struct {
3497 name string
3498 bp string
3499 noCode bool
3500 }{
3501 {
3502 name: "normal",
3503 bp: `
3504 android_app {
3505 name: "foo",
3506 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003507 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003508 }
3509 `,
3510 noCode: false,
3511 },
3512 {
3513 name: "app without sources",
3514 bp: `
3515 android_app {
3516 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003517 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003518 }
3519 `,
3520 noCode: true,
3521 },
3522 {
3523 name: "app with libraries",
3524 bp: `
3525 android_app {
3526 name: "foo",
3527 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003528 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003529 }
3530
3531 java_library {
3532 name: "lib",
3533 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003534 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003535 }
3536 `,
3537 noCode: false,
3538 },
3539 {
3540 name: "app with sourceless libraries",
3541 bp: `
3542 android_app {
3543 name: "foo",
3544 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003545 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003546 }
3547
3548 java_library {
3549 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003550 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003551 }
3552 `,
3553 // TODO(jungjw): this should probably be true
3554 noCode: false,
3555 },
3556 }
3557
3558 for _, test := range testCases {
3559 t.Run(test.name, func(t *testing.T) {
3560 ctx := testApp(t, test.bp)
3561
3562 foo := ctx.ModuleForTests("foo", "android_common")
3563 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3564 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
3565 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
3566 }
3567 })
3568 }
3569}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07003570
Colin Cross53a87f52019-06-25 13:35:30 -07003571func TestUncompressDex(t *testing.T) {
3572 testCases := []struct {
3573 name string
3574 bp string
3575
3576 uncompressedPlatform bool
3577 uncompressedUnbundled bool
3578 }{
3579 {
3580 name: "normal",
3581 bp: `
3582 android_app {
3583 name: "foo",
3584 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003585 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003586 }
3587 `,
3588 uncompressedPlatform: true,
3589 uncompressedUnbundled: false,
3590 },
3591 {
3592 name: "use_embedded_dex",
3593 bp: `
3594 android_app {
3595 name: "foo",
3596 use_embedded_dex: true,
3597 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003598 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003599 }
3600 `,
3601 uncompressedPlatform: true,
3602 uncompressedUnbundled: true,
3603 },
3604 {
3605 name: "privileged",
3606 bp: `
3607 android_app {
3608 name: "foo",
3609 privileged: true,
3610 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003611 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003612 }
3613 `,
3614 uncompressedPlatform: true,
3615 uncompressedUnbundled: true,
3616 },
David Srbeckye033cba2020-05-20 22:20:28 +01003617 {
3618 name: "normal_uncompress_dex_true",
3619 bp: `
3620 android_app {
3621 name: "foo",
3622 srcs: ["a.java"],
3623 sdk_version: "current",
3624 uncompress_dex: true,
3625 }
3626 `,
3627 uncompressedPlatform: true,
3628 uncompressedUnbundled: true,
3629 },
3630 {
3631 name: "normal_uncompress_dex_false",
3632 bp: `
3633 android_app {
3634 name: "foo",
3635 srcs: ["a.java"],
3636 sdk_version: "current",
3637 uncompress_dex: false,
3638 }
3639 `,
3640 uncompressedPlatform: false,
3641 uncompressedUnbundled: false,
3642 },
Colin Cross53a87f52019-06-25 13:35:30 -07003643 }
3644
3645 test := func(t *testing.T, bp string, want bool, unbundled bool) {
3646 t.Helper()
3647
Paul Duffin71ae5942021-03-22 15:36:52 +00003648 result := android.GroupFixturePreparers(
3649 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003650 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00003651 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3652 if unbundled {
3653 variables.Unbundled_build = proptools.BoolPtr(true)
3654 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
3655 }
3656 }),
3657 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07003658
Paul Duffincdb88a92021-03-14 00:36:50 +00003659 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07003660 dex := foo.Rule("r8")
3661 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
3662 aligned := foo.MaybeRule("zipalign").Rule != nil
3663
Paul Duffincdb88a92021-03-14 00:36:50 +00003664 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07003665
Paul Duffincdb88a92021-03-14 00:36:50 +00003666 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07003667 }
3668
3669 for _, tt := range testCases {
3670 t.Run(tt.name, func(t *testing.T) {
3671 t.Run("platform", func(t *testing.T) {
3672 test(t, tt.bp, tt.uncompressedPlatform, false)
3673 })
3674 t.Run("unbundled", func(t *testing.T) {
3675 test(t, tt.bp, tt.uncompressedUnbundled, true)
3676 })
3677 })
3678 }
3679}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003680
3681func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
3682 if expectedValue != "" {
3683 expectedFlag := "--" + flagName + " " + expectedValue
3684 if !strings.Contains(aapt2Flags, expectedFlag) {
3685 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
3686 }
3687 } else {
3688 unexpectedFlag := "--" + flagName
3689 if strings.Contains(aapt2Flags, unexpectedFlag) {
3690 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
3691 }
3692 }
3693}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08003694
Cole Faust9a631312020-10-22 21:05:24 +00003695func TestExportedProguardFlagFiles(t *testing.T) {
3696 ctx, _ := testJava(t, `
3697 android_app {
3698 name: "foo",
3699 sdk_version: "current",
Colin Crosscde55342024-03-27 14:11:51 -07003700 static_libs: [
3701 "lib1",
3702 "lib3",
3703 ],
Cole Faust9a631312020-10-22 21:05:24 +00003704 }
3705
3706 android_library {
3707 name: "lib1",
3708 sdk_version: "current",
3709 optimize: {
3710 proguard_flags_files: ["lib1proguard.cfg"],
Colin Crosscde55342024-03-27 14:11:51 -07003711 },
3712 static_libs: ["lib2"],
3713 }
3714
3715 android_library {
3716 name: "lib2",
3717 sdk_version: "current",
3718 optimize: {
3719 proguard_flags_files: ["lib2proguard.cfg"],
Cole Faust9a631312020-10-22 21:05:24 +00003720 }
3721 }
Colin Crosscde55342024-03-27 14:11:51 -07003722
3723 android_library_import {
3724 name: "lib3",
3725 sdk_version: "current",
3726 aars: ["lib3.aar"],
3727 static_libs: ["lib4"],
3728 }
3729
3730 android_library {
3731 name: "lib4",
3732 sdk_version: "current",
3733 optimize: {
3734 proguard_flags_files: ["lib4proguard.cfg"],
3735 }
3736 }
3737
3738
Cole Faust9a631312020-10-22 21:05:24 +00003739 `)
3740
3741 m := ctx.ModuleForTests("foo", "android_common")
Colin Crosscde55342024-03-27 14:11:51 -07003742 r8 := m.Rule("java.r8")
3743 implicits := r8.Implicits.RelativeToTop().Strings()
3744 android.AssertStringListContains(t, "r8 implicits", implicits, "lib1proguard.cfg")
3745 android.AssertStringListContains(t, "r8 implicits", implicits, "lib2proguard.cfg")
3746 android.AssertStringListContains(t, "r8 implicits", implicits, "lib4proguard.cfg")
3747 android.AssertStringListContains(t, "r8 implicits", implicits, "out/soong/.intermediates/lib3/android_common/aar/proguard.txt")
Cole Faust9a631312020-10-22 21:05:24 +00003748
Colin Crosscde55342024-03-27 14:11:51 -07003749 flags := r8.Args["r8Flags"]
3750 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib1proguard.cfg")
3751 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib2proguard.cfg")
3752 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib4proguard.cfg")
3753 android.AssertStringDoesContain(t, "r8 flags", flags, "-include out/soong/.intermediates/lib3/android_common/aar/proguard.txt")
Cole Faust9a631312020-10-22 21:05:24 +00003754}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003755
3756func TestTargetSdkVersionManifestFixer(t *testing.T) {
3757 platform_sdk_codename := "Tiramisu"
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003758 platform_sdk_version := 33
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003759 testCases := []struct {
3760 name string
3761 targetSdkVersionInBp string
3762 targetSdkVersionExpected string
3763 unbundledBuild bool
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003764 platformSdkFinal bool
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003765 }{
3766 {
3767 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
3768 targetSdkVersionInBp: "30",
3769 targetSdkVersionExpected: "30",
3770 unbundledBuild: false,
3771 },
3772 {
3773 name: "Unbundled build: Android.bp has targetSdkVersion",
3774 targetSdkVersionInBp: "30",
3775 targetSdkVersionExpected: "30",
3776 unbundledBuild: true,
3777 },
3778 {
3779 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3780 targetSdkVersionInBp: platform_sdk_codename,
3781 targetSdkVersionExpected: platform_sdk_codename,
3782 unbundledBuild: false,
3783 },
3784 {
3785 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3786 targetSdkVersionInBp: platform_sdk_codename,
3787 targetSdkVersionExpected: "10000",
3788 unbundledBuild: true,
3789 },
3790
3791 {
3792 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
3793 targetSdkVersionExpected: platform_sdk_codename,
3794 unbundledBuild: false,
3795 },
3796 {
3797 name: "Unbundled build: Android.bp has no targetSdkVersion",
3798 targetSdkVersionExpected: "10000",
3799 unbundledBuild: true,
3800 },
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003801 {
3802 name: "Bundled build in REL branches",
3803 targetSdkVersionExpected: "33",
3804 unbundledBuild: false,
3805 platformSdkFinal: true,
3806 },
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003807 }
3808 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003809 targetSdkVersionTemplate := ""
3810 if testCase.targetSdkVersionInBp != "" {
3811 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, testCase.targetSdkVersionInBp)
3812 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003813 bp := fmt.Sprintf(`
3814 android_app {
3815 name: "foo",
3816 sdk_version: "current",
Spandan Dasca70fc42023-03-01 23:38:49 +00003817 %s
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003818 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003819 `, targetSdkVersionTemplate)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003820 fixture := android.GroupFixturePreparers(
3821 prepareForJavaTest,
3822 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003823 if testCase.platformSdkFinal {
3824 variables.Platform_sdk_final = proptools.BoolPtr(true)
3825 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003826 // explicitly set platform_sdk_codename to make the test deterministic
3827 variables.Platform_sdk_codename = &platform_sdk_codename
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003828 variables.Platform_sdk_version = &platform_sdk_version
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003829 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3830 // create a non-empty list if unbundledBuild==true
3831 if testCase.unbundledBuild {
3832 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3833 }
3834 }),
3835 )
3836
3837 result := fixture.RunTestWithBp(t, bp)
3838 foo := result.ModuleForTests("foo", "android_common")
3839
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003840 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3841 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003842 }
3843}
Colin Cross412436f2022-04-07 17:40:07 -07003844
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003845func TestDefaultAppTargetSdkVersionForUpdatableModules(t *testing.T) {
3846 platform_sdk_codename := "Tiramisu"
3847 platform_sdk_version := 33
3848 testCases := []struct {
3849 name string
3850 platform_sdk_final bool
3851 targetSdkVersionInBp *string
3852 targetSdkVersionExpected *string
3853 updatable bool
3854 }{
3855 {
3856 name: "Non-Updatable Module: Android.bp has older targetSdkVersion",
3857 targetSdkVersionInBp: proptools.StringPtr("29"),
3858 targetSdkVersionExpected: proptools.StringPtr("29"),
3859 updatable: false,
3860 },
3861 {
3862 name: "Updatable Module: Android.bp has older targetSdkVersion",
3863 targetSdkVersionInBp: proptools.StringPtr("30"),
3864 targetSdkVersionExpected: proptools.StringPtr("30"),
3865 updatable: true,
3866 },
3867 {
3868 name: "Updatable Module: Android.bp has no targetSdkVersion",
3869 targetSdkVersionExpected: proptools.StringPtr("10000"),
3870 updatable: true,
3871 },
3872 {
3873 name: "[SDK finalised] Non-Updatable Module: Android.bp has older targetSdkVersion",
3874 platform_sdk_final: true,
3875 targetSdkVersionInBp: proptools.StringPtr("30"),
3876 targetSdkVersionExpected: proptools.StringPtr("30"),
3877 updatable: false,
3878 },
3879 {
3880 name: "[SDK finalised] Updatable Module: Android.bp has older targetSdkVersion",
3881 platform_sdk_final: true,
3882 targetSdkVersionInBp: proptools.StringPtr("30"),
3883 targetSdkVersionExpected: proptools.StringPtr("30"),
3884 updatable: true,
3885 },
3886 {
3887 name: "[SDK finalised] Updatable Module: Android.bp has targetSdkVersion as platform sdk codename",
3888 platform_sdk_final: true,
3889 targetSdkVersionInBp: proptools.StringPtr(platform_sdk_codename),
3890 targetSdkVersionExpected: proptools.StringPtr("33"),
3891 updatable: true,
3892 },
3893 {
3894 name: "[SDK finalised] Updatable Module: Android.bp has no targetSdkVersion",
3895 platform_sdk_final: true,
3896 targetSdkVersionExpected: proptools.StringPtr("33"),
3897 updatable: true,
3898 },
3899 }
3900 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003901 targetSdkVersionTemplate := ""
3902 if testCase.targetSdkVersionInBp != nil {
3903 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, *testCase.targetSdkVersionInBp)
3904 }
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003905 bp := fmt.Sprintf(`
3906 android_app {
3907 name: "foo",
3908 sdk_version: "current",
3909 min_sdk_version: "29",
Spandan Dasca70fc42023-03-01 23:38:49 +00003910 %s
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003911 updatable: %t,
3912 enforce_default_target_sdk_version: %t
3913 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003914 `, targetSdkVersionTemplate, testCase.updatable, testCase.updatable) // enforce default target sdk version if app is updatable
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003915
3916 fixture := android.GroupFixturePreparers(
3917 PrepareForTestWithJavaDefaultModules,
3918 android.PrepareForTestWithAllowMissingDependencies,
3919 android.PrepareForTestWithAndroidMk,
3920 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3921 // explicitly set following platform variables to make the test deterministic
3922 variables.Platform_sdk_final = &testCase.platform_sdk_final
3923 variables.Platform_sdk_version = &platform_sdk_version
3924 variables.Platform_sdk_codename = &platform_sdk_codename
3925 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
Harshit Mahajan18845d02023-01-11 18:39:12 +00003926 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003927 variables.Unbundled_build_apps = []string{"sampleModule"}
3928 }),
3929 )
3930
3931 result := fixture.RunTestWithBp(t, bp)
3932 foo := result.ModuleForTests("foo", "android_common")
3933
3934 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3935 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+*testCase.targetSdkVersionExpected)
3936 }
3937}
3938
3939func TestEnforceDefaultAppTargetSdkVersionFlag(t *testing.T) {
3940 platform_sdk_codename := "Tiramisu"
3941 platform_sdk_version := 33
3942 testCases := []struct {
3943 name string
3944 enforceDefaultTargetSdkVersion bool
3945 expectedError string
3946 platform_sdk_final bool
3947 targetSdkVersionInBp string
3948 targetSdkVersionExpected string
3949 updatable bool
3950 }{
3951 {
3952 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
3953 enforceDefaultTargetSdkVersion: false,
3954 targetSdkVersionInBp: "29",
3955 targetSdkVersionExpected: "29",
3956 updatable: false,
3957 },
3958 {
3959 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3960 enforceDefaultTargetSdkVersion: true,
3961 platform_sdk_final: true,
3962 targetSdkVersionInBp: "current",
3963 targetSdkVersionExpected: "33",
3964 updatable: true,
3965 },
3966 {
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003967 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003968 enforceDefaultTargetSdkVersion: true,
3969 platform_sdk_final: false,
3970 targetSdkVersionInBp: "current",
3971 targetSdkVersionExpected: "10000",
3972 updatable: false,
3973 },
3974 {
3975 name: "Not enforcing Target SDK Version for Updatable app",
3976 enforceDefaultTargetSdkVersion: false,
3977 expectedError: "Updatable apps must enforce default target sdk version",
3978 targetSdkVersionInBp: "29",
3979 targetSdkVersionExpected: "29",
3980 updatable: true,
3981 },
3982 }
3983 for _, testCase := range testCases {
3984 errExpected := testCase.expectedError != ""
3985 bp := fmt.Sprintf(`
3986 android_app {
3987 name: "foo",
3988 enforce_default_target_sdk_version: %t,
3989 sdk_version: "current",
3990 min_sdk_version: "29",
3991 target_sdk_version: "%v",
3992 updatable: %t
3993 }
3994 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp, testCase.updatable)
3995
3996 fixture := android.GroupFixturePreparers(
3997 PrepareForTestWithJavaDefaultModules,
3998 android.PrepareForTestWithAllowMissingDependencies,
3999 android.PrepareForTestWithAndroidMk,
4000 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4001 // explicitly set following platform variables to make the test deterministic
4002 variables.Platform_sdk_final = &testCase.platform_sdk_final
4003 variables.Platform_sdk_version = &platform_sdk_version
4004 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00004005 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00004006 variables.Unbundled_build_apps = []string{"sampleModule"}
4007 }),
4008 )
4009
4010 errorHandler := android.FixtureExpectsNoErrors
4011 if errExpected {
4012 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
4013 }
4014 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
4015
4016 if !errExpected {
4017 foo := result.ModuleForTests("foo", "android_common")
4018 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4019 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4020 }
4021 }
4022}
4023
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004024func TestEnforceDefaultAppTargetSdkVersionFlagForTests(t *testing.T) {
4025 platform_sdk_codename := "Tiramisu"
4026 platform_sdk_version := 33
4027 testCases := []struct {
4028 name string
4029 enforceDefaultTargetSdkVersion bool
4030 expectedError string
4031 platform_sdk_final bool
4032 targetSdkVersionInBp string
4033 targetSdkVersionExpected string
4034 }{
4035 {
4036 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
4037 enforceDefaultTargetSdkVersion: false,
4038 targetSdkVersionInBp: "29",
4039 targetSdkVersionExpected: "29",
4040 },
4041 {
4042 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4043 enforceDefaultTargetSdkVersion: true,
4044 platform_sdk_final: true,
4045 targetSdkVersionInBp: "current",
4046 targetSdkVersionExpected: "33",
4047 },
4048 {
4049 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4050 enforceDefaultTargetSdkVersion: true,
4051 platform_sdk_final: false,
4052 targetSdkVersionInBp: "current",
4053 targetSdkVersionExpected: "10000",
4054 },
4055 }
4056 for _, testCase := range testCases {
4057 errExpected := testCase.expectedError != ""
4058 bp := fmt.Sprintf(`
4059 android_test {
4060 name: "foo",
4061 enforce_default_target_sdk_version: %t,
4062 min_sdk_version: "29",
4063 target_sdk_version: "%v",
4064 }
4065 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp)
4066
4067 fixture := android.GroupFixturePreparers(
4068 PrepareForTestWithJavaDefaultModules,
4069 android.PrepareForTestWithAllowMissingDependencies,
4070 android.PrepareForTestWithAndroidMk,
4071 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4072 // explicitly set following platform variables to make the test deterministic
4073 variables.Platform_sdk_final = &testCase.platform_sdk_final
4074 variables.Platform_sdk_version = &platform_sdk_version
4075 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00004076 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004077 variables.Unbundled_build_apps = []string{"sampleModule"}
4078 }),
4079 )
4080
4081 errorHandler := android.FixtureExpectsNoErrors
4082 if errExpected {
4083 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
4084 }
4085 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
4086
4087 if !errExpected {
4088 foo := result.ModuleForTests("foo", "android_common")
4089 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4090 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4091 }
4092 }
4093}
4094
Colin Cross412436f2022-04-07 17:40:07 -07004095func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
4096 result := android.GroupFixturePreparers(
4097 PrepareForTestWithJavaDefaultModules,
4098 android.PrepareForTestWithAllowMissingDependencies,
4099 android.PrepareForTestWithAndroidMk,
4100 ).RunTestWithBp(t, `
4101 android_app {
4102 name: "foo",
4103 srcs: ["a.java"],
4104 certificate: ":missing_certificate",
4105 sdk_version: "current",
Zyan Wub7550aa2023-05-18 15:46:31 +08004106 }
4107
4108 android_app {
4109 name: "bar",
4110 srcs: ["a.java"],
4111 certificate: ":missing_certificate",
4112 product_specific: true,
4113 sdk_version: "current",
Colin Cross412436f2022-04-07 17:40:07 -07004114 }`)
4115
4116 foo := result.ModuleForTests("foo", "android_common")
4117 fooApk := foo.Output("foo.apk")
4118 if fooApk.Rule != android.ErrorRule {
4119 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
4120 }
4121 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
4122}
Sam Delmerico82602492022-06-10 17:05:42 +00004123
4124func TestAppIncludesJniPackages(t *testing.T) {
4125 ctx := android.GroupFixturePreparers(
4126 PrepareForTestWithJavaDefaultModules,
4127 ).RunTestWithBp(t, `
4128 android_library_import {
4129 name: "aary-nodeps",
4130 aars: ["aary.aar"],
4131 extract_jni: true,
4132 }
4133
4134 android_library {
4135 name: "aary-lib",
4136 sdk_version: "current",
4137 min_sdk_version: "21",
4138 static_libs: ["aary-nodeps"],
4139 }
4140
4141 android_app {
4142 name: "aary-lib-dep",
4143 sdk_version: "current",
4144 min_sdk_version: "21",
4145 manifest: "AndroidManifest.xml",
4146 static_libs: ["aary-lib"],
4147 use_embedded_native_libs: true,
4148 }
4149
4150 android_app {
4151 name: "aary-import-dep",
4152 sdk_version: "current",
4153 min_sdk_version: "21",
4154 manifest: "AndroidManifest.xml",
4155 static_libs: ["aary-nodeps"],
4156 use_embedded_native_libs: true,
4157 }
4158
4159 android_app {
4160 name: "aary-no-use-embedded",
4161 sdk_version: "current",
4162 min_sdk_version: "21",
4163 manifest: "AndroidManifest.xml",
4164 static_libs: ["aary-nodeps"],
4165 }`)
4166
4167 testCases := []struct {
4168 name string
4169 hasPackage bool
4170 }{
4171 {
4172 name: "aary-import-dep",
4173 hasPackage: true,
4174 },
4175 {
4176 name: "aary-lib-dep",
4177 hasPackage: true,
4178 },
4179 {
4180 name: "aary-no-use-embedded",
Jiyong Parkd044bb42024-05-15 02:09:54 +09004181 hasPackage: false,
Sam Delmerico82602492022-06-10 17:05:42 +00004182 },
4183 }
4184
4185 for _, tc := range testCases {
4186 t.Run(tc.name, func(t *testing.T) {
4187 app := ctx.ModuleForTests(tc.name, "android_common")
4188
4189 outputFile := "jnilibs.zip"
4190 jniOutputLibZip := app.MaybeOutput(outputFile)
4191 if jniOutputLibZip.Rule == nil && !tc.hasPackage {
4192 return
4193 }
4194
4195 jniPackage := "arm64-v8a_jni.zip"
4196 inputs := jniOutputLibZip.Inputs
4197 foundPackage := false
4198 for i := 0; i < len(inputs); i++ {
4199 if strings.Contains(inputs[i].String(), jniPackage) {
4200 foundPackage = true
4201 }
4202 }
4203 if foundPackage != tc.hasPackage {
4204 t.Errorf("expected to find %v in %v inputs; inputs = %v", jniPackage, outputFile, inputs)
4205 }
4206 })
4207 }
4208}
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004209
4210func TestTargetSdkVersionMtsTests(t *testing.T) {
4211 platformSdkCodename := "Tiramisu"
4212 android_test := "android_test"
4213 android_test_helper_app := "android_test_helper_app"
4214 bpTemplate := `
4215 %v {
4216 name: "mytest",
Spandan Dasb0410872024-06-25 03:30:03 +00004217 min_sdk_version: "34",
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004218 target_sdk_version: "%v",
4219 test_suites: ["othersuite", "%v"],
4220 }
4221 `
4222 testCases := []struct {
4223 desc string
4224 moduleType string
4225 targetSdkVersionInBp string
4226 targetSdkVersionExpected string
4227 testSuites string
4228 }{
4229 {
4230 desc: "Non-MTS android_test_apps targeting current should not be upgraded to 10000",
4231 moduleType: android_test,
4232 targetSdkVersionInBp: "current",
4233 targetSdkVersionExpected: platformSdkCodename,
4234 testSuites: "non-mts-suite",
4235 },
4236 {
4237 desc: "MTS android_test_apps targeting released sdks should not be upgraded to 10000",
4238 moduleType: android_test,
4239 targetSdkVersionInBp: "29",
4240 targetSdkVersionExpected: "29",
4241 testSuites: "mts-suite",
4242 },
4243 {
4244 desc: "MTS android_test_apps targeting current should be upgraded to 10000",
4245 moduleType: android_test,
4246 targetSdkVersionInBp: "current",
4247 targetSdkVersionExpected: "10000",
4248 testSuites: "mts-suite",
4249 },
4250 {
4251 desc: "MTS android_test_helper_apps targeting current should be upgraded to 10000",
4252 moduleType: android_test_helper_app,
4253 targetSdkVersionInBp: "current",
4254 targetSdkVersionExpected: "10000",
4255 testSuites: "mts-suite",
4256 },
4257 }
4258 fixture := android.GroupFixturePreparers(
4259 prepareForJavaTest,
4260 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4261 variables.Platform_sdk_codename = &platformSdkCodename
4262 variables.Platform_version_active_codenames = []string{platformSdkCodename}
4263 }),
4264 )
4265 for _, testCase := range testCases {
4266 result := fixture.RunTestWithBp(t, fmt.Sprintf(bpTemplate, testCase.moduleType, testCase.targetSdkVersionInBp, testCase.testSuites))
4267 mytest := result.ModuleForTests("mytest", "android_common")
4268 manifestFixerArgs := mytest.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4269 android.AssertStringDoesContain(t, testCase.desc, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4270 }
4271}
Andrei Onea580636b2022-08-17 16:53:46 +00004272
4273func TestPrivappAllowlist(t *testing.T) {
4274 testJavaError(t, "privileged must be set in order to use privapp_allowlist", `
4275 android_app {
4276 name: "foo",
4277 srcs: ["a.java"],
4278 privapp_allowlist: "perms.xml",
4279 }
4280 `)
4281
4282 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
4283 t,
4284 `
4285 android_app {
4286 name: "foo",
4287 srcs: ["a.java"],
Sam Delmerico15809f82023-05-15 17:21:47 -04004288 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
Andrei Onea580636b2022-08-17 16:53:46 +00004289 privileged: true,
Andrei Onea580636b2022-08-17 16:53:46 +00004290 sdk_version: "current",
4291 }
4292 override_android_app {
4293 name: "bar",
4294 base: "foo",
4295 package_name: "com.google.android.foo",
4296 }
4297 `,
4298 )
4299 app := result.ModuleForTests("foo", "android_common")
4300 overrideApp := result.ModuleForTests("foo", "android_common_bar")
4301
Sam Delmerico15809f82023-05-15 17:21:47 -04004302 // verify that privapp allowlist is created for override apps
Andrei Onea580636b2022-08-17 16:53:46 +00004303 overrideApp.Output("out/soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml")
Sam Delmerico15809f82023-05-15 17:21:47 -04004304 expectedAllowlistInput := "privapp_allowlist_com.android.foo.xml"
4305 overrideActualAllowlistInput := overrideApp.Rule("modifyAllowlist").Input.String()
4306 if expectedAllowlistInput != overrideActualAllowlistInput {
4307 t.Errorf("expected override allowlist to be %q; got %q", expectedAllowlistInput, overrideActualAllowlistInput)
Andrei Onea580636b2022-08-17 16:53:46 +00004308 }
4309
4310 // verify that permissions are copied to device
Anton Hansson0e486a42023-06-01 16:38:35 +00004311 app.Output("out/soong/target/product/test_device/system/etc/permissions/foo.xml")
4312 overrideApp.Output("out/soong/target/product/test_device/system/etc/permissions/bar.xml")
Andrei Onea580636b2022-08-17 16:53:46 +00004313}
Sam Delmericob1daccd2023-05-25 14:45:30 -04004314
4315func TestPrivappAllowlistAndroidMk(t *testing.T) {
4316 result := android.GroupFixturePreparers(
4317 PrepareForTestWithJavaDefaultModules,
4318 android.PrepareForTestWithAndroidMk,
4319 ).RunTestWithBp(
4320 t,
4321 `
4322 android_app {
4323 name: "foo",
4324 srcs: ["a.java"],
4325 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
4326 privileged: true,
4327 sdk_version: "current",
4328 }
4329 override_android_app {
4330 name: "bar",
4331 base: "foo",
4332 package_name: "com.google.android.foo",
4333 }
4334 `,
4335 )
4336 baseApp := result.ModuleForTests("foo", "android_common")
4337 overrideApp := result.ModuleForTests("foo", "android_common_bar")
4338
4339 baseAndroidApp := baseApp.Module().(*AndroidApp)
4340 baseEntries := android.AndroidMkEntriesForTest(t, result.TestContext, baseAndroidApp)[0]
4341 android.AssertStringMatches(
4342 t,
4343 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find foo.apk",
4344 baseEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4345 "\\S+foo.apk",
4346 )
4347 android.AssertStringMatches(
4348 t,
4349 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include foo.apk",
4350 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4351 "\\S+foo.apk",
4352 )
4353 android.AssertStringMatches(
4354 t,
4355 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4356 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4357 "\\S+foo.apk:\\S+/target/product/test_device/system/priv-app/foo/foo.apk",
4358 )
4359 android.AssertStringMatches(
4360 t,
4361 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4362 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004363 "privapp_allowlist_com.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/foo.xml",
Sam Delmericob1daccd2023-05-25 14:45:30 -04004364 )
4365
4366 overrideAndroidApp := overrideApp.Module().(*AndroidApp)
4367 overrideEntries := android.AndroidMkEntriesForTest(t, result.TestContext, overrideAndroidApp)[0]
4368 android.AssertStringMatches(
4369 t,
4370 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find bar.apk",
4371 overrideEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4372 "\\S+bar.apk",
4373 )
4374 android.AssertStringMatches(
4375 t,
4376 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include bar.apk",
4377 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4378 "\\S+bar.apk",
4379 )
4380 android.AssertStringMatches(
4381 t,
4382 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4383 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4384 "\\S+bar.apk:\\S+/target/product/test_device/system/priv-app/bar/bar.apk",
4385 )
4386 android.AssertStringMatches(
4387 t,
4388 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4389 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004390 "\\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 -04004391 )
4392}
Sam Delmerico0e0d96e2023-08-18 22:43:28 +00004393
Jihoon Kang84b25892023-12-01 22:01:06 +00004394func TestAppFlagsPackages(t *testing.T) {
Jihoon Kang98ea8362024-07-16 18:20:03 +00004395 ctx := android.GroupFixturePreparers(
4396 prepareForJavaTest,
4397 android.FixtureMergeMockFs(
4398 map[string][]byte{
4399 "res/layout/layout.xml": nil,
4400 "res/values/strings.xml": nil,
4401 "res/values-en-rUS/strings.xml": nil,
4402 },
4403 ),
4404 ).RunTestWithBp(t, `
Jihoon Kang84b25892023-12-01 22:01:06 +00004405 android_app {
4406 name: "foo",
4407 srcs: ["a.java"],
4408 sdk_version: "current",
4409 flags_packages: [
4410 "bar",
4411 "baz",
4412 ],
4413 }
4414 aconfig_declarations {
4415 name: "bar",
Dennis Shen4e7773d2024-01-05 19:06:50 +00004416 package: "com.example.package.bar",
Yu Liu315a53c2024-04-24 16:41:57 +00004417 container: "com.android.foo",
Jihoon Kang84b25892023-12-01 22:01:06 +00004418 srcs: [
4419 "bar.aconfig",
4420 ],
4421 }
4422 aconfig_declarations {
4423 name: "baz",
Dennis Shen4e7773d2024-01-05 19:06:50 +00004424 package: "com.example.package.baz",
Yu Liu315a53c2024-04-24 16:41:57 +00004425 container: "com.android.foo",
Jihoon Kang84b25892023-12-01 22:01:06 +00004426 srcs: [
4427 "baz.aconfig",
4428 ],
4429 }
4430 `)
4431
4432 foo := ctx.ModuleForTests("foo", "android_common")
4433
4434 // android_app module depends on aconfig_declarations listed in flags_packages
4435 android.AssertBoolEquals(t, "foo expected to depend on bar", true,
Jihoon Kang98ea8362024-07-16 18:20:03 +00004436 CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "bar"))
Jihoon Kang84b25892023-12-01 22:01:06 +00004437
4438 android.AssertBoolEquals(t, "foo expected to depend on baz", true,
Jihoon Kang98ea8362024-07-16 18:20:03 +00004439 CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "baz"))
Jihoon Kang84b25892023-12-01 22:01:06 +00004440
4441 aapt2LinkRule := foo.Rule("android/soong/java.aapt2Link")
4442 linkInFlags := aapt2LinkRule.Args["inFlags"]
4443 android.AssertStringDoesContain(t,
4444 "aapt2 link command expected to pass feature flags arguments",
4445 linkInFlags,
4446 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4447 )
Jihoon Kang98ea8362024-07-16 18:20:03 +00004448
4449 aapt2CompileRule := foo.Rule("android/soong/java.aapt2Compile")
4450 compileFlags := aapt2CompileRule.Args["cFlags"]
4451 android.AssertStringDoesContain(t,
4452 "aapt2 compile command expected to pass feature flags arguments",
4453 compileFlags,
4454 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4455 )
Jihoon Kang84b25892023-12-01 22:01:06 +00004456}
Spandan Das0727ba72024-02-13 16:37:43 +00004457
Jihoon Kang9aef7772024-06-14 23:45:06 +00004458func TestAppFlagsPackagesPropagation(t *testing.T) {
4459 ctx := testApp(t, `
4460 aconfig_declarations {
4461 name: "foo",
4462 package: "com.example.package.foo",
4463 container: "com.android.foo",
4464 srcs: [
4465 "foo.aconfig",
4466 ],
4467 }
4468 aconfig_declarations {
4469 name: "bar",
4470 package: "com.example.package.bar",
4471 container: "com.android.bar",
4472 srcs: [
4473 "bar.aconfig",
4474 ],
4475 }
4476 aconfig_declarations {
4477 name: "baz",
4478 package: "com.example.package.baz",
4479 container: "com.android.baz",
4480 srcs: [
4481 "baz.aconfig",
4482 ],
4483 }
4484 android_library {
4485 name: "foo_lib",
4486 srcs: ["a.java"],
4487 sdk_version: "current",
4488 flags_packages: [
4489 "foo",
4490 ],
4491 }
4492 android_library {
4493 name: "bar_lib",
4494 srcs: ["a.java"],
4495 sdk_version: "current",
4496 flags_packages: [
4497 "bar",
4498 ],
4499 }
4500 android_app {
4501 name: "baz_app",
4502 srcs: ["a.java"],
4503 sdk_version: "current",
4504 flags_packages: [
4505 "baz",
4506 ],
4507 static_libs: [
4508 "bar_lib",
4509 ],
4510 libs: [
4511 "foo_lib",
4512 ],
4513 }
4514 `)
4515
4516 bazApp := ctx.ModuleForTests("baz_app", "android_common")
4517
4518 // android_app module depends on aconfig_declarations listed in flags_packages
4519 // and that of static libs, but not libs
4520 aapt2LinkRule := bazApp.Rule("android/soong/java.aapt2Link")
4521 linkInFlags := aapt2LinkRule.Args["inFlags"]
4522 android.AssertStringDoesContain(t,
4523 "aapt2 link command expected to pass feature flags arguments of flags_packages and that of its static libs",
4524 linkInFlags,
4525 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4526 )
4527 android.AssertStringDoesNotContain(t,
4528 "aapt2 link command expected to not pass feature flags arguments of flags_packages of its libs",
4529 linkInFlags,
4530 "--feature-flags @out/soong/.intermediates/foo/intermediate.txt",
4531 )
Colin Cross3bc7ffa2017-11-22 16:19:37 -08004532}
Spandan Das0727ba72024-02-13 16:37:43 +00004533
4534// Test that dexpreopt is disabled if an optional_uses_libs exists, but does not provide an implementation.
4535func TestNoDexpreoptOptionalUsesLibDoesNotHaveImpl(t *testing.T) {
4536 bp := `
4537 java_sdk_library_import {
4538 name: "sdklib_noimpl",
4539 public: {
4540 jars: ["stub.jar"],
4541 },
4542 }
4543 android_app {
4544 name: "app",
4545 srcs: ["a.java"],
4546 sdk_version: "current",
4547 optional_uses_libs: [
4548 "sdklib_noimpl",
4549 ],
4550 }
4551 `
4552 result := prepareForJavaTest.RunTestWithBp(t, bp)
4553 dexpreopt := result.ModuleForTests("app", "android_common").MaybeRule("dexpreopt").Rule
4554 android.AssertBoolEquals(t, "dexpreopt should be disabled if optional_uses_libs does not have an implementation", true, dexpreopt == nil)
4555}
yangbill2af0b6e2024-03-15 09:29:29 +00004556
Ronald Braunsteincdc66f42024-04-12 11:23:19 -07004557func TestTestOnlyApp(t *testing.T) {
4558 t.Parallel()
4559 ctx := android.GroupFixturePreparers(
4560 prepareForJavaTest,
4561 ).RunTestWithBp(t, `
4562 // These should be test-only
4563 android_test {
4564 name: "android-test",
4565 }
4566 android_test_helper_app {
4567 name: "helper-app",
4568 }
4569 override_android_test {
4570 name: "override-test",
4571 base: "android-app",
4572 }
4573 // And these should not be
4574 android_app {
4575 name: "android-app",
4576 srcs: ["b.java"],
4577 sdk_version: "current",
4578 }
4579 `)
4580
4581 expectedTestOnly := []string{
4582 "android-test",
4583 "helper-app",
4584 "override-test",
4585 }
4586
4587 expectedTopLevel := []string{
4588 "android-test",
4589 "override-test",
4590 }
4591
4592 assertTestOnlyAndTopLevel(t, ctx, expectedTestOnly, expectedTopLevel)
4593}
4594
yangbill2af0b6e2024-03-15 09:29:29 +00004595func TestAppStem(t *testing.T) {
4596 ctx := testApp(t, `
4597 android_app {
4598 name: "foo",
4599 srcs: ["a.java"],
4600 stem: "foo-new",
4601 sdk_version: "current",
4602 }`)
4603
4604 foo := ctx.ModuleForTests("foo", "android_common")
4605
4606 outputs := fmt.Sprint(foo.AllOutputs())
4607 if !strings.Contains(outputs, "foo-new.apk") {
4608 t.Errorf("Module output does not contain expected apk %s", "foo-new.apk")
4609 }
4610}
Spandan Dasb9c58352024-05-13 18:29:45 +00004611
4612func TestAppMinSdkVersionOverride(t *testing.T) {
4613 result := android.GroupFixturePreparers(
4614 PrepareForTestWithJavaDefaultModules,
4615 ).RunTestWithBp(t, `
4616 android_app {
4617 name: "com.android.foo",
4618 srcs: ["a.java"],
4619 sdk_version: "current",
4620 min_sdk_version: "31",
4621 updatable: true,
4622 }
4623 override_android_app {
4624 name: "com.android.go.foo",
4625 base: "com.android.foo",
4626 min_sdk_version: "33",
4627 }
4628 `)
4629 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
4630 fooOverride := result.ModuleForTests("com.android.foo", "android_common_com.android.go.foo").Rule("manifestFixer")
4631
4632 android.AssertStringDoesContain(t,
4633 "com.android.foo: expected manifest fixer to set minSdkVersion to T",
4634 foo.BuildParams.Args["args"],
4635 "--minSdkVersion 31",
4636 )
4637 android.AssertStringDoesContain(t,
4638 "com.android.go.foo: expected manifest fixer to set minSdkVersion to T",
4639 fooOverride.BuildParams.Args["args"],
4640 "--minSdkVersion 33",
4641 )
4642
4643}
Alyssa Ketpreechasawat02774e82024-07-04 10:45:04 +00004644
4645func TestNotApplyDefaultUpdatableModuleVersion(t *testing.T) {
4646 result := android.GroupFixturePreparers(
4647 PrepareForTestWithJavaDefaultModules,
4648 ).RunTestWithBp(t, `
4649 android_app {
4650 name: "com.android.foo",
4651 srcs: ["a.java"],
4652 sdk_version: "current",
4653 min_sdk_version: "31",
4654 }
4655 `)
4656 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
4657 android.AssertStringDoesNotContain(t,
4658 "com.android.foo: expected manifest fixer to not set override-placeholder-version",
4659 foo.BuildParams.Args["args"],
4660 "--override-placeholder-version",
4661 )
4662}
4663
4664func TestNotApplyOverrideApexManifestDefaultVersion(t *testing.T) {
4665 result := android.GroupFixturePreparers(
4666 PrepareForTestWithJavaDefaultModules,
4667 android.FixtureMergeEnv(map[string]string{
4668 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4669 }),
4670 ).RunTestWithBp(t, `
4671 android_app {
4672 name: "com.android.foo",
4673 srcs: ["a.java"],
4674 sdk_version: "current",
4675 min_sdk_version: "31",
4676 }
4677 `)
4678 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
4679 android.AssertStringDoesNotContain(t,
4680 "com.android.foo: expected manifest fixer to not set override-placeholder-version",
4681 foo.BuildParams.Args["args"],
4682 "--override-placeholder-version",
4683 )
4684}
Jihoon Kang1c743042024-10-22 21:34:17 +00004685
4686func TestResourcesWithFlagDirectories(t *testing.T) {
4687 result := android.GroupFixturePreparers(
4688 PrepareForTestWithJavaDefaultModules,
4689 android.FixtureMergeMockFs(android.MockFS{
4690 "res/flag(test.package.flag1)/values/bools.xml": nil,
4691 "res/flag(!test.package.flag2)/values/bools.xml": nil,
4692 "res/flag(test.package.flag1)/values-config/strings_google_services.xml": nil,
4693 "res/flags(test.package.flag1)/values/strings.xml": nil,
4694 }),
4695 ).RunTestWithBp(t, `
4696 android_library {
4697 name: "foo",
4698 srcs: ["a.java"],
4699 use_resource_processor: true,
4700 resource_dirs: [
4701 "res",
4702 ],
4703 }
4704 `)
4705 fooModule := result.ModuleForTests("foo", "android_common")
4706 compileOutputPaths := fooModule.Rule("aapt2Compile").Outputs.Strings()
4707
4708 android.AssertStringListContains(
4709 t,
4710 "Expected to generate flag path",
4711 compileOutputPaths,
4712 "out/soong/.intermediates/foo/android_common/aapt2/res/values_bools.(test.package.flag1).arsc.flat",
4713 )
4714 android.AssertStringListContains(
4715 t,
4716 "Expected to generate flag path with ! prefix in name",
4717 compileOutputPaths,
4718 "out/soong/.intermediates/foo/android_common/aapt2/res/values_bools.(!test.package.flag2).arsc.flat",
4719 )
4720 android.AssertStringListContains(
4721 t,
4722 "Expected to generate flag path with configs",
4723 compileOutputPaths,
4724 "out/soong/.intermediates/foo/android_common/aapt2/res/values-config_strings_google_services.(test.package.flag1).arsc.flat",
4725 )
4726 android.AssertStringListDoesNotContain(
4727 t,
4728 "Expected to not generate flag path with non-flag(flag_name) pattern",
4729 compileOutputPaths,
4730 "out/soong/.intermediates/foo/android_common/aapt2/res/values_strings.(test.package.flag1).arsc.flat",
4731 )
4732}
Spandan Dasde588a32024-12-03 22:52:24 +00004733
4734func TestAutogeneratedStaticRro(t *testing.T) {
4735 t.Parallel()
4736 bp := `
4737android_app {
4738 name: "foo",
4739 srcs: ["foo.java"],
4740 platform_apis: true,
4741}
4742override_android_app {
4743 name: "override_foo",
4744 base: "foo",
4745}
4746`
4747 testCases := []struct {
4748 desc string
4749 preparer android.FixturePreparer
4750 overlayApkExpected bool
4751 }{
4752 {
4753 desc: "No DEVICE_PACKAGE_OVERLAYS, no overlay .apk file",
4754 overlayApkExpected: false,
4755 },
4756 {
4757 desc: "DEVICE_PACKAGE_OVERLAYS exists, but the directory is empty",
4758 overlayApkExpected: false,
4759 preparer: android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4760 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4761 }),
4762 },
4763 {
4764 desc: "DEVICE_PACKAGE_OVERLAYS exists, directory is non-empty, but does not contain a matching resource dir",
4765 overlayApkExpected: false,
4766 preparer: android.GroupFixturePreparers(
4767 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4768 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4769 }),
4770 android.MockFS{
4771 "res/foo.xml": nil,
4772 "device/company/test_product/different_res/foo.xml": nil, // different dir
4773 }.AddToFixture(),
4774 ),
4775 },
4776 {
4777 desc: "DEVICE_PACKAGE_OVERLAYS and the directory contain a matching resource dir",
4778 overlayApkExpected: true,
4779 preparer: android.GroupFixturePreparers(
4780 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4781 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4782 }),
4783 android.MockFS{
4784 "res/foo.xml": nil,
4785 "device/company/test_product/res/foo.xml": nil,
4786 }.AddToFixture(),
4787 ),
4788 },
4789 }
4790 for _, tc := range testCases {
4791 result := android.GroupFixturePreparers(
4792 PrepareForTestWithJavaDefaultModules,
4793 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4794 variables.EnforceRROTargets = []string{"*"}
4795 }),
4796 android.OptionalFixturePreparer(tc.preparer),
4797 ).RunTestWithBp(t, bp)
4798 vendorOverlayApk := result.ModuleForTests("foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").MaybeOutput("foo__test_product__auto_generated_rro_vendor.apk")
4799 android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, vendorOverlayApk.Rule != nil)
4800 overrideVendorOverlayApk := result.ModuleForTests("override_foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").MaybeOutput("override_foo__test_product__auto_generated_rro_vendor.apk")
4801 android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, overrideVendorOverlayApk.Rule != nil)
4802 }
4803}
Spandan Dasef8b3b22024-12-04 01:34:34 +00004804
4805func TestNoAutogeneratedStaticRroForDisabledOverrideApps(t *testing.T) {
4806 t.Parallel()
4807 bp := `
4808soong_config_module_type {
4809 name: "my_custom_override_android_app",
4810 module_type: "override_android_app",
4811 config_namespace: "my_namespace",
4812 value_variables: ["my_app_enabled"],
4813 properties: ["enabled"],
4814}
4815soong_config_bool_variable {
4816 name: "my_app_enabled",
4817}
4818android_app {
4819 name: "foo",
4820 srcs: ["foo.java"],
4821 platform_apis: true,
4822}
4823my_custom_override_android_app {
4824 name: "override_foo",
4825 base: "foo",
4826 soong_config_variables: {
4827 my_app_enabled: {
4828 enabled: true,
4829 conditions_default: {
4830 enabled: false
4831 },
4832 },
4833 }
4834}
4835`
4836 testCases := []struct {
4837 desc string
4838 preparer android.FixturePreparer
4839 overlayApkExpected bool
4840 }{
4841 {
4842 desc: "my_app_enabled is empty",
4843 overlayApkExpected: false,
4844 },
4845 {
4846 desc: "my_app_enabled is true",
4847 overlayApkExpected: true,
4848 preparer: android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4849 variables.VendorVars = map[string]map[string]string{
4850 "my_namespace": {
4851 "my_app_enabled": "true",
4852 },
4853 }
4854 }),
4855 },
4856 }
4857 for _, tc := range testCases {
4858 result := android.GroupFixturePreparers(
4859 PrepareForTestWithJavaDefaultModules,
4860 android.PrepareForTestWithSoongConfigModuleBuildComponents,
4861 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4862 variables.EnforceRROTargets = []string{"*"}
4863 }),
4864 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4865 variables.DeviceResourceOverlays = []string{"device/company/test_product"}
4866 }),
4867 android.MockFS{
4868 "res/foo.xml": nil,
4869 "device/company/test_product/res/foo.xml": nil,
4870 }.AddToFixture(),
4871 android.OptionalFixturePreparer(tc.preparer),
4872 ).RunTestWithBp(t, bp)
4873 overrideVendorOverlayApk := result.ModuleForTests("override_foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").Module().(*AutogenRuntimeResourceOverlay)
4874 android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, overrideVendorOverlayApk.exportPackage != nil)
4875 }
4876}