blob: 7168a9645063419f5d3fd5cfdb9bb305ea40752b [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
Paul Duffin0ed42d32021-03-13 02:19:32 +000031// testAppConfig is a legacy way of creating a test Config for testing java app modules.
32//
33// See testJava for an explanation as to how to stop using this deprecated method.
34//
35// deprecated
36func testAppConfig(env map[string]string, bp string, fs map[string][]byte) android.Config {
37 return testConfig(env, bp, fs)
38}
39
40// testApp runs tests using the javaFixtureFactory
41//
42// See testJava for an explanation as to how to stop using this deprecated method.
43//
44// deprecated
45func testApp(t *testing.T, bp string) *android.TestContext {
46 t.Helper()
47 result := javaFixtureFactory.RunTestWithBp(t, bp)
48 return result.TestContext
49}
50
51func TestApp(t *testing.T) {
52 resourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080053 "res/layout/layout.xml",
54 "res/values/strings.xml",
55 "res/values-en-rUS/strings.xml",
56 }
57
Paul Duffin0ed42d32021-03-13 02:19:32 +000058 compiledResourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080059 "aapt2/res/layout_layout.xml.flat",
60 "aapt2/res/values_strings.arsc.flat",
61 "aapt2/res/values-en-rUS_strings.arsc.flat",
62 }
Colin Cross3bc7ffa2017-11-22 16:19:37 -080063
Colin Crossa97c5d32018-03-28 14:58:31 -070064 for _, moduleType := range []string{"android_app", "android_library"} {
65 t.Run(moduleType, func(t *testing.T) {
Paul Duffin0ed42d32021-03-13 02:19:32 +000066 result := javaFixtureFactory.Extend(
67 android.FixtureModifyMockFS(func(fs android.MockFS) {
68 for _, file := range resourceFiles {
69 fs[file] = nil
70 }
71 }),
72 ).RunTestWithBp(t, moduleType+` {
Colin Crossa97c5d32018-03-28 14:58:31 -070073 name: "foo",
74 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090075 sdk_version: "current"
Colin Crossa97c5d32018-03-28 14:58:31 -070076 }
77 `)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080078
Paul Duffin0ed42d32021-03-13 02:19:32 +000079 foo := result.ModuleForTests("foo", "android_common")
Colin Cross3bc7ffa2017-11-22 16:19:37 -080080
Colin Cross31656952018-05-24 16:11:20 -070081 var expectedLinkImplicits []string
82
83 manifestFixer := foo.Output("manifest_fixer/AndroidManifest.xml")
84 expectedLinkImplicits = append(expectedLinkImplicits, manifestFixer.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080085
Paul Duffin0ed42d32021-03-13 02:19:32 +000086 frameworkRes := result.ModuleForTests("framework-res", "android_common")
Colin Crossa97c5d32018-03-28 14:58:31 -070087 expectedLinkImplicits = append(expectedLinkImplicits,
88 frameworkRes.Output("package-res.apk").Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080089
Colin Crossa97c5d32018-03-28 14:58:31 -070090 // Test the mapping from input files to compiled output file names
91 compile := foo.Output(compiledResourceFiles[0])
Paul Duffin0ed42d32021-03-13 02:19:32 +000092 android.AssertDeepEquals(t, "aapt2 compile inputs", resourceFiles, compile.Inputs.Strings())
Colin Crossb69301e2017-12-01 10:48:26 -080093
Colin Crossa97c5d32018-03-28 14:58:31 -070094 compiledResourceOutputs := compile.Outputs.Strings()
95 sort.Strings(compiledResourceOutputs)
Colin Crossb69301e2017-12-01 10:48:26 -080096
Colin Crossa97c5d32018-03-28 14:58:31 -070097 expectedLinkImplicits = append(expectedLinkImplicits, compiledResourceOutputs...)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080098
Colin Crossa97c5d32018-03-28 14:58:31 -070099 list := foo.Output("aapt2/res.list")
100 expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800101
Colin Crossa97c5d32018-03-28 14:58:31 -0700102 // Check that the link rule uses
Paul Duffin0ed42d32021-03-13 02:19:32 +0000103 res := result.ModuleForTests("foo", "android_common").Output("package-res.apk")
104 android.AssertDeepEquals(t, "aapt2 link implicits", expectedLinkImplicits, res.Implicits.Strings())
Colin Crossa97c5d32018-03-28 14:58:31 -0700105 })
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800106 }
107}
Colin Cross890ff552017-11-30 20:13:19 -0800108
Colin Crosse560c4a2019-03-19 16:03:11 -0700109func TestAppSplits(t *testing.T) {
110 ctx := testApp(t, `
111 android_app {
112 name: "foo",
113 srcs: ["a.java"],
114 package_splits: ["v4", "v7,hdpi"],
Jeongik Cha538c0d02019-07-11 15:54:27 +0900115 sdk_version: "current"
Colin Crosse560c4a2019-03-19 16:03:11 -0700116 }`)
117
118 foo := ctx.ModuleForTests("foo", "android_common")
119
120 expectedOutputs := []string{
121 filepath.Join(buildDir, ".intermediates/foo/android_common/foo.apk"),
122 filepath.Join(buildDir, ".intermediates/foo/android_common/foo_v4.apk"),
123 filepath.Join(buildDir, ".intermediates/foo/android_common/foo_v7_hdpi.apk"),
124 }
125 for _, expectedOutput := range expectedOutputs {
126 foo.Output(expectedOutput)
127 }
128
Colin Cross41955e82019-05-29 14:40:35 -0700129 outputFiles, err := foo.Module().(*AndroidApp).OutputFiles("")
130 if err != nil {
131 t.Fatal(err)
132 }
133 if g, w := outputFiles.Strings(), expectedOutputs; !reflect.DeepEqual(g, w) {
134 t.Errorf(`want OutputFiles("") = %q, got %q`, w, g)
Colin Crosse560c4a2019-03-19 16:03:11 -0700135 }
136}
137
Jeongik Cha538c0d02019-07-11 15:54:27 +0900138func TestPlatformAPIs(t *testing.T) {
139 testJava(t, `
140 android_app {
141 name: "foo",
142 srcs: ["a.java"],
143 platform_apis: true,
144 }
145 `)
146
147 testJava(t, `
148 android_app {
149 name: "foo",
150 srcs: ["a.java"],
151 sdk_version: "current",
152 }
153 `)
154
155 testJavaError(t, "platform_apis must be true when sdk_version is empty.", `
156 android_app {
157 name: "bar",
158 srcs: ["b.java"],
159 }
160 `)
161
162 testJavaError(t, "platform_apis must be false when sdk_version is not empty.", `
163 android_app {
164 name: "bar",
165 srcs: ["b.java"],
166 sdk_version: "system_current",
167 platform_apis: true,
168 }
169 `)
170}
171
Jeongik Chae403e9e2019-12-07 00:16:24 +0900172func TestAndroidAppLinkType(t *testing.T) {
173 testJava(t, `
174 android_app {
175 name: "foo",
176 srcs: ["a.java"],
177 libs: ["bar"],
178 static_libs: ["baz"],
179 platform_apis: true,
180 }
181
182 java_library {
183 name: "bar",
184 sdk_version: "current",
185 srcs: ["b.java"],
186 }
187
188 android_library {
189 name: "baz",
190 sdk_version: "system_current",
191 srcs: ["c.java"],
192 }
193 `)
194
Steven Moreland00298982020-11-17 21:44:36 +0000195 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900196 android_app {
197 name: "foo",
198 srcs: ["a.java"],
199 libs: ["bar"],
200 sdk_version: "current",
201 static_libs: ["baz"],
202 }
203
204 java_library {
205 name: "bar",
206 sdk_version: "current",
207 srcs: ["b.java"],
208 }
209
210 android_library {
211 name: "baz",
212 sdk_version: "system_current",
213 srcs: ["c.java"],
214 }
215 `)
216
217 testJava(t, `
218 android_app {
219 name: "foo",
220 srcs: ["a.java"],
221 libs: ["bar"],
222 sdk_version: "system_current",
223 static_libs: ["baz"],
224 }
225
226 java_library {
227 name: "bar",
228 sdk_version: "current",
229 srcs: ["b.java"],
230 }
231
232 android_library {
233 name: "baz",
234 sdk_version: "system_current",
235 srcs: ["c.java"],
236 }
237 `)
238
Steven Moreland00298982020-11-17 21:44:36 +0000239 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900240 android_app {
241 name: "foo",
242 srcs: ["a.java"],
243 libs: ["bar"],
244 sdk_version: "system_current",
245 static_libs: ["baz"],
246 }
247
248 java_library {
249 name: "bar",
250 sdk_version: "current",
251 srcs: ["b.java"],
252 }
253
254 android_library {
255 name: "baz",
256 srcs: ["c.java"],
257 }
258 `)
259}
260
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100261func TestUpdatableApps(t *testing.T) {
262 testCases := []struct {
263 name string
264 bp string
265 expectedError string
266 }{
267 {
268 name: "Stable public SDK",
269 bp: `android_app {
270 name: "foo",
271 srcs: ["a.java"],
272 sdk_version: "29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100273 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100274 updatable: true,
275 }`,
276 },
277 {
278 name: "Stable system SDK",
279 bp: `android_app {
280 name: "foo",
281 srcs: ["a.java"],
282 sdk_version: "system_29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100283 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100284 updatable: true,
285 }`,
286 },
287 {
288 name: "Current public SDK",
289 bp: `android_app {
290 name: "foo",
291 srcs: ["a.java"],
292 sdk_version: "current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100293 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100294 updatable: true,
295 }`,
296 },
297 {
298 name: "Current system SDK",
299 bp: `android_app {
300 name: "foo",
301 srcs: ["a.java"],
302 sdk_version: "system_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100303 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100304 updatable: true,
305 }`,
306 },
307 {
308 name: "Current module SDK",
309 bp: `android_app {
310 name: "foo",
311 srcs: ["a.java"],
312 sdk_version: "module_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100313 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100314 updatable: true,
315 }`,
316 },
317 {
318 name: "Current core SDK",
319 bp: `android_app {
320 name: "foo",
321 srcs: ["a.java"],
322 sdk_version: "core_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100323 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100324 updatable: true,
325 }`,
326 },
327 {
328 name: "No Platform APIs",
329 bp: `android_app {
330 name: "foo",
331 srcs: ["a.java"],
332 platform_apis: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100333 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100334 updatable: true,
335 }`,
336 expectedError: "Updatable apps must use stable SDKs",
337 },
338 {
339 name: "No Core Platform APIs",
340 bp: `android_app {
341 name: "foo",
342 srcs: ["a.java"],
343 sdk_version: "core_platform",
Artur Satayevf40fc852020-04-16 13:43:02 +0100344 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100345 updatable: true,
346 }`,
347 expectedError: "Updatable apps must use stable SDKs",
348 },
349 {
350 name: "No unspecified APIs",
351 bp: `android_app {
352 name: "foo",
353 srcs: ["a.java"],
354 updatable: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100355 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100356 }`,
357 expectedError: "Updatable apps must use stable SDK",
358 },
Artur Satayevf40fc852020-04-16 13:43:02 +0100359 {
360 name: "Must specify min_sdk_version",
361 bp: `android_app {
362 name: "app_without_min_sdk_version",
363 srcs: ["a.java"],
364 sdk_version: "29",
365 updatable: true,
366 }`,
367 expectedError: "updatable apps must set min_sdk_version.",
368 },
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100369 }
370
371 for _, test := range testCases {
372 t.Run(test.name, func(t *testing.T) {
Paul Duffincdb88a92021-03-14 00:36:50 +0000373 errorHandler := android.FixtureExpectsNoErrors
374 if test.expectedError != "" {
375 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100376 }
Paul Duffincdb88a92021-03-14 00:36:50 +0000377 javaFixtureFactory.
Paul Duffin2645a292021-03-13 02:36:00 +0000378 Extend(FixtureWithPrebuiltApis(map[string][]string{
379 "29": {"foo"},
380 })).
Paul Duffincdb88a92021-03-14 00:36:50 +0000381 ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, test.bp)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100382 })
383 }
384}
385
Jooyung Han749dc692020-04-15 11:03:39 +0900386func TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) {
387 testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+`
388 android_app {
389 name: "foo",
390 srcs: ["a.java"],
391 updatable: true,
392 sdk_version: "current",
393 min_sdk_version: "29",
394 static_libs: ["bar"],
395 }
396
397 java_library {
398 name: "bar",
399 sdk_version: "current",
400 }
401 `)
402}
403
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900404func TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) {
405 testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
406 android_app {
407 name: "foo",
408 srcs: ["a.java"],
409 updatable: true,
410 sdk_version: "current",
411 min_sdk_version: "current",
412 jni_libs: ["libjni"],
413 }
414
415 cc_library {
416 name: "libjni",
417 stl: "none",
418 system_shared_libs: [],
419 sdk_version: "current",
420 }
421 `)
422}
423
424func TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) {
425 bp := cc.GatherRequiredDepsForTest(android.Android) + `
426 android_app {
427 name: "foo",
428 srcs: ["a.java"],
429 updatable: true,
430 sdk_version: "current",
431 min_sdk_version: "29",
432 jni_libs: ["libjni"],
433 }
434
435 cc_library {
436 name: "libjni",
437 stl: "none",
438 system_shared_libs: [],
439 sdk_version: "29",
440 }
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900441 `
442 fs := map[string][]byte{
443 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
444 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil,
445 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil,
446 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil,
447 }
448
449 ctx, _ := testJavaWithConfig(t, testConfig(nil, bp, fs))
450
451 inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
452 var crtbeginFound, crtendFound bool
Dan Albert92fe7402020-07-15 13:33:30 -0700453 expectedCrtBegin := ctx.ModuleForTests("crtbegin_so",
454 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
455 expectedCrtEnd := ctx.ModuleForTests("crtend_so",
456 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
457 implicits := []string{}
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900458 for _, input := range inputs {
Dan Albert92fe7402020-07-15 13:33:30 -0700459 implicits = append(implicits, input.String())
460 if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900461 crtbeginFound = true
Dan Albert92fe7402020-07-15 13:33:30 -0700462 } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900463 crtendFound = true
464 }
465 }
Dan Albert92fe7402020-07-15 13:33:30 -0700466 if !crtbeginFound {
467 t.Error(fmt.Sprintf(
468 "expected implicit with suffix %q, have the following implicits:\n%s",
469 expectedCrtBegin, strings.Join(implicits, "\n")))
470 }
471 if !crtendFound {
472 t.Error(fmt.Sprintf(
473 "expected implicit with suffix %q, have the following implicits:\n%s",
474 expectedCrtEnd, strings.Join(implicits, "\n")))
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900475 }
476}
477
478func TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
479 bp := cc.GatherRequiredDepsForTest(android.Android) + `
480 android_app {
481 name: "foo",
482 srcs: ["a.java"],
483 updatable: true,
484 sdk_version: "current",
485 min_sdk_version: "29", // this APK should support 29
486 jni_libs: ["libjni"],
487 }
488
489 cc_library {
490 name: "libjni",
491 stl: "none",
492 sdk_version: "current",
493 }
494 `
495 testJavaError(t, `"libjni" .*: sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
496}
497
498func TestUpdatableApps_ErrorIfDepSdkVersionIsHigher(t *testing.T) {
499 bp := cc.GatherRequiredDepsForTest(android.Android) + `
500 android_app {
501 name: "foo",
502 srcs: ["a.java"],
503 updatable: true,
504 sdk_version: "current",
505 min_sdk_version: "29", // this APK should support 29
506 jni_libs: ["libjni"],
507 }
508
509 cc_library {
510 name: "libjni",
511 stl: "none",
512 shared_libs: ["libbar"],
513 system_shared_libs: [],
514 sdk_version: "27",
515 }
516
517 cc_library {
518 name: "libbar",
519 stl: "none",
520 system_shared_libs: [],
521 sdk_version: "current",
522 }
523 `
524 testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
525}
526
Colin Cross0ddae7f2019-02-07 15:30:01 -0800527func TestResourceDirs(t *testing.T) {
528 testCases := []struct {
529 name string
530 prop string
531 resources []string
532 }{
533 {
534 name: "no resource_dirs",
535 prop: "",
536 resources: []string{"res/res/values/strings.xml"},
537 },
538 {
539 name: "resource_dirs",
540 prop: `resource_dirs: ["res"]`,
541 resources: []string{"res/res/values/strings.xml"},
542 },
543 {
544 name: "empty resource_dirs",
545 prop: `resource_dirs: []`,
546 resources: nil,
547 },
548 }
549
550 fs := map[string][]byte{
551 "res/res/values/strings.xml": nil,
552 }
553
554 bp := `
555 android_app {
556 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900557 sdk_version: "current",
Colin Cross0ddae7f2019-02-07 15:30:01 -0800558 %s
559 }
560 `
561
562 for _, testCase := range testCases {
563 t.Run(testCase.name, func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800564 config := testConfig(nil, fmt.Sprintf(bp, testCase.prop), fs)
Colin Crossae8600b2020-10-29 17:09:13 -0700565 ctx := testContext(config)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800566 run(t, ctx, config)
567
568 module := ctx.ModuleForTests("foo", "android_common")
569 resourceList := module.MaybeOutput("aapt2/res.list")
570
571 var resources []string
572 if resourceList.Rule != nil {
573 for _, compiledResource := range resourceList.Inputs.Strings() {
574 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
575 }
576 }
577
578 if !reflect.DeepEqual(resources, testCase.resources) {
579 t.Errorf("expected resource files %q, got %q",
580 testCase.resources, resources)
581 }
582 })
583 }
584}
585
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800586func TestLibraryAssets(t *testing.T) {
587 bp := `
588 android_app {
589 name: "foo",
590 sdk_version: "current",
591 static_libs: ["lib1", "lib2", "lib3"],
592 }
593
594 android_library {
595 name: "lib1",
596 sdk_version: "current",
597 asset_dirs: ["assets_a"],
598 }
599
600 android_library {
601 name: "lib2",
602 sdk_version: "current",
603 }
604
605 android_library {
606 name: "lib3",
607 sdk_version: "current",
608 static_libs: ["lib4"],
609 }
610
611 android_library {
612 name: "lib4",
613 sdk_version: "current",
614 asset_dirs: ["assets_b"],
615 }
616 `
617
618 testCases := []struct {
619 name string
620 assetFlag string
621 assetPackages []string
622 }{
623 {
624 name: "foo",
625 // lib1 has its own asset. lib3 doesn't have any, but provides lib4's transitively.
626 assetPackages: []string{
627 buildDir + "/.intermediates/foo/android_common/aapt2/package-res.apk",
628 buildDir + "/.intermediates/lib1/android_common/assets.zip",
629 buildDir + "/.intermediates/lib3/android_common/assets.zip",
630 },
631 },
632 {
633 name: "lib1",
634 assetFlag: "-A assets_a",
635 },
636 {
637 name: "lib2",
638 },
639 {
640 name: "lib3",
641 assetPackages: []string{
642 buildDir + "/.intermediates/lib3/android_common/aapt2/package-res.apk",
643 buildDir + "/.intermediates/lib4/android_common/assets.zip",
644 },
645 },
646 {
647 name: "lib4",
648 assetFlag: "-A assets_b",
649 },
650 }
651 ctx := testApp(t, bp)
652
653 for _, test := range testCases {
654 t.Run(test.name, func(t *testing.T) {
655 m := ctx.ModuleForTests(test.name, "android_common")
656
657 // Check asset flag in aapt2 link flags
658 var aapt2link android.TestingBuildParams
659 if len(test.assetPackages) > 0 {
660 aapt2link = m.Output("aapt2/package-res.apk")
661 } else {
662 aapt2link = m.Output("package-res.apk")
663 }
664 aapt2Flags := aapt2link.Args["flags"]
665 if test.assetFlag != "" {
666 if !strings.Contains(aapt2Flags, test.assetFlag) {
667 t.Errorf("Can't find asset flag %q in aapt2 link flags %q", test.assetFlag, aapt2Flags)
668 }
669 } else {
670 if strings.Contains(aapt2Flags, " -A ") {
671 t.Errorf("aapt2 link flags %q contain unexpected asset flag", aapt2Flags)
672 }
673 }
674
675 // Check asset merge rule.
676 if len(test.assetPackages) > 0 {
677 mergeAssets := m.Output("package-res.apk")
678 if !reflect.DeepEqual(test.assetPackages, mergeAssets.Inputs.Strings()) {
679 t.Errorf("Unexpected mergeAssets inputs: %v, expected: %v",
680 mergeAssets.Inputs.Strings(), test.assetPackages)
681 }
682 }
683 })
684 }
685}
686
Colin Crossb014f072021-02-26 14:54:36 -0800687func TestAppJavaResources(t *testing.T) {
688 bp := `
689 android_app {
690 name: "foo",
691 sdk_version: "current",
692 java_resources: ["resources/a"],
693 srcs: ["a.java"],
694 }
695
696 android_app {
697 name: "bar",
698 sdk_version: "current",
699 java_resources: ["resources/a"],
700 }
701 `
702
703 ctx := testApp(t, bp)
704
705 foo := ctx.ModuleForTests("foo", "android_common")
706 fooResources := foo.Output("res/foo.jar")
707 fooDexJar := foo.Output("dex-withres/foo.jar")
708 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
709 fooApk := foo.Rule("combineApk")
710
711 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
712 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
713 }
714
715 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
716 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
717 }
718
719 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
720 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
721 }
722
723 bar := ctx.ModuleForTests("bar", "android_common")
724 barResources := bar.Output("res/bar.jar")
725 barApk := bar.Rule("combineApk")
726
727 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
728 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
729 }
730}
731
Colin Crossbec85302019-02-13 13:15:46 -0800732func TestAndroidResources(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -0800733 testCases := []struct {
734 name string
735 enforceRROTargets []string
736 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -0800737 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -0800738 overlayFiles map[string][]string
739 rroDirs map[string][]string
740 }{
741 {
742 name: "no RRO",
743 enforceRROTargets: nil,
744 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -0800745 resourceFiles: map[string][]string{
746 "foo": nil,
747 "bar": {"bar/res/res/values/strings.xml"},
748 "lib": nil,
749 "lib2": {"lib2/res/res/values/strings.xml"},
750 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800751 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800752 "foo": {
753 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800754 buildDir + "/.intermediates/lib/android_common/package-res.apk",
Anton Hansson53c88442019-03-18 15:53:16 +0000755 buildDir + "/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800756 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800757 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
758 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +0000759 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800760 },
Colin Crossbec85302019-02-13 13:15:46 -0800761 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800762 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
763 "device/vendor/blah/overlay/bar/res/values/strings.xml",
764 },
Colin Crossbec85302019-02-13 13:15:46 -0800765 "lib": {
766 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
767 "lib/res/res/values/strings.xml",
768 "device/vendor/blah/overlay/lib/res/values/strings.xml",
769 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800770 },
771 rroDirs: map[string][]string{
772 "foo": nil,
773 "bar": nil,
774 },
775 },
776 {
777 name: "enforce RRO on foo",
778 enforceRROTargets: []string{"foo"},
779 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -0800780 resourceFiles: map[string][]string{
781 "foo": nil,
782 "bar": {"bar/res/res/values/strings.xml"},
783 "lib": nil,
784 "lib2": {"lib2/res/res/values/strings.xml"},
785 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800786 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800787 "foo": {
788 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800789 buildDir + "/.intermediates/lib/android_common/package-res.apk",
Anton Hansson53c88442019-03-18 15:53:16 +0000790 buildDir + "/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800791 "foo/res/res/values/strings.xml",
792 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
793 },
Colin Crossbec85302019-02-13 13:15:46 -0800794 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800795 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
796 "device/vendor/blah/overlay/bar/res/values/strings.xml",
797 },
Colin Crossbec85302019-02-13 13:15:46 -0800798 "lib": {
799 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
800 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -0800801 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800802 },
Colin Crossc1c37552019-01-31 11:42:41 -0800803
Colin Cross5c4791c2019-02-01 11:44:44 -0800804 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800805 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000806 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +0000807 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700808 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800809 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800810 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700811 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800812 },
813 },
814 {
815 name: "enforce RRO on all",
816 enforceRROTargets: []string{"*"},
817 enforceRROExcludedOverlays: []string{
818 // Excluding specific apps/res directories also allowed.
819 "device/vendor/blah/static_overlay/foo",
820 "device/vendor/blah/static_overlay/bar/res",
821 },
Colin Crossbec85302019-02-13 13:15:46 -0800822 resourceFiles: map[string][]string{
823 "foo": nil,
824 "bar": {"bar/res/res/values/strings.xml"},
825 "lib": nil,
826 "lib2": {"lib2/res/res/values/strings.xml"},
827 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800828 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800829 "foo": {
830 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800831 buildDir + "/.intermediates/lib/android_common/package-res.apk",
Anton Hansson53c88442019-03-18 15:53:16 +0000832 buildDir + "/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800833 "foo/res/res/values/strings.xml",
834 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
835 },
Colin Crossbec85302019-02-13 13:15:46 -0800836 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
837 "lib": {
838 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
839 "lib/res/res/values/strings.xml",
840 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800841 },
842 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800843 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000844 "device:device/vendor/blah/overlay/foo/res",
845 "product:product/vendor/blah/overlay/foo/res",
846 // Lib dep comes after the direct deps
847 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800848 },
Anton Hansson53c88442019-03-18 15:53:16 +0000849 "bar": {"device:device/vendor/blah/overlay/bar/res"},
850 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800851 },
852 },
853 }
854
Anton Hansson53c88442019-03-18 15:53:16 +0000855 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -0800856 "device/vendor/blah/overlay",
857 "device/vendor/blah/overlay2",
858 "device/vendor/blah/static_overlay",
859 }
860
Anton Hansson53c88442019-03-18 15:53:16 +0000861 productResourceOverlays := []string{
862 "product/vendor/blah/overlay",
863 }
864
Colin Cross890ff552017-11-30 20:13:19 -0800865 fs := map[string][]byte{
866 "foo/res/res/values/strings.xml": nil,
867 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800868 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -0800869 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800870 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
871 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800872 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800873 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
874 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
875 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +0000876 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800877 }
878
879 bp := `
880 android_app {
881 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900882 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800883 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +0000884 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -0800885 }
886
887 android_app {
888 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900889 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800890 resource_dirs: ["bar/res"],
891 }
Colin Cross6ed7dea2019-01-31 14:44:30 -0800892
893 android_library {
894 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900895 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800896 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -0800897 static_libs: ["lib2"],
898 }
899
900 android_library {
901 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900902 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -0800903 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -0800904 }
Anton Hansson53c88442019-03-18 15:53:16 +0000905
906 // This library has the same resources as lib (should not lead to dupe RROs)
907 android_library {
908 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900909 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +0000910 resource_dirs: ["lib/res"]
911 }
Colin Cross890ff552017-11-30 20:13:19 -0800912 `
913
Colin Cross5c4791c2019-02-01 11:44:44 -0800914 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -0800915 t.Run(testCase.name, func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800916 config := testAppConfig(nil, bp, fs)
Anton Hansson53c88442019-03-18 15:53:16 +0000917 config.TestProductVariables.DeviceResourceOverlays = deviceResourceOverlays
918 config.TestProductVariables.ProductResourceOverlays = productResourceOverlays
Colin Cross890ff552017-11-30 20:13:19 -0800919 if testCase.enforceRROTargets != nil {
Colin Crossa74ca042019-01-31 14:31:51 -0800920 config.TestProductVariables.EnforceRROTargets = testCase.enforceRROTargets
Colin Cross890ff552017-11-30 20:13:19 -0800921 }
922 if testCase.enforceRROExcludedOverlays != nil {
Colin Crossa74ca042019-01-31 14:31:51 -0800923 config.TestProductVariables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
Colin Cross890ff552017-11-30 20:13:19 -0800924 }
925
Colin Crossae8600b2020-10-29 17:09:13 -0700926 ctx := testContext(config)
Colin Cross890ff552017-11-30 20:13:19 -0800927 run(t, ctx, config)
928
Colin Crossbec85302019-02-13 13:15:46 -0800929 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
930 for _, o := range list {
931 res := module.MaybeOutput(o)
932 if res.Rule != nil {
933 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
934 // verify the inputs to the .arsc.flat rule.
935 files = append(files, res.Inputs.Strings()...)
936 } else {
937 // Otherwise, verify the full path to the output of the other module
938 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +0000939 }
Colin Cross890ff552017-11-30 20:13:19 -0800940 }
Colin Crossbec85302019-02-13 13:15:46 -0800941 return files
Colin Cross890ff552017-11-30 20:13:19 -0800942 }
943
Colin Crossbec85302019-02-13 13:15:46 -0800944 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
945 module := ctx.ModuleForTests(moduleName, "android_common")
946 resourceList := module.MaybeOutput("aapt2/res.list")
947 if resourceList.Rule != nil {
948 resourceFiles = resourceListToFiles(module, resourceList.Inputs.Strings())
Anton Hansson0375a4f2019-01-24 14:39:19 +0000949 }
Colin Crossbec85302019-02-13 13:15:46 -0800950 overlayList := module.MaybeOutput("aapt2/overlay.list")
951 if overlayList.Rule != nil {
952 overlayFiles = resourceListToFiles(module, overlayList.Inputs.Strings())
953 }
954
Anton Hansson53c88442019-03-18 15:53:16 +0000955 for _, d := range module.Module().(AndroidLibraryDependency).ExportedRRODirs() {
956 var prefix string
957 if d.overlayType == device {
958 prefix = "device:"
959 } else if d.overlayType == product {
960 prefix = "product:"
961 } else {
962 t.Fatalf("Unexpected overlayType %d", d.overlayType)
963 }
964 rroDirs = append(rroDirs, prefix+d.path.String())
965 }
Colin Crossbec85302019-02-13 13:15:46 -0800966
967 return resourceFiles, overlayFiles, rroDirs
968 }
969
970 modules := []string{"foo", "bar", "lib", "lib2"}
971 for _, module := range modules {
972 resourceFiles, overlayFiles, rroDirs := getResources(module)
973
974 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
975 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
976 module, testCase.resourceFiles[module], resourceFiles)
977 }
978 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
979 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
980 module, testCase.overlayFiles[module], overlayFiles)
981 }
982 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +0000983 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -0800984 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +0000985 }
Colin Cross890ff552017-11-30 20:13:19 -0800986 }
Colin Cross890ff552017-11-30 20:13:19 -0800987 })
988 }
989}
Colin Crossd09b0b62018-04-18 11:06:47 -0700990
Paul Duffincdb88a92021-03-14 00:36:50 +0000991func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
992 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +0900993 link := foo.Output("package-res.apk")
994 linkFlags := strings.Split(link.Args["flags"], " ")
995 min := android.IndexList("--min-sdk-version", linkFlags)
996 target := android.IndexList("--target-sdk-version", linkFlags)
997
998 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
999 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
1000 }
1001
1002 gotMinSdkVersion := linkFlags[min+1]
1003 gotTargetSdkVersion := linkFlags[target+1]
1004
Paul Duffincdb88a92021-03-14 00:36:50 +00001005 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001006
Paul Duffincdb88a92021-03-14 00:36:50 +00001007 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001008}
1009
Colin Crossd09b0b62018-04-18 11:06:47 -07001010func TestAppSdkVersion(t *testing.T) {
1011 testCases := []struct {
1012 name string
1013 sdkVersion string
1014 platformSdkInt int
1015 platformSdkCodename string
1016 platformSdkFinal bool
1017 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001018 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001019 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001020 }{
1021 {
1022 name: "current final SDK",
1023 sdkVersion: "current",
1024 platformSdkInt: 27,
1025 platformSdkCodename: "REL",
1026 platformSdkFinal: true,
1027 expectedMinSdkVersion: "27",
1028 },
1029 {
1030 name: "current non-final SDK",
1031 sdkVersion: "current",
1032 platformSdkInt: 27,
1033 platformSdkCodename: "OMR1",
1034 platformSdkFinal: false,
1035 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001036 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001037 },
1038 {
1039 name: "default final SDK",
1040 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001041 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001042 platformSdkInt: 27,
1043 platformSdkCodename: "REL",
1044 platformSdkFinal: true,
1045 expectedMinSdkVersion: "27",
1046 },
1047 {
1048 name: "default non-final SDK",
1049 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001050 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001051 platformSdkInt: 27,
1052 platformSdkCodename: "OMR1",
1053 platformSdkFinal: false,
1054 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001055 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001056 },
1057 {
1058 name: "14",
1059 sdkVersion: "14",
1060 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001061 platformSdkCodename: "S",
1062 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001063 },
1064 }
1065
1066 for _, moduleType := range []string{"android_app", "android_library"} {
1067 for _, test := range testCases {
1068 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001069 platformApiProp := ""
1070 if test.platformApis {
1071 platformApiProp = "platform_apis: true,"
1072 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001073 bp := fmt.Sprintf(`%s {
1074 name: "foo",
1075 srcs: ["a.java"],
1076 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001077 %s
1078 }`, moduleType, test.sdkVersion, platformApiProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001079
Paul Duffincdb88a92021-03-14 00:36:50 +00001080 result := javaFixtureFactory.Extend(
1081 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1082 variables.Platform_sdk_version = &test.platformSdkInt
1083 variables.Platform_sdk_codename = &test.platformSdkCodename
1084 variables.Platform_version_active_codenames = test.activeCodenames
1085 variables.Platform_sdk_final = &test.platformSdkFinal
1086 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001087 FixtureWithPrebuiltApis(map[string][]string{
1088 "14": {"foo"},
1089 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001090 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001091
Paul Duffincdb88a92021-03-14 00:36:50 +00001092 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001093 })
1094 }
1095 }
1096}
Colin Crossa4f08812018-10-02 22:03:40 -07001097
Jeongik Cha219141c2020-08-06 23:00:37 +09001098func TestVendorAppSdkVersion(t *testing.T) {
1099 testCases := []struct {
1100 name string
1101 sdkVersion string
1102 platformSdkInt int
1103 platformSdkCodename string
1104 platformSdkFinal bool
1105 deviceCurrentApiLevelForVendorModules string
1106 expectedMinSdkVersion string
1107 }{
1108 {
1109 name: "current final SDK",
1110 sdkVersion: "current",
1111 platformSdkInt: 29,
1112 platformSdkCodename: "REL",
1113 platformSdkFinal: true,
1114 deviceCurrentApiLevelForVendorModules: "29",
1115 expectedMinSdkVersion: "29",
1116 },
1117 {
1118 name: "current final SDK",
1119 sdkVersion: "current",
1120 platformSdkInt: 29,
1121 platformSdkCodename: "REL",
1122 platformSdkFinal: true,
1123 deviceCurrentApiLevelForVendorModules: "28",
1124 expectedMinSdkVersion: "28",
1125 },
1126 {
1127 name: "current final SDK",
1128 sdkVersion: "current",
1129 platformSdkInt: 29,
1130 platformSdkCodename: "Q",
1131 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001132 deviceCurrentApiLevelForVendorModules: "28",
1133 expectedMinSdkVersion: "28",
1134 },
1135 }
1136
1137 for _, moduleType := range []string{"android_app", "android_library"} {
1138 for _, sdkKind := range []string{"", "system_"} {
1139 for _, test := range testCases {
1140 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1141 bp := fmt.Sprintf(`%s {
1142 name: "foo",
1143 srcs: ["a.java"],
1144 sdk_version: "%s%s",
1145 vendor: true,
1146 }`, moduleType, sdkKind, test.sdkVersion)
1147
Paul Duffincdb88a92021-03-14 00:36:50 +00001148 result := javaFixtureFactory.Extend(
1149 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1150 variables.Platform_sdk_version = &test.platformSdkInt
1151 variables.Platform_sdk_codename = &test.platformSdkCodename
1152 variables.Platform_sdk_final = &test.platformSdkFinal
1153 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1154 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1155 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001156 FixtureWithPrebuiltApis(map[string][]string{
1157 "28": {"foo"},
1158 "29": {"foo"},
1159 "current": {"foo"},
1160 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001161 ).RunTestWithBp(t, bp)
1162
1163 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001164 })
1165 }
1166 }
1167 }
1168}
1169
Paul Duffin50c217c2019-06-12 13:25:22 +01001170func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001171 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001172 cc_library {
1173 name: "libjni",
1174 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001175 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001176 stl: "none",
1177 }
1178
1179 android_test {
1180 name: "test",
1181 sdk_version: "core_platform",
1182 jni_libs: ["libjni"],
1183 }
1184
1185 android_test {
1186 name: "test_first",
1187 sdk_version: "core_platform",
1188 compile_multilib: "first",
1189 jni_libs: ["libjni"],
1190 }
1191
1192 android_test {
1193 name: "test_both",
1194 sdk_version: "core_platform",
1195 compile_multilib: "both",
1196 jni_libs: ["libjni"],
1197 }
1198
1199 android_test {
1200 name: "test_32",
1201 sdk_version: "core_platform",
1202 compile_multilib: "32",
1203 jni_libs: ["libjni"],
1204 }
1205
1206 android_test {
1207 name: "test_64",
1208 sdk_version: "core_platform",
1209 compile_multilib: "64",
1210 jni_libs: ["libjni"],
1211 }
1212 `)
1213
1214 testCases := []struct {
1215 name string
1216 abis []string
1217 }{
1218 {"test", []string{"arm64-v8a"}},
1219 {"test_first", []string{"arm64-v8a"}},
1220 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1221 {"test_32", []string{"armeabi-v7a"}},
1222 {"test_64", []string{"arm64-v8a"}},
1223 }
1224
1225 for _, test := range testCases {
1226 t.Run(test.name, func(t *testing.T) {
1227 app := ctx.ModuleForTests(test.name, "android_common")
1228 jniLibZip := app.Output("jnilibs.zip")
1229 var abis []string
1230 args := strings.Fields(jniLibZip.Args["jarArgs"])
1231 for i := 0; i < len(args); i++ {
1232 if args[i] == "-P" {
1233 abis = append(abis, filepath.Base(args[i+1]))
1234 i++
1235 }
1236 }
1237 if !reflect.DeepEqual(abis, test.abis) {
1238 t.Errorf("want abis %v, got %v", test.abis, abis)
1239 }
1240 })
1241 }
1242}
1243
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001244func TestAppSdkVersionByPartition(t *testing.T) {
1245 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1246 android_app {
1247 name: "foo",
1248 srcs: ["a.java"],
1249 vendor: true,
1250 platform_apis: true,
1251 }
1252 `)
1253
1254 testJava(t, `
1255 android_app {
1256 name: "bar",
1257 srcs: ["b.java"],
1258 platform_apis: true,
1259 }
1260 `)
1261
1262 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001263 bp := `
1264 android_app {
1265 name: "foo",
1266 srcs: ["a.java"],
1267 product_specific: true,
1268 platform_apis: true,
1269 }
1270 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001271
1272 config := testAppConfig(nil, bp, nil)
1273 config.TestProductVariables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001274 if enforce {
Colin Cross98be1bb2019-12-13 20:41:13 -08001275 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 +09001276 } else {
Colin Cross98be1bb2019-12-13 20:41:13 -08001277 testJavaWithConfig(t, config)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001278 }
1279 }
1280}
1281
Paul Duffin50c217c2019-06-12 13:25:22 +01001282func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001283 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001284 cc_library {
1285 name: "libjni",
1286 system_shared_libs: [],
1287 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08001288 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001289 }
1290
1291 android_app {
1292 name: "app",
1293 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001294 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001295 }
1296
1297 android_app {
1298 name: "app_noembed",
1299 jni_libs: ["libjni"],
1300 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001301 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001302 }
1303
1304 android_app {
1305 name: "app_embed",
1306 jni_libs: ["libjni"],
1307 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001308 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001309 }
1310
1311 android_test {
1312 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00001313 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001314 jni_libs: ["libjni"],
1315 }
1316
1317 android_test {
1318 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001319 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001320 jni_libs: ["libjni"],
1321 use_embedded_native_libs: false,
1322 }
1323
1324 android_test_helper_app {
1325 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00001326 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001327 jni_libs: ["libjni"],
1328 }
1329
1330 android_test_helper_app {
1331 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001332 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001333 jni_libs: ["libjni"],
1334 use_embedded_native_libs: false,
1335 }
1336 `)
1337
1338 testCases := []struct {
1339 name string
1340 packaged bool
1341 compressed bool
1342 }{
1343 {"app", false, false},
1344 {"app_noembed", false, false},
1345 {"app_embed", true, false},
1346 {"test", true, false},
1347 {"test_noembed", true, true},
1348 {"test_helper", true, false},
1349 {"test_helper_noembed", true, true},
1350 }
1351
1352 for _, test := range testCases {
1353 t.Run(test.name, func(t *testing.T) {
1354 app := ctx.ModuleForTests(test.name, "android_common")
1355 jniLibZip := app.MaybeOutput("jnilibs.zip")
1356 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
1357 t.Errorf("expected jni packaged %v, got %v", w, g)
1358 }
1359
1360 if jniLibZip.Rule != nil {
1361 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
1362 t.Errorf("expected jni compressed %v, got %v", w, g)
1363 }
Colin Crossc511bc52020-04-07 16:50:32 +00001364
1365 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
1366 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
1367 }
Paul Duffin50c217c2019-06-12 13:25:22 +01001368 }
1369 })
1370 }
Colin Cross47fa9d32019-03-26 10:51:39 -07001371}
1372
Colin Cross3c007702020-05-08 11:20:24 -07001373func TestJNISDK(t *testing.T) {
1374 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
1375 cc_library {
1376 name: "libjni",
1377 system_shared_libs: [],
1378 stl: "none",
1379 sdk_version: "current",
1380 }
1381
1382 android_test {
1383 name: "app_platform",
1384 jni_libs: ["libjni"],
1385 platform_apis: true,
1386 }
1387
1388 android_test {
1389 name: "app_sdk",
1390 jni_libs: ["libjni"],
1391 sdk_version: "current",
1392 }
1393
1394 android_test {
1395 name: "app_force_platform",
1396 jni_libs: ["libjni"],
1397 sdk_version: "current",
1398 jni_uses_platform_apis: true,
1399 }
1400
1401 android_test {
1402 name: "app_force_sdk",
1403 jni_libs: ["libjni"],
1404 platform_apis: true,
1405 jni_uses_sdk_apis: true,
1406 }
Colin Crossc2d24052020-05-13 11:05:02 -07001407
1408 cc_library {
1409 name: "libvendorjni",
1410 system_shared_libs: [],
1411 stl: "none",
1412 vendor: true,
1413 }
1414
1415 android_test {
1416 name: "app_vendor",
1417 jni_libs: ["libvendorjni"],
1418 sdk_version: "current",
1419 vendor: true,
1420 }
Colin Cross3c007702020-05-08 11:20:24 -07001421 `)
1422
1423 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07001424 name string
1425 sdkJNI bool
1426 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07001427 }{
Colin Crossc2d24052020-05-13 11:05:02 -07001428 {name: "app_platform"},
1429 {name: "app_sdk", sdkJNI: true},
1430 {name: "app_force_platform"},
1431 {name: "app_force_sdk", sdkJNI: true},
1432 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07001433 }
1434
Colin Crossc2d24052020-05-13 11:05:02 -07001435 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
1436 Output("libjni.so").Output.String()
1437 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
1438 Output("libjni.so").Output.String()
1439 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
1440 Output("libvendorjni.so").Output.String()
1441
Colin Cross3c007702020-05-08 11:20:24 -07001442 for _, test := range testCases {
1443 t.Run(test.name, func(t *testing.T) {
1444 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07001445
1446 jniLibZip := app.MaybeOutput("jnilibs.zip")
1447 if len(jniLibZip.Implicits) != 1 {
1448 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
1449 }
1450 gotJNI := jniLibZip.Implicits[0].String()
1451
1452 if test.sdkJNI {
1453 if gotJNI != sdkJNI {
1454 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
1455 }
Colin Crossc2d24052020-05-13 11:05:02 -07001456 } else if test.vendorJNI {
1457 if gotJNI != vendorJNI {
1458 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
1459 }
Colin Cross3c007702020-05-08 11:20:24 -07001460 } else {
1461 if gotJNI != platformJNI {
1462 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
1463 }
1464 }
1465 })
1466 }
1467
1468 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
1469 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
1470 android_test {
1471 name: "app_platform",
1472 platform_apis: true,
1473 jni_uses_platform_apis: true,
1474 }
1475 `)
1476 })
1477
1478 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
1479 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
1480 android_test {
1481 name: "app_sdk",
1482 sdk_version: "current",
1483 jni_uses_sdk_apis: true,
1484 }
1485 `)
1486 })
1487
1488}
1489
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001490func TestCertificates(t *testing.T) {
1491 testCases := []struct {
1492 name string
1493 bp string
1494 certificateOverride string
Liz Kammere2b27f42020-05-07 13:24:05 -07001495 expectedLineage string
1496 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001497 }{
1498 {
1499 name: "default",
1500 bp: `
1501 android_app {
1502 name: "foo",
1503 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001504 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001505 }
1506 `,
1507 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001508 expectedLineage: "",
1509 expectedCertificate: "build/make/target/product/security/testkey.x509.pem build/make/target/product/security/testkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001510 },
1511 {
1512 name: "module certificate property",
1513 bp: `
1514 android_app {
1515 name: "foo",
1516 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001517 certificate: ":new_certificate",
1518 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001519 }
1520
1521 android_app_certificate {
1522 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001523 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001524 }
1525 `,
1526 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001527 expectedLineage: "",
1528 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001529 },
1530 {
1531 name: "path certificate property",
1532 bp: `
1533 android_app {
1534 name: "foo",
1535 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001536 certificate: "expiredkey",
1537 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001538 }
1539 `,
1540 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001541 expectedLineage: "",
1542 expectedCertificate: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001543 },
1544 {
1545 name: "certificate overrides",
1546 bp: `
1547 android_app {
1548 name: "foo",
1549 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001550 certificate: "expiredkey",
1551 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001552 }
1553
1554 android_app_certificate {
1555 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001556 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001557 }
1558 `,
1559 certificateOverride: "foo:new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001560 expectedLineage: "",
1561 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1562 },
1563 {
1564 name: "certificate lineage",
1565 bp: `
1566 android_app {
1567 name: "foo",
1568 srcs: ["a.java"],
1569 certificate: ":new_certificate",
1570 lineage: "lineage.bin",
1571 sdk_version: "current",
1572 }
1573
1574 android_app_certificate {
1575 name: "new_certificate",
1576 certificate: "cert/new_cert",
1577 }
1578 `,
1579 certificateOverride: "",
1580 expectedLineage: "--lineage lineage.bin",
1581 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001582 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001583 {
1584 name: "lineage from filegroup",
1585 bp: `
1586 android_app {
1587 name: "foo",
1588 srcs: ["a.java"],
1589 certificate: ":new_certificate",
1590 lineage: ":lineage_bin",
1591 sdk_version: "current",
1592 }
1593
1594 android_app_certificate {
1595 name: "new_certificate",
1596 certificate: "cert/new_cert",
1597 }
1598
1599 filegroup {
1600 name: "lineage_bin",
1601 srcs: ["lineage.bin"],
1602 }
1603 `,
1604 certificateOverride: "",
1605 expectedLineage: "--lineage lineage.bin",
1606 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1607 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001608 }
1609
1610 for _, test := range testCases {
1611 t.Run(test.name, func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -08001612 config := testAppConfig(nil, test.bp, nil)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001613 if test.certificateOverride != "" {
1614 config.TestProductVariables.CertificateOverrides = []string{test.certificateOverride}
1615 }
Colin Crossae8600b2020-10-29 17:09:13 -07001616 ctx := testContext(config)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001617
1618 run(t, ctx, config)
1619 foo := ctx.ModuleForTests("foo", "android_common")
1620
1621 signapk := foo.Output("foo.apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001622 signCertificateFlags := signapk.Args["certificates"]
1623 if test.expectedCertificate != signCertificateFlags {
1624 t.Errorf("Incorrect signing flags, expected: %q, got: %q", test.expectedCertificate, signCertificateFlags)
1625 }
1626
1627 signFlags := signapk.Args["flags"]
1628 if test.expectedLineage != signFlags {
1629 t.Errorf("Incorrect signing flags, expected: %q, got: %q", test.expectedLineage, signFlags)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001630 }
1631 })
1632 }
1633}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001634
Songchun Fan688de9a2020-03-24 20:32:24 -07001635func TestRequestV4SigningFlag(t *testing.T) {
1636 testCases := []struct {
1637 name string
1638 bp string
1639 expected string
1640 }{
1641 {
1642 name: "default",
1643 bp: `
1644 android_app {
1645 name: "foo",
1646 srcs: ["a.java"],
1647 sdk_version: "current",
1648 }
1649 `,
1650 expected: "",
1651 },
1652 {
1653 name: "default",
1654 bp: `
1655 android_app {
1656 name: "foo",
1657 srcs: ["a.java"],
1658 sdk_version: "current",
1659 v4_signature: false,
1660 }
1661 `,
1662 expected: "",
1663 },
1664 {
1665 name: "module certificate property",
1666 bp: `
1667 android_app {
1668 name: "foo",
1669 srcs: ["a.java"],
1670 sdk_version: "current",
1671 v4_signature: true,
1672 }
1673 `,
1674 expected: "--enable-v4",
1675 },
1676 }
1677
1678 for _, test := range testCases {
1679 t.Run(test.name, func(t *testing.T) {
1680 config := testAppConfig(nil, test.bp, nil)
Colin Crossae8600b2020-10-29 17:09:13 -07001681 ctx := testContext(config)
Songchun Fan688de9a2020-03-24 20:32:24 -07001682
1683 run(t, ctx, config)
1684 foo := ctx.ModuleForTests("foo", "android_common")
1685
1686 signapk := foo.Output("foo.apk")
1687 signFlags := signapk.Args["flags"]
1688 if test.expected != signFlags {
1689 t.Errorf("Incorrect signing flags, expected: %q, got: %q", test.expected, signFlags)
1690 }
1691 })
1692 }
1693}
1694
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001695func TestPackageNameOverride(t *testing.T) {
1696 testCases := []struct {
1697 name string
1698 bp string
1699 packageNameOverride string
1700 expected []string
1701 }{
1702 {
1703 name: "default",
1704 bp: `
1705 android_app {
1706 name: "foo",
1707 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001708 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001709 }
1710 `,
1711 packageNameOverride: "",
1712 expected: []string{
1713 buildDir + "/.intermediates/foo/android_common/foo.apk",
1714 buildDir + "/target/product/test_device/system/app/foo/foo.apk",
1715 },
1716 },
1717 {
1718 name: "overridden",
1719 bp: `
1720 android_app {
1721 name: "foo",
1722 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001723 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001724 }
1725 `,
1726 packageNameOverride: "foo:bar",
1727 expected: []string{
1728 // The package apk should be still be the original name for test dependencies.
Jaewoong Jung5a498812019-11-07 14:14:38 -08001729 buildDir + "/.intermediates/foo/android_common/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001730 buildDir + "/target/product/test_device/system/app/bar/bar.apk",
1731 },
1732 },
1733 }
1734
1735 for _, test := range testCases {
1736 t.Run(test.name, func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -08001737 config := testAppConfig(nil, test.bp, nil)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001738 if test.packageNameOverride != "" {
1739 config.TestProductVariables.PackageNameOverrides = []string{test.packageNameOverride}
1740 }
Colin Crossae8600b2020-10-29 17:09:13 -07001741 ctx := testContext(config)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001742
1743 run(t, ctx, config)
1744 foo := ctx.ModuleForTests("foo", "android_common")
1745
1746 outputs := foo.AllOutputs()
1747 outputMap := make(map[string]bool)
1748 for _, o := range outputs {
1749 outputMap[o] = true
1750 }
1751 for _, e := range test.expected {
1752 if _, exist := outputMap[e]; !exist {
1753 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
1754 }
1755 }
1756 })
1757 }
1758}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001759
1760func TestInstrumentationTargetOverridden(t *testing.T) {
1761 bp := `
1762 android_app {
1763 name: "foo",
1764 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001765 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001766 }
1767
1768 android_test {
1769 name: "bar",
1770 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001771 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001772 }
1773 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001774 config := testAppConfig(nil, bp, nil)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001775 config.TestProductVariables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
Colin Crossae8600b2020-10-29 17:09:13 -07001776 ctx := testContext(config)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001777
1778 run(t, ctx, config)
1779
1780 bar := ctx.ModuleForTests("bar", "android_common")
1781 res := bar.Output("package-res.apk")
1782 aapt2Flags := res.Args["flags"]
1783 e := "--rename-instrumentation-target-package org.dandroid.bp"
1784 if !strings.Contains(aapt2Flags, e) {
1785 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
1786 }
1787}
Jaewoong Jung525443a2019-02-28 15:35:54 -08001788
1789func TestOverrideAndroidApp(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001790 ctx, _ := testJava(t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08001791 android_app {
1792 name: "foo",
1793 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07001794 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001795 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001796 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001797 }
1798
1799 override_android_app {
1800 name: "bar",
1801 base: "foo",
1802 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001803 lineage: "lineage.bin",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001804 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001805 }
1806
1807 android_app_certificate {
1808 name: "new_certificate",
1809 certificate: "cert/new_cert",
1810 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001811
1812 override_android_app {
1813 name: "baz",
1814 base: "foo",
1815 package_name: "org.dandroid.bp",
1816 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001817
1818 override_android_app {
1819 name: "baz_no_rename_resources",
1820 base: "foo",
1821 package_name: "org.dandroid.bp",
1822 rename_resources_package: false,
1823 }
1824
1825 android_app {
1826 name: "foo_no_rename_resources",
1827 srcs: ["a.java"],
1828 certificate: "expiredkey",
1829 overrides: ["qux"],
1830 rename_resources_package: false,
1831 sdk_version: "current",
1832 }
1833
1834 override_android_app {
1835 name: "baz_base_no_rename_resources",
1836 base: "foo_no_rename_resources",
1837 package_name: "org.dandroid.bp",
1838 }
1839
1840 override_android_app {
1841 name: "baz_override_base_rename_resources",
1842 base: "foo_no_rename_resources",
1843 package_name: "org.dandroid.bp",
1844 rename_resources_package: true,
1845 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08001846 `)
1847
1848 expectedVariants := []struct {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001849 name string
1850 moduleName string
1851 variantName string
1852 apkName string
1853 apkPath string
1854 certFlag string
1855 lineageFlag string
1856 overrides []string
1857 packageFlag string
1858 renameResources bool
1859 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08001860 }{
1861 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001862 name: "foo",
1863 moduleName: "foo",
1864 variantName: "android_common",
1865 apkPath: "/target/product/test_device/system/app/foo/foo.apk",
1866 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1867 lineageFlag: "",
1868 overrides: []string{"qux"},
1869 packageFlag: "",
1870 renameResources: false,
1871 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001872 },
1873 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001874 name: "foo",
1875 moduleName: "bar",
1876 variantName: "android_common_bar",
1877 apkPath: "/target/product/test_device/system/app/bar/bar.apk",
1878 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
1879 lineageFlag: "--lineage lineage.bin",
1880 overrides: []string{"qux", "foo"},
1881 packageFlag: "",
1882 renameResources: false,
1883 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001884 },
1885 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001886 name: "foo",
1887 moduleName: "baz",
1888 variantName: "android_common_baz",
1889 apkPath: "/target/product/test_device/system/app/baz/baz.apk",
1890 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1891 lineageFlag: "",
1892 overrides: []string{"qux", "foo"},
1893 packageFlag: "org.dandroid.bp",
1894 renameResources: true,
1895 logging_parent: "",
1896 },
1897 {
1898 name: "foo",
1899 moduleName: "baz_no_rename_resources",
1900 variantName: "android_common_baz_no_rename_resources",
1901 apkPath: "/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
1902 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1903 lineageFlag: "",
1904 overrides: []string{"qux", "foo"},
1905 packageFlag: "org.dandroid.bp",
1906 renameResources: false,
1907 logging_parent: "",
1908 },
1909 {
1910 name: "foo_no_rename_resources",
1911 moduleName: "baz_base_no_rename_resources",
1912 variantName: "android_common_baz_base_no_rename_resources",
1913 apkPath: "/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
1914 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1915 lineageFlag: "",
1916 overrides: []string{"qux", "foo_no_rename_resources"},
1917 packageFlag: "org.dandroid.bp",
1918 renameResources: false,
1919 logging_parent: "",
1920 },
1921 {
1922 name: "foo_no_rename_resources",
1923 moduleName: "baz_override_base_rename_resources",
1924 variantName: "android_common_baz_override_base_rename_resources",
1925 apkPath: "/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
1926 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1927 lineageFlag: "",
1928 overrides: []string{"qux", "foo_no_rename_resources"},
1929 packageFlag: "org.dandroid.bp",
1930 renameResources: true,
1931 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001932 },
1933 }
1934 for _, expected := range expectedVariants {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001935 variant := ctx.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001936
1937 // Check the final apk name
1938 outputs := variant.AllOutputs()
1939 expectedApkPath := buildDir + expected.apkPath
1940 found := false
1941 for _, o := range outputs {
1942 if o == expectedApkPath {
1943 found = true
1944 break
1945 }
1946 }
1947 if !found {
1948 t.Errorf("Can't find %q in output files.\nAll outputs:%v", expectedApkPath, outputs)
1949 }
1950
1951 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08001952 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001953 certFlag := signapk.Args["certificates"]
1954 if expected.certFlag != certFlag {
1955 t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected.certFlag, certFlag)
1956 }
1957
1958 // Check the lineage flags
1959 lineageFlag := signapk.Args["flags"]
1960 if expected.lineageFlag != lineageFlag {
1961 t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected.lineageFlag, lineageFlag)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001962 }
1963
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001964 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08001965 mod := variant.Module().(*AndroidApp)
1966 if !reflect.DeepEqual(expected.overrides, mod.appProperties.Overrides) {
1967 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
1968 expected.overrides, mod.appProperties.Overrides)
1969 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001970
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001971 // Test Overridable property: Logging_parent
1972 logging_parent := mod.aapt.LoggingParent
1973 if expected.logging_parent != logging_parent {
1974 t.Errorf("Incorrect overrides property value for logging parent, expected: %q, got: %q",
1975 expected.logging_parent, logging_parent)
1976 }
1977
Liz Kammer1d5983b2020-05-19 19:15:37 +00001978 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001979 res := variant.Output("package-res.apk")
1980 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00001981 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
1982 expectedPackage := expected.packageFlag
1983 if !expected.renameResources {
1984 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00001985 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001986 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001987 }
1988}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07001989
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001990func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001991 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001992 android_app {
1993 name: "foo",
1994 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001995 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001996 }
1997
1998 override_android_app {
1999 name: "bar",
2000 base: "foo",
2001 package_name: "org.dandroid.bp",
2002 }
2003
2004 android_test {
2005 name: "baz",
2006 srcs: ["b.java"],
2007 instrumentation_for: "foo",
2008 }
2009
2010 android_test {
2011 name: "qux",
2012 srcs: ["b.java"],
2013 instrumentation_for: "bar",
2014 }
2015 `)
2016
2017 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
2018 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
2019 fooTurbine := filepath.Join(buildDir, ".intermediates", "foo", "android_common", "turbine-combined", "foo.jar")
2020 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2021 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2022 }
2023
2024 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
2025 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
2026 barTurbine := filepath.Join(buildDir, ".intermediates", "foo", "android_common_bar", "turbine-combined", "foo.jar")
2027 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2028 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2029 }
2030}
2031
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002032func TestOverrideAndroidTest(t *testing.T) {
2033 ctx, _ := testJava(t, `
2034 android_app {
2035 name: "foo",
2036 srcs: ["a.java"],
2037 package_name: "com.android.foo",
2038 sdk_version: "current",
2039 }
2040
2041 override_android_app {
2042 name: "bar",
2043 base: "foo",
2044 package_name: "com.android.bar",
2045 }
2046
2047 android_test {
2048 name: "foo_test",
2049 srcs: ["b.java"],
2050 instrumentation_for: "foo",
2051 }
2052
2053 override_android_test {
2054 name: "bar_test",
2055 base: "foo_test",
2056 package_name: "com.android.bar.test",
2057 instrumentation_for: "bar",
2058 instrumentation_target_package: "com.android.bar",
2059 }
2060 `)
2061
2062 expectedVariants := []struct {
2063 moduleName string
2064 variantName string
2065 apkPath string
2066 overrides []string
2067 targetVariant string
2068 packageFlag string
2069 targetPackageFlag string
2070 }{
2071 {
2072 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002073 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002074 overrides: nil,
2075 targetVariant: "android_common",
2076 packageFlag: "",
2077 targetPackageFlag: "",
2078 },
2079 {
2080 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002081 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002082 overrides: []string{"foo_test"},
2083 targetVariant: "android_common_bar",
2084 packageFlag: "com.android.bar.test",
2085 targetPackageFlag: "com.android.bar",
2086 },
2087 }
2088 for _, expected := range expectedVariants {
2089 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2090
2091 // Check the final apk name
2092 outputs := variant.AllOutputs()
2093 expectedApkPath := buildDir + expected.apkPath
2094 found := false
2095 for _, o := range outputs {
2096 if o == expectedApkPath {
2097 found = true
2098 break
2099 }
2100 }
2101 if !found {
2102 t.Errorf("Can't find %q in output files.\nAll outputs:%v", expectedApkPath, outputs)
2103 }
2104
2105 // Check if the overrides field values are correctly aggregated.
2106 mod := variant.Module().(*AndroidTest)
2107 if !reflect.DeepEqual(expected.overrides, mod.appProperties.Overrides) {
2108 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
2109 expected.overrides, mod.appProperties.Overrides)
2110 }
2111
2112 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
2113 javac := variant.Rule("javac")
2114 turbine := filepath.Join(buildDir, ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
2115 if !strings.Contains(javac.Args["classpath"], turbine) {
2116 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2117 }
2118
2119 // Check aapt2 flags.
2120 res := variant.Output("package-res.apk")
2121 aapt2Flags := res.Args["flags"]
2122 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002123 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002124 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2125 }
2126}
2127
Jaewoong Jung39982342020-01-14 10:27:18 -08002128func TestAndroidTest_FixTestConfig(t *testing.T) {
2129 ctx, _ := testJava(t, `
2130 android_app {
2131 name: "foo",
2132 srcs: ["a.java"],
2133 package_name: "com.android.foo",
2134 sdk_version: "current",
2135 }
2136
2137 android_test {
2138 name: "foo_test",
2139 srcs: ["b.java"],
2140 instrumentation_for: "foo",
2141 }
2142
2143 android_test {
2144 name: "bar_test",
2145 srcs: ["b.java"],
2146 package_name: "com.android.bar.test",
2147 instrumentation_for: "foo",
2148 }
2149
2150 override_android_test {
2151 name: "baz_test",
2152 base: "foo_test",
2153 package_name: "com.android.baz.test",
2154 }
2155 `)
2156
2157 testCases := []struct {
2158 moduleName string
2159 variantName string
2160 expectedFlags []string
2161 }{
2162 {
2163 moduleName: "foo_test",
2164 variantName: "android_common",
2165 },
2166 {
2167 moduleName: "bar_test",
2168 variantName: "android_common",
2169 expectedFlags: []string{
2170 "--manifest " + buildDir + "/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
2171 "--package-name com.android.bar.test",
2172 },
2173 },
2174 {
2175 moduleName: "foo_test",
2176 variantName: "android_common_baz_test",
2177 expectedFlags: []string{
2178 "--manifest " + buildDir +
2179 "/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
2180 "--package-name com.android.baz.test",
2181 "--test-file-name baz_test.apk",
2182 },
2183 },
2184 }
2185
2186 for _, test := range testCases {
2187 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
2188 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
2189
2190 if len(test.expectedFlags) > 0 {
2191 if params.Rule == nil {
2192 t.Errorf("test_config_fixer was expected to run, but didn't")
2193 } else {
2194 for _, flag := range test.expectedFlags {
2195 if !strings.Contains(params.RuleParams.Command, flag) {
2196 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
2197 }
2198 }
2199 }
2200 } else {
2201 if params.Rule != nil {
2202 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
2203 }
2204 }
2205
2206 }
2207}
2208
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002209func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002210 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002211 cc_library {
2212 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08002213 sdk_version: "current",
2214 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002215 }
2216
2217 android_test {
2218 name: "stl",
2219 jni_libs: ["libjni"],
2220 compile_multilib: "both",
2221 sdk_version: "current",
2222 stl: "c++_shared",
2223 }
2224
2225 android_test {
2226 name: "system",
2227 jni_libs: ["libjni"],
2228 compile_multilib: "both",
2229 sdk_version: "current",
2230 }
2231 `)
2232
2233 testCases := []struct {
2234 name string
2235 jnis []string
2236 }{
2237 {"stl",
2238 []string{
2239 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07002240 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002241 },
2242 },
2243 {"system",
2244 []string{
2245 "libjni.so",
2246 },
2247 },
2248 }
2249
2250 for _, test := range testCases {
2251 t.Run(test.name, func(t *testing.T) {
2252 app := ctx.ModuleForTests(test.name, "android_common")
2253 jniLibZip := app.Output("jnilibs.zip")
2254 var jnis []string
2255 args := strings.Fields(jniLibZip.Args["jarArgs"])
2256 for i := 0; i < len(args); i++ {
2257 if args[i] == "-f" {
2258 jnis = append(jnis, args[i+1])
2259 i += 1
2260 }
2261 }
2262 jnisJoined := strings.Join(jnis, " ")
2263 for _, jni := range test.jnis {
2264 if !strings.Contains(jnisJoined, jni) {
2265 t.Errorf("missing jni %q in %q", jni, jnis)
2266 }
2267 }
2268 })
2269 }
2270}
Colin Cross50ddcc42019-05-16 12:28:22 -07002271
2272func TestUsesLibraries(t *testing.T) {
2273 bp := `
2274 java_sdk_library {
2275 name: "foo",
2276 srcs: ["a.java"],
2277 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002278 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002279 }
2280
2281 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01002282 name: "qux",
2283 srcs: ["a.java"],
2284 api_packages: ["qux"],
2285 sdk_version: "current",
2286 }
2287
2288 java_sdk_library {
2289 name: "quuz",
2290 srcs: ["a.java"],
2291 api_packages: ["quuz"],
2292 sdk_version: "current",
2293 }
2294
2295 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002296 name: "fred",
2297 srcs: ["a.java"],
2298 api_packages: ["fred"],
2299 sdk_version: "current",
2300 }
2301
2302 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07002303 name: "bar",
2304 srcs: ["a.java"],
2305 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002306 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002307 }
2308
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01002309 java_sdk_library {
2310 name: "runtime-library",
2311 srcs: ["a.java"],
2312 sdk_version: "current",
2313 }
2314
2315 java_library {
2316 name: "static-runtime-helper",
2317 srcs: ["a.java"],
2318 libs: ["runtime-library"],
2319 sdk_version: "current",
2320 }
2321
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002322 // A library that has to use "provides_uses_lib", because:
2323 // - it is not an SDK library
2324 // - its library name is different from its module name
2325 java_library {
2326 name: "non-sdk-lib",
2327 provides_uses_lib: "com.non.sdk.lib",
2328 installable: true,
2329 srcs: ["a.java"],
2330 }
2331
Colin Cross50ddcc42019-05-16 12:28:22 -07002332 android_app {
2333 name: "app",
2334 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002335 libs: [
2336 "qux",
2337 "quuz.stubs"
2338 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002339 static_libs: [
2340 "static-runtime-helper",
2341 // statically linked component libraries should not pull their SDK libraries,
2342 // so "fred" should not be added to class loader context
2343 "fred.stubs",
2344 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002345 uses_libs: [
2346 "foo",
2347 "non-sdk-lib"
2348 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002349 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002350 optional_uses_libs: [
2351 "bar",
2352 "baz",
2353 ],
2354 }
2355
2356 android_app_import {
2357 name: "prebuilt",
2358 apk: "prebuilts/apk/app.apk",
2359 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002360 uses_libs: [
2361 "foo",
2362 "non-sdk-lib",
2363 "android.test.runner"
2364 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07002365 optional_uses_libs: [
2366 "bar",
2367 "baz",
2368 ],
2369 }
2370 `
2371
Paul Duffind234b412021-03-12 23:04:46 +00002372 result := javaFixtureFactory.Extend(
Paul Duffin2645a292021-03-13 02:36:00 +00002373 PrepareForTestWithJavaSdkLibraryFiles,
2374 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Paul Duffind234b412021-03-12 23:04:46 +00002375 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2376 variables.MissingUsesLibraries = []string{"baz"}
2377 }),
2378 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07002379
Paul Duffind234b412021-03-12 23:04:46 +00002380 app := result.ModuleForTests("app", "android_common")
2381 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07002382
Paul Duffin859fe962020-05-15 10:20:31 +01002383 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002384 // This should not include explicit `uses_libs`/`optional_uses_libs` entries.
2385 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2386 expectManifestFixerArgs := `--extract-native-libs=true ` +
2387 `--uses-library qux ` +
2388 `--uses-library quuz ` +
2389 `--uses-library foo ` + // TODO(b/132357300): "foo" should not be passed to manifest_fixer
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002390 `--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 +00002391 `--uses-library bar ` + // TODO(b/132357300): "bar" should not be passed to manifest_fixer
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002392 `--uses-library runtime-library`
Paul Duffind234b412021-03-12 23:04:46 +00002393 android.AssertStringEquals(t, "manifest_fixer args", expectManifestFixerArgs, actualManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01002394
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002395 // Test that all libraries are verified (library order matters).
2396 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
2397 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002398 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002399 `--uses-library qux ` +
2400 `--uses-library quuz ` +
2401 `--uses-library runtime-library ` +
2402 `--optional-uses-library bar ` +
2403 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002404 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002405
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 Trafimovich0aba2522021-03-03 16:38:37 +00002408 verifyApkArgs := `--uses-library foo ` +
2409 `--uses-library com.non.sdk.lib ` +
2410 `--uses-library android.test.runner ` +
2411 `--optional-uses-library bar ` +
2412 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002413 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002414
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002415 // Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002416 cmd := app.Rule("dexpreopt").RuleParams.Command
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002417 w := `--target-context-for-sdk any ` +
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002418 `PCL[/system/framework/qux.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002419 `PCL[/system/framework/quuz.jar]#` +
2420 `PCL[/system/framework/foo.jar]#` +
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002421 `PCL[/system/framework/non-sdk-lib.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002422 `PCL[/system/framework/bar.jar]#` +
2423 `PCL[/system/framework/runtime-library.jar]`
Paul Duffind234b412021-03-12 23:04:46 +00002424 android.AssertStringDoesContain(t, "dexpreopt app cmd args", cmd, w)
Colin Cross50ddcc42019-05-16 12:28:22 -07002425
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002426 // Test conditional context for target SDK version 28.
Paul Duffind234b412021-03-12 23:04:46 +00002427 android.AssertStringDoesContain(t, "dexpreopt app cmd 28", cmd,
2428 `--target-context-for-sdk 28`+
2429 ` PCL[/system/framework/org.apache.http.legacy.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002430
2431 // Test conditional context for target SDK version 29.
Paul Duffind234b412021-03-12 23:04:46 +00002432 android.AssertStringDoesContain(t, "dexpreopt app cmd 29", cmd,
2433 `--target-context-for-sdk 29`+
2434 ` PCL[/system/framework/android.hidl.manager-V1.0-java.jar]`+
2435 `#PCL[/system/framework/android.hidl.base-V1.0-java.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002436
2437 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002438 // "android.test.mock" is absent because "android.test.runner" is not used.
Paul Duffind234b412021-03-12 23:04:46 +00002439 android.AssertStringDoesContain(t, "dexpreopt app cmd 30", cmd,
2440 `--target-context-for-sdk 30`+
2441 ` PCL[/system/framework/android.test.base.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002442
Ulya Trafimovichfc24ad32020-08-19 16:32:54 +01002443 cmd = prebuilt.Rule("dexpreopt").RuleParams.Command
Paul Duffind234b412021-03-12 23:04:46 +00002444 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd", cmd,
2445 `--target-context-for-sdk any`+
2446 ` PCL[/system/framework/foo.jar]`+
2447 `#PCL[/system/framework/non-sdk-lib.jar]`+
2448 `#PCL[/system/framework/android.test.runner.jar]`+
2449 `#PCL[/system/framework/bar.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002450
2451 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002452 // "android.test.mock" is present because "android.test.runner" is used.
Paul Duffind234b412021-03-12 23:04:46 +00002453 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd 30", cmd,
2454 `--target-context-for-sdk 30`+
2455 ` PCL[/system/framework/android.test.base.jar]`+
2456 `#PCL[/system/framework/android.test.mock.jar] `)
Colin Cross50ddcc42019-05-16 12:28:22 -07002457}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002458
2459func TestCodelessApp(t *testing.T) {
2460 testCases := []struct {
2461 name string
2462 bp string
2463 noCode bool
2464 }{
2465 {
2466 name: "normal",
2467 bp: `
2468 android_app {
2469 name: "foo",
2470 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002471 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002472 }
2473 `,
2474 noCode: false,
2475 },
2476 {
2477 name: "app without sources",
2478 bp: `
2479 android_app {
2480 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002481 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002482 }
2483 `,
2484 noCode: true,
2485 },
2486 {
2487 name: "app with libraries",
2488 bp: `
2489 android_app {
2490 name: "foo",
2491 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002492 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002493 }
2494
2495 java_library {
2496 name: "lib",
2497 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002498 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002499 }
2500 `,
2501 noCode: false,
2502 },
2503 {
2504 name: "app with sourceless libraries",
2505 bp: `
2506 android_app {
2507 name: "foo",
2508 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002509 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002510 }
2511
2512 java_library {
2513 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002514 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002515 }
2516 `,
2517 // TODO(jungjw): this should probably be true
2518 noCode: false,
2519 },
2520 }
2521
2522 for _, test := range testCases {
2523 t.Run(test.name, func(t *testing.T) {
2524 ctx := testApp(t, test.bp)
2525
2526 foo := ctx.ModuleForTests("foo", "android_common")
2527 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2528 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
2529 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
2530 }
2531 })
2532 }
2533}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002534
2535func TestEmbedNotice(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -07002536 ctx, _ := testJavaWithFS(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002537 android_app {
2538 name: "foo",
2539 srcs: ["a.java"],
2540 static_libs: ["javalib"],
2541 jni_libs: ["libjni"],
2542 notice: "APP_NOTICE",
2543 embed_notices: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002544 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002545 }
2546
2547 // No embed_notice flag
2548 android_app {
2549 name: "bar",
2550 srcs: ["a.java"],
2551 jni_libs: ["libjni"],
2552 notice: "APP_NOTICE",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002553 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002554 }
2555
2556 // No NOTICE files
2557 android_app {
2558 name: "baz",
2559 srcs: ["a.java"],
2560 embed_notices: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002561 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002562 }
2563
2564 cc_library {
2565 name: "libjni",
2566 system_shared_libs: [],
2567 stl: "none",
2568 notice: "LIB_NOTICE",
Colin Cross094cde42020-02-15 10:38:00 -08002569 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002570 }
2571
2572 java_library {
2573 name: "javalib",
2574 srcs: [
2575 ":gen",
2576 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002577 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002578 }
2579
2580 genrule {
2581 name: "gen",
2582 tools: ["gentool"],
2583 out: ["gen.java"],
2584 notice: "GENRULE_NOTICE",
2585 }
2586
2587 java_binary_host {
2588 name: "gentool",
2589 srcs: ["b.java"],
2590 notice: "TOOL_NOTICE",
2591 }
Colin Cross238c1f32020-06-07 16:58:18 -07002592 `, map[string][]byte{
2593 "APP_NOTICE": nil,
2594 "GENRULE_NOTICE": nil,
2595 "LIB_NOTICE": nil,
2596 "TOOL_NOTICE": nil,
2597 })
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002598
2599 // foo has NOTICE files to process, and embed_notices is true.
2600 foo := ctx.ModuleForTests("foo", "android_common")
2601 // verify merge notices rule.
2602 mergeNotices := foo.Rule("mergeNoticesRule")
2603 noticeInputs := mergeNotices.Inputs.Strings()
2604 // TOOL_NOTICE should be excluded as it's a host module.
2605 if len(mergeNotices.Inputs) != 3 {
2606 t.Errorf("number of input notice files: expected = 3, actual = %q", noticeInputs)
2607 }
2608 if !inList("APP_NOTICE", noticeInputs) {
2609 t.Errorf("APP_NOTICE is missing from notice files, %q", noticeInputs)
2610 }
2611 if !inList("LIB_NOTICE", noticeInputs) {
2612 t.Errorf("LIB_NOTICE is missing from notice files, %q", noticeInputs)
2613 }
2614 if !inList("GENRULE_NOTICE", noticeInputs) {
2615 t.Errorf("GENRULE_NOTICE is missing from notice files, %q", noticeInputs)
2616 }
2617 // aapt2 flags should include -A <NOTICE dir> so that its contents are put in the APK's /assets.
2618 res := foo.Output("package-res.apk")
2619 aapt2Flags := res.Args["flags"]
2620 e := "-A " + buildDir + "/.intermediates/foo/android_common/NOTICE"
2621 if !strings.Contains(aapt2Flags, e) {
2622 t.Errorf("asset dir flag for NOTICE, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
2623 }
2624
2625 // bar has NOTICE files to process, but embed_notices is not set.
2626 bar := ctx.ModuleForTests("bar", "android_common")
Jaewoong Jung98772792019-07-01 17:15:13 -07002627 res = bar.Output("package-res.apk")
2628 aapt2Flags = res.Args["flags"]
2629 e = "-A " + buildDir + "/.intermediates/bar/android_common/NOTICE"
2630 if strings.Contains(aapt2Flags, e) {
2631 t.Errorf("bar shouldn't have the asset dir flag for NOTICE: %q", e)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002632 }
2633
2634 // baz's embed_notice is true, but it doesn't have any NOTICE files.
2635 baz := ctx.ModuleForTests("baz", "android_common")
Jaewoong Jung98772792019-07-01 17:15:13 -07002636 res = baz.Output("package-res.apk")
2637 aapt2Flags = res.Args["flags"]
2638 e = "-A " + buildDir + "/.intermediates/baz/android_common/NOTICE"
2639 if strings.Contains(aapt2Flags, e) {
2640 t.Errorf("baz shouldn't have the asset dir flag for NOTICE: %q", e)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002641 }
2642}
Colin Cross53a87f52019-06-25 13:35:30 -07002643
2644func TestUncompressDex(t *testing.T) {
2645 testCases := []struct {
2646 name string
2647 bp string
2648
2649 uncompressedPlatform bool
2650 uncompressedUnbundled bool
2651 }{
2652 {
2653 name: "normal",
2654 bp: `
2655 android_app {
2656 name: "foo",
2657 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002658 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002659 }
2660 `,
2661 uncompressedPlatform: true,
2662 uncompressedUnbundled: false,
2663 },
2664 {
2665 name: "use_embedded_dex",
2666 bp: `
2667 android_app {
2668 name: "foo",
2669 use_embedded_dex: true,
2670 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002671 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002672 }
2673 `,
2674 uncompressedPlatform: true,
2675 uncompressedUnbundled: true,
2676 },
2677 {
2678 name: "privileged",
2679 bp: `
2680 android_app {
2681 name: "foo",
2682 privileged: true,
2683 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002684 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002685 }
2686 `,
2687 uncompressedPlatform: true,
2688 uncompressedUnbundled: true,
2689 },
David Srbeckye033cba2020-05-20 22:20:28 +01002690 {
2691 name: "normal_uncompress_dex_true",
2692 bp: `
2693 android_app {
2694 name: "foo",
2695 srcs: ["a.java"],
2696 sdk_version: "current",
2697 uncompress_dex: true,
2698 }
2699 `,
2700 uncompressedPlatform: true,
2701 uncompressedUnbundled: true,
2702 },
2703 {
2704 name: "normal_uncompress_dex_false",
2705 bp: `
2706 android_app {
2707 name: "foo",
2708 srcs: ["a.java"],
2709 sdk_version: "current",
2710 uncompress_dex: false,
2711 }
2712 `,
2713 uncompressedPlatform: false,
2714 uncompressedUnbundled: false,
2715 },
Colin Cross53a87f52019-06-25 13:35:30 -07002716 }
2717
2718 test := func(t *testing.T, bp string, want bool, unbundled bool) {
2719 t.Helper()
2720
Paul Duffincdb88a92021-03-14 00:36:50 +00002721 result := javaFixtureFactory.Extend(
Paul Duffin2645a292021-03-13 02:36:00 +00002722 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00002723 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2724 if unbundled {
2725 variables.Unbundled_build = proptools.BoolPtr(true)
2726 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
2727 }
2728 }),
2729 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07002730
Paul Duffincdb88a92021-03-14 00:36:50 +00002731 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07002732 dex := foo.Rule("r8")
2733 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
2734 aligned := foo.MaybeRule("zipalign").Rule != nil
2735
Paul Duffincdb88a92021-03-14 00:36:50 +00002736 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07002737
Paul Duffincdb88a92021-03-14 00:36:50 +00002738 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07002739 }
2740
2741 for _, tt := range testCases {
2742 t.Run(tt.name, func(t *testing.T) {
2743 t.Run("platform", func(t *testing.T) {
2744 test(t, tt.bp, tt.uncompressedPlatform, false)
2745 })
2746 t.Run("unbundled", func(t *testing.T) {
2747 test(t, tt.bp, tt.uncompressedUnbundled, true)
2748 })
2749 })
2750 }
2751}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002752
2753func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
2754 if expectedValue != "" {
2755 expectedFlag := "--" + flagName + " " + expectedValue
2756 if !strings.Contains(aapt2Flags, expectedFlag) {
2757 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
2758 }
2759 } else {
2760 unexpectedFlag := "--" + flagName
2761 if strings.Contains(aapt2Flags, unexpectedFlag) {
2762 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
2763 }
2764 }
2765}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08002766
Cole Faust9a631312020-10-22 21:05:24 +00002767func TestExportedProguardFlagFiles(t *testing.T) {
2768 ctx, _ := testJava(t, `
2769 android_app {
2770 name: "foo",
2771 sdk_version: "current",
2772 static_libs: ["lib1"],
2773 }
2774
2775 android_library {
2776 name: "lib1",
2777 sdk_version: "current",
2778 optimize: {
2779 proguard_flags_files: ["lib1proguard.cfg"],
2780 }
2781 }
2782 `)
2783
2784 m := ctx.ModuleForTests("foo", "android_common")
2785 hasLib1Proguard := false
2786 for _, s := range m.Rule("java.r8").Implicits.Strings() {
2787 if s == "lib1proguard.cfg" {
2788 hasLib1Proguard = true
2789 break
2790 }
2791 }
2792
2793 if !hasLib1Proguard {
2794 t.Errorf("App does not use library proguard config")
2795 }
2796}