blob: c438b6cfa52b3198ea5b76de4873ab26072332fa [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 {
725 name string
726
727 dontVerifyApp bool
728 appResources []string
729 appOverlays []string
730 appImports []string
731 appSrcJars []string
732 appClasspath []string
733 appCombined []string
734
735 dontVerifyDirect bool
736 directResources []string
737 directOverlays []string
738 directImports []string
739 directSrcJars []string
740 directClasspath []string
741 directCombined []string
742
743 dontVerifyTransitive bool
744 transitiveResources []string
745 transitiveOverlays []string
746 transitiveImports []string
747 transitiveSrcJars []string
748 transitiveClasspath []string
749 transitiveCombined []string
750
751 dontVerifyDirectImport bool
752 directImportResources []string
753 directImportOverlays []string
754 directImportImports []string
755
756 dontVerifyTransitiveImport bool
757 transitiveImportResources []string
758 transitiveImportOverlays []string
759 transitiveImportImports []string
760 }{
761 {
762 name: "legacy",
763
764 appResources: nil,
765 appOverlays: []string{
766 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000767 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700768 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
769 "out/soong/.intermediates/direct/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000770 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700771 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
772 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
773 },
Colin Crossab8d1382023-07-14 17:23:41 +0000774
Colin Crossff3ff7f2023-07-05 14:04:12 -0700775 appImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
776 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
777 appClasspath: []string{
778 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
779 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
780 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
781 },
782 appCombined: []string{
783 "out/soong/.intermediates/app/android_common/javac/app.jar",
784 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
785 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
786 },
787
788 directResources: nil,
789 directOverlays: []string{
790 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000791 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700792 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
793 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
794 },
Colin Crossab8d1382023-07-14 17:23:41 +0000795
Colin Crossff3ff7f2023-07-05 14:04:12 -0700796 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
797 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
798 directClasspath: []string{
799 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
800 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
801 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
802 },
803 directCombined: []string{
804 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
805 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
806 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
807 },
808
809 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
810 transitiveOverlays: nil,
811 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
812 transitiveSrcJars: []string{"out/soong/.intermediates/transitive/android_common/gen/android/R.srcjar"},
813 transitiveClasspath: []string{"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar"},
814 transitiveCombined: nil,
815
816 directImportResources: nil,
817 directImportOverlays: []string{
818 "out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata",
819 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
820 },
821 directImportImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
822
823 transitiveImportResources: nil,
824 transitiveImportOverlays: []string{
825 "out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata",
826 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
827 },
828 transitiveImportImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
829 },
830 }
831
832 for _, testCase := range testCases {
833 t.Run(testCase.name, func(t *testing.T) {
834 bp := fmt.Sprintf(`
835 android_app {
836 name: "app",
837 sdk_version: "current",
838 srcs: ["app/app.java"],
839 resource_dirs: ["app/res"],
840 manifest: "app/AndroidManifest.xml",
841 static_libs: ["direct", "direct_import"],
842 }
843
844 android_library {
845 name: "direct",
846 sdk_version: "current",
847 srcs: ["direct/direct.java"],
848 resource_dirs: ["direct/res"],
849 manifest: "direct/AndroidManifest.xml",
850 static_libs: ["transitive", "transitive_import"],
851 }
852
853 android_library {
854 name: "transitive",
855 sdk_version: "current",
856 srcs: ["transitive/transitive.java"],
857 resource_dirs: ["transitive/res"],
858 manifest: "transitive/AndroidManifest.xml",
859 }
860
861 android_library_import {
862 name: "direct_import",
863 sdk_version: "current",
864 aars: ["direct_import.aar"],
865 static_libs: ["direct_import_dep"],
866 }
867
868 android_library_import {
869 name: "direct_import_dep",
870 sdk_version: "current",
871 aars: ["direct_import_dep.aar"],
872 }
873
874 android_library_import {
875 name: "transitive_import",
876 sdk_version: "current",
877 aars: ["transitive_import.aar"],
878 static_libs: ["transitive_import_dep"],
879 }
880
881 android_library_import {
882 name: "transitive_import_dep",
883 sdk_version: "current",
884 aars: ["transitive_import_dep.aar"],
885 }
886 `)
887
888 fs := android.MockFS{
889 "app/res/values/strings.xml": nil,
890 "direct/res/values/strings.xml": nil,
891 "transitive/res/values/strings.xml": nil,
892 }
893
894 result := android.GroupFixturePreparers(
895 PrepareForTestWithJavaDefaultModules,
896 PrepareForTestWithOverlayBuildComponents,
897 fs.AddToFixture(),
898 ).RunTestWithBp(t, bp)
899
900 type aaptInfo struct {
901 resources, overlays, imports, srcJars, classpath, combined android.Paths
902 }
903
904 getAaptInfo := func(moduleName string) (aaptInfo aaptInfo) {
905 mod := result.ModuleForTests(moduleName, "android_common")
906 resourceListRule := mod.MaybeOutput("aapt2/res.list")
907 overlayListRule := mod.MaybeOutput("aapt2/overlay.list")
908 aaptRule := mod.Rule("aapt2Link")
909 javacRule := mod.MaybeRule("javac")
910 combinedRule := mod.MaybeOutput("combined/" + moduleName + ".jar")
911
912 aaptInfo.resources = resourceListRule.Inputs
913 aaptInfo.overlays = overlayListRule.Inputs
914
915 aaptFlags := strings.Split(aaptRule.Args["flags"], " ")
916 for i, flag := range aaptFlags {
917 if flag == "-I" && i+1 < len(aaptFlags) {
918 aaptInfo.imports = append(aaptInfo.imports, android.PathForTesting(aaptFlags[i+1]))
919 }
920 }
921
922 if len(javacRule.Args["srcJars"]) > 0 {
923 aaptInfo.srcJars = android.PathsForTesting(strings.Split(javacRule.Args["srcJars"], " ")...)
924 }
925
926 if len(javacRule.Args["classpath"]) > 0 {
927 classpathArg := strings.TrimPrefix(javacRule.Args["classpath"], "-classpath ")
928 aaptInfo.classpath = android.PathsForTesting(strings.Split(classpathArg, ":")...)
929 }
930
931 aaptInfo.combined = combinedRule.Inputs
932 return
933 }
934
935 app := getAaptInfo("app")
936 direct := getAaptInfo("direct")
937 transitive := getAaptInfo("transitive")
938 directImport := getAaptInfo("direct_import")
939 transitiveImport := getAaptInfo("transitive_import")
940
941 if !testCase.dontVerifyApp {
942 android.AssertPathsRelativeToTopEquals(t, "app resources", testCase.appResources, app.resources)
943 android.AssertPathsRelativeToTopEquals(t, "app overlays", testCase.appOverlays, app.overlays)
944 android.AssertPathsRelativeToTopEquals(t, "app imports", testCase.appImports, app.imports)
945 android.AssertPathsRelativeToTopEquals(t, "app srcjars", testCase.appSrcJars, app.srcJars)
946 android.AssertPathsRelativeToTopEquals(t, "app classpath", testCase.appClasspath, app.classpath)
947 android.AssertPathsRelativeToTopEquals(t, "app combined", testCase.appCombined, app.combined)
948 }
949
950 if !testCase.dontVerifyDirect {
951 android.AssertPathsRelativeToTopEquals(t, "direct resources", testCase.directResources, direct.resources)
952 android.AssertPathsRelativeToTopEquals(t, "direct overlays", testCase.directOverlays, direct.overlays)
953 android.AssertPathsRelativeToTopEquals(t, "direct imports", testCase.directImports, direct.imports)
954 android.AssertPathsRelativeToTopEquals(t, "direct srcjars", testCase.directSrcJars, direct.srcJars)
955 android.AssertPathsRelativeToTopEquals(t, "direct classpath", testCase.directClasspath, direct.classpath)
956 android.AssertPathsRelativeToTopEquals(t, "direct combined", testCase.directCombined, direct.combined)
957 }
958
959 if !testCase.dontVerifyTransitive {
960 android.AssertPathsRelativeToTopEquals(t, "transitive resources", testCase.transitiveResources, transitive.resources)
961 android.AssertPathsRelativeToTopEquals(t, "transitive overlays", testCase.transitiveOverlays, transitive.overlays)
962 android.AssertPathsRelativeToTopEquals(t, "transitive imports", testCase.transitiveImports, transitive.imports)
963 android.AssertPathsRelativeToTopEquals(t, "transitive srcjars", testCase.transitiveSrcJars, transitive.srcJars)
964 android.AssertPathsRelativeToTopEquals(t, "transitive classpath", testCase.transitiveClasspath, transitive.classpath)
965 android.AssertPathsRelativeToTopEquals(t, "transitive combined", testCase.transitiveCombined, transitive.combined)
966 }
967
968 if !testCase.dontVerifyDirectImport {
969 android.AssertPathsRelativeToTopEquals(t, "direct_import resources", testCase.directImportResources, directImport.resources)
970 android.AssertPathsRelativeToTopEquals(t, "direct_import overlays", testCase.directImportOverlays, directImport.overlays)
971 android.AssertPathsRelativeToTopEquals(t, "direct_import imports", testCase.directImportImports, directImport.imports)
972 }
973
974 if !testCase.dontVerifyTransitiveImport {
975 android.AssertPathsRelativeToTopEquals(t, "transitive_import resources", testCase.transitiveImportResources, transitiveImport.resources)
976 android.AssertPathsRelativeToTopEquals(t, "transitive_import overlays", testCase.transitiveImportOverlays, transitiveImport.overlays)
977 android.AssertPathsRelativeToTopEquals(t, "transitive_import imports", testCase.transitiveImportImports, transitiveImport.imports)
978 }
979 })
980 }
981}
982
983func TestAndroidResourceOverlays(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -0800984 testCases := []struct {
985 name string
986 enforceRROTargets []string
987 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -0800988 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -0800989 overlayFiles map[string][]string
990 rroDirs map[string][]string
991 }{
992 {
993 name: "no RRO",
994 enforceRROTargets: nil,
995 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -0800996 resourceFiles: map[string][]string{
997 "foo": nil,
998 "bar": {"bar/res/res/values/strings.xml"},
999 "lib": nil,
1000 "lib2": {"lib2/res/res/values/strings.xml"},
1001 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001002 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001003 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001004 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1005 "out/soong/.intermediates/lib/android_common/package-res.apk",
1006 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001007 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001008 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1009 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +00001010 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001011 },
Colin Crossbec85302019-02-13 13:15:46 -08001012 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -08001013 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1014 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1015 },
Colin Crossbec85302019-02-13 13:15:46 -08001016 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001017 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001018 "lib/res/res/values/strings.xml",
1019 "device/vendor/blah/overlay/lib/res/values/strings.xml",
1020 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001021 },
1022 rroDirs: map[string][]string{
1023 "foo": nil,
1024 "bar": nil,
1025 },
1026 },
1027 {
1028 name: "enforce RRO on foo",
1029 enforceRROTargets: []string{"foo"},
1030 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -08001031 resourceFiles: map[string][]string{
1032 "foo": nil,
1033 "bar": {"bar/res/res/values/strings.xml"},
1034 "lib": nil,
1035 "lib2": {"lib2/res/res/values/strings.xml"},
1036 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001037 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001038 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001039 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1040 "out/soong/.intermediates/lib/android_common/package-res.apk",
1041 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001042 "foo/res/res/values/strings.xml",
1043 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1044 },
Colin Crossbec85302019-02-13 13:15:46 -08001045 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -08001046 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1047 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1048 },
Colin Crossbec85302019-02-13 13:15:46 -08001049 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001050 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001051 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -08001052 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001053 },
Colin Crossc1c37552019-01-31 11:42:41 -08001054
Colin Cross5c4791c2019-02-01 11:44:44 -08001055 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001056 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +00001057 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +00001058 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001059 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001060 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001061 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001062 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001063 },
1064 },
1065 {
1066 name: "enforce RRO on all",
1067 enforceRROTargets: []string{"*"},
1068 enforceRROExcludedOverlays: []string{
1069 // Excluding specific apps/res directories also allowed.
1070 "device/vendor/blah/static_overlay/foo",
1071 "device/vendor/blah/static_overlay/bar/res",
1072 },
Colin Crossbec85302019-02-13 13:15:46 -08001073 resourceFiles: map[string][]string{
1074 "foo": nil,
1075 "bar": {"bar/res/res/values/strings.xml"},
1076 "lib": nil,
1077 "lib2": {"lib2/res/res/values/strings.xml"},
1078 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001079 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001080 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001081 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1082 "out/soong/.intermediates/lib/android_common/package-res.apk",
1083 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001084 "foo/res/res/values/strings.xml",
1085 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1086 },
Colin Crossbec85302019-02-13 13:15:46 -08001087 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
1088 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001089 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001090 "lib/res/res/values/strings.xml",
1091 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001092 },
1093 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001094 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +00001095 "device:device/vendor/blah/overlay/foo/res",
1096 "product:product/vendor/blah/overlay/foo/res",
1097 // Lib dep comes after the direct deps
1098 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001099 },
Anton Hansson53c88442019-03-18 15:53:16 +00001100 "bar": {"device:device/vendor/blah/overlay/bar/res"},
1101 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001102 },
1103 },
1104 }
1105
Anton Hansson53c88442019-03-18 15:53:16 +00001106 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -08001107 "device/vendor/blah/overlay",
1108 "device/vendor/blah/overlay2",
1109 "device/vendor/blah/static_overlay",
1110 }
1111
Anton Hansson53c88442019-03-18 15:53:16 +00001112 productResourceOverlays := []string{
1113 "product/vendor/blah/overlay",
1114 }
1115
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001116 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -08001117 "foo/res/res/values/strings.xml": nil,
1118 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001119 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -08001120 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001121 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
1122 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001123 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001124 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
1125 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
1126 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +00001127 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001128 }
1129
1130 bp := `
1131 android_app {
1132 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001133 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001134 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +00001135 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -08001136 }
1137
1138 android_app {
1139 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001140 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001141 resource_dirs: ["bar/res"],
1142 }
Colin Cross6ed7dea2019-01-31 14:44:30 -08001143
1144 android_library {
1145 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001146 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001147 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -08001148 static_libs: ["lib2"],
1149 }
1150
1151 android_library {
1152 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001153 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -08001154 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -08001155 }
Anton Hansson53c88442019-03-18 15:53:16 +00001156
1157 // This library has the same resources as lib (should not lead to dupe RROs)
1158 android_library {
1159 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001160 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +00001161 resource_dirs: ["lib/res"]
1162 }
Colin Cross890ff552017-11-30 20:13:19 -08001163 `
1164
Colin Cross5c4791c2019-02-01 11:44:44 -08001165 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -08001166 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001167 result := android.GroupFixturePreparers(
1168 PrepareForTestWithJavaDefaultModules,
1169 PrepareForTestWithOverlayBuildComponents,
1170 fs.AddToFixture(),
1171 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1172 variables.DeviceResourceOverlays = deviceResourceOverlays
1173 variables.ProductResourceOverlays = productResourceOverlays
1174 if testCase.enforceRROTargets != nil {
1175 variables.EnforceRROTargets = testCase.enforceRROTargets
1176 }
1177 if testCase.enforceRROExcludedOverlays != nil {
1178 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
1179 }
1180 }),
1181 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -08001182
Colin Crossbec85302019-02-13 13:15:46 -08001183 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
1184 for _, o := range list {
1185 res := module.MaybeOutput(o)
1186 if res.Rule != nil {
1187 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
1188 // verify the inputs to the .arsc.flat rule.
1189 files = append(files, res.Inputs.Strings()...)
1190 } else {
1191 // Otherwise, verify the full path to the output of the other module
1192 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +00001193 }
Colin Cross890ff552017-11-30 20:13:19 -08001194 }
Colin Crossbec85302019-02-13 13:15:46 -08001195 return files
Colin Cross890ff552017-11-30 20:13:19 -08001196 }
1197
Colin Crossbec85302019-02-13 13:15:46 -08001198 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001199 module := result.ModuleForTests(moduleName, "android_common")
Colin Crossbec85302019-02-13 13:15:46 -08001200 resourceList := module.MaybeOutput("aapt2/res.list")
1201 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001202 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +00001203 }
Colin Crossbec85302019-02-13 13:15:46 -08001204 overlayList := module.MaybeOutput("aapt2/overlay.list")
1205 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001206 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -08001207 }
1208
Colin Crossab8d1382023-07-14 17:23:41 +00001209 for _, d := range module.Module().(AndroidLibraryDependency).RRODirsDepSet().ToList() {
Anton Hansson53c88442019-03-18 15:53:16 +00001210 var prefix string
1211 if d.overlayType == device {
1212 prefix = "device:"
1213 } else if d.overlayType == product {
1214 prefix = "product:"
1215 } else {
1216 t.Fatalf("Unexpected overlayType %d", d.overlayType)
1217 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001218 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +00001219 }
Colin Crossbec85302019-02-13 13:15:46 -08001220
1221 return resourceFiles, overlayFiles, rroDirs
1222 }
1223
1224 modules := []string{"foo", "bar", "lib", "lib2"}
1225 for _, module := range modules {
1226 resourceFiles, overlayFiles, rroDirs := getResources(module)
1227
1228 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
1229 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
1230 module, testCase.resourceFiles[module], resourceFiles)
1231 }
1232 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
1233 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
1234 module, testCase.overlayFiles[module], overlayFiles)
1235 }
1236 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +00001237 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -08001238 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +00001239 }
Colin Cross890ff552017-11-30 20:13:19 -08001240 }
Colin Cross890ff552017-11-30 20:13:19 -08001241 })
1242 }
1243}
Colin Crossd09b0b62018-04-18 11:06:47 -07001244
Paul Duffincdb88a92021-03-14 00:36:50 +00001245func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
1246 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +09001247 link := foo.Output("package-res.apk")
1248 linkFlags := strings.Split(link.Args["flags"], " ")
1249 min := android.IndexList("--min-sdk-version", linkFlags)
1250 target := android.IndexList("--target-sdk-version", linkFlags)
1251
1252 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
1253 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
1254 }
1255
1256 gotMinSdkVersion := linkFlags[min+1]
1257 gotTargetSdkVersion := linkFlags[target+1]
1258
Paul Duffincdb88a92021-03-14 00:36:50 +00001259 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001260
Paul Duffincdb88a92021-03-14 00:36:50 +00001261 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001262}
1263
Colin Crossd09b0b62018-04-18 11:06:47 -07001264func TestAppSdkVersion(t *testing.T) {
1265 testCases := []struct {
1266 name string
1267 sdkVersion string
1268 platformSdkInt int
1269 platformSdkCodename string
1270 platformSdkFinal bool
Spandan Dasffb31af2023-03-01 19:46:18 +00001271 minSdkVersionBp string
Colin Crossd09b0b62018-04-18 11:06:47 -07001272 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001273 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001274 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001275 }{
1276 {
1277 name: "current final SDK",
1278 sdkVersion: "current",
1279 platformSdkInt: 27,
1280 platformSdkCodename: "REL",
1281 platformSdkFinal: true,
1282 expectedMinSdkVersion: "27",
1283 },
1284 {
1285 name: "current non-final SDK",
1286 sdkVersion: "current",
1287 platformSdkInt: 27,
1288 platformSdkCodename: "OMR1",
1289 platformSdkFinal: false,
1290 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001291 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001292 },
1293 {
1294 name: "default final SDK",
1295 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001296 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001297 platformSdkInt: 27,
1298 platformSdkCodename: "REL",
1299 platformSdkFinal: true,
1300 expectedMinSdkVersion: "27",
1301 },
1302 {
1303 name: "default non-final SDK",
1304 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001305 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001306 platformSdkInt: 27,
1307 platformSdkCodename: "OMR1",
1308 platformSdkFinal: false,
1309 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001310 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001311 },
1312 {
1313 name: "14",
1314 sdkVersion: "14",
1315 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001316 platformSdkCodename: "S",
1317 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001318 },
Spandan Dasffb31af2023-03-01 19:46:18 +00001319 {
1320 name: "two active SDKs",
1321 sdkVersion: "module_current",
1322 minSdkVersionBp: "UpsideDownCake",
1323 expectedMinSdkVersion: "UpsideDownCake", // And not VanillaIceCream
1324 platformSdkCodename: "VanillaIceCream",
1325 activeCodenames: []string{"UpsideDownCake", "VanillaIceCream"},
1326 },
Colin Crossd09b0b62018-04-18 11:06:47 -07001327 }
1328
1329 for _, moduleType := range []string{"android_app", "android_library"} {
1330 for _, test := range testCases {
1331 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001332 platformApiProp := ""
1333 if test.platformApis {
1334 platformApiProp = "platform_apis: true,"
1335 }
Spandan Dasffb31af2023-03-01 19:46:18 +00001336 minSdkVersionProp := ""
1337 if test.minSdkVersionBp != "" {
1338 minSdkVersionProp = fmt.Sprintf(` min_sdk_version: "%s",`, test.minSdkVersionBp)
1339 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001340 bp := fmt.Sprintf(`%s {
1341 name: "foo",
1342 srcs: ["a.java"],
1343 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001344 %s
Spandan Dasffb31af2023-03-01 19:46:18 +00001345 %s
1346 }`, moduleType, test.sdkVersion, platformApiProp, minSdkVersionProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001347
Paul Duffin71ae5942021-03-22 15:36:52 +00001348 result := android.GroupFixturePreparers(
1349 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001350 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1351 variables.Platform_sdk_version = &test.platformSdkInt
1352 variables.Platform_sdk_codename = &test.platformSdkCodename
1353 variables.Platform_version_active_codenames = test.activeCodenames
1354 variables.Platform_sdk_final = &test.platformSdkFinal
1355 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001356 FixtureWithPrebuiltApis(map[string][]string{
1357 "14": {"foo"},
1358 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001359 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001360
Paul Duffincdb88a92021-03-14 00:36:50 +00001361 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001362 })
1363 }
1364 }
1365}
Colin Crossa4f08812018-10-02 22:03:40 -07001366
Jeongik Cha219141c2020-08-06 23:00:37 +09001367func TestVendorAppSdkVersion(t *testing.T) {
1368 testCases := []struct {
1369 name string
1370 sdkVersion string
1371 platformSdkInt int
1372 platformSdkCodename string
1373 platformSdkFinal bool
1374 deviceCurrentApiLevelForVendorModules string
1375 expectedMinSdkVersion string
1376 }{
1377 {
1378 name: "current final SDK",
1379 sdkVersion: "current",
1380 platformSdkInt: 29,
1381 platformSdkCodename: "REL",
1382 platformSdkFinal: true,
1383 deviceCurrentApiLevelForVendorModules: "29",
1384 expectedMinSdkVersion: "29",
1385 },
1386 {
1387 name: "current final SDK",
1388 sdkVersion: "current",
1389 platformSdkInt: 29,
1390 platformSdkCodename: "REL",
1391 platformSdkFinal: true,
1392 deviceCurrentApiLevelForVendorModules: "28",
1393 expectedMinSdkVersion: "28",
1394 },
1395 {
1396 name: "current final SDK",
1397 sdkVersion: "current",
1398 platformSdkInt: 29,
1399 platformSdkCodename: "Q",
1400 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001401 deviceCurrentApiLevelForVendorModules: "28",
1402 expectedMinSdkVersion: "28",
1403 },
1404 }
1405
1406 for _, moduleType := range []string{"android_app", "android_library"} {
1407 for _, sdkKind := range []string{"", "system_"} {
1408 for _, test := range testCases {
1409 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1410 bp := fmt.Sprintf(`%s {
1411 name: "foo",
1412 srcs: ["a.java"],
1413 sdk_version: "%s%s",
1414 vendor: true,
1415 }`, moduleType, sdkKind, test.sdkVersion)
1416
Paul Duffin71ae5942021-03-22 15:36:52 +00001417 result := android.GroupFixturePreparers(
1418 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001419 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1420 variables.Platform_sdk_version = &test.platformSdkInt
1421 variables.Platform_sdk_codename = &test.platformSdkCodename
1422 variables.Platform_sdk_final = &test.platformSdkFinal
1423 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1424 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1425 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001426 FixtureWithPrebuiltApis(map[string][]string{
1427 "28": {"foo"},
1428 "29": {"foo"},
1429 "current": {"foo"},
1430 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001431 ).RunTestWithBp(t, bp)
1432
1433 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001434 })
1435 }
1436 }
1437 }
1438}
1439
Paul Duffin50c217c2019-06-12 13:25:22 +01001440func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001441 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001442 cc_library {
1443 name: "libjni",
1444 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001445 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001446 stl: "none",
1447 }
1448
1449 android_test {
1450 name: "test",
1451 sdk_version: "core_platform",
1452 jni_libs: ["libjni"],
1453 }
1454
1455 android_test {
1456 name: "test_first",
1457 sdk_version: "core_platform",
1458 compile_multilib: "first",
1459 jni_libs: ["libjni"],
1460 }
1461
1462 android_test {
1463 name: "test_both",
1464 sdk_version: "core_platform",
1465 compile_multilib: "both",
1466 jni_libs: ["libjni"],
1467 }
1468
1469 android_test {
1470 name: "test_32",
1471 sdk_version: "core_platform",
1472 compile_multilib: "32",
1473 jni_libs: ["libjni"],
1474 }
1475
1476 android_test {
1477 name: "test_64",
1478 sdk_version: "core_platform",
1479 compile_multilib: "64",
1480 jni_libs: ["libjni"],
1481 }
1482 `)
1483
1484 testCases := []struct {
1485 name string
1486 abis []string
1487 }{
1488 {"test", []string{"arm64-v8a"}},
1489 {"test_first", []string{"arm64-v8a"}},
1490 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1491 {"test_32", []string{"armeabi-v7a"}},
1492 {"test_64", []string{"arm64-v8a"}},
1493 }
1494
1495 for _, test := range testCases {
1496 t.Run(test.name, func(t *testing.T) {
1497 app := ctx.ModuleForTests(test.name, "android_common")
Sam Delmerico82602492022-06-10 17:05:42 +00001498 jniLibZip := app.Output(jniJarOutputPathString)
Paul Duffin50c217c2019-06-12 13:25:22 +01001499 var abis []string
1500 args := strings.Fields(jniLibZip.Args["jarArgs"])
1501 for i := 0; i < len(args); i++ {
1502 if args[i] == "-P" {
1503 abis = append(abis, filepath.Base(args[i+1]))
1504 i++
1505 }
1506 }
1507 if !reflect.DeepEqual(abis, test.abis) {
1508 t.Errorf("want abis %v, got %v", test.abis, abis)
1509 }
1510 })
1511 }
1512}
1513
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001514func TestAppSdkVersionByPartition(t *testing.T) {
1515 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1516 android_app {
1517 name: "foo",
1518 srcs: ["a.java"],
1519 vendor: true,
1520 platform_apis: true,
1521 }
1522 `)
1523
1524 testJava(t, `
1525 android_app {
1526 name: "bar",
1527 srcs: ["b.java"],
1528 platform_apis: true,
1529 }
1530 `)
1531
1532 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001533 bp := `
1534 android_app {
1535 name: "foo",
1536 srcs: ["a.java"],
1537 product_specific: true,
1538 platform_apis: true,
1539 }
1540 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001541
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001542 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001543 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001544 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 +09001545 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001546
1547 android.GroupFixturePreparers(
1548 PrepareForTestWithJavaDefaultModules,
1549 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1550 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
1551 }),
1552 ).
1553 ExtendWithErrorHandler(errorHandler).
1554 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001555 }
1556}
1557
Paul Duffin50c217c2019-06-12 13:25:22 +01001558func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001559 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001560 cc_library {
1561 name: "libjni",
1562 system_shared_libs: [],
1563 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08001564 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001565 }
1566
1567 android_app {
1568 name: "app",
1569 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001570 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001571 }
1572
1573 android_app {
1574 name: "app_noembed",
1575 jni_libs: ["libjni"],
1576 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001577 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001578 }
1579
1580 android_app {
1581 name: "app_embed",
1582 jni_libs: ["libjni"],
1583 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001584 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001585 }
1586
1587 android_test {
1588 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00001589 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001590 jni_libs: ["libjni"],
1591 }
1592
1593 android_test {
1594 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001595 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001596 jni_libs: ["libjni"],
1597 use_embedded_native_libs: false,
1598 }
1599
1600 android_test_helper_app {
1601 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00001602 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001603 jni_libs: ["libjni"],
1604 }
1605
1606 android_test_helper_app {
1607 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001608 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001609 jni_libs: ["libjni"],
1610 use_embedded_native_libs: false,
1611 }
1612 `)
1613
1614 testCases := []struct {
1615 name string
1616 packaged bool
1617 compressed bool
1618 }{
1619 {"app", false, false},
1620 {"app_noembed", false, false},
1621 {"app_embed", true, false},
1622 {"test", true, false},
1623 {"test_noembed", true, true},
1624 {"test_helper", true, false},
1625 {"test_helper_noembed", true, true},
1626 }
1627
1628 for _, test := range testCases {
1629 t.Run(test.name, func(t *testing.T) {
1630 app := ctx.ModuleForTests(test.name, "android_common")
Sam Delmerico82602492022-06-10 17:05:42 +00001631 jniLibZip := app.MaybeOutput(jniJarOutputPathString)
Paul Duffin50c217c2019-06-12 13:25:22 +01001632 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
1633 t.Errorf("expected jni packaged %v, got %v", w, g)
1634 }
1635
1636 if jniLibZip.Rule != nil {
1637 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
1638 t.Errorf("expected jni compressed %v, got %v", w, g)
1639 }
Colin Crossc511bc52020-04-07 16:50:32 +00001640
1641 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
1642 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
1643 }
Paul Duffin50c217c2019-06-12 13:25:22 +01001644 }
1645 })
1646 }
Colin Cross47fa9d32019-03-26 10:51:39 -07001647}
1648
Colin Cross3c007702020-05-08 11:20:24 -07001649func TestJNISDK(t *testing.T) {
1650 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
1651 cc_library {
1652 name: "libjni",
1653 system_shared_libs: [],
1654 stl: "none",
1655 sdk_version: "current",
1656 }
1657
1658 android_test {
1659 name: "app_platform",
1660 jni_libs: ["libjni"],
1661 platform_apis: true,
1662 }
1663
1664 android_test {
1665 name: "app_sdk",
1666 jni_libs: ["libjni"],
1667 sdk_version: "current",
1668 }
1669
1670 android_test {
1671 name: "app_force_platform",
1672 jni_libs: ["libjni"],
1673 sdk_version: "current",
1674 jni_uses_platform_apis: true,
1675 }
1676
1677 android_test {
1678 name: "app_force_sdk",
1679 jni_libs: ["libjni"],
1680 platform_apis: true,
1681 jni_uses_sdk_apis: true,
1682 }
Colin Crossc2d24052020-05-13 11:05:02 -07001683
1684 cc_library {
1685 name: "libvendorjni",
1686 system_shared_libs: [],
1687 stl: "none",
1688 vendor: true,
1689 }
1690
1691 android_test {
1692 name: "app_vendor",
1693 jni_libs: ["libvendorjni"],
1694 sdk_version: "current",
1695 vendor: true,
1696 }
Colin Cross3c007702020-05-08 11:20:24 -07001697 `)
1698
1699 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07001700 name string
1701 sdkJNI bool
1702 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07001703 }{
Colin Crossc2d24052020-05-13 11:05:02 -07001704 {name: "app_platform"},
1705 {name: "app_sdk", sdkJNI: true},
1706 {name: "app_force_platform"},
1707 {name: "app_force_sdk", sdkJNI: true},
1708 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07001709 }
1710
Colin Crossc2d24052020-05-13 11:05:02 -07001711 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
1712 Output("libjni.so").Output.String()
1713 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
1714 Output("libjni.so").Output.String()
1715 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
1716 Output("libvendorjni.so").Output.String()
1717
Colin Cross3c007702020-05-08 11:20:24 -07001718 for _, test := range testCases {
1719 t.Run(test.name, func(t *testing.T) {
1720 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07001721
Sam Delmerico82602492022-06-10 17:05:42 +00001722 jniLibZip := app.MaybeOutput(jniJarOutputPathString)
Colin Cross3c007702020-05-08 11:20:24 -07001723 if len(jniLibZip.Implicits) != 1 {
1724 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
1725 }
1726 gotJNI := jniLibZip.Implicits[0].String()
1727
1728 if test.sdkJNI {
1729 if gotJNI != sdkJNI {
1730 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
1731 }
Colin Crossc2d24052020-05-13 11:05:02 -07001732 } else if test.vendorJNI {
1733 if gotJNI != vendorJNI {
1734 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
1735 }
Colin Cross3c007702020-05-08 11:20:24 -07001736 } else {
1737 if gotJNI != platformJNI {
1738 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
1739 }
1740 }
1741 })
1742 }
1743
1744 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
1745 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
1746 android_test {
1747 name: "app_platform",
1748 platform_apis: true,
1749 jni_uses_platform_apis: true,
1750 }
1751 `)
1752 })
1753
1754 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
1755 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
1756 android_test {
1757 name: "app_sdk",
1758 sdk_version: "current",
1759 jni_uses_sdk_apis: true,
1760 }
1761 `)
1762 })
1763
1764}
1765
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001766func TestCertificates(t *testing.T) {
1767 testCases := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001768 name string
1769 bp string
Colin Cross5caad2b2022-12-12 15:11:46 -08001770 allowMissingDependencies bool
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001771 certificateOverride string
1772 expectedCertSigningFlags string
1773 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001774 }{
1775 {
1776 name: "default",
1777 bp: `
1778 android_app {
1779 name: "foo",
1780 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001781 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001782 }
1783 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001784 certificateOverride: "",
1785 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08001786 expectedCertificate: "build/make/target/product/security/testkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001787 },
1788 {
1789 name: "module certificate property",
1790 bp: `
1791 android_app {
1792 name: "foo",
1793 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001794 certificate: ":new_certificate",
1795 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001796 }
1797
1798 android_app_certificate {
1799 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001800 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001801 }
1802 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001803 certificateOverride: "",
1804 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08001805 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001806 },
1807 {
1808 name: "path certificate property",
1809 bp: `
1810 android_app {
1811 name: "foo",
1812 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001813 certificate: "expiredkey",
1814 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001815 }
1816 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001817 certificateOverride: "",
1818 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08001819 expectedCertificate: "build/make/target/product/security/expiredkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001820 },
1821 {
1822 name: "certificate overrides",
1823 bp: `
1824 android_app {
1825 name: "foo",
1826 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001827 certificate: "expiredkey",
1828 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001829 }
1830
1831 android_app_certificate {
1832 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001833 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001834 }
1835 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001836 certificateOverride: "foo:new_certificate",
1837 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08001838 expectedCertificate: "cert/new_cert",
Liz Kammere2b27f42020-05-07 13:24:05 -07001839 },
1840 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001841 name: "certificate signing flags",
Liz Kammere2b27f42020-05-07 13:24:05 -07001842 bp: `
1843 android_app {
1844 name: "foo",
1845 srcs: ["a.java"],
1846 certificate: ":new_certificate",
1847 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001848 rotationMinSdkVersion: "32",
Liz Kammere2b27f42020-05-07 13:24:05 -07001849 sdk_version: "current",
1850 }
1851
1852 android_app_certificate {
1853 name: "new_certificate",
1854 certificate: "cert/new_cert",
1855 }
1856 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001857 certificateOverride: "",
1858 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08001859 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001860 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001861 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001862 name: "cert signing flags from filegroup",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001863 bp: `
1864 android_app {
1865 name: "foo",
1866 srcs: ["a.java"],
1867 certificate: ":new_certificate",
1868 lineage: ":lineage_bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001869 rotationMinSdkVersion: "32",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001870 sdk_version: "current",
1871 }
1872
1873 android_app_certificate {
1874 name: "new_certificate",
1875 certificate: "cert/new_cert",
1876 }
1877
1878 filegroup {
1879 name: "lineage_bin",
1880 srcs: ["lineage.bin"],
1881 }
1882 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001883 certificateOverride: "",
1884 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08001885 expectedCertificate: "cert/new_cert",
1886 },
1887 {
1888 name: "missing with AllowMissingDependencies",
1889 bp: `
1890 android_app {
1891 name: "foo",
1892 srcs: ["a.java"],
1893 certificate: ":new_certificate",
1894 sdk_version: "current",
1895 }
1896 `,
1897 expectedCertificate: "out/soong/.intermediates/foo/android_common/missing",
1898 allowMissingDependencies: true,
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001899 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001900 }
1901
1902 for _, test := range testCases {
1903 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001904 result := android.GroupFixturePreparers(
1905 PrepareForTestWithJavaDefaultModules,
1906 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1907 if test.certificateOverride != "" {
1908 variables.CertificateOverrides = []string{test.certificateOverride}
1909 }
Colin Cross5caad2b2022-12-12 15:11:46 -08001910 if test.allowMissingDependencies {
1911 variables.Allow_missing_dependencies = proptools.BoolPtr(true)
1912 }
1913 }),
1914 android.FixtureModifyContext(func(ctx *android.TestContext) {
1915 ctx.SetAllowMissingDependencies(test.allowMissingDependencies)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001916 }),
1917 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001918
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001919 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001920
Colin Cross5caad2b2022-12-12 15:11:46 -08001921 certificate := foo.Module().(*AndroidApp).certificate
1922 android.AssertPathRelativeToTopEquals(t, "certificates key", test.expectedCertificate+".pk8", certificate.Key)
1923 // The sign_target_files_apks and check_target_files_signatures
1924 // tools require that certificates have a .x509.pem extension.
1925 android.AssertPathRelativeToTopEquals(t, "certificates pem", test.expectedCertificate+".x509.pem", certificate.Pem)
Liz Kammere2b27f42020-05-07 13:24:05 -07001926
Colin Cross5caad2b2022-12-12 15:11:46 -08001927 signapk := foo.Output("foo.apk")
1928 if signapk.Rule != android.ErrorRule {
1929 signCertificateFlags := signapk.Args["certificates"]
1930 expectedFlags := certificate.Pem.String() + " " + certificate.Key.String()
1931 android.AssertStringEquals(t, "certificates flags", expectedFlags, signCertificateFlags)
1932
1933 certSigningFlags := signapk.Args["flags"]
1934 android.AssertStringEquals(t, "cert signing flags", test.expectedCertSigningFlags, certSigningFlags)
1935 }
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001936 })
1937 }
1938}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001939
Songchun Fan688de9a2020-03-24 20:32:24 -07001940func TestRequestV4SigningFlag(t *testing.T) {
1941 testCases := []struct {
1942 name string
1943 bp string
1944 expected string
1945 }{
1946 {
1947 name: "default",
1948 bp: `
1949 android_app {
1950 name: "foo",
1951 srcs: ["a.java"],
1952 sdk_version: "current",
1953 }
1954 `,
1955 expected: "",
1956 },
1957 {
1958 name: "default",
1959 bp: `
1960 android_app {
1961 name: "foo",
1962 srcs: ["a.java"],
1963 sdk_version: "current",
1964 v4_signature: false,
1965 }
1966 `,
1967 expected: "",
1968 },
1969 {
1970 name: "module certificate property",
1971 bp: `
1972 android_app {
1973 name: "foo",
1974 srcs: ["a.java"],
1975 sdk_version: "current",
1976 v4_signature: true,
1977 }
1978 `,
1979 expected: "--enable-v4",
1980 },
1981 }
1982
1983 for _, test := range testCases {
1984 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001985 result := android.GroupFixturePreparers(
1986 PrepareForTestWithJavaDefaultModules,
1987 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07001988
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001989 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07001990
1991 signapk := foo.Output("foo.apk")
1992 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001993 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07001994 })
1995 }
1996}
1997
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001998func TestPackageNameOverride(t *testing.T) {
1999 testCases := []struct {
2000 name string
2001 bp string
2002 packageNameOverride string
2003 expected []string
2004 }{
2005 {
2006 name: "default",
2007 bp: `
2008 android_app {
2009 name: "foo",
2010 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002011 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002012 }
2013 `,
2014 packageNameOverride: "",
2015 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002016 "out/soong/.intermediates/foo/android_common/foo.apk",
2017 "out/soong/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002018 },
2019 },
2020 {
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002021 name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002022 bp: `
2023 android_app {
2024 name: "foo",
2025 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002026 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002027 }
2028 `,
2029 packageNameOverride: "foo:bar",
2030 expected: []string{
2031 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002032 "out/soong/.intermediates/foo/android_common/bar.apk",
2033 "out/soong/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002034 },
2035 },
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002036 {
2037 name: "overridden via stem",
2038 bp: `
2039 android_app {
2040 name: "foo",
2041 srcs: ["a.java"],
2042 sdk_version: "current",
2043 stem: "bar",
2044 }
2045 `,
2046 packageNameOverride: "",
2047 expected: []string{
2048 "out/soong/.intermediates/foo/android_common/bar.apk",
2049 "out/soong/target/product/test_device/system/app/bar/bar.apk",
2050 },
2051 },
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002052 }
2053
2054 for _, test := range testCases {
2055 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002056 result := android.GroupFixturePreparers(
2057 PrepareForTestWithJavaDefaultModules,
2058 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2059 if test.packageNameOverride != "" {
2060 variables.PackageNameOverrides = []string{test.packageNameOverride}
2061 }
2062 }),
2063 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002064
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002065 foo := result.ModuleForTests("foo", "android_common")
2066
Lukacs T. Berkifbaf7252021-08-19 09:36:42 +02002067 outSoongDir := result.Config.SoongOutDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002068
2069 outputs := foo.AllOutputs()
2070 outputMap := make(map[string]bool)
2071 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002072 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002073 }
2074 for _, e := range test.expected {
2075 if _, exist := outputMap[e]; !exist {
2076 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
2077 }
2078 }
2079 })
2080 }
2081}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002082
2083func TestInstrumentationTargetOverridden(t *testing.T) {
2084 bp := `
2085 android_app {
2086 name: "foo",
2087 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002088 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002089 }
2090
2091 android_test {
2092 name: "bar",
2093 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002094 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002095 }
2096 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002097
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002098 result := android.GroupFixturePreparers(
2099 PrepareForTestWithJavaDefaultModules,
2100 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2101 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
2102 }),
2103 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002104
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002105 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002106 res := bar.Output("package-res.apk")
2107 aapt2Flags := res.Args["flags"]
2108 e := "--rename-instrumentation-target-package org.dandroid.bp"
2109 if !strings.Contains(aapt2Flags, e) {
2110 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
2111 }
2112}
Jaewoong Jung525443a2019-02-28 15:35:54 -08002113
2114func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002115 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2116 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08002117 android_app {
2118 name: "foo",
2119 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07002120 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002121 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002122 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002123 }
2124
2125 override_android_app {
2126 name: "bar",
2127 base: "foo",
2128 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07002129 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002130 rotationMinSdkVersion: "32",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002131 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002132 }
2133
2134 android_app_certificate {
2135 name: "new_certificate",
2136 certificate: "cert/new_cert",
2137 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002138
2139 override_android_app {
2140 name: "baz",
2141 base: "foo",
2142 package_name: "org.dandroid.bp",
2143 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002144
2145 override_android_app {
2146 name: "baz_no_rename_resources",
2147 base: "foo",
2148 package_name: "org.dandroid.bp",
2149 rename_resources_package: false,
2150 }
2151
2152 android_app {
2153 name: "foo_no_rename_resources",
2154 srcs: ["a.java"],
2155 certificate: "expiredkey",
2156 overrides: ["qux"],
2157 rename_resources_package: false,
2158 sdk_version: "current",
2159 }
2160
2161 override_android_app {
2162 name: "baz_base_no_rename_resources",
2163 base: "foo_no_rename_resources",
2164 package_name: "org.dandroid.bp",
2165 }
2166
2167 override_android_app {
2168 name: "baz_override_base_rename_resources",
2169 base: "foo_no_rename_resources",
2170 package_name: "org.dandroid.bp",
2171 rename_resources_package: true,
2172 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08002173 `)
2174
2175 expectedVariants := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002176 name string
2177 moduleName string
2178 variantName string
2179 apkName string
2180 apkPath string
2181 certFlag string
2182 certSigningFlags string
2183 overrides []string
2184 packageFlag string
2185 renameResources bool
2186 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08002187 }{
2188 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002189 name: "foo",
2190 moduleName: "foo",
2191 variantName: "android_common",
2192 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2193 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2194 certSigningFlags: "",
2195 overrides: []string{"qux"},
2196 packageFlag: "",
2197 renameResources: false,
2198 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002199 },
2200 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002201 name: "foo",
2202 moduleName: "bar",
2203 variantName: "android_common_bar",
2204 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2205 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
2206 certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
2207 overrides: []string{"qux", "foo"},
2208 packageFlag: "",
2209 renameResources: false,
2210 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002211 },
2212 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002213 name: "foo",
2214 moduleName: "baz",
2215 variantName: "android_common_baz",
2216 apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk",
2217 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2218 certSigningFlags: "",
2219 overrides: []string{"qux", "foo"},
2220 packageFlag: "org.dandroid.bp",
2221 renameResources: true,
2222 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002223 },
2224 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002225 name: "foo",
2226 moduleName: "baz_no_rename_resources",
2227 variantName: "android_common_baz_no_rename_resources",
2228 apkPath: "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
2229 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2230 certSigningFlags: "",
2231 overrides: []string{"qux", "foo"},
2232 packageFlag: "org.dandroid.bp",
2233 renameResources: false,
2234 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002235 },
2236 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002237 name: "foo_no_rename_resources",
2238 moduleName: "baz_base_no_rename_resources",
2239 variantName: "android_common_baz_base_no_rename_resources",
2240 apkPath: "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
2241 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2242 certSigningFlags: "",
2243 overrides: []string{"qux", "foo_no_rename_resources"},
2244 packageFlag: "org.dandroid.bp",
2245 renameResources: false,
2246 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002247 },
2248 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002249 name: "foo_no_rename_resources",
2250 moduleName: "baz_override_base_rename_resources",
2251 variantName: "android_common_baz_override_base_rename_resources",
2252 apkPath: "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
2253 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2254 certSigningFlags: "",
2255 overrides: []string{"qux", "foo_no_rename_resources"},
2256 packageFlag: "org.dandroid.bp",
2257 renameResources: true,
2258 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002259 },
2260 }
2261 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002262 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002263
2264 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002265 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002266
2267 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08002268 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07002269 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002270 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07002271
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002272 // Check the cert signing flags
2273 certSigningFlags := signapk.Args["flags"]
2274 android.AssertStringEquals(t, "cert signing flags", expected.certSigningFlags, certSigningFlags)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002275
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002276 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08002277 mod := variant.Module().(*AndroidApp)
zhidoua2ce78f2022-02-17 02:33:12 +00002278 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002279
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002280 // Test Overridable property: Logging_parent
2281 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002282 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002283
Liz Kammer1d5983b2020-05-19 19:15:37 +00002284 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002285 res := variant.Output("package-res.apk")
2286 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00002287 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
2288 expectedPackage := expected.packageFlag
2289 if !expected.renameResources {
2290 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00002291 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002292 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002293 }
2294}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07002295
zhidoua2ce78f2022-02-17 02:33:12 +00002296func TestOverrideAndroidAppOverrides(t *testing.T) {
2297 ctx, _ := testJava(
2298 t, `
2299 android_app {
2300 name: "foo",
2301 srcs: ["a.java"],
2302 sdk_version: "current",
2303 overrides: ["qux"]
2304 }
2305
2306 android_app {
2307 name: "bar",
2308 srcs: ["b.java"],
2309 sdk_version: "current",
2310 overrides: ["foo"]
2311 }
2312
2313 override_android_app {
2314 name: "foo_override",
2315 base: "foo",
2316 overrides: ["bar"]
2317 }
2318 `)
2319
2320 expectedVariants := []struct {
2321 name string
2322 moduleName string
2323 variantName string
2324 overrides []string
2325 }{
2326 {
2327 name: "foo",
2328 moduleName: "foo",
2329 variantName: "android_common",
2330 overrides: []string{"qux"},
2331 },
2332 {
2333 name: "bar",
2334 moduleName: "bar",
2335 variantName: "android_common",
2336 overrides: []string{"foo"},
2337 },
2338 {
2339 name: "foo",
2340 moduleName: "foo_override",
2341 variantName: "android_common_foo_override",
2342 overrides: []string{"bar", "foo"},
2343 },
2344 }
2345 for _, expected := range expectedVariants {
2346 variant := ctx.ModuleForTests(expected.name, expected.variantName)
2347
2348 // Check if the overrides field values are correctly aggregated.
2349 mod := variant.Module().(*AndroidApp)
2350 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2351 }
2352}
2353
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002354func TestOverrideAndroidAppWithPrebuilt(t *testing.T) {
2355 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2356 t, `
2357 android_app {
2358 name: "foo",
2359 srcs: ["a.java"],
2360 sdk_version: "current",
2361 }
2362
2363 override_android_app {
2364 name: "bar",
2365 base: "foo",
2366 }
2367
2368 android_app_import {
2369 name: "bar",
2370 prefer: true,
2371 apk: "bar.apk",
2372 presigned: true,
2373 }
2374 `)
2375
2376 // An app that has an override that also has a prebuilt should not be hidden.
2377 foo := result.ModuleForTests("foo", "android_common")
2378 if foo.Module().IsHideFromMake() {
2379 t.Errorf("expected foo to have HideFromMake false")
2380 }
2381
2382 // An override that also has a prebuilt should be hidden.
2383 barOverride := result.ModuleForTests("foo", "android_common_bar")
2384 if !barOverride.Module().IsHideFromMake() {
2385 t.Errorf("expected bar override variant of foo to have HideFromMake true")
2386 }
2387}
2388
Jooyung Han01d80d82022-01-08 12:16:32 +09002389func TestOverrideAndroidAppStem(t *testing.T) {
2390 ctx, _ := testJava(t, `
2391 android_app {
2392 name: "foo",
2393 srcs: ["a.java"],
2394 sdk_version: "current",
2395 }
2396 override_android_app {
2397 name: "bar",
2398 base: "foo",
2399 }
2400 override_android_app {
2401 name: "baz",
2402 base: "foo",
2403 stem: "baz_stem",
2404 }
2405 android_app {
2406 name: "foo2",
2407 srcs: ["a.java"],
2408 sdk_version: "current",
2409 stem: "foo2_stem",
2410 }
2411 override_android_app {
2412 name: "bar2",
2413 base: "foo2",
2414 }
2415 override_android_app {
2416 name: "baz2",
2417 base: "foo2",
2418 stem: "baz2_stem",
2419 }
2420 `)
2421 for _, expected := range []struct {
2422 moduleName string
2423 variantName string
2424 apkPath string
2425 }{
2426 {
2427 moduleName: "foo",
2428 variantName: "android_common",
2429 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2430 },
2431 {
2432 moduleName: "foo",
2433 variantName: "android_common_bar",
2434 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2435 },
2436 {
2437 moduleName: "foo",
2438 variantName: "android_common_baz",
2439 apkPath: "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk",
2440 },
2441 {
2442 moduleName: "foo2",
2443 variantName: "android_common",
2444 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2445 },
2446 {
2447 moduleName: "foo2",
2448 variantName: "android_common_bar2",
2449 // Note that this may cause the duplicate output error.
2450 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2451 },
2452 {
2453 moduleName: "foo2",
2454 variantName: "android_common_baz2",
2455 apkPath: "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
2456 },
2457 } {
2458 variant := ctx.ModuleForTests(expected.moduleName, expected.variantName)
2459 variant.Output(expected.apkPath)
2460 }
2461}
2462
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002463func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002464 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002465 android_app {
2466 name: "foo",
2467 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002468 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002469 }
2470
2471 override_android_app {
2472 name: "bar",
2473 base: "foo",
2474 package_name: "org.dandroid.bp",
2475 }
2476
2477 android_test {
2478 name: "baz",
2479 srcs: ["b.java"],
2480 instrumentation_for: "foo",
2481 }
2482
2483 android_test {
2484 name: "qux",
2485 srcs: ["b.java"],
2486 instrumentation_for: "bar",
2487 }
2488 `)
2489
2490 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002491 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002492 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002493 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2494 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2495 }
2496
2497 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002498 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002499 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002500 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2501 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2502 }
2503}
2504
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002505func TestOverrideAndroidTest(t *testing.T) {
2506 ctx, _ := testJava(t, `
2507 android_app {
2508 name: "foo",
2509 srcs: ["a.java"],
2510 package_name: "com.android.foo",
2511 sdk_version: "current",
2512 }
2513
2514 override_android_app {
2515 name: "bar",
2516 base: "foo",
2517 package_name: "com.android.bar",
2518 }
2519
2520 android_test {
2521 name: "foo_test",
2522 srcs: ["b.java"],
2523 instrumentation_for: "foo",
2524 }
2525
2526 override_android_test {
2527 name: "bar_test",
2528 base: "foo_test",
2529 package_name: "com.android.bar.test",
2530 instrumentation_for: "bar",
2531 instrumentation_target_package: "com.android.bar",
2532 }
2533 `)
2534
2535 expectedVariants := []struct {
2536 moduleName string
2537 variantName string
2538 apkPath string
2539 overrides []string
2540 targetVariant string
2541 packageFlag string
2542 targetPackageFlag string
2543 }{
2544 {
2545 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002546 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002547 overrides: nil,
2548 targetVariant: "android_common",
2549 packageFlag: "",
2550 targetPackageFlag: "",
2551 },
2552 {
2553 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002554 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002555 overrides: []string{"foo_test"},
2556 targetVariant: "android_common_bar",
2557 packageFlag: "com.android.bar.test",
2558 targetPackageFlag: "com.android.bar",
2559 },
2560 }
2561 for _, expected := range expectedVariants {
2562 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2563
2564 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002565 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002566
2567 // Check if the overrides field values are correctly aggregated.
2568 mod := variant.Module().(*AndroidTest)
zhidoua2ce78f2022-02-17 02:33:12 +00002569 if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002570 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
zhidoua2ce78f2022-02-17 02:33:12 +00002571 expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002572 }
2573
2574 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01002575 javac := variant.Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002576 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002577 if !strings.Contains(javac.Args["classpath"], turbine) {
2578 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2579 }
2580
2581 // Check aapt2 flags.
2582 res := variant.Output("package-res.apk")
2583 aapt2Flags := res.Args["flags"]
2584 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002585 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002586 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2587 }
2588}
2589
Jaewoong Jung39982342020-01-14 10:27:18 -08002590func TestAndroidTest_FixTestConfig(t *testing.T) {
2591 ctx, _ := testJava(t, `
2592 android_app {
2593 name: "foo",
2594 srcs: ["a.java"],
2595 package_name: "com.android.foo",
2596 sdk_version: "current",
2597 }
2598
2599 android_test {
2600 name: "foo_test",
2601 srcs: ["b.java"],
2602 instrumentation_for: "foo",
2603 }
2604
2605 android_test {
2606 name: "bar_test",
2607 srcs: ["b.java"],
2608 package_name: "com.android.bar.test",
2609 instrumentation_for: "foo",
Seth Moorec6f4b532023-02-02 13:22:26 -08002610 mainline_package_name: "com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08002611 }
2612
2613 override_android_test {
2614 name: "baz_test",
2615 base: "foo_test",
2616 package_name: "com.android.baz.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08002617 mainline_package_name: "com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08002618 }
2619 `)
2620
2621 testCases := []struct {
2622 moduleName string
2623 variantName string
2624 expectedFlags []string
2625 }{
2626 {
2627 moduleName: "foo_test",
2628 variantName: "android_common",
2629 },
2630 {
2631 moduleName: "bar_test",
2632 variantName: "android_common",
2633 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002634 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002635 "--package-name com.android.bar.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08002636 "--mainline-package-name com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08002637 },
2638 },
2639 {
2640 moduleName: "foo_test",
2641 variantName: "android_common_baz_test",
2642 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002643 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002644 "--package-name com.android.baz.test",
2645 "--test-file-name baz_test.apk",
Seth Moorec6f4b532023-02-02 13:22:26 -08002646 "out/soong/.intermediates/foo_test/android_common_baz_test/test_config_fixer/AndroidTest.xml",
2647 "--mainline-package-name com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08002648 },
2649 },
2650 }
2651
2652 for _, test := range testCases {
2653 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01002654 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08002655
2656 if len(test.expectedFlags) > 0 {
2657 if params.Rule == nil {
2658 t.Errorf("test_config_fixer was expected to run, but didn't")
2659 } else {
2660 for _, flag := range test.expectedFlags {
2661 if !strings.Contains(params.RuleParams.Command, flag) {
2662 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
2663 }
2664 }
2665 }
2666 } else {
2667 if params.Rule != nil {
2668 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
2669 }
2670 }
Jaewoong Jung39982342020-01-14 10:27:18 -08002671 }
2672}
2673
Paul Duffin53a70a42022-01-11 14:35:55 +00002674func TestInstrumentationTargetPrebuilt(t *testing.T) {
2675 bp := `
2676 android_app_import {
2677 name: "foo",
2678 apk: "foo.apk",
2679 presigned: true,
2680 }
2681
2682 android_test {
2683 name: "bar",
2684 srcs: ["a.java"],
2685 instrumentation_for: "foo",
2686 sdk_version: "current",
2687 }
2688 `
2689
2690 android.GroupFixturePreparers(
2691 PrepareForTestWithJavaDefaultModules,
2692 ).ExtendWithErrorHandler(
2693 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
2694 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
2695 RunTestWithBp(t, bp)
2696}
2697
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002698func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002699 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002700 cc_library {
2701 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08002702 sdk_version: "current",
2703 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002704 }
2705
2706 android_test {
2707 name: "stl",
2708 jni_libs: ["libjni"],
2709 compile_multilib: "both",
2710 sdk_version: "current",
2711 stl: "c++_shared",
2712 }
2713
2714 android_test {
2715 name: "system",
2716 jni_libs: ["libjni"],
2717 compile_multilib: "both",
2718 sdk_version: "current",
2719 }
2720 `)
2721
2722 testCases := []struct {
2723 name string
2724 jnis []string
2725 }{
2726 {"stl",
2727 []string{
2728 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07002729 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002730 },
2731 },
2732 {"system",
2733 []string{
2734 "libjni.so",
2735 },
2736 },
2737 }
2738
2739 for _, test := range testCases {
2740 t.Run(test.name, func(t *testing.T) {
2741 app := ctx.ModuleForTests(test.name, "android_common")
Sam Delmerico82602492022-06-10 17:05:42 +00002742 jniLibZip := app.Output(jniJarOutputPathString)
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002743 var jnis []string
2744 args := strings.Fields(jniLibZip.Args["jarArgs"])
2745 for i := 0; i < len(args); i++ {
2746 if args[i] == "-f" {
2747 jnis = append(jnis, args[i+1])
2748 i += 1
2749 }
2750 }
2751 jnisJoined := strings.Join(jnis, " ")
2752 for _, jni := range test.jnis {
2753 if !strings.Contains(jnisJoined, jni) {
2754 t.Errorf("missing jni %q in %q", jni, jnis)
2755 }
2756 }
2757 })
2758 }
2759}
Colin Cross50ddcc42019-05-16 12:28:22 -07002760
2761func TestUsesLibraries(t *testing.T) {
2762 bp := `
2763 java_sdk_library {
2764 name: "foo",
2765 srcs: ["a.java"],
2766 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002767 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002768 }
2769
2770 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01002771 name: "qux",
2772 srcs: ["a.java"],
2773 api_packages: ["qux"],
2774 sdk_version: "current",
2775 }
2776
2777 java_sdk_library {
2778 name: "quuz",
2779 srcs: ["a.java"],
2780 api_packages: ["quuz"],
2781 sdk_version: "current",
2782 }
2783
2784 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002785 name: "fred",
2786 srcs: ["a.java"],
2787 api_packages: ["fred"],
2788 sdk_version: "current",
2789 }
2790
2791 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07002792 name: "bar",
2793 srcs: ["a.java"],
2794 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002795 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002796 }
2797
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01002798 java_sdk_library {
2799 name: "runtime-library",
2800 srcs: ["a.java"],
2801 sdk_version: "current",
2802 }
2803
2804 java_library {
2805 name: "static-runtime-helper",
2806 srcs: ["a.java"],
2807 libs: ["runtime-library"],
2808 sdk_version: "current",
2809 }
2810
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002811 java_library {
2812 name: "runtime-required-x",
2813 srcs: ["a.java"],
2814 installable: true,
2815 sdk_version: "current",
2816 }
2817
2818 java_library {
2819 name: "runtime-optional-x",
2820 srcs: ["a.java"],
2821 installable: true,
2822 sdk_version: "current",
2823 }
2824
2825 android_library {
2826 name: "static-x",
2827 uses_libs: ["runtime-required-x"],
2828 optional_uses_libs: ["runtime-optional-x"],
2829 sdk_version: "current",
2830 }
2831
2832 java_library {
2833 name: "runtime-required-y",
2834 srcs: ["a.java"],
2835 installable: true,
2836 sdk_version: "current",
2837 }
2838
2839 java_library {
2840 name: "runtime-optional-y",
2841 srcs: ["a.java"],
2842 installable: true,
2843 sdk_version: "current",
2844 }
2845
2846 java_library {
2847 name: "static-y",
2848 srcs: ["a.java"],
2849 uses_libs: ["runtime-required-y"],
2850 optional_uses_libs: ["runtime-optional-y"],
2851 sdk_version: "current",
2852 }
2853
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002854 // A library that has to use "provides_uses_lib", because:
2855 // - it is not an SDK library
2856 // - its library name is different from its module name
2857 java_library {
2858 name: "non-sdk-lib",
2859 provides_uses_lib: "com.non.sdk.lib",
2860 installable: true,
2861 srcs: ["a.java"],
2862 }
2863
Colin Cross50ddcc42019-05-16 12:28:22 -07002864 android_app {
2865 name: "app",
2866 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002867 libs: [
2868 "qux",
2869 "quuz.stubs"
2870 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002871 static_libs: [
2872 "static-runtime-helper",
2873 // statically linked component libraries should not pull their SDK libraries,
2874 // so "fred" should not be added to class loader context
2875 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002876 "static-x",
2877 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002878 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002879 uses_libs: [
2880 "foo",
2881 "non-sdk-lib"
2882 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002883 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002884 optional_uses_libs: [
2885 "bar",
2886 "baz",
2887 ],
2888 }
2889
2890 android_app_import {
2891 name: "prebuilt",
2892 apk: "prebuilts/apk/app.apk",
2893 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002894 uses_libs: [
2895 "foo",
2896 "non-sdk-lib",
2897 "android.test.runner"
2898 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07002899 optional_uses_libs: [
2900 "bar",
2901 "baz",
2902 ],
2903 }
2904 `
2905
Paul Duffin71ae5942021-03-22 15:36:52 +00002906 result := android.GroupFixturePreparers(
2907 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00002908 PrepareForTestWithJavaSdkLibraryFiles,
2909 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Jiakai Zhang48203e32023-06-02 23:42:21 +01002910 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2911 variables.BuildWarningBadOptionalUsesLibsAllowlist = []string{"app", "prebuilt"}
2912 }),
Paul Duffind234b412021-03-12 23:04:46 +00002913 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07002914
Paul Duffind234b412021-03-12 23:04:46 +00002915 app := result.ModuleForTests("app", "android_common")
2916 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07002917
Paul Duffin859fe962020-05-15 10:20:31 +01002918 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01002919 // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be
2920 // propagated from dependencies.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002921 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2922 expectManifestFixerArgs := `--extract-native-libs=true ` +
2923 `--uses-library qux ` +
2924 `--uses-library quuz ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01002925 `--uses-library foo ` +
2926 `--uses-library com.non.sdk.lib ` +
2927 `--uses-library runtime-library ` +
2928 `--uses-library runtime-required-x ` +
2929 `--uses-library runtime-required-y ` +
2930 `--optional-uses-library bar ` +
2931 `--optional-uses-library runtime-optional-x ` +
2932 `--optional-uses-library runtime-optional-y`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00002933 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01002934
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002935 // Test that all libraries are verified (library order matters).
2936 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
2937 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002938 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002939 `--uses-library qux ` +
2940 `--uses-library quuz ` +
2941 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002942 `--uses-library runtime-required-x ` +
2943 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002944 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002945 `--optional-uses-library baz ` +
2946 `--optional-uses-library runtime-optional-x ` +
2947 `--optional-uses-library runtime-optional-y `
Paul Duffind234b412021-03-12 23:04:46 +00002948 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002949
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002950 // Test that all libraries are verified for an APK (library order matters).
2951 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00002952 verifyApkArgs := `--uses-library foo ` +
2953 `--uses-library com.non.sdk.lib ` +
2954 `--uses-library android.test.runner ` +
2955 `--optional-uses-library bar ` +
2956 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002957 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002958
Jiakai Zhanga4496782023-05-17 16:57:30 +01002959 // Test that necessary args are passed for constructing CLC in Ninja phase.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002960 cmd := app.Rule("dexpreopt").RuleParams.Command
Jiakai Zhanga4496782023-05-17 16:57:30 +01002961 android.AssertStringDoesContain(t, "dexpreopt app cmd context", cmd, "--context-json=")
2962 android.AssertStringDoesContain(t, "dexpreopt app cmd product_packages", cmd,
Jiakai Zhang51b2a8b2023-06-26 16:47:38 +01002963 "--product-packages=out/soong/.intermediates/app/android_common/dexpreopt/product_packages.txt")
Colin Cross50ddcc42019-05-16 12:28:22 -07002964}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002965
Ulya Trafimovich9023b022021-03-22 16:02:28 +00002966func TestDexpreoptBcp(t *testing.T) {
2967 bp := `
2968 java_sdk_library {
2969 name: "foo",
2970 srcs: ["a.java"],
2971 api_packages: ["foo"],
2972 sdk_version: "current",
2973 }
2974
2975 java_sdk_library {
2976 name: "bar",
2977 srcs: ["a.java"],
2978 api_packages: ["bar"],
2979 permitted_packages: ["bar"],
2980 sdk_version: "current",
2981 }
2982
2983 android_app {
2984 name: "app",
2985 srcs: ["a.java"],
2986 sdk_version: "current",
2987 }
2988 `
2989
2990 testCases := []struct {
2991 name string
2992 with bool
2993 expect string
2994 }{
2995 {
2996 name: "with updatable bcp",
2997 with: true,
2998 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
2999 },
3000 {
3001 name: "without updatable bcp",
3002 with: false,
3003 expect: "/system/framework/foo.jar",
3004 },
3005 }
3006
3007 for _, test := range testCases {
3008 t.Run(test.name, func(t *testing.T) {
3009 result := android.GroupFixturePreparers(
3010 prepareForJavaTest,
3011 PrepareForTestWithJavaSdkLibraryFiles,
3012 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
3013 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01003014 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003015 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
3016 ).RunTestWithBp(t, bp)
3017
3018 app := result.ModuleForTests("app", "android_common")
3019 cmd := app.Rule("dexpreopt").RuleParams.Command
3020 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
3021 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
3022 })
3023 }
3024}
3025
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003026func TestCodelessApp(t *testing.T) {
3027 testCases := []struct {
3028 name string
3029 bp string
3030 noCode bool
3031 }{
3032 {
3033 name: "normal",
3034 bp: `
3035 android_app {
3036 name: "foo",
3037 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003038 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003039 }
3040 `,
3041 noCode: false,
3042 },
3043 {
3044 name: "app without sources",
3045 bp: `
3046 android_app {
3047 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003048 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003049 }
3050 `,
3051 noCode: true,
3052 },
3053 {
3054 name: "app with libraries",
3055 bp: `
3056 android_app {
3057 name: "foo",
3058 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003059 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003060 }
3061
3062 java_library {
3063 name: "lib",
3064 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003065 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003066 }
3067 `,
3068 noCode: false,
3069 },
3070 {
3071 name: "app with sourceless libraries",
3072 bp: `
3073 android_app {
3074 name: "foo",
3075 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003076 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003077 }
3078
3079 java_library {
3080 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003081 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003082 }
3083 `,
3084 // TODO(jungjw): this should probably be true
3085 noCode: false,
3086 },
3087 }
3088
3089 for _, test := range testCases {
3090 t.Run(test.name, func(t *testing.T) {
3091 ctx := testApp(t, test.bp)
3092
3093 foo := ctx.ModuleForTests("foo", "android_common")
3094 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3095 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
3096 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
3097 }
3098 })
3099 }
3100}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07003101
Colin Cross53a87f52019-06-25 13:35:30 -07003102func TestUncompressDex(t *testing.T) {
3103 testCases := []struct {
3104 name string
3105 bp string
3106
3107 uncompressedPlatform bool
3108 uncompressedUnbundled bool
3109 }{
3110 {
3111 name: "normal",
3112 bp: `
3113 android_app {
3114 name: "foo",
3115 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003116 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003117 }
3118 `,
3119 uncompressedPlatform: true,
3120 uncompressedUnbundled: false,
3121 },
3122 {
3123 name: "use_embedded_dex",
3124 bp: `
3125 android_app {
3126 name: "foo",
3127 use_embedded_dex: true,
3128 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003129 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003130 }
3131 `,
3132 uncompressedPlatform: true,
3133 uncompressedUnbundled: true,
3134 },
3135 {
3136 name: "privileged",
3137 bp: `
3138 android_app {
3139 name: "foo",
3140 privileged: true,
3141 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003142 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003143 }
3144 `,
3145 uncompressedPlatform: true,
3146 uncompressedUnbundled: true,
3147 },
David Srbeckye033cba2020-05-20 22:20:28 +01003148 {
3149 name: "normal_uncompress_dex_true",
3150 bp: `
3151 android_app {
3152 name: "foo",
3153 srcs: ["a.java"],
3154 sdk_version: "current",
3155 uncompress_dex: true,
3156 }
3157 `,
3158 uncompressedPlatform: true,
3159 uncompressedUnbundled: true,
3160 },
3161 {
3162 name: "normal_uncompress_dex_false",
3163 bp: `
3164 android_app {
3165 name: "foo",
3166 srcs: ["a.java"],
3167 sdk_version: "current",
3168 uncompress_dex: false,
3169 }
3170 `,
3171 uncompressedPlatform: false,
3172 uncompressedUnbundled: false,
3173 },
Colin Cross53a87f52019-06-25 13:35:30 -07003174 }
3175
3176 test := func(t *testing.T, bp string, want bool, unbundled bool) {
3177 t.Helper()
3178
Paul Duffin71ae5942021-03-22 15:36:52 +00003179 result := android.GroupFixturePreparers(
3180 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003181 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00003182 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3183 if unbundled {
3184 variables.Unbundled_build = proptools.BoolPtr(true)
3185 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
3186 }
3187 }),
3188 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07003189
Paul Duffincdb88a92021-03-14 00:36:50 +00003190 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07003191 dex := foo.Rule("r8")
3192 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
3193 aligned := foo.MaybeRule("zipalign").Rule != nil
3194
Paul Duffincdb88a92021-03-14 00:36:50 +00003195 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07003196
Paul Duffincdb88a92021-03-14 00:36:50 +00003197 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07003198 }
3199
3200 for _, tt := range testCases {
3201 t.Run(tt.name, func(t *testing.T) {
3202 t.Run("platform", func(t *testing.T) {
3203 test(t, tt.bp, tt.uncompressedPlatform, false)
3204 })
3205 t.Run("unbundled", func(t *testing.T) {
3206 test(t, tt.bp, tt.uncompressedUnbundled, true)
3207 })
3208 })
3209 }
3210}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003211
3212func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
3213 if expectedValue != "" {
3214 expectedFlag := "--" + flagName + " " + expectedValue
3215 if !strings.Contains(aapt2Flags, expectedFlag) {
3216 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
3217 }
3218 } else {
3219 unexpectedFlag := "--" + flagName
3220 if strings.Contains(aapt2Flags, unexpectedFlag) {
3221 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
3222 }
3223 }
3224}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08003225
Cole Faust9a631312020-10-22 21:05:24 +00003226func TestExportedProguardFlagFiles(t *testing.T) {
3227 ctx, _ := testJava(t, `
3228 android_app {
3229 name: "foo",
3230 sdk_version: "current",
3231 static_libs: ["lib1"],
3232 }
3233
3234 android_library {
3235 name: "lib1",
3236 sdk_version: "current",
3237 optimize: {
3238 proguard_flags_files: ["lib1proguard.cfg"],
3239 }
3240 }
3241 `)
3242
3243 m := ctx.ModuleForTests("foo", "android_common")
3244 hasLib1Proguard := false
3245 for _, s := range m.Rule("java.r8").Implicits.Strings() {
3246 if s == "lib1proguard.cfg" {
3247 hasLib1Proguard = true
3248 break
3249 }
3250 }
3251
3252 if !hasLib1Proguard {
3253 t.Errorf("App does not use library proguard config")
3254 }
3255}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003256
3257func TestTargetSdkVersionManifestFixer(t *testing.T) {
3258 platform_sdk_codename := "Tiramisu"
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003259 platform_sdk_version := 33
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003260 testCases := []struct {
3261 name string
3262 targetSdkVersionInBp string
3263 targetSdkVersionExpected string
3264 unbundledBuild bool
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003265 platformSdkFinal bool
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003266 }{
3267 {
3268 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
3269 targetSdkVersionInBp: "30",
3270 targetSdkVersionExpected: "30",
3271 unbundledBuild: false,
3272 },
3273 {
3274 name: "Unbundled build: Android.bp has targetSdkVersion",
3275 targetSdkVersionInBp: "30",
3276 targetSdkVersionExpected: "30",
3277 unbundledBuild: true,
3278 },
3279 {
3280 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3281 targetSdkVersionInBp: platform_sdk_codename,
3282 targetSdkVersionExpected: platform_sdk_codename,
3283 unbundledBuild: false,
3284 },
3285 {
3286 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3287 targetSdkVersionInBp: platform_sdk_codename,
3288 targetSdkVersionExpected: "10000",
3289 unbundledBuild: true,
3290 },
3291
3292 {
3293 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
3294 targetSdkVersionExpected: platform_sdk_codename,
3295 unbundledBuild: false,
3296 },
3297 {
3298 name: "Unbundled build: Android.bp has no targetSdkVersion",
3299 targetSdkVersionExpected: "10000",
3300 unbundledBuild: true,
3301 },
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003302 {
3303 name: "Bundled build in REL branches",
3304 targetSdkVersionExpected: "33",
3305 unbundledBuild: false,
3306 platformSdkFinal: true,
3307 },
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003308 }
3309 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003310 targetSdkVersionTemplate := ""
3311 if testCase.targetSdkVersionInBp != "" {
3312 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, testCase.targetSdkVersionInBp)
3313 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003314 bp := fmt.Sprintf(`
3315 android_app {
3316 name: "foo",
3317 sdk_version: "current",
Spandan Dasca70fc42023-03-01 23:38:49 +00003318 %s
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003319 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003320 `, targetSdkVersionTemplate)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003321 fixture := android.GroupFixturePreparers(
3322 prepareForJavaTest,
3323 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003324 if testCase.platformSdkFinal {
3325 variables.Platform_sdk_final = proptools.BoolPtr(true)
3326 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003327 // explicitly set platform_sdk_codename to make the test deterministic
3328 variables.Platform_sdk_codename = &platform_sdk_codename
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003329 variables.Platform_sdk_version = &platform_sdk_version
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003330 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3331 // create a non-empty list if unbundledBuild==true
3332 if testCase.unbundledBuild {
3333 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3334 }
3335 }),
3336 )
3337
3338 result := fixture.RunTestWithBp(t, bp)
3339 foo := result.ModuleForTests("foo", "android_common")
3340
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003341 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3342 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003343 }
3344}
Colin Cross412436f2022-04-07 17:40:07 -07003345
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003346func TestDefaultAppTargetSdkVersionForUpdatableModules(t *testing.T) {
3347 platform_sdk_codename := "Tiramisu"
3348 platform_sdk_version := 33
3349 testCases := []struct {
3350 name string
3351 platform_sdk_final bool
3352 targetSdkVersionInBp *string
3353 targetSdkVersionExpected *string
3354 updatable bool
3355 }{
3356 {
3357 name: "Non-Updatable Module: Android.bp has older targetSdkVersion",
3358 targetSdkVersionInBp: proptools.StringPtr("29"),
3359 targetSdkVersionExpected: proptools.StringPtr("29"),
3360 updatable: false,
3361 },
3362 {
3363 name: "Updatable Module: Android.bp has older targetSdkVersion",
3364 targetSdkVersionInBp: proptools.StringPtr("30"),
3365 targetSdkVersionExpected: proptools.StringPtr("30"),
3366 updatable: true,
3367 },
3368 {
3369 name: "Updatable Module: Android.bp has no targetSdkVersion",
3370 targetSdkVersionExpected: proptools.StringPtr("10000"),
3371 updatable: true,
3372 },
3373 {
3374 name: "[SDK finalised] Non-Updatable Module: Android.bp has older targetSdkVersion",
3375 platform_sdk_final: true,
3376 targetSdkVersionInBp: proptools.StringPtr("30"),
3377 targetSdkVersionExpected: proptools.StringPtr("30"),
3378 updatable: false,
3379 },
3380 {
3381 name: "[SDK finalised] Updatable Module: Android.bp has older targetSdkVersion",
3382 platform_sdk_final: true,
3383 targetSdkVersionInBp: proptools.StringPtr("30"),
3384 targetSdkVersionExpected: proptools.StringPtr("30"),
3385 updatable: true,
3386 },
3387 {
3388 name: "[SDK finalised] Updatable Module: Android.bp has targetSdkVersion as platform sdk codename",
3389 platform_sdk_final: true,
3390 targetSdkVersionInBp: proptools.StringPtr(platform_sdk_codename),
3391 targetSdkVersionExpected: proptools.StringPtr("33"),
3392 updatable: true,
3393 },
3394 {
3395 name: "[SDK finalised] Updatable Module: Android.bp has no targetSdkVersion",
3396 platform_sdk_final: true,
3397 targetSdkVersionExpected: proptools.StringPtr("33"),
3398 updatable: true,
3399 },
3400 }
3401 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003402 targetSdkVersionTemplate := ""
3403 if testCase.targetSdkVersionInBp != nil {
3404 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, *testCase.targetSdkVersionInBp)
3405 }
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003406 bp := fmt.Sprintf(`
3407 android_app {
3408 name: "foo",
3409 sdk_version: "current",
3410 min_sdk_version: "29",
Spandan Dasca70fc42023-03-01 23:38:49 +00003411 %s
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003412 updatable: %t,
3413 enforce_default_target_sdk_version: %t
3414 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003415 `, targetSdkVersionTemplate, testCase.updatable, testCase.updatable) // enforce default target sdk version if app is updatable
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003416
3417 fixture := android.GroupFixturePreparers(
3418 PrepareForTestWithJavaDefaultModules,
3419 android.PrepareForTestWithAllowMissingDependencies,
3420 android.PrepareForTestWithAndroidMk,
3421 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3422 // explicitly set following platform variables to make the test deterministic
3423 variables.Platform_sdk_final = &testCase.platform_sdk_final
3424 variables.Platform_sdk_version = &platform_sdk_version
3425 variables.Platform_sdk_codename = &platform_sdk_codename
3426 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
Harshit Mahajan18845d02023-01-11 18:39:12 +00003427 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003428 variables.Unbundled_build_apps = []string{"sampleModule"}
3429 }),
3430 )
3431
3432 result := fixture.RunTestWithBp(t, bp)
3433 foo := result.ModuleForTests("foo", "android_common")
3434
3435 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3436 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+*testCase.targetSdkVersionExpected)
3437 }
3438}
3439
3440func TestEnforceDefaultAppTargetSdkVersionFlag(t *testing.T) {
3441 platform_sdk_codename := "Tiramisu"
3442 platform_sdk_version := 33
3443 testCases := []struct {
3444 name string
3445 enforceDefaultTargetSdkVersion bool
3446 expectedError string
3447 platform_sdk_final bool
3448 targetSdkVersionInBp string
3449 targetSdkVersionExpected string
3450 updatable bool
3451 }{
3452 {
3453 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
3454 enforceDefaultTargetSdkVersion: false,
3455 targetSdkVersionInBp: "29",
3456 targetSdkVersionExpected: "29",
3457 updatable: false,
3458 },
3459 {
3460 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3461 enforceDefaultTargetSdkVersion: true,
3462 platform_sdk_final: true,
3463 targetSdkVersionInBp: "current",
3464 targetSdkVersionExpected: "33",
3465 updatable: true,
3466 },
3467 {
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003468 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003469 enforceDefaultTargetSdkVersion: true,
3470 platform_sdk_final: false,
3471 targetSdkVersionInBp: "current",
3472 targetSdkVersionExpected: "10000",
3473 updatable: false,
3474 },
3475 {
3476 name: "Not enforcing Target SDK Version for Updatable app",
3477 enforceDefaultTargetSdkVersion: false,
3478 expectedError: "Updatable apps must enforce default target sdk version",
3479 targetSdkVersionInBp: "29",
3480 targetSdkVersionExpected: "29",
3481 updatable: true,
3482 },
3483 }
3484 for _, testCase := range testCases {
3485 errExpected := testCase.expectedError != ""
3486 bp := fmt.Sprintf(`
3487 android_app {
3488 name: "foo",
3489 enforce_default_target_sdk_version: %t,
3490 sdk_version: "current",
3491 min_sdk_version: "29",
3492 target_sdk_version: "%v",
3493 updatable: %t
3494 }
3495 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp, testCase.updatable)
3496
3497 fixture := android.GroupFixturePreparers(
3498 PrepareForTestWithJavaDefaultModules,
3499 android.PrepareForTestWithAllowMissingDependencies,
3500 android.PrepareForTestWithAndroidMk,
3501 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3502 // explicitly set following platform variables to make the test deterministic
3503 variables.Platform_sdk_final = &testCase.platform_sdk_final
3504 variables.Platform_sdk_version = &platform_sdk_version
3505 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00003506 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003507 variables.Unbundled_build_apps = []string{"sampleModule"}
3508 }),
3509 )
3510
3511 errorHandler := android.FixtureExpectsNoErrors
3512 if errExpected {
3513 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
3514 }
3515 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
3516
3517 if !errExpected {
3518 foo := result.ModuleForTests("foo", "android_common")
3519 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3520 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3521 }
3522 }
3523}
3524
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003525func TestEnforceDefaultAppTargetSdkVersionFlagForTests(t *testing.T) {
3526 platform_sdk_codename := "Tiramisu"
3527 platform_sdk_version := 33
3528 testCases := []struct {
3529 name string
3530 enforceDefaultTargetSdkVersion bool
3531 expectedError string
3532 platform_sdk_final bool
3533 targetSdkVersionInBp string
3534 targetSdkVersionExpected string
3535 }{
3536 {
3537 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
3538 enforceDefaultTargetSdkVersion: false,
3539 targetSdkVersionInBp: "29",
3540 targetSdkVersionExpected: "29",
3541 },
3542 {
3543 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3544 enforceDefaultTargetSdkVersion: true,
3545 platform_sdk_final: true,
3546 targetSdkVersionInBp: "current",
3547 targetSdkVersionExpected: "33",
3548 },
3549 {
3550 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3551 enforceDefaultTargetSdkVersion: true,
3552 platform_sdk_final: false,
3553 targetSdkVersionInBp: "current",
3554 targetSdkVersionExpected: "10000",
3555 },
3556 }
3557 for _, testCase := range testCases {
3558 errExpected := testCase.expectedError != ""
3559 bp := fmt.Sprintf(`
3560 android_test {
3561 name: "foo",
3562 enforce_default_target_sdk_version: %t,
3563 min_sdk_version: "29",
3564 target_sdk_version: "%v",
3565 }
3566 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp)
3567
3568 fixture := android.GroupFixturePreparers(
3569 PrepareForTestWithJavaDefaultModules,
3570 android.PrepareForTestWithAllowMissingDependencies,
3571 android.PrepareForTestWithAndroidMk,
3572 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3573 // explicitly set following platform variables to make the test deterministic
3574 variables.Platform_sdk_final = &testCase.platform_sdk_final
3575 variables.Platform_sdk_version = &platform_sdk_version
3576 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00003577 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003578 variables.Unbundled_build_apps = []string{"sampleModule"}
3579 }),
3580 )
3581
3582 errorHandler := android.FixtureExpectsNoErrors
3583 if errExpected {
3584 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
3585 }
3586 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
3587
3588 if !errExpected {
3589 foo := result.ModuleForTests("foo", "android_common")
3590 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3591 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3592 }
3593 }
3594}
3595
Colin Cross412436f2022-04-07 17:40:07 -07003596func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
3597 result := android.GroupFixturePreparers(
3598 PrepareForTestWithJavaDefaultModules,
3599 android.PrepareForTestWithAllowMissingDependencies,
3600 android.PrepareForTestWithAndroidMk,
3601 ).RunTestWithBp(t, `
3602 android_app {
3603 name: "foo",
3604 srcs: ["a.java"],
3605 certificate: ":missing_certificate",
3606 sdk_version: "current",
Zyan Wub7550aa2023-05-18 15:46:31 +08003607 }
3608
3609 android_app {
3610 name: "bar",
3611 srcs: ["a.java"],
3612 certificate: ":missing_certificate",
3613 product_specific: true,
3614 sdk_version: "current",
Colin Cross412436f2022-04-07 17:40:07 -07003615 }`)
3616
3617 foo := result.ModuleForTests("foo", "android_common")
3618 fooApk := foo.Output("foo.apk")
3619 if fooApk.Rule != android.ErrorRule {
3620 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
3621 }
3622 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
3623}
Sam Delmerico82602492022-06-10 17:05:42 +00003624
3625func TestAppIncludesJniPackages(t *testing.T) {
3626 ctx := android.GroupFixturePreparers(
3627 PrepareForTestWithJavaDefaultModules,
3628 ).RunTestWithBp(t, `
3629 android_library_import {
3630 name: "aary-nodeps",
3631 aars: ["aary.aar"],
3632 extract_jni: true,
3633 }
3634
3635 android_library {
3636 name: "aary-lib",
3637 sdk_version: "current",
3638 min_sdk_version: "21",
3639 static_libs: ["aary-nodeps"],
3640 }
3641
3642 android_app {
3643 name: "aary-lib-dep",
3644 sdk_version: "current",
3645 min_sdk_version: "21",
3646 manifest: "AndroidManifest.xml",
3647 static_libs: ["aary-lib"],
3648 use_embedded_native_libs: true,
3649 }
3650
3651 android_app {
3652 name: "aary-import-dep",
3653 sdk_version: "current",
3654 min_sdk_version: "21",
3655 manifest: "AndroidManifest.xml",
3656 static_libs: ["aary-nodeps"],
3657 use_embedded_native_libs: true,
3658 }
3659
3660 android_app {
3661 name: "aary-no-use-embedded",
3662 sdk_version: "current",
3663 min_sdk_version: "21",
3664 manifest: "AndroidManifest.xml",
3665 static_libs: ["aary-nodeps"],
3666 }`)
3667
3668 testCases := []struct {
3669 name string
3670 hasPackage bool
3671 }{
3672 {
3673 name: "aary-import-dep",
3674 hasPackage: true,
3675 },
3676 {
3677 name: "aary-lib-dep",
3678 hasPackage: true,
3679 },
3680 {
3681 name: "aary-no-use-embedded",
3682 hasPackage: false,
3683 },
3684 }
3685
3686 for _, tc := range testCases {
3687 t.Run(tc.name, func(t *testing.T) {
3688 app := ctx.ModuleForTests(tc.name, "android_common")
3689
3690 outputFile := "jnilibs.zip"
3691 jniOutputLibZip := app.MaybeOutput(outputFile)
3692 if jniOutputLibZip.Rule == nil && !tc.hasPackage {
3693 return
3694 }
3695
3696 jniPackage := "arm64-v8a_jni.zip"
3697 inputs := jniOutputLibZip.Inputs
3698 foundPackage := false
3699 for i := 0; i < len(inputs); i++ {
3700 if strings.Contains(inputs[i].String(), jniPackage) {
3701 foundPackage = true
3702 }
3703 }
3704 if foundPackage != tc.hasPackage {
3705 t.Errorf("expected to find %v in %v inputs; inputs = %v", jniPackage, outputFile, inputs)
3706 }
3707 })
3708 }
3709}
Spandan Das9f7ae7f2022-07-25 00:34:18 +00003710
3711func TestTargetSdkVersionMtsTests(t *testing.T) {
3712 platformSdkCodename := "Tiramisu"
3713 android_test := "android_test"
3714 android_test_helper_app := "android_test_helper_app"
3715 bpTemplate := `
3716 %v {
3717 name: "mytest",
3718 target_sdk_version: "%v",
3719 test_suites: ["othersuite", "%v"],
3720 }
3721 `
3722 testCases := []struct {
3723 desc string
3724 moduleType string
3725 targetSdkVersionInBp string
3726 targetSdkVersionExpected string
3727 testSuites string
3728 }{
3729 {
3730 desc: "Non-MTS android_test_apps targeting current should not be upgraded to 10000",
3731 moduleType: android_test,
3732 targetSdkVersionInBp: "current",
3733 targetSdkVersionExpected: platformSdkCodename,
3734 testSuites: "non-mts-suite",
3735 },
3736 {
3737 desc: "MTS android_test_apps targeting released sdks should not be upgraded to 10000",
3738 moduleType: android_test,
3739 targetSdkVersionInBp: "29",
3740 targetSdkVersionExpected: "29",
3741 testSuites: "mts-suite",
3742 },
3743 {
3744 desc: "MTS android_test_apps targeting current should be upgraded to 10000",
3745 moduleType: android_test,
3746 targetSdkVersionInBp: "current",
3747 targetSdkVersionExpected: "10000",
3748 testSuites: "mts-suite",
3749 },
3750 {
3751 desc: "MTS android_test_helper_apps targeting current should be upgraded to 10000",
3752 moduleType: android_test_helper_app,
3753 targetSdkVersionInBp: "current",
3754 targetSdkVersionExpected: "10000",
3755 testSuites: "mts-suite",
3756 },
3757 }
3758 fixture := android.GroupFixturePreparers(
3759 prepareForJavaTest,
3760 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3761 variables.Platform_sdk_codename = &platformSdkCodename
3762 variables.Platform_version_active_codenames = []string{platformSdkCodename}
3763 }),
3764 )
3765 for _, testCase := range testCases {
3766 result := fixture.RunTestWithBp(t, fmt.Sprintf(bpTemplate, testCase.moduleType, testCase.targetSdkVersionInBp, testCase.testSuites))
3767 mytest := result.ModuleForTests("mytest", "android_common")
3768 manifestFixerArgs := mytest.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3769 android.AssertStringDoesContain(t, testCase.desc, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3770 }
3771}
Andrei Onea580636b2022-08-17 16:53:46 +00003772
3773func TestPrivappAllowlist(t *testing.T) {
3774 testJavaError(t, "privileged must be set in order to use privapp_allowlist", `
3775 android_app {
3776 name: "foo",
3777 srcs: ["a.java"],
3778 privapp_allowlist: "perms.xml",
3779 }
3780 `)
3781
3782 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
3783 t,
3784 `
3785 android_app {
3786 name: "foo",
3787 srcs: ["a.java"],
Sam Delmerico15809f82023-05-15 17:21:47 -04003788 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
Andrei Onea580636b2022-08-17 16:53:46 +00003789 privileged: true,
Andrei Onea580636b2022-08-17 16:53:46 +00003790 sdk_version: "current",
3791 }
3792 override_android_app {
3793 name: "bar",
3794 base: "foo",
3795 package_name: "com.google.android.foo",
3796 }
3797 `,
3798 )
3799 app := result.ModuleForTests("foo", "android_common")
3800 overrideApp := result.ModuleForTests("foo", "android_common_bar")
3801
Sam Delmerico15809f82023-05-15 17:21:47 -04003802 // verify that privapp allowlist is created for override apps
Andrei Onea580636b2022-08-17 16:53:46 +00003803 overrideApp.Output("out/soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml")
Sam Delmerico15809f82023-05-15 17:21:47 -04003804 expectedAllowlistInput := "privapp_allowlist_com.android.foo.xml"
3805 overrideActualAllowlistInput := overrideApp.Rule("modifyAllowlist").Input.String()
3806 if expectedAllowlistInput != overrideActualAllowlistInput {
3807 t.Errorf("expected override allowlist to be %q; got %q", expectedAllowlistInput, overrideActualAllowlistInput)
Andrei Onea580636b2022-08-17 16:53:46 +00003808 }
3809
3810 // verify that permissions are copied to device
Anton Hansson0e486a42023-06-01 16:38:35 +00003811 app.Output("out/soong/target/product/test_device/system/etc/permissions/foo.xml")
3812 overrideApp.Output("out/soong/target/product/test_device/system/etc/permissions/bar.xml")
Andrei Onea580636b2022-08-17 16:53:46 +00003813}
Sam Delmericob1daccd2023-05-25 14:45:30 -04003814
3815func TestPrivappAllowlistAndroidMk(t *testing.T) {
3816 result := android.GroupFixturePreparers(
3817 PrepareForTestWithJavaDefaultModules,
3818 android.PrepareForTestWithAndroidMk,
3819 ).RunTestWithBp(
3820 t,
3821 `
3822 android_app {
3823 name: "foo",
3824 srcs: ["a.java"],
3825 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
3826 privileged: true,
3827 sdk_version: "current",
3828 }
3829 override_android_app {
3830 name: "bar",
3831 base: "foo",
3832 package_name: "com.google.android.foo",
3833 }
3834 `,
3835 )
3836 baseApp := result.ModuleForTests("foo", "android_common")
3837 overrideApp := result.ModuleForTests("foo", "android_common_bar")
3838
3839 baseAndroidApp := baseApp.Module().(*AndroidApp)
3840 baseEntries := android.AndroidMkEntriesForTest(t, result.TestContext, baseAndroidApp)[0]
3841 android.AssertStringMatches(
3842 t,
3843 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find foo.apk",
3844 baseEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
3845 "\\S+foo.apk",
3846 )
3847 android.AssertStringMatches(
3848 t,
3849 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include foo.apk",
3850 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
3851 "\\S+foo.apk",
3852 )
3853 android.AssertStringMatches(
3854 t,
3855 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
3856 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
3857 "\\S+foo.apk:\\S+/target/product/test_device/system/priv-app/foo/foo.apk",
3858 )
3859 android.AssertStringMatches(
3860 t,
3861 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
3862 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00003863 "privapp_allowlist_com.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/foo.xml",
Sam Delmericob1daccd2023-05-25 14:45:30 -04003864 )
3865
3866 overrideAndroidApp := overrideApp.Module().(*AndroidApp)
3867 overrideEntries := android.AndroidMkEntriesForTest(t, result.TestContext, overrideAndroidApp)[0]
3868 android.AssertStringMatches(
3869 t,
3870 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find bar.apk",
3871 overrideEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
3872 "\\S+bar.apk",
3873 )
3874 android.AssertStringMatches(
3875 t,
3876 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include bar.apk",
3877 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
3878 "\\S+bar.apk",
3879 )
3880 android.AssertStringMatches(
3881 t,
3882 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
3883 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
3884 "\\S+bar.apk:\\S+/target/product/test_device/system/priv-app/bar/bar.apk",
3885 )
3886 android.AssertStringMatches(
3887 t,
3888 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
3889 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00003890 "\\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 -04003891 )
3892}