blob: 78e1a57a9fe6920c7e78c4fbd1a95d1ad454c89c [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"
Colin Cross3bc7ffa2017-11-22 16:19:37 -080029)
30
31var (
32 resourceFiles = []string{
33 "res/layout/layout.xml",
34 "res/values/strings.xml",
35 "res/values-en-rUS/strings.xml",
36 }
37
38 compiledResourceFiles = []string{
39 "aapt2/res/layout_layout.xml.flat",
40 "aapt2/res/values_strings.arsc.flat",
41 "aapt2/res/values-en-rUS_strings.arsc.flat",
42 }
43)
44
Colin Cross98be1bb2019-12-13 20:41:13 -080045func testAppConfig(env map[string]string, bp string, fs map[string][]byte) android.Config {
Colin Cross527012a2017-11-30 22:56:16 -080046 appFS := map[string][]byte{}
47 for k, v := range fs {
48 appFS[k] = v
Colin Cross3bc7ffa2017-11-22 16:19:37 -080049 }
50
Colin Cross527012a2017-11-30 22:56:16 -080051 for _, file := range resourceFiles {
52 appFS[file] = nil
53 }
54
Colin Cross98be1bb2019-12-13 20:41:13 -080055 return testConfig(env, bp, appFS)
Colin Cross527012a2017-11-30 22:56:16 -080056}
57
58func testApp(t *testing.T, bp string) *android.TestContext {
Colin Cross98be1bb2019-12-13 20:41:13 -080059 config := testAppConfig(nil, bp, nil)
Colin Cross527012a2017-11-30 22:56:16 -080060
Colin Crossae8600b2020-10-29 17:09:13 -070061 ctx := testContext(config)
Colin Cross527012a2017-11-30 22:56:16 -080062
63 run(t, ctx, config)
64
65 return ctx
Colin Cross3bc7ffa2017-11-22 16:19:37 -080066}
67
68func TestApp(t *testing.T) {
Colin Crossa97c5d32018-03-28 14:58:31 -070069 for _, moduleType := range []string{"android_app", "android_library"} {
70 t.Run(moduleType, func(t *testing.T) {
71 ctx := testApp(t, moduleType+` {
72 name: "foo",
73 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090074 sdk_version: "current"
Colin Crossa97c5d32018-03-28 14:58:31 -070075 }
76 `)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080077
Colin Crossa97c5d32018-03-28 14:58:31 -070078 foo := ctx.ModuleForTests("foo", "android_common")
Colin Cross3bc7ffa2017-11-22 16:19:37 -080079
Colin Cross31656952018-05-24 16:11:20 -070080 var expectedLinkImplicits []string
81
82 manifestFixer := foo.Output("manifest_fixer/AndroidManifest.xml")
83 expectedLinkImplicits = append(expectedLinkImplicits, manifestFixer.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080084
Colin Crossa97c5d32018-03-28 14:58:31 -070085 frameworkRes := ctx.ModuleForTests("framework-res", "android_common")
86 expectedLinkImplicits = append(expectedLinkImplicits,
87 frameworkRes.Output("package-res.apk").Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080088
Colin Crossa97c5d32018-03-28 14:58:31 -070089 // Test the mapping from input files to compiled output file names
90 compile := foo.Output(compiledResourceFiles[0])
91 if !reflect.DeepEqual(resourceFiles, compile.Inputs.Strings()) {
92 t.Errorf("expected aapt2 compile inputs expected:\n %#v\n got:\n %#v",
93 resourceFiles, compile.Inputs.Strings())
94 }
Colin Crossb69301e2017-12-01 10:48:26 -080095
Colin Crossa97c5d32018-03-28 14:58:31 -070096 compiledResourceOutputs := compile.Outputs.Strings()
97 sort.Strings(compiledResourceOutputs)
Colin Crossb69301e2017-12-01 10:48:26 -080098
Colin Crossa97c5d32018-03-28 14:58:31 -070099 expectedLinkImplicits = append(expectedLinkImplicits, compiledResourceOutputs...)
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800100
Colin Crossa97c5d32018-03-28 14:58:31 -0700101 list := foo.Output("aapt2/res.list")
102 expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800103
Colin Crossa97c5d32018-03-28 14:58:31 -0700104 // Check that the link rule uses
105 res := ctx.ModuleForTests("foo", "android_common").Output("package-res.apk")
106 if !reflect.DeepEqual(expectedLinkImplicits, res.Implicits.Strings()) {
107 t.Errorf("expected aapt2 link implicits expected:\n %#v\n got:\n %#v",
108 expectedLinkImplicits, res.Implicits.Strings())
109 }
110 })
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800111 }
112}
Colin Cross890ff552017-11-30 20:13:19 -0800113
Colin Crosse560c4a2019-03-19 16:03:11 -0700114func TestAppSplits(t *testing.T) {
115 ctx := testApp(t, `
116 android_app {
117 name: "foo",
118 srcs: ["a.java"],
119 package_splits: ["v4", "v7,hdpi"],
Jeongik Cha538c0d02019-07-11 15:54:27 +0900120 sdk_version: "current"
Colin Crosse560c4a2019-03-19 16:03:11 -0700121 }`)
122
123 foo := ctx.ModuleForTests("foo", "android_common")
124
125 expectedOutputs := []string{
126 filepath.Join(buildDir, ".intermediates/foo/android_common/foo.apk"),
127 filepath.Join(buildDir, ".intermediates/foo/android_common/foo_v4.apk"),
128 filepath.Join(buildDir, ".intermediates/foo/android_common/foo_v7_hdpi.apk"),
129 }
130 for _, expectedOutput := range expectedOutputs {
131 foo.Output(expectedOutput)
132 }
133
Colin Cross41955e82019-05-29 14:40:35 -0700134 outputFiles, err := foo.Module().(*AndroidApp).OutputFiles("")
135 if err != nil {
136 t.Fatal(err)
137 }
138 if g, w := outputFiles.Strings(), expectedOutputs; !reflect.DeepEqual(g, w) {
139 t.Errorf(`want OutputFiles("") = %q, got %q`, w, g)
Colin Crosse560c4a2019-03-19 16:03:11 -0700140 }
141}
142
Jeongik Cha538c0d02019-07-11 15:54:27 +0900143func TestPlatformAPIs(t *testing.T) {
144 testJava(t, `
145 android_app {
146 name: "foo",
147 srcs: ["a.java"],
148 platform_apis: true,
149 }
150 `)
151
152 testJava(t, `
153 android_app {
154 name: "foo",
155 srcs: ["a.java"],
156 sdk_version: "current",
157 }
158 `)
159
160 testJavaError(t, "platform_apis must be true when sdk_version is empty.", `
161 android_app {
162 name: "bar",
163 srcs: ["b.java"],
164 }
165 `)
166
167 testJavaError(t, "platform_apis must be false when sdk_version is not empty.", `
168 android_app {
169 name: "bar",
170 srcs: ["b.java"],
171 sdk_version: "system_current",
172 platform_apis: true,
173 }
174 `)
175}
176
Jeongik Chae403e9e2019-12-07 00:16:24 +0900177func TestAndroidAppLinkType(t *testing.T) {
178 testJava(t, `
179 android_app {
180 name: "foo",
181 srcs: ["a.java"],
182 libs: ["bar"],
183 static_libs: ["baz"],
184 platform_apis: true,
185 }
186
187 java_library {
188 name: "bar",
189 sdk_version: "current",
190 srcs: ["b.java"],
191 }
192
193 android_library {
194 name: "baz",
195 sdk_version: "system_current",
196 srcs: ["c.java"],
197 }
198 `)
199
Steven Moreland00298982020-11-17 21:44:36 +0000200 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900201 android_app {
202 name: "foo",
203 srcs: ["a.java"],
204 libs: ["bar"],
205 sdk_version: "current",
206 static_libs: ["baz"],
207 }
208
209 java_library {
210 name: "bar",
211 sdk_version: "current",
212 srcs: ["b.java"],
213 }
214
215 android_library {
216 name: "baz",
217 sdk_version: "system_current",
218 srcs: ["c.java"],
219 }
220 `)
221
222 testJava(t, `
223 android_app {
224 name: "foo",
225 srcs: ["a.java"],
226 libs: ["bar"],
227 sdk_version: "system_current",
228 static_libs: ["baz"],
229 }
230
231 java_library {
232 name: "bar",
233 sdk_version: "current",
234 srcs: ["b.java"],
235 }
236
237 android_library {
238 name: "baz",
239 sdk_version: "system_current",
240 srcs: ["c.java"],
241 }
242 `)
243
Steven Moreland00298982020-11-17 21:44:36 +0000244 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900245 android_app {
246 name: "foo",
247 srcs: ["a.java"],
248 libs: ["bar"],
249 sdk_version: "system_current",
250 static_libs: ["baz"],
251 }
252
253 java_library {
254 name: "bar",
255 sdk_version: "current",
256 srcs: ["b.java"],
257 }
258
259 android_library {
260 name: "baz",
261 srcs: ["c.java"],
262 }
263 `)
264}
265
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100266func TestUpdatableApps(t *testing.T) {
267 testCases := []struct {
268 name string
269 bp string
270 expectedError string
271 }{
272 {
273 name: "Stable public SDK",
274 bp: `android_app {
275 name: "foo",
276 srcs: ["a.java"],
277 sdk_version: "29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100278 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100279 updatable: true,
280 }`,
281 },
282 {
283 name: "Stable system SDK",
284 bp: `android_app {
285 name: "foo",
286 srcs: ["a.java"],
287 sdk_version: "system_29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100288 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100289 updatable: true,
290 }`,
291 },
292 {
293 name: "Current public SDK",
294 bp: `android_app {
295 name: "foo",
296 srcs: ["a.java"],
297 sdk_version: "current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100298 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100299 updatable: true,
300 }`,
301 },
302 {
303 name: "Current system SDK",
304 bp: `android_app {
305 name: "foo",
306 srcs: ["a.java"],
307 sdk_version: "system_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100308 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100309 updatable: true,
310 }`,
311 },
312 {
313 name: "Current module SDK",
314 bp: `android_app {
315 name: "foo",
316 srcs: ["a.java"],
317 sdk_version: "module_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100318 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100319 updatable: true,
320 }`,
321 },
322 {
323 name: "Current core SDK",
324 bp: `android_app {
325 name: "foo",
326 srcs: ["a.java"],
327 sdk_version: "core_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100328 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100329 updatable: true,
330 }`,
331 },
332 {
333 name: "No Platform APIs",
334 bp: `android_app {
335 name: "foo",
336 srcs: ["a.java"],
337 platform_apis: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100338 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100339 updatable: true,
340 }`,
341 expectedError: "Updatable apps must use stable SDKs",
342 },
343 {
344 name: "No Core Platform APIs",
345 bp: `android_app {
346 name: "foo",
347 srcs: ["a.java"],
348 sdk_version: "core_platform",
Artur Satayevf40fc852020-04-16 13:43:02 +0100349 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100350 updatable: true,
351 }`,
352 expectedError: "Updatable apps must use stable SDKs",
353 },
354 {
355 name: "No unspecified APIs",
356 bp: `android_app {
357 name: "foo",
358 srcs: ["a.java"],
359 updatable: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100360 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100361 }`,
362 expectedError: "Updatable apps must use stable SDK",
363 },
Artur Satayevf40fc852020-04-16 13:43:02 +0100364 {
365 name: "Must specify min_sdk_version",
366 bp: `android_app {
367 name: "app_without_min_sdk_version",
368 srcs: ["a.java"],
369 sdk_version: "29",
370 updatable: true,
371 }`,
372 expectedError: "updatable apps must set min_sdk_version.",
373 },
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100374 }
375
376 for _, test := range testCases {
377 t.Run(test.name, func(t *testing.T) {
378 if test.expectedError == "" {
379 testJava(t, test.bp)
380 } else {
381 testJavaError(t, test.expectedError, test.bp)
382 }
383 })
384 }
385}
386
Jooyung Han749dc692020-04-15 11:03:39 +0900387func TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) {
388 testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+`
389 android_app {
390 name: "foo",
391 srcs: ["a.java"],
392 updatable: true,
393 sdk_version: "current",
394 min_sdk_version: "29",
395 static_libs: ["bar"],
396 }
397
398 java_library {
399 name: "bar",
400 sdk_version: "current",
401 }
402 `)
403}
404
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900405func TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) {
406 testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
407 android_app {
408 name: "foo",
409 srcs: ["a.java"],
410 updatable: true,
411 sdk_version: "current",
412 min_sdk_version: "current",
413 jni_libs: ["libjni"],
414 }
415
416 cc_library {
417 name: "libjni",
418 stl: "none",
419 system_shared_libs: [],
420 sdk_version: "current",
421 }
422 `)
423}
424
425func TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) {
426 bp := cc.GatherRequiredDepsForTest(android.Android) + `
427 android_app {
428 name: "foo",
429 srcs: ["a.java"],
430 updatable: true,
431 sdk_version: "current",
432 min_sdk_version: "29",
433 jni_libs: ["libjni"],
434 }
435
436 cc_library {
437 name: "libjni",
438 stl: "none",
439 system_shared_libs: [],
440 sdk_version: "29",
441 }
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900442 `
443 fs := map[string][]byte{
444 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
445 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil,
446 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil,
447 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil,
448 }
449
450 ctx, _ := testJavaWithConfig(t, testConfig(nil, bp, fs))
451
452 inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
453 var crtbeginFound, crtendFound bool
Dan Albert92fe7402020-07-15 13:33:30 -0700454 expectedCrtBegin := ctx.ModuleForTests("crtbegin_so",
455 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
456 expectedCrtEnd := ctx.ModuleForTests("crtend_so",
457 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
458 implicits := []string{}
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900459 for _, input := range inputs {
Dan Albert92fe7402020-07-15 13:33:30 -0700460 implicits = append(implicits, input.String())
461 if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900462 crtbeginFound = true
Dan Albert92fe7402020-07-15 13:33:30 -0700463 } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900464 crtendFound = true
465 }
466 }
Dan Albert92fe7402020-07-15 13:33:30 -0700467 if !crtbeginFound {
468 t.Error(fmt.Sprintf(
469 "expected implicit with suffix %q, have the following implicits:\n%s",
470 expectedCrtBegin, strings.Join(implicits, "\n")))
471 }
472 if !crtendFound {
473 t.Error(fmt.Sprintf(
474 "expected implicit with suffix %q, have the following implicits:\n%s",
475 expectedCrtEnd, strings.Join(implicits, "\n")))
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900476 }
477}
478
479func TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
480 bp := cc.GatherRequiredDepsForTest(android.Android) + `
481 android_app {
482 name: "foo",
483 srcs: ["a.java"],
484 updatable: true,
485 sdk_version: "current",
486 min_sdk_version: "29", // this APK should support 29
487 jni_libs: ["libjni"],
488 }
489
490 cc_library {
491 name: "libjni",
492 stl: "none",
493 sdk_version: "current",
494 }
495 `
496 testJavaError(t, `"libjni" .*: sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
497}
498
499func TestUpdatableApps_ErrorIfDepSdkVersionIsHigher(t *testing.T) {
500 bp := cc.GatherRequiredDepsForTest(android.Android) + `
501 android_app {
502 name: "foo",
503 srcs: ["a.java"],
504 updatable: true,
505 sdk_version: "current",
506 min_sdk_version: "29", // this APK should support 29
507 jni_libs: ["libjni"],
508 }
509
510 cc_library {
511 name: "libjni",
512 stl: "none",
513 shared_libs: ["libbar"],
514 system_shared_libs: [],
515 sdk_version: "27",
516 }
517
518 cc_library {
519 name: "libbar",
520 stl: "none",
521 system_shared_libs: [],
522 sdk_version: "current",
523 }
524 `
525 testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
526}
527
Colin Cross0ddae7f2019-02-07 15:30:01 -0800528func TestResourceDirs(t *testing.T) {
529 testCases := []struct {
530 name string
531 prop string
532 resources []string
533 }{
534 {
535 name: "no resource_dirs",
536 prop: "",
537 resources: []string{"res/res/values/strings.xml"},
538 },
539 {
540 name: "resource_dirs",
541 prop: `resource_dirs: ["res"]`,
542 resources: []string{"res/res/values/strings.xml"},
543 },
544 {
545 name: "empty resource_dirs",
546 prop: `resource_dirs: []`,
547 resources: nil,
548 },
549 }
550
551 fs := map[string][]byte{
552 "res/res/values/strings.xml": nil,
553 }
554
555 bp := `
556 android_app {
557 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900558 sdk_version: "current",
Colin Cross0ddae7f2019-02-07 15:30:01 -0800559 %s
560 }
561 `
562
563 for _, testCase := range testCases {
564 t.Run(testCase.name, func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800565 config := testConfig(nil, fmt.Sprintf(bp, testCase.prop), fs)
Colin Crossae8600b2020-10-29 17:09:13 -0700566 ctx := testContext(config)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800567 run(t, ctx, config)
568
569 module := ctx.ModuleForTests("foo", "android_common")
570 resourceList := module.MaybeOutput("aapt2/res.list")
571
572 var resources []string
573 if resourceList.Rule != nil {
574 for _, compiledResource := range resourceList.Inputs.Strings() {
575 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
576 }
577 }
578
579 if !reflect.DeepEqual(resources, testCase.resources) {
580 t.Errorf("expected resource files %q, got %q",
581 testCase.resources, resources)
582 }
583 })
584 }
585}
586
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800587func TestLibraryAssets(t *testing.T) {
588 bp := `
589 android_app {
590 name: "foo",
591 sdk_version: "current",
592 static_libs: ["lib1", "lib2", "lib3"],
593 }
594
595 android_library {
596 name: "lib1",
597 sdk_version: "current",
598 asset_dirs: ["assets_a"],
599 }
600
601 android_library {
602 name: "lib2",
603 sdk_version: "current",
604 }
605
606 android_library {
607 name: "lib3",
608 sdk_version: "current",
609 static_libs: ["lib4"],
610 }
611
612 android_library {
613 name: "lib4",
614 sdk_version: "current",
615 asset_dirs: ["assets_b"],
616 }
617 `
618
619 testCases := []struct {
620 name string
621 assetFlag string
622 assetPackages []string
623 }{
624 {
625 name: "foo",
626 // lib1 has its own asset. lib3 doesn't have any, but provides lib4's transitively.
627 assetPackages: []string{
628 buildDir + "/.intermediates/foo/android_common/aapt2/package-res.apk",
629 buildDir + "/.intermediates/lib1/android_common/assets.zip",
630 buildDir + "/.intermediates/lib3/android_common/assets.zip",
631 },
632 },
633 {
634 name: "lib1",
635 assetFlag: "-A assets_a",
636 },
637 {
638 name: "lib2",
639 },
640 {
641 name: "lib3",
642 assetPackages: []string{
643 buildDir + "/.intermediates/lib3/android_common/aapt2/package-res.apk",
644 buildDir + "/.intermediates/lib4/android_common/assets.zip",
645 },
646 },
647 {
648 name: "lib4",
649 assetFlag: "-A assets_b",
650 },
651 }
652 ctx := testApp(t, bp)
653
654 for _, test := range testCases {
655 t.Run(test.name, func(t *testing.T) {
656 m := ctx.ModuleForTests(test.name, "android_common")
657
658 // Check asset flag in aapt2 link flags
659 var aapt2link android.TestingBuildParams
660 if len(test.assetPackages) > 0 {
661 aapt2link = m.Output("aapt2/package-res.apk")
662 } else {
663 aapt2link = m.Output("package-res.apk")
664 }
665 aapt2Flags := aapt2link.Args["flags"]
666 if test.assetFlag != "" {
667 if !strings.Contains(aapt2Flags, test.assetFlag) {
668 t.Errorf("Can't find asset flag %q in aapt2 link flags %q", test.assetFlag, aapt2Flags)
669 }
670 } else {
671 if strings.Contains(aapt2Flags, " -A ") {
672 t.Errorf("aapt2 link flags %q contain unexpected asset flag", aapt2Flags)
673 }
674 }
675
676 // Check asset merge rule.
677 if len(test.assetPackages) > 0 {
678 mergeAssets := m.Output("package-res.apk")
679 if !reflect.DeepEqual(test.assetPackages, mergeAssets.Inputs.Strings()) {
680 t.Errorf("Unexpected mergeAssets inputs: %v, expected: %v",
681 mergeAssets.Inputs.Strings(), test.assetPackages)
682 }
683 }
684 })
685 }
686}
687
Colin Crossb014f072021-02-26 14:54:36 -0800688func TestAppJavaResources(t *testing.T) {
689 bp := `
690 android_app {
691 name: "foo",
692 sdk_version: "current",
693 java_resources: ["resources/a"],
694 srcs: ["a.java"],
695 }
696
697 android_app {
698 name: "bar",
699 sdk_version: "current",
700 java_resources: ["resources/a"],
701 }
702 `
703
704 ctx := testApp(t, bp)
705
706 foo := ctx.ModuleForTests("foo", "android_common")
707 fooResources := foo.Output("res/foo.jar")
708 fooDexJar := foo.Output("dex-withres/foo.jar")
709 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
710 fooApk := foo.Rule("combineApk")
711
712 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
713 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
714 }
715
716 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
717 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
718 }
719
720 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
721 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
722 }
723
724 bar := ctx.ModuleForTests("bar", "android_common")
725 barResources := bar.Output("res/bar.jar")
726 barApk := bar.Rule("combineApk")
727
728 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
729 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
730 }
731}
732
Colin Crossbec85302019-02-13 13:15:46 -0800733func TestAndroidResources(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -0800734 testCases := []struct {
735 name string
736 enforceRROTargets []string
737 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -0800738 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -0800739 overlayFiles map[string][]string
740 rroDirs map[string][]string
741 }{
742 {
743 name: "no RRO",
744 enforceRROTargets: nil,
745 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -0800746 resourceFiles: map[string][]string{
747 "foo": nil,
748 "bar": {"bar/res/res/values/strings.xml"},
749 "lib": nil,
750 "lib2": {"lib2/res/res/values/strings.xml"},
751 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800752 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800753 "foo": {
754 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800755 buildDir + "/.intermediates/lib/android_common/package-res.apk",
Anton Hansson53c88442019-03-18 15:53:16 +0000756 buildDir + "/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800757 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800758 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
759 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +0000760 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800761 },
Colin Crossbec85302019-02-13 13:15:46 -0800762 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800763 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
764 "device/vendor/blah/overlay/bar/res/values/strings.xml",
765 },
Colin Crossbec85302019-02-13 13:15:46 -0800766 "lib": {
767 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
768 "lib/res/res/values/strings.xml",
769 "device/vendor/blah/overlay/lib/res/values/strings.xml",
770 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800771 },
772 rroDirs: map[string][]string{
773 "foo": nil,
774 "bar": nil,
775 },
776 },
777 {
778 name: "enforce RRO on foo",
779 enforceRROTargets: []string{"foo"},
780 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -0800781 resourceFiles: map[string][]string{
782 "foo": nil,
783 "bar": {"bar/res/res/values/strings.xml"},
784 "lib": nil,
785 "lib2": {"lib2/res/res/values/strings.xml"},
786 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800787 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800788 "foo": {
789 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800790 buildDir + "/.intermediates/lib/android_common/package-res.apk",
Anton Hansson53c88442019-03-18 15:53:16 +0000791 buildDir + "/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800792 "foo/res/res/values/strings.xml",
793 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
794 },
Colin Crossbec85302019-02-13 13:15:46 -0800795 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800796 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
797 "device/vendor/blah/overlay/bar/res/values/strings.xml",
798 },
Colin Crossbec85302019-02-13 13:15:46 -0800799 "lib": {
800 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
801 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -0800802 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800803 },
Colin Crossc1c37552019-01-31 11:42:41 -0800804
Colin Cross5c4791c2019-02-01 11:44:44 -0800805 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800806 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000807 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +0000808 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700809 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800810 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800811 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700812 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800813 },
814 },
815 {
816 name: "enforce RRO on all",
817 enforceRROTargets: []string{"*"},
818 enforceRROExcludedOverlays: []string{
819 // Excluding specific apps/res directories also allowed.
820 "device/vendor/blah/static_overlay/foo",
821 "device/vendor/blah/static_overlay/bar/res",
822 },
Colin Crossbec85302019-02-13 13:15:46 -0800823 resourceFiles: map[string][]string{
824 "foo": nil,
825 "bar": {"bar/res/res/values/strings.xml"},
826 "lib": nil,
827 "lib2": {"lib2/res/res/values/strings.xml"},
828 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800829 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800830 "foo": {
831 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800832 buildDir + "/.intermediates/lib/android_common/package-res.apk",
Anton Hansson53c88442019-03-18 15:53:16 +0000833 buildDir + "/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800834 "foo/res/res/values/strings.xml",
835 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
836 },
Colin Crossbec85302019-02-13 13:15:46 -0800837 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
838 "lib": {
839 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
840 "lib/res/res/values/strings.xml",
841 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800842 },
843 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800844 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000845 "device:device/vendor/blah/overlay/foo/res",
846 "product:product/vendor/blah/overlay/foo/res",
847 // Lib dep comes after the direct deps
848 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800849 },
Anton Hansson53c88442019-03-18 15:53:16 +0000850 "bar": {"device:device/vendor/blah/overlay/bar/res"},
851 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800852 },
853 },
854 }
855
Anton Hansson53c88442019-03-18 15:53:16 +0000856 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -0800857 "device/vendor/blah/overlay",
858 "device/vendor/blah/overlay2",
859 "device/vendor/blah/static_overlay",
860 }
861
Anton Hansson53c88442019-03-18 15:53:16 +0000862 productResourceOverlays := []string{
863 "product/vendor/blah/overlay",
864 }
865
Colin Cross890ff552017-11-30 20:13:19 -0800866 fs := map[string][]byte{
867 "foo/res/res/values/strings.xml": nil,
868 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800869 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -0800870 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800871 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
872 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800873 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800874 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
875 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
876 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +0000877 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800878 }
879
880 bp := `
881 android_app {
882 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900883 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800884 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +0000885 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -0800886 }
887
888 android_app {
889 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900890 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800891 resource_dirs: ["bar/res"],
892 }
Colin Cross6ed7dea2019-01-31 14:44:30 -0800893
894 android_library {
895 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900896 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800897 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -0800898 static_libs: ["lib2"],
899 }
900
901 android_library {
902 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900903 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -0800904 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -0800905 }
Anton Hansson53c88442019-03-18 15:53:16 +0000906
907 // This library has the same resources as lib (should not lead to dupe RROs)
908 android_library {
909 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900910 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +0000911 resource_dirs: ["lib/res"]
912 }
Colin Cross890ff552017-11-30 20:13:19 -0800913 `
914
Colin Cross5c4791c2019-02-01 11:44:44 -0800915 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -0800916 t.Run(testCase.name, func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800917 config := testAppConfig(nil, bp, fs)
Anton Hansson53c88442019-03-18 15:53:16 +0000918 config.TestProductVariables.DeviceResourceOverlays = deviceResourceOverlays
919 config.TestProductVariables.ProductResourceOverlays = productResourceOverlays
Colin Cross890ff552017-11-30 20:13:19 -0800920 if testCase.enforceRROTargets != nil {
Colin Crossa74ca042019-01-31 14:31:51 -0800921 config.TestProductVariables.EnforceRROTargets = testCase.enforceRROTargets
Colin Cross890ff552017-11-30 20:13:19 -0800922 }
923 if testCase.enforceRROExcludedOverlays != nil {
Colin Crossa74ca042019-01-31 14:31:51 -0800924 config.TestProductVariables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
Colin Cross890ff552017-11-30 20:13:19 -0800925 }
926
Colin Crossae8600b2020-10-29 17:09:13 -0700927 ctx := testContext(config)
Colin Cross890ff552017-11-30 20:13:19 -0800928 run(t, ctx, config)
929
Colin Crossbec85302019-02-13 13:15:46 -0800930 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
931 for _, o := range list {
932 res := module.MaybeOutput(o)
933 if res.Rule != nil {
934 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
935 // verify the inputs to the .arsc.flat rule.
936 files = append(files, res.Inputs.Strings()...)
937 } else {
938 // Otherwise, verify the full path to the output of the other module
939 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +0000940 }
Colin Cross890ff552017-11-30 20:13:19 -0800941 }
Colin Crossbec85302019-02-13 13:15:46 -0800942 return files
Colin Cross890ff552017-11-30 20:13:19 -0800943 }
944
Colin Crossbec85302019-02-13 13:15:46 -0800945 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
946 module := ctx.ModuleForTests(moduleName, "android_common")
947 resourceList := module.MaybeOutput("aapt2/res.list")
948 if resourceList.Rule != nil {
949 resourceFiles = resourceListToFiles(module, resourceList.Inputs.Strings())
Anton Hansson0375a4f2019-01-24 14:39:19 +0000950 }
Colin Crossbec85302019-02-13 13:15:46 -0800951 overlayList := module.MaybeOutput("aapt2/overlay.list")
952 if overlayList.Rule != nil {
953 overlayFiles = resourceListToFiles(module, overlayList.Inputs.Strings())
954 }
955
Anton Hansson53c88442019-03-18 15:53:16 +0000956 for _, d := range module.Module().(AndroidLibraryDependency).ExportedRRODirs() {
957 var prefix string
958 if d.overlayType == device {
959 prefix = "device:"
960 } else if d.overlayType == product {
961 prefix = "product:"
962 } else {
963 t.Fatalf("Unexpected overlayType %d", d.overlayType)
964 }
965 rroDirs = append(rroDirs, prefix+d.path.String())
966 }
Colin Crossbec85302019-02-13 13:15:46 -0800967
968 return resourceFiles, overlayFiles, rroDirs
969 }
970
971 modules := []string{"foo", "bar", "lib", "lib2"}
972 for _, module := range modules {
973 resourceFiles, overlayFiles, rroDirs := getResources(module)
974
975 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
976 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
977 module, testCase.resourceFiles[module], resourceFiles)
978 }
979 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
980 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
981 module, testCase.overlayFiles[module], overlayFiles)
982 }
983 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +0000984 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -0800985 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +0000986 }
Colin Cross890ff552017-11-30 20:13:19 -0800987 }
Colin Cross890ff552017-11-30 20:13:19 -0800988 })
989 }
990}
Colin Crossd09b0b62018-04-18 11:06:47 -0700991
Jeongik Cha219141c2020-08-06 23:00:37 +0900992func checkSdkVersion(t *testing.T, config android.Config, expectedSdkVersion string) {
Colin Crossae8600b2020-10-29 17:09:13 -0700993 ctx := testContext(config)
Jeongik Cha219141c2020-08-06 23:00:37 +0900994
995 run(t, ctx, config)
996
997 foo := ctx.ModuleForTests("foo", "android_common")
998 link := foo.Output("package-res.apk")
999 linkFlags := strings.Split(link.Args["flags"], " ")
1000 min := android.IndexList("--min-sdk-version", linkFlags)
1001 target := android.IndexList("--target-sdk-version", linkFlags)
1002
1003 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
1004 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
1005 }
1006
1007 gotMinSdkVersion := linkFlags[min+1]
1008 gotTargetSdkVersion := linkFlags[target+1]
1009
1010 if gotMinSdkVersion != expectedSdkVersion {
1011 t.Errorf("incorrect --min-sdk-version, expected %q got %q",
1012 expectedSdkVersion, gotMinSdkVersion)
1013 }
1014
1015 if gotTargetSdkVersion != expectedSdkVersion {
1016 t.Errorf("incorrect --target-sdk-version, expected %q got %q",
1017 expectedSdkVersion, gotTargetSdkVersion)
1018 }
1019}
1020
Colin Crossd09b0b62018-04-18 11:06:47 -07001021func TestAppSdkVersion(t *testing.T) {
1022 testCases := []struct {
1023 name string
1024 sdkVersion string
1025 platformSdkInt int
1026 platformSdkCodename string
1027 platformSdkFinal bool
1028 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001029 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001030 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001031 }{
1032 {
1033 name: "current final SDK",
1034 sdkVersion: "current",
1035 platformSdkInt: 27,
1036 platformSdkCodename: "REL",
1037 platformSdkFinal: true,
1038 expectedMinSdkVersion: "27",
1039 },
1040 {
1041 name: "current non-final SDK",
1042 sdkVersion: "current",
1043 platformSdkInt: 27,
1044 platformSdkCodename: "OMR1",
1045 platformSdkFinal: false,
1046 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001047 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001048 },
1049 {
1050 name: "default final SDK",
1051 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001052 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001053 platformSdkInt: 27,
1054 platformSdkCodename: "REL",
1055 platformSdkFinal: true,
1056 expectedMinSdkVersion: "27",
1057 },
1058 {
1059 name: "default non-final SDK",
1060 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001061 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001062 platformSdkInt: 27,
1063 platformSdkCodename: "OMR1",
1064 platformSdkFinal: false,
1065 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001066 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001067 },
1068 {
1069 name: "14",
1070 sdkVersion: "14",
1071 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001072 platformSdkCodename: "S",
1073 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001074 },
1075 }
1076
1077 for _, moduleType := range []string{"android_app", "android_library"} {
1078 for _, test := range testCases {
1079 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001080 platformApiProp := ""
1081 if test.platformApis {
1082 platformApiProp = "platform_apis: true,"
1083 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001084 bp := fmt.Sprintf(`%s {
1085 name: "foo",
1086 srcs: ["a.java"],
1087 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001088 %s
1089 }`, moduleType, test.sdkVersion, platformApiProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001090
Colin Cross98be1bb2019-12-13 20:41:13 -08001091 config := testAppConfig(nil, bp, nil)
Colin Crossd09b0b62018-04-18 11:06:47 -07001092 config.TestProductVariables.Platform_sdk_version = &test.platformSdkInt
1093 config.TestProductVariables.Platform_sdk_codename = &test.platformSdkCodename
Dan Albert4f378d72020-07-23 17:32:15 -07001094 config.TestProductVariables.Platform_version_active_codenames = test.activeCodenames
Colin Crossd09b0b62018-04-18 11:06:47 -07001095 config.TestProductVariables.Platform_sdk_final = &test.platformSdkFinal
Jeongik Cha219141c2020-08-06 23:00:37 +09001096 checkSdkVersion(t, config, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001097
Colin Crossd09b0b62018-04-18 11:06:47 -07001098 })
1099 }
1100 }
1101}
Colin Crossa4f08812018-10-02 22:03:40 -07001102
Jeongik Cha219141c2020-08-06 23:00:37 +09001103func TestVendorAppSdkVersion(t *testing.T) {
1104 testCases := []struct {
1105 name string
1106 sdkVersion string
1107 platformSdkInt int
1108 platformSdkCodename string
1109 platformSdkFinal bool
1110 deviceCurrentApiLevelForVendorModules string
1111 expectedMinSdkVersion string
1112 }{
1113 {
1114 name: "current final SDK",
1115 sdkVersion: "current",
1116 platformSdkInt: 29,
1117 platformSdkCodename: "REL",
1118 platformSdkFinal: true,
1119 deviceCurrentApiLevelForVendorModules: "29",
1120 expectedMinSdkVersion: "29",
1121 },
1122 {
1123 name: "current final SDK",
1124 sdkVersion: "current",
1125 platformSdkInt: 29,
1126 platformSdkCodename: "REL",
1127 platformSdkFinal: true,
1128 deviceCurrentApiLevelForVendorModules: "28",
1129 expectedMinSdkVersion: "28",
1130 },
1131 {
1132 name: "current final SDK",
1133 sdkVersion: "current",
1134 platformSdkInt: 29,
1135 platformSdkCodename: "Q",
1136 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001137 deviceCurrentApiLevelForVendorModules: "28",
1138 expectedMinSdkVersion: "28",
1139 },
1140 }
1141
1142 for _, moduleType := range []string{"android_app", "android_library"} {
1143 for _, sdkKind := range []string{"", "system_"} {
1144 for _, test := range testCases {
1145 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1146 bp := fmt.Sprintf(`%s {
1147 name: "foo",
1148 srcs: ["a.java"],
1149 sdk_version: "%s%s",
1150 vendor: true,
1151 }`, moduleType, sdkKind, test.sdkVersion)
1152
1153 config := testAppConfig(nil, bp, nil)
1154 config.TestProductVariables.Platform_sdk_version = &test.platformSdkInt
1155 config.TestProductVariables.Platform_sdk_codename = &test.platformSdkCodename
1156 config.TestProductVariables.Platform_sdk_final = &test.platformSdkFinal
1157 config.TestProductVariables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1158 config.TestProductVariables.DeviceSystemSdkVersions = []string{"28", "29"}
1159 checkSdkVersion(t, config, test.expectedMinSdkVersion)
1160 })
1161 }
1162 }
1163 }
1164}
1165
Paul Duffin50c217c2019-06-12 13:25:22 +01001166func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001167 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001168 cc_library {
1169 name: "libjni",
1170 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001171 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001172 stl: "none",
1173 }
1174
1175 android_test {
1176 name: "test",
1177 sdk_version: "core_platform",
1178 jni_libs: ["libjni"],
1179 }
1180
1181 android_test {
1182 name: "test_first",
1183 sdk_version: "core_platform",
1184 compile_multilib: "first",
1185 jni_libs: ["libjni"],
1186 }
1187
1188 android_test {
1189 name: "test_both",
1190 sdk_version: "core_platform",
1191 compile_multilib: "both",
1192 jni_libs: ["libjni"],
1193 }
1194
1195 android_test {
1196 name: "test_32",
1197 sdk_version: "core_platform",
1198 compile_multilib: "32",
1199 jni_libs: ["libjni"],
1200 }
1201
1202 android_test {
1203 name: "test_64",
1204 sdk_version: "core_platform",
1205 compile_multilib: "64",
1206 jni_libs: ["libjni"],
1207 }
1208 `)
1209
1210 testCases := []struct {
1211 name string
1212 abis []string
1213 }{
1214 {"test", []string{"arm64-v8a"}},
1215 {"test_first", []string{"arm64-v8a"}},
1216 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1217 {"test_32", []string{"armeabi-v7a"}},
1218 {"test_64", []string{"arm64-v8a"}},
1219 }
1220
1221 for _, test := range testCases {
1222 t.Run(test.name, func(t *testing.T) {
1223 app := ctx.ModuleForTests(test.name, "android_common")
1224 jniLibZip := app.Output("jnilibs.zip")
1225 var abis []string
1226 args := strings.Fields(jniLibZip.Args["jarArgs"])
1227 for i := 0; i < len(args); i++ {
1228 if args[i] == "-P" {
1229 abis = append(abis, filepath.Base(args[i+1]))
1230 i++
1231 }
1232 }
1233 if !reflect.DeepEqual(abis, test.abis) {
1234 t.Errorf("want abis %v, got %v", test.abis, abis)
1235 }
1236 })
1237 }
1238}
1239
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001240func TestAppSdkVersionByPartition(t *testing.T) {
1241 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1242 android_app {
1243 name: "foo",
1244 srcs: ["a.java"],
1245 vendor: true,
1246 platform_apis: true,
1247 }
1248 `)
1249
1250 testJava(t, `
1251 android_app {
1252 name: "bar",
1253 srcs: ["b.java"],
1254 platform_apis: true,
1255 }
1256 `)
1257
1258 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001259 bp := `
1260 android_app {
1261 name: "foo",
1262 srcs: ["a.java"],
1263 product_specific: true,
1264 platform_apis: true,
1265 }
1266 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001267
1268 config := testAppConfig(nil, bp, nil)
1269 config.TestProductVariables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001270 if enforce {
Colin Cross98be1bb2019-12-13 20:41:13 -08001271 testJavaErrorWithConfig(t, "sdk_version must have a value when the module is located at vendor or product", config)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001272 } else {
Colin Cross98be1bb2019-12-13 20:41:13 -08001273 testJavaWithConfig(t, config)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001274 }
1275 }
1276}
1277
Paul Duffin50c217c2019-06-12 13:25:22 +01001278func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001279 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001280 cc_library {
1281 name: "libjni",
1282 system_shared_libs: [],
1283 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08001284 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001285 }
1286
1287 android_app {
1288 name: "app",
1289 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001290 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001291 }
1292
1293 android_app {
1294 name: "app_noembed",
1295 jni_libs: ["libjni"],
1296 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001297 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001298 }
1299
1300 android_app {
1301 name: "app_embed",
1302 jni_libs: ["libjni"],
1303 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001304 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001305 }
1306
1307 android_test {
1308 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00001309 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001310 jni_libs: ["libjni"],
1311 }
1312
1313 android_test {
1314 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001315 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001316 jni_libs: ["libjni"],
1317 use_embedded_native_libs: false,
1318 }
1319
1320 android_test_helper_app {
1321 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00001322 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001323 jni_libs: ["libjni"],
1324 }
1325
1326 android_test_helper_app {
1327 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001328 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001329 jni_libs: ["libjni"],
1330 use_embedded_native_libs: false,
1331 }
1332 `)
1333
1334 testCases := []struct {
1335 name string
1336 packaged bool
1337 compressed bool
1338 }{
1339 {"app", false, false},
1340 {"app_noembed", false, false},
1341 {"app_embed", true, false},
1342 {"test", true, false},
1343 {"test_noembed", true, true},
1344 {"test_helper", true, false},
1345 {"test_helper_noembed", true, true},
1346 }
1347
1348 for _, test := range testCases {
1349 t.Run(test.name, func(t *testing.T) {
1350 app := ctx.ModuleForTests(test.name, "android_common")
1351 jniLibZip := app.MaybeOutput("jnilibs.zip")
1352 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
1353 t.Errorf("expected jni packaged %v, got %v", w, g)
1354 }
1355
1356 if jniLibZip.Rule != nil {
1357 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
1358 t.Errorf("expected jni compressed %v, got %v", w, g)
1359 }
Colin Crossc511bc52020-04-07 16:50:32 +00001360
1361 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
1362 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
1363 }
Paul Duffin50c217c2019-06-12 13:25:22 +01001364 }
1365 })
1366 }
Colin Cross47fa9d32019-03-26 10:51:39 -07001367}
1368
Colin Cross3c007702020-05-08 11:20:24 -07001369func TestJNISDK(t *testing.T) {
1370 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
1371 cc_library {
1372 name: "libjni",
1373 system_shared_libs: [],
1374 stl: "none",
1375 sdk_version: "current",
1376 }
1377
1378 android_test {
1379 name: "app_platform",
1380 jni_libs: ["libjni"],
1381 platform_apis: true,
1382 }
1383
1384 android_test {
1385 name: "app_sdk",
1386 jni_libs: ["libjni"],
1387 sdk_version: "current",
1388 }
1389
1390 android_test {
1391 name: "app_force_platform",
1392 jni_libs: ["libjni"],
1393 sdk_version: "current",
1394 jni_uses_platform_apis: true,
1395 }
1396
1397 android_test {
1398 name: "app_force_sdk",
1399 jni_libs: ["libjni"],
1400 platform_apis: true,
1401 jni_uses_sdk_apis: true,
1402 }
Colin Crossc2d24052020-05-13 11:05:02 -07001403
1404 cc_library {
1405 name: "libvendorjni",
1406 system_shared_libs: [],
1407 stl: "none",
1408 vendor: true,
1409 }
1410
1411 android_test {
1412 name: "app_vendor",
1413 jni_libs: ["libvendorjni"],
1414 sdk_version: "current",
1415 vendor: true,
1416 }
Colin Cross3c007702020-05-08 11:20:24 -07001417 `)
1418
1419 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07001420 name string
1421 sdkJNI bool
1422 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07001423 }{
Colin Crossc2d24052020-05-13 11:05:02 -07001424 {name: "app_platform"},
1425 {name: "app_sdk", sdkJNI: true},
1426 {name: "app_force_platform"},
1427 {name: "app_force_sdk", sdkJNI: true},
1428 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07001429 }
1430
Colin Crossc2d24052020-05-13 11:05:02 -07001431 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
1432 Output("libjni.so").Output.String()
1433 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
1434 Output("libjni.so").Output.String()
1435 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
1436 Output("libvendorjni.so").Output.String()
1437
Colin Cross3c007702020-05-08 11:20:24 -07001438 for _, test := range testCases {
1439 t.Run(test.name, func(t *testing.T) {
1440 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07001441
1442 jniLibZip := app.MaybeOutput("jnilibs.zip")
1443 if len(jniLibZip.Implicits) != 1 {
1444 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
1445 }
1446 gotJNI := jniLibZip.Implicits[0].String()
1447
1448 if test.sdkJNI {
1449 if gotJNI != sdkJNI {
1450 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
1451 }
Colin Crossc2d24052020-05-13 11:05:02 -07001452 } else if test.vendorJNI {
1453 if gotJNI != vendorJNI {
1454 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
1455 }
Colin Cross3c007702020-05-08 11:20:24 -07001456 } else {
1457 if gotJNI != platformJNI {
1458 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
1459 }
1460 }
1461 })
1462 }
1463
1464 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
1465 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
1466 android_test {
1467 name: "app_platform",
1468 platform_apis: true,
1469 jni_uses_platform_apis: true,
1470 }
1471 `)
1472 })
1473
1474 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
1475 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
1476 android_test {
1477 name: "app_sdk",
1478 sdk_version: "current",
1479 jni_uses_sdk_apis: true,
1480 }
1481 `)
1482 })
1483
1484}
1485
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001486func TestCertificates(t *testing.T) {
1487 testCases := []struct {
1488 name string
1489 bp string
1490 certificateOverride string
Liz Kammere2b27f42020-05-07 13:24:05 -07001491 expectedLineage string
1492 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001493 }{
1494 {
1495 name: "default",
1496 bp: `
1497 android_app {
1498 name: "foo",
1499 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001500 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001501 }
1502 `,
1503 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001504 expectedLineage: "",
1505 expectedCertificate: "build/make/target/product/security/testkey.x509.pem build/make/target/product/security/testkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001506 },
1507 {
1508 name: "module certificate property",
1509 bp: `
1510 android_app {
1511 name: "foo",
1512 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001513 certificate: ":new_certificate",
1514 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001515 }
1516
1517 android_app_certificate {
1518 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001519 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001520 }
1521 `,
1522 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001523 expectedLineage: "",
1524 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001525 },
1526 {
1527 name: "path certificate property",
1528 bp: `
1529 android_app {
1530 name: "foo",
1531 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001532 certificate: "expiredkey",
1533 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001534 }
1535 `,
1536 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001537 expectedLineage: "",
1538 expectedCertificate: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001539 },
1540 {
1541 name: "certificate overrides",
1542 bp: `
1543 android_app {
1544 name: "foo",
1545 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001546 certificate: "expiredkey",
1547 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001548 }
1549
1550 android_app_certificate {
1551 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001552 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001553 }
1554 `,
1555 certificateOverride: "foo:new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001556 expectedLineage: "",
1557 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1558 },
1559 {
1560 name: "certificate lineage",
1561 bp: `
1562 android_app {
1563 name: "foo",
1564 srcs: ["a.java"],
1565 certificate: ":new_certificate",
1566 lineage: "lineage.bin",
1567 sdk_version: "current",
1568 }
1569
1570 android_app_certificate {
1571 name: "new_certificate",
1572 certificate: "cert/new_cert",
1573 }
1574 `,
1575 certificateOverride: "",
1576 expectedLineage: "--lineage lineage.bin",
1577 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001578 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001579 {
1580 name: "lineage from filegroup",
1581 bp: `
1582 android_app {
1583 name: "foo",
1584 srcs: ["a.java"],
1585 certificate: ":new_certificate",
1586 lineage: ":lineage_bin",
1587 sdk_version: "current",
1588 }
1589
1590 android_app_certificate {
1591 name: "new_certificate",
1592 certificate: "cert/new_cert",
1593 }
1594
1595 filegroup {
1596 name: "lineage_bin",
1597 srcs: ["lineage.bin"],
1598 }
1599 `,
1600 certificateOverride: "",
1601 expectedLineage: "--lineage lineage.bin",
1602 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1603 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001604 }
1605
1606 for _, test := range testCases {
1607 t.Run(test.name, func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -08001608 config := testAppConfig(nil, test.bp, nil)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001609 if test.certificateOverride != "" {
1610 config.TestProductVariables.CertificateOverrides = []string{test.certificateOverride}
1611 }
Colin Crossae8600b2020-10-29 17:09:13 -07001612 ctx := testContext(config)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001613
1614 run(t, ctx, config)
1615 foo := ctx.ModuleForTests("foo", "android_common")
1616
1617 signapk := foo.Output("foo.apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001618 signCertificateFlags := signapk.Args["certificates"]
1619 if test.expectedCertificate != signCertificateFlags {
1620 t.Errorf("Incorrect signing flags, expected: %q, got: %q", test.expectedCertificate, signCertificateFlags)
1621 }
1622
1623 signFlags := signapk.Args["flags"]
1624 if test.expectedLineage != signFlags {
1625 t.Errorf("Incorrect signing flags, expected: %q, got: %q", test.expectedLineage, signFlags)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001626 }
1627 })
1628 }
1629}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001630
Songchun Fan688de9a2020-03-24 20:32:24 -07001631func TestRequestV4SigningFlag(t *testing.T) {
1632 testCases := []struct {
1633 name string
1634 bp string
1635 expected string
1636 }{
1637 {
1638 name: "default",
1639 bp: `
1640 android_app {
1641 name: "foo",
1642 srcs: ["a.java"],
1643 sdk_version: "current",
1644 }
1645 `,
1646 expected: "",
1647 },
1648 {
1649 name: "default",
1650 bp: `
1651 android_app {
1652 name: "foo",
1653 srcs: ["a.java"],
1654 sdk_version: "current",
1655 v4_signature: false,
1656 }
1657 `,
1658 expected: "",
1659 },
1660 {
1661 name: "module certificate property",
1662 bp: `
1663 android_app {
1664 name: "foo",
1665 srcs: ["a.java"],
1666 sdk_version: "current",
1667 v4_signature: true,
1668 }
1669 `,
1670 expected: "--enable-v4",
1671 },
1672 }
1673
1674 for _, test := range testCases {
1675 t.Run(test.name, func(t *testing.T) {
1676 config := testAppConfig(nil, test.bp, nil)
Colin Crossae8600b2020-10-29 17:09:13 -07001677 ctx := testContext(config)
Songchun Fan688de9a2020-03-24 20:32:24 -07001678
1679 run(t, ctx, config)
1680 foo := ctx.ModuleForTests("foo", "android_common")
1681
1682 signapk := foo.Output("foo.apk")
1683 signFlags := signapk.Args["flags"]
1684 if test.expected != signFlags {
1685 t.Errorf("Incorrect signing flags, expected: %q, got: %q", test.expected, signFlags)
1686 }
1687 })
1688 }
1689}
1690
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001691func TestPackageNameOverride(t *testing.T) {
1692 testCases := []struct {
1693 name string
1694 bp string
1695 packageNameOverride string
1696 expected []string
1697 }{
1698 {
1699 name: "default",
1700 bp: `
1701 android_app {
1702 name: "foo",
1703 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001704 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001705 }
1706 `,
1707 packageNameOverride: "",
1708 expected: []string{
1709 buildDir + "/.intermediates/foo/android_common/foo.apk",
1710 buildDir + "/target/product/test_device/system/app/foo/foo.apk",
1711 },
1712 },
1713 {
1714 name: "overridden",
1715 bp: `
1716 android_app {
1717 name: "foo",
1718 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001719 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001720 }
1721 `,
1722 packageNameOverride: "foo:bar",
1723 expected: []string{
1724 // The package apk should be still be the original name for test dependencies.
Jaewoong Jung5a498812019-11-07 14:14:38 -08001725 buildDir + "/.intermediates/foo/android_common/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001726 buildDir + "/target/product/test_device/system/app/bar/bar.apk",
1727 },
1728 },
1729 }
1730
1731 for _, test := range testCases {
1732 t.Run(test.name, func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -08001733 config := testAppConfig(nil, test.bp, nil)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001734 if test.packageNameOverride != "" {
1735 config.TestProductVariables.PackageNameOverrides = []string{test.packageNameOverride}
1736 }
Colin Crossae8600b2020-10-29 17:09:13 -07001737 ctx := testContext(config)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001738
1739 run(t, ctx, config)
1740 foo := ctx.ModuleForTests("foo", "android_common")
1741
1742 outputs := foo.AllOutputs()
1743 outputMap := make(map[string]bool)
1744 for _, o := range outputs {
1745 outputMap[o] = true
1746 }
1747 for _, e := range test.expected {
1748 if _, exist := outputMap[e]; !exist {
1749 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
1750 }
1751 }
1752 })
1753 }
1754}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001755
1756func TestInstrumentationTargetOverridden(t *testing.T) {
1757 bp := `
1758 android_app {
1759 name: "foo",
1760 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001761 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001762 }
1763
1764 android_test {
1765 name: "bar",
1766 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001767 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001768 }
1769 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001770 config := testAppConfig(nil, bp, nil)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001771 config.TestProductVariables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
Colin Crossae8600b2020-10-29 17:09:13 -07001772 ctx := testContext(config)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001773
1774 run(t, ctx, config)
1775
1776 bar := ctx.ModuleForTests("bar", "android_common")
1777 res := bar.Output("package-res.apk")
1778 aapt2Flags := res.Args["flags"]
1779 e := "--rename-instrumentation-target-package org.dandroid.bp"
1780 if !strings.Contains(aapt2Flags, e) {
1781 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
1782 }
1783}
Jaewoong Jung525443a2019-02-28 15:35:54 -08001784
1785func TestOverrideAndroidApp(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001786 ctx, _ := testJava(t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08001787 android_app {
1788 name: "foo",
1789 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07001790 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001791 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001792 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001793 }
1794
1795 override_android_app {
1796 name: "bar",
1797 base: "foo",
1798 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001799 lineage: "lineage.bin",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001800 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001801 }
1802
1803 android_app_certificate {
1804 name: "new_certificate",
1805 certificate: "cert/new_cert",
1806 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001807
1808 override_android_app {
1809 name: "baz",
1810 base: "foo",
1811 package_name: "org.dandroid.bp",
1812 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001813
1814 override_android_app {
1815 name: "baz_no_rename_resources",
1816 base: "foo",
1817 package_name: "org.dandroid.bp",
1818 rename_resources_package: false,
1819 }
1820
1821 android_app {
1822 name: "foo_no_rename_resources",
1823 srcs: ["a.java"],
1824 certificate: "expiredkey",
1825 overrides: ["qux"],
1826 rename_resources_package: false,
1827 sdk_version: "current",
1828 }
1829
1830 override_android_app {
1831 name: "baz_base_no_rename_resources",
1832 base: "foo_no_rename_resources",
1833 package_name: "org.dandroid.bp",
1834 }
1835
1836 override_android_app {
1837 name: "baz_override_base_rename_resources",
1838 base: "foo_no_rename_resources",
1839 package_name: "org.dandroid.bp",
1840 rename_resources_package: true,
1841 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08001842 `)
1843
1844 expectedVariants := []struct {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001845 name string
1846 moduleName string
1847 variantName string
1848 apkName string
1849 apkPath string
1850 certFlag string
1851 lineageFlag string
1852 overrides []string
1853 packageFlag string
1854 renameResources bool
1855 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08001856 }{
1857 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001858 name: "foo",
1859 moduleName: "foo",
1860 variantName: "android_common",
1861 apkPath: "/target/product/test_device/system/app/foo/foo.apk",
1862 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1863 lineageFlag: "",
1864 overrides: []string{"qux"},
1865 packageFlag: "",
1866 renameResources: false,
1867 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001868 },
1869 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001870 name: "foo",
1871 moduleName: "bar",
1872 variantName: "android_common_bar",
1873 apkPath: "/target/product/test_device/system/app/bar/bar.apk",
1874 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
1875 lineageFlag: "--lineage lineage.bin",
1876 overrides: []string{"qux", "foo"},
1877 packageFlag: "",
1878 renameResources: false,
1879 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001880 },
1881 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001882 name: "foo",
1883 moduleName: "baz",
1884 variantName: "android_common_baz",
1885 apkPath: "/target/product/test_device/system/app/baz/baz.apk",
1886 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1887 lineageFlag: "",
1888 overrides: []string{"qux", "foo"},
1889 packageFlag: "org.dandroid.bp",
1890 renameResources: true,
1891 logging_parent: "",
1892 },
1893 {
1894 name: "foo",
1895 moduleName: "baz_no_rename_resources",
1896 variantName: "android_common_baz_no_rename_resources",
1897 apkPath: "/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
1898 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1899 lineageFlag: "",
1900 overrides: []string{"qux", "foo"},
1901 packageFlag: "org.dandroid.bp",
1902 renameResources: false,
1903 logging_parent: "",
1904 },
1905 {
1906 name: "foo_no_rename_resources",
1907 moduleName: "baz_base_no_rename_resources",
1908 variantName: "android_common_baz_base_no_rename_resources",
1909 apkPath: "/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
1910 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1911 lineageFlag: "",
1912 overrides: []string{"qux", "foo_no_rename_resources"},
1913 packageFlag: "org.dandroid.bp",
1914 renameResources: false,
1915 logging_parent: "",
1916 },
1917 {
1918 name: "foo_no_rename_resources",
1919 moduleName: "baz_override_base_rename_resources",
1920 variantName: "android_common_baz_override_base_rename_resources",
1921 apkPath: "/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
1922 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1923 lineageFlag: "",
1924 overrides: []string{"qux", "foo_no_rename_resources"},
1925 packageFlag: "org.dandroid.bp",
1926 renameResources: true,
1927 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001928 },
1929 }
1930 for _, expected := range expectedVariants {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001931 variant := ctx.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001932
1933 // Check the final apk name
1934 outputs := variant.AllOutputs()
1935 expectedApkPath := buildDir + expected.apkPath
1936 found := false
1937 for _, o := range outputs {
1938 if o == expectedApkPath {
1939 found = true
1940 break
1941 }
1942 }
1943 if !found {
1944 t.Errorf("Can't find %q in output files.\nAll outputs:%v", expectedApkPath, outputs)
1945 }
1946
1947 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08001948 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001949 certFlag := signapk.Args["certificates"]
1950 if expected.certFlag != certFlag {
1951 t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected.certFlag, certFlag)
1952 }
1953
1954 // Check the lineage flags
1955 lineageFlag := signapk.Args["flags"]
1956 if expected.lineageFlag != lineageFlag {
1957 t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected.lineageFlag, lineageFlag)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001958 }
1959
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001960 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08001961 mod := variant.Module().(*AndroidApp)
1962 if !reflect.DeepEqual(expected.overrides, mod.appProperties.Overrides) {
1963 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
1964 expected.overrides, mod.appProperties.Overrides)
1965 }
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
1969 if expected.logging_parent != logging_parent {
1970 t.Errorf("Incorrect overrides property value for logging parent, expected: %q, got: %q",
1971 expected.logging_parent, logging_parent)
1972 }
1973
Liz Kammer1d5983b2020-05-19 19:15:37 +00001974 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001975 res := variant.Output("package-res.apk")
1976 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00001977 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
1978 expectedPackage := expected.packageFlag
1979 if !expected.renameResources {
1980 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00001981 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001982 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001983 }
1984}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07001985
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001986func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001987 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001988 android_app {
1989 name: "foo",
1990 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001991 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001992 }
1993
1994 override_android_app {
1995 name: "bar",
1996 base: "foo",
1997 package_name: "org.dandroid.bp",
1998 }
1999
2000 android_test {
2001 name: "baz",
2002 srcs: ["b.java"],
2003 instrumentation_for: "foo",
2004 }
2005
2006 android_test {
2007 name: "qux",
2008 srcs: ["b.java"],
2009 instrumentation_for: "bar",
2010 }
2011 `)
2012
2013 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
2014 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
2015 fooTurbine := filepath.Join(buildDir, ".intermediates", "foo", "android_common", "turbine-combined", "foo.jar")
2016 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2017 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2018 }
2019
2020 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
2021 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
2022 barTurbine := filepath.Join(buildDir, ".intermediates", "foo", "android_common_bar", "turbine-combined", "foo.jar")
2023 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2024 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2025 }
2026}
2027
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002028func TestOverrideAndroidTest(t *testing.T) {
2029 ctx, _ := testJava(t, `
2030 android_app {
2031 name: "foo",
2032 srcs: ["a.java"],
2033 package_name: "com.android.foo",
2034 sdk_version: "current",
2035 }
2036
2037 override_android_app {
2038 name: "bar",
2039 base: "foo",
2040 package_name: "com.android.bar",
2041 }
2042
2043 android_test {
2044 name: "foo_test",
2045 srcs: ["b.java"],
2046 instrumentation_for: "foo",
2047 }
2048
2049 override_android_test {
2050 name: "bar_test",
2051 base: "foo_test",
2052 package_name: "com.android.bar.test",
2053 instrumentation_for: "bar",
2054 instrumentation_target_package: "com.android.bar",
2055 }
2056 `)
2057
2058 expectedVariants := []struct {
2059 moduleName string
2060 variantName string
2061 apkPath string
2062 overrides []string
2063 targetVariant string
2064 packageFlag string
2065 targetPackageFlag string
2066 }{
2067 {
2068 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002069 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002070 overrides: nil,
2071 targetVariant: "android_common",
2072 packageFlag: "",
2073 targetPackageFlag: "",
2074 },
2075 {
2076 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002077 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002078 overrides: []string{"foo_test"},
2079 targetVariant: "android_common_bar",
2080 packageFlag: "com.android.bar.test",
2081 targetPackageFlag: "com.android.bar",
2082 },
2083 }
2084 for _, expected := range expectedVariants {
2085 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2086
2087 // Check the final apk name
2088 outputs := variant.AllOutputs()
2089 expectedApkPath := buildDir + expected.apkPath
2090 found := false
2091 for _, o := range outputs {
2092 if o == expectedApkPath {
2093 found = true
2094 break
2095 }
2096 }
2097 if !found {
2098 t.Errorf("Can't find %q in output files.\nAll outputs:%v", expectedApkPath, outputs)
2099 }
2100
2101 // Check if the overrides field values are correctly aggregated.
2102 mod := variant.Module().(*AndroidTest)
2103 if !reflect.DeepEqual(expected.overrides, mod.appProperties.Overrides) {
2104 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
2105 expected.overrides, mod.appProperties.Overrides)
2106 }
2107
2108 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
2109 javac := variant.Rule("javac")
2110 turbine := filepath.Join(buildDir, ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
2111 if !strings.Contains(javac.Args["classpath"], turbine) {
2112 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2113 }
2114
2115 // Check aapt2 flags.
2116 res := variant.Output("package-res.apk")
2117 aapt2Flags := res.Args["flags"]
2118 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002119 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002120 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2121 }
2122}
2123
Jaewoong Jung39982342020-01-14 10:27:18 -08002124func TestAndroidTest_FixTestConfig(t *testing.T) {
2125 ctx, _ := testJava(t, `
2126 android_app {
2127 name: "foo",
2128 srcs: ["a.java"],
2129 package_name: "com.android.foo",
2130 sdk_version: "current",
2131 }
2132
2133 android_test {
2134 name: "foo_test",
2135 srcs: ["b.java"],
2136 instrumentation_for: "foo",
2137 }
2138
2139 android_test {
2140 name: "bar_test",
2141 srcs: ["b.java"],
2142 package_name: "com.android.bar.test",
2143 instrumentation_for: "foo",
2144 }
2145
2146 override_android_test {
2147 name: "baz_test",
2148 base: "foo_test",
2149 package_name: "com.android.baz.test",
2150 }
2151 `)
2152
2153 testCases := []struct {
2154 moduleName string
2155 variantName string
2156 expectedFlags []string
2157 }{
2158 {
2159 moduleName: "foo_test",
2160 variantName: "android_common",
2161 },
2162 {
2163 moduleName: "bar_test",
2164 variantName: "android_common",
2165 expectedFlags: []string{
2166 "--manifest " + buildDir + "/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
2167 "--package-name com.android.bar.test",
2168 },
2169 },
2170 {
2171 moduleName: "foo_test",
2172 variantName: "android_common_baz_test",
2173 expectedFlags: []string{
2174 "--manifest " + buildDir +
2175 "/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
2176 "--package-name com.android.baz.test",
2177 "--test-file-name baz_test.apk",
2178 },
2179 },
2180 }
2181
2182 for _, test := range testCases {
2183 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
2184 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
2185
2186 if len(test.expectedFlags) > 0 {
2187 if params.Rule == nil {
2188 t.Errorf("test_config_fixer was expected to run, but didn't")
2189 } else {
2190 for _, flag := range test.expectedFlags {
2191 if !strings.Contains(params.RuleParams.Command, flag) {
2192 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
2193 }
2194 }
2195 }
2196 } else {
2197 if params.Rule != nil {
2198 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
2199 }
2200 }
2201
2202 }
2203}
2204
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002205func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002206 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002207 cc_library {
2208 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08002209 sdk_version: "current",
2210 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002211 }
2212
2213 android_test {
2214 name: "stl",
2215 jni_libs: ["libjni"],
2216 compile_multilib: "both",
2217 sdk_version: "current",
2218 stl: "c++_shared",
2219 }
2220
2221 android_test {
2222 name: "system",
2223 jni_libs: ["libjni"],
2224 compile_multilib: "both",
2225 sdk_version: "current",
2226 }
2227 `)
2228
2229 testCases := []struct {
2230 name string
2231 jnis []string
2232 }{
2233 {"stl",
2234 []string{
2235 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07002236 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002237 },
2238 },
2239 {"system",
2240 []string{
2241 "libjni.so",
2242 },
2243 },
2244 }
2245
2246 for _, test := range testCases {
2247 t.Run(test.name, func(t *testing.T) {
2248 app := ctx.ModuleForTests(test.name, "android_common")
2249 jniLibZip := app.Output("jnilibs.zip")
2250 var jnis []string
2251 args := strings.Fields(jniLibZip.Args["jarArgs"])
2252 for i := 0; i < len(args); i++ {
2253 if args[i] == "-f" {
2254 jnis = append(jnis, args[i+1])
2255 i += 1
2256 }
2257 }
2258 jnisJoined := strings.Join(jnis, " ")
2259 for _, jni := range test.jnis {
2260 if !strings.Contains(jnisJoined, jni) {
2261 t.Errorf("missing jni %q in %q", jni, jnis)
2262 }
2263 }
2264 })
2265 }
2266}
Colin Cross50ddcc42019-05-16 12:28:22 -07002267
2268func TestUsesLibraries(t *testing.T) {
2269 bp := `
2270 java_sdk_library {
2271 name: "foo",
2272 srcs: ["a.java"],
2273 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002274 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002275 }
2276
2277 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01002278 name: "qux",
2279 srcs: ["a.java"],
2280 api_packages: ["qux"],
2281 sdk_version: "current",
2282 }
2283
2284 java_sdk_library {
2285 name: "quuz",
2286 srcs: ["a.java"],
2287 api_packages: ["quuz"],
2288 sdk_version: "current",
2289 }
2290
2291 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002292 name: "fred",
2293 srcs: ["a.java"],
2294 api_packages: ["fred"],
2295 sdk_version: "current",
2296 }
2297
2298 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07002299 name: "bar",
2300 srcs: ["a.java"],
2301 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002302 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002303 }
2304
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01002305 java_sdk_library {
2306 name: "runtime-library",
2307 srcs: ["a.java"],
2308 sdk_version: "current",
2309 }
2310
2311 java_library {
2312 name: "static-runtime-helper",
2313 srcs: ["a.java"],
2314 libs: ["runtime-library"],
2315 sdk_version: "current",
2316 }
2317
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002318 // A library that has to use "provides_uses_lib", because:
2319 // - it is not an SDK library
2320 // - its library name is different from its module name
2321 java_library {
2322 name: "non-sdk-lib",
2323 provides_uses_lib: "com.non.sdk.lib",
2324 installable: true,
2325 srcs: ["a.java"],
2326 }
2327
Colin Cross50ddcc42019-05-16 12:28:22 -07002328 android_app {
2329 name: "app",
2330 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002331 libs: [
2332 "qux",
2333 "quuz.stubs"
2334 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002335 static_libs: [
2336 "static-runtime-helper",
2337 // statically linked component libraries should not pull their SDK libraries,
2338 // so "fred" should not be added to class loader context
2339 "fred.stubs",
2340 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002341 uses_libs: [
2342 "foo",
2343 "non-sdk-lib"
2344 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002345 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002346 optional_uses_libs: [
2347 "bar",
2348 "baz",
2349 ],
2350 }
2351
2352 android_app_import {
2353 name: "prebuilt",
2354 apk: "prebuilts/apk/app.apk",
2355 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002356 uses_libs: [
2357 "foo",
2358 "non-sdk-lib",
2359 "android.test.runner"
2360 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07002361 optional_uses_libs: [
2362 "bar",
2363 "baz",
2364 ],
2365 }
2366 `
2367
Colin Cross98be1bb2019-12-13 20:41:13 -08002368 config := testAppConfig(nil, bp, nil)
Colin Cross50ddcc42019-05-16 12:28:22 -07002369 config.TestProductVariables.MissingUsesLibraries = []string{"baz"}
2370
Colin Crossae8600b2020-10-29 17:09:13 -07002371 ctx := testContext(config)
Colin Cross50ddcc42019-05-16 12:28:22 -07002372
2373 run(t, ctx, config)
2374
2375 app := ctx.ModuleForTests("app", "android_common")
2376 prebuilt := ctx.ModuleForTests("prebuilt", "android_common")
2377
Paul Duffin859fe962020-05-15 10:20:31 +01002378 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002379 // This should not include explicit `uses_libs`/`optional_uses_libs` entries.
2380 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2381 expectManifestFixerArgs := `--extract-native-libs=true ` +
2382 `--uses-library qux ` +
2383 `--uses-library quuz ` +
2384 `--uses-library foo ` + // TODO(b/132357300): "foo" should not be passed to manifest_fixer
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002385 `--uses-library com.non.sdk.lib ` + // TODO(b/132357300): "com.non.sdk.lib" should not be passed to manifest_fixer
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002386 `--uses-library bar ` + // TODO(b/132357300): "bar" should not be passed to manifest_fixer
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002387 `--uses-library runtime-library`
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002388 if actualManifestFixerArgs != expectManifestFixerArgs {
2389 t.Errorf("unexpected manifest_fixer args:\n\texpect: %q\n\tactual: %q",
2390 expectManifestFixerArgs, actualManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01002391 }
2392
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002393 // Test that all libraries are verified (library order matters).
2394 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
2395 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002396 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002397 `--uses-library qux ` +
2398 `--uses-library quuz ` +
2399 `--uses-library runtime-library ` +
2400 `--optional-uses-library bar ` +
2401 `--optional-uses-library baz `
2402 if !strings.Contains(verifyCmd, verifyArgs) {
2403 t.Errorf("wanted %q in %q", verifyArgs, verifyCmd)
Colin Cross50ddcc42019-05-16 12:28:22 -07002404 }
2405
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002406 // Test that all libraries are verified for an APK (library order matters).
2407 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovichfe927a22021-02-26 14:36:48 +00002408 verifyApkReqLibs := `uses_library_names="foo com.non.sdk.lib android.test.runner"`
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002409 verifyApkOptLibs := `optional_uses_library_names="bar baz"`
2410 if !strings.Contains(verifyApkCmd, verifyApkReqLibs) {
2411 t.Errorf("wanted %q in %q", verifyApkReqLibs, verifyApkCmd)
Colin Cross50ddcc42019-05-16 12:28:22 -07002412 }
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002413 if !strings.Contains(verifyApkCmd, verifyApkOptLibs) {
2414 t.Errorf("wanted %q in %q", verifyApkOptLibs, verifyApkCmd)
Colin Cross50ddcc42019-05-16 12:28:22 -07002415 }
2416
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002417 // Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002418 cmd := app.Rule("dexpreopt").RuleParams.Command
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002419 w := `--target-context-for-sdk any ` +
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002420 `PCL[/system/framework/qux.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002421 `PCL[/system/framework/quuz.jar]#` +
2422 `PCL[/system/framework/foo.jar]#` +
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002423 `PCL[/system/framework/non-sdk-lib.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002424 `PCL[/system/framework/bar.jar]#` +
2425 `PCL[/system/framework/runtime-library.jar]`
Ulya Trafimovichfc24ad32020-08-19 16:32:54 +01002426 if !strings.Contains(cmd, w) {
Colin Cross50ddcc42019-05-16 12:28:22 -07002427 t.Errorf("wanted %q in %q", w, cmd)
2428 }
2429
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002430 // Test conditional context for target SDK version 28.
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002431 if w := `--target-context-for-sdk 28` +
2432 ` PCL[/system/framework/org.apache.http.legacy.jar] `; !strings.Contains(cmd, w) {
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002433 t.Errorf("wanted %q in %q", w, cmd)
2434 }
2435
2436 // Test conditional context for target SDK version 29.
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002437 if w := `--target-context-for-sdk 29` +
Ulya Trafimovichc9f2b942020-12-23 15:41:29 +00002438 ` PCL[/system/framework/android.hidl.manager-V1.0-java.jar]` +
2439 `#PCL[/system/framework/android.hidl.base-V1.0-java.jar] `; !strings.Contains(cmd, w) {
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002440 t.Errorf("wanted %q in %q", w, cmd)
2441 }
2442
2443 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002444 // "android.test.mock" is absent because "android.test.runner" is not used.
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002445 if w := `--target-context-for-sdk 30` +
2446 ` PCL[/system/framework/android.test.base.jar] `; !strings.Contains(cmd, w) {
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002447 t.Errorf("wanted %q in %q", w, cmd)
2448 }
2449
Ulya Trafimovichfc24ad32020-08-19 16:32:54 +01002450 cmd = prebuilt.Rule("dexpreopt").RuleParams.Command
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002451 if w := `--target-context-for-sdk any` +
2452 ` PCL[/system/framework/foo.jar]` +
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002453 `#PCL[/system/framework/non-sdk-lib.jar]` +
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002454 `#PCL[/system/framework/android.test.runner.jar]` +
2455 `#PCL[/system/framework/bar.jar] `; !strings.Contains(cmd, w) {
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002456 t.Errorf("wanted %q in %q", w, cmd)
2457 }
2458
2459 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002460 // "android.test.mock" is present because "android.test.runner" is used.
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002461 if w := `--target-context-for-sdk 30` +
2462 ` PCL[/system/framework/android.test.base.jar]` +
2463 `#PCL[/system/framework/android.test.mock.jar] `; !strings.Contains(cmd, w) {
Colin Cross50ddcc42019-05-16 12:28:22 -07002464 t.Errorf("wanted %q in %q", w, cmd)
2465 }
2466}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002467
2468func TestCodelessApp(t *testing.T) {
2469 testCases := []struct {
2470 name string
2471 bp string
2472 noCode bool
2473 }{
2474 {
2475 name: "normal",
2476 bp: `
2477 android_app {
2478 name: "foo",
2479 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002480 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002481 }
2482 `,
2483 noCode: false,
2484 },
2485 {
2486 name: "app without sources",
2487 bp: `
2488 android_app {
2489 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002490 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002491 }
2492 `,
2493 noCode: true,
2494 },
2495 {
2496 name: "app with libraries",
2497 bp: `
2498 android_app {
2499 name: "foo",
2500 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002501 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002502 }
2503
2504 java_library {
2505 name: "lib",
2506 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002507 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002508 }
2509 `,
2510 noCode: false,
2511 },
2512 {
2513 name: "app with sourceless libraries",
2514 bp: `
2515 android_app {
2516 name: "foo",
2517 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002518 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002519 }
2520
2521 java_library {
2522 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002523 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002524 }
2525 `,
2526 // TODO(jungjw): this should probably be true
2527 noCode: false,
2528 },
2529 }
2530
2531 for _, test := range testCases {
2532 t.Run(test.name, func(t *testing.T) {
2533 ctx := testApp(t, test.bp)
2534
2535 foo := ctx.ModuleForTests("foo", "android_common")
2536 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2537 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
2538 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
2539 }
2540 })
2541 }
2542}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002543
2544func TestEmbedNotice(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -07002545 ctx, _ := testJavaWithFS(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002546 android_app {
2547 name: "foo",
2548 srcs: ["a.java"],
2549 static_libs: ["javalib"],
2550 jni_libs: ["libjni"],
2551 notice: "APP_NOTICE",
2552 embed_notices: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002553 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002554 }
2555
2556 // No embed_notice flag
2557 android_app {
2558 name: "bar",
2559 srcs: ["a.java"],
2560 jni_libs: ["libjni"],
2561 notice: "APP_NOTICE",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002562 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002563 }
2564
2565 // No NOTICE files
2566 android_app {
2567 name: "baz",
2568 srcs: ["a.java"],
2569 embed_notices: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002570 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002571 }
2572
2573 cc_library {
2574 name: "libjni",
2575 system_shared_libs: [],
2576 stl: "none",
2577 notice: "LIB_NOTICE",
Colin Cross094cde42020-02-15 10:38:00 -08002578 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002579 }
2580
2581 java_library {
2582 name: "javalib",
2583 srcs: [
2584 ":gen",
2585 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002586 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002587 }
2588
2589 genrule {
2590 name: "gen",
2591 tools: ["gentool"],
2592 out: ["gen.java"],
2593 notice: "GENRULE_NOTICE",
2594 }
2595
2596 java_binary_host {
2597 name: "gentool",
2598 srcs: ["b.java"],
2599 notice: "TOOL_NOTICE",
2600 }
Colin Cross238c1f32020-06-07 16:58:18 -07002601 `, map[string][]byte{
2602 "APP_NOTICE": nil,
2603 "GENRULE_NOTICE": nil,
2604 "LIB_NOTICE": nil,
2605 "TOOL_NOTICE": nil,
2606 })
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002607
2608 // foo has NOTICE files to process, and embed_notices is true.
2609 foo := ctx.ModuleForTests("foo", "android_common")
2610 // verify merge notices rule.
2611 mergeNotices := foo.Rule("mergeNoticesRule")
2612 noticeInputs := mergeNotices.Inputs.Strings()
2613 // TOOL_NOTICE should be excluded as it's a host module.
2614 if len(mergeNotices.Inputs) != 3 {
2615 t.Errorf("number of input notice files: expected = 3, actual = %q", noticeInputs)
2616 }
2617 if !inList("APP_NOTICE", noticeInputs) {
2618 t.Errorf("APP_NOTICE is missing from notice files, %q", noticeInputs)
2619 }
2620 if !inList("LIB_NOTICE", noticeInputs) {
2621 t.Errorf("LIB_NOTICE is missing from notice files, %q", noticeInputs)
2622 }
2623 if !inList("GENRULE_NOTICE", noticeInputs) {
2624 t.Errorf("GENRULE_NOTICE is missing from notice files, %q", noticeInputs)
2625 }
2626 // aapt2 flags should include -A <NOTICE dir> so that its contents are put in the APK's /assets.
2627 res := foo.Output("package-res.apk")
2628 aapt2Flags := res.Args["flags"]
2629 e := "-A " + buildDir + "/.intermediates/foo/android_common/NOTICE"
2630 if !strings.Contains(aapt2Flags, e) {
2631 t.Errorf("asset dir flag for NOTICE, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
2632 }
2633
2634 // bar has NOTICE files to process, but embed_notices is not set.
2635 bar := ctx.ModuleForTests("bar", "android_common")
Jaewoong Jung98772792019-07-01 17:15:13 -07002636 res = bar.Output("package-res.apk")
2637 aapt2Flags = res.Args["flags"]
2638 e = "-A " + buildDir + "/.intermediates/bar/android_common/NOTICE"
2639 if strings.Contains(aapt2Flags, e) {
2640 t.Errorf("bar shouldn't have the asset dir flag for NOTICE: %q", e)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002641 }
2642
2643 // baz's embed_notice is true, but it doesn't have any NOTICE files.
2644 baz := ctx.ModuleForTests("baz", "android_common")
Jaewoong Jung98772792019-07-01 17:15:13 -07002645 res = baz.Output("package-res.apk")
2646 aapt2Flags = res.Args["flags"]
2647 e = "-A " + buildDir + "/.intermediates/baz/android_common/NOTICE"
2648 if strings.Contains(aapt2Flags, e) {
2649 t.Errorf("baz shouldn't have the asset dir flag for NOTICE: %q", e)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002650 }
2651}
Colin Cross53a87f52019-06-25 13:35:30 -07002652
2653func TestUncompressDex(t *testing.T) {
2654 testCases := []struct {
2655 name string
2656 bp string
2657
2658 uncompressedPlatform bool
2659 uncompressedUnbundled bool
2660 }{
2661 {
2662 name: "normal",
2663 bp: `
2664 android_app {
2665 name: "foo",
2666 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002667 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002668 }
2669 `,
2670 uncompressedPlatform: true,
2671 uncompressedUnbundled: false,
2672 },
2673 {
2674 name: "use_embedded_dex",
2675 bp: `
2676 android_app {
2677 name: "foo",
2678 use_embedded_dex: true,
2679 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002680 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002681 }
2682 `,
2683 uncompressedPlatform: true,
2684 uncompressedUnbundled: true,
2685 },
2686 {
2687 name: "privileged",
2688 bp: `
2689 android_app {
2690 name: "foo",
2691 privileged: true,
2692 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002693 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002694 }
2695 `,
2696 uncompressedPlatform: true,
2697 uncompressedUnbundled: true,
2698 },
David Srbeckye033cba2020-05-20 22:20:28 +01002699 {
2700 name: "normal_uncompress_dex_true",
2701 bp: `
2702 android_app {
2703 name: "foo",
2704 srcs: ["a.java"],
2705 sdk_version: "current",
2706 uncompress_dex: true,
2707 }
2708 `,
2709 uncompressedPlatform: true,
2710 uncompressedUnbundled: true,
2711 },
2712 {
2713 name: "normal_uncompress_dex_false",
2714 bp: `
2715 android_app {
2716 name: "foo",
2717 srcs: ["a.java"],
2718 sdk_version: "current",
2719 uncompress_dex: false,
2720 }
2721 `,
2722 uncompressedPlatform: false,
2723 uncompressedUnbundled: false,
2724 },
Colin Cross53a87f52019-06-25 13:35:30 -07002725 }
2726
2727 test := func(t *testing.T, bp string, want bool, unbundled bool) {
2728 t.Helper()
2729
Colin Cross98be1bb2019-12-13 20:41:13 -08002730 config := testAppConfig(nil, bp, nil)
Colin Cross53a87f52019-06-25 13:35:30 -07002731 if unbundled {
2732 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
Jeongik Cha816a23a2020-07-08 01:09:23 +09002733 config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
Colin Cross53a87f52019-06-25 13:35:30 -07002734 }
2735
Colin Crossae8600b2020-10-29 17:09:13 -07002736 ctx := testContext(config)
Colin Cross53a87f52019-06-25 13:35:30 -07002737
2738 run(t, ctx, config)
2739
2740 foo := ctx.ModuleForTests("foo", "android_common")
2741 dex := foo.Rule("r8")
2742 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
2743 aligned := foo.MaybeRule("zipalign").Rule != nil
2744
2745 if uncompressedInDexJar != want {
2746 t.Errorf("want uncompressed in dex %v, got %v", want, uncompressedInDexJar)
2747 }
2748
2749 if aligned != want {
2750 t.Errorf("want aligned %v, got %v", want, aligned)
2751 }
2752 }
2753
2754 for _, tt := range testCases {
2755 t.Run(tt.name, func(t *testing.T) {
2756 t.Run("platform", func(t *testing.T) {
2757 test(t, tt.bp, tt.uncompressedPlatform, false)
2758 })
2759 t.Run("unbundled", func(t *testing.T) {
2760 test(t, tt.bp, tt.uncompressedUnbundled, true)
2761 })
2762 })
2763 }
2764}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002765
2766func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
2767 if expectedValue != "" {
2768 expectedFlag := "--" + flagName + " " + expectedValue
2769 if !strings.Contains(aapt2Flags, expectedFlag) {
2770 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
2771 }
2772 } else {
2773 unexpectedFlag := "--" + flagName
2774 if strings.Contains(aapt2Flags, unexpectedFlag) {
2775 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
2776 }
2777 }
2778}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08002779
Cole Faust9a631312020-10-22 21:05:24 +00002780func TestExportedProguardFlagFiles(t *testing.T) {
2781 ctx, _ := testJava(t, `
2782 android_app {
2783 name: "foo",
2784 sdk_version: "current",
2785 static_libs: ["lib1"],
2786 }
2787
2788 android_library {
2789 name: "lib1",
2790 sdk_version: "current",
2791 optimize: {
2792 proguard_flags_files: ["lib1proguard.cfg"],
2793 }
2794 }
2795 `)
2796
2797 m := ctx.ModuleForTests("foo", "android_common")
2798 hasLib1Proguard := false
2799 for _, s := range m.Rule("java.r8").Implicits.Strings() {
2800 if s == "lib1proguard.cfg" {
2801 hasLib1Proguard = true
2802 break
2803 }
2804 }
2805
2806 if !hasLib1Proguard {
2807 t.Errorf("App does not use library proguard config")
2808 }
2809}