blob: 64d706a437eabd1351b1473208c089c1bb388e27 [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 {
1487 name string
1488 bp string
1489 certificateOverride string
Liz Kammere2b27f42020-05-07 13:24:05 -07001490 expectedLineage 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 `,
1502 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001503 expectedLineage: "",
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 `,
1521 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001522 expectedLineage: "",
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 `,
1535 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001536 expectedLineage: "",
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 `,
1554 certificateOverride: "foo:new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001555 expectedLineage: "",
1556 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1557 },
1558 {
1559 name: "certificate lineage",
1560 bp: `
1561 android_app {
1562 name: "foo",
1563 srcs: ["a.java"],
1564 certificate: ":new_certificate",
1565 lineage: "lineage.bin",
1566 sdk_version: "current",
1567 }
1568
1569 android_app_certificate {
1570 name: "new_certificate",
1571 certificate: "cert/new_cert",
1572 }
1573 `,
1574 certificateOverride: "",
1575 expectedLineage: "--lineage lineage.bin",
1576 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001577 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001578 {
1579 name: "lineage from filegroup",
1580 bp: `
1581 android_app {
1582 name: "foo",
1583 srcs: ["a.java"],
1584 certificate: ":new_certificate",
1585 lineage: ":lineage_bin",
1586 sdk_version: "current",
1587 }
1588
1589 android_app_certificate {
1590 name: "new_certificate",
1591 certificate: "cert/new_cert",
1592 }
1593
1594 filegroup {
1595 name: "lineage_bin",
1596 srcs: ["lineage.bin"],
1597 }
1598 `,
1599 certificateOverride: "",
1600 expectedLineage: "--lineage lineage.bin",
1601 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1602 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001603 }
1604
1605 for _, test := range testCases {
1606 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001607 result := android.GroupFixturePreparers(
1608 PrepareForTestWithJavaDefaultModules,
1609 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1610 if test.certificateOverride != "" {
1611 variables.CertificateOverrides = []string{test.certificateOverride}
1612 }
1613 }),
1614 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001615
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001616 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001617
1618 signapk := foo.Output("foo.apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001619 signCertificateFlags := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001620 android.AssertStringEquals(t, "certificates flags", test.expectedCertificate, signCertificateFlags)
Liz Kammere2b27f42020-05-07 13:24:05 -07001621
1622 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001623 android.AssertStringEquals(t, "signing flags", test.expectedLineage, signFlags)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001624 })
1625 }
1626}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001627
Songchun Fan688de9a2020-03-24 20:32:24 -07001628func TestRequestV4SigningFlag(t *testing.T) {
1629 testCases := []struct {
1630 name string
1631 bp string
1632 expected string
1633 }{
1634 {
1635 name: "default",
1636 bp: `
1637 android_app {
1638 name: "foo",
1639 srcs: ["a.java"],
1640 sdk_version: "current",
1641 }
1642 `,
1643 expected: "",
1644 },
1645 {
1646 name: "default",
1647 bp: `
1648 android_app {
1649 name: "foo",
1650 srcs: ["a.java"],
1651 sdk_version: "current",
1652 v4_signature: false,
1653 }
1654 `,
1655 expected: "",
1656 },
1657 {
1658 name: "module certificate property",
1659 bp: `
1660 android_app {
1661 name: "foo",
1662 srcs: ["a.java"],
1663 sdk_version: "current",
1664 v4_signature: true,
1665 }
1666 `,
1667 expected: "--enable-v4",
1668 },
1669 }
1670
1671 for _, test := range testCases {
1672 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001673 result := android.GroupFixturePreparers(
1674 PrepareForTestWithJavaDefaultModules,
1675 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07001676
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001677 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07001678
1679 signapk := foo.Output("foo.apk")
1680 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001681 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07001682 })
1683 }
1684}
1685
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001686func TestPackageNameOverride(t *testing.T) {
1687 testCases := []struct {
1688 name string
1689 bp string
1690 packageNameOverride string
1691 expected []string
1692 }{
1693 {
1694 name: "default",
1695 bp: `
1696 android_app {
1697 name: "foo",
1698 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001699 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001700 }
1701 `,
1702 packageNameOverride: "",
1703 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001704 "out/soong/.intermediates/foo/android_common/foo.apk",
1705 "out/soong/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001706 },
1707 },
1708 {
Jooyung Han29e2f6d2022-01-08 12:13:59 +09001709 name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001710 bp: `
1711 android_app {
1712 name: "foo",
1713 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001714 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001715 }
1716 `,
1717 packageNameOverride: "foo:bar",
1718 expected: []string{
1719 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001720 "out/soong/.intermediates/foo/android_common/bar.apk",
1721 "out/soong/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001722 },
1723 },
Jooyung Han29e2f6d2022-01-08 12:13:59 +09001724 {
1725 name: "overridden via stem",
1726 bp: `
1727 android_app {
1728 name: "foo",
1729 srcs: ["a.java"],
1730 sdk_version: "current",
1731 stem: "bar",
1732 }
1733 `,
1734 packageNameOverride: "",
1735 expected: []string{
1736 "out/soong/.intermediates/foo/android_common/bar.apk",
1737 "out/soong/target/product/test_device/system/app/bar/bar.apk",
1738 },
1739 },
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001740 }
1741
1742 for _, test := range testCases {
1743 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001744 result := android.GroupFixturePreparers(
1745 PrepareForTestWithJavaDefaultModules,
1746 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1747 if test.packageNameOverride != "" {
1748 variables.PackageNameOverrides = []string{test.packageNameOverride}
1749 }
1750 }),
1751 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001752
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001753 foo := result.ModuleForTests("foo", "android_common")
1754
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02001755 outSoongDir := result.Config.SoongOutDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001756
1757 outputs := foo.AllOutputs()
1758 outputMap := make(map[string]bool)
1759 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001760 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001761 }
1762 for _, e := range test.expected {
1763 if _, exist := outputMap[e]; !exist {
1764 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
1765 }
1766 }
1767 })
1768 }
1769}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001770
1771func TestInstrumentationTargetOverridden(t *testing.T) {
1772 bp := `
1773 android_app {
1774 name: "foo",
1775 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001776 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001777 }
1778
1779 android_test {
1780 name: "bar",
1781 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001782 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001783 }
1784 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001785
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001786 result := android.GroupFixturePreparers(
1787 PrepareForTestWithJavaDefaultModules,
1788 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1789 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
1790 }),
1791 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001792
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001793 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001794 res := bar.Output("package-res.apk")
1795 aapt2Flags := res.Args["flags"]
1796 e := "--rename-instrumentation-target-package org.dandroid.bp"
1797 if !strings.Contains(aapt2Flags, e) {
1798 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
1799 }
1800}
Jaewoong Jung525443a2019-02-28 15:35:54 -08001801
1802func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001803 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
1804 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08001805 android_app {
1806 name: "foo",
1807 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07001808 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001809 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001810 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001811 }
1812
1813 override_android_app {
1814 name: "bar",
1815 base: "foo",
1816 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001817 lineage: "lineage.bin",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001818 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001819 }
1820
1821 android_app_certificate {
1822 name: "new_certificate",
1823 certificate: "cert/new_cert",
1824 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001825
1826 override_android_app {
1827 name: "baz",
1828 base: "foo",
1829 package_name: "org.dandroid.bp",
1830 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001831
1832 override_android_app {
1833 name: "baz_no_rename_resources",
1834 base: "foo",
1835 package_name: "org.dandroid.bp",
1836 rename_resources_package: false,
1837 }
1838
1839 android_app {
1840 name: "foo_no_rename_resources",
1841 srcs: ["a.java"],
1842 certificate: "expiredkey",
1843 overrides: ["qux"],
1844 rename_resources_package: false,
1845 sdk_version: "current",
1846 }
1847
1848 override_android_app {
1849 name: "baz_base_no_rename_resources",
1850 base: "foo_no_rename_resources",
1851 package_name: "org.dandroid.bp",
1852 }
1853
1854 override_android_app {
1855 name: "baz_override_base_rename_resources",
1856 base: "foo_no_rename_resources",
1857 package_name: "org.dandroid.bp",
1858 rename_resources_package: true,
1859 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08001860 `)
1861
1862 expectedVariants := []struct {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001863 name string
1864 moduleName string
1865 variantName string
1866 apkName string
1867 apkPath string
1868 certFlag string
1869 lineageFlag string
1870 overrides []string
1871 packageFlag string
1872 renameResources bool
1873 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08001874 }{
1875 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001876 name: "foo",
1877 moduleName: "foo",
1878 variantName: "android_common",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001879 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001880 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1881 lineageFlag: "",
1882 overrides: []string{"qux"},
1883 packageFlag: "",
1884 renameResources: false,
1885 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001886 },
1887 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001888 name: "foo",
1889 moduleName: "bar",
1890 variantName: "android_common_bar",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001891 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001892 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
1893 lineageFlag: "--lineage lineage.bin",
1894 overrides: []string{"qux", "foo"},
1895 packageFlag: "",
1896 renameResources: false,
1897 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001898 },
1899 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001900 name: "foo",
1901 moduleName: "baz",
1902 variantName: "android_common_baz",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001903 apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001904 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1905 lineageFlag: "",
1906 overrides: []string{"qux", "foo"},
1907 packageFlag: "org.dandroid.bp",
1908 renameResources: true,
1909 logging_parent: "",
1910 },
1911 {
1912 name: "foo",
1913 moduleName: "baz_no_rename_resources",
1914 variantName: "android_common_baz_no_rename_resources",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001915 apkPath: "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001916 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1917 lineageFlag: "",
1918 overrides: []string{"qux", "foo"},
1919 packageFlag: "org.dandroid.bp",
1920 renameResources: false,
1921 logging_parent: "",
1922 },
1923 {
1924 name: "foo_no_rename_resources",
1925 moduleName: "baz_base_no_rename_resources",
1926 variantName: "android_common_baz_base_no_rename_resources",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001927 apkPath: "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001928 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1929 lineageFlag: "",
1930 overrides: []string{"qux", "foo_no_rename_resources"},
1931 packageFlag: "org.dandroid.bp",
1932 renameResources: false,
1933 logging_parent: "",
1934 },
1935 {
1936 name: "foo_no_rename_resources",
1937 moduleName: "baz_override_base_rename_resources",
1938 variantName: "android_common_baz_override_base_rename_resources",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001939 apkPath: "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001940 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1941 lineageFlag: "",
1942 overrides: []string{"qux", "foo_no_rename_resources"},
1943 packageFlag: "org.dandroid.bp",
1944 renameResources: true,
1945 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001946 },
1947 }
1948 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001949 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001950
1951 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001952 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001953
1954 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08001955 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001956 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001957 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07001958
1959 // Check the lineage flags
1960 lineageFlag := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001961 android.AssertStringEquals(t, "signing flags", expected.lineageFlag, lineageFlag)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001962
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001963 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08001964 mod := variant.Module().(*AndroidApp)
zhidou198f5892022-02-17 02:33:12 +00001965 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001966
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001967 // Test Overridable property: Logging_parent
1968 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001969 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001970
Liz Kammer1d5983b2020-05-19 19:15:37 +00001971 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001972 res := variant.Output("package-res.apk")
1973 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00001974 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
1975 expectedPackage := expected.packageFlag
1976 if !expected.renameResources {
1977 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00001978 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001979 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001980 }
1981}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07001982
zhidou198f5892022-02-17 02:33:12 +00001983func TestOverrideAndroidAppOverrides(t *testing.T) {
1984 ctx, _ := testJava(
1985 t, `
1986 android_app {
1987 name: "foo",
1988 srcs: ["a.java"],
1989 sdk_version: "current",
1990 overrides: ["qux"]
1991 }
1992
1993 android_app {
1994 name: "bar",
1995 srcs: ["b.java"],
1996 sdk_version: "current",
1997 overrides: ["foo"]
1998 }
1999
2000 override_android_app {
2001 name: "foo_override",
2002 base: "foo",
2003 overrides: ["bar"]
2004 }
2005 `)
2006
2007 expectedVariants := []struct {
2008 name string
2009 moduleName string
2010 variantName string
2011 overrides []string
2012 }{
2013 {
2014 name: "foo",
2015 moduleName: "foo",
2016 variantName: "android_common",
2017 overrides: []string{"qux"},
2018 },
2019 {
2020 name: "bar",
2021 moduleName: "bar",
2022 variantName: "android_common",
2023 overrides: []string{"foo"},
2024 },
2025 {
2026 name: "foo",
2027 moduleName: "foo_override",
2028 variantName: "android_common_foo_override",
2029 overrides: []string{"bar", "foo"},
2030 },
2031 }
2032 for _, expected := range expectedVariants {
2033 variant := ctx.ModuleForTests(expected.name, expected.variantName)
2034
2035 // Check if the overrides field values are correctly aggregated.
2036 mod := variant.Module().(*AndroidApp)
2037 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2038 }
2039}
2040
Jooyung Han01d80d82022-01-08 12:16:32 +09002041func TestOverrideAndroidAppStem(t *testing.T) {
2042 ctx, _ := testJava(t, `
2043 android_app {
2044 name: "foo",
2045 srcs: ["a.java"],
2046 sdk_version: "current",
2047 }
2048 override_android_app {
2049 name: "bar",
2050 base: "foo",
2051 }
2052 override_android_app {
2053 name: "baz",
2054 base: "foo",
2055 stem: "baz_stem",
2056 }
2057 android_app {
2058 name: "foo2",
2059 srcs: ["a.java"],
2060 sdk_version: "current",
2061 stem: "foo2_stem",
2062 }
2063 override_android_app {
2064 name: "bar2",
2065 base: "foo2",
2066 }
2067 override_android_app {
2068 name: "baz2",
2069 base: "foo2",
2070 stem: "baz2_stem",
2071 }
2072 `)
2073 for _, expected := range []struct {
2074 moduleName string
2075 variantName string
2076 apkPath string
2077 }{
2078 {
2079 moduleName: "foo",
2080 variantName: "android_common",
2081 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2082 },
2083 {
2084 moduleName: "foo",
2085 variantName: "android_common_bar",
2086 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2087 },
2088 {
2089 moduleName: "foo",
2090 variantName: "android_common_baz",
2091 apkPath: "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk",
2092 },
2093 {
2094 moduleName: "foo2",
2095 variantName: "android_common",
2096 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2097 },
2098 {
2099 moduleName: "foo2",
2100 variantName: "android_common_bar2",
2101 // Note that this may cause the duplicate output error.
2102 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2103 },
2104 {
2105 moduleName: "foo2",
2106 variantName: "android_common_baz2",
2107 apkPath: "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
2108 },
2109 } {
2110 variant := ctx.ModuleForTests(expected.moduleName, expected.variantName)
2111 variant.Output(expected.apkPath)
2112 }
2113}
2114
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002115func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002116 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002117 android_app {
2118 name: "foo",
2119 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002120 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002121 }
2122
2123 override_android_app {
2124 name: "bar",
2125 base: "foo",
2126 package_name: "org.dandroid.bp",
2127 }
2128
2129 android_test {
2130 name: "baz",
2131 srcs: ["b.java"],
2132 instrumentation_for: "foo",
2133 }
2134
2135 android_test {
2136 name: "qux",
2137 srcs: ["b.java"],
2138 instrumentation_for: "bar",
2139 }
2140 `)
2141
2142 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002143 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002144 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002145 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2146 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2147 }
2148
2149 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002150 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002151 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002152 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2153 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2154 }
2155}
2156
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002157func TestOverrideAndroidTest(t *testing.T) {
2158 ctx, _ := testJava(t, `
2159 android_app {
2160 name: "foo",
2161 srcs: ["a.java"],
2162 package_name: "com.android.foo",
2163 sdk_version: "current",
2164 }
2165
2166 override_android_app {
2167 name: "bar",
2168 base: "foo",
2169 package_name: "com.android.bar",
2170 }
2171
2172 android_test {
2173 name: "foo_test",
2174 srcs: ["b.java"],
2175 instrumentation_for: "foo",
2176 }
2177
2178 override_android_test {
2179 name: "bar_test",
2180 base: "foo_test",
2181 package_name: "com.android.bar.test",
2182 instrumentation_for: "bar",
2183 instrumentation_target_package: "com.android.bar",
2184 }
2185 `)
2186
2187 expectedVariants := []struct {
2188 moduleName string
2189 variantName string
2190 apkPath string
2191 overrides []string
2192 targetVariant string
2193 packageFlag string
2194 targetPackageFlag string
2195 }{
2196 {
2197 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002198 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002199 overrides: nil,
2200 targetVariant: "android_common",
2201 packageFlag: "",
2202 targetPackageFlag: "",
2203 },
2204 {
2205 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002206 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002207 overrides: []string{"foo_test"},
2208 targetVariant: "android_common_bar",
2209 packageFlag: "com.android.bar.test",
2210 targetPackageFlag: "com.android.bar",
2211 },
2212 }
2213 for _, expected := range expectedVariants {
2214 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2215
2216 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002217 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002218
2219 // Check if the overrides field values are correctly aggregated.
2220 mod := variant.Module().(*AndroidTest)
zhidou198f5892022-02-17 02:33:12 +00002221 if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002222 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
zhidou198f5892022-02-17 02:33:12 +00002223 expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002224 }
2225
2226 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01002227 javac := variant.Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002228 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002229 if !strings.Contains(javac.Args["classpath"], turbine) {
2230 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2231 }
2232
2233 // Check aapt2 flags.
2234 res := variant.Output("package-res.apk")
2235 aapt2Flags := res.Args["flags"]
2236 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002237 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002238 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2239 }
2240}
2241
Jaewoong Jung39982342020-01-14 10:27:18 -08002242func TestAndroidTest_FixTestConfig(t *testing.T) {
2243 ctx, _ := testJava(t, `
2244 android_app {
2245 name: "foo",
2246 srcs: ["a.java"],
2247 package_name: "com.android.foo",
2248 sdk_version: "current",
2249 }
2250
2251 android_test {
2252 name: "foo_test",
2253 srcs: ["b.java"],
2254 instrumentation_for: "foo",
2255 }
2256
2257 android_test {
2258 name: "bar_test",
2259 srcs: ["b.java"],
2260 package_name: "com.android.bar.test",
2261 instrumentation_for: "foo",
2262 }
2263
2264 override_android_test {
2265 name: "baz_test",
2266 base: "foo_test",
2267 package_name: "com.android.baz.test",
2268 }
2269 `)
2270
2271 testCases := []struct {
2272 moduleName string
2273 variantName string
2274 expectedFlags []string
2275 }{
2276 {
2277 moduleName: "foo_test",
2278 variantName: "android_common",
2279 },
2280 {
2281 moduleName: "bar_test",
2282 variantName: "android_common",
2283 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002284 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002285 "--package-name com.android.bar.test",
2286 },
2287 },
2288 {
2289 moduleName: "foo_test",
2290 variantName: "android_common_baz_test",
2291 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002292 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002293 "--package-name com.android.baz.test",
2294 "--test-file-name baz_test.apk",
2295 },
2296 },
2297 }
2298
2299 for _, test := range testCases {
2300 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01002301 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08002302
2303 if len(test.expectedFlags) > 0 {
2304 if params.Rule == nil {
2305 t.Errorf("test_config_fixer was expected to run, but didn't")
2306 } else {
2307 for _, flag := range test.expectedFlags {
2308 if !strings.Contains(params.RuleParams.Command, flag) {
2309 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
2310 }
2311 }
2312 }
2313 } else {
2314 if params.Rule != nil {
2315 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
2316 }
2317 }
Jaewoong Jung39982342020-01-14 10:27:18 -08002318 }
2319}
2320
Paul Duffin53a70a42022-01-11 14:35:55 +00002321func TestInstrumentationTargetPrebuilt(t *testing.T) {
2322 bp := `
2323 android_app_import {
2324 name: "foo",
2325 apk: "foo.apk",
2326 presigned: true,
2327 }
2328
2329 android_test {
2330 name: "bar",
2331 srcs: ["a.java"],
2332 instrumentation_for: "foo",
2333 sdk_version: "current",
2334 }
2335 `
2336
2337 android.GroupFixturePreparers(
2338 PrepareForTestWithJavaDefaultModules,
2339 ).ExtendWithErrorHandler(
2340 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
2341 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
2342 RunTestWithBp(t, bp)
2343}
2344
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002345func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002346 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002347 cc_library {
2348 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08002349 sdk_version: "current",
2350 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002351 }
2352
2353 android_test {
2354 name: "stl",
2355 jni_libs: ["libjni"],
2356 compile_multilib: "both",
2357 sdk_version: "current",
2358 stl: "c++_shared",
2359 }
2360
2361 android_test {
2362 name: "system",
2363 jni_libs: ["libjni"],
2364 compile_multilib: "both",
2365 sdk_version: "current",
2366 }
2367 `)
2368
2369 testCases := []struct {
2370 name string
2371 jnis []string
2372 }{
2373 {"stl",
2374 []string{
2375 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07002376 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002377 },
2378 },
2379 {"system",
2380 []string{
2381 "libjni.so",
2382 },
2383 },
2384 }
2385
2386 for _, test := range testCases {
2387 t.Run(test.name, func(t *testing.T) {
2388 app := ctx.ModuleForTests(test.name, "android_common")
2389 jniLibZip := app.Output("jnilibs.zip")
2390 var jnis []string
2391 args := strings.Fields(jniLibZip.Args["jarArgs"])
2392 for i := 0; i < len(args); i++ {
2393 if args[i] == "-f" {
2394 jnis = append(jnis, args[i+1])
2395 i += 1
2396 }
2397 }
2398 jnisJoined := strings.Join(jnis, " ")
2399 for _, jni := range test.jnis {
2400 if !strings.Contains(jnisJoined, jni) {
2401 t.Errorf("missing jni %q in %q", jni, jnis)
2402 }
2403 }
2404 })
2405 }
2406}
Colin Cross50ddcc42019-05-16 12:28:22 -07002407
2408func TestUsesLibraries(t *testing.T) {
2409 bp := `
2410 java_sdk_library {
2411 name: "foo",
2412 srcs: ["a.java"],
2413 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002414 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002415 }
2416
2417 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01002418 name: "qux",
2419 srcs: ["a.java"],
2420 api_packages: ["qux"],
2421 sdk_version: "current",
2422 }
2423
2424 java_sdk_library {
2425 name: "quuz",
2426 srcs: ["a.java"],
2427 api_packages: ["quuz"],
2428 sdk_version: "current",
2429 }
2430
2431 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002432 name: "fred",
2433 srcs: ["a.java"],
2434 api_packages: ["fred"],
2435 sdk_version: "current",
2436 }
2437
2438 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07002439 name: "bar",
2440 srcs: ["a.java"],
2441 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002442 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002443 }
2444
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01002445 java_sdk_library {
2446 name: "runtime-library",
2447 srcs: ["a.java"],
2448 sdk_version: "current",
2449 }
2450
2451 java_library {
2452 name: "static-runtime-helper",
2453 srcs: ["a.java"],
2454 libs: ["runtime-library"],
2455 sdk_version: "current",
2456 }
2457
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002458 java_library {
2459 name: "runtime-required-x",
2460 srcs: ["a.java"],
2461 installable: true,
2462 sdk_version: "current",
2463 }
2464
2465 java_library {
2466 name: "runtime-optional-x",
2467 srcs: ["a.java"],
2468 installable: true,
2469 sdk_version: "current",
2470 }
2471
2472 android_library {
2473 name: "static-x",
2474 uses_libs: ["runtime-required-x"],
2475 optional_uses_libs: ["runtime-optional-x"],
2476 sdk_version: "current",
2477 }
2478
2479 java_library {
2480 name: "runtime-required-y",
2481 srcs: ["a.java"],
2482 installable: true,
2483 sdk_version: "current",
2484 }
2485
2486 java_library {
2487 name: "runtime-optional-y",
2488 srcs: ["a.java"],
2489 installable: true,
2490 sdk_version: "current",
2491 }
2492
2493 java_library {
2494 name: "static-y",
2495 srcs: ["a.java"],
2496 uses_libs: ["runtime-required-y"],
2497 optional_uses_libs: ["runtime-optional-y"],
2498 sdk_version: "current",
2499 }
2500
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002501 // A library that has to use "provides_uses_lib", because:
2502 // - it is not an SDK library
2503 // - its library name is different from its module name
2504 java_library {
2505 name: "non-sdk-lib",
2506 provides_uses_lib: "com.non.sdk.lib",
2507 installable: true,
2508 srcs: ["a.java"],
2509 }
2510
Colin Cross50ddcc42019-05-16 12:28:22 -07002511 android_app {
2512 name: "app",
2513 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002514 libs: [
2515 "qux",
2516 "quuz.stubs"
2517 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002518 static_libs: [
2519 "static-runtime-helper",
2520 // statically linked component libraries should not pull their SDK libraries,
2521 // so "fred" should not be added to class loader context
2522 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002523 "static-x",
2524 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002525 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002526 uses_libs: [
2527 "foo",
2528 "non-sdk-lib"
2529 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002530 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002531 optional_uses_libs: [
2532 "bar",
2533 "baz",
2534 ],
2535 }
2536
2537 android_app_import {
2538 name: "prebuilt",
2539 apk: "prebuilts/apk/app.apk",
2540 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002541 uses_libs: [
2542 "foo",
2543 "non-sdk-lib",
2544 "android.test.runner"
2545 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07002546 optional_uses_libs: [
2547 "bar",
2548 "baz",
2549 ],
2550 }
2551 `
2552
Paul Duffin71ae5942021-03-22 15:36:52 +00002553 result := android.GroupFixturePreparers(
2554 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00002555 PrepareForTestWithJavaSdkLibraryFiles,
2556 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Paul Duffind234b412021-03-12 23:04:46 +00002557 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2558 variables.MissingUsesLibraries = []string{"baz"}
2559 }),
2560 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07002561
Paul Duffind234b412021-03-12 23:04:46 +00002562 app := result.ModuleForTests("app", "android_common")
2563 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07002564
Paul Duffin859fe962020-05-15 10:20:31 +01002565 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01002566 // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be
2567 // propagated from dependencies.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002568 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2569 expectManifestFixerArgs := `--extract-native-libs=true ` +
2570 `--uses-library qux ` +
2571 `--uses-library quuz ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01002572 `--uses-library foo ` +
2573 `--uses-library com.non.sdk.lib ` +
2574 `--uses-library runtime-library ` +
2575 `--uses-library runtime-required-x ` +
2576 `--uses-library runtime-required-y ` +
2577 `--optional-uses-library bar ` +
2578 `--optional-uses-library runtime-optional-x ` +
2579 `--optional-uses-library runtime-optional-y`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00002580 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01002581
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002582 // Test that all libraries are verified (library order matters).
2583 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
2584 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002585 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002586 `--uses-library qux ` +
2587 `--uses-library quuz ` +
2588 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002589 `--uses-library runtime-required-x ` +
2590 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002591 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002592 `--optional-uses-library baz ` +
2593 `--optional-uses-library runtime-optional-x ` +
2594 `--optional-uses-library runtime-optional-y `
Paul Duffind234b412021-03-12 23:04:46 +00002595 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002596
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002597 // Test that all libraries are verified for an APK (library order matters).
2598 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00002599 verifyApkArgs := `--uses-library foo ` +
2600 `--uses-library com.non.sdk.lib ` +
2601 `--uses-library android.test.runner ` +
2602 `--optional-uses-library bar ` +
2603 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002604 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002605
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002606 // Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002607 cmd := app.Rule("dexpreopt").RuleParams.Command
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002608 w := `--target-context-for-sdk any ` +
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002609 `PCL[/system/framework/qux.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002610 `PCL[/system/framework/quuz.jar]#` +
2611 `PCL[/system/framework/foo.jar]#` +
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002612 `PCL[/system/framework/non-sdk-lib.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002613 `PCL[/system/framework/bar.jar]#` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002614 `PCL[/system/framework/runtime-library.jar]#` +
2615 `PCL[/system/framework/runtime-required-x.jar]#` +
2616 `PCL[/system/framework/runtime-optional-x.jar]#` +
2617 `PCL[/system/framework/runtime-required-y.jar]#` +
2618 `PCL[/system/framework/runtime-optional-y.jar] `
Paul Duffind234b412021-03-12 23:04:46 +00002619 android.AssertStringDoesContain(t, "dexpreopt app cmd args", cmd, w)
Colin Cross50ddcc42019-05-16 12:28:22 -07002620
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002621 // Test conditional context for target SDK version 28.
Paul Duffind234b412021-03-12 23:04:46 +00002622 android.AssertStringDoesContain(t, "dexpreopt app cmd 28", cmd,
2623 `--target-context-for-sdk 28`+
2624 ` PCL[/system/framework/org.apache.http.legacy.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002625
2626 // Test conditional context for target SDK version 29.
Paul Duffind234b412021-03-12 23:04:46 +00002627 android.AssertStringDoesContain(t, "dexpreopt app cmd 29", cmd,
2628 `--target-context-for-sdk 29`+
2629 ` PCL[/system/framework/android.hidl.manager-V1.0-java.jar]`+
2630 `#PCL[/system/framework/android.hidl.base-V1.0-java.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002631
2632 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002633 // "android.test.mock" is absent because "android.test.runner" is not used.
Paul Duffind234b412021-03-12 23:04:46 +00002634 android.AssertStringDoesContain(t, "dexpreopt app cmd 30", cmd,
2635 `--target-context-for-sdk 30`+
2636 ` PCL[/system/framework/android.test.base.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002637
Ulya Trafimovichfc24ad32020-08-19 16:32:54 +01002638 cmd = prebuilt.Rule("dexpreopt").RuleParams.Command
Paul Duffind234b412021-03-12 23:04:46 +00002639 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd", cmd,
2640 `--target-context-for-sdk any`+
2641 ` PCL[/system/framework/foo.jar]`+
2642 `#PCL[/system/framework/non-sdk-lib.jar]`+
2643 `#PCL[/system/framework/android.test.runner.jar]`+
2644 `#PCL[/system/framework/bar.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002645
2646 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002647 // "android.test.mock" is present because "android.test.runner" is used.
Paul Duffind234b412021-03-12 23:04:46 +00002648 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd 30", cmd,
2649 `--target-context-for-sdk 30`+
2650 ` PCL[/system/framework/android.test.base.jar]`+
2651 `#PCL[/system/framework/android.test.mock.jar] `)
Colin Cross50ddcc42019-05-16 12:28:22 -07002652}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002653
Ulya Trafimovich9023b022021-03-22 16:02:28 +00002654func TestDexpreoptBcp(t *testing.T) {
2655 bp := `
2656 java_sdk_library {
2657 name: "foo",
2658 srcs: ["a.java"],
2659 api_packages: ["foo"],
2660 sdk_version: "current",
2661 }
2662
2663 java_sdk_library {
2664 name: "bar",
2665 srcs: ["a.java"],
2666 api_packages: ["bar"],
2667 permitted_packages: ["bar"],
2668 sdk_version: "current",
2669 }
2670
2671 android_app {
2672 name: "app",
2673 srcs: ["a.java"],
2674 sdk_version: "current",
2675 }
2676 `
2677
2678 testCases := []struct {
2679 name string
2680 with bool
2681 expect string
2682 }{
2683 {
2684 name: "with updatable bcp",
2685 with: true,
2686 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
2687 },
2688 {
2689 name: "without updatable bcp",
2690 with: false,
2691 expect: "/system/framework/foo.jar",
2692 },
2693 }
2694
2695 for _, test := range testCases {
2696 t.Run(test.name, func(t *testing.T) {
2697 result := android.GroupFixturePreparers(
2698 prepareForJavaTest,
2699 PrepareForTestWithJavaSdkLibraryFiles,
2700 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
2701 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01002702 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00002703 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
2704 ).RunTestWithBp(t, bp)
2705
2706 app := result.ModuleForTests("app", "android_common")
2707 cmd := app.Rule("dexpreopt").RuleParams.Command
2708 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
2709 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
2710 })
2711 }
2712}
2713
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002714func TestCodelessApp(t *testing.T) {
2715 testCases := []struct {
2716 name string
2717 bp string
2718 noCode bool
2719 }{
2720 {
2721 name: "normal",
2722 bp: `
2723 android_app {
2724 name: "foo",
2725 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002726 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002727 }
2728 `,
2729 noCode: false,
2730 },
2731 {
2732 name: "app without sources",
2733 bp: `
2734 android_app {
2735 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002736 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002737 }
2738 `,
2739 noCode: true,
2740 },
2741 {
2742 name: "app with libraries",
2743 bp: `
2744 android_app {
2745 name: "foo",
2746 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002747 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002748 }
2749
2750 java_library {
2751 name: "lib",
2752 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002753 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002754 }
2755 `,
2756 noCode: false,
2757 },
2758 {
2759 name: "app with sourceless libraries",
2760 bp: `
2761 android_app {
2762 name: "foo",
2763 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002764 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002765 }
2766
2767 java_library {
2768 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002769 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002770 }
2771 `,
2772 // TODO(jungjw): this should probably be true
2773 noCode: false,
2774 },
2775 }
2776
2777 for _, test := range testCases {
2778 t.Run(test.name, func(t *testing.T) {
2779 ctx := testApp(t, test.bp)
2780
2781 foo := ctx.ModuleForTests("foo", "android_common")
2782 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2783 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
2784 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
2785 }
2786 })
2787 }
2788}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002789
Colin Cross53a87f52019-06-25 13:35:30 -07002790func TestUncompressDex(t *testing.T) {
2791 testCases := []struct {
2792 name string
2793 bp string
2794
2795 uncompressedPlatform bool
2796 uncompressedUnbundled bool
2797 }{
2798 {
2799 name: "normal",
2800 bp: `
2801 android_app {
2802 name: "foo",
2803 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002804 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002805 }
2806 `,
2807 uncompressedPlatform: true,
2808 uncompressedUnbundled: false,
2809 },
2810 {
2811 name: "use_embedded_dex",
2812 bp: `
2813 android_app {
2814 name: "foo",
2815 use_embedded_dex: true,
2816 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002817 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002818 }
2819 `,
2820 uncompressedPlatform: true,
2821 uncompressedUnbundled: true,
2822 },
2823 {
2824 name: "privileged",
2825 bp: `
2826 android_app {
2827 name: "foo",
2828 privileged: true,
2829 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002830 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002831 }
2832 `,
2833 uncompressedPlatform: true,
2834 uncompressedUnbundled: true,
2835 },
David Srbeckye033cba2020-05-20 22:20:28 +01002836 {
2837 name: "normal_uncompress_dex_true",
2838 bp: `
2839 android_app {
2840 name: "foo",
2841 srcs: ["a.java"],
2842 sdk_version: "current",
2843 uncompress_dex: true,
2844 }
2845 `,
2846 uncompressedPlatform: true,
2847 uncompressedUnbundled: true,
2848 },
2849 {
2850 name: "normal_uncompress_dex_false",
2851 bp: `
2852 android_app {
2853 name: "foo",
2854 srcs: ["a.java"],
2855 sdk_version: "current",
2856 uncompress_dex: false,
2857 }
2858 `,
2859 uncompressedPlatform: false,
2860 uncompressedUnbundled: false,
2861 },
Colin Cross53a87f52019-06-25 13:35:30 -07002862 }
2863
2864 test := func(t *testing.T, bp string, want bool, unbundled bool) {
2865 t.Helper()
2866
Paul Duffin71ae5942021-03-22 15:36:52 +00002867 result := android.GroupFixturePreparers(
2868 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00002869 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00002870 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2871 if unbundled {
2872 variables.Unbundled_build = proptools.BoolPtr(true)
2873 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
2874 }
2875 }),
2876 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07002877
Paul Duffincdb88a92021-03-14 00:36:50 +00002878 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07002879 dex := foo.Rule("r8")
2880 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
2881 aligned := foo.MaybeRule("zipalign").Rule != nil
2882
Paul Duffincdb88a92021-03-14 00:36:50 +00002883 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07002884
Paul Duffincdb88a92021-03-14 00:36:50 +00002885 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07002886 }
2887
2888 for _, tt := range testCases {
2889 t.Run(tt.name, func(t *testing.T) {
2890 t.Run("platform", func(t *testing.T) {
2891 test(t, tt.bp, tt.uncompressedPlatform, false)
2892 })
2893 t.Run("unbundled", func(t *testing.T) {
2894 test(t, tt.bp, tt.uncompressedUnbundled, true)
2895 })
2896 })
2897 }
2898}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002899
2900func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
2901 if expectedValue != "" {
2902 expectedFlag := "--" + flagName + " " + expectedValue
2903 if !strings.Contains(aapt2Flags, expectedFlag) {
2904 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
2905 }
2906 } else {
2907 unexpectedFlag := "--" + flagName
2908 if strings.Contains(aapt2Flags, unexpectedFlag) {
2909 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
2910 }
2911 }
2912}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08002913
Cole Faust9a631312020-10-22 21:05:24 +00002914func TestExportedProguardFlagFiles(t *testing.T) {
2915 ctx, _ := testJava(t, `
2916 android_app {
2917 name: "foo",
2918 sdk_version: "current",
2919 static_libs: ["lib1"],
2920 }
2921
2922 android_library {
2923 name: "lib1",
2924 sdk_version: "current",
2925 optimize: {
2926 proguard_flags_files: ["lib1proguard.cfg"],
2927 }
2928 }
2929 `)
2930
2931 m := ctx.ModuleForTests("foo", "android_common")
2932 hasLib1Proguard := false
2933 for _, s := range m.Rule("java.r8").Implicits.Strings() {
2934 if s == "lib1proguard.cfg" {
2935 hasLib1Proguard = true
2936 break
2937 }
2938 }
2939
2940 if !hasLib1Proguard {
2941 t.Errorf("App does not use library proguard config")
2942 }
2943}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00002944
2945func TestTargetSdkVersionManifestFixer(t *testing.T) {
2946 platform_sdk_codename := "Tiramisu"
2947 testCases := []struct {
2948 name string
2949 targetSdkVersionInBp string
2950 targetSdkVersionExpected string
2951 unbundledBuild bool
2952 }{
2953 {
2954 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
2955 targetSdkVersionInBp: "30",
2956 targetSdkVersionExpected: "30",
2957 unbundledBuild: false,
2958 },
2959 {
2960 name: "Unbundled build: Android.bp has targetSdkVersion",
2961 targetSdkVersionInBp: "30",
2962 targetSdkVersionExpected: "30",
2963 unbundledBuild: true,
2964 },
2965 {
2966 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
2967 targetSdkVersionInBp: platform_sdk_codename,
2968 targetSdkVersionExpected: platform_sdk_codename,
2969 unbundledBuild: false,
2970 },
2971 {
2972 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
2973 targetSdkVersionInBp: platform_sdk_codename,
2974 targetSdkVersionExpected: "10000",
2975 unbundledBuild: true,
2976 },
2977
2978 {
2979 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
2980 targetSdkVersionExpected: platform_sdk_codename,
2981 unbundledBuild: false,
2982 },
2983 {
2984 name: "Unbundled build: Android.bp has no targetSdkVersion",
2985 targetSdkVersionExpected: "10000",
2986 unbundledBuild: true,
2987 },
2988 }
2989 for _, testCase := range testCases {
2990 bp := fmt.Sprintf(`
2991 android_app {
2992 name: "foo",
2993 sdk_version: "current",
2994 target_sdk_version: "%v",
2995 }
2996 `, testCase.targetSdkVersionInBp)
2997 fixture := android.GroupFixturePreparers(
2998 prepareForJavaTest,
2999 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3000 // explicitly set platform_sdk_codename to make the test deterministic
3001 variables.Platform_sdk_codename = &platform_sdk_codename
3002 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3003 // create a non-empty list if unbundledBuild==true
3004 if testCase.unbundledBuild {
3005 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3006 }
3007 }),
3008 )
3009
3010 result := fixture.RunTestWithBp(t, bp)
3011 foo := result.ModuleForTests("foo", "android_common")
3012
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003013 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3014 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003015 }
3016}
Colin Cross412436f2022-04-07 17:40:07 -07003017
3018func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
3019 result := android.GroupFixturePreparers(
3020 PrepareForTestWithJavaDefaultModules,
3021 android.PrepareForTestWithAllowMissingDependencies,
3022 android.PrepareForTestWithAndroidMk,
3023 ).RunTestWithBp(t, `
3024 android_app {
3025 name: "foo",
3026 srcs: ["a.java"],
3027 certificate: ":missing_certificate",
3028 sdk_version: "current",
3029 }`)
3030
3031 foo := result.ModuleForTests("foo", "android_common")
3032 fooApk := foo.Output("foo.apk")
3033 if fooApk.Rule != android.ErrorRule {
3034 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
3035 }
3036 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
3037}