blob: 366142611dfb7827f9bc87772ebf9bd55b8c01af [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: [],
430 sdk_version: "29",
431 }
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900432 `
433 fs := map[string][]byte{
434 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
435 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil,
436 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil,
437 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil,
438 }
439
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000440 ctx, _ := testJavaWithFS(t, bp, fs)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900441
442 inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
443 var crtbeginFound, crtendFound bool
Dan Albert92fe7402020-07-15 13:33:30 -0700444 expectedCrtBegin := ctx.ModuleForTests("crtbegin_so",
445 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
446 expectedCrtEnd := ctx.ModuleForTests("crtend_so",
447 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
448 implicits := []string{}
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900449 for _, input := range inputs {
Dan Albert92fe7402020-07-15 13:33:30 -0700450 implicits = append(implicits, input.String())
451 if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900452 crtbeginFound = true
Dan Albert92fe7402020-07-15 13:33:30 -0700453 } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900454 crtendFound = true
455 }
456 }
Dan Albert92fe7402020-07-15 13:33:30 -0700457 if !crtbeginFound {
458 t.Error(fmt.Sprintf(
459 "expected implicit with suffix %q, have the following implicits:\n%s",
460 expectedCrtBegin, strings.Join(implicits, "\n")))
461 }
462 if !crtendFound {
463 t.Error(fmt.Sprintf(
464 "expected implicit with suffix %q, have the following implicits:\n%s",
465 expectedCrtEnd, strings.Join(implicits, "\n")))
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900466 }
467}
468
469func TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
470 bp := cc.GatherRequiredDepsForTest(android.Android) + `
471 android_app {
472 name: "foo",
473 srcs: ["a.java"],
474 updatable: true,
475 sdk_version: "current",
476 min_sdk_version: "29", // this APK should support 29
477 jni_libs: ["libjni"],
478 }
479
480 cc_library {
481 name: "libjni",
482 stl: "none",
483 sdk_version: "current",
484 }
485 `
486 testJavaError(t, `"libjni" .*: sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
487}
488
489func TestUpdatableApps_ErrorIfDepSdkVersionIsHigher(t *testing.T) {
490 bp := cc.GatherRequiredDepsForTest(android.Android) + `
491 android_app {
492 name: "foo",
493 srcs: ["a.java"],
494 updatable: true,
495 sdk_version: "current",
496 min_sdk_version: "29", // this APK should support 29
497 jni_libs: ["libjni"],
498 }
499
500 cc_library {
501 name: "libjni",
502 stl: "none",
503 shared_libs: ["libbar"],
504 system_shared_libs: [],
505 sdk_version: "27",
506 }
507
508 cc_library {
509 name: "libbar",
510 stl: "none",
511 system_shared_libs: [],
512 sdk_version: "current",
513 }
514 `
515 testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
516}
517
Colin Cross0ddae7f2019-02-07 15:30:01 -0800518func TestResourceDirs(t *testing.T) {
519 testCases := []struct {
520 name string
521 prop string
522 resources []string
523 }{
524 {
525 name: "no resource_dirs",
526 prop: "",
527 resources: []string{"res/res/values/strings.xml"},
528 },
529 {
530 name: "resource_dirs",
531 prop: `resource_dirs: ["res"]`,
532 resources: []string{"res/res/values/strings.xml"},
533 },
534 {
535 name: "empty resource_dirs",
536 prop: `resource_dirs: []`,
537 resources: nil,
538 },
539 }
540
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000541 fs := android.MockFS{
Colin Cross0ddae7f2019-02-07 15:30:01 -0800542 "res/res/values/strings.xml": nil,
543 }
544
545 bp := `
546 android_app {
547 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900548 sdk_version: "current",
Colin Cross0ddae7f2019-02-07 15:30:01 -0800549 %s
550 }
551 `
552
553 for _, testCase := range testCases {
554 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000555 result := android.GroupFixturePreparers(
556 PrepareForTestWithJavaDefaultModules,
557 PrepareForTestWithOverlayBuildComponents,
558 fs.AddToFixture(),
559 ).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop))
Colin Cross0ddae7f2019-02-07 15:30:01 -0800560
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000561 module := result.ModuleForTests("foo", "android_common")
Colin Cross0ddae7f2019-02-07 15:30:01 -0800562 resourceList := module.MaybeOutput("aapt2/res.list")
563
564 var resources []string
565 if resourceList.Rule != nil {
566 for _, compiledResource := range resourceList.Inputs.Strings() {
567 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
568 }
569 }
570
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000571 android.AssertDeepEquals(t, "resource files", testCase.resources, resources)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800572 })
573 }
574}
575
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800576func TestLibraryAssets(t *testing.T) {
577 bp := `
578 android_app {
579 name: "foo",
580 sdk_version: "current",
581 static_libs: ["lib1", "lib2", "lib3"],
582 }
583
584 android_library {
585 name: "lib1",
586 sdk_version: "current",
587 asset_dirs: ["assets_a"],
588 }
589
590 android_library {
591 name: "lib2",
592 sdk_version: "current",
593 }
594
595 android_library {
596 name: "lib3",
597 sdk_version: "current",
598 static_libs: ["lib4"],
599 }
600
601 android_library {
602 name: "lib4",
603 sdk_version: "current",
604 asset_dirs: ["assets_b"],
605 }
606 `
607
608 testCases := []struct {
609 name string
610 assetFlag string
611 assetPackages []string
612 }{
613 {
614 name: "foo",
615 // lib1 has its own asset. lib3 doesn't have any, but provides lib4's transitively.
616 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000617 "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
618 "out/soong/.intermediates/lib1/android_common/assets.zip",
619 "out/soong/.intermediates/lib3/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800620 },
621 },
622 {
623 name: "lib1",
624 assetFlag: "-A assets_a",
625 },
626 {
627 name: "lib2",
628 },
629 {
630 name: "lib3",
631 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000632 "out/soong/.intermediates/lib3/android_common/aapt2/package-res.apk",
633 "out/soong/.intermediates/lib4/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800634 },
635 },
636 {
637 name: "lib4",
638 assetFlag: "-A assets_b",
639 },
640 }
641 ctx := testApp(t, bp)
642
643 for _, test := range testCases {
644 t.Run(test.name, func(t *testing.T) {
645 m := ctx.ModuleForTests(test.name, "android_common")
646
647 // Check asset flag in aapt2 link flags
648 var aapt2link android.TestingBuildParams
649 if len(test.assetPackages) > 0 {
650 aapt2link = m.Output("aapt2/package-res.apk")
651 } else {
652 aapt2link = m.Output("package-res.apk")
653 }
Paul Duffina71a67a2021-03-29 00:42:57 +0100654 aapt2link = aapt2link
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800655 aapt2Flags := aapt2link.Args["flags"]
656 if test.assetFlag != "" {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000657 android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800658 } else {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000659 android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800660 }
661
662 // Check asset merge rule.
663 if len(test.assetPackages) > 0 {
664 mergeAssets := m.Output("package-res.apk")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000665 android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800666 }
667 })
668 }
669}
670
Colin Crossb014f072021-02-26 14:54:36 -0800671func TestAppJavaResources(t *testing.T) {
672 bp := `
673 android_app {
674 name: "foo",
675 sdk_version: "current",
676 java_resources: ["resources/a"],
677 srcs: ["a.java"],
678 }
679
680 android_app {
681 name: "bar",
682 sdk_version: "current",
683 java_resources: ["resources/a"],
684 }
685 `
686
687 ctx := testApp(t, bp)
688
689 foo := ctx.ModuleForTests("foo", "android_common")
690 fooResources := foo.Output("res/foo.jar")
691 fooDexJar := foo.Output("dex-withres/foo.jar")
692 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
693 fooApk := foo.Rule("combineApk")
694
695 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
696 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
697 }
698
699 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
700 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
701 }
702
703 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
704 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
705 }
706
707 bar := ctx.ModuleForTests("bar", "android_common")
708 barResources := bar.Output("res/bar.jar")
709 barApk := bar.Rule("combineApk")
710
711 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
712 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
713 }
714}
715
Colin Crossbec85302019-02-13 13:15:46 -0800716func TestAndroidResources(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -0800717 testCases := []struct {
718 name string
719 enforceRROTargets []string
720 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -0800721 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -0800722 overlayFiles map[string][]string
723 rroDirs map[string][]string
724 }{
725 {
726 name: "no RRO",
727 enforceRROTargets: nil,
728 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -0800729 resourceFiles: map[string][]string{
730 "foo": nil,
731 "bar": {"bar/res/res/values/strings.xml"},
732 "lib": nil,
733 "lib2": {"lib2/res/res/values/strings.xml"},
734 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800735 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800736 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000737 "out/soong/.intermediates/lib2/android_common/package-res.apk",
738 "out/soong/.intermediates/lib/android_common/package-res.apk",
739 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800740 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800741 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
742 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +0000743 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800744 },
Colin Crossbec85302019-02-13 13:15:46 -0800745 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800746 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
747 "device/vendor/blah/overlay/bar/res/values/strings.xml",
748 },
Colin Crossbec85302019-02-13 13:15:46 -0800749 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000750 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800751 "lib/res/res/values/strings.xml",
752 "device/vendor/blah/overlay/lib/res/values/strings.xml",
753 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800754 },
755 rroDirs: map[string][]string{
756 "foo": nil,
757 "bar": nil,
758 },
759 },
760 {
761 name: "enforce RRO on foo",
762 enforceRROTargets: []string{"foo"},
763 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -0800764 resourceFiles: map[string][]string{
765 "foo": nil,
766 "bar": {"bar/res/res/values/strings.xml"},
767 "lib": nil,
768 "lib2": {"lib2/res/res/values/strings.xml"},
769 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800770 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800771 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000772 "out/soong/.intermediates/lib2/android_common/package-res.apk",
773 "out/soong/.intermediates/lib/android_common/package-res.apk",
774 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800775 "foo/res/res/values/strings.xml",
776 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
777 },
Colin Crossbec85302019-02-13 13:15:46 -0800778 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800779 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
780 "device/vendor/blah/overlay/bar/res/values/strings.xml",
781 },
Colin Crossbec85302019-02-13 13:15:46 -0800782 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000783 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800784 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -0800785 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800786 },
Colin Crossc1c37552019-01-31 11:42:41 -0800787
Colin Cross5c4791c2019-02-01 11:44:44 -0800788 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800789 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000790 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +0000791 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700792 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800793 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800794 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700795 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800796 },
797 },
798 {
799 name: "enforce RRO on all",
800 enforceRROTargets: []string{"*"},
801 enforceRROExcludedOverlays: []string{
802 // Excluding specific apps/res directories also allowed.
803 "device/vendor/blah/static_overlay/foo",
804 "device/vendor/blah/static_overlay/bar/res",
805 },
Colin Crossbec85302019-02-13 13:15:46 -0800806 resourceFiles: map[string][]string{
807 "foo": nil,
808 "bar": {"bar/res/res/values/strings.xml"},
809 "lib": nil,
810 "lib2": {"lib2/res/res/values/strings.xml"},
811 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800812 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800813 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000814 "out/soong/.intermediates/lib2/android_common/package-res.apk",
815 "out/soong/.intermediates/lib/android_common/package-res.apk",
816 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800817 "foo/res/res/values/strings.xml",
818 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
819 },
Colin Crossbec85302019-02-13 13:15:46 -0800820 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
821 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000822 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800823 "lib/res/res/values/strings.xml",
824 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800825 },
826 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800827 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000828 "device:device/vendor/blah/overlay/foo/res",
829 "product:product/vendor/blah/overlay/foo/res",
830 // Lib dep comes after the direct deps
831 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800832 },
Anton Hansson53c88442019-03-18 15:53:16 +0000833 "bar": {"device:device/vendor/blah/overlay/bar/res"},
834 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800835 },
836 },
837 }
838
Anton Hansson53c88442019-03-18 15:53:16 +0000839 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -0800840 "device/vendor/blah/overlay",
841 "device/vendor/blah/overlay2",
842 "device/vendor/blah/static_overlay",
843 }
844
Anton Hansson53c88442019-03-18 15:53:16 +0000845 productResourceOverlays := []string{
846 "product/vendor/blah/overlay",
847 }
848
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000849 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -0800850 "foo/res/res/values/strings.xml": nil,
851 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800852 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -0800853 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800854 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
855 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800856 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800857 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
858 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
859 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +0000860 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800861 }
862
863 bp := `
864 android_app {
865 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900866 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800867 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +0000868 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -0800869 }
870
871 android_app {
872 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900873 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800874 resource_dirs: ["bar/res"],
875 }
Colin Cross6ed7dea2019-01-31 14:44:30 -0800876
877 android_library {
878 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900879 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800880 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -0800881 static_libs: ["lib2"],
882 }
883
884 android_library {
885 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900886 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -0800887 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -0800888 }
Anton Hansson53c88442019-03-18 15:53:16 +0000889
890 // This library has the same resources as lib (should not lead to dupe RROs)
891 android_library {
892 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900893 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +0000894 resource_dirs: ["lib/res"]
895 }
Colin Cross890ff552017-11-30 20:13:19 -0800896 `
897
Colin Cross5c4791c2019-02-01 11:44:44 -0800898 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -0800899 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000900 result := android.GroupFixturePreparers(
901 PrepareForTestWithJavaDefaultModules,
902 PrepareForTestWithOverlayBuildComponents,
903 fs.AddToFixture(),
904 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
905 variables.DeviceResourceOverlays = deviceResourceOverlays
906 variables.ProductResourceOverlays = productResourceOverlays
907 if testCase.enforceRROTargets != nil {
908 variables.EnforceRROTargets = testCase.enforceRROTargets
909 }
910 if testCase.enforceRROExcludedOverlays != nil {
911 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
912 }
913 }),
914 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -0800915
Colin Crossbec85302019-02-13 13:15:46 -0800916 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
917 for _, o := range list {
918 res := module.MaybeOutput(o)
919 if res.Rule != nil {
920 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
921 // verify the inputs to the .arsc.flat rule.
922 files = append(files, res.Inputs.Strings()...)
923 } else {
924 // Otherwise, verify the full path to the output of the other module
925 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +0000926 }
Colin Cross890ff552017-11-30 20:13:19 -0800927 }
Colin Crossbec85302019-02-13 13:15:46 -0800928 return files
Colin Cross890ff552017-11-30 20:13:19 -0800929 }
930
Colin Crossbec85302019-02-13 13:15:46 -0800931 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000932 module := result.ModuleForTests(moduleName, "android_common")
Colin Crossbec85302019-02-13 13:15:46 -0800933 resourceList := module.MaybeOutput("aapt2/res.list")
934 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000935 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +0000936 }
Colin Crossbec85302019-02-13 13:15:46 -0800937 overlayList := module.MaybeOutput("aapt2/overlay.list")
938 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000939 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -0800940 }
941
Anton Hansson53c88442019-03-18 15:53:16 +0000942 for _, d := range module.Module().(AndroidLibraryDependency).ExportedRRODirs() {
943 var prefix string
944 if d.overlayType == device {
945 prefix = "device:"
946 } else if d.overlayType == product {
947 prefix = "product:"
948 } else {
949 t.Fatalf("Unexpected overlayType %d", d.overlayType)
950 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000951 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +0000952 }
Colin Crossbec85302019-02-13 13:15:46 -0800953
954 return resourceFiles, overlayFiles, rroDirs
955 }
956
957 modules := []string{"foo", "bar", "lib", "lib2"}
958 for _, module := range modules {
959 resourceFiles, overlayFiles, rroDirs := getResources(module)
960
961 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
962 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
963 module, testCase.resourceFiles[module], resourceFiles)
964 }
965 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
966 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
967 module, testCase.overlayFiles[module], overlayFiles)
968 }
969 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +0000970 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -0800971 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +0000972 }
Colin Cross890ff552017-11-30 20:13:19 -0800973 }
Colin Cross890ff552017-11-30 20:13:19 -0800974 })
975 }
976}
Colin Crossd09b0b62018-04-18 11:06:47 -0700977
Paul Duffincdb88a92021-03-14 00:36:50 +0000978func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
979 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +0900980 link := foo.Output("package-res.apk")
981 linkFlags := strings.Split(link.Args["flags"], " ")
982 min := android.IndexList("--min-sdk-version", linkFlags)
983 target := android.IndexList("--target-sdk-version", linkFlags)
984
985 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
986 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
987 }
988
989 gotMinSdkVersion := linkFlags[min+1]
990 gotTargetSdkVersion := linkFlags[target+1]
991
Paul Duffincdb88a92021-03-14 00:36:50 +0000992 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +0900993
Paul Duffincdb88a92021-03-14 00:36:50 +0000994 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +0900995}
996
Colin Crossd09b0b62018-04-18 11:06:47 -0700997func TestAppSdkVersion(t *testing.T) {
998 testCases := []struct {
999 name string
1000 sdkVersion string
1001 platformSdkInt int
1002 platformSdkCodename string
1003 platformSdkFinal bool
1004 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001005 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001006 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001007 }{
1008 {
1009 name: "current final SDK",
1010 sdkVersion: "current",
1011 platformSdkInt: 27,
1012 platformSdkCodename: "REL",
1013 platformSdkFinal: true,
1014 expectedMinSdkVersion: "27",
1015 },
1016 {
1017 name: "current non-final SDK",
1018 sdkVersion: "current",
1019 platformSdkInt: 27,
1020 platformSdkCodename: "OMR1",
1021 platformSdkFinal: false,
1022 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001023 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001024 },
1025 {
1026 name: "default final SDK",
1027 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001028 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001029 platformSdkInt: 27,
1030 platformSdkCodename: "REL",
1031 platformSdkFinal: true,
1032 expectedMinSdkVersion: "27",
1033 },
1034 {
1035 name: "default non-final SDK",
1036 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001037 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001038 platformSdkInt: 27,
1039 platformSdkCodename: "OMR1",
1040 platformSdkFinal: false,
1041 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001042 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001043 },
1044 {
1045 name: "14",
1046 sdkVersion: "14",
1047 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001048 platformSdkCodename: "S",
1049 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001050 },
1051 }
1052
1053 for _, moduleType := range []string{"android_app", "android_library"} {
1054 for _, test := range testCases {
1055 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001056 platformApiProp := ""
1057 if test.platformApis {
1058 platformApiProp = "platform_apis: true,"
1059 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001060 bp := fmt.Sprintf(`%s {
1061 name: "foo",
1062 srcs: ["a.java"],
1063 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001064 %s
1065 }`, moduleType, test.sdkVersion, platformApiProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001066
Paul Duffin71ae5942021-03-22 15:36:52 +00001067 result := android.GroupFixturePreparers(
1068 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001069 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1070 variables.Platform_sdk_version = &test.platformSdkInt
1071 variables.Platform_sdk_codename = &test.platformSdkCodename
1072 variables.Platform_version_active_codenames = test.activeCodenames
1073 variables.Platform_sdk_final = &test.platformSdkFinal
1074 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001075 FixtureWithPrebuiltApis(map[string][]string{
1076 "14": {"foo"},
1077 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001078 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001079
Paul Duffincdb88a92021-03-14 00:36:50 +00001080 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001081 })
1082 }
1083 }
1084}
Colin Crossa4f08812018-10-02 22:03:40 -07001085
Jeongik Cha219141c2020-08-06 23:00:37 +09001086func TestVendorAppSdkVersion(t *testing.T) {
1087 testCases := []struct {
1088 name string
1089 sdkVersion string
1090 platformSdkInt int
1091 platformSdkCodename string
1092 platformSdkFinal bool
1093 deviceCurrentApiLevelForVendorModules string
1094 expectedMinSdkVersion string
1095 }{
1096 {
1097 name: "current final SDK",
1098 sdkVersion: "current",
1099 platformSdkInt: 29,
1100 platformSdkCodename: "REL",
1101 platformSdkFinal: true,
1102 deviceCurrentApiLevelForVendorModules: "29",
1103 expectedMinSdkVersion: "29",
1104 },
1105 {
1106 name: "current final SDK",
1107 sdkVersion: "current",
1108 platformSdkInt: 29,
1109 platformSdkCodename: "REL",
1110 platformSdkFinal: true,
1111 deviceCurrentApiLevelForVendorModules: "28",
1112 expectedMinSdkVersion: "28",
1113 },
1114 {
1115 name: "current final SDK",
1116 sdkVersion: "current",
1117 platformSdkInt: 29,
1118 platformSdkCodename: "Q",
1119 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001120 deviceCurrentApiLevelForVendorModules: "28",
1121 expectedMinSdkVersion: "28",
1122 },
1123 }
1124
1125 for _, moduleType := range []string{"android_app", "android_library"} {
1126 for _, sdkKind := range []string{"", "system_"} {
1127 for _, test := range testCases {
1128 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1129 bp := fmt.Sprintf(`%s {
1130 name: "foo",
1131 srcs: ["a.java"],
1132 sdk_version: "%s%s",
1133 vendor: true,
1134 }`, moduleType, sdkKind, test.sdkVersion)
1135
Paul Duffin71ae5942021-03-22 15:36:52 +00001136 result := android.GroupFixturePreparers(
1137 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001138 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1139 variables.Platform_sdk_version = &test.platformSdkInt
1140 variables.Platform_sdk_codename = &test.platformSdkCodename
1141 variables.Platform_sdk_final = &test.platformSdkFinal
1142 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1143 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1144 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001145 FixtureWithPrebuiltApis(map[string][]string{
1146 "28": {"foo"},
1147 "29": {"foo"},
1148 "current": {"foo"},
1149 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001150 ).RunTestWithBp(t, bp)
1151
1152 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001153 })
1154 }
1155 }
1156 }
1157}
1158
Paul Duffin50c217c2019-06-12 13:25:22 +01001159func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001160 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001161 cc_library {
1162 name: "libjni",
1163 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001164 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001165 stl: "none",
1166 }
1167
1168 android_test {
1169 name: "test",
1170 sdk_version: "core_platform",
1171 jni_libs: ["libjni"],
1172 }
1173
1174 android_test {
1175 name: "test_first",
1176 sdk_version: "core_platform",
1177 compile_multilib: "first",
1178 jni_libs: ["libjni"],
1179 }
1180
1181 android_test {
1182 name: "test_both",
1183 sdk_version: "core_platform",
1184 compile_multilib: "both",
1185 jni_libs: ["libjni"],
1186 }
1187
1188 android_test {
1189 name: "test_32",
1190 sdk_version: "core_platform",
1191 compile_multilib: "32",
1192 jni_libs: ["libjni"],
1193 }
1194
1195 android_test {
1196 name: "test_64",
1197 sdk_version: "core_platform",
1198 compile_multilib: "64",
1199 jni_libs: ["libjni"],
1200 }
1201 `)
1202
1203 testCases := []struct {
1204 name string
1205 abis []string
1206 }{
1207 {"test", []string{"arm64-v8a"}},
1208 {"test_first", []string{"arm64-v8a"}},
1209 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1210 {"test_32", []string{"armeabi-v7a"}},
1211 {"test_64", []string{"arm64-v8a"}},
1212 }
1213
1214 for _, test := range testCases {
1215 t.Run(test.name, func(t *testing.T) {
1216 app := ctx.ModuleForTests(test.name, "android_common")
1217 jniLibZip := app.Output("jnilibs.zip")
1218 var abis []string
1219 args := strings.Fields(jniLibZip.Args["jarArgs"])
1220 for i := 0; i < len(args); i++ {
1221 if args[i] == "-P" {
1222 abis = append(abis, filepath.Base(args[i+1]))
1223 i++
1224 }
1225 }
1226 if !reflect.DeepEqual(abis, test.abis) {
1227 t.Errorf("want abis %v, got %v", test.abis, abis)
1228 }
1229 })
1230 }
1231}
1232
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001233func TestAppSdkVersionByPartition(t *testing.T) {
1234 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1235 android_app {
1236 name: "foo",
1237 srcs: ["a.java"],
1238 vendor: true,
1239 platform_apis: true,
1240 }
1241 `)
1242
1243 testJava(t, `
1244 android_app {
1245 name: "bar",
1246 srcs: ["b.java"],
1247 platform_apis: true,
1248 }
1249 `)
1250
1251 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001252 bp := `
1253 android_app {
1254 name: "foo",
1255 srcs: ["a.java"],
1256 product_specific: true,
1257 platform_apis: true,
1258 }
1259 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001260
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001261 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001262 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001263 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 +09001264 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001265
1266 android.GroupFixturePreparers(
1267 PrepareForTestWithJavaDefaultModules,
1268 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1269 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
1270 }),
1271 ).
1272 ExtendWithErrorHandler(errorHandler).
1273 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001274 }
1275}
1276
Paul Duffin50c217c2019-06-12 13:25:22 +01001277func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001278 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001279 cc_library {
1280 name: "libjni",
1281 system_shared_libs: [],
1282 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08001283 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001284 }
1285
1286 android_app {
1287 name: "app",
1288 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001289 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001290 }
1291
1292 android_app {
1293 name: "app_noembed",
1294 jni_libs: ["libjni"],
1295 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001296 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001297 }
1298
1299 android_app {
1300 name: "app_embed",
1301 jni_libs: ["libjni"],
1302 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001303 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001304 }
1305
1306 android_test {
1307 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00001308 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001309 jni_libs: ["libjni"],
1310 }
1311
1312 android_test {
1313 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001314 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001315 jni_libs: ["libjni"],
1316 use_embedded_native_libs: false,
1317 }
1318
1319 android_test_helper_app {
1320 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00001321 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001322 jni_libs: ["libjni"],
1323 }
1324
1325 android_test_helper_app {
1326 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001327 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001328 jni_libs: ["libjni"],
1329 use_embedded_native_libs: false,
1330 }
1331 `)
1332
1333 testCases := []struct {
1334 name string
1335 packaged bool
1336 compressed bool
1337 }{
1338 {"app", false, false},
1339 {"app_noembed", false, false},
1340 {"app_embed", true, false},
1341 {"test", true, false},
1342 {"test_noembed", true, true},
1343 {"test_helper", true, false},
1344 {"test_helper_noembed", true, true},
1345 }
1346
1347 for _, test := range testCases {
1348 t.Run(test.name, func(t *testing.T) {
1349 app := ctx.ModuleForTests(test.name, "android_common")
1350 jniLibZip := app.MaybeOutput("jnilibs.zip")
1351 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
1352 t.Errorf("expected jni packaged %v, got %v", w, g)
1353 }
1354
1355 if jniLibZip.Rule != nil {
1356 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
1357 t.Errorf("expected jni compressed %v, got %v", w, g)
1358 }
Colin Crossc511bc52020-04-07 16:50:32 +00001359
1360 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
1361 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
1362 }
Paul Duffin50c217c2019-06-12 13:25:22 +01001363 }
1364 })
1365 }
Colin Cross47fa9d32019-03-26 10:51:39 -07001366}
1367
Colin Cross3c007702020-05-08 11:20:24 -07001368func TestJNISDK(t *testing.T) {
1369 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
1370 cc_library {
1371 name: "libjni",
1372 system_shared_libs: [],
1373 stl: "none",
1374 sdk_version: "current",
1375 }
1376
1377 android_test {
1378 name: "app_platform",
1379 jni_libs: ["libjni"],
1380 platform_apis: true,
1381 }
1382
1383 android_test {
1384 name: "app_sdk",
1385 jni_libs: ["libjni"],
1386 sdk_version: "current",
1387 }
1388
1389 android_test {
1390 name: "app_force_platform",
1391 jni_libs: ["libjni"],
1392 sdk_version: "current",
1393 jni_uses_platform_apis: true,
1394 }
1395
1396 android_test {
1397 name: "app_force_sdk",
1398 jni_libs: ["libjni"],
1399 platform_apis: true,
1400 jni_uses_sdk_apis: true,
1401 }
Colin Crossc2d24052020-05-13 11:05:02 -07001402
1403 cc_library {
1404 name: "libvendorjni",
1405 system_shared_libs: [],
1406 stl: "none",
1407 vendor: true,
1408 }
1409
1410 android_test {
1411 name: "app_vendor",
1412 jni_libs: ["libvendorjni"],
1413 sdk_version: "current",
1414 vendor: true,
1415 }
Colin Cross3c007702020-05-08 11:20:24 -07001416 `)
1417
1418 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07001419 name string
1420 sdkJNI bool
1421 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07001422 }{
Colin Crossc2d24052020-05-13 11:05:02 -07001423 {name: "app_platform"},
1424 {name: "app_sdk", sdkJNI: true},
1425 {name: "app_force_platform"},
1426 {name: "app_force_sdk", sdkJNI: true},
1427 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07001428 }
1429
Colin Crossc2d24052020-05-13 11:05:02 -07001430 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
1431 Output("libjni.so").Output.String()
1432 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
1433 Output("libjni.so").Output.String()
1434 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
1435 Output("libvendorjni.so").Output.String()
1436
Colin Cross3c007702020-05-08 11:20:24 -07001437 for _, test := range testCases {
1438 t.Run(test.name, func(t *testing.T) {
1439 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07001440
1441 jniLibZip := app.MaybeOutput("jnilibs.zip")
1442 if len(jniLibZip.Implicits) != 1 {
1443 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
1444 }
1445 gotJNI := jniLibZip.Implicits[0].String()
1446
1447 if test.sdkJNI {
1448 if gotJNI != sdkJNI {
1449 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
1450 }
Colin Crossc2d24052020-05-13 11:05:02 -07001451 } else if test.vendorJNI {
1452 if gotJNI != vendorJNI {
1453 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
1454 }
Colin Cross3c007702020-05-08 11:20:24 -07001455 } else {
1456 if gotJNI != platformJNI {
1457 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
1458 }
1459 }
1460 })
1461 }
1462
1463 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
1464 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
1465 android_test {
1466 name: "app_platform",
1467 platform_apis: true,
1468 jni_uses_platform_apis: true,
1469 }
1470 `)
1471 })
1472
1473 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
1474 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
1475 android_test {
1476 name: "app_sdk",
1477 sdk_version: "current",
1478 jni_uses_sdk_apis: true,
1479 }
1480 `)
1481 })
1482
1483}
1484
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001485func TestCertificates(t *testing.T) {
1486 testCases := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001487 name string
1488 bp string
1489 certificateOverride string
1490 expectedCertSigningFlags string
1491 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001492 }{
1493 {
1494 name: "default",
1495 bp: `
1496 android_app {
1497 name: "foo",
1498 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001499 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001500 }
1501 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001502 certificateOverride: "",
1503 expectedCertSigningFlags: "",
1504 expectedCertificate: "build/make/target/product/security/testkey.x509.pem build/make/target/product/security/testkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001505 },
1506 {
1507 name: "module certificate property",
1508 bp: `
1509 android_app {
1510 name: "foo",
1511 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001512 certificate: ":new_certificate",
1513 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001514 }
1515
1516 android_app_certificate {
1517 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001518 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001519 }
1520 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001521 certificateOverride: "",
1522 expectedCertSigningFlags: "",
1523 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001524 },
1525 {
1526 name: "path certificate property",
1527 bp: `
1528 android_app {
1529 name: "foo",
1530 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001531 certificate: "expiredkey",
1532 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001533 }
1534 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001535 certificateOverride: "",
1536 expectedCertSigningFlags: "",
1537 expectedCertificate: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001538 },
1539 {
1540 name: "certificate overrides",
1541 bp: `
1542 android_app {
1543 name: "foo",
1544 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001545 certificate: "expiredkey",
1546 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001547 }
1548
1549 android_app_certificate {
1550 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001551 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001552 }
1553 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001554 certificateOverride: "foo:new_certificate",
1555 expectedCertSigningFlags: "",
1556 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Liz Kammere2b27f42020-05-07 13:24:05 -07001557 },
1558 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001559 name: "certificate signing flags",
Liz Kammere2b27f42020-05-07 13:24:05 -07001560 bp: `
1561 android_app {
1562 name: "foo",
1563 srcs: ["a.java"],
1564 certificate: ":new_certificate",
1565 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001566 rotationMinSdkVersion: "32",
Liz Kammere2b27f42020-05-07 13:24:05 -07001567 sdk_version: "current",
1568 }
1569
1570 android_app_certificate {
1571 name: "new_certificate",
1572 certificate: "cert/new_cert",
1573 }
1574 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001575 certificateOverride: "",
1576 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
1577 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001578 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001579 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001580 name: "cert signing flags from filegroup",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001581 bp: `
1582 android_app {
1583 name: "foo",
1584 srcs: ["a.java"],
1585 certificate: ":new_certificate",
1586 lineage: ":lineage_bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001587 rotationMinSdkVersion: "32",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001588 sdk_version: "current",
1589 }
1590
1591 android_app_certificate {
1592 name: "new_certificate",
1593 certificate: "cert/new_cert",
1594 }
1595
1596 filegroup {
1597 name: "lineage_bin",
1598 srcs: ["lineage.bin"],
1599 }
1600 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001601 certificateOverride: "",
1602 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
1603 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001604 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001605 }
1606
1607 for _, test := range testCases {
1608 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001609 result := android.GroupFixturePreparers(
1610 PrepareForTestWithJavaDefaultModules,
1611 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1612 if test.certificateOverride != "" {
1613 variables.CertificateOverrides = []string{test.certificateOverride}
1614 }
1615 }),
1616 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001617
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001618 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001619
1620 signapk := foo.Output("foo.apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001621 signCertificateFlags := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001622 android.AssertStringEquals(t, "certificates flags", test.expectedCertificate, signCertificateFlags)
Liz Kammere2b27f42020-05-07 13:24:05 -07001623
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001624 certSigningFlags := signapk.Args["flags"]
1625 android.AssertStringEquals(t, "cert signing flags", test.expectedCertSigningFlags, certSigningFlags)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001626 })
1627 }
1628}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001629
Songchun Fan688de9a2020-03-24 20:32:24 -07001630func TestRequestV4SigningFlag(t *testing.T) {
1631 testCases := []struct {
1632 name string
1633 bp string
1634 expected string
1635 }{
1636 {
1637 name: "default",
1638 bp: `
1639 android_app {
1640 name: "foo",
1641 srcs: ["a.java"],
1642 sdk_version: "current",
1643 }
1644 `,
1645 expected: "",
1646 },
1647 {
1648 name: "default",
1649 bp: `
1650 android_app {
1651 name: "foo",
1652 srcs: ["a.java"],
1653 sdk_version: "current",
1654 v4_signature: false,
1655 }
1656 `,
1657 expected: "",
1658 },
1659 {
1660 name: "module certificate property",
1661 bp: `
1662 android_app {
1663 name: "foo",
1664 srcs: ["a.java"],
1665 sdk_version: "current",
1666 v4_signature: true,
1667 }
1668 `,
1669 expected: "--enable-v4",
1670 },
1671 }
1672
1673 for _, test := range testCases {
1674 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001675 result := android.GroupFixturePreparers(
1676 PrepareForTestWithJavaDefaultModules,
1677 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07001678
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001679 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07001680
1681 signapk := foo.Output("foo.apk")
1682 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001683 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07001684 })
1685 }
1686}
1687
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001688func TestPackageNameOverride(t *testing.T) {
1689 testCases := []struct {
1690 name string
1691 bp string
1692 packageNameOverride string
1693 expected []string
1694 }{
1695 {
1696 name: "default",
1697 bp: `
1698 android_app {
1699 name: "foo",
1700 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001701 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001702 }
1703 `,
1704 packageNameOverride: "",
1705 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001706 "out/soong/.intermediates/foo/android_common/foo.apk",
1707 "out/soong/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001708 },
1709 },
1710 {
Jooyung Han29e2f6d2022-01-08 12:13:59 +09001711 name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001712 bp: `
1713 android_app {
1714 name: "foo",
1715 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001716 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001717 }
1718 `,
1719 packageNameOverride: "foo:bar",
1720 expected: []string{
1721 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001722 "out/soong/.intermediates/foo/android_common/bar.apk",
1723 "out/soong/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001724 },
1725 },
Jooyung Han29e2f6d2022-01-08 12:13:59 +09001726 {
1727 name: "overridden via stem",
1728 bp: `
1729 android_app {
1730 name: "foo",
1731 srcs: ["a.java"],
1732 sdk_version: "current",
1733 stem: "bar",
1734 }
1735 `,
1736 packageNameOverride: "",
1737 expected: []string{
1738 "out/soong/.intermediates/foo/android_common/bar.apk",
1739 "out/soong/target/product/test_device/system/app/bar/bar.apk",
1740 },
1741 },
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001742 }
1743
1744 for _, test := range testCases {
1745 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001746 result := android.GroupFixturePreparers(
1747 PrepareForTestWithJavaDefaultModules,
1748 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1749 if test.packageNameOverride != "" {
1750 variables.PackageNameOverrides = []string{test.packageNameOverride}
1751 }
1752 }),
1753 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001754
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001755 foo := result.ModuleForTests("foo", "android_common")
1756
Lukacs T. Berkifbaf7252021-08-19 09:36:42 +02001757 outSoongDir := result.Config.SoongOutDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001758
1759 outputs := foo.AllOutputs()
1760 outputMap := make(map[string]bool)
1761 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001762 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001763 }
1764 for _, e := range test.expected {
1765 if _, exist := outputMap[e]; !exist {
1766 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
1767 }
1768 }
1769 })
1770 }
1771}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001772
1773func TestInstrumentationTargetOverridden(t *testing.T) {
1774 bp := `
1775 android_app {
1776 name: "foo",
1777 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001778 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001779 }
1780
1781 android_test {
1782 name: "bar",
1783 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001784 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001785 }
1786 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001787
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001788 result := android.GroupFixturePreparers(
1789 PrepareForTestWithJavaDefaultModules,
1790 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1791 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
1792 }),
1793 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001794
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001795 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001796 res := bar.Output("package-res.apk")
1797 aapt2Flags := res.Args["flags"]
1798 e := "--rename-instrumentation-target-package org.dandroid.bp"
1799 if !strings.Contains(aapt2Flags, e) {
1800 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
1801 }
1802}
Jaewoong Jung525443a2019-02-28 15:35:54 -08001803
1804func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001805 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
1806 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08001807 android_app {
1808 name: "foo",
1809 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07001810 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001811 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001812 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001813 }
1814
1815 override_android_app {
1816 name: "bar",
1817 base: "foo",
1818 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001819 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001820 rotationMinSdkVersion: "32",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001821 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001822 }
1823
1824 android_app_certificate {
1825 name: "new_certificate",
1826 certificate: "cert/new_cert",
1827 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001828
1829 override_android_app {
1830 name: "baz",
1831 base: "foo",
1832 package_name: "org.dandroid.bp",
1833 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001834
1835 override_android_app {
1836 name: "baz_no_rename_resources",
1837 base: "foo",
1838 package_name: "org.dandroid.bp",
1839 rename_resources_package: false,
1840 }
1841
1842 android_app {
1843 name: "foo_no_rename_resources",
1844 srcs: ["a.java"],
1845 certificate: "expiredkey",
1846 overrides: ["qux"],
1847 rename_resources_package: false,
1848 sdk_version: "current",
1849 }
1850
1851 override_android_app {
1852 name: "baz_base_no_rename_resources",
1853 base: "foo_no_rename_resources",
1854 package_name: "org.dandroid.bp",
1855 }
1856
1857 override_android_app {
1858 name: "baz_override_base_rename_resources",
1859 base: "foo_no_rename_resources",
1860 package_name: "org.dandroid.bp",
1861 rename_resources_package: true,
1862 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08001863 `)
1864
1865 expectedVariants := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001866 name string
1867 moduleName string
1868 variantName string
1869 apkName string
1870 apkPath string
1871 certFlag string
1872 certSigningFlags string
1873 overrides []string
1874 packageFlag string
1875 renameResources bool
1876 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08001877 }{
1878 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001879 name: "foo",
1880 moduleName: "foo",
1881 variantName: "android_common",
1882 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
1883 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1884 certSigningFlags: "",
1885 overrides: []string{"qux"},
1886 packageFlag: "",
1887 renameResources: false,
1888 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001889 },
1890 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001891 name: "foo",
1892 moduleName: "bar",
1893 variantName: "android_common_bar",
1894 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
1895 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
1896 certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
1897 overrides: []string{"qux", "foo"},
1898 packageFlag: "",
1899 renameResources: false,
1900 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001901 },
1902 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001903 name: "foo",
1904 moduleName: "baz",
1905 variantName: "android_common_baz",
1906 apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk",
1907 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1908 certSigningFlags: "",
1909 overrides: []string{"qux", "foo"},
1910 packageFlag: "org.dandroid.bp",
1911 renameResources: true,
1912 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001913 },
1914 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001915 name: "foo",
1916 moduleName: "baz_no_rename_resources",
1917 variantName: "android_common_baz_no_rename_resources",
1918 apkPath: "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
1919 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1920 certSigningFlags: "",
1921 overrides: []string{"qux", "foo"},
1922 packageFlag: "org.dandroid.bp",
1923 renameResources: false,
1924 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001925 },
1926 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001927 name: "foo_no_rename_resources",
1928 moduleName: "baz_base_no_rename_resources",
1929 variantName: "android_common_baz_base_no_rename_resources",
1930 apkPath: "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
1931 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1932 certSigningFlags: "",
1933 overrides: []string{"qux", "foo_no_rename_resources"},
1934 packageFlag: "org.dandroid.bp",
1935 renameResources: false,
1936 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001937 },
1938 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001939 name: "foo_no_rename_resources",
1940 moduleName: "baz_override_base_rename_resources",
1941 variantName: "android_common_baz_override_base_rename_resources",
1942 apkPath: "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
1943 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1944 certSigningFlags: "",
1945 overrides: []string{"qux", "foo_no_rename_resources"},
1946 packageFlag: "org.dandroid.bp",
1947 renameResources: true,
1948 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001949 },
1950 }
1951 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001952 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001953
1954 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001955 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001956
1957 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08001958 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001959 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001960 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07001961
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001962 // Check the cert signing flags
1963 certSigningFlags := signapk.Args["flags"]
1964 android.AssertStringEquals(t, "cert signing flags", expected.certSigningFlags, certSigningFlags)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001965
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001966 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08001967 mod := variant.Module().(*AndroidApp)
zhidoua2ce78f2022-02-17 02:33:12 +00001968 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001969
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001970 // Test Overridable property: Logging_parent
1971 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001972 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001973
Liz Kammer1d5983b2020-05-19 19:15:37 +00001974 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001975 res := variant.Output("package-res.apk")
1976 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00001977 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
1978 expectedPackage := expected.packageFlag
1979 if !expected.renameResources {
1980 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00001981 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001982 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001983 }
1984}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07001985
zhidoua2ce78f2022-02-17 02:33:12 +00001986func TestOverrideAndroidAppOverrides(t *testing.T) {
1987 ctx, _ := testJava(
1988 t, `
1989 android_app {
1990 name: "foo",
1991 srcs: ["a.java"],
1992 sdk_version: "current",
1993 overrides: ["qux"]
1994 }
1995
1996 android_app {
1997 name: "bar",
1998 srcs: ["b.java"],
1999 sdk_version: "current",
2000 overrides: ["foo"]
2001 }
2002
2003 override_android_app {
2004 name: "foo_override",
2005 base: "foo",
2006 overrides: ["bar"]
2007 }
2008 `)
2009
2010 expectedVariants := []struct {
2011 name string
2012 moduleName string
2013 variantName string
2014 overrides []string
2015 }{
2016 {
2017 name: "foo",
2018 moduleName: "foo",
2019 variantName: "android_common",
2020 overrides: []string{"qux"},
2021 },
2022 {
2023 name: "bar",
2024 moduleName: "bar",
2025 variantName: "android_common",
2026 overrides: []string{"foo"},
2027 },
2028 {
2029 name: "foo",
2030 moduleName: "foo_override",
2031 variantName: "android_common_foo_override",
2032 overrides: []string{"bar", "foo"},
2033 },
2034 }
2035 for _, expected := range expectedVariants {
2036 variant := ctx.ModuleForTests(expected.name, expected.variantName)
2037
2038 // Check if the overrides field values are correctly aggregated.
2039 mod := variant.Module().(*AndroidApp)
2040 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2041 }
2042}
2043
Jooyung Han01d80d82022-01-08 12:16:32 +09002044func TestOverrideAndroidAppStem(t *testing.T) {
2045 ctx, _ := testJava(t, `
2046 android_app {
2047 name: "foo",
2048 srcs: ["a.java"],
2049 sdk_version: "current",
2050 }
2051 override_android_app {
2052 name: "bar",
2053 base: "foo",
2054 }
2055 override_android_app {
2056 name: "baz",
2057 base: "foo",
2058 stem: "baz_stem",
2059 }
2060 android_app {
2061 name: "foo2",
2062 srcs: ["a.java"],
2063 sdk_version: "current",
2064 stem: "foo2_stem",
2065 }
2066 override_android_app {
2067 name: "bar2",
2068 base: "foo2",
2069 }
2070 override_android_app {
2071 name: "baz2",
2072 base: "foo2",
2073 stem: "baz2_stem",
2074 }
2075 `)
2076 for _, expected := range []struct {
2077 moduleName string
2078 variantName string
2079 apkPath string
2080 }{
2081 {
2082 moduleName: "foo",
2083 variantName: "android_common",
2084 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2085 },
2086 {
2087 moduleName: "foo",
2088 variantName: "android_common_bar",
2089 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2090 },
2091 {
2092 moduleName: "foo",
2093 variantName: "android_common_baz",
2094 apkPath: "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk",
2095 },
2096 {
2097 moduleName: "foo2",
2098 variantName: "android_common",
2099 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2100 },
2101 {
2102 moduleName: "foo2",
2103 variantName: "android_common_bar2",
2104 // Note that this may cause the duplicate output error.
2105 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2106 },
2107 {
2108 moduleName: "foo2",
2109 variantName: "android_common_baz2",
2110 apkPath: "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
2111 },
2112 } {
2113 variant := ctx.ModuleForTests(expected.moduleName, expected.variantName)
2114 variant.Output(expected.apkPath)
2115 }
2116}
2117
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002118func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002119 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002120 android_app {
2121 name: "foo",
2122 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002123 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002124 }
2125
2126 override_android_app {
2127 name: "bar",
2128 base: "foo",
2129 package_name: "org.dandroid.bp",
2130 }
2131
2132 android_test {
2133 name: "baz",
2134 srcs: ["b.java"],
2135 instrumentation_for: "foo",
2136 }
2137
2138 android_test {
2139 name: "qux",
2140 srcs: ["b.java"],
2141 instrumentation_for: "bar",
2142 }
2143 `)
2144
2145 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002146 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002147 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002148 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2149 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2150 }
2151
2152 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002153 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002154 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002155 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2156 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2157 }
2158}
2159
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002160func TestOverrideAndroidTest(t *testing.T) {
2161 ctx, _ := testJava(t, `
2162 android_app {
2163 name: "foo",
2164 srcs: ["a.java"],
2165 package_name: "com.android.foo",
2166 sdk_version: "current",
2167 }
2168
2169 override_android_app {
2170 name: "bar",
2171 base: "foo",
2172 package_name: "com.android.bar",
2173 }
2174
2175 android_test {
2176 name: "foo_test",
2177 srcs: ["b.java"],
2178 instrumentation_for: "foo",
2179 }
2180
2181 override_android_test {
2182 name: "bar_test",
2183 base: "foo_test",
2184 package_name: "com.android.bar.test",
2185 instrumentation_for: "bar",
2186 instrumentation_target_package: "com.android.bar",
2187 }
2188 `)
2189
2190 expectedVariants := []struct {
2191 moduleName string
2192 variantName string
2193 apkPath string
2194 overrides []string
2195 targetVariant string
2196 packageFlag string
2197 targetPackageFlag string
2198 }{
2199 {
2200 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002201 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002202 overrides: nil,
2203 targetVariant: "android_common",
2204 packageFlag: "",
2205 targetPackageFlag: "",
2206 },
2207 {
2208 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002209 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002210 overrides: []string{"foo_test"},
2211 targetVariant: "android_common_bar",
2212 packageFlag: "com.android.bar.test",
2213 targetPackageFlag: "com.android.bar",
2214 },
2215 }
2216 for _, expected := range expectedVariants {
2217 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2218
2219 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002220 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002221
2222 // Check if the overrides field values are correctly aggregated.
2223 mod := variant.Module().(*AndroidTest)
zhidoua2ce78f2022-02-17 02:33:12 +00002224 if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002225 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
zhidoua2ce78f2022-02-17 02:33:12 +00002226 expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002227 }
2228
2229 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01002230 javac := variant.Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002231 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002232 if !strings.Contains(javac.Args["classpath"], turbine) {
2233 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2234 }
2235
2236 // Check aapt2 flags.
2237 res := variant.Output("package-res.apk")
2238 aapt2Flags := res.Args["flags"]
2239 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002240 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002241 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2242 }
2243}
2244
Jaewoong Jung39982342020-01-14 10:27:18 -08002245func TestAndroidTest_FixTestConfig(t *testing.T) {
2246 ctx, _ := testJava(t, `
2247 android_app {
2248 name: "foo",
2249 srcs: ["a.java"],
2250 package_name: "com.android.foo",
2251 sdk_version: "current",
2252 }
2253
2254 android_test {
2255 name: "foo_test",
2256 srcs: ["b.java"],
2257 instrumentation_for: "foo",
2258 }
2259
2260 android_test {
2261 name: "bar_test",
2262 srcs: ["b.java"],
2263 package_name: "com.android.bar.test",
2264 instrumentation_for: "foo",
2265 }
2266
2267 override_android_test {
2268 name: "baz_test",
2269 base: "foo_test",
2270 package_name: "com.android.baz.test",
2271 }
2272 `)
2273
2274 testCases := []struct {
2275 moduleName string
2276 variantName string
2277 expectedFlags []string
2278 }{
2279 {
2280 moduleName: "foo_test",
2281 variantName: "android_common",
2282 },
2283 {
2284 moduleName: "bar_test",
2285 variantName: "android_common",
2286 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002287 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002288 "--package-name com.android.bar.test",
2289 },
2290 },
2291 {
2292 moduleName: "foo_test",
2293 variantName: "android_common_baz_test",
2294 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002295 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002296 "--package-name com.android.baz.test",
2297 "--test-file-name baz_test.apk",
2298 },
2299 },
2300 }
2301
2302 for _, test := range testCases {
2303 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01002304 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08002305
2306 if len(test.expectedFlags) > 0 {
2307 if params.Rule == nil {
2308 t.Errorf("test_config_fixer was expected to run, but didn't")
2309 } else {
2310 for _, flag := range test.expectedFlags {
2311 if !strings.Contains(params.RuleParams.Command, flag) {
2312 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
2313 }
2314 }
2315 }
2316 } else {
2317 if params.Rule != nil {
2318 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
2319 }
2320 }
Jaewoong Jung39982342020-01-14 10:27:18 -08002321 }
2322}
2323
Paul Duffin53a70a42022-01-11 14:35:55 +00002324func TestInstrumentationTargetPrebuilt(t *testing.T) {
2325 bp := `
2326 android_app_import {
2327 name: "foo",
2328 apk: "foo.apk",
2329 presigned: true,
2330 }
2331
2332 android_test {
2333 name: "bar",
2334 srcs: ["a.java"],
2335 instrumentation_for: "foo",
2336 sdk_version: "current",
2337 }
2338 `
2339
2340 android.GroupFixturePreparers(
2341 PrepareForTestWithJavaDefaultModules,
2342 ).ExtendWithErrorHandler(
2343 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
2344 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
2345 RunTestWithBp(t, bp)
2346}
2347
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002348func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002349 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002350 cc_library {
2351 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08002352 sdk_version: "current",
2353 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002354 }
2355
2356 android_test {
2357 name: "stl",
2358 jni_libs: ["libjni"],
2359 compile_multilib: "both",
2360 sdk_version: "current",
2361 stl: "c++_shared",
2362 }
2363
2364 android_test {
2365 name: "system",
2366 jni_libs: ["libjni"],
2367 compile_multilib: "both",
2368 sdk_version: "current",
2369 }
2370 `)
2371
2372 testCases := []struct {
2373 name string
2374 jnis []string
2375 }{
2376 {"stl",
2377 []string{
2378 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07002379 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002380 },
2381 },
2382 {"system",
2383 []string{
2384 "libjni.so",
2385 },
2386 },
2387 }
2388
2389 for _, test := range testCases {
2390 t.Run(test.name, func(t *testing.T) {
2391 app := ctx.ModuleForTests(test.name, "android_common")
2392 jniLibZip := app.Output("jnilibs.zip")
2393 var jnis []string
2394 args := strings.Fields(jniLibZip.Args["jarArgs"])
2395 for i := 0; i < len(args); i++ {
2396 if args[i] == "-f" {
2397 jnis = append(jnis, args[i+1])
2398 i += 1
2399 }
2400 }
2401 jnisJoined := strings.Join(jnis, " ")
2402 for _, jni := range test.jnis {
2403 if !strings.Contains(jnisJoined, jni) {
2404 t.Errorf("missing jni %q in %q", jni, jnis)
2405 }
2406 }
2407 })
2408 }
2409}
Colin Cross50ddcc42019-05-16 12:28:22 -07002410
2411func TestUsesLibraries(t *testing.T) {
2412 bp := `
2413 java_sdk_library {
2414 name: "foo",
2415 srcs: ["a.java"],
2416 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002417 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002418 }
2419
2420 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01002421 name: "qux",
2422 srcs: ["a.java"],
2423 api_packages: ["qux"],
2424 sdk_version: "current",
2425 }
2426
2427 java_sdk_library {
2428 name: "quuz",
2429 srcs: ["a.java"],
2430 api_packages: ["quuz"],
2431 sdk_version: "current",
2432 }
2433
2434 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002435 name: "fred",
2436 srcs: ["a.java"],
2437 api_packages: ["fred"],
2438 sdk_version: "current",
2439 }
2440
2441 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07002442 name: "bar",
2443 srcs: ["a.java"],
2444 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002445 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002446 }
2447
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01002448 java_sdk_library {
2449 name: "runtime-library",
2450 srcs: ["a.java"],
2451 sdk_version: "current",
2452 }
2453
2454 java_library {
2455 name: "static-runtime-helper",
2456 srcs: ["a.java"],
2457 libs: ["runtime-library"],
2458 sdk_version: "current",
2459 }
2460
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002461 java_library {
2462 name: "runtime-required-x",
2463 srcs: ["a.java"],
2464 installable: true,
2465 sdk_version: "current",
2466 }
2467
2468 java_library {
2469 name: "runtime-optional-x",
2470 srcs: ["a.java"],
2471 installable: true,
2472 sdk_version: "current",
2473 }
2474
2475 android_library {
2476 name: "static-x",
2477 uses_libs: ["runtime-required-x"],
2478 optional_uses_libs: ["runtime-optional-x"],
2479 sdk_version: "current",
2480 }
2481
2482 java_library {
2483 name: "runtime-required-y",
2484 srcs: ["a.java"],
2485 installable: true,
2486 sdk_version: "current",
2487 }
2488
2489 java_library {
2490 name: "runtime-optional-y",
2491 srcs: ["a.java"],
2492 installable: true,
2493 sdk_version: "current",
2494 }
2495
2496 java_library {
2497 name: "static-y",
2498 srcs: ["a.java"],
2499 uses_libs: ["runtime-required-y"],
2500 optional_uses_libs: ["runtime-optional-y"],
2501 sdk_version: "current",
2502 }
2503
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002504 // A library that has to use "provides_uses_lib", because:
2505 // - it is not an SDK library
2506 // - its library name is different from its module name
2507 java_library {
2508 name: "non-sdk-lib",
2509 provides_uses_lib: "com.non.sdk.lib",
2510 installable: true,
2511 srcs: ["a.java"],
2512 }
2513
Colin Cross50ddcc42019-05-16 12:28:22 -07002514 android_app {
2515 name: "app",
2516 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002517 libs: [
2518 "qux",
2519 "quuz.stubs"
2520 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002521 static_libs: [
2522 "static-runtime-helper",
2523 // statically linked component libraries should not pull their SDK libraries,
2524 // so "fred" should not be added to class loader context
2525 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002526 "static-x",
2527 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002528 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002529 uses_libs: [
2530 "foo",
2531 "non-sdk-lib"
2532 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002533 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002534 optional_uses_libs: [
2535 "bar",
2536 "baz",
2537 ],
2538 }
2539
2540 android_app_import {
2541 name: "prebuilt",
2542 apk: "prebuilts/apk/app.apk",
2543 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002544 uses_libs: [
2545 "foo",
2546 "non-sdk-lib",
2547 "android.test.runner"
2548 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07002549 optional_uses_libs: [
2550 "bar",
2551 "baz",
2552 ],
2553 }
2554 `
2555
Paul Duffin71ae5942021-03-22 15:36:52 +00002556 result := android.GroupFixturePreparers(
2557 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00002558 PrepareForTestWithJavaSdkLibraryFiles,
2559 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Paul Duffind234b412021-03-12 23:04:46 +00002560 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2561 variables.MissingUsesLibraries = []string{"baz"}
2562 }),
2563 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07002564
Paul Duffind234b412021-03-12 23:04:46 +00002565 app := result.ModuleForTests("app", "android_common")
2566 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07002567
Paul Duffin859fe962020-05-15 10:20:31 +01002568 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002569 // This should not include explicit `uses_libs`/`optional_uses_libs` entries.
2570 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2571 expectManifestFixerArgs := `--extract-native-libs=true ` +
2572 `--uses-library qux ` +
2573 `--uses-library quuz ` +
Ulya Trafimovich0b1c70e2021-08-20 15:39:12 +01002574 `--uses-library runtime-library`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00002575 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01002576
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002577 // Test that all libraries are verified (library order matters).
2578 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
2579 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002580 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002581 `--uses-library qux ` +
2582 `--uses-library quuz ` +
2583 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002584 `--uses-library runtime-required-x ` +
2585 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002586 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002587 `--optional-uses-library baz ` +
2588 `--optional-uses-library runtime-optional-x ` +
2589 `--optional-uses-library runtime-optional-y `
Paul Duffind234b412021-03-12 23:04:46 +00002590 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002591
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002592 // Test that all libraries are verified for an APK (library order matters).
2593 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00002594 verifyApkArgs := `--uses-library foo ` +
2595 `--uses-library com.non.sdk.lib ` +
2596 `--uses-library android.test.runner ` +
2597 `--optional-uses-library bar ` +
2598 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002599 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002600
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002601 // Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002602 cmd := app.Rule("dexpreopt").RuleParams.Command
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002603 w := `--target-context-for-sdk any ` +
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002604 `PCL[/system/framework/qux.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002605 `PCL[/system/framework/quuz.jar]#` +
2606 `PCL[/system/framework/foo.jar]#` +
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002607 `PCL[/system/framework/non-sdk-lib.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002608 `PCL[/system/framework/bar.jar]#` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002609 `PCL[/system/framework/runtime-library.jar]#` +
2610 `PCL[/system/framework/runtime-required-x.jar]#` +
2611 `PCL[/system/framework/runtime-optional-x.jar]#` +
2612 `PCL[/system/framework/runtime-required-y.jar]#` +
2613 `PCL[/system/framework/runtime-optional-y.jar] `
Paul Duffind234b412021-03-12 23:04:46 +00002614 android.AssertStringDoesContain(t, "dexpreopt app cmd args", cmd, w)
Colin Cross50ddcc42019-05-16 12:28:22 -07002615
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002616 // Test conditional context for target SDK version 28.
Paul Duffind234b412021-03-12 23:04:46 +00002617 android.AssertStringDoesContain(t, "dexpreopt app cmd 28", cmd,
2618 `--target-context-for-sdk 28`+
2619 ` PCL[/system/framework/org.apache.http.legacy.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002620
2621 // Test conditional context for target SDK version 29.
Paul Duffind234b412021-03-12 23:04:46 +00002622 android.AssertStringDoesContain(t, "dexpreopt app cmd 29", cmd,
2623 `--target-context-for-sdk 29`+
2624 ` PCL[/system/framework/android.hidl.manager-V1.0-java.jar]`+
2625 `#PCL[/system/framework/android.hidl.base-V1.0-java.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002626
2627 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002628 // "android.test.mock" is absent because "android.test.runner" is not used.
Paul Duffind234b412021-03-12 23:04:46 +00002629 android.AssertStringDoesContain(t, "dexpreopt app cmd 30", cmd,
2630 `--target-context-for-sdk 30`+
2631 ` PCL[/system/framework/android.test.base.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002632
Ulya Trafimovichfc24ad32020-08-19 16:32:54 +01002633 cmd = prebuilt.Rule("dexpreopt").RuleParams.Command
Paul Duffind234b412021-03-12 23:04:46 +00002634 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd", cmd,
2635 `--target-context-for-sdk any`+
2636 ` PCL[/system/framework/foo.jar]`+
2637 `#PCL[/system/framework/non-sdk-lib.jar]`+
2638 `#PCL[/system/framework/android.test.runner.jar]`+
2639 `#PCL[/system/framework/bar.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002640
2641 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002642 // "android.test.mock" is present because "android.test.runner" is used.
Paul Duffind234b412021-03-12 23:04:46 +00002643 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd 30", cmd,
2644 `--target-context-for-sdk 30`+
2645 ` PCL[/system/framework/android.test.base.jar]`+
2646 `#PCL[/system/framework/android.test.mock.jar] `)
Colin Cross50ddcc42019-05-16 12:28:22 -07002647}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002648
Ulya Trafimovich9023b022021-03-22 16:02:28 +00002649func TestDexpreoptBcp(t *testing.T) {
2650 bp := `
2651 java_sdk_library {
2652 name: "foo",
2653 srcs: ["a.java"],
2654 api_packages: ["foo"],
2655 sdk_version: "current",
2656 }
2657
2658 java_sdk_library {
2659 name: "bar",
2660 srcs: ["a.java"],
2661 api_packages: ["bar"],
2662 permitted_packages: ["bar"],
2663 sdk_version: "current",
2664 }
2665
2666 android_app {
2667 name: "app",
2668 srcs: ["a.java"],
2669 sdk_version: "current",
2670 }
2671 `
2672
2673 testCases := []struct {
2674 name string
2675 with bool
2676 expect string
2677 }{
2678 {
2679 name: "with updatable bcp",
2680 with: true,
2681 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
2682 },
2683 {
2684 name: "without updatable bcp",
2685 with: false,
2686 expect: "/system/framework/foo.jar",
2687 },
2688 }
2689
2690 for _, test := range testCases {
2691 t.Run(test.name, func(t *testing.T) {
2692 result := android.GroupFixturePreparers(
2693 prepareForJavaTest,
2694 PrepareForTestWithJavaSdkLibraryFiles,
2695 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
2696 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01002697 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00002698 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
2699 ).RunTestWithBp(t, bp)
2700
2701 app := result.ModuleForTests("app", "android_common")
2702 cmd := app.Rule("dexpreopt").RuleParams.Command
2703 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
2704 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
2705 })
2706 }
2707}
2708
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002709func TestCodelessApp(t *testing.T) {
2710 testCases := []struct {
2711 name string
2712 bp string
2713 noCode bool
2714 }{
2715 {
2716 name: "normal",
2717 bp: `
2718 android_app {
2719 name: "foo",
2720 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002721 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002722 }
2723 `,
2724 noCode: false,
2725 },
2726 {
2727 name: "app without sources",
2728 bp: `
2729 android_app {
2730 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002731 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002732 }
2733 `,
2734 noCode: true,
2735 },
2736 {
2737 name: "app with libraries",
2738 bp: `
2739 android_app {
2740 name: "foo",
2741 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002742 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002743 }
2744
2745 java_library {
2746 name: "lib",
2747 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002748 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002749 }
2750 `,
2751 noCode: false,
2752 },
2753 {
2754 name: "app with sourceless libraries",
2755 bp: `
2756 android_app {
2757 name: "foo",
2758 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002759 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002760 }
2761
2762 java_library {
2763 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002764 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002765 }
2766 `,
2767 // TODO(jungjw): this should probably be true
2768 noCode: false,
2769 },
2770 }
2771
2772 for _, test := range testCases {
2773 t.Run(test.name, func(t *testing.T) {
2774 ctx := testApp(t, test.bp)
2775
2776 foo := ctx.ModuleForTests("foo", "android_common")
2777 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2778 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
2779 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
2780 }
2781 })
2782 }
2783}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002784
Colin Cross53a87f52019-06-25 13:35:30 -07002785func TestUncompressDex(t *testing.T) {
2786 testCases := []struct {
2787 name string
2788 bp string
2789
2790 uncompressedPlatform bool
2791 uncompressedUnbundled bool
2792 }{
2793 {
2794 name: "normal",
2795 bp: `
2796 android_app {
2797 name: "foo",
2798 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002799 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002800 }
2801 `,
2802 uncompressedPlatform: true,
2803 uncompressedUnbundled: false,
2804 },
2805 {
2806 name: "use_embedded_dex",
2807 bp: `
2808 android_app {
2809 name: "foo",
2810 use_embedded_dex: true,
2811 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002812 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002813 }
2814 `,
2815 uncompressedPlatform: true,
2816 uncompressedUnbundled: true,
2817 },
2818 {
2819 name: "privileged",
2820 bp: `
2821 android_app {
2822 name: "foo",
2823 privileged: true,
2824 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002825 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002826 }
2827 `,
2828 uncompressedPlatform: true,
2829 uncompressedUnbundled: true,
2830 },
David Srbeckye033cba2020-05-20 22:20:28 +01002831 {
2832 name: "normal_uncompress_dex_true",
2833 bp: `
2834 android_app {
2835 name: "foo",
2836 srcs: ["a.java"],
2837 sdk_version: "current",
2838 uncompress_dex: true,
2839 }
2840 `,
2841 uncompressedPlatform: true,
2842 uncompressedUnbundled: true,
2843 },
2844 {
2845 name: "normal_uncompress_dex_false",
2846 bp: `
2847 android_app {
2848 name: "foo",
2849 srcs: ["a.java"],
2850 sdk_version: "current",
2851 uncompress_dex: false,
2852 }
2853 `,
2854 uncompressedPlatform: false,
2855 uncompressedUnbundled: false,
2856 },
Colin Cross53a87f52019-06-25 13:35:30 -07002857 }
2858
2859 test := func(t *testing.T, bp string, want bool, unbundled bool) {
2860 t.Helper()
2861
Paul Duffin71ae5942021-03-22 15:36:52 +00002862 result := android.GroupFixturePreparers(
2863 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00002864 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00002865 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2866 if unbundled {
2867 variables.Unbundled_build = proptools.BoolPtr(true)
2868 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
2869 }
2870 }),
2871 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07002872
Paul Duffincdb88a92021-03-14 00:36:50 +00002873 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07002874 dex := foo.Rule("r8")
2875 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
2876 aligned := foo.MaybeRule("zipalign").Rule != nil
2877
Paul Duffincdb88a92021-03-14 00:36:50 +00002878 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07002879
Paul Duffincdb88a92021-03-14 00:36:50 +00002880 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07002881 }
2882
2883 for _, tt := range testCases {
2884 t.Run(tt.name, func(t *testing.T) {
2885 t.Run("platform", func(t *testing.T) {
2886 test(t, tt.bp, tt.uncompressedPlatform, false)
2887 })
2888 t.Run("unbundled", func(t *testing.T) {
2889 test(t, tt.bp, tt.uncompressedUnbundled, true)
2890 })
2891 })
2892 }
2893}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002894
2895func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
2896 if expectedValue != "" {
2897 expectedFlag := "--" + flagName + " " + expectedValue
2898 if !strings.Contains(aapt2Flags, expectedFlag) {
2899 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
2900 }
2901 } else {
2902 unexpectedFlag := "--" + flagName
2903 if strings.Contains(aapt2Flags, unexpectedFlag) {
2904 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
2905 }
2906 }
2907}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08002908
Cole Faust9a631312020-10-22 21:05:24 +00002909func TestExportedProguardFlagFiles(t *testing.T) {
2910 ctx, _ := testJava(t, `
2911 android_app {
2912 name: "foo",
2913 sdk_version: "current",
2914 static_libs: ["lib1"],
2915 }
2916
2917 android_library {
2918 name: "lib1",
2919 sdk_version: "current",
2920 optimize: {
2921 proguard_flags_files: ["lib1proguard.cfg"],
2922 }
2923 }
2924 `)
2925
2926 m := ctx.ModuleForTests("foo", "android_common")
2927 hasLib1Proguard := false
2928 for _, s := range m.Rule("java.r8").Implicits.Strings() {
2929 if s == "lib1proguard.cfg" {
2930 hasLib1Proguard = true
2931 break
2932 }
2933 }
2934
2935 if !hasLib1Proguard {
2936 t.Errorf("App does not use library proguard config")
2937 }
2938}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00002939
2940func TestTargetSdkVersionManifestFixer(t *testing.T) {
2941 platform_sdk_codename := "Tiramisu"
2942 testCases := []struct {
2943 name string
2944 targetSdkVersionInBp string
2945 targetSdkVersionExpected string
2946 unbundledBuild bool
2947 }{
2948 {
2949 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
2950 targetSdkVersionInBp: "30",
2951 targetSdkVersionExpected: "30",
2952 unbundledBuild: false,
2953 },
2954 {
2955 name: "Unbundled build: Android.bp has targetSdkVersion",
2956 targetSdkVersionInBp: "30",
2957 targetSdkVersionExpected: "30",
2958 unbundledBuild: true,
2959 },
2960 {
2961 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
2962 targetSdkVersionInBp: platform_sdk_codename,
2963 targetSdkVersionExpected: platform_sdk_codename,
2964 unbundledBuild: false,
2965 },
2966 {
2967 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
2968 targetSdkVersionInBp: platform_sdk_codename,
2969 targetSdkVersionExpected: "10000",
2970 unbundledBuild: true,
2971 },
2972
2973 {
2974 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
2975 targetSdkVersionExpected: platform_sdk_codename,
2976 unbundledBuild: false,
2977 },
2978 {
2979 name: "Unbundled build: Android.bp has no targetSdkVersion",
2980 targetSdkVersionExpected: "10000",
2981 unbundledBuild: true,
2982 },
2983 }
2984 for _, testCase := range testCases {
2985 bp := fmt.Sprintf(`
2986 android_app {
2987 name: "foo",
2988 sdk_version: "current",
2989 target_sdk_version: "%v",
2990 }
2991 `, testCase.targetSdkVersionInBp)
2992 fixture := android.GroupFixturePreparers(
2993 prepareForJavaTest,
2994 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2995 // explicitly set platform_sdk_codename to make the test deterministic
2996 variables.Platform_sdk_codename = &platform_sdk_codename
2997 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
2998 // create a non-empty list if unbundledBuild==true
2999 if testCase.unbundledBuild {
3000 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3001 }
3002 }),
3003 )
3004
3005 result := fixture.RunTestWithBp(t, bp)
3006 foo := result.ModuleForTests("foo", "android_common")
3007
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003008 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3009 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003010 }
3011}
Colin Cross412436f2022-04-07 17:40:07 -07003012
3013func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
3014 result := android.GroupFixturePreparers(
3015 PrepareForTestWithJavaDefaultModules,
3016 android.PrepareForTestWithAllowMissingDependencies,
3017 android.PrepareForTestWithAndroidMk,
3018 ).RunTestWithBp(t, `
3019 android_app {
3020 name: "foo",
3021 srcs: ["a.java"],
3022 certificate: ":missing_certificate",
3023 sdk_version: "current",
3024 }`)
3025
3026 foo := result.ModuleForTests("foo", "android_common")
3027 fooApk := foo.Output("foo.apk")
3028 if fooApk.Rule != android.ErrorRule {
3029 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
3030 }
3031 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
3032}