blob: 6a4508cd655757a66f4f2888652afc47272f69af [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)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001965 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.appProperties.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
Jooyung Han01d80d82022-01-08 12:16:32 +09001983func TestOverrideAndroidAppStem(t *testing.T) {
1984 ctx, _ := testJava(t, `
1985 android_app {
1986 name: "foo",
1987 srcs: ["a.java"],
1988 sdk_version: "current",
1989 }
1990 override_android_app {
1991 name: "bar",
1992 base: "foo",
1993 }
1994 override_android_app {
1995 name: "baz",
1996 base: "foo",
1997 stem: "baz_stem",
1998 }
1999 android_app {
2000 name: "foo2",
2001 srcs: ["a.java"],
2002 sdk_version: "current",
2003 stem: "foo2_stem",
2004 }
2005 override_android_app {
2006 name: "bar2",
2007 base: "foo2",
2008 }
2009 override_android_app {
2010 name: "baz2",
2011 base: "foo2",
2012 stem: "baz2_stem",
2013 }
2014 `)
2015 for _, expected := range []struct {
2016 moduleName string
2017 variantName string
2018 apkPath string
2019 }{
2020 {
2021 moduleName: "foo",
2022 variantName: "android_common",
2023 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2024 },
2025 {
2026 moduleName: "foo",
2027 variantName: "android_common_bar",
2028 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2029 },
2030 {
2031 moduleName: "foo",
2032 variantName: "android_common_baz",
2033 apkPath: "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk",
2034 },
2035 {
2036 moduleName: "foo2",
2037 variantName: "android_common",
2038 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2039 },
2040 {
2041 moduleName: "foo2",
2042 variantName: "android_common_bar2",
2043 // Note that this may cause the duplicate output error.
2044 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2045 },
2046 {
2047 moduleName: "foo2",
2048 variantName: "android_common_baz2",
2049 apkPath: "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
2050 },
2051 } {
2052 variant := ctx.ModuleForTests(expected.moduleName, expected.variantName)
2053 variant.Output(expected.apkPath)
2054 }
2055}
2056
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002057func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002058 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002059 android_app {
2060 name: "foo",
2061 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002062 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002063 }
2064
2065 override_android_app {
2066 name: "bar",
2067 base: "foo",
2068 package_name: "org.dandroid.bp",
2069 }
2070
2071 android_test {
2072 name: "baz",
2073 srcs: ["b.java"],
2074 instrumentation_for: "foo",
2075 }
2076
2077 android_test {
2078 name: "qux",
2079 srcs: ["b.java"],
2080 instrumentation_for: "bar",
2081 }
2082 `)
2083
2084 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002085 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002086 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002087 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2088 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2089 }
2090
2091 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002092 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002093 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002094 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2095 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2096 }
2097}
2098
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002099func TestOverrideAndroidTest(t *testing.T) {
2100 ctx, _ := testJava(t, `
2101 android_app {
2102 name: "foo",
2103 srcs: ["a.java"],
2104 package_name: "com.android.foo",
2105 sdk_version: "current",
2106 }
2107
2108 override_android_app {
2109 name: "bar",
2110 base: "foo",
2111 package_name: "com.android.bar",
2112 }
2113
2114 android_test {
2115 name: "foo_test",
2116 srcs: ["b.java"],
2117 instrumentation_for: "foo",
2118 }
2119
2120 override_android_test {
2121 name: "bar_test",
2122 base: "foo_test",
2123 package_name: "com.android.bar.test",
2124 instrumentation_for: "bar",
2125 instrumentation_target_package: "com.android.bar",
2126 }
2127 `)
2128
2129 expectedVariants := []struct {
2130 moduleName string
2131 variantName string
2132 apkPath string
2133 overrides []string
2134 targetVariant string
2135 packageFlag string
2136 targetPackageFlag string
2137 }{
2138 {
2139 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002140 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002141 overrides: nil,
2142 targetVariant: "android_common",
2143 packageFlag: "",
2144 targetPackageFlag: "",
2145 },
2146 {
2147 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002148 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002149 overrides: []string{"foo_test"},
2150 targetVariant: "android_common_bar",
2151 packageFlag: "com.android.bar.test",
2152 targetPackageFlag: "com.android.bar",
2153 },
2154 }
2155 for _, expected := range expectedVariants {
2156 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2157
2158 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002159 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002160
2161 // Check if the overrides field values are correctly aggregated.
2162 mod := variant.Module().(*AndroidTest)
2163 if !reflect.DeepEqual(expected.overrides, mod.appProperties.Overrides) {
2164 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
2165 expected.overrides, mod.appProperties.Overrides)
2166 }
2167
2168 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01002169 javac := variant.Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002170 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002171 if !strings.Contains(javac.Args["classpath"], turbine) {
2172 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2173 }
2174
2175 // Check aapt2 flags.
2176 res := variant.Output("package-res.apk")
2177 aapt2Flags := res.Args["flags"]
2178 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002179 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002180 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2181 }
2182}
2183
Jaewoong Jung39982342020-01-14 10:27:18 -08002184func TestAndroidTest_FixTestConfig(t *testing.T) {
2185 ctx, _ := testJava(t, `
2186 android_app {
2187 name: "foo",
2188 srcs: ["a.java"],
2189 package_name: "com.android.foo",
2190 sdk_version: "current",
2191 }
2192
2193 android_test {
2194 name: "foo_test",
2195 srcs: ["b.java"],
2196 instrumentation_for: "foo",
2197 }
2198
2199 android_test {
2200 name: "bar_test",
2201 srcs: ["b.java"],
2202 package_name: "com.android.bar.test",
2203 instrumentation_for: "foo",
2204 }
2205
2206 override_android_test {
2207 name: "baz_test",
2208 base: "foo_test",
2209 package_name: "com.android.baz.test",
2210 }
2211 `)
2212
2213 testCases := []struct {
2214 moduleName string
2215 variantName string
2216 expectedFlags []string
2217 }{
2218 {
2219 moduleName: "foo_test",
2220 variantName: "android_common",
2221 },
2222 {
2223 moduleName: "bar_test",
2224 variantName: "android_common",
2225 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002226 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002227 "--package-name com.android.bar.test",
2228 },
2229 },
2230 {
2231 moduleName: "foo_test",
2232 variantName: "android_common_baz_test",
2233 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002234 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002235 "--package-name com.android.baz.test",
2236 "--test-file-name baz_test.apk",
2237 },
2238 },
2239 }
2240
2241 for _, test := range testCases {
2242 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01002243 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08002244
2245 if len(test.expectedFlags) > 0 {
2246 if params.Rule == nil {
2247 t.Errorf("test_config_fixer was expected to run, but didn't")
2248 } else {
2249 for _, flag := range test.expectedFlags {
2250 if !strings.Contains(params.RuleParams.Command, flag) {
2251 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
2252 }
2253 }
2254 }
2255 } else {
2256 if params.Rule != nil {
2257 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
2258 }
2259 }
Jaewoong Jung39982342020-01-14 10:27:18 -08002260 }
2261}
2262
Paul Duffin53a70a42022-01-11 14:35:55 +00002263func TestInstrumentationTargetPrebuilt(t *testing.T) {
2264 bp := `
2265 android_app_import {
2266 name: "foo",
2267 apk: "foo.apk",
2268 presigned: true,
2269 }
2270
2271 android_test {
2272 name: "bar",
2273 srcs: ["a.java"],
2274 instrumentation_for: "foo",
2275 sdk_version: "current",
2276 }
2277 `
2278
2279 android.GroupFixturePreparers(
2280 PrepareForTestWithJavaDefaultModules,
2281 ).ExtendWithErrorHandler(
2282 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
2283 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
2284 RunTestWithBp(t, bp)
2285}
2286
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002287func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002288 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002289 cc_library {
2290 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08002291 sdk_version: "current",
2292 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002293 }
2294
2295 android_test {
2296 name: "stl",
2297 jni_libs: ["libjni"],
2298 compile_multilib: "both",
2299 sdk_version: "current",
2300 stl: "c++_shared",
2301 }
2302
2303 android_test {
2304 name: "system",
2305 jni_libs: ["libjni"],
2306 compile_multilib: "both",
2307 sdk_version: "current",
2308 }
2309 `)
2310
2311 testCases := []struct {
2312 name string
2313 jnis []string
2314 }{
2315 {"stl",
2316 []string{
2317 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07002318 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002319 },
2320 },
2321 {"system",
2322 []string{
2323 "libjni.so",
2324 },
2325 },
2326 }
2327
2328 for _, test := range testCases {
2329 t.Run(test.name, func(t *testing.T) {
2330 app := ctx.ModuleForTests(test.name, "android_common")
2331 jniLibZip := app.Output("jnilibs.zip")
2332 var jnis []string
2333 args := strings.Fields(jniLibZip.Args["jarArgs"])
2334 for i := 0; i < len(args); i++ {
2335 if args[i] == "-f" {
2336 jnis = append(jnis, args[i+1])
2337 i += 1
2338 }
2339 }
2340 jnisJoined := strings.Join(jnis, " ")
2341 for _, jni := range test.jnis {
2342 if !strings.Contains(jnisJoined, jni) {
2343 t.Errorf("missing jni %q in %q", jni, jnis)
2344 }
2345 }
2346 })
2347 }
2348}
Colin Cross50ddcc42019-05-16 12:28:22 -07002349
2350func TestUsesLibraries(t *testing.T) {
2351 bp := `
2352 java_sdk_library {
2353 name: "foo",
2354 srcs: ["a.java"],
2355 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002356 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002357 }
2358
2359 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01002360 name: "qux",
2361 srcs: ["a.java"],
2362 api_packages: ["qux"],
2363 sdk_version: "current",
2364 }
2365
2366 java_sdk_library {
2367 name: "quuz",
2368 srcs: ["a.java"],
2369 api_packages: ["quuz"],
2370 sdk_version: "current",
2371 }
2372
2373 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002374 name: "fred",
2375 srcs: ["a.java"],
2376 api_packages: ["fred"],
2377 sdk_version: "current",
2378 }
2379
2380 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07002381 name: "bar",
2382 srcs: ["a.java"],
2383 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002384 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002385 }
2386
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01002387 java_sdk_library {
2388 name: "runtime-library",
2389 srcs: ["a.java"],
2390 sdk_version: "current",
2391 }
2392
2393 java_library {
2394 name: "static-runtime-helper",
2395 srcs: ["a.java"],
2396 libs: ["runtime-library"],
2397 sdk_version: "current",
2398 }
2399
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002400 java_library {
2401 name: "runtime-required-x",
2402 srcs: ["a.java"],
2403 installable: true,
2404 sdk_version: "current",
2405 }
2406
2407 java_library {
2408 name: "runtime-optional-x",
2409 srcs: ["a.java"],
2410 installable: true,
2411 sdk_version: "current",
2412 }
2413
2414 android_library {
2415 name: "static-x",
2416 uses_libs: ["runtime-required-x"],
2417 optional_uses_libs: ["runtime-optional-x"],
2418 sdk_version: "current",
2419 }
2420
2421 java_library {
2422 name: "runtime-required-y",
2423 srcs: ["a.java"],
2424 installable: true,
2425 sdk_version: "current",
2426 }
2427
2428 java_library {
2429 name: "runtime-optional-y",
2430 srcs: ["a.java"],
2431 installable: true,
2432 sdk_version: "current",
2433 }
2434
2435 java_library {
2436 name: "static-y",
2437 srcs: ["a.java"],
2438 uses_libs: ["runtime-required-y"],
2439 optional_uses_libs: ["runtime-optional-y"],
2440 sdk_version: "current",
2441 }
2442
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002443 // A library that has to use "provides_uses_lib", because:
2444 // - it is not an SDK library
2445 // - its library name is different from its module name
2446 java_library {
2447 name: "non-sdk-lib",
2448 provides_uses_lib: "com.non.sdk.lib",
2449 installable: true,
2450 srcs: ["a.java"],
2451 }
2452
Colin Cross50ddcc42019-05-16 12:28:22 -07002453 android_app {
2454 name: "app",
2455 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002456 libs: [
2457 "qux",
2458 "quuz.stubs"
2459 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002460 static_libs: [
2461 "static-runtime-helper",
2462 // statically linked component libraries should not pull their SDK libraries,
2463 // so "fred" should not be added to class loader context
2464 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002465 "static-x",
2466 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002467 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002468 uses_libs: [
2469 "foo",
2470 "non-sdk-lib"
2471 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002472 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002473 optional_uses_libs: [
2474 "bar",
2475 "baz",
2476 ],
2477 }
2478
2479 android_app_import {
2480 name: "prebuilt",
2481 apk: "prebuilts/apk/app.apk",
2482 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002483 uses_libs: [
2484 "foo",
2485 "non-sdk-lib",
2486 "android.test.runner"
2487 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07002488 optional_uses_libs: [
2489 "bar",
2490 "baz",
2491 ],
2492 }
2493 `
2494
Paul Duffin71ae5942021-03-22 15:36:52 +00002495 result := android.GroupFixturePreparers(
2496 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00002497 PrepareForTestWithJavaSdkLibraryFiles,
2498 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Paul Duffind234b412021-03-12 23:04:46 +00002499 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2500 variables.MissingUsesLibraries = []string{"baz"}
2501 }),
2502 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07002503
Paul Duffind234b412021-03-12 23:04:46 +00002504 app := result.ModuleForTests("app", "android_common")
2505 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07002506
Paul Duffin859fe962020-05-15 10:20:31 +01002507 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002508 // This should not include explicit `uses_libs`/`optional_uses_libs` entries.
2509 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2510 expectManifestFixerArgs := `--extract-native-libs=true ` +
2511 `--uses-library qux ` +
2512 `--uses-library quuz ` +
Ulya Trafimovich0b1c70e2021-08-20 15:39:12 +01002513 `--uses-library runtime-library`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00002514 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01002515
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002516 // Test that all libraries are verified (library order matters).
2517 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
2518 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002519 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002520 `--uses-library qux ` +
2521 `--uses-library quuz ` +
2522 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002523 `--uses-library runtime-required-x ` +
2524 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002525 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002526 `--optional-uses-library baz ` +
2527 `--optional-uses-library runtime-optional-x ` +
2528 `--optional-uses-library runtime-optional-y `
Paul Duffind234b412021-03-12 23:04:46 +00002529 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002530
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002531 // Test that all libraries are verified for an APK (library order matters).
2532 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00002533 verifyApkArgs := `--uses-library foo ` +
2534 `--uses-library com.non.sdk.lib ` +
2535 `--uses-library android.test.runner ` +
2536 `--optional-uses-library bar ` +
2537 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002538 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002539
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002540 // Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002541 cmd := app.Rule("dexpreopt").RuleParams.Command
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002542 w := `--target-context-for-sdk any ` +
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002543 `PCL[/system/framework/qux.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002544 `PCL[/system/framework/quuz.jar]#` +
2545 `PCL[/system/framework/foo.jar]#` +
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002546 `PCL[/system/framework/non-sdk-lib.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002547 `PCL[/system/framework/bar.jar]#` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002548 `PCL[/system/framework/runtime-library.jar]#` +
2549 `PCL[/system/framework/runtime-required-x.jar]#` +
2550 `PCL[/system/framework/runtime-optional-x.jar]#` +
2551 `PCL[/system/framework/runtime-required-y.jar]#` +
2552 `PCL[/system/framework/runtime-optional-y.jar] `
Paul Duffind234b412021-03-12 23:04:46 +00002553 android.AssertStringDoesContain(t, "dexpreopt app cmd args", cmd, w)
Colin Cross50ddcc42019-05-16 12:28:22 -07002554
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002555 // Test conditional context for target SDK version 28.
Paul Duffind234b412021-03-12 23:04:46 +00002556 android.AssertStringDoesContain(t, "dexpreopt app cmd 28", cmd,
2557 `--target-context-for-sdk 28`+
2558 ` PCL[/system/framework/org.apache.http.legacy.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002559
2560 // Test conditional context for target SDK version 29.
Paul Duffind234b412021-03-12 23:04:46 +00002561 android.AssertStringDoesContain(t, "dexpreopt app cmd 29", cmd,
2562 `--target-context-for-sdk 29`+
2563 ` PCL[/system/framework/android.hidl.manager-V1.0-java.jar]`+
2564 `#PCL[/system/framework/android.hidl.base-V1.0-java.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002565
2566 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002567 // "android.test.mock" is absent because "android.test.runner" is not used.
Paul Duffind234b412021-03-12 23:04:46 +00002568 android.AssertStringDoesContain(t, "dexpreopt app cmd 30", cmd,
2569 `--target-context-for-sdk 30`+
2570 ` PCL[/system/framework/android.test.base.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002571
Ulya Trafimovichfc24ad32020-08-19 16:32:54 +01002572 cmd = prebuilt.Rule("dexpreopt").RuleParams.Command
Paul Duffind234b412021-03-12 23:04:46 +00002573 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd", cmd,
2574 `--target-context-for-sdk any`+
2575 ` PCL[/system/framework/foo.jar]`+
2576 `#PCL[/system/framework/non-sdk-lib.jar]`+
2577 `#PCL[/system/framework/android.test.runner.jar]`+
2578 `#PCL[/system/framework/bar.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002579
2580 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002581 // "android.test.mock" is present because "android.test.runner" is used.
Paul Duffind234b412021-03-12 23:04:46 +00002582 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd 30", cmd,
2583 `--target-context-for-sdk 30`+
2584 ` PCL[/system/framework/android.test.base.jar]`+
2585 `#PCL[/system/framework/android.test.mock.jar] `)
Colin Cross50ddcc42019-05-16 12:28:22 -07002586}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002587
Ulya Trafimovich9023b022021-03-22 16:02:28 +00002588func TestDexpreoptBcp(t *testing.T) {
2589 bp := `
2590 java_sdk_library {
2591 name: "foo",
2592 srcs: ["a.java"],
2593 api_packages: ["foo"],
2594 sdk_version: "current",
2595 }
2596
2597 java_sdk_library {
2598 name: "bar",
2599 srcs: ["a.java"],
2600 api_packages: ["bar"],
2601 permitted_packages: ["bar"],
2602 sdk_version: "current",
2603 }
2604
2605 android_app {
2606 name: "app",
2607 srcs: ["a.java"],
2608 sdk_version: "current",
2609 }
2610 `
2611
2612 testCases := []struct {
2613 name string
2614 with bool
2615 expect string
2616 }{
2617 {
2618 name: "with updatable bcp",
2619 with: true,
2620 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
2621 },
2622 {
2623 name: "without updatable bcp",
2624 with: false,
2625 expect: "/system/framework/foo.jar",
2626 },
2627 }
2628
2629 for _, test := range testCases {
2630 t.Run(test.name, func(t *testing.T) {
2631 result := android.GroupFixturePreparers(
2632 prepareForJavaTest,
2633 PrepareForTestWithJavaSdkLibraryFiles,
2634 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
2635 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01002636 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00002637 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
2638 ).RunTestWithBp(t, bp)
2639
2640 app := result.ModuleForTests("app", "android_common")
2641 cmd := app.Rule("dexpreopt").RuleParams.Command
2642 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
2643 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
2644 })
2645 }
2646}
2647
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002648func TestCodelessApp(t *testing.T) {
2649 testCases := []struct {
2650 name string
2651 bp string
2652 noCode bool
2653 }{
2654 {
2655 name: "normal",
2656 bp: `
2657 android_app {
2658 name: "foo",
2659 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002660 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002661 }
2662 `,
2663 noCode: false,
2664 },
2665 {
2666 name: "app without sources",
2667 bp: `
2668 android_app {
2669 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002670 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002671 }
2672 `,
2673 noCode: true,
2674 },
2675 {
2676 name: "app with libraries",
2677 bp: `
2678 android_app {
2679 name: "foo",
2680 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002681 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002682 }
2683
2684 java_library {
2685 name: "lib",
2686 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002687 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002688 }
2689 `,
2690 noCode: false,
2691 },
2692 {
2693 name: "app with sourceless libraries",
2694 bp: `
2695 android_app {
2696 name: "foo",
2697 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002698 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002699 }
2700
2701 java_library {
2702 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002703 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002704 }
2705 `,
2706 // TODO(jungjw): this should probably be true
2707 noCode: false,
2708 },
2709 }
2710
2711 for _, test := range testCases {
2712 t.Run(test.name, func(t *testing.T) {
2713 ctx := testApp(t, test.bp)
2714
2715 foo := ctx.ModuleForTests("foo", "android_common")
2716 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2717 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
2718 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
2719 }
2720 })
2721 }
2722}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002723
Colin Cross53a87f52019-06-25 13:35:30 -07002724func TestUncompressDex(t *testing.T) {
2725 testCases := []struct {
2726 name string
2727 bp string
2728
2729 uncompressedPlatform bool
2730 uncompressedUnbundled bool
2731 }{
2732 {
2733 name: "normal",
2734 bp: `
2735 android_app {
2736 name: "foo",
2737 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002738 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002739 }
2740 `,
2741 uncompressedPlatform: true,
2742 uncompressedUnbundled: false,
2743 },
2744 {
2745 name: "use_embedded_dex",
2746 bp: `
2747 android_app {
2748 name: "foo",
2749 use_embedded_dex: true,
2750 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002751 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002752 }
2753 `,
2754 uncompressedPlatform: true,
2755 uncompressedUnbundled: true,
2756 },
2757 {
2758 name: "privileged",
2759 bp: `
2760 android_app {
2761 name: "foo",
2762 privileged: true,
2763 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002764 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002765 }
2766 `,
2767 uncompressedPlatform: true,
2768 uncompressedUnbundled: true,
2769 },
David Srbeckye033cba2020-05-20 22:20:28 +01002770 {
2771 name: "normal_uncompress_dex_true",
2772 bp: `
2773 android_app {
2774 name: "foo",
2775 srcs: ["a.java"],
2776 sdk_version: "current",
2777 uncompress_dex: true,
2778 }
2779 `,
2780 uncompressedPlatform: true,
2781 uncompressedUnbundled: true,
2782 },
2783 {
2784 name: "normal_uncompress_dex_false",
2785 bp: `
2786 android_app {
2787 name: "foo",
2788 srcs: ["a.java"],
2789 sdk_version: "current",
2790 uncompress_dex: false,
2791 }
2792 `,
2793 uncompressedPlatform: false,
2794 uncompressedUnbundled: false,
2795 },
Colin Cross53a87f52019-06-25 13:35:30 -07002796 }
2797
2798 test := func(t *testing.T, bp string, want bool, unbundled bool) {
2799 t.Helper()
2800
Paul Duffin71ae5942021-03-22 15:36:52 +00002801 result := android.GroupFixturePreparers(
2802 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00002803 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00002804 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2805 if unbundled {
2806 variables.Unbundled_build = proptools.BoolPtr(true)
2807 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
2808 }
2809 }),
2810 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07002811
Paul Duffincdb88a92021-03-14 00:36:50 +00002812 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07002813 dex := foo.Rule("r8")
2814 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
2815 aligned := foo.MaybeRule("zipalign").Rule != nil
2816
Paul Duffincdb88a92021-03-14 00:36:50 +00002817 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07002818
Paul Duffincdb88a92021-03-14 00:36:50 +00002819 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07002820 }
2821
2822 for _, tt := range testCases {
2823 t.Run(tt.name, func(t *testing.T) {
2824 t.Run("platform", func(t *testing.T) {
2825 test(t, tt.bp, tt.uncompressedPlatform, false)
2826 })
2827 t.Run("unbundled", func(t *testing.T) {
2828 test(t, tt.bp, tt.uncompressedUnbundled, true)
2829 })
2830 })
2831 }
2832}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002833
2834func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
2835 if expectedValue != "" {
2836 expectedFlag := "--" + flagName + " " + expectedValue
2837 if !strings.Contains(aapt2Flags, expectedFlag) {
2838 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
2839 }
2840 } else {
2841 unexpectedFlag := "--" + flagName
2842 if strings.Contains(aapt2Flags, unexpectedFlag) {
2843 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
2844 }
2845 }
2846}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08002847
Cole Faust9a631312020-10-22 21:05:24 +00002848func TestExportedProguardFlagFiles(t *testing.T) {
2849 ctx, _ := testJava(t, `
2850 android_app {
2851 name: "foo",
2852 sdk_version: "current",
2853 static_libs: ["lib1"],
2854 }
2855
2856 android_library {
2857 name: "lib1",
2858 sdk_version: "current",
2859 optimize: {
2860 proguard_flags_files: ["lib1proguard.cfg"],
2861 }
2862 }
2863 `)
2864
2865 m := ctx.ModuleForTests("foo", "android_common")
2866 hasLib1Proguard := false
2867 for _, s := range m.Rule("java.r8").Implicits.Strings() {
2868 if s == "lib1proguard.cfg" {
2869 hasLib1Proguard = true
2870 break
2871 }
2872 }
2873
2874 if !hasLib1Proguard {
2875 t.Errorf("App does not use library proguard config")
2876 }
2877}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00002878
2879func TestTargetSdkVersionManifestFixer(t *testing.T) {
2880 platform_sdk_codename := "Tiramisu"
2881 testCases := []struct {
2882 name string
2883 targetSdkVersionInBp string
2884 targetSdkVersionExpected string
2885 unbundledBuild bool
2886 }{
2887 {
2888 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
2889 targetSdkVersionInBp: "30",
2890 targetSdkVersionExpected: "30",
2891 unbundledBuild: false,
2892 },
2893 {
2894 name: "Unbundled build: Android.bp has targetSdkVersion",
2895 targetSdkVersionInBp: "30",
2896 targetSdkVersionExpected: "30",
2897 unbundledBuild: true,
2898 },
2899 {
2900 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
2901 targetSdkVersionInBp: platform_sdk_codename,
2902 targetSdkVersionExpected: platform_sdk_codename,
2903 unbundledBuild: false,
2904 },
2905 {
2906 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
2907 targetSdkVersionInBp: platform_sdk_codename,
2908 targetSdkVersionExpected: "10000",
2909 unbundledBuild: true,
2910 },
2911
2912 {
2913 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
2914 targetSdkVersionExpected: platform_sdk_codename,
2915 unbundledBuild: false,
2916 },
2917 {
2918 name: "Unbundled build: Android.bp has no targetSdkVersion",
2919 targetSdkVersionExpected: "10000",
2920 unbundledBuild: true,
2921 },
2922 }
2923 for _, testCase := range testCases {
2924 bp := fmt.Sprintf(`
2925 android_app {
2926 name: "foo",
2927 sdk_version: "current",
2928 target_sdk_version: "%v",
2929 }
2930 `, testCase.targetSdkVersionInBp)
2931 fixture := android.GroupFixturePreparers(
2932 prepareForJavaTest,
2933 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2934 // explicitly set platform_sdk_codename to make the test deterministic
2935 variables.Platform_sdk_codename = &platform_sdk_codename
2936 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
2937 // create a non-empty list if unbundledBuild==true
2938 if testCase.unbundledBuild {
2939 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
2940 }
2941 }),
2942 )
2943
2944 result := fixture.RunTestWithBp(t, bp)
2945 foo := result.ModuleForTests("foo", "android_common")
2946
Gurpreet Singh75d65f32022-01-24 17:44:05 +00002947 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2948 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00002949 }
2950}
Colin Cross412436f2022-04-07 17:40:07 -07002951
2952func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
2953 result := android.GroupFixturePreparers(
2954 PrepareForTestWithJavaDefaultModules,
2955 android.PrepareForTestWithAllowMissingDependencies,
2956 android.PrepareForTestWithAndroidMk,
2957 ).RunTestWithBp(t, `
2958 android_app {
2959 name: "foo",
2960 srcs: ["a.java"],
2961 certificate: ":missing_certificate",
2962 sdk_version: "current",
2963 }`)
2964
2965 foo := result.ModuleForTests("foo", "android_common")
2966 fooApk := foo.Output("foo.apk")
2967 if fooApk.Rule != android.ErrorRule {
2968 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
2969 }
2970 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
2971}