blob: bb448034cbe24a6326d72d48e2318702889050ed [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",
446 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
447 expectedCrtEnd := ctx.ModuleForTests("crtend_so",
448 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
449 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",
602 static_libs: ["lib4"],
603 }
604
605 android_library {
606 name: "lib4",
607 sdk_version: "current",
608 asset_dirs: ["assets_b"],
609 }
610 `
611
612 testCases := []struct {
613 name string
614 assetFlag string
615 assetPackages []string
616 }{
617 {
618 name: "foo",
619 // lib1 has its own asset. lib3 doesn't have any, but provides lib4's transitively.
620 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000621 "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
622 "out/soong/.intermediates/lib1/android_common/assets.zip",
623 "out/soong/.intermediates/lib3/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800624 },
625 },
626 {
627 name: "lib1",
628 assetFlag: "-A assets_a",
629 },
630 {
631 name: "lib2",
632 },
633 {
634 name: "lib3",
635 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000636 "out/soong/.intermediates/lib3/android_common/aapt2/package-res.apk",
637 "out/soong/.intermediates/lib4/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800638 },
639 },
640 {
641 name: "lib4",
642 assetFlag: "-A assets_b",
643 },
644 }
645 ctx := testApp(t, bp)
646
647 for _, test := range testCases {
648 t.Run(test.name, func(t *testing.T) {
649 m := ctx.ModuleForTests(test.name, "android_common")
650
651 // Check asset flag in aapt2 link flags
652 var aapt2link android.TestingBuildParams
653 if len(test.assetPackages) > 0 {
654 aapt2link = m.Output("aapt2/package-res.apk")
655 } else {
656 aapt2link = m.Output("package-res.apk")
657 }
Paul Duffina71a67a2021-03-29 00:42:57 +0100658 aapt2link = aapt2link
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800659 aapt2Flags := aapt2link.Args["flags"]
660 if test.assetFlag != "" {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000661 android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800662 } else {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000663 android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800664 }
665
666 // Check asset merge rule.
667 if len(test.assetPackages) > 0 {
668 mergeAssets := m.Output("package-res.apk")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000669 android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800670 }
671 })
672 }
673}
674
Colin Crossb014f072021-02-26 14:54:36 -0800675func TestAppJavaResources(t *testing.T) {
676 bp := `
677 android_app {
678 name: "foo",
679 sdk_version: "current",
680 java_resources: ["resources/a"],
681 srcs: ["a.java"],
682 }
683
684 android_app {
685 name: "bar",
686 sdk_version: "current",
687 java_resources: ["resources/a"],
688 }
689 `
690
691 ctx := testApp(t, bp)
692
693 foo := ctx.ModuleForTests("foo", "android_common")
694 fooResources := foo.Output("res/foo.jar")
695 fooDexJar := foo.Output("dex-withres/foo.jar")
696 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
697 fooApk := foo.Rule("combineApk")
698
699 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
700 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
701 }
702
703 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
704 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
705 }
706
707 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
708 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
709 }
710
711 bar := ctx.ModuleForTests("bar", "android_common")
712 barResources := bar.Output("res/bar.jar")
713 barApk := bar.Rule("combineApk")
714
715 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
716 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
717 }
718}
719
Colin Crossbec85302019-02-13 13:15:46 -0800720func TestAndroidResources(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -0800721 testCases := []struct {
722 name string
723 enforceRROTargets []string
724 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -0800725 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -0800726 overlayFiles map[string][]string
727 rroDirs map[string][]string
728 }{
729 {
730 name: "no RRO",
731 enforceRROTargets: nil,
732 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -0800733 resourceFiles: map[string][]string{
734 "foo": nil,
735 "bar": {"bar/res/res/values/strings.xml"},
736 "lib": nil,
737 "lib2": {"lib2/res/res/values/strings.xml"},
738 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800739 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800740 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000741 "out/soong/.intermediates/lib2/android_common/package-res.apk",
742 "out/soong/.intermediates/lib/android_common/package-res.apk",
743 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800744 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800745 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
746 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +0000747 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800748 },
Colin Crossbec85302019-02-13 13:15:46 -0800749 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800750 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
751 "device/vendor/blah/overlay/bar/res/values/strings.xml",
752 },
Colin Crossbec85302019-02-13 13:15:46 -0800753 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000754 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800755 "lib/res/res/values/strings.xml",
756 "device/vendor/blah/overlay/lib/res/values/strings.xml",
757 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800758 },
759 rroDirs: map[string][]string{
760 "foo": nil,
761 "bar": nil,
762 },
763 },
764 {
765 name: "enforce RRO on foo",
766 enforceRROTargets: []string{"foo"},
767 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -0800768 resourceFiles: map[string][]string{
769 "foo": nil,
770 "bar": {"bar/res/res/values/strings.xml"},
771 "lib": nil,
772 "lib2": {"lib2/res/res/values/strings.xml"},
773 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800774 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800775 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000776 "out/soong/.intermediates/lib2/android_common/package-res.apk",
777 "out/soong/.intermediates/lib/android_common/package-res.apk",
778 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800779 "foo/res/res/values/strings.xml",
780 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
781 },
Colin Crossbec85302019-02-13 13:15:46 -0800782 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800783 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
784 "device/vendor/blah/overlay/bar/res/values/strings.xml",
785 },
Colin Crossbec85302019-02-13 13:15:46 -0800786 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000787 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800788 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -0800789 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800790 },
Colin Crossc1c37552019-01-31 11:42:41 -0800791
Colin Cross5c4791c2019-02-01 11:44:44 -0800792 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800793 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000794 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +0000795 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700796 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800797 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800798 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700799 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800800 },
801 },
802 {
803 name: "enforce RRO on all",
804 enforceRROTargets: []string{"*"},
805 enforceRROExcludedOverlays: []string{
806 // Excluding specific apps/res directories also allowed.
807 "device/vendor/blah/static_overlay/foo",
808 "device/vendor/blah/static_overlay/bar/res",
809 },
Colin Crossbec85302019-02-13 13:15:46 -0800810 resourceFiles: map[string][]string{
811 "foo": nil,
812 "bar": {"bar/res/res/values/strings.xml"},
813 "lib": nil,
814 "lib2": {"lib2/res/res/values/strings.xml"},
815 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800816 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800817 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000818 "out/soong/.intermediates/lib2/android_common/package-res.apk",
819 "out/soong/.intermediates/lib/android_common/package-res.apk",
820 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800821 "foo/res/res/values/strings.xml",
822 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
823 },
Colin Crossbec85302019-02-13 13:15:46 -0800824 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
825 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000826 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800827 "lib/res/res/values/strings.xml",
828 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800829 },
830 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800831 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000832 "device:device/vendor/blah/overlay/foo/res",
833 "product:product/vendor/blah/overlay/foo/res",
834 // Lib dep comes after the direct deps
835 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800836 },
Anton Hansson53c88442019-03-18 15:53:16 +0000837 "bar": {"device:device/vendor/blah/overlay/bar/res"},
838 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800839 },
840 },
841 }
842
Anton Hansson53c88442019-03-18 15:53:16 +0000843 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -0800844 "device/vendor/blah/overlay",
845 "device/vendor/blah/overlay2",
846 "device/vendor/blah/static_overlay",
847 }
848
Anton Hansson53c88442019-03-18 15:53:16 +0000849 productResourceOverlays := []string{
850 "product/vendor/blah/overlay",
851 }
852
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000853 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -0800854 "foo/res/res/values/strings.xml": nil,
855 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800856 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -0800857 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800858 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
859 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800860 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800861 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
862 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
863 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +0000864 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800865 }
866
867 bp := `
868 android_app {
869 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900870 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800871 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +0000872 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -0800873 }
874
875 android_app {
876 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900877 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800878 resource_dirs: ["bar/res"],
879 }
Colin Cross6ed7dea2019-01-31 14:44:30 -0800880
881 android_library {
882 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900883 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800884 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -0800885 static_libs: ["lib2"],
886 }
887
888 android_library {
889 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900890 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -0800891 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -0800892 }
Anton Hansson53c88442019-03-18 15:53:16 +0000893
894 // This library has the same resources as lib (should not lead to dupe RROs)
895 android_library {
896 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900897 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +0000898 resource_dirs: ["lib/res"]
899 }
Colin Cross890ff552017-11-30 20:13:19 -0800900 `
901
Colin Cross5c4791c2019-02-01 11:44:44 -0800902 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -0800903 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000904 result := android.GroupFixturePreparers(
905 PrepareForTestWithJavaDefaultModules,
906 PrepareForTestWithOverlayBuildComponents,
907 fs.AddToFixture(),
908 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
909 variables.DeviceResourceOverlays = deviceResourceOverlays
910 variables.ProductResourceOverlays = productResourceOverlays
911 if testCase.enforceRROTargets != nil {
912 variables.EnforceRROTargets = testCase.enforceRROTargets
913 }
914 if testCase.enforceRROExcludedOverlays != nil {
915 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
916 }
917 }),
918 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -0800919
Colin Crossbec85302019-02-13 13:15:46 -0800920 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
921 for _, o := range list {
922 res := module.MaybeOutput(o)
923 if res.Rule != nil {
924 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
925 // verify the inputs to the .arsc.flat rule.
926 files = append(files, res.Inputs.Strings()...)
927 } else {
928 // Otherwise, verify the full path to the output of the other module
929 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +0000930 }
Colin Cross890ff552017-11-30 20:13:19 -0800931 }
Colin Crossbec85302019-02-13 13:15:46 -0800932 return files
Colin Cross890ff552017-11-30 20:13:19 -0800933 }
934
Colin Crossbec85302019-02-13 13:15:46 -0800935 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000936 module := result.ModuleForTests(moduleName, "android_common")
Colin Crossbec85302019-02-13 13:15:46 -0800937 resourceList := module.MaybeOutput("aapt2/res.list")
938 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000939 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +0000940 }
Colin Crossbec85302019-02-13 13:15:46 -0800941 overlayList := module.MaybeOutput("aapt2/overlay.list")
942 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000943 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -0800944 }
945
Anton Hansson53c88442019-03-18 15:53:16 +0000946 for _, d := range module.Module().(AndroidLibraryDependency).ExportedRRODirs() {
947 var prefix string
948 if d.overlayType == device {
949 prefix = "device:"
950 } else if d.overlayType == product {
951 prefix = "product:"
952 } else {
953 t.Fatalf("Unexpected overlayType %d", d.overlayType)
954 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000955 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +0000956 }
Colin Crossbec85302019-02-13 13:15:46 -0800957
958 return resourceFiles, overlayFiles, rroDirs
959 }
960
961 modules := []string{"foo", "bar", "lib", "lib2"}
962 for _, module := range modules {
963 resourceFiles, overlayFiles, rroDirs := getResources(module)
964
965 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
966 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
967 module, testCase.resourceFiles[module], resourceFiles)
968 }
969 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
970 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
971 module, testCase.overlayFiles[module], overlayFiles)
972 }
973 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +0000974 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -0800975 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +0000976 }
Colin Cross890ff552017-11-30 20:13:19 -0800977 }
Colin Cross890ff552017-11-30 20:13:19 -0800978 })
979 }
980}
Colin Crossd09b0b62018-04-18 11:06:47 -0700981
Paul Duffincdb88a92021-03-14 00:36:50 +0000982func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
983 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +0900984 link := foo.Output("package-res.apk")
985 linkFlags := strings.Split(link.Args["flags"], " ")
986 min := android.IndexList("--min-sdk-version", linkFlags)
987 target := android.IndexList("--target-sdk-version", linkFlags)
988
989 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
990 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
991 }
992
993 gotMinSdkVersion := linkFlags[min+1]
994 gotTargetSdkVersion := linkFlags[target+1]
995
Paul Duffincdb88a92021-03-14 00:36:50 +0000996 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +0900997
Paul Duffincdb88a92021-03-14 00:36:50 +0000998 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +0900999}
1000
Colin Crossd09b0b62018-04-18 11:06:47 -07001001func TestAppSdkVersion(t *testing.T) {
1002 testCases := []struct {
1003 name string
1004 sdkVersion string
1005 platformSdkInt int
1006 platformSdkCodename string
1007 platformSdkFinal bool
1008 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001009 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001010 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001011 }{
1012 {
1013 name: "current final SDK",
1014 sdkVersion: "current",
1015 platformSdkInt: 27,
1016 platformSdkCodename: "REL",
1017 platformSdkFinal: true,
1018 expectedMinSdkVersion: "27",
1019 },
1020 {
1021 name: "current non-final SDK",
1022 sdkVersion: "current",
1023 platformSdkInt: 27,
1024 platformSdkCodename: "OMR1",
1025 platformSdkFinal: false,
1026 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001027 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001028 },
1029 {
1030 name: "default final SDK",
1031 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001032 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001033 platformSdkInt: 27,
1034 platformSdkCodename: "REL",
1035 platformSdkFinal: true,
1036 expectedMinSdkVersion: "27",
1037 },
1038 {
1039 name: "default non-final SDK",
1040 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001041 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001042 platformSdkInt: 27,
1043 platformSdkCodename: "OMR1",
1044 platformSdkFinal: false,
1045 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001046 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001047 },
1048 {
1049 name: "14",
1050 sdkVersion: "14",
1051 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001052 platformSdkCodename: "S",
1053 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001054 },
1055 }
1056
1057 for _, moduleType := range []string{"android_app", "android_library"} {
1058 for _, test := range testCases {
1059 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001060 platformApiProp := ""
1061 if test.platformApis {
1062 platformApiProp = "platform_apis: true,"
1063 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001064 bp := fmt.Sprintf(`%s {
1065 name: "foo",
1066 srcs: ["a.java"],
1067 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001068 %s
1069 }`, moduleType, test.sdkVersion, platformApiProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001070
Paul Duffin71ae5942021-03-22 15:36:52 +00001071 result := android.GroupFixturePreparers(
1072 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001073 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1074 variables.Platform_sdk_version = &test.platformSdkInt
1075 variables.Platform_sdk_codename = &test.platformSdkCodename
1076 variables.Platform_version_active_codenames = test.activeCodenames
1077 variables.Platform_sdk_final = &test.platformSdkFinal
1078 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001079 FixtureWithPrebuiltApis(map[string][]string{
1080 "14": {"foo"},
1081 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001082 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001083
Paul Duffincdb88a92021-03-14 00:36:50 +00001084 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001085 })
1086 }
1087 }
1088}
Colin Crossa4f08812018-10-02 22:03:40 -07001089
Jeongik Cha219141c2020-08-06 23:00:37 +09001090func TestVendorAppSdkVersion(t *testing.T) {
1091 testCases := []struct {
1092 name string
1093 sdkVersion string
1094 platformSdkInt int
1095 platformSdkCodename string
1096 platformSdkFinal bool
1097 deviceCurrentApiLevelForVendorModules string
1098 expectedMinSdkVersion string
1099 }{
1100 {
1101 name: "current final SDK",
1102 sdkVersion: "current",
1103 platformSdkInt: 29,
1104 platformSdkCodename: "REL",
1105 platformSdkFinal: true,
1106 deviceCurrentApiLevelForVendorModules: "29",
1107 expectedMinSdkVersion: "29",
1108 },
1109 {
1110 name: "current final SDK",
1111 sdkVersion: "current",
1112 platformSdkInt: 29,
1113 platformSdkCodename: "REL",
1114 platformSdkFinal: true,
1115 deviceCurrentApiLevelForVendorModules: "28",
1116 expectedMinSdkVersion: "28",
1117 },
1118 {
1119 name: "current final SDK",
1120 sdkVersion: "current",
1121 platformSdkInt: 29,
1122 platformSdkCodename: "Q",
1123 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001124 deviceCurrentApiLevelForVendorModules: "28",
1125 expectedMinSdkVersion: "28",
1126 },
1127 }
1128
1129 for _, moduleType := range []string{"android_app", "android_library"} {
1130 for _, sdkKind := range []string{"", "system_"} {
1131 for _, test := range testCases {
1132 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1133 bp := fmt.Sprintf(`%s {
1134 name: "foo",
1135 srcs: ["a.java"],
1136 sdk_version: "%s%s",
1137 vendor: true,
1138 }`, moduleType, sdkKind, test.sdkVersion)
1139
Paul Duffin71ae5942021-03-22 15:36:52 +00001140 result := android.GroupFixturePreparers(
1141 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001142 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1143 variables.Platform_sdk_version = &test.platformSdkInt
1144 variables.Platform_sdk_codename = &test.platformSdkCodename
1145 variables.Platform_sdk_final = &test.platformSdkFinal
1146 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1147 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1148 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001149 FixtureWithPrebuiltApis(map[string][]string{
1150 "28": {"foo"},
1151 "29": {"foo"},
1152 "current": {"foo"},
1153 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001154 ).RunTestWithBp(t, bp)
1155
1156 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001157 })
1158 }
1159 }
1160 }
1161}
1162
Paul Duffin50c217c2019-06-12 13:25:22 +01001163func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001164 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001165 cc_library {
1166 name: "libjni",
1167 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001168 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001169 stl: "none",
1170 }
1171
1172 android_test {
1173 name: "test",
1174 sdk_version: "core_platform",
1175 jni_libs: ["libjni"],
1176 }
1177
1178 android_test {
1179 name: "test_first",
1180 sdk_version: "core_platform",
1181 compile_multilib: "first",
1182 jni_libs: ["libjni"],
1183 }
1184
1185 android_test {
1186 name: "test_both",
1187 sdk_version: "core_platform",
1188 compile_multilib: "both",
1189 jni_libs: ["libjni"],
1190 }
1191
1192 android_test {
1193 name: "test_32",
1194 sdk_version: "core_platform",
1195 compile_multilib: "32",
1196 jni_libs: ["libjni"],
1197 }
1198
1199 android_test {
1200 name: "test_64",
1201 sdk_version: "core_platform",
1202 compile_multilib: "64",
1203 jni_libs: ["libjni"],
1204 }
1205 `)
1206
1207 testCases := []struct {
1208 name string
1209 abis []string
1210 }{
1211 {"test", []string{"arm64-v8a"}},
1212 {"test_first", []string{"arm64-v8a"}},
1213 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1214 {"test_32", []string{"armeabi-v7a"}},
1215 {"test_64", []string{"arm64-v8a"}},
1216 }
1217
1218 for _, test := range testCases {
1219 t.Run(test.name, func(t *testing.T) {
1220 app := ctx.ModuleForTests(test.name, "android_common")
Sam Delmerico82602492022-06-10 17:05:42 +00001221 jniLibZip := app.Output(jniJarOutputPathString)
Paul Duffin50c217c2019-06-12 13:25:22 +01001222 var abis []string
1223 args := strings.Fields(jniLibZip.Args["jarArgs"])
1224 for i := 0; i < len(args); i++ {
1225 if args[i] == "-P" {
1226 abis = append(abis, filepath.Base(args[i+1]))
1227 i++
1228 }
1229 }
1230 if !reflect.DeepEqual(abis, test.abis) {
1231 t.Errorf("want abis %v, got %v", test.abis, abis)
1232 }
1233 })
1234 }
1235}
1236
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001237func TestAppSdkVersionByPartition(t *testing.T) {
1238 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1239 android_app {
1240 name: "foo",
1241 srcs: ["a.java"],
1242 vendor: true,
1243 platform_apis: true,
1244 }
1245 `)
1246
1247 testJava(t, `
1248 android_app {
1249 name: "bar",
1250 srcs: ["b.java"],
1251 platform_apis: true,
1252 }
1253 `)
1254
1255 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001256 bp := `
1257 android_app {
1258 name: "foo",
1259 srcs: ["a.java"],
1260 product_specific: true,
1261 platform_apis: true,
1262 }
1263 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001264
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001265 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001266 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001267 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 +09001268 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001269
1270 android.GroupFixturePreparers(
1271 PrepareForTestWithJavaDefaultModules,
1272 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1273 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
1274 }),
1275 ).
1276 ExtendWithErrorHandler(errorHandler).
1277 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001278 }
1279}
1280
Paul Duffin50c217c2019-06-12 13:25:22 +01001281func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001282 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001283 cc_library {
1284 name: "libjni",
1285 system_shared_libs: [],
1286 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08001287 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001288 }
1289
1290 android_app {
1291 name: "app",
1292 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001293 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001294 }
1295
1296 android_app {
1297 name: "app_noembed",
1298 jni_libs: ["libjni"],
1299 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001300 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001301 }
1302
1303 android_app {
1304 name: "app_embed",
1305 jni_libs: ["libjni"],
1306 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001307 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001308 }
1309
1310 android_test {
1311 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00001312 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001313 jni_libs: ["libjni"],
1314 }
1315
1316 android_test {
1317 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001318 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001319 jni_libs: ["libjni"],
1320 use_embedded_native_libs: false,
1321 }
1322
1323 android_test_helper_app {
1324 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00001325 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001326 jni_libs: ["libjni"],
1327 }
1328
1329 android_test_helper_app {
1330 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001331 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001332 jni_libs: ["libjni"],
1333 use_embedded_native_libs: false,
1334 }
1335 `)
1336
1337 testCases := []struct {
1338 name string
1339 packaged bool
1340 compressed bool
1341 }{
1342 {"app", false, false},
1343 {"app_noembed", false, false},
1344 {"app_embed", true, false},
1345 {"test", true, false},
1346 {"test_noembed", true, true},
1347 {"test_helper", true, false},
1348 {"test_helper_noembed", true, true},
1349 }
1350
1351 for _, test := range testCases {
1352 t.Run(test.name, func(t *testing.T) {
1353 app := ctx.ModuleForTests(test.name, "android_common")
Sam Delmerico82602492022-06-10 17:05:42 +00001354 jniLibZip := app.MaybeOutput(jniJarOutputPathString)
Paul Duffin50c217c2019-06-12 13:25:22 +01001355 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
1356 t.Errorf("expected jni packaged %v, got %v", w, g)
1357 }
1358
1359 if jniLibZip.Rule != nil {
1360 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
1361 t.Errorf("expected jni compressed %v, got %v", w, g)
1362 }
Colin Crossc511bc52020-04-07 16:50:32 +00001363
1364 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
1365 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
1366 }
Paul Duffin50c217c2019-06-12 13:25:22 +01001367 }
1368 })
1369 }
Colin Cross47fa9d32019-03-26 10:51:39 -07001370}
1371
Colin Cross3c007702020-05-08 11:20:24 -07001372func TestJNISDK(t *testing.T) {
1373 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
1374 cc_library {
1375 name: "libjni",
1376 system_shared_libs: [],
1377 stl: "none",
1378 sdk_version: "current",
1379 }
1380
1381 android_test {
1382 name: "app_platform",
1383 jni_libs: ["libjni"],
1384 platform_apis: true,
1385 }
1386
1387 android_test {
1388 name: "app_sdk",
1389 jni_libs: ["libjni"],
1390 sdk_version: "current",
1391 }
1392
1393 android_test {
1394 name: "app_force_platform",
1395 jni_libs: ["libjni"],
1396 sdk_version: "current",
1397 jni_uses_platform_apis: true,
1398 }
1399
1400 android_test {
1401 name: "app_force_sdk",
1402 jni_libs: ["libjni"],
1403 platform_apis: true,
1404 jni_uses_sdk_apis: true,
1405 }
Colin Crossc2d24052020-05-13 11:05:02 -07001406
1407 cc_library {
1408 name: "libvendorjni",
1409 system_shared_libs: [],
1410 stl: "none",
1411 vendor: true,
1412 }
1413
1414 android_test {
1415 name: "app_vendor",
1416 jni_libs: ["libvendorjni"],
1417 sdk_version: "current",
1418 vendor: true,
1419 }
Colin Cross3c007702020-05-08 11:20:24 -07001420 `)
1421
1422 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07001423 name string
1424 sdkJNI bool
1425 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07001426 }{
Colin Crossc2d24052020-05-13 11:05:02 -07001427 {name: "app_platform"},
1428 {name: "app_sdk", sdkJNI: true},
1429 {name: "app_force_platform"},
1430 {name: "app_force_sdk", sdkJNI: true},
1431 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07001432 }
1433
Colin Crossc2d24052020-05-13 11:05:02 -07001434 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
1435 Output("libjni.so").Output.String()
1436 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
1437 Output("libjni.so").Output.String()
1438 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
1439 Output("libvendorjni.so").Output.String()
1440
Colin Cross3c007702020-05-08 11:20:24 -07001441 for _, test := range testCases {
1442 t.Run(test.name, func(t *testing.T) {
1443 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07001444
Sam Delmerico82602492022-06-10 17:05:42 +00001445 jniLibZip := app.MaybeOutput(jniJarOutputPathString)
Colin Cross3c007702020-05-08 11:20:24 -07001446 if len(jniLibZip.Implicits) != 1 {
1447 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
1448 }
1449 gotJNI := jniLibZip.Implicits[0].String()
1450
1451 if test.sdkJNI {
1452 if gotJNI != sdkJNI {
1453 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
1454 }
Colin Crossc2d24052020-05-13 11:05:02 -07001455 } else if test.vendorJNI {
1456 if gotJNI != vendorJNI {
1457 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
1458 }
Colin Cross3c007702020-05-08 11:20:24 -07001459 } else {
1460 if gotJNI != platformJNI {
1461 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
1462 }
1463 }
1464 })
1465 }
1466
1467 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
1468 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
1469 android_test {
1470 name: "app_platform",
1471 platform_apis: true,
1472 jni_uses_platform_apis: true,
1473 }
1474 `)
1475 })
1476
1477 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
1478 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
1479 android_test {
1480 name: "app_sdk",
1481 sdk_version: "current",
1482 jni_uses_sdk_apis: true,
1483 }
1484 `)
1485 })
1486
1487}
1488
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001489func TestCertificates(t *testing.T) {
1490 testCases := []struct {
1491 name string
1492 bp string
1493 certificateOverride string
Liz Kammere2b27f42020-05-07 13:24:05 -07001494 expectedLineage string
1495 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001496 }{
1497 {
1498 name: "default",
1499 bp: `
1500 android_app {
1501 name: "foo",
1502 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001503 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001504 }
1505 `,
1506 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001507 expectedLineage: "",
1508 expectedCertificate: "build/make/target/product/security/testkey.x509.pem build/make/target/product/security/testkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001509 },
1510 {
1511 name: "module certificate property",
1512 bp: `
1513 android_app {
1514 name: "foo",
1515 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001516 certificate: ":new_certificate",
1517 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001518 }
1519
1520 android_app_certificate {
1521 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001522 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001523 }
1524 `,
1525 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001526 expectedLineage: "",
1527 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001528 },
1529 {
1530 name: "path certificate property",
1531 bp: `
1532 android_app {
1533 name: "foo",
1534 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001535 certificate: "expiredkey",
1536 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001537 }
1538 `,
1539 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001540 expectedLineage: "",
1541 expectedCertificate: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001542 },
1543 {
1544 name: "certificate overrides",
1545 bp: `
1546 android_app {
1547 name: "foo",
1548 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001549 certificate: "expiredkey",
1550 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001551 }
1552
1553 android_app_certificate {
1554 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001555 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001556 }
1557 `,
1558 certificateOverride: "foo:new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001559 expectedLineage: "",
1560 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1561 },
1562 {
1563 name: "certificate lineage",
1564 bp: `
1565 android_app {
1566 name: "foo",
1567 srcs: ["a.java"],
1568 certificate: ":new_certificate",
1569 lineage: "lineage.bin",
1570 sdk_version: "current",
1571 }
1572
1573 android_app_certificate {
1574 name: "new_certificate",
1575 certificate: "cert/new_cert",
1576 }
1577 `,
1578 certificateOverride: "",
1579 expectedLineage: "--lineage lineage.bin",
1580 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001581 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001582 {
1583 name: "lineage from filegroup",
1584 bp: `
1585 android_app {
1586 name: "foo",
1587 srcs: ["a.java"],
1588 certificate: ":new_certificate",
1589 lineage: ":lineage_bin",
1590 sdk_version: "current",
1591 }
1592
1593 android_app_certificate {
1594 name: "new_certificate",
1595 certificate: "cert/new_cert",
1596 }
1597
1598 filegroup {
1599 name: "lineage_bin",
1600 srcs: ["lineage.bin"],
1601 }
1602 `,
1603 certificateOverride: "",
1604 expectedLineage: "--lineage lineage.bin",
1605 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1606 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001607 }
1608
1609 for _, test := range testCases {
1610 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001611 result := android.GroupFixturePreparers(
1612 PrepareForTestWithJavaDefaultModules,
1613 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1614 if test.certificateOverride != "" {
1615 variables.CertificateOverrides = []string{test.certificateOverride}
1616 }
1617 }),
1618 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001619
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001620 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001621
1622 signapk := foo.Output("foo.apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001623 signCertificateFlags := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001624 android.AssertStringEquals(t, "certificates flags", test.expectedCertificate, signCertificateFlags)
Liz Kammere2b27f42020-05-07 13:24:05 -07001625
1626 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001627 android.AssertStringEquals(t, "signing flags", test.expectedLineage, signFlags)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001628 })
1629 }
1630}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001631
Songchun Fan688de9a2020-03-24 20:32:24 -07001632func TestRequestV4SigningFlag(t *testing.T) {
1633 testCases := []struct {
1634 name string
1635 bp string
1636 expected string
1637 }{
1638 {
1639 name: "default",
1640 bp: `
1641 android_app {
1642 name: "foo",
1643 srcs: ["a.java"],
1644 sdk_version: "current",
1645 }
1646 `,
1647 expected: "",
1648 },
1649 {
1650 name: "default",
1651 bp: `
1652 android_app {
1653 name: "foo",
1654 srcs: ["a.java"],
1655 sdk_version: "current",
1656 v4_signature: false,
1657 }
1658 `,
1659 expected: "",
1660 },
1661 {
1662 name: "module certificate property",
1663 bp: `
1664 android_app {
1665 name: "foo",
1666 srcs: ["a.java"],
1667 sdk_version: "current",
1668 v4_signature: true,
1669 }
1670 `,
1671 expected: "--enable-v4",
1672 },
1673 }
1674
1675 for _, test := range testCases {
1676 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001677 result := android.GroupFixturePreparers(
1678 PrepareForTestWithJavaDefaultModules,
1679 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07001680
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001681 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07001682
1683 signapk := foo.Output("foo.apk")
1684 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001685 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07001686 })
1687 }
1688}
1689
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001690func TestPackageNameOverride(t *testing.T) {
1691 testCases := []struct {
1692 name string
1693 bp string
1694 packageNameOverride string
1695 expected []string
1696 }{
1697 {
1698 name: "default",
1699 bp: `
1700 android_app {
1701 name: "foo",
1702 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001703 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001704 }
1705 `,
1706 packageNameOverride: "",
1707 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001708 "out/soong/.intermediates/foo/android_common/foo.apk",
1709 "out/soong/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001710 },
1711 },
1712 {
Jooyung Han29e2f6d2022-01-08 12:13:59 +09001713 name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001714 bp: `
1715 android_app {
1716 name: "foo",
1717 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001718 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001719 }
1720 `,
1721 packageNameOverride: "foo:bar",
1722 expected: []string{
1723 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001724 "out/soong/.intermediates/foo/android_common/bar.apk",
1725 "out/soong/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001726 },
1727 },
Jooyung Han29e2f6d2022-01-08 12:13:59 +09001728 {
1729 name: "overridden via stem",
1730 bp: `
1731 android_app {
1732 name: "foo",
1733 srcs: ["a.java"],
1734 sdk_version: "current",
1735 stem: "bar",
1736 }
1737 `,
1738 packageNameOverride: "",
1739 expected: []string{
1740 "out/soong/.intermediates/foo/android_common/bar.apk",
1741 "out/soong/target/product/test_device/system/app/bar/bar.apk",
1742 },
1743 },
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001744 }
1745
1746 for _, test := range testCases {
1747 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001748 result := android.GroupFixturePreparers(
1749 PrepareForTestWithJavaDefaultModules,
1750 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1751 if test.packageNameOverride != "" {
1752 variables.PackageNameOverrides = []string{test.packageNameOverride}
1753 }
1754 }),
1755 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001756
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001757 foo := result.ModuleForTests("foo", "android_common")
1758
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02001759 outSoongDir := result.Config.SoongOutDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001760
1761 outputs := foo.AllOutputs()
1762 outputMap := make(map[string]bool)
1763 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001764 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001765 }
1766 for _, e := range test.expected {
1767 if _, exist := outputMap[e]; !exist {
1768 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
1769 }
1770 }
1771 })
1772 }
1773}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001774
1775func TestInstrumentationTargetOverridden(t *testing.T) {
1776 bp := `
1777 android_app {
1778 name: "foo",
1779 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001780 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001781 }
1782
1783 android_test {
1784 name: "bar",
1785 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001786 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001787 }
1788 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001789
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001790 result := android.GroupFixturePreparers(
1791 PrepareForTestWithJavaDefaultModules,
1792 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1793 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
1794 }),
1795 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001796
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001797 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001798 res := bar.Output("package-res.apk")
1799 aapt2Flags := res.Args["flags"]
1800 e := "--rename-instrumentation-target-package org.dandroid.bp"
1801 if !strings.Contains(aapt2Flags, e) {
1802 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
1803 }
1804}
Jaewoong Jung525443a2019-02-28 15:35:54 -08001805
1806func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001807 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
1808 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08001809 android_app {
1810 name: "foo",
1811 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07001812 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001813 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001814 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001815 }
1816
1817 override_android_app {
1818 name: "bar",
1819 base: "foo",
1820 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001821 lineage: "lineage.bin",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001822 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001823 }
1824
1825 android_app_certificate {
1826 name: "new_certificate",
1827 certificate: "cert/new_cert",
1828 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001829
1830 override_android_app {
1831 name: "baz",
1832 base: "foo",
1833 package_name: "org.dandroid.bp",
1834 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001835
1836 override_android_app {
1837 name: "baz_no_rename_resources",
1838 base: "foo",
1839 package_name: "org.dandroid.bp",
1840 rename_resources_package: false,
1841 }
1842
1843 android_app {
1844 name: "foo_no_rename_resources",
1845 srcs: ["a.java"],
1846 certificate: "expiredkey",
1847 overrides: ["qux"],
1848 rename_resources_package: false,
1849 sdk_version: "current",
1850 }
1851
1852 override_android_app {
1853 name: "baz_base_no_rename_resources",
1854 base: "foo_no_rename_resources",
1855 package_name: "org.dandroid.bp",
1856 }
1857
1858 override_android_app {
1859 name: "baz_override_base_rename_resources",
1860 base: "foo_no_rename_resources",
1861 package_name: "org.dandroid.bp",
1862 rename_resources_package: true,
1863 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08001864 `)
1865
1866 expectedVariants := []struct {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001867 name string
1868 moduleName string
1869 variantName string
1870 apkName string
1871 apkPath string
1872 certFlag string
1873 lineageFlag string
1874 overrides []string
1875 packageFlag string
1876 renameResources bool
1877 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08001878 }{
1879 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001880 name: "foo",
1881 moduleName: "foo",
1882 variantName: "android_common",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001883 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001884 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1885 lineageFlag: "",
1886 overrides: []string{"qux"},
1887 packageFlag: "",
1888 renameResources: false,
1889 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001890 },
1891 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001892 name: "foo",
1893 moduleName: "bar",
1894 variantName: "android_common_bar",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001895 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001896 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
1897 lineageFlag: "--lineage lineage.bin",
1898 overrides: []string{"qux", "foo"},
1899 packageFlag: "",
1900 renameResources: false,
1901 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001902 },
1903 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001904 name: "foo",
1905 moduleName: "baz",
1906 variantName: "android_common_baz",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001907 apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001908 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1909 lineageFlag: "",
1910 overrides: []string{"qux", "foo"},
1911 packageFlag: "org.dandroid.bp",
1912 renameResources: true,
1913 logging_parent: "",
1914 },
1915 {
1916 name: "foo",
1917 moduleName: "baz_no_rename_resources",
1918 variantName: "android_common_baz_no_rename_resources",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001919 apkPath: "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001920 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1921 lineageFlag: "",
1922 overrides: []string{"qux", "foo"},
1923 packageFlag: "org.dandroid.bp",
1924 renameResources: false,
1925 logging_parent: "",
1926 },
1927 {
1928 name: "foo_no_rename_resources",
1929 moduleName: "baz_base_no_rename_resources",
1930 variantName: "android_common_baz_base_no_rename_resources",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001931 apkPath: "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001932 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1933 lineageFlag: "",
1934 overrides: []string{"qux", "foo_no_rename_resources"},
1935 packageFlag: "org.dandroid.bp",
1936 renameResources: false,
1937 logging_parent: "",
1938 },
1939 {
1940 name: "foo_no_rename_resources",
1941 moduleName: "baz_override_base_rename_resources",
1942 variantName: "android_common_baz_override_base_rename_resources",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001943 apkPath: "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001944 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1945 lineageFlag: "",
1946 overrides: []string{"qux", "foo_no_rename_resources"},
1947 packageFlag: "org.dandroid.bp",
1948 renameResources: true,
1949 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001950 },
1951 }
1952 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001953 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001954
1955 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001956 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001957
1958 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08001959 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001960 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001961 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07001962
1963 // Check the lineage flags
1964 lineageFlag := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001965 android.AssertStringEquals(t, "signing flags", expected.lineageFlag, lineageFlag)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001966
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001967 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08001968 mod := variant.Module().(*AndroidApp)
zhidou198f5892022-02-17 02:33:12 +00001969 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001970
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001971 // Test Overridable property: Logging_parent
1972 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001973 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001974
Liz Kammer1d5983b2020-05-19 19:15:37 +00001975 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001976 res := variant.Output("package-res.apk")
1977 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00001978 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
1979 expectedPackage := expected.packageFlag
1980 if !expected.renameResources {
1981 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00001982 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001983 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001984 }
1985}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07001986
zhidou198f5892022-02-17 02:33:12 +00001987func TestOverrideAndroidAppOverrides(t *testing.T) {
1988 ctx, _ := testJava(
1989 t, `
1990 android_app {
1991 name: "foo",
1992 srcs: ["a.java"],
1993 sdk_version: "current",
1994 overrides: ["qux"]
1995 }
1996
1997 android_app {
1998 name: "bar",
1999 srcs: ["b.java"],
2000 sdk_version: "current",
2001 overrides: ["foo"]
2002 }
2003
2004 override_android_app {
2005 name: "foo_override",
2006 base: "foo",
2007 overrides: ["bar"]
2008 }
2009 `)
2010
2011 expectedVariants := []struct {
2012 name string
2013 moduleName string
2014 variantName string
2015 overrides []string
2016 }{
2017 {
2018 name: "foo",
2019 moduleName: "foo",
2020 variantName: "android_common",
2021 overrides: []string{"qux"},
2022 },
2023 {
2024 name: "bar",
2025 moduleName: "bar",
2026 variantName: "android_common",
2027 overrides: []string{"foo"},
2028 },
2029 {
2030 name: "foo",
2031 moduleName: "foo_override",
2032 variantName: "android_common_foo_override",
2033 overrides: []string{"bar", "foo"},
2034 },
2035 }
2036 for _, expected := range expectedVariants {
2037 variant := ctx.ModuleForTests(expected.name, expected.variantName)
2038
2039 // Check if the overrides field values are correctly aggregated.
2040 mod := variant.Module().(*AndroidApp)
2041 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2042 }
2043}
2044
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002045func TestOverrideAndroidAppWithPrebuilt(t *testing.T) {
2046 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2047 t, `
2048 android_app {
2049 name: "foo",
2050 srcs: ["a.java"],
2051 sdk_version: "current",
2052 }
2053
2054 override_android_app {
2055 name: "bar",
2056 base: "foo",
2057 }
2058
2059 android_app_import {
2060 name: "bar",
2061 prefer: true,
2062 apk: "bar.apk",
2063 presigned: true,
2064 }
2065 `)
2066
2067 // An app that has an override that also has a prebuilt should not be hidden.
2068 foo := result.ModuleForTests("foo", "android_common")
2069 if foo.Module().IsHideFromMake() {
2070 t.Errorf("expected foo to have HideFromMake false")
2071 }
2072
2073 // An override that also has a prebuilt should be hidden.
2074 barOverride := result.ModuleForTests("foo", "android_common_bar")
2075 if !barOverride.Module().IsHideFromMake() {
2076 t.Errorf("expected bar override variant of foo to have HideFromMake true")
2077 }
2078}
2079
Jooyung Han01d80d82022-01-08 12:16:32 +09002080func TestOverrideAndroidAppStem(t *testing.T) {
2081 ctx, _ := testJava(t, `
2082 android_app {
2083 name: "foo",
2084 srcs: ["a.java"],
2085 sdk_version: "current",
2086 }
2087 override_android_app {
2088 name: "bar",
2089 base: "foo",
2090 }
2091 override_android_app {
2092 name: "baz",
2093 base: "foo",
2094 stem: "baz_stem",
2095 }
2096 android_app {
2097 name: "foo2",
2098 srcs: ["a.java"],
2099 sdk_version: "current",
2100 stem: "foo2_stem",
2101 }
2102 override_android_app {
2103 name: "bar2",
2104 base: "foo2",
2105 }
2106 override_android_app {
2107 name: "baz2",
2108 base: "foo2",
2109 stem: "baz2_stem",
2110 }
2111 `)
2112 for _, expected := range []struct {
2113 moduleName string
2114 variantName string
2115 apkPath string
2116 }{
2117 {
2118 moduleName: "foo",
2119 variantName: "android_common",
2120 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2121 },
2122 {
2123 moduleName: "foo",
2124 variantName: "android_common_bar",
2125 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2126 },
2127 {
2128 moduleName: "foo",
2129 variantName: "android_common_baz",
2130 apkPath: "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk",
2131 },
2132 {
2133 moduleName: "foo2",
2134 variantName: "android_common",
2135 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2136 },
2137 {
2138 moduleName: "foo2",
2139 variantName: "android_common_bar2",
2140 // Note that this may cause the duplicate output error.
2141 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2142 },
2143 {
2144 moduleName: "foo2",
2145 variantName: "android_common_baz2",
2146 apkPath: "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
2147 },
2148 } {
2149 variant := ctx.ModuleForTests(expected.moduleName, expected.variantName)
2150 variant.Output(expected.apkPath)
2151 }
2152}
2153
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002154func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002155 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002156 android_app {
2157 name: "foo",
2158 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002159 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002160 }
2161
2162 override_android_app {
2163 name: "bar",
2164 base: "foo",
2165 package_name: "org.dandroid.bp",
2166 }
2167
2168 android_test {
2169 name: "baz",
2170 srcs: ["b.java"],
2171 instrumentation_for: "foo",
2172 }
2173
2174 android_test {
2175 name: "qux",
2176 srcs: ["b.java"],
2177 instrumentation_for: "bar",
2178 }
2179 `)
2180
2181 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002182 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002183 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002184 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2185 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2186 }
2187
2188 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002189 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002190 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002191 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2192 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2193 }
2194}
2195
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002196func TestOverrideAndroidTest(t *testing.T) {
2197 ctx, _ := testJava(t, `
2198 android_app {
2199 name: "foo",
2200 srcs: ["a.java"],
2201 package_name: "com.android.foo",
2202 sdk_version: "current",
2203 }
2204
2205 override_android_app {
2206 name: "bar",
2207 base: "foo",
2208 package_name: "com.android.bar",
2209 }
2210
2211 android_test {
2212 name: "foo_test",
2213 srcs: ["b.java"],
2214 instrumentation_for: "foo",
2215 }
2216
2217 override_android_test {
2218 name: "bar_test",
2219 base: "foo_test",
2220 package_name: "com.android.bar.test",
2221 instrumentation_for: "bar",
2222 instrumentation_target_package: "com.android.bar",
2223 }
2224 `)
2225
2226 expectedVariants := []struct {
2227 moduleName string
2228 variantName string
2229 apkPath string
2230 overrides []string
2231 targetVariant string
2232 packageFlag string
2233 targetPackageFlag string
2234 }{
2235 {
2236 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002237 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002238 overrides: nil,
2239 targetVariant: "android_common",
2240 packageFlag: "",
2241 targetPackageFlag: "",
2242 },
2243 {
2244 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002245 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002246 overrides: []string{"foo_test"},
2247 targetVariant: "android_common_bar",
2248 packageFlag: "com.android.bar.test",
2249 targetPackageFlag: "com.android.bar",
2250 },
2251 }
2252 for _, expected := range expectedVariants {
2253 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2254
2255 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002256 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002257
2258 // Check if the overrides field values are correctly aggregated.
2259 mod := variant.Module().(*AndroidTest)
zhidou198f5892022-02-17 02:33:12 +00002260 if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002261 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
zhidou198f5892022-02-17 02:33:12 +00002262 expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002263 }
2264
2265 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01002266 javac := variant.Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002267 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002268 if !strings.Contains(javac.Args["classpath"], turbine) {
2269 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2270 }
2271
2272 // Check aapt2 flags.
2273 res := variant.Output("package-res.apk")
2274 aapt2Flags := res.Args["flags"]
2275 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002276 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002277 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2278 }
2279}
2280
Jaewoong Jung39982342020-01-14 10:27:18 -08002281func TestAndroidTest_FixTestConfig(t *testing.T) {
2282 ctx, _ := testJava(t, `
2283 android_app {
2284 name: "foo",
2285 srcs: ["a.java"],
2286 package_name: "com.android.foo",
2287 sdk_version: "current",
2288 }
2289
2290 android_test {
2291 name: "foo_test",
2292 srcs: ["b.java"],
2293 instrumentation_for: "foo",
2294 }
2295
2296 android_test {
2297 name: "bar_test",
2298 srcs: ["b.java"],
2299 package_name: "com.android.bar.test",
2300 instrumentation_for: "foo",
2301 }
2302
2303 override_android_test {
2304 name: "baz_test",
2305 base: "foo_test",
2306 package_name: "com.android.baz.test",
2307 }
2308 `)
2309
2310 testCases := []struct {
2311 moduleName string
2312 variantName string
2313 expectedFlags []string
2314 }{
2315 {
2316 moduleName: "foo_test",
2317 variantName: "android_common",
2318 },
2319 {
2320 moduleName: "bar_test",
2321 variantName: "android_common",
2322 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002323 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002324 "--package-name com.android.bar.test",
2325 },
2326 },
2327 {
2328 moduleName: "foo_test",
2329 variantName: "android_common_baz_test",
2330 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002331 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002332 "--package-name com.android.baz.test",
2333 "--test-file-name baz_test.apk",
2334 },
2335 },
2336 }
2337
2338 for _, test := range testCases {
2339 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01002340 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08002341
2342 if len(test.expectedFlags) > 0 {
2343 if params.Rule == nil {
2344 t.Errorf("test_config_fixer was expected to run, but didn't")
2345 } else {
2346 for _, flag := range test.expectedFlags {
2347 if !strings.Contains(params.RuleParams.Command, flag) {
2348 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
2349 }
2350 }
2351 }
2352 } else {
2353 if params.Rule != nil {
2354 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
2355 }
2356 }
Jaewoong Jung39982342020-01-14 10:27:18 -08002357 }
2358}
2359
Paul Duffin53a70a42022-01-11 14:35:55 +00002360func TestInstrumentationTargetPrebuilt(t *testing.T) {
2361 bp := `
2362 android_app_import {
2363 name: "foo",
2364 apk: "foo.apk",
2365 presigned: true,
2366 }
2367
2368 android_test {
2369 name: "bar",
2370 srcs: ["a.java"],
2371 instrumentation_for: "foo",
2372 sdk_version: "current",
2373 }
2374 `
2375
2376 android.GroupFixturePreparers(
2377 PrepareForTestWithJavaDefaultModules,
2378 ).ExtendWithErrorHandler(
2379 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
2380 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
2381 RunTestWithBp(t, bp)
2382}
2383
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002384func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002385 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002386 cc_library {
2387 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08002388 sdk_version: "current",
2389 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002390 }
2391
2392 android_test {
2393 name: "stl",
2394 jni_libs: ["libjni"],
2395 compile_multilib: "both",
2396 sdk_version: "current",
2397 stl: "c++_shared",
2398 }
2399
2400 android_test {
2401 name: "system",
2402 jni_libs: ["libjni"],
2403 compile_multilib: "both",
2404 sdk_version: "current",
2405 }
2406 `)
2407
2408 testCases := []struct {
2409 name string
2410 jnis []string
2411 }{
2412 {"stl",
2413 []string{
2414 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07002415 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002416 },
2417 },
2418 {"system",
2419 []string{
2420 "libjni.so",
2421 },
2422 },
2423 }
2424
2425 for _, test := range testCases {
2426 t.Run(test.name, func(t *testing.T) {
2427 app := ctx.ModuleForTests(test.name, "android_common")
Sam Delmerico82602492022-06-10 17:05:42 +00002428 jniLibZip := app.Output(jniJarOutputPathString)
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002429 var jnis []string
2430 args := strings.Fields(jniLibZip.Args["jarArgs"])
2431 for i := 0; i < len(args); i++ {
2432 if args[i] == "-f" {
2433 jnis = append(jnis, args[i+1])
2434 i += 1
2435 }
2436 }
2437 jnisJoined := strings.Join(jnis, " ")
2438 for _, jni := range test.jnis {
2439 if !strings.Contains(jnisJoined, jni) {
2440 t.Errorf("missing jni %q in %q", jni, jnis)
2441 }
2442 }
2443 })
2444 }
2445}
Colin Cross50ddcc42019-05-16 12:28:22 -07002446
2447func TestUsesLibraries(t *testing.T) {
2448 bp := `
2449 java_sdk_library {
2450 name: "foo",
2451 srcs: ["a.java"],
2452 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002453 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002454 }
2455
2456 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01002457 name: "qux",
2458 srcs: ["a.java"],
2459 api_packages: ["qux"],
2460 sdk_version: "current",
2461 }
2462
2463 java_sdk_library {
2464 name: "quuz",
2465 srcs: ["a.java"],
2466 api_packages: ["quuz"],
2467 sdk_version: "current",
2468 }
2469
2470 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002471 name: "fred",
2472 srcs: ["a.java"],
2473 api_packages: ["fred"],
2474 sdk_version: "current",
2475 }
2476
2477 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07002478 name: "bar",
2479 srcs: ["a.java"],
2480 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002481 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002482 }
2483
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01002484 java_sdk_library {
2485 name: "runtime-library",
2486 srcs: ["a.java"],
2487 sdk_version: "current",
2488 }
2489
2490 java_library {
2491 name: "static-runtime-helper",
2492 srcs: ["a.java"],
2493 libs: ["runtime-library"],
2494 sdk_version: "current",
2495 }
2496
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002497 java_library {
2498 name: "runtime-required-x",
2499 srcs: ["a.java"],
2500 installable: true,
2501 sdk_version: "current",
2502 }
2503
2504 java_library {
2505 name: "runtime-optional-x",
2506 srcs: ["a.java"],
2507 installable: true,
2508 sdk_version: "current",
2509 }
2510
2511 android_library {
2512 name: "static-x",
2513 uses_libs: ["runtime-required-x"],
2514 optional_uses_libs: ["runtime-optional-x"],
2515 sdk_version: "current",
2516 }
2517
2518 java_library {
2519 name: "runtime-required-y",
2520 srcs: ["a.java"],
2521 installable: true,
2522 sdk_version: "current",
2523 }
2524
2525 java_library {
2526 name: "runtime-optional-y",
2527 srcs: ["a.java"],
2528 installable: true,
2529 sdk_version: "current",
2530 }
2531
2532 java_library {
2533 name: "static-y",
2534 srcs: ["a.java"],
2535 uses_libs: ["runtime-required-y"],
2536 optional_uses_libs: ["runtime-optional-y"],
2537 sdk_version: "current",
2538 }
2539
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002540 // A library that has to use "provides_uses_lib", because:
2541 // - it is not an SDK library
2542 // - its library name is different from its module name
2543 java_library {
2544 name: "non-sdk-lib",
2545 provides_uses_lib: "com.non.sdk.lib",
2546 installable: true,
2547 srcs: ["a.java"],
2548 }
2549
Colin Cross50ddcc42019-05-16 12:28:22 -07002550 android_app {
2551 name: "app",
2552 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002553 libs: [
2554 "qux",
2555 "quuz.stubs"
2556 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002557 static_libs: [
2558 "static-runtime-helper",
2559 // statically linked component libraries should not pull their SDK libraries,
2560 // so "fred" should not be added to class loader context
2561 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002562 "static-x",
2563 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002564 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002565 uses_libs: [
2566 "foo",
2567 "non-sdk-lib"
2568 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002569 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002570 optional_uses_libs: [
2571 "bar",
2572 "baz",
2573 ],
2574 }
2575
2576 android_app_import {
2577 name: "prebuilt",
2578 apk: "prebuilts/apk/app.apk",
2579 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002580 uses_libs: [
2581 "foo",
2582 "non-sdk-lib",
2583 "android.test.runner"
2584 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07002585 optional_uses_libs: [
2586 "bar",
2587 "baz",
2588 ],
2589 }
2590 `
2591
Paul Duffin71ae5942021-03-22 15:36:52 +00002592 result := android.GroupFixturePreparers(
2593 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00002594 PrepareForTestWithJavaSdkLibraryFiles,
2595 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Paul Duffind234b412021-03-12 23:04:46 +00002596 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2597 variables.MissingUsesLibraries = []string{"baz"}
2598 }),
2599 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07002600
Paul Duffind234b412021-03-12 23:04:46 +00002601 app := result.ModuleForTests("app", "android_common")
2602 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07002603
Paul Duffin859fe962020-05-15 10:20:31 +01002604 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01002605 // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be
2606 // propagated from dependencies.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002607 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2608 expectManifestFixerArgs := `--extract-native-libs=true ` +
2609 `--uses-library qux ` +
2610 `--uses-library quuz ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01002611 `--uses-library foo ` +
2612 `--uses-library com.non.sdk.lib ` +
2613 `--uses-library runtime-library ` +
2614 `--uses-library runtime-required-x ` +
2615 `--uses-library runtime-required-y ` +
2616 `--optional-uses-library bar ` +
2617 `--optional-uses-library runtime-optional-x ` +
2618 `--optional-uses-library runtime-optional-y`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00002619 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01002620
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002621 // Test that all libraries are verified (library order matters).
2622 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
2623 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002624 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002625 `--uses-library qux ` +
2626 `--uses-library quuz ` +
2627 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002628 `--uses-library runtime-required-x ` +
2629 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002630 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002631 `--optional-uses-library baz ` +
2632 `--optional-uses-library runtime-optional-x ` +
2633 `--optional-uses-library runtime-optional-y `
Paul Duffind234b412021-03-12 23:04:46 +00002634 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002635
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002636 // Test that all libraries are verified for an APK (library order matters).
2637 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00002638 verifyApkArgs := `--uses-library foo ` +
2639 `--uses-library com.non.sdk.lib ` +
2640 `--uses-library android.test.runner ` +
2641 `--optional-uses-library bar ` +
2642 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002643 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002644
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002645 // Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002646 cmd := app.Rule("dexpreopt").RuleParams.Command
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002647 w := `--target-context-for-sdk any ` +
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002648 `PCL[/system/framework/qux.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002649 `PCL[/system/framework/quuz.jar]#` +
2650 `PCL[/system/framework/foo.jar]#` +
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002651 `PCL[/system/framework/non-sdk-lib.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002652 `PCL[/system/framework/bar.jar]#` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002653 `PCL[/system/framework/runtime-library.jar]#` +
2654 `PCL[/system/framework/runtime-required-x.jar]#` +
2655 `PCL[/system/framework/runtime-optional-x.jar]#` +
2656 `PCL[/system/framework/runtime-required-y.jar]#` +
2657 `PCL[/system/framework/runtime-optional-y.jar] `
Paul Duffind234b412021-03-12 23:04:46 +00002658 android.AssertStringDoesContain(t, "dexpreopt app cmd args", cmd, w)
Colin Cross50ddcc42019-05-16 12:28:22 -07002659
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002660 // Test conditional context for target SDK version 28.
Paul Duffind234b412021-03-12 23:04:46 +00002661 android.AssertStringDoesContain(t, "dexpreopt app cmd 28", cmd,
2662 `--target-context-for-sdk 28`+
2663 ` PCL[/system/framework/org.apache.http.legacy.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002664
2665 // Test conditional context for target SDK version 29.
Paul Duffind234b412021-03-12 23:04:46 +00002666 android.AssertStringDoesContain(t, "dexpreopt app cmd 29", cmd,
2667 `--target-context-for-sdk 29`+
2668 ` PCL[/system/framework/android.hidl.manager-V1.0-java.jar]`+
2669 `#PCL[/system/framework/android.hidl.base-V1.0-java.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002670
2671 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002672 // "android.test.mock" is absent because "android.test.runner" is not used.
Paul Duffind234b412021-03-12 23:04:46 +00002673 android.AssertStringDoesContain(t, "dexpreopt app cmd 30", cmd,
2674 `--target-context-for-sdk 30`+
2675 ` PCL[/system/framework/android.test.base.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002676
Ulya Trafimovichfc24ad32020-08-19 16:32:54 +01002677 cmd = prebuilt.Rule("dexpreopt").RuleParams.Command
Paul Duffind234b412021-03-12 23:04:46 +00002678 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd", cmd,
2679 `--target-context-for-sdk any`+
2680 ` PCL[/system/framework/foo.jar]`+
2681 `#PCL[/system/framework/non-sdk-lib.jar]`+
2682 `#PCL[/system/framework/android.test.runner.jar]`+
2683 `#PCL[/system/framework/bar.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002684
2685 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002686 // "android.test.mock" is present because "android.test.runner" is used.
Paul Duffind234b412021-03-12 23:04:46 +00002687 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd 30", cmd,
2688 `--target-context-for-sdk 30`+
2689 ` PCL[/system/framework/android.test.base.jar]`+
2690 `#PCL[/system/framework/android.test.mock.jar] `)
Colin Cross50ddcc42019-05-16 12:28:22 -07002691}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002692
Ulya Trafimovich9023b022021-03-22 16:02:28 +00002693func TestDexpreoptBcp(t *testing.T) {
2694 bp := `
2695 java_sdk_library {
2696 name: "foo",
2697 srcs: ["a.java"],
2698 api_packages: ["foo"],
2699 sdk_version: "current",
2700 }
2701
2702 java_sdk_library {
2703 name: "bar",
2704 srcs: ["a.java"],
2705 api_packages: ["bar"],
2706 permitted_packages: ["bar"],
2707 sdk_version: "current",
2708 }
2709
2710 android_app {
2711 name: "app",
2712 srcs: ["a.java"],
2713 sdk_version: "current",
2714 }
2715 `
2716
2717 testCases := []struct {
2718 name string
2719 with bool
2720 expect string
2721 }{
2722 {
2723 name: "with updatable bcp",
2724 with: true,
2725 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
2726 },
2727 {
2728 name: "without updatable bcp",
2729 with: false,
2730 expect: "/system/framework/foo.jar",
2731 },
2732 }
2733
2734 for _, test := range testCases {
2735 t.Run(test.name, func(t *testing.T) {
2736 result := android.GroupFixturePreparers(
2737 prepareForJavaTest,
2738 PrepareForTestWithJavaSdkLibraryFiles,
2739 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
2740 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01002741 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00002742 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
2743 ).RunTestWithBp(t, bp)
2744
2745 app := result.ModuleForTests("app", "android_common")
2746 cmd := app.Rule("dexpreopt").RuleParams.Command
2747 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
2748 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
2749 })
2750 }
2751}
2752
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002753func TestCodelessApp(t *testing.T) {
2754 testCases := []struct {
2755 name string
2756 bp string
2757 noCode bool
2758 }{
2759 {
2760 name: "normal",
2761 bp: `
2762 android_app {
2763 name: "foo",
2764 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002765 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002766 }
2767 `,
2768 noCode: false,
2769 },
2770 {
2771 name: "app without sources",
2772 bp: `
2773 android_app {
2774 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002775 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002776 }
2777 `,
2778 noCode: true,
2779 },
2780 {
2781 name: "app with libraries",
2782 bp: `
2783 android_app {
2784 name: "foo",
2785 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002786 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002787 }
2788
2789 java_library {
2790 name: "lib",
2791 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002792 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002793 }
2794 `,
2795 noCode: false,
2796 },
2797 {
2798 name: "app with sourceless libraries",
2799 bp: `
2800 android_app {
2801 name: "foo",
2802 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002803 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002804 }
2805
2806 java_library {
2807 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002808 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002809 }
2810 `,
2811 // TODO(jungjw): this should probably be true
2812 noCode: false,
2813 },
2814 }
2815
2816 for _, test := range testCases {
2817 t.Run(test.name, func(t *testing.T) {
2818 ctx := testApp(t, test.bp)
2819
2820 foo := ctx.ModuleForTests("foo", "android_common")
2821 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2822 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
2823 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
2824 }
2825 })
2826 }
2827}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002828
Colin Cross53a87f52019-06-25 13:35:30 -07002829func TestUncompressDex(t *testing.T) {
2830 testCases := []struct {
2831 name string
2832 bp string
2833
2834 uncompressedPlatform bool
2835 uncompressedUnbundled bool
2836 }{
2837 {
2838 name: "normal",
2839 bp: `
2840 android_app {
2841 name: "foo",
2842 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002843 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002844 }
2845 `,
2846 uncompressedPlatform: true,
2847 uncompressedUnbundled: false,
2848 },
2849 {
2850 name: "use_embedded_dex",
2851 bp: `
2852 android_app {
2853 name: "foo",
2854 use_embedded_dex: true,
2855 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002856 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002857 }
2858 `,
2859 uncompressedPlatform: true,
2860 uncompressedUnbundled: true,
2861 },
2862 {
2863 name: "privileged",
2864 bp: `
2865 android_app {
2866 name: "foo",
2867 privileged: true,
2868 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002869 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002870 }
2871 `,
2872 uncompressedPlatform: true,
2873 uncompressedUnbundled: true,
2874 },
David Srbeckye033cba2020-05-20 22:20:28 +01002875 {
2876 name: "normal_uncompress_dex_true",
2877 bp: `
2878 android_app {
2879 name: "foo",
2880 srcs: ["a.java"],
2881 sdk_version: "current",
2882 uncompress_dex: true,
2883 }
2884 `,
2885 uncompressedPlatform: true,
2886 uncompressedUnbundled: true,
2887 },
2888 {
2889 name: "normal_uncompress_dex_false",
2890 bp: `
2891 android_app {
2892 name: "foo",
2893 srcs: ["a.java"],
2894 sdk_version: "current",
2895 uncompress_dex: false,
2896 }
2897 `,
2898 uncompressedPlatform: false,
2899 uncompressedUnbundled: false,
2900 },
Colin Cross53a87f52019-06-25 13:35:30 -07002901 }
2902
2903 test := func(t *testing.T, bp string, want bool, unbundled bool) {
2904 t.Helper()
2905
Paul Duffin71ae5942021-03-22 15:36:52 +00002906 result := android.GroupFixturePreparers(
2907 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00002908 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00002909 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2910 if unbundled {
2911 variables.Unbundled_build = proptools.BoolPtr(true)
2912 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
2913 }
2914 }),
2915 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07002916
Paul Duffincdb88a92021-03-14 00:36:50 +00002917 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07002918 dex := foo.Rule("r8")
2919 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
2920 aligned := foo.MaybeRule("zipalign").Rule != nil
2921
Paul Duffincdb88a92021-03-14 00:36:50 +00002922 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07002923
Paul Duffincdb88a92021-03-14 00:36:50 +00002924 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07002925 }
2926
2927 for _, tt := range testCases {
2928 t.Run(tt.name, func(t *testing.T) {
2929 t.Run("platform", func(t *testing.T) {
2930 test(t, tt.bp, tt.uncompressedPlatform, false)
2931 })
2932 t.Run("unbundled", func(t *testing.T) {
2933 test(t, tt.bp, tt.uncompressedUnbundled, true)
2934 })
2935 })
2936 }
2937}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002938
2939func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
2940 if expectedValue != "" {
2941 expectedFlag := "--" + flagName + " " + expectedValue
2942 if !strings.Contains(aapt2Flags, expectedFlag) {
2943 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
2944 }
2945 } else {
2946 unexpectedFlag := "--" + flagName
2947 if strings.Contains(aapt2Flags, unexpectedFlag) {
2948 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
2949 }
2950 }
2951}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08002952
Cole Faust9a631312020-10-22 21:05:24 +00002953func TestExportedProguardFlagFiles(t *testing.T) {
2954 ctx, _ := testJava(t, `
2955 android_app {
2956 name: "foo",
2957 sdk_version: "current",
2958 static_libs: ["lib1"],
2959 }
2960
2961 android_library {
2962 name: "lib1",
2963 sdk_version: "current",
2964 optimize: {
2965 proguard_flags_files: ["lib1proguard.cfg"],
2966 }
2967 }
2968 `)
2969
2970 m := ctx.ModuleForTests("foo", "android_common")
2971 hasLib1Proguard := false
2972 for _, s := range m.Rule("java.r8").Implicits.Strings() {
2973 if s == "lib1proguard.cfg" {
2974 hasLib1Proguard = true
2975 break
2976 }
2977 }
2978
2979 if !hasLib1Proguard {
2980 t.Errorf("App does not use library proguard config")
2981 }
2982}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00002983
2984func TestTargetSdkVersionManifestFixer(t *testing.T) {
2985 platform_sdk_codename := "Tiramisu"
2986 testCases := []struct {
2987 name string
2988 targetSdkVersionInBp string
2989 targetSdkVersionExpected string
2990 unbundledBuild bool
2991 }{
2992 {
2993 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
2994 targetSdkVersionInBp: "30",
2995 targetSdkVersionExpected: "30",
2996 unbundledBuild: false,
2997 },
2998 {
2999 name: "Unbundled build: Android.bp has targetSdkVersion",
3000 targetSdkVersionInBp: "30",
3001 targetSdkVersionExpected: "30",
3002 unbundledBuild: true,
3003 },
3004 {
3005 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3006 targetSdkVersionInBp: platform_sdk_codename,
3007 targetSdkVersionExpected: platform_sdk_codename,
3008 unbundledBuild: false,
3009 },
3010 {
3011 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3012 targetSdkVersionInBp: platform_sdk_codename,
3013 targetSdkVersionExpected: "10000",
3014 unbundledBuild: true,
3015 },
3016
3017 {
3018 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
3019 targetSdkVersionExpected: platform_sdk_codename,
3020 unbundledBuild: false,
3021 },
3022 {
3023 name: "Unbundled build: Android.bp has no targetSdkVersion",
3024 targetSdkVersionExpected: "10000",
3025 unbundledBuild: true,
3026 },
3027 }
3028 for _, testCase := range testCases {
3029 bp := fmt.Sprintf(`
3030 android_app {
3031 name: "foo",
3032 sdk_version: "current",
3033 target_sdk_version: "%v",
3034 }
3035 `, testCase.targetSdkVersionInBp)
3036 fixture := android.GroupFixturePreparers(
3037 prepareForJavaTest,
3038 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3039 // explicitly set platform_sdk_codename to make the test deterministic
3040 variables.Platform_sdk_codename = &platform_sdk_codename
3041 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3042 // create a non-empty list if unbundledBuild==true
3043 if testCase.unbundledBuild {
3044 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3045 }
3046 }),
3047 )
3048
3049 result := fixture.RunTestWithBp(t, bp)
3050 foo := result.ModuleForTests("foo", "android_common")
3051
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003052 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3053 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003054 }
3055}
Colin Cross412436f2022-04-07 17:40:07 -07003056
3057func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
3058 result := android.GroupFixturePreparers(
3059 PrepareForTestWithJavaDefaultModules,
3060 android.PrepareForTestWithAllowMissingDependencies,
3061 android.PrepareForTestWithAndroidMk,
3062 ).RunTestWithBp(t, `
3063 android_app {
3064 name: "foo",
3065 srcs: ["a.java"],
3066 certificate: ":missing_certificate",
3067 sdk_version: "current",
3068 }`)
3069
3070 foo := result.ModuleForTests("foo", "android_common")
3071 fooApk := foo.Output("foo.apk")
3072 if fooApk.Rule != android.ErrorRule {
3073 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
3074 }
3075 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
3076}
Sam Delmerico82602492022-06-10 17:05:42 +00003077
3078func TestAppIncludesJniPackages(t *testing.T) {
3079 ctx := android.GroupFixturePreparers(
3080 PrepareForTestWithJavaDefaultModules,
3081 ).RunTestWithBp(t, `
3082 android_library_import {
3083 name: "aary-nodeps",
3084 aars: ["aary.aar"],
3085 extract_jni: true,
3086 }
3087
3088 android_library {
3089 name: "aary-lib",
3090 sdk_version: "current",
3091 min_sdk_version: "21",
3092 static_libs: ["aary-nodeps"],
3093 }
3094
3095 android_app {
3096 name: "aary-lib-dep",
3097 sdk_version: "current",
3098 min_sdk_version: "21",
3099 manifest: "AndroidManifest.xml",
3100 static_libs: ["aary-lib"],
3101 use_embedded_native_libs: true,
3102 }
3103
3104 android_app {
3105 name: "aary-import-dep",
3106 sdk_version: "current",
3107 min_sdk_version: "21",
3108 manifest: "AndroidManifest.xml",
3109 static_libs: ["aary-nodeps"],
3110 use_embedded_native_libs: true,
3111 }
3112
3113 android_app {
3114 name: "aary-no-use-embedded",
3115 sdk_version: "current",
3116 min_sdk_version: "21",
3117 manifest: "AndroidManifest.xml",
3118 static_libs: ["aary-nodeps"],
3119 }`)
3120
3121 testCases := []struct {
3122 name string
3123 hasPackage bool
3124 }{
3125 {
3126 name: "aary-import-dep",
3127 hasPackage: true,
3128 },
3129 {
3130 name: "aary-lib-dep",
3131 hasPackage: true,
3132 },
3133 {
3134 name: "aary-no-use-embedded",
3135 hasPackage: false,
3136 },
3137 }
3138
3139 for _, tc := range testCases {
3140 t.Run(tc.name, func(t *testing.T) {
3141 app := ctx.ModuleForTests(tc.name, "android_common")
3142
3143 outputFile := "jnilibs.zip"
3144 jniOutputLibZip := app.MaybeOutput(outputFile)
3145 if jniOutputLibZip.Rule == nil && !tc.hasPackage {
3146 return
3147 }
3148
3149 jniPackage := "arm64-v8a_jni.zip"
3150 inputs := jniOutputLibZip.Inputs
3151 foundPackage := false
3152 for i := 0; i < len(inputs); i++ {
3153 if strings.Contains(inputs[i].String(), jniPackage) {
3154 foundPackage = true
3155 }
3156 }
3157 if foundPackage != tc.hasPackage {
3158 t.Errorf("expected to find %v in %v inputs; inputs = %v", jniPackage, outputFile, inputs)
3159 }
3160 })
3161 }
3162}