blob: 8474ea7d620666e3e7584542399e0681bb4c44f1 [file] [log] [blame]
Colin Cross3bc7ffa2017-11-22 16:19:37 -08001// Copyright 2017 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package java
16
17import (
Colin Crossd09b0b62018-04-18 11:06:47 -070018 "fmt"
Colin Crossa4f08812018-10-02 22:03:40 -070019 "path/filepath"
Colin Cross3bc7ffa2017-11-22 16:19:37 -080020 "reflect"
Colin Crossb69301e2017-12-01 10:48:26 -080021 "sort"
Colin Crossd09b0b62018-04-18 11:06:47 -070022 "strings"
Colin Cross3bc7ffa2017-11-22 16:19:37 -080023 "testing"
Jaewoong Junga5e5abc2019-04-26 14:31:50 -070024
25 "github.com/google/blueprint/proptools"
26
27 "android/soong/android"
28 "android/soong/cc"
Ulya Trafimovich9023b022021-03-22 16:02:28 +000029 "android/soong/dexpreopt"
Colin Cross3bc7ffa2017-11-22 16:19:37 -080030)
31
Paul Duffin71ae5942021-03-22 15:36:52 +000032// testApp runs tests using the prepareForJavaTest
Paul Duffin0ed42d32021-03-13 02:19:32 +000033//
34// See testJava for an explanation as to how to stop using this deprecated method.
35//
36// deprecated
37func testApp(t *testing.T, bp string) *android.TestContext {
38 t.Helper()
Paul Duffin71ae5942021-03-22 15:36:52 +000039 result := prepareForJavaTest.RunTestWithBp(t, bp)
Paul Duffin0ed42d32021-03-13 02:19:32 +000040 return result.TestContext
41}
42
43func TestApp(t *testing.T) {
44 resourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080045 "res/layout/layout.xml",
46 "res/values/strings.xml",
47 "res/values-en-rUS/strings.xml",
48 }
49
Paul Duffin0ed42d32021-03-13 02:19:32 +000050 compiledResourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080051 "aapt2/res/layout_layout.xml.flat",
52 "aapt2/res/values_strings.arsc.flat",
53 "aapt2/res/values-en-rUS_strings.arsc.flat",
54 }
Colin Cross3bc7ffa2017-11-22 16:19:37 -080055
Colin Crossa97c5d32018-03-28 14:58:31 -070056 for _, moduleType := range []string{"android_app", "android_library"} {
57 t.Run(moduleType, func(t *testing.T) {
Paul Duffin71ae5942021-03-22 15:36:52 +000058 result := android.GroupFixturePreparers(
59 prepareForJavaTest,
Paul Duffin0ed42d32021-03-13 02:19:32 +000060 android.FixtureModifyMockFS(func(fs android.MockFS) {
61 for _, file := range resourceFiles {
62 fs[file] = nil
63 }
64 }),
65 ).RunTestWithBp(t, moduleType+` {
Colin Crossa97c5d32018-03-28 14:58:31 -070066 name: "foo",
67 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090068 sdk_version: "current"
Colin Crossa97c5d32018-03-28 14:58:31 -070069 }
70 `)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080071
Paul Duffin0ed42d32021-03-13 02:19:32 +000072 foo := result.ModuleForTests("foo", "android_common")
Colin Cross3bc7ffa2017-11-22 16:19:37 -080073
Colin Cross31656952018-05-24 16:11:20 -070074 var expectedLinkImplicits []string
75
76 manifestFixer := foo.Output("manifest_fixer/AndroidManifest.xml")
77 expectedLinkImplicits = append(expectedLinkImplicits, manifestFixer.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080078
Paul Duffin0ed42d32021-03-13 02:19:32 +000079 frameworkRes := result.ModuleForTests("framework-res", "android_common")
Colin Crossa97c5d32018-03-28 14:58:31 -070080 expectedLinkImplicits = append(expectedLinkImplicits,
81 frameworkRes.Output("package-res.apk").Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080082
Colin Crossa97c5d32018-03-28 14:58:31 -070083 // Test the mapping from input files to compiled output file names
84 compile := foo.Output(compiledResourceFiles[0])
Paul Duffin0ed42d32021-03-13 02:19:32 +000085 android.AssertDeepEquals(t, "aapt2 compile inputs", resourceFiles, compile.Inputs.Strings())
Colin Crossb69301e2017-12-01 10:48:26 -080086
Colin Crossa97c5d32018-03-28 14:58:31 -070087 compiledResourceOutputs := compile.Outputs.Strings()
88 sort.Strings(compiledResourceOutputs)
Colin Crossb69301e2017-12-01 10:48:26 -080089
Colin Crossa97c5d32018-03-28 14:58:31 -070090 expectedLinkImplicits = append(expectedLinkImplicits, compiledResourceOutputs...)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080091
Colin Crossa97c5d32018-03-28 14:58:31 -070092 list := foo.Output("aapt2/res.list")
93 expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080094
Colin Crossa97c5d32018-03-28 14:58:31 -070095 // Check that the link rule uses
Paul Duffin0ed42d32021-03-13 02:19:32 +000096 res := result.ModuleForTests("foo", "android_common").Output("package-res.apk")
97 android.AssertDeepEquals(t, "aapt2 link implicits", expectedLinkImplicits, res.Implicits.Strings())
Colin Crossa97c5d32018-03-28 14:58:31 -070098 })
Colin Cross3bc7ffa2017-11-22 16:19:37 -080099 }
100}
Colin Cross890ff552017-11-30 20:13:19 -0800101
Colin Crosse560c4a2019-03-19 16:03:11 -0700102func TestAppSplits(t *testing.T) {
103 ctx := testApp(t, `
104 android_app {
105 name: "foo",
106 srcs: ["a.java"],
107 package_splits: ["v4", "v7,hdpi"],
Jeongik Cha538c0d02019-07-11 15:54:27 +0900108 sdk_version: "current"
Colin Crosse560c4a2019-03-19 16:03:11 -0700109 }`)
110
111 foo := ctx.ModuleForTests("foo", "android_common")
112
113 expectedOutputs := []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000114 "out/soong/.intermediates/foo/android_common/foo.apk",
115 "out/soong/.intermediates/foo/android_common/foo_v4.apk",
116 "out/soong/.intermediates/foo/android_common/foo_v7_hdpi.apk",
Colin Crosse560c4a2019-03-19 16:03:11 -0700117 }
118 for _, expectedOutput := range expectedOutputs {
119 foo.Output(expectedOutput)
120 }
121
Colin Cross41955e82019-05-29 14:40:35 -0700122 outputFiles, err := foo.Module().(*AndroidApp).OutputFiles("")
123 if err != nil {
124 t.Fatal(err)
125 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000126 android.AssertPathsRelativeToTopEquals(t, `OutputFiles("")`, expectedOutputs, outputFiles)
Colin Crosse560c4a2019-03-19 16:03:11 -0700127}
128
Jeongik Cha538c0d02019-07-11 15:54:27 +0900129func TestPlatformAPIs(t *testing.T) {
130 testJava(t, `
131 android_app {
132 name: "foo",
133 srcs: ["a.java"],
134 platform_apis: true,
135 }
136 `)
137
138 testJava(t, `
139 android_app {
140 name: "foo",
141 srcs: ["a.java"],
142 sdk_version: "current",
143 }
144 `)
145
Spandan Das60999342021-11-16 04:15:33 +0000146 testJavaError(t, "This module has conflicting settings. sdk_version is empty, which means that this module is build against platform APIs. However platform_apis is not set to true", `
Jeongik Cha538c0d02019-07-11 15:54:27 +0900147 android_app {
148 name: "bar",
149 srcs: ["b.java"],
150 }
151 `)
152
Spandan Das60999342021-11-16 04:15:33 +0000153 testJavaError(t, "This module has conflicting settings. sdk_version is not empty, which means this module cannot use platform APIs. However platform_apis is set to true.", `
Jeongik Cha538c0d02019-07-11 15:54:27 +0900154 android_app {
155 name: "bar",
156 srcs: ["b.java"],
157 sdk_version: "system_current",
158 platform_apis: true,
159 }
160 `)
161}
162
Jeongik Chae403e9e2019-12-07 00:16:24 +0900163func TestAndroidAppLinkType(t *testing.T) {
164 testJava(t, `
165 android_app {
166 name: "foo",
167 srcs: ["a.java"],
168 libs: ["bar"],
169 static_libs: ["baz"],
170 platform_apis: true,
171 }
172
173 java_library {
174 name: "bar",
175 sdk_version: "current",
176 srcs: ["b.java"],
177 }
178
179 android_library {
180 name: "baz",
181 sdk_version: "system_current",
182 srcs: ["c.java"],
183 }
184 `)
185
Steven Moreland00298982020-11-17 21:44:36 +0000186 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900187 android_app {
188 name: "foo",
189 srcs: ["a.java"],
190 libs: ["bar"],
191 sdk_version: "current",
192 static_libs: ["baz"],
193 }
194
195 java_library {
196 name: "bar",
197 sdk_version: "current",
198 srcs: ["b.java"],
199 }
200
201 android_library {
202 name: "baz",
203 sdk_version: "system_current",
204 srcs: ["c.java"],
205 }
206 `)
207
208 testJava(t, `
209 android_app {
210 name: "foo",
211 srcs: ["a.java"],
212 libs: ["bar"],
213 sdk_version: "system_current",
214 static_libs: ["baz"],
215 }
216
217 java_library {
218 name: "bar",
219 sdk_version: "current",
220 srcs: ["b.java"],
221 }
222
223 android_library {
224 name: "baz",
225 sdk_version: "system_current",
226 srcs: ["c.java"],
227 }
228 `)
229
Steven Moreland00298982020-11-17 21:44:36 +0000230 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900231 android_app {
232 name: "foo",
233 srcs: ["a.java"],
234 libs: ["bar"],
235 sdk_version: "system_current",
236 static_libs: ["baz"],
237 }
238
239 java_library {
240 name: "bar",
241 sdk_version: "current",
242 srcs: ["b.java"],
243 }
244
245 android_library {
246 name: "baz",
247 srcs: ["c.java"],
248 }
249 `)
250}
251
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100252func TestUpdatableApps(t *testing.T) {
253 testCases := []struct {
254 name string
255 bp string
256 expectedError string
257 }{
258 {
259 name: "Stable public SDK",
260 bp: `android_app {
261 name: "foo",
262 srcs: ["a.java"],
263 sdk_version: "29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100264 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100265 updatable: true,
266 }`,
267 },
268 {
269 name: "Stable system SDK",
270 bp: `android_app {
271 name: "foo",
272 srcs: ["a.java"],
273 sdk_version: "system_29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100274 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100275 updatable: true,
276 }`,
277 },
278 {
279 name: "Current public SDK",
280 bp: `android_app {
281 name: "foo",
282 srcs: ["a.java"],
283 sdk_version: "current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100284 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100285 updatable: true,
286 }`,
287 },
288 {
289 name: "Current system SDK",
290 bp: `android_app {
291 name: "foo",
292 srcs: ["a.java"],
293 sdk_version: "system_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100294 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100295 updatable: true,
296 }`,
297 },
298 {
299 name: "Current module SDK",
300 bp: `android_app {
301 name: "foo",
302 srcs: ["a.java"],
303 sdk_version: "module_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100304 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100305 updatable: true,
306 }`,
307 },
308 {
309 name: "Current core SDK",
310 bp: `android_app {
311 name: "foo",
312 srcs: ["a.java"],
313 sdk_version: "core_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100314 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100315 updatable: true,
316 }`,
317 },
318 {
319 name: "No Platform APIs",
320 bp: `android_app {
321 name: "foo",
322 srcs: ["a.java"],
323 platform_apis: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100324 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100325 updatable: true,
326 }`,
327 expectedError: "Updatable apps must use stable SDKs",
328 },
329 {
330 name: "No Core Platform APIs",
331 bp: `android_app {
332 name: "foo",
333 srcs: ["a.java"],
334 sdk_version: "core_platform",
Artur Satayevf40fc852020-04-16 13:43:02 +0100335 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100336 updatable: true,
337 }`,
338 expectedError: "Updatable apps must use stable SDKs",
339 },
340 {
341 name: "No unspecified APIs",
342 bp: `android_app {
343 name: "foo",
344 srcs: ["a.java"],
345 updatable: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100346 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100347 }`,
348 expectedError: "Updatable apps must use stable SDK",
349 },
Artur Satayevf40fc852020-04-16 13:43:02 +0100350 {
351 name: "Must specify min_sdk_version",
352 bp: `android_app {
353 name: "app_without_min_sdk_version",
354 srcs: ["a.java"],
355 sdk_version: "29",
356 updatable: true,
357 }`,
358 expectedError: "updatable apps must set min_sdk_version.",
359 },
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100360 }
361
362 for _, test := range testCases {
363 t.Run(test.name, func(t *testing.T) {
Paul Duffincdb88a92021-03-14 00:36:50 +0000364 errorHandler := android.FixtureExpectsNoErrors
365 if test.expectedError != "" {
366 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100367 }
Paul Duffin71ae5942021-03-22 15:36:52 +0000368 android.GroupFixturePreparers(
369 prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{
Paul Duffin2645a292021-03-13 02:36:00 +0000370 "29": {"foo"},
371 })).
Paul Duffincdb88a92021-03-14 00:36:50 +0000372 ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, test.bp)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100373 })
374 }
375}
376
Jooyung Han749dc692020-04-15 11:03:39 +0900377func TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) {
378 testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+`
379 android_app {
380 name: "foo",
381 srcs: ["a.java"],
382 updatable: true,
383 sdk_version: "current",
384 min_sdk_version: "29",
385 static_libs: ["bar"],
386 }
387
388 java_library {
389 name: "bar",
390 sdk_version: "current",
391 }
392 `)
393}
394
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900395func TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) {
396 testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
397 android_app {
398 name: "foo",
399 srcs: ["a.java"],
400 updatable: true,
401 sdk_version: "current",
402 min_sdk_version: "current",
403 jni_libs: ["libjni"],
404 }
405
406 cc_library {
407 name: "libjni",
408 stl: "none",
409 system_shared_libs: [],
410 sdk_version: "current",
411 }
412 `)
413}
414
415func TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) {
416 bp := cc.GatherRequiredDepsForTest(android.Android) + `
417 android_app {
418 name: "foo",
419 srcs: ["a.java"],
420 updatable: true,
421 sdk_version: "current",
422 min_sdk_version: "29",
423 jni_libs: ["libjni"],
424 }
425
426 cc_library {
427 name: "libjni",
428 stl: "none",
429 system_shared_libs: [],
Spandan Das2e8c0442022-05-08 00:39:35 +0000430 sdk_version: "current",
431 min_sdk_version: "29",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900432 }
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900433 `
434 fs := map[string][]byte{
435 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
436 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil,
437 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil,
438 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil,
439 }
440
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000441 ctx, _ := testJavaWithFS(t, bp, fs)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900442
443 inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
444 var crtbeginFound, crtendFound bool
Dan Albert92fe7402020-07-15 13:33:30 -0700445 expectedCrtBegin := ctx.ModuleForTests("crtbegin_so",
Colin Crossdea1d032022-12-06 14:50:08 -0800446 "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
Dan Albert92fe7402020-07-15 13:33:30 -0700447 expectedCrtEnd := ctx.ModuleForTests("crtend_so",
Colin Crossdea1d032022-12-06 14:50:08 -0800448 "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
Dan Albert92fe7402020-07-15 13:33:30 -0700449 implicits := []string{}
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900450 for _, input := range inputs {
Dan Albert92fe7402020-07-15 13:33:30 -0700451 implicits = append(implicits, input.String())
452 if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900453 crtbeginFound = true
Dan Albert92fe7402020-07-15 13:33:30 -0700454 } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900455 crtendFound = true
456 }
457 }
Dan Albert92fe7402020-07-15 13:33:30 -0700458 if !crtbeginFound {
459 t.Error(fmt.Sprintf(
460 "expected implicit with suffix %q, have the following implicits:\n%s",
461 expectedCrtBegin, strings.Join(implicits, "\n")))
462 }
463 if !crtendFound {
464 t.Error(fmt.Sprintf(
465 "expected implicit with suffix %q, have the following implicits:\n%s",
466 expectedCrtEnd, strings.Join(implicits, "\n")))
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900467 }
468}
469
470func TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
471 bp := cc.GatherRequiredDepsForTest(android.Android) + `
472 android_app {
473 name: "foo",
474 srcs: ["a.java"],
475 updatable: true,
476 sdk_version: "current",
477 min_sdk_version: "29", // this APK should support 29
478 jni_libs: ["libjni"],
479 }
480
481 cc_library {
482 name: "libjni",
483 stl: "none",
484 sdk_version: "current",
Spandan Das2e8c0442022-05-08 00:39:35 +0000485 min_sdk_version: "current",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900486 }
487 `
Spandan Das2e8c0442022-05-08 00:39:35 +0000488 testJavaError(t, `"libjni" .*: min_sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900489}
490
Spandan Das2e8c0442022-05-08 00:39:35 +0000491func TestUpdatableApps_ErrorIfDepMinSdkVersionIsHigher(t *testing.T) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900492 bp := cc.GatherRequiredDepsForTest(android.Android) + `
493 android_app {
494 name: "foo",
495 srcs: ["a.java"],
496 updatable: true,
497 sdk_version: "current",
498 min_sdk_version: "29", // this APK should support 29
499 jni_libs: ["libjni"],
500 }
501
502 cc_library {
503 name: "libjni",
504 stl: "none",
505 shared_libs: ["libbar"],
506 system_shared_libs: [],
507 sdk_version: "27",
Spandan Das2e8c0442022-05-08 00:39:35 +0000508 min_sdk_version: "27",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900509 }
510
511 cc_library {
512 name: "libbar",
513 stl: "none",
514 system_shared_libs: [],
515 sdk_version: "current",
Spandan Das2e8c0442022-05-08 00:39:35 +0000516 min_sdk_version: "current",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900517 }
518 `
519 testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
520}
521
Colin Cross0ddae7f2019-02-07 15:30:01 -0800522func TestResourceDirs(t *testing.T) {
523 testCases := []struct {
524 name string
525 prop string
526 resources []string
527 }{
528 {
529 name: "no resource_dirs",
530 prop: "",
531 resources: []string{"res/res/values/strings.xml"},
532 },
533 {
534 name: "resource_dirs",
535 prop: `resource_dirs: ["res"]`,
536 resources: []string{"res/res/values/strings.xml"},
537 },
538 {
539 name: "empty resource_dirs",
540 prop: `resource_dirs: []`,
541 resources: nil,
542 },
543 }
544
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000545 fs := android.MockFS{
Colin Cross0ddae7f2019-02-07 15:30:01 -0800546 "res/res/values/strings.xml": nil,
547 }
548
549 bp := `
550 android_app {
551 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900552 sdk_version: "current",
Colin Cross0ddae7f2019-02-07 15:30:01 -0800553 %s
554 }
555 `
556
557 for _, testCase := range testCases {
558 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000559 result := android.GroupFixturePreparers(
560 PrepareForTestWithJavaDefaultModules,
561 PrepareForTestWithOverlayBuildComponents,
562 fs.AddToFixture(),
563 ).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop))
Colin Cross0ddae7f2019-02-07 15:30:01 -0800564
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000565 module := result.ModuleForTests("foo", "android_common")
Colin Cross0ddae7f2019-02-07 15:30:01 -0800566 resourceList := module.MaybeOutput("aapt2/res.list")
567
568 var resources []string
569 if resourceList.Rule != nil {
570 for _, compiledResource := range resourceList.Inputs.Strings() {
571 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
572 }
573 }
574
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000575 android.AssertDeepEquals(t, "resource files", testCase.resources, resources)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800576 })
577 }
578}
579
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800580func TestLibraryAssets(t *testing.T) {
581 bp := `
582 android_app {
583 name: "foo",
584 sdk_version: "current",
585 static_libs: ["lib1", "lib2", "lib3"],
586 }
587
588 android_library {
589 name: "lib1",
590 sdk_version: "current",
591 asset_dirs: ["assets_a"],
592 }
593
594 android_library {
595 name: "lib2",
596 sdk_version: "current",
597 }
598
599 android_library {
600 name: "lib3",
601 sdk_version: "current",
Colin Crossab8d1382023-07-14 17:23:41 +0000602 static_libs: ["lib4", "import"],
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800603 }
604
605 android_library {
606 name: "lib4",
607 sdk_version: "current",
608 asset_dirs: ["assets_b"],
609 }
Colin Crossab8d1382023-07-14 17:23:41 +0000610
611 android_library_import {
612 name: "import",
613 sdk_version: "current",
614 aars: ["import.aar"],
615 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800616 `
617
618 testCases := []struct {
619 name string
620 assetFlag string
621 assetPackages []string
622 }{
623 {
624 name: "foo",
Colin Crossab8d1382023-07-14 17:23:41 +0000625 // lib1 has its own assets. lib3 doesn't have any, but lib4 and import have assets.
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800626 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000627 "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
628 "out/soong/.intermediates/lib1/android_common/assets.zip",
Colin Crossab8d1382023-07-14 17:23:41 +0000629 "out/soong/.intermediates/lib4/android_common/assets.zip",
630 "out/soong/.intermediates/import/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800631 },
632 },
633 {
634 name: "lib1",
635 assetFlag: "-A assets_a",
636 },
637 {
638 name: "lib2",
639 },
640 {
641 name: "lib3",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800642 },
643 {
644 name: "lib4",
645 assetFlag: "-A assets_b",
646 },
647 }
648 ctx := testApp(t, bp)
649
650 for _, test := range testCases {
651 t.Run(test.name, func(t *testing.T) {
652 m := ctx.ModuleForTests(test.name, "android_common")
653
654 // Check asset flag in aapt2 link flags
655 var aapt2link android.TestingBuildParams
656 if len(test.assetPackages) > 0 {
657 aapt2link = m.Output("aapt2/package-res.apk")
658 } else {
659 aapt2link = m.Output("package-res.apk")
660 }
Paul Duffina71a67a2021-03-29 00:42:57 +0100661 aapt2link = aapt2link
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800662 aapt2Flags := aapt2link.Args["flags"]
663 if test.assetFlag != "" {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000664 android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800665 } else {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000666 android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800667 }
668
669 // Check asset merge rule.
670 if len(test.assetPackages) > 0 {
671 mergeAssets := m.Output("package-res.apk")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000672 android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800673 }
674 })
675 }
676}
677
Colin Crossb014f072021-02-26 14:54:36 -0800678func TestAppJavaResources(t *testing.T) {
679 bp := `
680 android_app {
681 name: "foo",
682 sdk_version: "current",
683 java_resources: ["resources/a"],
684 srcs: ["a.java"],
685 }
686
687 android_app {
688 name: "bar",
689 sdk_version: "current",
690 java_resources: ["resources/a"],
691 }
692 `
693
694 ctx := testApp(t, bp)
695
696 foo := ctx.ModuleForTests("foo", "android_common")
697 fooResources := foo.Output("res/foo.jar")
698 fooDexJar := foo.Output("dex-withres/foo.jar")
699 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
700 fooApk := foo.Rule("combineApk")
701
702 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
703 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
704 }
705
706 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
707 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
708 }
709
710 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
711 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
712 }
713
714 bar := ctx.ModuleForTests("bar", "android_common")
715 barResources := bar.Output("res/bar.jar")
716 barApk := bar.Rule("combineApk")
717
718 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
719 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
720 }
721}
722
Colin Crossff3ff7f2023-07-05 14:04:12 -0700723func TestAndroidResourceProcessor(t *testing.T) {
724 testCases := []struct {
Colin Cross4eae06d2023-06-20 22:40:02 -0700725 name string
726 appUsesRP bool
727 directLibUsesRP bool
728 transitiveLibUsesRP bool
Colin Crossff3ff7f2023-07-05 14:04:12 -0700729
730 dontVerifyApp bool
731 appResources []string
732 appOverlays []string
733 appImports []string
734 appSrcJars []string
735 appClasspath []string
736 appCombined []string
737
738 dontVerifyDirect bool
739 directResources []string
740 directOverlays []string
741 directImports []string
742 directSrcJars []string
743 directClasspath []string
744 directCombined []string
745
746 dontVerifyTransitive bool
747 transitiveResources []string
748 transitiveOverlays []string
749 transitiveImports []string
750 transitiveSrcJars []string
751 transitiveClasspath []string
752 transitiveCombined []string
753
754 dontVerifyDirectImport bool
755 directImportResources []string
756 directImportOverlays []string
757 directImportImports []string
758
759 dontVerifyTransitiveImport bool
760 transitiveImportResources []string
761 transitiveImportOverlays []string
762 transitiveImportImports []string
763 }{
764 {
Colin Cross4eae06d2023-06-20 22:40:02 -0700765 // Test with all modules set to use_resource_processor: false (except android_library_import modules,
766 // which always use resource processor).
767 name: "legacy",
768 appUsesRP: false,
769 directLibUsesRP: false,
770 transitiveLibUsesRP: false,
Colin Crossff3ff7f2023-07-05 14:04:12 -0700771
772 appResources: nil,
773 appOverlays: []string{
774 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000775 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700776 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
777 "out/soong/.intermediates/direct/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000778 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700779 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
780 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
781 },
782 appImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
783 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
784 appClasspath: []string{
785 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
786 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
787 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
788 },
789 appCombined: []string{
790 "out/soong/.intermediates/app/android_common/javac/app.jar",
791 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
792 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
793 },
794
795 directResources: nil,
796 directOverlays: []string{
797 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000798 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700799 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
800 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
801 },
802 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
803 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
804 directClasspath: []string{
805 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
806 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
807 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
808 },
809 directCombined: []string{
810 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
811 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
812 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
813 },
814
815 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
816 transitiveOverlays: nil,
817 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
818 transitiveSrcJars: []string{"out/soong/.intermediates/transitive/android_common/gen/android/R.srcjar"},
819 transitiveClasspath: []string{"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar"},
820 transitiveCombined: nil,
821
822 directImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700823 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
824 directImportImports: []string{
825 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700826 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
827 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700828
829 transitiveImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700830 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
831 transitiveImportImports: []string{
832 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700833 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
834 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700835 },
836 {
837 // Test with all modules set to use_resource_processor: true.
838 name: "resource_processor",
839 appUsesRP: true,
840 directLibUsesRP: true,
841 transitiveLibUsesRP: true,
842
843 appResources: nil,
844 appOverlays: []string{
845 "out/soong/.intermediates/transitive/android_common/package-res.apk",
846 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
847 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
848 "out/soong/.intermediates/direct/android_common/package-res.apk",
849 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
850 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
851 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
852 },
853 appImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
854 appSrcJars: nil,
855 appClasspath: []string{
856 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
857 "out/soong/.intermediates/app/android_common/busybox/R.jar",
858 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
859 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
860 },
861 appCombined: []string{
862 "out/soong/.intermediates/app/android_common/busybox/R.jar",
863 "out/soong/.intermediates/app/android_common/javac/app.jar",
864 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
865 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
866 },
867
868 directResources: nil,
869 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
870 directImports: []string{
871 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
872 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
873 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
874 "out/soong/.intermediates/transitive/android_common/package-res.apk",
875 },
876 directSrcJars: nil,
877 directClasspath: []string{
878 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
879 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
880 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
881 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
882 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
883 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
884 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
885 },
886 directCombined: []string{
887 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
888 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
889 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
890 },
891
892 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
893 transitiveOverlays: nil,
894 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
895 transitiveSrcJars: nil,
896 transitiveClasspath: []string{
897 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
898 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
899 },
900 transitiveCombined: nil,
901
902 directImportResources: nil,
903 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
904 directImportImports: []string{
905 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
906 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
907 },
908
909 transitiveImportResources: nil,
910 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
911 transitiveImportImports: []string{
912 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
913 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
914 },
915 }, {
916 // Test an app building with resource processor enabled but with dependencies built without
917 // resource processor.
918 name: "app_resource_processor",
919 appUsesRP: true,
920 directLibUsesRP: false,
921 transitiveLibUsesRP: false,
922
923 appResources: nil,
924 appOverlays: []string{
925 "out/soong/.intermediates/transitive/android_common/package-res.apk",
926 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
927 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
928 "out/soong/.intermediates/direct/android_common/package-res.apk",
929 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
930 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
931 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
932 },
933 appImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
934 appSrcJars: nil,
935 appClasspath: []string{
936 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
937 // R.jar has to come before direct.jar
938 "out/soong/.intermediates/app/android_common/busybox/R.jar",
939 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
940 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
941 },
942 appCombined: []string{
943 "out/soong/.intermediates/app/android_common/busybox/R.jar",
944 "out/soong/.intermediates/app/android_common/javac/app.jar",
945 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
946 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
947 },
948
949 dontVerifyDirect: true,
950 dontVerifyTransitive: true,
951 dontVerifyDirectImport: true,
952 dontVerifyTransitiveImport: true,
953 },
954 {
955 // Test an app building without resource processor enabled but with a dependency built with
956 // resource processor.
957 name: "app_dependency_lib_resource_processor",
958 appUsesRP: false,
959 directLibUsesRP: true,
960 transitiveLibUsesRP: false,
961
962 appOverlays: []string{
963 "out/soong/.intermediates/transitive/android_common/package-res.apk",
964 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
965 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
966 "out/soong/.intermediates/direct/android_common/package-res.apk",
967 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
968 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
969 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
970 },
971 appImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
972 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
973 appClasspath: []string{
974 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
975 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
976 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
977 },
978 appCombined: []string{
979 "out/soong/.intermediates/app/android_common/javac/app.jar",
980 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
981 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
982 },
983
984 directResources: nil,
985 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
986 directImports: []string{
987 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
988 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
989 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
990 "out/soong/.intermediates/transitive/android_common/package-res.apk",
991 },
992 directSrcJars: nil,
993 directClasspath: []string{
994 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
995 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
996 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
997 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
998 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
999 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
1000 },
1001 directCombined: []string{
1002 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1003 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1004 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
1005 },
1006
1007 dontVerifyTransitive: true,
1008 dontVerifyDirectImport: true,
1009 dontVerifyTransitiveImport: true,
1010 },
1011 {
1012 // Test a library building without resource processor enabled but with a dependency built with
1013 // resource processor.
1014 name: "lib_dependency_lib_resource_processor",
1015 appUsesRP: false,
1016 directLibUsesRP: false,
1017 transitiveLibUsesRP: true,
1018
1019 appOverlays: []string{
1020 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1021 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1022 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1023 "out/soong/.intermediates/direct/android_common/package-res.apk",
1024 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1025 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1026 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1027 },
1028 appImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1029 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1030 appClasspath: []string{
1031 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1032 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
1033 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
1034 },
1035 appCombined: []string{
1036 "out/soong/.intermediates/app/android_common/javac/app.jar",
1037 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
1038 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
1039 },
1040
1041 directResources: nil,
1042 directOverlays: []string{
1043 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1044 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1045 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1046 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
1047 },
1048 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1049 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
1050 directClasspath: []string{
1051 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1052 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
1053 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
1054 },
1055 directCombined: []string{
1056 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1057 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
1058 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
1059 },
1060
1061 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1062 transitiveOverlays: nil,
1063 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1064 transitiveSrcJars: nil,
1065 transitiveClasspath: []string{
1066 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1067 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1068 },
1069 transitiveCombined: nil,
1070
1071 dontVerifyDirectImport: true,
1072 dontVerifyTransitiveImport: true,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001073 },
1074 }
1075
1076 for _, testCase := range testCases {
1077 t.Run(testCase.name, func(t *testing.T) {
1078 bp := fmt.Sprintf(`
1079 android_app {
1080 name: "app",
1081 sdk_version: "current",
1082 srcs: ["app/app.java"],
1083 resource_dirs: ["app/res"],
1084 manifest: "app/AndroidManifest.xml",
1085 static_libs: ["direct", "direct_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001086 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001087 }
1088
1089 android_library {
1090 name: "direct",
1091 sdk_version: "current",
1092 srcs: ["direct/direct.java"],
1093 resource_dirs: ["direct/res"],
1094 manifest: "direct/AndroidManifest.xml",
1095 static_libs: ["transitive", "transitive_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001096 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001097 }
1098
1099 android_library {
1100 name: "transitive",
1101 sdk_version: "current",
1102 srcs: ["transitive/transitive.java"],
1103 resource_dirs: ["transitive/res"],
1104 manifest: "transitive/AndroidManifest.xml",
Colin Cross4eae06d2023-06-20 22:40:02 -07001105 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001106 }
1107
1108 android_library_import {
1109 name: "direct_import",
1110 sdk_version: "current",
1111 aars: ["direct_import.aar"],
1112 static_libs: ["direct_import_dep"],
1113 }
1114
1115 android_library_import {
1116 name: "direct_import_dep",
1117 sdk_version: "current",
1118 aars: ["direct_import_dep.aar"],
1119 }
1120
1121 android_library_import {
1122 name: "transitive_import",
1123 sdk_version: "current",
1124 aars: ["transitive_import.aar"],
1125 static_libs: ["transitive_import_dep"],
1126 }
1127
1128 android_library_import {
1129 name: "transitive_import_dep",
1130 sdk_version: "current",
1131 aars: ["transitive_import_dep.aar"],
1132 }
Colin Cross4eae06d2023-06-20 22:40:02 -07001133 `, testCase.appUsesRP, testCase.directLibUsesRP, testCase.transitiveLibUsesRP)
Colin Crossff3ff7f2023-07-05 14:04:12 -07001134
1135 fs := android.MockFS{
1136 "app/res/values/strings.xml": nil,
1137 "direct/res/values/strings.xml": nil,
1138 "transitive/res/values/strings.xml": nil,
1139 }
1140
1141 result := android.GroupFixturePreparers(
1142 PrepareForTestWithJavaDefaultModules,
1143 PrepareForTestWithOverlayBuildComponents,
1144 fs.AddToFixture(),
1145 ).RunTestWithBp(t, bp)
1146
1147 type aaptInfo struct {
1148 resources, overlays, imports, srcJars, classpath, combined android.Paths
1149 }
1150
1151 getAaptInfo := func(moduleName string) (aaptInfo aaptInfo) {
1152 mod := result.ModuleForTests(moduleName, "android_common")
1153 resourceListRule := mod.MaybeOutput("aapt2/res.list")
1154 overlayListRule := mod.MaybeOutput("aapt2/overlay.list")
1155 aaptRule := mod.Rule("aapt2Link")
1156 javacRule := mod.MaybeRule("javac")
1157 combinedRule := mod.MaybeOutput("combined/" + moduleName + ".jar")
1158
1159 aaptInfo.resources = resourceListRule.Inputs
1160 aaptInfo.overlays = overlayListRule.Inputs
1161
1162 aaptFlags := strings.Split(aaptRule.Args["flags"], " ")
1163 for i, flag := range aaptFlags {
1164 if flag == "-I" && i+1 < len(aaptFlags) {
1165 aaptInfo.imports = append(aaptInfo.imports, android.PathForTesting(aaptFlags[i+1]))
1166 }
1167 }
1168
1169 if len(javacRule.Args["srcJars"]) > 0 {
1170 aaptInfo.srcJars = android.PathsForTesting(strings.Split(javacRule.Args["srcJars"], " ")...)
1171 }
1172
1173 if len(javacRule.Args["classpath"]) > 0 {
1174 classpathArg := strings.TrimPrefix(javacRule.Args["classpath"], "-classpath ")
1175 aaptInfo.classpath = android.PathsForTesting(strings.Split(classpathArg, ":")...)
1176 }
1177
1178 aaptInfo.combined = combinedRule.Inputs
1179 return
1180 }
1181
1182 app := getAaptInfo("app")
1183 direct := getAaptInfo("direct")
1184 transitive := getAaptInfo("transitive")
1185 directImport := getAaptInfo("direct_import")
1186 transitiveImport := getAaptInfo("transitive_import")
1187
1188 if !testCase.dontVerifyApp {
1189 android.AssertPathsRelativeToTopEquals(t, "app resources", testCase.appResources, app.resources)
1190 android.AssertPathsRelativeToTopEquals(t, "app overlays", testCase.appOverlays, app.overlays)
1191 android.AssertPathsRelativeToTopEquals(t, "app imports", testCase.appImports, app.imports)
1192 android.AssertPathsRelativeToTopEquals(t, "app srcjars", testCase.appSrcJars, app.srcJars)
1193 android.AssertPathsRelativeToTopEquals(t, "app classpath", testCase.appClasspath, app.classpath)
1194 android.AssertPathsRelativeToTopEquals(t, "app combined", testCase.appCombined, app.combined)
1195 }
1196
1197 if !testCase.dontVerifyDirect {
1198 android.AssertPathsRelativeToTopEquals(t, "direct resources", testCase.directResources, direct.resources)
1199 android.AssertPathsRelativeToTopEquals(t, "direct overlays", testCase.directOverlays, direct.overlays)
1200 android.AssertPathsRelativeToTopEquals(t, "direct imports", testCase.directImports, direct.imports)
1201 android.AssertPathsRelativeToTopEquals(t, "direct srcjars", testCase.directSrcJars, direct.srcJars)
1202 android.AssertPathsRelativeToTopEquals(t, "direct classpath", testCase.directClasspath, direct.classpath)
1203 android.AssertPathsRelativeToTopEquals(t, "direct combined", testCase.directCombined, direct.combined)
1204 }
1205
1206 if !testCase.dontVerifyTransitive {
1207 android.AssertPathsRelativeToTopEquals(t, "transitive resources", testCase.transitiveResources, transitive.resources)
1208 android.AssertPathsRelativeToTopEquals(t, "transitive overlays", testCase.transitiveOverlays, transitive.overlays)
1209 android.AssertPathsRelativeToTopEquals(t, "transitive imports", testCase.transitiveImports, transitive.imports)
1210 android.AssertPathsRelativeToTopEquals(t, "transitive srcjars", testCase.transitiveSrcJars, transitive.srcJars)
1211 android.AssertPathsRelativeToTopEquals(t, "transitive classpath", testCase.transitiveClasspath, transitive.classpath)
1212 android.AssertPathsRelativeToTopEquals(t, "transitive combined", testCase.transitiveCombined, transitive.combined)
1213 }
1214
1215 if !testCase.dontVerifyDirectImport {
1216 android.AssertPathsRelativeToTopEquals(t, "direct_import resources", testCase.directImportResources, directImport.resources)
1217 android.AssertPathsRelativeToTopEquals(t, "direct_import overlays", testCase.directImportOverlays, directImport.overlays)
1218 android.AssertPathsRelativeToTopEquals(t, "direct_import imports", testCase.directImportImports, directImport.imports)
1219 }
1220
1221 if !testCase.dontVerifyTransitiveImport {
1222 android.AssertPathsRelativeToTopEquals(t, "transitive_import resources", testCase.transitiveImportResources, transitiveImport.resources)
1223 android.AssertPathsRelativeToTopEquals(t, "transitive_import overlays", testCase.transitiveImportOverlays, transitiveImport.overlays)
1224 android.AssertPathsRelativeToTopEquals(t, "transitive_import imports", testCase.transitiveImportImports, transitiveImport.imports)
1225 }
1226 })
1227 }
1228}
1229
1230func TestAndroidResourceOverlays(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -08001231 testCases := []struct {
1232 name string
1233 enforceRROTargets []string
1234 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -08001235 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -08001236 overlayFiles map[string][]string
1237 rroDirs map[string][]string
1238 }{
1239 {
1240 name: "no RRO",
1241 enforceRROTargets: nil,
1242 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -08001243 resourceFiles: map[string][]string{
1244 "foo": nil,
1245 "bar": {"bar/res/res/values/strings.xml"},
1246 "lib": nil,
1247 "lib2": {"lib2/res/res/values/strings.xml"},
1248 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001249 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001250 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001251 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1252 "out/soong/.intermediates/lib/android_common/package-res.apk",
1253 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001254 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001255 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1256 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +00001257 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001258 },
Colin Crossbec85302019-02-13 13:15:46 -08001259 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -08001260 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1261 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1262 },
Colin Crossbec85302019-02-13 13:15:46 -08001263 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001264 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001265 "lib/res/res/values/strings.xml",
1266 "device/vendor/blah/overlay/lib/res/values/strings.xml",
1267 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001268 },
1269 rroDirs: map[string][]string{
1270 "foo": nil,
1271 "bar": nil,
1272 },
1273 },
1274 {
1275 name: "enforce RRO on foo",
1276 enforceRROTargets: []string{"foo"},
1277 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -08001278 resourceFiles: map[string][]string{
1279 "foo": nil,
1280 "bar": {"bar/res/res/values/strings.xml"},
1281 "lib": nil,
1282 "lib2": {"lib2/res/res/values/strings.xml"},
1283 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001284 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001285 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001286 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1287 "out/soong/.intermediates/lib/android_common/package-res.apk",
1288 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001289 "foo/res/res/values/strings.xml",
1290 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1291 },
Colin Crossbec85302019-02-13 13:15:46 -08001292 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -08001293 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1294 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1295 },
Colin Crossbec85302019-02-13 13:15:46 -08001296 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001297 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001298 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -08001299 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001300 },
Colin Crossc1c37552019-01-31 11:42:41 -08001301
Colin Cross5c4791c2019-02-01 11:44:44 -08001302 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001303 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +00001304 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +00001305 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001306 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001307 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001308 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001309 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001310 },
1311 },
1312 {
1313 name: "enforce RRO on all",
1314 enforceRROTargets: []string{"*"},
1315 enforceRROExcludedOverlays: []string{
1316 // Excluding specific apps/res directories also allowed.
1317 "device/vendor/blah/static_overlay/foo",
1318 "device/vendor/blah/static_overlay/bar/res",
1319 },
Colin Crossbec85302019-02-13 13:15:46 -08001320 resourceFiles: map[string][]string{
1321 "foo": nil,
1322 "bar": {"bar/res/res/values/strings.xml"},
1323 "lib": nil,
1324 "lib2": {"lib2/res/res/values/strings.xml"},
1325 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001326 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001327 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001328 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1329 "out/soong/.intermediates/lib/android_common/package-res.apk",
1330 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001331 "foo/res/res/values/strings.xml",
1332 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1333 },
Colin Crossbec85302019-02-13 13:15:46 -08001334 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
1335 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001336 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001337 "lib/res/res/values/strings.xml",
1338 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001339 },
1340 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001341 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +00001342 "device:device/vendor/blah/overlay/foo/res",
1343 "product:product/vendor/blah/overlay/foo/res",
1344 // Lib dep comes after the direct deps
1345 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001346 },
Anton Hansson53c88442019-03-18 15:53:16 +00001347 "bar": {"device:device/vendor/blah/overlay/bar/res"},
1348 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001349 },
1350 },
1351 }
1352
Anton Hansson53c88442019-03-18 15:53:16 +00001353 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -08001354 "device/vendor/blah/overlay",
1355 "device/vendor/blah/overlay2",
1356 "device/vendor/blah/static_overlay",
1357 }
1358
Anton Hansson53c88442019-03-18 15:53:16 +00001359 productResourceOverlays := []string{
1360 "product/vendor/blah/overlay",
1361 }
1362
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001363 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -08001364 "foo/res/res/values/strings.xml": nil,
1365 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001366 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -08001367 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001368 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
1369 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001370 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001371 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
1372 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
1373 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +00001374 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001375 }
1376
1377 bp := `
1378 android_app {
1379 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001380 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001381 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +00001382 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -08001383 }
1384
1385 android_app {
1386 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001387 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001388 resource_dirs: ["bar/res"],
1389 }
Colin Cross6ed7dea2019-01-31 14:44:30 -08001390
1391 android_library {
1392 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001393 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001394 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -08001395 static_libs: ["lib2"],
1396 }
1397
1398 android_library {
1399 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001400 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -08001401 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -08001402 }
Anton Hansson53c88442019-03-18 15:53:16 +00001403
1404 // This library has the same resources as lib (should not lead to dupe RROs)
1405 android_library {
1406 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001407 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +00001408 resource_dirs: ["lib/res"]
1409 }
Colin Cross890ff552017-11-30 20:13:19 -08001410 `
1411
Colin Cross5c4791c2019-02-01 11:44:44 -08001412 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -08001413 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001414 result := android.GroupFixturePreparers(
1415 PrepareForTestWithJavaDefaultModules,
1416 PrepareForTestWithOverlayBuildComponents,
1417 fs.AddToFixture(),
1418 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1419 variables.DeviceResourceOverlays = deviceResourceOverlays
1420 variables.ProductResourceOverlays = productResourceOverlays
1421 if testCase.enforceRROTargets != nil {
1422 variables.EnforceRROTargets = testCase.enforceRROTargets
1423 }
1424 if testCase.enforceRROExcludedOverlays != nil {
1425 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
1426 }
1427 }),
1428 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -08001429
Colin Crossbec85302019-02-13 13:15:46 -08001430 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
1431 for _, o := range list {
1432 res := module.MaybeOutput(o)
1433 if res.Rule != nil {
1434 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
1435 // verify the inputs to the .arsc.flat rule.
1436 files = append(files, res.Inputs.Strings()...)
1437 } else {
1438 // Otherwise, verify the full path to the output of the other module
1439 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +00001440 }
Colin Cross890ff552017-11-30 20:13:19 -08001441 }
Colin Crossbec85302019-02-13 13:15:46 -08001442 return files
Colin Cross890ff552017-11-30 20:13:19 -08001443 }
1444
Colin Crossbec85302019-02-13 13:15:46 -08001445 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001446 module := result.ModuleForTests(moduleName, "android_common")
Colin Crossbec85302019-02-13 13:15:46 -08001447 resourceList := module.MaybeOutput("aapt2/res.list")
1448 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001449 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +00001450 }
Colin Crossbec85302019-02-13 13:15:46 -08001451 overlayList := module.MaybeOutput("aapt2/overlay.list")
1452 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001453 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -08001454 }
1455
Colin Crossab8d1382023-07-14 17:23:41 +00001456 for _, d := range module.Module().(AndroidLibraryDependency).RRODirsDepSet().ToList() {
Anton Hansson53c88442019-03-18 15:53:16 +00001457 var prefix string
1458 if d.overlayType == device {
1459 prefix = "device:"
1460 } else if d.overlayType == product {
1461 prefix = "product:"
1462 } else {
1463 t.Fatalf("Unexpected overlayType %d", d.overlayType)
1464 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001465 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +00001466 }
Colin Crossbec85302019-02-13 13:15:46 -08001467
1468 return resourceFiles, overlayFiles, rroDirs
1469 }
1470
1471 modules := []string{"foo", "bar", "lib", "lib2"}
1472 for _, module := range modules {
1473 resourceFiles, overlayFiles, rroDirs := getResources(module)
1474
1475 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
1476 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
1477 module, testCase.resourceFiles[module], resourceFiles)
1478 }
1479 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
1480 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
1481 module, testCase.overlayFiles[module], overlayFiles)
1482 }
1483 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +00001484 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -08001485 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +00001486 }
Colin Cross890ff552017-11-30 20:13:19 -08001487 }
Colin Cross890ff552017-11-30 20:13:19 -08001488 })
1489 }
1490}
Colin Crossd09b0b62018-04-18 11:06:47 -07001491
Paul Duffincdb88a92021-03-14 00:36:50 +00001492func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
1493 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +09001494 link := foo.Output("package-res.apk")
1495 linkFlags := strings.Split(link.Args["flags"], " ")
1496 min := android.IndexList("--min-sdk-version", linkFlags)
1497 target := android.IndexList("--target-sdk-version", linkFlags)
1498
1499 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
1500 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
1501 }
1502
1503 gotMinSdkVersion := linkFlags[min+1]
1504 gotTargetSdkVersion := linkFlags[target+1]
1505
Paul Duffincdb88a92021-03-14 00:36:50 +00001506 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001507
Paul Duffincdb88a92021-03-14 00:36:50 +00001508 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001509}
1510
Colin Crossd09b0b62018-04-18 11:06:47 -07001511func TestAppSdkVersion(t *testing.T) {
1512 testCases := []struct {
1513 name string
1514 sdkVersion string
1515 platformSdkInt int
1516 platformSdkCodename string
1517 platformSdkFinal bool
Spandan Dasffb31af2023-03-01 19:46:18 +00001518 minSdkVersionBp string
Colin Crossd09b0b62018-04-18 11:06:47 -07001519 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001520 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001521 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001522 }{
1523 {
1524 name: "current final SDK",
1525 sdkVersion: "current",
1526 platformSdkInt: 27,
1527 platformSdkCodename: "REL",
1528 platformSdkFinal: true,
1529 expectedMinSdkVersion: "27",
1530 },
1531 {
1532 name: "current non-final SDK",
1533 sdkVersion: "current",
1534 platformSdkInt: 27,
1535 platformSdkCodename: "OMR1",
1536 platformSdkFinal: false,
1537 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001538 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001539 },
1540 {
1541 name: "default final SDK",
1542 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001543 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001544 platformSdkInt: 27,
1545 platformSdkCodename: "REL",
1546 platformSdkFinal: true,
1547 expectedMinSdkVersion: "27",
1548 },
1549 {
1550 name: "default non-final SDK",
1551 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001552 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001553 platformSdkInt: 27,
1554 platformSdkCodename: "OMR1",
1555 platformSdkFinal: false,
1556 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001557 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001558 },
1559 {
1560 name: "14",
1561 sdkVersion: "14",
1562 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001563 platformSdkCodename: "S",
1564 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001565 },
Spandan Dasffb31af2023-03-01 19:46:18 +00001566 {
1567 name: "two active SDKs",
1568 sdkVersion: "module_current",
1569 minSdkVersionBp: "UpsideDownCake",
1570 expectedMinSdkVersion: "UpsideDownCake", // And not VanillaIceCream
1571 platformSdkCodename: "VanillaIceCream",
1572 activeCodenames: []string{"UpsideDownCake", "VanillaIceCream"},
1573 },
Colin Crossd09b0b62018-04-18 11:06:47 -07001574 }
1575
1576 for _, moduleType := range []string{"android_app", "android_library"} {
1577 for _, test := range testCases {
1578 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001579 platformApiProp := ""
1580 if test.platformApis {
1581 platformApiProp = "platform_apis: true,"
1582 }
Spandan Dasffb31af2023-03-01 19:46:18 +00001583 minSdkVersionProp := ""
1584 if test.minSdkVersionBp != "" {
1585 minSdkVersionProp = fmt.Sprintf(` min_sdk_version: "%s",`, test.minSdkVersionBp)
1586 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001587 bp := fmt.Sprintf(`%s {
1588 name: "foo",
1589 srcs: ["a.java"],
1590 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001591 %s
Spandan Dasffb31af2023-03-01 19:46:18 +00001592 %s
1593 }`, moduleType, test.sdkVersion, platformApiProp, minSdkVersionProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001594
Paul Duffin71ae5942021-03-22 15:36:52 +00001595 result := android.GroupFixturePreparers(
1596 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001597 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1598 variables.Platform_sdk_version = &test.platformSdkInt
1599 variables.Platform_sdk_codename = &test.platformSdkCodename
1600 variables.Platform_version_active_codenames = test.activeCodenames
1601 variables.Platform_sdk_final = &test.platformSdkFinal
1602 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001603 FixtureWithPrebuiltApis(map[string][]string{
1604 "14": {"foo"},
1605 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001606 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001607
Paul Duffincdb88a92021-03-14 00:36:50 +00001608 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001609 })
1610 }
1611 }
1612}
Colin Crossa4f08812018-10-02 22:03:40 -07001613
Jeongik Cha219141c2020-08-06 23:00:37 +09001614func TestVendorAppSdkVersion(t *testing.T) {
1615 testCases := []struct {
1616 name string
1617 sdkVersion string
1618 platformSdkInt int
1619 platformSdkCodename string
1620 platformSdkFinal bool
1621 deviceCurrentApiLevelForVendorModules string
1622 expectedMinSdkVersion string
1623 }{
1624 {
1625 name: "current final SDK",
1626 sdkVersion: "current",
1627 platformSdkInt: 29,
1628 platformSdkCodename: "REL",
1629 platformSdkFinal: true,
1630 deviceCurrentApiLevelForVendorModules: "29",
1631 expectedMinSdkVersion: "29",
1632 },
1633 {
1634 name: "current final SDK",
1635 sdkVersion: "current",
1636 platformSdkInt: 29,
1637 platformSdkCodename: "REL",
1638 platformSdkFinal: true,
1639 deviceCurrentApiLevelForVendorModules: "28",
1640 expectedMinSdkVersion: "28",
1641 },
1642 {
1643 name: "current final SDK",
1644 sdkVersion: "current",
1645 platformSdkInt: 29,
1646 platformSdkCodename: "Q",
1647 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001648 deviceCurrentApiLevelForVendorModules: "28",
1649 expectedMinSdkVersion: "28",
1650 },
1651 }
1652
1653 for _, moduleType := range []string{"android_app", "android_library"} {
1654 for _, sdkKind := range []string{"", "system_"} {
1655 for _, test := range testCases {
1656 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1657 bp := fmt.Sprintf(`%s {
1658 name: "foo",
1659 srcs: ["a.java"],
1660 sdk_version: "%s%s",
1661 vendor: true,
1662 }`, moduleType, sdkKind, test.sdkVersion)
1663
Paul Duffin71ae5942021-03-22 15:36:52 +00001664 result := android.GroupFixturePreparers(
1665 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001666 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1667 variables.Platform_sdk_version = &test.platformSdkInt
1668 variables.Platform_sdk_codename = &test.platformSdkCodename
1669 variables.Platform_sdk_final = &test.platformSdkFinal
1670 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1671 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1672 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001673 FixtureWithPrebuiltApis(map[string][]string{
1674 "28": {"foo"},
1675 "29": {"foo"},
1676 "current": {"foo"},
1677 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001678 ).RunTestWithBp(t, bp)
1679
1680 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001681 })
1682 }
1683 }
1684 }
1685}
1686
Paul Duffin50c217c2019-06-12 13:25:22 +01001687func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001688 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001689 cc_library {
1690 name: "libjni",
1691 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001692 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001693 stl: "none",
1694 }
1695
1696 android_test {
1697 name: "test",
1698 sdk_version: "core_platform",
1699 jni_libs: ["libjni"],
1700 }
1701
1702 android_test {
1703 name: "test_first",
1704 sdk_version: "core_platform",
1705 compile_multilib: "first",
1706 jni_libs: ["libjni"],
1707 }
1708
1709 android_test {
1710 name: "test_both",
1711 sdk_version: "core_platform",
1712 compile_multilib: "both",
1713 jni_libs: ["libjni"],
1714 }
1715
1716 android_test {
1717 name: "test_32",
1718 sdk_version: "core_platform",
1719 compile_multilib: "32",
1720 jni_libs: ["libjni"],
1721 }
1722
1723 android_test {
1724 name: "test_64",
1725 sdk_version: "core_platform",
1726 compile_multilib: "64",
1727 jni_libs: ["libjni"],
1728 }
1729 `)
1730
1731 testCases := []struct {
1732 name string
1733 abis []string
1734 }{
1735 {"test", []string{"arm64-v8a"}},
1736 {"test_first", []string{"arm64-v8a"}},
1737 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1738 {"test_32", []string{"armeabi-v7a"}},
1739 {"test_64", []string{"arm64-v8a"}},
1740 }
1741
1742 for _, test := range testCases {
1743 t.Run(test.name, func(t *testing.T) {
1744 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07001745 jniLibZip := app.Output("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01001746 var abis []string
1747 args := strings.Fields(jniLibZip.Args["jarArgs"])
1748 for i := 0; i < len(args); i++ {
1749 if args[i] == "-P" {
1750 abis = append(abis, filepath.Base(args[i+1]))
1751 i++
1752 }
1753 }
1754 if !reflect.DeepEqual(abis, test.abis) {
1755 t.Errorf("want abis %v, got %v", test.abis, abis)
1756 }
1757 })
1758 }
1759}
1760
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001761func TestAppSdkVersionByPartition(t *testing.T) {
1762 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1763 android_app {
1764 name: "foo",
1765 srcs: ["a.java"],
1766 vendor: true,
1767 platform_apis: true,
1768 }
1769 `)
1770
1771 testJava(t, `
1772 android_app {
1773 name: "bar",
1774 srcs: ["b.java"],
1775 platform_apis: true,
1776 }
1777 `)
1778
1779 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001780 bp := `
1781 android_app {
1782 name: "foo",
1783 srcs: ["a.java"],
1784 product_specific: true,
1785 platform_apis: true,
1786 }
1787 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001788
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001789 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001790 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001791 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 +09001792 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001793
1794 android.GroupFixturePreparers(
1795 PrepareForTestWithJavaDefaultModules,
1796 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1797 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
1798 }),
1799 ).
1800 ExtendWithErrorHandler(errorHandler).
1801 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001802 }
1803}
1804
Paul Duffin50c217c2019-06-12 13:25:22 +01001805func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001806 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001807 cc_library {
1808 name: "libjni",
1809 system_shared_libs: [],
1810 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08001811 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001812 }
1813
1814 android_app {
1815 name: "app",
1816 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001817 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001818 }
1819
1820 android_app {
1821 name: "app_noembed",
1822 jni_libs: ["libjni"],
1823 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001824 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001825 }
1826
1827 android_app {
1828 name: "app_embed",
1829 jni_libs: ["libjni"],
1830 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001831 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001832 }
1833
1834 android_test {
1835 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00001836 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001837 jni_libs: ["libjni"],
1838 }
1839
1840 android_test {
1841 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001842 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001843 jni_libs: ["libjni"],
1844 use_embedded_native_libs: false,
1845 }
1846
1847 android_test_helper_app {
1848 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00001849 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001850 jni_libs: ["libjni"],
1851 }
1852
1853 android_test_helper_app {
1854 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001855 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001856 jni_libs: ["libjni"],
1857 use_embedded_native_libs: false,
1858 }
1859 `)
1860
1861 testCases := []struct {
1862 name string
1863 packaged bool
1864 compressed bool
1865 }{
1866 {"app", false, false},
1867 {"app_noembed", false, false},
1868 {"app_embed", true, false},
1869 {"test", true, false},
1870 {"test_noembed", true, true},
1871 {"test_helper", true, false},
1872 {"test_helper_noembed", true, true},
1873 }
1874
1875 for _, test := range testCases {
1876 t.Run(test.name, func(t *testing.T) {
1877 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07001878 jniLibZip := app.MaybeOutput("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01001879 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
1880 t.Errorf("expected jni packaged %v, got %v", w, g)
1881 }
1882
1883 if jniLibZip.Rule != nil {
1884 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
1885 t.Errorf("expected jni compressed %v, got %v", w, g)
1886 }
Colin Crossc511bc52020-04-07 16:50:32 +00001887
1888 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
1889 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
1890 }
Paul Duffin50c217c2019-06-12 13:25:22 +01001891 }
1892 })
1893 }
Colin Cross47fa9d32019-03-26 10:51:39 -07001894}
1895
Colin Cross3c007702020-05-08 11:20:24 -07001896func TestJNISDK(t *testing.T) {
1897 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
1898 cc_library {
1899 name: "libjni",
1900 system_shared_libs: [],
1901 stl: "none",
1902 sdk_version: "current",
1903 }
1904
1905 android_test {
1906 name: "app_platform",
1907 jni_libs: ["libjni"],
1908 platform_apis: true,
1909 }
1910
1911 android_test {
1912 name: "app_sdk",
1913 jni_libs: ["libjni"],
1914 sdk_version: "current",
1915 }
1916
1917 android_test {
1918 name: "app_force_platform",
1919 jni_libs: ["libjni"],
1920 sdk_version: "current",
1921 jni_uses_platform_apis: true,
1922 }
1923
1924 android_test {
1925 name: "app_force_sdk",
1926 jni_libs: ["libjni"],
1927 platform_apis: true,
1928 jni_uses_sdk_apis: true,
1929 }
Colin Crossc2d24052020-05-13 11:05:02 -07001930
1931 cc_library {
1932 name: "libvendorjni",
1933 system_shared_libs: [],
1934 stl: "none",
1935 vendor: true,
1936 }
1937
1938 android_test {
1939 name: "app_vendor",
1940 jni_libs: ["libvendorjni"],
1941 sdk_version: "current",
1942 vendor: true,
1943 }
Colin Cross3c007702020-05-08 11:20:24 -07001944 `)
1945
1946 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07001947 name string
1948 sdkJNI bool
1949 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07001950 }{
Colin Crossc2d24052020-05-13 11:05:02 -07001951 {name: "app_platform"},
1952 {name: "app_sdk", sdkJNI: true},
1953 {name: "app_force_platform"},
1954 {name: "app_force_sdk", sdkJNI: true},
1955 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07001956 }
1957
Colin Crossc2d24052020-05-13 11:05:02 -07001958 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
1959 Output("libjni.so").Output.String()
1960 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
1961 Output("libjni.so").Output.String()
1962 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
1963 Output("libvendorjni.so").Output.String()
1964
Colin Cross3c007702020-05-08 11:20:24 -07001965 for _, test := range testCases {
1966 t.Run(test.name, func(t *testing.T) {
1967 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07001968
Colin Crossb3168ba2023-07-26 16:14:56 -07001969 jniLibZip := app.MaybeOutput("jnilibs.zip")
Colin Cross3c007702020-05-08 11:20:24 -07001970 if len(jniLibZip.Implicits) != 1 {
1971 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
1972 }
1973 gotJNI := jniLibZip.Implicits[0].String()
1974
1975 if test.sdkJNI {
1976 if gotJNI != sdkJNI {
1977 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
1978 }
Colin Crossc2d24052020-05-13 11:05:02 -07001979 } else if test.vendorJNI {
1980 if gotJNI != vendorJNI {
1981 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
1982 }
Colin Cross3c007702020-05-08 11:20:24 -07001983 } else {
1984 if gotJNI != platformJNI {
1985 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
1986 }
1987 }
1988 })
1989 }
1990
1991 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
1992 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
1993 android_test {
1994 name: "app_platform",
1995 platform_apis: true,
1996 jni_uses_platform_apis: true,
1997 }
1998 `)
1999 })
2000
2001 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
2002 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
2003 android_test {
2004 name: "app_sdk",
2005 sdk_version: "current",
2006 jni_uses_sdk_apis: true,
2007 }
2008 `)
2009 })
2010
2011}
2012
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002013func TestCertificates(t *testing.T) {
2014 testCases := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002015 name string
2016 bp string
Colin Cross5caad2b2022-12-12 15:11:46 -08002017 allowMissingDependencies bool
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002018 certificateOverride string
2019 expectedCertSigningFlags string
2020 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002021 }{
2022 {
2023 name: "default",
2024 bp: `
2025 android_app {
2026 name: "foo",
2027 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002028 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002029 }
2030 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002031 certificateOverride: "",
2032 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002033 expectedCertificate: "build/make/target/product/security/testkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002034 },
2035 {
2036 name: "module certificate property",
2037 bp: `
2038 android_app {
2039 name: "foo",
2040 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002041 certificate: ":new_certificate",
2042 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002043 }
2044
2045 android_app_certificate {
2046 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002047 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002048 }
2049 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002050 certificateOverride: "",
2051 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002052 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002053 },
2054 {
2055 name: "path certificate property",
2056 bp: `
2057 android_app {
2058 name: "foo",
2059 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002060 certificate: "expiredkey",
2061 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002062 }
2063 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002064 certificateOverride: "",
2065 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002066 expectedCertificate: "build/make/target/product/security/expiredkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002067 },
2068 {
2069 name: "certificate overrides",
2070 bp: `
2071 android_app {
2072 name: "foo",
2073 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002074 certificate: "expiredkey",
2075 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002076 }
2077
2078 android_app_certificate {
2079 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002080 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002081 }
2082 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002083 certificateOverride: "foo:new_certificate",
2084 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002085 expectedCertificate: "cert/new_cert",
Liz Kammere2b27f42020-05-07 13:24:05 -07002086 },
2087 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002088 name: "certificate signing flags",
Liz Kammere2b27f42020-05-07 13:24:05 -07002089 bp: `
2090 android_app {
2091 name: "foo",
2092 srcs: ["a.java"],
2093 certificate: ":new_certificate",
2094 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002095 rotationMinSdkVersion: "32",
Liz Kammere2b27f42020-05-07 13:24:05 -07002096 sdk_version: "current",
2097 }
2098
2099 android_app_certificate {
2100 name: "new_certificate",
2101 certificate: "cert/new_cert",
2102 }
2103 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002104 certificateOverride: "",
2105 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002106 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002107 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002108 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002109 name: "cert signing flags from filegroup",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002110 bp: `
2111 android_app {
2112 name: "foo",
2113 srcs: ["a.java"],
2114 certificate: ":new_certificate",
2115 lineage: ":lineage_bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002116 rotationMinSdkVersion: "32",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002117 sdk_version: "current",
2118 }
2119
2120 android_app_certificate {
2121 name: "new_certificate",
2122 certificate: "cert/new_cert",
2123 }
2124
2125 filegroup {
2126 name: "lineage_bin",
2127 srcs: ["lineage.bin"],
2128 }
2129 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002130 certificateOverride: "",
2131 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002132 expectedCertificate: "cert/new_cert",
2133 },
2134 {
2135 name: "missing with AllowMissingDependencies",
2136 bp: `
2137 android_app {
2138 name: "foo",
2139 srcs: ["a.java"],
2140 certificate: ":new_certificate",
2141 sdk_version: "current",
2142 }
2143 `,
2144 expectedCertificate: "out/soong/.intermediates/foo/android_common/missing",
2145 allowMissingDependencies: true,
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002146 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002147 }
2148
2149 for _, test := range testCases {
2150 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002151 result := android.GroupFixturePreparers(
2152 PrepareForTestWithJavaDefaultModules,
2153 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2154 if test.certificateOverride != "" {
2155 variables.CertificateOverrides = []string{test.certificateOverride}
2156 }
Colin Cross5caad2b2022-12-12 15:11:46 -08002157 if test.allowMissingDependencies {
2158 variables.Allow_missing_dependencies = proptools.BoolPtr(true)
2159 }
2160 }),
2161 android.FixtureModifyContext(func(ctx *android.TestContext) {
2162 ctx.SetAllowMissingDependencies(test.allowMissingDependencies)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002163 }),
2164 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002165
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002166 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002167
Colin Cross5caad2b2022-12-12 15:11:46 -08002168 certificate := foo.Module().(*AndroidApp).certificate
2169 android.AssertPathRelativeToTopEquals(t, "certificates key", test.expectedCertificate+".pk8", certificate.Key)
2170 // The sign_target_files_apks and check_target_files_signatures
2171 // tools require that certificates have a .x509.pem extension.
2172 android.AssertPathRelativeToTopEquals(t, "certificates pem", test.expectedCertificate+".x509.pem", certificate.Pem)
Liz Kammere2b27f42020-05-07 13:24:05 -07002173
Colin Cross5caad2b2022-12-12 15:11:46 -08002174 signapk := foo.Output("foo.apk")
2175 if signapk.Rule != android.ErrorRule {
2176 signCertificateFlags := signapk.Args["certificates"]
2177 expectedFlags := certificate.Pem.String() + " " + certificate.Key.String()
2178 android.AssertStringEquals(t, "certificates flags", expectedFlags, signCertificateFlags)
2179
2180 certSigningFlags := signapk.Args["flags"]
2181 android.AssertStringEquals(t, "cert signing flags", test.expectedCertSigningFlags, certSigningFlags)
2182 }
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002183 })
2184 }
2185}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002186
Songchun Fan688de9a2020-03-24 20:32:24 -07002187func TestRequestV4SigningFlag(t *testing.T) {
2188 testCases := []struct {
2189 name string
2190 bp string
2191 expected string
2192 }{
2193 {
2194 name: "default",
2195 bp: `
2196 android_app {
2197 name: "foo",
2198 srcs: ["a.java"],
2199 sdk_version: "current",
2200 }
2201 `,
2202 expected: "",
2203 },
2204 {
2205 name: "default",
2206 bp: `
2207 android_app {
2208 name: "foo",
2209 srcs: ["a.java"],
2210 sdk_version: "current",
2211 v4_signature: false,
2212 }
2213 `,
2214 expected: "",
2215 },
2216 {
2217 name: "module certificate property",
2218 bp: `
2219 android_app {
2220 name: "foo",
2221 srcs: ["a.java"],
2222 sdk_version: "current",
2223 v4_signature: true,
2224 }
2225 `,
2226 expected: "--enable-v4",
2227 },
2228 }
2229
2230 for _, test := range testCases {
2231 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002232 result := android.GroupFixturePreparers(
2233 PrepareForTestWithJavaDefaultModules,
2234 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07002235
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002236 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07002237
2238 signapk := foo.Output("foo.apk")
2239 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002240 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07002241 })
2242 }
2243}
2244
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002245func TestPackageNameOverride(t *testing.T) {
2246 testCases := []struct {
2247 name string
2248 bp string
2249 packageNameOverride string
2250 expected []string
2251 }{
2252 {
2253 name: "default",
2254 bp: `
2255 android_app {
2256 name: "foo",
2257 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002258 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002259 }
2260 `,
2261 packageNameOverride: "",
2262 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002263 "out/soong/.intermediates/foo/android_common/foo.apk",
2264 "out/soong/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002265 },
2266 },
2267 {
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002268 name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002269 bp: `
2270 android_app {
2271 name: "foo",
2272 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002273 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002274 }
2275 `,
2276 packageNameOverride: "foo:bar",
2277 expected: []string{
2278 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002279 "out/soong/.intermediates/foo/android_common/bar.apk",
2280 "out/soong/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002281 },
2282 },
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002283 {
2284 name: "overridden via stem",
2285 bp: `
2286 android_app {
2287 name: "foo",
2288 srcs: ["a.java"],
2289 sdk_version: "current",
2290 stem: "bar",
2291 }
2292 `,
2293 packageNameOverride: "",
2294 expected: []string{
2295 "out/soong/.intermediates/foo/android_common/bar.apk",
2296 "out/soong/target/product/test_device/system/app/bar/bar.apk",
2297 },
2298 },
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002299 }
2300
2301 for _, test := range testCases {
2302 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002303 result := android.GroupFixturePreparers(
2304 PrepareForTestWithJavaDefaultModules,
2305 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2306 if test.packageNameOverride != "" {
2307 variables.PackageNameOverrides = []string{test.packageNameOverride}
2308 }
2309 }),
2310 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002311
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002312 foo := result.ModuleForTests("foo", "android_common")
2313
Lukacs T. Berkifbaf7252021-08-19 09:36:42 +02002314 outSoongDir := result.Config.SoongOutDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002315
2316 outputs := foo.AllOutputs()
2317 outputMap := make(map[string]bool)
2318 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002319 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002320 }
2321 for _, e := range test.expected {
2322 if _, exist := outputMap[e]; !exist {
2323 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
2324 }
2325 }
2326 })
2327 }
2328}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002329
2330func TestInstrumentationTargetOverridden(t *testing.T) {
2331 bp := `
2332 android_app {
2333 name: "foo",
2334 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002335 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002336 }
2337
2338 android_test {
2339 name: "bar",
2340 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002341 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002342 }
2343 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002344
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002345 result := android.GroupFixturePreparers(
2346 PrepareForTestWithJavaDefaultModules,
2347 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2348 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
2349 }),
2350 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002351
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002352 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002353 res := bar.Output("package-res.apk")
2354 aapt2Flags := res.Args["flags"]
2355 e := "--rename-instrumentation-target-package org.dandroid.bp"
2356 if !strings.Contains(aapt2Flags, e) {
2357 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
2358 }
2359}
Jaewoong Jung525443a2019-02-28 15:35:54 -08002360
2361func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002362 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2363 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08002364 android_app {
2365 name: "foo",
2366 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07002367 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002368 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002369 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002370 }
2371
2372 override_android_app {
2373 name: "bar",
2374 base: "foo",
2375 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07002376 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002377 rotationMinSdkVersion: "32",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002378 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002379 }
2380
2381 android_app_certificate {
2382 name: "new_certificate",
2383 certificate: "cert/new_cert",
2384 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002385
2386 override_android_app {
2387 name: "baz",
2388 base: "foo",
2389 package_name: "org.dandroid.bp",
2390 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002391
2392 override_android_app {
2393 name: "baz_no_rename_resources",
2394 base: "foo",
2395 package_name: "org.dandroid.bp",
2396 rename_resources_package: false,
2397 }
2398
2399 android_app {
2400 name: "foo_no_rename_resources",
2401 srcs: ["a.java"],
2402 certificate: "expiredkey",
2403 overrides: ["qux"],
2404 rename_resources_package: false,
2405 sdk_version: "current",
2406 }
2407
2408 override_android_app {
2409 name: "baz_base_no_rename_resources",
2410 base: "foo_no_rename_resources",
2411 package_name: "org.dandroid.bp",
2412 }
2413
2414 override_android_app {
2415 name: "baz_override_base_rename_resources",
2416 base: "foo_no_rename_resources",
2417 package_name: "org.dandroid.bp",
2418 rename_resources_package: true,
2419 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08002420 `)
2421
2422 expectedVariants := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002423 name string
2424 moduleName string
2425 variantName string
2426 apkName string
2427 apkPath string
2428 certFlag string
2429 certSigningFlags string
2430 overrides []string
2431 packageFlag string
2432 renameResources bool
2433 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08002434 }{
2435 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002436 name: "foo",
2437 moduleName: "foo",
2438 variantName: "android_common",
2439 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2440 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2441 certSigningFlags: "",
2442 overrides: []string{"qux"},
2443 packageFlag: "",
2444 renameResources: false,
2445 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002446 },
2447 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002448 name: "foo",
2449 moduleName: "bar",
2450 variantName: "android_common_bar",
2451 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2452 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
2453 certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
2454 overrides: []string{"qux", "foo"},
2455 packageFlag: "",
2456 renameResources: false,
2457 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002458 },
2459 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002460 name: "foo",
2461 moduleName: "baz",
2462 variantName: "android_common_baz",
2463 apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk",
2464 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2465 certSigningFlags: "",
2466 overrides: []string{"qux", "foo"},
2467 packageFlag: "org.dandroid.bp",
2468 renameResources: true,
2469 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002470 },
2471 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002472 name: "foo",
2473 moduleName: "baz_no_rename_resources",
2474 variantName: "android_common_baz_no_rename_resources",
2475 apkPath: "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
2476 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2477 certSigningFlags: "",
2478 overrides: []string{"qux", "foo"},
2479 packageFlag: "org.dandroid.bp",
2480 renameResources: false,
2481 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002482 },
2483 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002484 name: "foo_no_rename_resources",
2485 moduleName: "baz_base_no_rename_resources",
2486 variantName: "android_common_baz_base_no_rename_resources",
2487 apkPath: "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
2488 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2489 certSigningFlags: "",
2490 overrides: []string{"qux", "foo_no_rename_resources"},
2491 packageFlag: "org.dandroid.bp",
2492 renameResources: false,
2493 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002494 },
2495 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002496 name: "foo_no_rename_resources",
2497 moduleName: "baz_override_base_rename_resources",
2498 variantName: "android_common_baz_override_base_rename_resources",
2499 apkPath: "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
2500 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2501 certSigningFlags: "",
2502 overrides: []string{"qux", "foo_no_rename_resources"},
2503 packageFlag: "org.dandroid.bp",
2504 renameResources: true,
2505 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002506 },
2507 }
2508 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002509 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002510
2511 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002512 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002513
2514 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08002515 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07002516 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002517 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07002518
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002519 // Check the cert signing flags
2520 certSigningFlags := signapk.Args["flags"]
2521 android.AssertStringEquals(t, "cert signing flags", expected.certSigningFlags, certSigningFlags)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002522
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002523 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08002524 mod := variant.Module().(*AndroidApp)
zhidoua2ce78f2022-02-17 02:33:12 +00002525 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002526
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002527 // Test Overridable property: Logging_parent
2528 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002529 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002530
Liz Kammer1d5983b2020-05-19 19:15:37 +00002531 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002532 res := variant.Output("package-res.apk")
2533 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00002534 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
2535 expectedPackage := expected.packageFlag
2536 if !expected.renameResources {
2537 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00002538 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002539 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002540 }
2541}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07002542
zhidoua2ce78f2022-02-17 02:33:12 +00002543func TestOverrideAndroidAppOverrides(t *testing.T) {
2544 ctx, _ := testJava(
2545 t, `
2546 android_app {
2547 name: "foo",
2548 srcs: ["a.java"],
2549 sdk_version: "current",
2550 overrides: ["qux"]
2551 }
2552
2553 android_app {
2554 name: "bar",
2555 srcs: ["b.java"],
2556 sdk_version: "current",
2557 overrides: ["foo"]
2558 }
2559
2560 override_android_app {
2561 name: "foo_override",
2562 base: "foo",
2563 overrides: ["bar"]
2564 }
2565 `)
2566
2567 expectedVariants := []struct {
2568 name string
2569 moduleName string
2570 variantName string
2571 overrides []string
2572 }{
2573 {
2574 name: "foo",
2575 moduleName: "foo",
2576 variantName: "android_common",
2577 overrides: []string{"qux"},
2578 },
2579 {
2580 name: "bar",
2581 moduleName: "bar",
2582 variantName: "android_common",
2583 overrides: []string{"foo"},
2584 },
2585 {
2586 name: "foo",
2587 moduleName: "foo_override",
2588 variantName: "android_common_foo_override",
2589 overrides: []string{"bar", "foo"},
2590 },
2591 }
2592 for _, expected := range expectedVariants {
2593 variant := ctx.ModuleForTests(expected.name, expected.variantName)
2594
2595 // Check if the overrides field values are correctly aggregated.
2596 mod := variant.Module().(*AndroidApp)
2597 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2598 }
2599}
2600
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002601func TestOverrideAndroidAppWithPrebuilt(t *testing.T) {
2602 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2603 t, `
2604 android_app {
2605 name: "foo",
2606 srcs: ["a.java"],
2607 sdk_version: "current",
2608 }
2609
2610 override_android_app {
2611 name: "bar",
2612 base: "foo",
2613 }
2614
2615 android_app_import {
2616 name: "bar",
2617 prefer: true,
2618 apk: "bar.apk",
2619 presigned: true,
2620 }
2621 `)
2622
2623 // An app that has an override that also has a prebuilt should not be hidden.
2624 foo := result.ModuleForTests("foo", "android_common")
2625 if foo.Module().IsHideFromMake() {
2626 t.Errorf("expected foo to have HideFromMake false")
2627 }
2628
2629 // An override that also has a prebuilt should be hidden.
2630 barOverride := result.ModuleForTests("foo", "android_common_bar")
2631 if !barOverride.Module().IsHideFromMake() {
2632 t.Errorf("expected bar override variant of foo to have HideFromMake true")
2633 }
2634}
2635
Jooyung Han01d80d82022-01-08 12:16:32 +09002636func TestOverrideAndroidAppStem(t *testing.T) {
2637 ctx, _ := testJava(t, `
2638 android_app {
2639 name: "foo",
2640 srcs: ["a.java"],
2641 sdk_version: "current",
2642 }
2643 override_android_app {
2644 name: "bar",
2645 base: "foo",
2646 }
2647 override_android_app {
2648 name: "baz",
2649 base: "foo",
2650 stem: "baz_stem",
2651 }
2652 android_app {
2653 name: "foo2",
2654 srcs: ["a.java"],
2655 sdk_version: "current",
2656 stem: "foo2_stem",
2657 }
2658 override_android_app {
2659 name: "bar2",
2660 base: "foo2",
2661 }
2662 override_android_app {
2663 name: "baz2",
2664 base: "foo2",
2665 stem: "baz2_stem",
2666 }
2667 `)
2668 for _, expected := range []struct {
2669 moduleName string
2670 variantName string
2671 apkPath string
2672 }{
2673 {
2674 moduleName: "foo",
2675 variantName: "android_common",
2676 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2677 },
2678 {
2679 moduleName: "foo",
2680 variantName: "android_common_bar",
2681 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2682 },
2683 {
2684 moduleName: "foo",
2685 variantName: "android_common_baz",
2686 apkPath: "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk",
2687 },
2688 {
2689 moduleName: "foo2",
2690 variantName: "android_common",
2691 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2692 },
2693 {
2694 moduleName: "foo2",
2695 variantName: "android_common_bar2",
2696 // Note that this may cause the duplicate output error.
2697 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2698 },
2699 {
2700 moduleName: "foo2",
2701 variantName: "android_common_baz2",
2702 apkPath: "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
2703 },
2704 } {
2705 variant := ctx.ModuleForTests(expected.moduleName, expected.variantName)
2706 variant.Output(expected.apkPath)
2707 }
2708}
2709
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002710func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002711 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002712 android_app {
2713 name: "foo",
2714 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002715 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002716 }
2717
2718 override_android_app {
2719 name: "bar",
2720 base: "foo",
2721 package_name: "org.dandroid.bp",
2722 }
2723
2724 android_test {
2725 name: "baz",
2726 srcs: ["b.java"],
2727 instrumentation_for: "foo",
2728 }
2729
2730 android_test {
2731 name: "qux",
2732 srcs: ["b.java"],
2733 instrumentation_for: "bar",
2734 }
2735 `)
2736
2737 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002738 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002739 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002740 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2741 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2742 }
2743
2744 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002745 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002746 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002747 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2748 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2749 }
2750}
2751
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002752func TestOverrideAndroidTest(t *testing.T) {
2753 ctx, _ := testJava(t, `
2754 android_app {
2755 name: "foo",
2756 srcs: ["a.java"],
2757 package_name: "com.android.foo",
2758 sdk_version: "current",
2759 }
2760
2761 override_android_app {
2762 name: "bar",
2763 base: "foo",
2764 package_name: "com.android.bar",
2765 }
2766
2767 android_test {
2768 name: "foo_test",
2769 srcs: ["b.java"],
2770 instrumentation_for: "foo",
2771 }
2772
2773 override_android_test {
2774 name: "bar_test",
2775 base: "foo_test",
2776 package_name: "com.android.bar.test",
2777 instrumentation_for: "bar",
2778 instrumentation_target_package: "com.android.bar",
2779 }
2780 `)
2781
2782 expectedVariants := []struct {
2783 moduleName string
2784 variantName string
2785 apkPath string
2786 overrides []string
2787 targetVariant string
2788 packageFlag string
2789 targetPackageFlag string
2790 }{
2791 {
2792 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002793 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002794 overrides: nil,
2795 targetVariant: "android_common",
2796 packageFlag: "",
2797 targetPackageFlag: "",
2798 },
2799 {
2800 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002801 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002802 overrides: []string{"foo_test"},
2803 targetVariant: "android_common_bar",
2804 packageFlag: "com.android.bar.test",
2805 targetPackageFlag: "com.android.bar",
2806 },
2807 }
2808 for _, expected := range expectedVariants {
2809 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2810
2811 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002812 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002813
2814 // Check if the overrides field values are correctly aggregated.
2815 mod := variant.Module().(*AndroidTest)
zhidoua2ce78f2022-02-17 02:33:12 +00002816 if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002817 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
zhidoua2ce78f2022-02-17 02:33:12 +00002818 expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002819 }
2820
2821 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01002822 javac := variant.Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002823 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002824 if !strings.Contains(javac.Args["classpath"], turbine) {
2825 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2826 }
2827
2828 // Check aapt2 flags.
2829 res := variant.Output("package-res.apk")
2830 aapt2Flags := res.Args["flags"]
2831 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002832 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002833 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2834 }
2835}
2836
Jaewoong Jung39982342020-01-14 10:27:18 -08002837func TestAndroidTest_FixTestConfig(t *testing.T) {
2838 ctx, _ := testJava(t, `
2839 android_app {
2840 name: "foo",
2841 srcs: ["a.java"],
2842 package_name: "com.android.foo",
2843 sdk_version: "current",
2844 }
2845
2846 android_test {
2847 name: "foo_test",
2848 srcs: ["b.java"],
2849 instrumentation_for: "foo",
2850 }
2851
2852 android_test {
2853 name: "bar_test",
2854 srcs: ["b.java"],
2855 package_name: "com.android.bar.test",
2856 instrumentation_for: "foo",
Seth Moorec6f4b532023-02-02 13:22:26 -08002857 mainline_package_name: "com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08002858 }
2859
2860 override_android_test {
2861 name: "baz_test",
2862 base: "foo_test",
2863 package_name: "com.android.baz.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08002864 mainline_package_name: "com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08002865 }
2866 `)
2867
2868 testCases := []struct {
2869 moduleName string
2870 variantName string
2871 expectedFlags []string
2872 }{
2873 {
2874 moduleName: "foo_test",
2875 variantName: "android_common",
2876 },
2877 {
2878 moduleName: "bar_test",
2879 variantName: "android_common",
2880 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002881 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002882 "--package-name com.android.bar.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08002883 "--mainline-package-name com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08002884 },
2885 },
2886 {
2887 moduleName: "foo_test",
2888 variantName: "android_common_baz_test",
2889 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002890 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002891 "--package-name com.android.baz.test",
2892 "--test-file-name baz_test.apk",
Seth Moorec6f4b532023-02-02 13:22:26 -08002893 "out/soong/.intermediates/foo_test/android_common_baz_test/test_config_fixer/AndroidTest.xml",
2894 "--mainline-package-name com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08002895 },
2896 },
2897 }
2898
2899 for _, test := range testCases {
2900 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01002901 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08002902
2903 if len(test.expectedFlags) > 0 {
2904 if params.Rule == nil {
2905 t.Errorf("test_config_fixer was expected to run, but didn't")
2906 } else {
2907 for _, flag := range test.expectedFlags {
2908 if !strings.Contains(params.RuleParams.Command, flag) {
2909 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
2910 }
2911 }
2912 }
2913 } else {
2914 if params.Rule != nil {
2915 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
2916 }
2917 }
Jaewoong Jung39982342020-01-14 10:27:18 -08002918 }
2919}
2920
Paul Duffin53a70a42022-01-11 14:35:55 +00002921func TestInstrumentationTargetPrebuilt(t *testing.T) {
2922 bp := `
2923 android_app_import {
2924 name: "foo",
2925 apk: "foo.apk",
2926 presigned: true,
2927 }
2928
2929 android_test {
2930 name: "bar",
2931 srcs: ["a.java"],
2932 instrumentation_for: "foo",
2933 sdk_version: "current",
2934 }
2935 `
2936
2937 android.GroupFixturePreparers(
2938 PrepareForTestWithJavaDefaultModules,
2939 ).ExtendWithErrorHandler(
2940 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
2941 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
2942 RunTestWithBp(t, bp)
2943}
2944
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002945func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002946 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002947 cc_library {
2948 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08002949 sdk_version: "current",
2950 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002951 }
2952
2953 android_test {
2954 name: "stl",
2955 jni_libs: ["libjni"],
2956 compile_multilib: "both",
2957 sdk_version: "current",
2958 stl: "c++_shared",
2959 }
2960
2961 android_test {
2962 name: "system",
2963 jni_libs: ["libjni"],
2964 compile_multilib: "both",
2965 sdk_version: "current",
2966 }
2967 `)
2968
2969 testCases := []struct {
2970 name string
2971 jnis []string
2972 }{
2973 {"stl",
2974 []string{
2975 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07002976 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002977 },
2978 },
2979 {"system",
2980 []string{
2981 "libjni.so",
2982 },
2983 },
2984 }
2985
2986 for _, test := range testCases {
2987 t.Run(test.name, func(t *testing.T) {
2988 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07002989 jniLibZip := app.Output("jnilibs.zip")
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002990 var jnis []string
2991 args := strings.Fields(jniLibZip.Args["jarArgs"])
2992 for i := 0; i < len(args); i++ {
2993 if args[i] == "-f" {
2994 jnis = append(jnis, args[i+1])
2995 i += 1
2996 }
2997 }
2998 jnisJoined := strings.Join(jnis, " ")
2999 for _, jni := range test.jnis {
3000 if !strings.Contains(jnisJoined, jni) {
3001 t.Errorf("missing jni %q in %q", jni, jnis)
3002 }
3003 }
3004 })
3005 }
3006}
Colin Cross50ddcc42019-05-16 12:28:22 -07003007
3008func TestUsesLibraries(t *testing.T) {
3009 bp := `
3010 java_sdk_library {
3011 name: "foo",
3012 srcs: ["a.java"],
3013 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003014 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003015 }
3016
3017 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01003018 name: "qux",
3019 srcs: ["a.java"],
3020 api_packages: ["qux"],
3021 sdk_version: "current",
3022 }
3023
3024 java_sdk_library {
3025 name: "quuz",
3026 srcs: ["a.java"],
3027 api_packages: ["quuz"],
3028 sdk_version: "current",
3029 }
3030
3031 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003032 name: "fred",
3033 srcs: ["a.java"],
3034 api_packages: ["fred"],
3035 sdk_version: "current",
3036 }
3037
3038 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07003039 name: "bar",
3040 srcs: ["a.java"],
3041 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003042 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003043 }
3044
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01003045 java_sdk_library {
3046 name: "runtime-library",
3047 srcs: ["a.java"],
3048 sdk_version: "current",
3049 }
3050
3051 java_library {
3052 name: "static-runtime-helper",
3053 srcs: ["a.java"],
3054 libs: ["runtime-library"],
3055 sdk_version: "current",
3056 }
3057
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003058 java_library {
3059 name: "runtime-required-x",
3060 srcs: ["a.java"],
3061 installable: true,
3062 sdk_version: "current",
3063 }
3064
3065 java_library {
3066 name: "runtime-optional-x",
3067 srcs: ["a.java"],
3068 installable: true,
3069 sdk_version: "current",
3070 }
3071
3072 android_library {
3073 name: "static-x",
3074 uses_libs: ["runtime-required-x"],
3075 optional_uses_libs: ["runtime-optional-x"],
3076 sdk_version: "current",
3077 }
3078
3079 java_library {
3080 name: "runtime-required-y",
3081 srcs: ["a.java"],
3082 installable: true,
3083 sdk_version: "current",
3084 }
3085
3086 java_library {
3087 name: "runtime-optional-y",
3088 srcs: ["a.java"],
3089 installable: true,
3090 sdk_version: "current",
3091 }
3092
3093 java_library {
3094 name: "static-y",
3095 srcs: ["a.java"],
3096 uses_libs: ["runtime-required-y"],
3097 optional_uses_libs: ["runtime-optional-y"],
3098 sdk_version: "current",
3099 }
3100
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003101 // A library that has to use "provides_uses_lib", because:
3102 // - it is not an SDK library
3103 // - its library name is different from its module name
3104 java_library {
3105 name: "non-sdk-lib",
3106 provides_uses_lib: "com.non.sdk.lib",
3107 installable: true,
3108 srcs: ["a.java"],
3109 }
3110
Colin Cross50ddcc42019-05-16 12:28:22 -07003111 android_app {
3112 name: "app",
3113 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003114 libs: [
3115 "qux",
3116 "quuz.stubs"
3117 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003118 static_libs: [
3119 "static-runtime-helper",
3120 // statically linked component libraries should not pull their SDK libraries,
3121 // so "fred" should not be added to class loader context
3122 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003123 "static-x",
3124 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003125 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003126 uses_libs: [
3127 "foo",
3128 "non-sdk-lib"
3129 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003130 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003131 optional_uses_libs: [
3132 "bar",
3133 "baz",
3134 ],
3135 }
3136
3137 android_app_import {
3138 name: "prebuilt",
3139 apk: "prebuilts/apk/app.apk",
3140 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003141 uses_libs: [
3142 "foo",
3143 "non-sdk-lib",
3144 "android.test.runner"
3145 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07003146 optional_uses_libs: [
3147 "bar",
3148 "baz",
3149 ],
3150 }
3151 `
3152
Paul Duffin71ae5942021-03-22 15:36:52 +00003153 result := android.GroupFixturePreparers(
3154 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003155 PrepareForTestWithJavaSdkLibraryFiles,
3156 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Jiakai Zhang48203e32023-06-02 23:42:21 +01003157 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3158 variables.BuildWarningBadOptionalUsesLibsAllowlist = []string{"app", "prebuilt"}
3159 }),
Paul Duffind234b412021-03-12 23:04:46 +00003160 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07003161
Paul Duffind234b412021-03-12 23:04:46 +00003162 app := result.ModuleForTests("app", "android_common")
3163 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07003164
Paul Duffin859fe962020-05-15 10:20:31 +01003165 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003166 // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be
3167 // propagated from dependencies.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003168 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3169 expectManifestFixerArgs := `--extract-native-libs=true ` +
3170 `--uses-library qux ` +
3171 `--uses-library quuz ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003172 `--uses-library foo ` +
3173 `--uses-library com.non.sdk.lib ` +
3174 `--uses-library runtime-library ` +
3175 `--uses-library runtime-required-x ` +
3176 `--uses-library runtime-required-y ` +
3177 `--optional-uses-library bar ` +
3178 `--optional-uses-library runtime-optional-x ` +
3179 `--optional-uses-library runtime-optional-y`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003180 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01003181
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003182 // Test that all libraries are verified (library order matters).
3183 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
3184 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00003185 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003186 `--uses-library qux ` +
3187 `--uses-library quuz ` +
3188 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003189 `--uses-library runtime-required-x ` +
3190 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003191 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003192 `--optional-uses-library baz ` +
3193 `--optional-uses-library runtime-optional-x ` +
3194 `--optional-uses-library runtime-optional-y `
Paul Duffind234b412021-03-12 23:04:46 +00003195 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003196
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003197 // Test that all libraries are verified for an APK (library order matters).
3198 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00003199 verifyApkArgs := `--uses-library foo ` +
3200 `--uses-library com.non.sdk.lib ` +
3201 `--uses-library android.test.runner ` +
3202 `--optional-uses-library bar ` +
3203 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00003204 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003205
Jiakai Zhanga4496782023-05-17 16:57:30 +01003206 // Test that necessary args are passed for constructing CLC in Ninja phase.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003207 cmd := app.Rule("dexpreopt").RuleParams.Command
Jiakai Zhanga4496782023-05-17 16:57:30 +01003208 android.AssertStringDoesContain(t, "dexpreopt app cmd context", cmd, "--context-json=")
3209 android.AssertStringDoesContain(t, "dexpreopt app cmd product_packages", cmd,
Jiakai Zhang51b2a8b2023-06-26 16:47:38 +01003210 "--product-packages=out/soong/.intermediates/app/android_common/dexpreopt/product_packages.txt")
Colin Cross50ddcc42019-05-16 12:28:22 -07003211}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003212
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003213func TestDexpreoptBcp(t *testing.T) {
3214 bp := `
3215 java_sdk_library {
3216 name: "foo",
3217 srcs: ["a.java"],
3218 api_packages: ["foo"],
3219 sdk_version: "current",
3220 }
3221
3222 java_sdk_library {
3223 name: "bar",
3224 srcs: ["a.java"],
3225 api_packages: ["bar"],
3226 permitted_packages: ["bar"],
3227 sdk_version: "current",
3228 }
3229
3230 android_app {
3231 name: "app",
3232 srcs: ["a.java"],
3233 sdk_version: "current",
3234 }
3235 `
3236
3237 testCases := []struct {
3238 name string
3239 with bool
3240 expect string
3241 }{
3242 {
3243 name: "with updatable bcp",
3244 with: true,
3245 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
3246 },
3247 {
3248 name: "without updatable bcp",
3249 with: false,
3250 expect: "/system/framework/foo.jar",
3251 },
3252 }
3253
3254 for _, test := range testCases {
3255 t.Run(test.name, func(t *testing.T) {
3256 result := android.GroupFixturePreparers(
3257 prepareForJavaTest,
3258 PrepareForTestWithJavaSdkLibraryFiles,
3259 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
3260 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01003261 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003262 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
3263 ).RunTestWithBp(t, bp)
3264
3265 app := result.ModuleForTests("app", "android_common")
3266 cmd := app.Rule("dexpreopt").RuleParams.Command
3267 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
3268 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
3269 })
3270 }
3271}
3272
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003273func TestCodelessApp(t *testing.T) {
3274 testCases := []struct {
3275 name string
3276 bp string
3277 noCode bool
3278 }{
3279 {
3280 name: "normal",
3281 bp: `
3282 android_app {
3283 name: "foo",
3284 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003285 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003286 }
3287 `,
3288 noCode: false,
3289 },
3290 {
3291 name: "app without sources",
3292 bp: `
3293 android_app {
3294 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003295 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003296 }
3297 `,
3298 noCode: true,
3299 },
3300 {
3301 name: "app with libraries",
3302 bp: `
3303 android_app {
3304 name: "foo",
3305 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003306 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003307 }
3308
3309 java_library {
3310 name: "lib",
3311 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003312 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003313 }
3314 `,
3315 noCode: false,
3316 },
3317 {
3318 name: "app with sourceless libraries",
3319 bp: `
3320 android_app {
3321 name: "foo",
3322 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003323 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003324 }
3325
3326 java_library {
3327 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003328 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003329 }
3330 `,
3331 // TODO(jungjw): this should probably be true
3332 noCode: false,
3333 },
3334 }
3335
3336 for _, test := range testCases {
3337 t.Run(test.name, func(t *testing.T) {
3338 ctx := testApp(t, test.bp)
3339
3340 foo := ctx.ModuleForTests("foo", "android_common")
3341 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3342 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
3343 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
3344 }
3345 })
3346 }
3347}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07003348
Colin Cross53a87f52019-06-25 13:35:30 -07003349func TestUncompressDex(t *testing.T) {
3350 testCases := []struct {
3351 name string
3352 bp string
3353
3354 uncompressedPlatform bool
3355 uncompressedUnbundled bool
3356 }{
3357 {
3358 name: "normal",
3359 bp: `
3360 android_app {
3361 name: "foo",
3362 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003363 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003364 }
3365 `,
3366 uncompressedPlatform: true,
3367 uncompressedUnbundled: false,
3368 },
3369 {
3370 name: "use_embedded_dex",
3371 bp: `
3372 android_app {
3373 name: "foo",
3374 use_embedded_dex: true,
3375 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003376 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003377 }
3378 `,
3379 uncompressedPlatform: true,
3380 uncompressedUnbundled: true,
3381 },
3382 {
3383 name: "privileged",
3384 bp: `
3385 android_app {
3386 name: "foo",
3387 privileged: true,
3388 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003389 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003390 }
3391 `,
3392 uncompressedPlatform: true,
3393 uncompressedUnbundled: true,
3394 },
David Srbeckye033cba2020-05-20 22:20:28 +01003395 {
3396 name: "normal_uncompress_dex_true",
3397 bp: `
3398 android_app {
3399 name: "foo",
3400 srcs: ["a.java"],
3401 sdk_version: "current",
3402 uncompress_dex: true,
3403 }
3404 `,
3405 uncompressedPlatform: true,
3406 uncompressedUnbundled: true,
3407 },
3408 {
3409 name: "normal_uncompress_dex_false",
3410 bp: `
3411 android_app {
3412 name: "foo",
3413 srcs: ["a.java"],
3414 sdk_version: "current",
3415 uncompress_dex: false,
3416 }
3417 `,
3418 uncompressedPlatform: false,
3419 uncompressedUnbundled: false,
3420 },
Colin Cross53a87f52019-06-25 13:35:30 -07003421 }
3422
3423 test := func(t *testing.T, bp string, want bool, unbundled bool) {
3424 t.Helper()
3425
Paul Duffin71ae5942021-03-22 15:36:52 +00003426 result := android.GroupFixturePreparers(
3427 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003428 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00003429 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3430 if unbundled {
3431 variables.Unbundled_build = proptools.BoolPtr(true)
3432 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
3433 }
3434 }),
3435 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07003436
Paul Duffincdb88a92021-03-14 00:36:50 +00003437 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07003438 dex := foo.Rule("r8")
3439 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
3440 aligned := foo.MaybeRule("zipalign").Rule != nil
3441
Paul Duffincdb88a92021-03-14 00:36:50 +00003442 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07003443
Paul Duffincdb88a92021-03-14 00:36:50 +00003444 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07003445 }
3446
3447 for _, tt := range testCases {
3448 t.Run(tt.name, func(t *testing.T) {
3449 t.Run("platform", func(t *testing.T) {
3450 test(t, tt.bp, tt.uncompressedPlatform, false)
3451 })
3452 t.Run("unbundled", func(t *testing.T) {
3453 test(t, tt.bp, tt.uncompressedUnbundled, true)
3454 })
3455 })
3456 }
3457}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003458
3459func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
3460 if expectedValue != "" {
3461 expectedFlag := "--" + flagName + " " + expectedValue
3462 if !strings.Contains(aapt2Flags, expectedFlag) {
3463 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
3464 }
3465 } else {
3466 unexpectedFlag := "--" + flagName
3467 if strings.Contains(aapt2Flags, unexpectedFlag) {
3468 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
3469 }
3470 }
3471}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08003472
Cole Faust9a631312020-10-22 21:05:24 +00003473func TestExportedProguardFlagFiles(t *testing.T) {
3474 ctx, _ := testJava(t, `
3475 android_app {
3476 name: "foo",
3477 sdk_version: "current",
3478 static_libs: ["lib1"],
3479 }
3480
3481 android_library {
3482 name: "lib1",
3483 sdk_version: "current",
3484 optimize: {
3485 proguard_flags_files: ["lib1proguard.cfg"],
3486 }
3487 }
3488 `)
3489
3490 m := ctx.ModuleForTests("foo", "android_common")
3491 hasLib1Proguard := false
3492 for _, s := range m.Rule("java.r8").Implicits.Strings() {
3493 if s == "lib1proguard.cfg" {
3494 hasLib1Proguard = true
3495 break
3496 }
3497 }
3498
3499 if !hasLib1Proguard {
3500 t.Errorf("App does not use library proguard config")
3501 }
3502}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003503
3504func TestTargetSdkVersionManifestFixer(t *testing.T) {
3505 platform_sdk_codename := "Tiramisu"
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003506 platform_sdk_version := 33
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003507 testCases := []struct {
3508 name string
3509 targetSdkVersionInBp string
3510 targetSdkVersionExpected string
3511 unbundledBuild bool
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003512 platformSdkFinal bool
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003513 }{
3514 {
3515 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
3516 targetSdkVersionInBp: "30",
3517 targetSdkVersionExpected: "30",
3518 unbundledBuild: false,
3519 },
3520 {
3521 name: "Unbundled build: Android.bp has targetSdkVersion",
3522 targetSdkVersionInBp: "30",
3523 targetSdkVersionExpected: "30",
3524 unbundledBuild: true,
3525 },
3526 {
3527 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3528 targetSdkVersionInBp: platform_sdk_codename,
3529 targetSdkVersionExpected: platform_sdk_codename,
3530 unbundledBuild: false,
3531 },
3532 {
3533 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3534 targetSdkVersionInBp: platform_sdk_codename,
3535 targetSdkVersionExpected: "10000",
3536 unbundledBuild: true,
3537 },
3538
3539 {
3540 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
3541 targetSdkVersionExpected: platform_sdk_codename,
3542 unbundledBuild: false,
3543 },
3544 {
3545 name: "Unbundled build: Android.bp has no targetSdkVersion",
3546 targetSdkVersionExpected: "10000",
3547 unbundledBuild: true,
3548 },
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003549 {
3550 name: "Bundled build in REL branches",
3551 targetSdkVersionExpected: "33",
3552 unbundledBuild: false,
3553 platformSdkFinal: true,
3554 },
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003555 }
3556 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003557 targetSdkVersionTemplate := ""
3558 if testCase.targetSdkVersionInBp != "" {
3559 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, testCase.targetSdkVersionInBp)
3560 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003561 bp := fmt.Sprintf(`
3562 android_app {
3563 name: "foo",
3564 sdk_version: "current",
Spandan Dasca70fc42023-03-01 23:38:49 +00003565 %s
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003566 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003567 `, targetSdkVersionTemplate)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003568 fixture := android.GroupFixturePreparers(
3569 prepareForJavaTest,
3570 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003571 if testCase.platformSdkFinal {
3572 variables.Platform_sdk_final = proptools.BoolPtr(true)
3573 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003574 // explicitly set platform_sdk_codename to make the test deterministic
3575 variables.Platform_sdk_codename = &platform_sdk_codename
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003576 variables.Platform_sdk_version = &platform_sdk_version
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003577 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3578 // create a non-empty list if unbundledBuild==true
3579 if testCase.unbundledBuild {
3580 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3581 }
3582 }),
3583 )
3584
3585 result := fixture.RunTestWithBp(t, bp)
3586 foo := result.ModuleForTests("foo", "android_common")
3587
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003588 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3589 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003590 }
3591}
Colin Cross412436f2022-04-07 17:40:07 -07003592
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003593func TestDefaultAppTargetSdkVersionForUpdatableModules(t *testing.T) {
3594 platform_sdk_codename := "Tiramisu"
3595 platform_sdk_version := 33
3596 testCases := []struct {
3597 name string
3598 platform_sdk_final bool
3599 targetSdkVersionInBp *string
3600 targetSdkVersionExpected *string
3601 updatable bool
3602 }{
3603 {
3604 name: "Non-Updatable Module: Android.bp has older targetSdkVersion",
3605 targetSdkVersionInBp: proptools.StringPtr("29"),
3606 targetSdkVersionExpected: proptools.StringPtr("29"),
3607 updatable: false,
3608 },
3609 {
3610 name: "Updatable Module: Android.bp has older targetSdkVersion",
3611 targetSdkVersionInBp: proptools.StringPtr("30"),
3612 targetSdkVersionExpected: proptools.StringPtr("30"),
3613 updatable: true,
3614 },
3615 {
3616 name: "Updatable Module: Android.bp has no targetSdkVersion",
3617 targetSdkVersionExpected: proptools.StringPtr("10000"),
3618 updatable: true,
3619 },
3620 {
3621 name: "[SDK finalised] Non-Updatable Module: Android.bp has older targetSdkVersion",
3622 platform_sdk_final: true,
3623 targetSdkVersionInBp: proptools.StringPtr("30"),
3624 targetSdkVersionExpected: proptools.StringPtr("30"),
3625 updatable: false,
3626 },
3627 {
3628 name: "[SDK finalised] Updatable Module: Android.bp has older targetSdkVersion",
3629 platform_sdk_final: true,
3630 targetSdkVersionInBp: proptools.StringPtr("30"),
3631 targetSdkVersionExpected: proptools.StringPtr("30"),
3632 updatable: true,
3633 },
3634 {
3635 name: "[SDK finalised] Updatable Module: Android.bp has targetSdkVersion as platform sdk codename",
3636 platform_sdk_final: true,
3637 targetSdkVersionInBp: proptools.StringPtr(platform_sdk_codename),
3638 targetSdkVersionExpected: proptools.StringPtr("33"),
3639 updatable: true,
3640 },
3641 {
3642 name: "[SDK finalised] Updatable Module: Android.bp has no targetSdkVersion",
3643 platform_sdk_final: true,
3644 targetSdkVersionExpected: proptools.StringPtr("33"),
3645 updatable: true,
3646 },
3647 }
3648 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003649 targetSdkVersionTemplate := ""
3650 if testCase.targetSdkVersionInBp != nil {
3651 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, *testCase.targetSdkVersionInBp)
3652 }
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003653 bp := fmt.Sprintf(`
3654 android_app {
3655 name: "foo",
3656 sdk_version: "current",
3657 min_sdk_version: "29",
Spandan Dasca70fc42023-03-01 23:38:49 +00003658 %s
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003659 updatable: %t,
3660 enforce_default_target_sdk_version: %t
3661 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003662 `, targetSdkVersionTemplate, testCase.updatable, testCase.updatable) // enforce default target sdk version if app is updatable
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003663
3664 fixture := android.GroupFixturePreparers(
3665 PrepareForTestWithJavaDefaultModules,
3666 android.PrepareForTestWithAllowMissingDependencies,
3667 android.PrepareForTestWithAndroidMk,
3668 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3669 // explicitly set following platform variables to make the test deterministic
3670 variables.Platform_sdk_final = &testCase.platform_sdk_final
3671 variables.Platform_sdk_version = &platform_sdk_version
3672 variables.Platform_sdk_codename = &platform_sdk_codename
3673 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
Harshit Mahajan18845d02023-01-11 18:39:12 +00003674 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003675 variables.Unbundled_build_apps = []string{"sampleModule"}
3676 }),
3677 )
3678
3679 result := fixture.RunTestWithBp(t, bp)
3680 foo := result.ModuleForTests("foo", "android_common")
3681
3682 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3683 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+*testCase.targetSdkVersionExpected)
3684 }
3685}
3686
3687func TestEnforceDefaultAppTargetSdkVersionFlag(t *testing.T) {
3688 platform_sdk_codename := "Tiramisu"
3689 platform_sdk_version := 33
3690 testCases := []struct {
3691 name string
3692 enforceDefaultTargetSdkVersion bool
3693 expectedError string
3694 platform_sdk_final bool
3695 targetSdkVersionInBp string
3696 targetSdkVersionExpected string
3697 updatable bool
3698 }{
3699 {
3700 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
3701 enforceDefaultTargetSdkVersion: false,
3702 targetSdkVersionInBp: "29",
3703 targetSdkVersionExpected: "29",
3704 updatable: false,
3705 },
3706 {
3707 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3708 enforceDefaultTargetSdkVersion: true,
3709 platform_sdk_final: true,
3710 targetSdkVersionInBp: "current",
3711 targetSdkVersionExpected: "33",
3712 updatable: true,
3713 },
3714 {
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003715 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003716 enforceDefaultTargetSdkVersion: true,
3717 platform_sdk_final: false,
3718 targetSdkVersionInBp: "current",
3719 targetSdkVersionExpected: "10000",
3720 updatable: false,
3721 },
3722 {
3723 name: "Not enforcing Target SDK Version for Updatable app",
3724 enforceDefaultTargetSdkVersion: false,
3725 expectedError: "Updatable apps must enforce default target sdk version",
3726 targetSdkVersionInBp: "29",
3727 targetSdkVersionExpected: "29",
3728 updatable: true,
3729 },
3730 }
3731 for _, testCase := range testCases {
3732 errExpected := testCase.expectedError != ""
3733 bp := fmt.Sprintf(`
3734 android_app {
3735 name: "foo",
3736 enforce_default_target_sdk_version: %t,
3737 sdk_version: "current",
3738 min_sdk_version: "29",
3739 target_sdk_version: "%v",
3740 updatable: %t
3741 }
3742 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp, testCase.updatable)
3743
3744 fixture := android.GroupFixturePreparers(
3745 PrepareForTestWithJavaDefaultModules,
3746 android.PrepareForTestWithAllowMissingDependencies,
3747 android.PrepareForTestWithAndroidMk,
3748 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3749 // explicitly set following platform variables to make the test deterministic
3750 variables.Platform_sdk_final = &testCase.platform_sdk_final
3751 variables.Platform_sdk_version = &platform_sdk_version
3752 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00003753 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003754 variables.Unbundled_build_apps = []string{"sampleModule"}
3755 }),
3756 )
3757
3758 errorHandler := android.FixtureExpectsNoErrors
3759 if errExpected {
3760 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
3761 }
3762 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
3763
3764 if !errExpected {
3765 foo := result.ModuleForTests("foo", "android_common")
3766 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3767 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3768 }
3769 }
3770}
3771
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003772func TestEnforceDefaultAppTargetSdkVersionFlagForTests(t *testing.T) {
3773 platform_sdk_codename := "Tiramisu"
3774 platform_sdk_version := 33
3775 testCases := []struct {
3776 name string
3777 enforceDefaultTargetSdkVersion bool
3778 expectedError string
3779 platform_sdk_final bool
3780 targetSdkVersionInBp string
3781 targetSdkVersionExpected string
3782 }{
3783 {
3784 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
3785 enforceDefaultTargetSdkVersion: false,
3786 targetSdkVersionInBp: "29",
3787 targetSdkVersionExpected: "29",
3788 },
3789 {
3790 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3791 enforceDefaultTargetSdkVersion: true,
3792 platform_sdk_final: true,
3793 targetSdkVersionInBp: "current",
3794 targetSdkVersionExpected: "33",
3795 },
3796 {
3797 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3798 enforceDefaultTargetSdkVersion: true,
3799 platform_sdk_final: false,
3800 targetSdkVersionInBp: "current",
3801 targetSdkVersionExpected: "10000",
3802 },
3803 }
3804 for _, testCase := range testCases {
3805 errExpected := testCase.expectedError != ""
3806 bp := fmt.Sprintf(`
3807 android_test {
3808 name: "foo",
3809 enforce_default_target_sdk_version: %t,
3810 min_sdk_version: "29",
3811 target_sdk_version: "%v",
3812 }
3813 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp)
3814
3815 fixture := android.GroupFixturePreparers(
3816 PrepareForTestWithJavaDefaultModules,
3817 android.PrepareForTestWithAllowMissingDependencies,
3818 android.PrepareForTestWithAndroidMk,
3819 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3820 // explicitly set following platform variables to make the test deterministic
3821 variables.Platform_sdk_final = &testCase.platform_sdk_final
3822 variables.Platform_sdk_version = &platform_sdk_version
3823 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00003824 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003825 variables.Unbundled_build_apps = []string{"sampleModule"}
3826 }),
3827 )
3828
3829 errorHandler := android.FixtureExpectsNoErrors
3830 if errExpected {
3831 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
3832 }
3833 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
3834
3835 if !errExpected {
3836 foo := result.ModuleForTests("foo", "android_common")
3837 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3838 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3839 }
3840 }
3841}
3842
Colin Cross412436f2022-04-07 17:40:07 -07003843func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
3844 result := android.GroupFixturePreparers(
3845 PrepareForTestWithJavaDefaultModules,
3846 android.PrepareForTestWithAllowMissingDependencies,
3847 android.PrepareForTestWithAndroidMk,
3848 ).RunTestWithBp(t, `
3849 android_app {
3850 name: "foo",
3851 srcs: ["a.java"],
3852 certificate: ":missing_certificate",
3853 sdk_version: "current",
Zyan Wub7550aa2023-05-18 15:46:31 +08003854 }
3855
3856 android_app {
3857 name: "bar",
3858 srcs: ["a.java"],
3859 certificate: ":missing_certificate",
3860 product_specific: true,
3861 sdk_version: "current",
Colin Cross412436f2022-04-07 17:40:07 -07003862 }`)
3863
3864 foo := result.ModuleForTests("foo", "android_common")
3865 fooApk := foo.Output("foo.apk")
3866 if fooApk.Rule != android.ErrorRule {
3867 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
3868 }
3869 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
3870}
Sam Delmerico82602492022-06-10 17:05:42 +00003871
3872func TestAppIncludesJniPackages(t *testing.T) {
3873 ctx := android.GroupFixturePreparers(
3874 PrepareForTestWithJavaDefaultModules,
3875 ).RunTestWithBp(t, `
3876 android_library_import {
3877 name: "aary-nodeps",
3878 aars: ["aary.aar"],
3879 extract_jni: true,
3880 }
3881
3882 android_library {
3883 name: "aary-lib",
3884 sdk_version: "current",
3885 min_sdk_version: "21",
3886 static_libs: ["aary-nodeps"],
3887 }
3888
3889 android_app {
3890 name: "aary-lib-dep",
3891 sdk_version: "current",
3892 min_sdk_version: "21",
3893 manifest: "AndroidManifest.xml",
3894 static_libs: ["aary-lib"],
3895 use_embedded_native_libs: true,
3896 }
3897
3898 android_app {
3899 name: "aary-import-dep",
3900 sdk_version: "current",
3901 min_sdk_version: "21",
3902 manifest: "AndroidManifest.xml",
3903 static_libs: ["aary-nodeps"],
3904 use_embedded_native_libs: true,
3905 }
3906
3907 android_app {
3908 name: "aary-no-use-embedded",
3909 sdk_version: "current",
3910 min_sdk_version: "21",
3911 manifest: "AndroidManifest.xml",
3912 static_libs: ["aary-nodeps"],
3913 }`)
3914
3915 testCases := []struct {
3916 name string
3917 hasPackage bool
3918 }{
3919 {
3920 name: "aary-import-dep",
3921 hasPackage: true,
3922 },
3923 {
3924 name: "aary-lib-dep",
3925 hasPackage: true,
3926 },
3927 {
3928 name: "aary-no-use-embedded",
3929 hasPackage: false,
3930 },
3931 }
3932
3933 for _, tc := range testCases {
3934 t.Run(tc.name, func(t *testing.T) {
3935 app := ctx.ModuleForTests(tc.name, "android_common")
3936
3937 outputFile := "jnilibs.zip"
3938 jniOutputLibZip := app.MaybeOutput(outputFile)
3939 if jniOutputLibZip.Rule == nil && !tc.hasPackage {
3940 return
3941 }
3942
3943 jniPackage := "arm64-v8a_jni.zip"
3944 inputs := jniOutputLibZip.Inputs
3945 foundPackage := false
3946 for i := 0; i < len(inputs); i++ {
3947 if strings.Contains(inputs[i].String(), jniPackage) {
3948 foundPackage = true
3949 }
3950 }
3951 if foundPackage != tc.hasPackage {
3952 t.Errorf("expected to find %v in %v inputs; inputs = %v", jniPackage, outputFile, inputs)
3953 }
3954 })
3955 }
3956}
Spandan Das9f7ae7f2022-07-25 00:34:18 +00003957
3958func TestTargetSdkVersionMtsTests(t *testing.T) {
3959 platformSdkCodename := "Tiramisu"
3960 android_test := "android_test"
3961 android_test_helper_app := "android_test_helper_app"
3962 bpTemplate := `
3963 %v {
3964 name: "mytest",
3965 target_sdk_version: "%v",
3966 test_suites: ["othersuite", "%v"],
3967 }
3968 `
3969 testCases := []struct {
3970 desc string
3971 moduleType string
3972 targetSdkVersionInBp string
3973 targetSdkVersionExpected string
3974 testSuites string
3975 }{
3976 {
3977 desc: "Non-MTS android_test_apps targeting current should not be upgraded to 10000",
3978 moduleType: android_test,
3979 targetSdkVersionInBp: "current",
3980 targetSdkVersionExpected: platformSdkCodename,
3981 testSuites: "non-mts-suite",
3982 },
3983 {
3984 desc: "MTS android_test_apps targeting released sdks should not be upgraded to 10000",
3985 moduleType: android_test,
3986 targetSdkVersionInBp: "29",
3987 targetSdkVersionExpected: "29",
3988 testSuites: "mts-suite",
3989 },
3990 {
3991 desc: "MTS android_test_apps targeting current should be upgraded to 10000",
3992 moduleType: android_test,
3993 targetSdkVersionInBp: "current",
3994 targetSdkVersionExpected: "10000",
3995 testSuites: "mts-suite",
3996 },
3997 {
3998 desc: "MTS android_test_helper_apps targeting current should be upgraded to 10000",
3999 moduleType: android_test_helper_app,
4000 targetSdkVersionInBp: "current",
4001 targetSdkVersionExpected: "10000",
4002 testSuites: "mts-suite",
4003 },
4004 }
4005 fixture := android.GroupFixturePreparers(
4006 prepareForJavaTest,
4007 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4008 variables.Platform_sdk_codename = &platformSdkCodename
4009 variables.Platform_version_active_codenames = []string{platformSdkCodename}
4010 }),
4011 )
4012 for _, testCase := range testCases {
4013 result := fixture.RunTestWithBp(t, fmt.Sprintf(bpTemplate, testCase.moduleType, testCase.targetSdkVersionInBp, testCase.testSuites))
4014 mytest := result.ModuleForTests("mytest", "android_common")
4015 manifestFixerArgs := mytest.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4016 android.AssertStringDoesContain(t, testCase.desc, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4017 }
4018}
Andrei Onea580636b2022-08-17 16:53:46 +00004019
4020func TestPrivappAllowlist(t *testing.T) {
4021 testJavaError(t, "privileged must be set in order to use privapp_allowlist", `
4022 android_app {
4023 name: "foo",
4024 srcs: ["a.java"],
4025 privapp_allowlist: "perms.xml",
4026 }
4027 `)
4028
4029 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
4030 t,
4031 `
4032 android_app {
4033 name: "foo",
4034 srcs: ["a.java"],
Sam Delmerico15809f82023-05-15 17:21:47 -04004035 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
Andrei Onea580636b2022-08-17 16:53:46 +00004036 privileged: true,
Andrei Onea580636b2022-08-17 16:53:46 +00004037 sdk_version: "current",
4038 }
4039 override_android_app {
4040 name: "bar",
4041 base: "foo",
4042 package_name: "com.google.android.foo",
4043 }
4044 `,
4045 )
4046 app := result.ModuleForTests("foo", "android_common")
4047 overrideApp := result.ModuleForTests("foo", "android_common_bar")
4048
Sam Delmerico15809f82023-05-15 17:21:47 -04004049 // verify that privapp allowlist is created for override apps
Andrei Onea580636b2022-08-17 16:53:46 +00004050 overrideApp.Output("out/soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml")
Sam Delmerico15809f82023-05-15 17:21:47 -04004051 expectedAllowlistInput := "privapp_allowlist_com.android.foo.xml"
4052 overrideActualAllowlistInput := overrideApp.Rule("modifyAllowlist").Input.String()
4053 if expectedAllowlistInput != overrideActualAllowlistInput {
4054 t.Errorf("expected override allowlist to be %q; got %q", expectedAllowlistInput, overrideActualAllowlistInput)
Andrei Onea580636b2022-08-17 16:53:46 +00004055 }
4056
4057 // verify that permissions are copied to device
Anton Hansson0e486a42023-06-01 16:38:35 +00004058 app.Output("out/soong/target/product/test_device/system/etc/permissions/foo.xml")
4059 overrideApp.Output("out/soong/target/product/test_device/system/etc/permissions/bar.xml")
Andrei Onea580636b2022-08-17 16:53:46 +00004060}
Sam Delmericob1daccd2023-05-25 14:45:30 -04004061
4062func TestPrivappAllowlistAndroidMk(t *testing.T) {
4063 result := android.GroupFixturePreparers(
4064 PrepareForTestWithJavaDefaultModules,
4065 android.PrepareForTestWithAndroidMk,
4066 ).RunTestWithBp(
4067 t,
4068 `
4069 android_app {
4070 name: "foo",
4071 srcs: ["a.java"],
4072 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
4073 privileged: true,
4074 sdk_version: "current",
4075 }
4076 override_android_app {
4077 name: "bar",
4078 base: "foo",
4079 package_name: "com.google.android.foo",
4080 }
4081 `,
4082 )
4083 baseApp := result.ModuleForTests("foo", "android_common")
4084 overrideApp := result.ModuleForTests("foo", "android_common_bar")
4085
4086 baseAndroidApp := baseApp.Module().(*AndroidApp)
4087 baseEntries := android.AndroidMkEntriesForTest(t, result.TestContext, baseAndroidApp)[0]
4088 android.AssertStringMatches(
4089 t,
4090 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find foo.apk",
4091 baseEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4092 "\\S+foo.apk",
4093 )
4094 android.AssertStringMatches(
4095 t,
4096 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include foo.apk",
4097 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4098 "\\S+foo.apk",
4099 )
4100 android.AssertStringMatches(
4101 t,
4102 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4103 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4104 "\\S+foo.apk:\\S+/target/product/test_device/system/priv-app/foo/foo.apk",
4105 )
4106 android.AssertStringMatches(
4107 t,
4108 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4109 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004110 "privapp_allowlist_com.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/foo.xml",
Sam Delmericob1daccd2023-05-25 14:45:30 -04004111 )
4112
4113 overrideAndroidApp := overrideApp.Module().(*AndroidApp)
4114 overrideEntries := android.AndroidMkEntriesForTest(t, result.TestContext, overrideAndroidApp)[0]
4115 android.AssertStringMatches(
4116 t,
4117 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find bar.apk",
4118 overrideEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4119 "\\S+bar.apk",
4120 )
4121 android.AssertStringMatches(
4122 t,
4123 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include bar.apk",
4124 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4125 "\\S+bar.apk",
4126 )
4127 android.AssertStringMatches(
4128 t,
4129 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4130 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4131 "\\S+bar.apk:\\S+/target/product/test_device/system/priv-app/bar/bar.apk",
4132 )
4133 android.AssertStringMatches(
4134 t,
4135 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4136 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004137 "\\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 -04004138 )
4139}