blob: cf8cfa4fb39bd3560e7a0fca98b74db7f565475f [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.
378 ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, test.bp)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100379 })
380 }
381}
382
Jooyung Han749dc692020-04-15 11:03:39 +0900383func TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) {
384 testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+`
385 android_app {
386 name: "foo",
387 srcs: ["a.java"],
388 updatable: true,
389 sdk_version: "current",
390 min_sdk_version: "29",
391 static_libs: ["bar"],
392 }
393
394 java_library {
395 name: "bar",
396 sdk_version: "current",
397 }
398 `)
399}
400
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900401func TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) {
402 testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
403 android_app {
404 name: "foo",
405 srcs: ["a.java"],
406 updatable: true,
407 sdk_version: "current",
408 min_sdk_version: "current",
409 jni_libs: ["libjni"],
410 }
411
412 cc_library {
413 name: "libjni",
414 stl: "none",
415 system_shared_libs: [],
416 sdk_version: "current",
417 }
418 `)
419}
420
421func TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) {
422 bp := cc.GatherRequiredDepsForTest(android.Android) + `
423 android_app {
424 name: "foo",
425 srcs: ["a.java"],
426 updatable: true,
427 sdk_version: "current",
428 min_sdk_version: "29",
429 jni_libs: ["libjni"],
430 }
431
432 cc_library {
433 name: "libjni",
434 stl: "none",
435 system_shared_libs: [],
436 sdk_version: "29",
437 }
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900438 `
439 fs := map[string][]byte{
440 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
441 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil,
442 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil,
443 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil,
444 }
445
446 ctx, _ := testJavaWithConfig(t, testConfig(nil, bp, fs))
447
448 inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
449 var crtbeginFound, crtendFound bool
Dan Albert92fe7402020-07-15 13:33:30 -0700450 expectedCrtBegin := ctx.ModuleForTests("crtbegin_so",
451 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
452 expectedCrtEnd := ctx.ModuleForTests("crtend_so",
453 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
454 implicits := []string{}
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900455 for _, input := range inputs {
Dan Albert92fe7402020-07-15 13:33:30 -0700456 implicits = append(implicits, input.String())
457 if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900458 crtbeginFound = true
Dan Albert92fe7402020-07-15 13:33:30 -0700459 } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900460 crtendFound = true
461 }
462 }
Dan Albert92fe7402020-07-15 13:33:30 -0700463 if !crtbeginFound {
464 t.Error(fmt.Sprintf(
465 "expected implicit with suffix %q, have the following implicits:\n%s",
466 expectedCrtBegin, strings.Join(implicits, "\n")))
467 }
468 if !crtendFound {
469 t.Error(fmt.Sprintf(
470 "expected implicit with suffix %q, have the following implicits:\n%s",
471 expectedCrtEnd, strings.Join(implicits, "\n")))
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900472 }
473}
474
475func TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
476 bp := cc.GatherRequiredDepsForTest(android.Android) + `
477 android_app {
478 name: "foo",
479 srcs: ["a.java"],
480 updatable: true,
481 sdk_version: "current",
482 min_sdk_version: "29", // this APK should support 29
483 jni_libs: ["libjni"],
484 }
485
486 cc_library {
487 name: "libjni",
488 stl: "none",
489 sdk_version: "current",
490 }
491 `
492 testJavaError(t, `"libjni" .*: sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
493}
494
495func TestUpdatableApps_ErrorIfDepSdkVersionIsHigher(t *testing.T) {
496 bp := cc.GatherRequiredDepsForTest(android.Android) + `
497 android_app {
498 name: "foo",
499 srcs: ["a.java"],
500 updatable: true,
501 sdk_version: "current",
502 min_sdk_version: "29", // this APK should support 29
503 jni_libs: ["libjni"],
504 }
505
506 cc_library {
507 name: "libjni",
508 stl: "none",
509 shared_libs: ["libbar"],
510 system_shared_libs: [],
511 sdk_version: "27",
512 }
513
514 cc_library {
515 name: "libbar",
516 stl: "none",
517 system_shared_libs: [],
518 sdk_version: "current",
519 }
520 `
521 testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
522}
523
Colin Cross0ddae7f2019-02-07 15:30:01 -0800524func TestResourceDirs(t *testing.T) {
525 testCases := []struct {
526 name string
527 prop string
528 resources []string
529 }{
530 {
531 name: "no resource_dirs",
532 prop: "",
533 resources: []string{"res/res/values/strings.xml"},
534 },
535 {
536 name: "resource_dirs",
537 prop: `resource_dirs: ["res"]`,
538 resources: []string{"res/res/values/strings.xml"},
539 },
540 {
541 name: "empty resource_dirs",
542 prop: `resource_dirs: []`,
543 resources: nil,
544 },
545 }
546
547 fs := map[string][]byte{
548 "res/res/values/strings.xml": nil,
549 }
550
551 bp := `
552 android_app {
553 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900554 sdk_version: "current",
Colin Cross0ddae7f2019-02-07 15:30:01 -0800555 %s
556 }
557 `
558
559 for _, testCase := range testCases {
560 t.Run(testCase.name, func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800561 config := testConfig(nil, fmt.Sprintf(bp, testCase.prop), fs)
Colin Crossae8600b2020-10-29 17:09:13 -0700562 ctx := testContext(config)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800563 run(t, ctx, config)
564
565 module := ctx.ModuleForTests("foo", "android_common")
566 resourceList := module.MaybeOutput("aapt2/res.list")
567
568 var resources []string
569 if resourceList.Rule != nil {
570 for _, compiledResource := range resourceList.Inputs.Strings() {
571 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
572 }
573 }
574
575 if !reflect.DeepEqual(resources, testCase.resources) {
576 t.Errorf("expected resource files %q, got %q",
577 testCase.resources, resources)
578 }
579 })
580 }
581}
582
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800583func TestLibraryAssets(t *testing.T) {
584 bp := `
585 android_app {
586 name: "foo",
587 sdk_version: "current",
588 static_libs: ["lib1", "lib2", "lib3"],
589 }
590
591 android_library {
592 name: "lib1",
593 sdk_version: "current",
594 asset_dirs: ["assets_a"],
595 }
596
597 android_library {
598 name: "lib2",
599 sdk_version: "current",
600 }
601
602 android_library {
603 name: "lib3",
604 sdk_version: "current",
605 static_libs: ["lib4"],
606 }
607
608 android_library {
609 name: "lib4",
610 sdk_version: "current",
611 asset_dirs: ["assets_b"],
612 }
613 `
614
615 testCases := []struct {
616 name string
617 assetFlag string
618 assetPackages []string
619 }{
620 {
621 name: "foo",
622 // lib1 has its own asset. lib3 doesn't have any, but provides lib4's transitively.
623 assetPackages: []string{
624 buildDir + "/.intermediates/foo/android_common/aapt2/package-res.apk",
625 buildDir + "/.intermediates/lib1/android_common/assets.zip",
626 buildDir + "/.intermediates/lib3/android_common/assets.zip",
627 },
628 },
629 {
630 name: "lib1",
631 assetFlag: "-A assets_a",
632 },
633 {
634 name: "lib2",
635 },
636 {
637 name: "lib3",
638 assetPackages: []string{
639 buildDir + "/.intermediates/lib3/android_common/aapt2/package-res.apk",
640 buildDir + "/.intermediates/lib4/android_common/assets.zip",
641 },
642 },
643 {
644 name: "lib4",
645 assetFlag: "-A assets_b",
646 },
647 }
648 ctx := testApp(t, bp)
649
650 for _, test := range testCases {
651 t.Run(test.name, func(t *testing.T) {
652 m := ctx.ModuleForTests(test.name, "android_common")
653
654 // Check asset flag in aapt2 link flags
655 var aapt2link android.TestingBuildParams
656 if len(test.assetPackages) > 0 {
657 aapt2link = m.Output("aapt2/package-res.apk")
658 } else {
659 aapt2link = m.Output("package-res.apk")
660 }
661 aapt2Flags := aapt2link.Args["flags"]
662 if test.assetFlag != "" {
663 if !strings.Contains(aapt2Flags, test.assetFlag) {
664 t.Errorf("Can't find asset flag %q in aapt2 link flags %q", test.assetFlag, aapt2Flags)
665 }
666 } else {
667 if strings.Contains(aapt2Flags, " -A ") {
668 t.Errorf("aapt2 link flags %q contain unexpected asset flag", aapt2Flags)
669 }
670 }
671
672 // Check asset merge rule.
673 if len(test.assetPackages) > 0 {
674 mergeAssets := m.Output("package-res.apk")
675 if !reflect.DeepEqual(test.assetPackages, mergeAssets.Inputs.Strings()) {
676 t.Errorf("Unexpected mergeAssets inputs: %v, expected: %v",
677 mergeAssets.Inputs.Strings(), test.assetPackages)
678 }
679 }
680 })
681 }
682}
683
Colin Crossb014f072021-02-26 14:54:36 -0800684func TestAppJavaResources(t *testing.T) {
685 bp := `
686 android_app {
687 name: "foo",
688 sdk_version: "current",
689 java_resources: ["resources/a"],
690 srcs: ["a.java"],
691 }
692
693 android_app {
694 name: "bar",
695 sdk_version: "current",
696 java_resources: ["resources/a"],
697 }
698 `
699
700 ctx := testApp(t, bp)
701
702 foo := ctx.ModuleForTests("foo", "android_common")
703 fooResources := foo.Output("res/foo.jar")
704 fooDexJar := foo.Output("dex-withres/foo.jar")
705 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
706 fooApk := foo.Rule("combineApk")
707
708 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
709 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
710 }
711
712 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
713 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
714 }
715
716 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
717 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
718 }
719
720 bar := ctx.ModuleForTests("bar", "android_common")
721 barResources := bar.Output("res/bar.jar")
722 barApk := bar.Rule("combineApk")
723
724 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
725 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
726 }
727}
728
Colin Crossbec85302019-02-13 13:15:46 -0800729func TestAndroidResources(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -0800730 testCases := []struct {
731 name string
732 enforceRROTargets []string
733 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -0800734 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -0800735 overlayFiles map[string][]string
736 rroDirs map[string][]string
737 }{
738 {
739 name: "no RRO",
740 enforceRROTargets: nil,
741 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -0800742 resourceFiles: map[string][]string{
743 "foo": nil,
744 "bar": {"bar/res/res/values/strings.xml"},
745 "lib": nil,
746 "lib2": {"lib2/res/res/values/strings.xml"},
747 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800748 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800749 "foo": {
750 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800751 buildDir + "/.intermediates/lib/android_common/package-res.apk",
Anton Hansson53c88442019-03-18 15:53:16 +0000752 buildDir + "/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800753 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800754 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
755 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +0000756 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800757 },
Colin Crossbec85302019-02-13 13:15:46 -0800758 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800759 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
760 "device/vendor/blah/overlay/bar/res/values/strings.xml",
761 },
Colin Crossbec85302019-02-13 13:15:46 -0800762 "lib": {
763 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
764 "lib/res/res/values/strings.xml",
765 "device/vendor/blah/overlay/lib/res/values/strings.xml",
766 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800767 },
768 rroDirs: map[string][]string{
769 "foo": nil,
770 "bar": nil,
771 },
772 },
773 {
774 name: "enforce RRO on foo",
775 enforceRROTargets: []string{"foo"},
776 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -0800777 resourceFiles: map[string][]string{
778 "foo": nil,
779 "bar": {"bar/res/res/values/strings.xml"},
780 "lib": nil,
781 "lib2": {"lib2/res/res/values/strings.xml"},
782 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800783 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800784 "foo": {
785 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800786 buildDir + "/.intermediates/lib/android_common/package-res.apk",
Anton Hansson53c88442019-03-18 15:53:16 +0000787 buildDir + "/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800788 "foo/res/res/values/strings.xml",
789 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
790 },
Colin Crossbec85302019-02-13 13:15:46 -0800791 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800792 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
793 "device/vendor/blah/overlay/bar/res/values/strings.xml",
794 },
Colin Crossbec85302019-02-13 13:15:46 -0800795 "lib": {
796 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
797 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -0800798 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800799 },
Colin Crossc1c37552019-01-31 11:42:41 -0800800
Colin Cross5c4791c2019-02-01 11:44:44 -0800801 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800802 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000803 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +0000804 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700805 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800806 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800807 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700808 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800809 },
810 },
811 {
812 name: "enforce RRO on all",
813 enforceRROTargets: []string{"*"},
814 enforceRROExcludedOverlays: []string{
815 // Excluding specific apps/res directories also allowed.
816 "device/vendor/blah/static_overlay/foo",
817 "device/vendor/blah/static_overlay/bar/res",
818 },
Colin Crossbec85302019-02-13 13:15:46 -0800819 resourceFiles: map[string][]string{
820 "foo": nil,
821 "bar": {"bar/res/res/values/strings.xml"},
822 "lib": nil,
823 "lib2": {"lib2/res/res/values/strings.xml"},
824 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800825 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800826 "foo": {
827 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800828 buildDir + "/.intermediates/lib/android_common/package-res.apk",
Anton Hansson53c88442019-03-18 15:53:16 +0000829 buildDir + "/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800830 "foo/res/res/values/strings.xml",
831 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
832 },
Colin Crossbec85302019-02-13 13:15:46 -0800833 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
834 "lib": {
835 buildDir + "/.intermediates/lib2/android_common/package-res.apk",
836 "lib/res/res/values/strings.xml",
837 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800838 },
839 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800840 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000841 "device:device/vendor/blah/overlay/foo/res",
842 "product:product/vendor/blah/overlay/foo/res",
843 // Lib dep comes after the direct deps
844 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800845 },
Anton Hansson53c88442019-03-18 15:53:16 +0000846 "bar": {"device:device/vendor/blah/overlay/bar/res"},
847 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800848 },
849 },
850 }
851
Anton Hansson53c88442019-03-18 15:53:16 +0000852 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -0800853 "device/vendor/blah/overlay",
854 "device/vendor/blah/overlay2",
855 "device/vendor/blah/static_overlay",
856 }
857
Anton Hansson53c88442019-03-18 15:53:16 +0000858 productResourceOverlays := []string{
859 "product/vendor/blah/overlay",
860 }
861
Colin Cross890ff552017-11-30 20:13:19 -0800862 fs := map[string][]byte{
863 "foo/res/res/values/strings.xml": nil,
864 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800865 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -0800866 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800867 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
868 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800869 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800870 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
871 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
872 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +0000873 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800874 }
875
876 bp := `
877 android_app {
878 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900879 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800880 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +0000881 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -0800882 }
883
884 android_app {
885 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900886 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800887 resource_dirs: ["bar/res"],
888 }
Colin Cross6ed7dea2019-01-31 14:44:30 -0800889
890 android_library {
891 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900892 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800893 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -0800894 static_libs: ["lib2"],
895 }
896
897 android_library {
898 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900899 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -0800900 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -0800901 }
Anton Hansson53c88442019-03-18 15:53:16 +0000902
903 // This library has the same resources as lib (should not lead to dupe RROs)
904 android_library {
905 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900906 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +0000907 resource_dirs: ["lib/res"]
908 }
Colin Cross890ff552017-11-30 20:13:19 -0800909 `
910
Colin Cross5c4791c2019-02-01 11:44:44 -0800911 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -0800912 t.Run(testCase.name, func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800913 config := testAppConfig(nil, bp, fs)
Anton Hansson53c88442019-03-18 15:53:16 +0000914 config.TestProductVariables.DeviceResourceOverlays = deviceResourceOverlays
915 config.TestProductVariables.ProductResourceOverlays = productResourceOverlays
Colin Cross890ff552017-11-30 20:13:19 -0800916 if testCase.enforceRROTargets != nil {
Colin Crossa74ca042019-01-31 14:31:51 -0800917 config.TestProductVariables.EnforceRROTargets = testCase.enforceRROTargets
Colin Cross890ff552017-11-30 20:13:19 -0800918 }
919 if testCase.enforceRROExcludedOverlays != nil {
Colin Crossa74ca042019-01-31 14:31:51 -0800920 config.TestProductVariables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
Colin Cross890ff552017-11-30 20:13:19 -0800921 }
922
Colin Crossae8600b2020-10-29 17:09:13 -0700923 ctx := testContext(config)
Colin Cross890ff552017-11-30 20:13:19 -0800924 run(t, ctx, config)
925
Colin Crossbec85302019-02-13 13:15:46 -0800926 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
927 for _, o := range list {
928 res := module.MaybeOutput(o)
929 if res.Rule != nil {
930 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
931 // verify the inputs to the .arsc.flat rule.
932 files = append(files, res.Inputs.Strings()...)
933 } else {
934 // Otherwise, verify the full path to the output of the other module
935 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +0000936 }
Colin Cross890ff552017-11-30 20:13:19 -0800937 }
Colin Crossbec85302019-02-13 13:15:46 -0800938 return files
Colin Cross890ff552017-11-30 20:13:19 -0800939 }
940
Colin Crossbec85302019-02-13 13:15:46 -0800941 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
942 module := ctx.ModuleForTests(moduleName, "android_common")
943 resourceList := module.MaybeOutput("aapt2/res.list")
944 if resourceList.Rule != nil {
945 resourceFiles = resourceListToFiles(module, resourceList.Inputs.Strings())
Anton Hansson0375a4f2019-01-24 14:39:19 +0000946 }
Colin Crossbec85302019-02-13 13:15:46 -0800947 overlayList := module.MaybeOutput("aapt2/overlay.list")
948 if overlayList.Rule != nil {
949 overlayFiles = resourceListToFiles(module, overlayList.Inputs.Strings())
950 }
951
Anton Hansson53c88442019-03-18 15:53:16 +0000952 for _, d := range module.Module().(AndroidLibraryDependency).ExportedRRODirs() {
953 var prefix string
954 if d.overlayType == device {
955 prefix = "device:"
956 } else if d.overlayType == product {
957 prefix = "product:"
958 } else {
959 t.Fatalf("Unexpected overlayType %d", d.overlayType)
960 }
961 rroDirs = append(rroDirs, prefix+d.path.String())
962 }
Colin Crossbec85302019-02-13 13:15:46 -0800963
964 return resourceFiles, overlayFiles, rroDirs
965 }
966
967 modules := []string{"foo", "bar", "lib", "lib2"}
968 for _, module := range modules {
969 resourceFiles, overlayFiles, rroDirs := getResources(module)
970
971 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
972 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
973 module, testCase.resourceFiles[module], resourceFiles)
974 }
975 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
976 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
977 module, testCase.overlayFiles[module], overlayFiles)
978 }
979 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +0000980 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -0800981 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +0000982 }
Colin Cross890ff552017-11-30 20:13:19 -0800983 }
Colin Cross890ff552017-11-30 20:13:19 -0800984 })
985 }
986}
Colin Crossd09b0b62018-04-18 11:06:47 -0700987
Paul Duffincdb88a92021-03-14 00:36:50 +0000988func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
989 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +0900990 link := foo.Output("package-res.apk")
991 linkFlags := strings.Split(link.Args["flags"], " ")
992 min := android.IndexList("--min-sdk-version", linkFlags)
993 target := android.IndexList("--target-sdk-version", linkFlags)
994
995 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
996 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
997 }
998
999 gotMinSdkVersion := linkFlags[min+1]
1000 gotTargetSdkVersion := linkFlags[target+1]
1001
Paul Duffincdb88a92021-03-14 00:36:50 +00001002 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001003
Paul Duffincdb88a92021-03-14 00:36:50 +00001004 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001005}
1006
Colin Crossd09b0b62018-04-18 11:06:47 -07001007func TestAppSdkVersion(t *testing.T) {
1008 testCases := []struct {
1009 name string
1010 sdkVersion string
1011 platformSdkInt int
1012 platformSdkCodename string
1013 platformSdkFinal bool
1014 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001015 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001016 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001017 }{
1018 {
1019 name: "current final SDK",
1020 sdkVersion: "current",
1021 platformSdkInt: 27,
1022 platformSdkCodename: "REL",
1023 platformSdkFinal: true,
1024 expectedMinSdkVersion: "27",
1025 },
1026 {
1027 name: "current non-final SDK",
1028 sdkVersion: "current",
1029 platformSdkInt: 27,
1030 platformSdkCodename: "OMR1",
1031 platformSdkFinal: false,
1032 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001033 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001034 },
1035 {
1036 name: "default final SDK",
1037 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001038 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001039 platformSdkInt: 27,
1040 platformSdkCodename: "REL",
1041 platformSdkFinal: true,
1042 expectedMinSdkVersion: "27",
1043 },
1044 {
1045 name: "default non-final SDK",
1046 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001047 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001048 platformSdkInt: 27,
1049 platformSdkCodename: "OMR1",
1050 platformSdkFinal: false,
1051 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001052 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001053 },
1054 {
1055 name: "14",
1056 sdkVersion: "14",
1057 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001058 platformSdkCodename: "S",
1059 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001060 },
1061 }
1062
1063 for _, moduleType := range []string{"android_app", "android_library"} {
1064 for _, test := range testCases {
1065 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001066 platformApiProp := ""
1067 if test.platformApis {
1068 platformApiProp = "platform_apis: true,"
1069 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001070 bp := fmt.Sprintf(`%s {
1071 name: "foo",
1072 srcs: ["a.java"],
1073 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001074 %s
1075 }`, moduleType, test.sdkVersion, platformApiProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001076
Paul Duffincdb88a92021-03-14 00:36:50 +00001077 result := javaFixtureFactory.Extend(
1078 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1079 variables.Platform_sdk_version = &test.platformSdkInt
1080 variables.Platform_sdk_codename = &test.platformSdkCodename
1081 variables.Platform_version_active_codenames = test.activeCodenames
1082 variables.Platform_sdk_final = &test.platformSdkFinal
1083 }),
1084 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001085
Paul Duffincdb88a92021-03-14 00:36:50 +00001086 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001087 })
1088 }
1089 }
1090}
Colin Crossa4f08812018-10-02 22:03:40 -07001091
Jeongik Cha219141c2020-08-06 23:00:37 +09001092func TestVendorAppSdkVersion(t *testing.T) {
1093 testCases := []struct {
1094 name string
1095 sdkVersion string
1096 platformSdkInt int
1097 platformSdkCodename string
1098 platformSdkFinal bool
1099 deviceCurrentApiLevelForVendorModules string
1100 expectedMinSdkVersion string
1101 }{
1102 {
1103 name: "current final SDK",
1104 sdkVersion: "current",
1105 platformSdkInt: 29,
1106 platformSdkCodename: "REL",
1107 platformSdkFinal: true,
1108 deviceCurrentApiLevelForVendorModules: "29",
1109 expectedMinSdkVersion: "29",
1110 },
1111 {
1112 name: "current final SDK",
1113 sdkVersion: "current",
1114 platformSdkInt: 29,
1115 platformSdkCodename: "REL",
1116 platformSdkFinal: true,
1117 deviceCurrentApiLevelForVendorModules: "28",
1118 expectedMinSdkVersion: "28",
1119 },
1120 {
1121 name: "current final SDK",
1122 sdkVersion: "current",
1123 platformSdkInt: 29,
1124 platformSdkCodename: "Q",
1125 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001126 deviceCurrentApiLevelForVendorModules: "28",
1127 expectedMinSdkVersion: "28",
1128 },
1129 }
1130
1131 for _, moduleType := range []string{"android_app", "android_library"} {
1132 for _, sdkKind := range []string{"", "system_"} {
1133 for _, test := range testCases {
1134 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1135 bp := fmt.Sprintf(`%s {
1136 name: "foo",
1137 srcs: ["a.java"],
1138 sdk_version: "%s%s",
1139 vendor: true,
1140 }`, moduleType, sdkKind, test.sdkVersion)
1141
Paul Duffincdb88a92021-03-14 00:36:50 +00001142 result := javaFixtureFactory.Extend(
1143 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1144 variables.Platform_sdk_version = &test.platformSdkInt
1145 variables.Platform_sdk_codename = &test.platformSdkCodename
1146 variables.Platform_sdk_final = &test.platformSdkFinal
1147 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1148 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1149 }),
1150 ).RunTestWithBp(t, bp)
1151
1152 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001153 })
1154 }
1155 }
1156 }
1157}
1158
Paul Duffin50c217c2019-06-12 13:25:22 +01001159func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001160 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001161 cc_library {
1162 name: "libjni",
1163 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001164 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001165 stl: "none",
1166 }
1167
1168 android_test {
1169 name: "test",
1170 sdk_version: "core_platform",
1171 jni_libs: ["libjni"],
1172 }
1173
1174 android_test {
1175 name: "test_first",
1176 sdk_version: "core_platform",
1177 compile_multilib: "first",
1178 jni_libs: ["libjni"],
1179 }
1180
1181 android_test {
1182 name: "test_both",
1183 sdk_version: "core_platform",
1184 compile_multilib: "both",
1185 jni_libs: ["libjni"],
1186 }
1187
1188 android_test {
1189 name: "test_32",
1190 sdk_version: "core_platform",
1191 compile_multilib: "32",
1192 jni_libs: ["libjni"],
1193 }
1194
1195 android_test {
1196 name: "test_64",
1197 sdk_version: "core_platform",
1198 compile_multilib: "64",
1199 jni_libs: ["libjni"],
1200 }
1201 `)
1202
1203 testCases := []struct {
1204 name string
1205 abis []string
1206 }{
1207 {"test", []string{"arm64-v8a"}},
1208 {"test_first", []string{"arm64-v8a"}},
1209 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1210 {"test_32", []string{"armeabi-v7a"}},
1211 {"test_64", []string{"arm64-v8a"}},
1212 }
1213
1214 for _, test := range testCases {
1215 t.Run(test.name, func(t *testing.T) {
1216 app := ctx.ModuleForTests(test.name, "android_common")
1217 jniLibZip := app.Output("jnilibs.zip")
1218 var abis []string
1219 args := strings.Fields(jniLibZip.Args["jarArgs"])
1220 for i := 0; i < len(args); i++ {
1221 if args[i] == "-P" {
1222 abis = append(abis, filepath.Base(args[i+1]))
1223 i++
1224 }
1225 }
1226 if !reflect.DeepEqual(abis, test.abis) {
1227 t.Errorf("want abis %v, got %v", test.abis, abis)
1228 }
1229 })
1230 }
1231}
1232
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001233func TestAppSdkVersionByPartition(t *testing.T) {
1234 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1235 android_app {
1236 name: "foo",
1237 srcs: ["a.java"],
1238 vendor: true,
1239 platform_apis: true,
1240 }
1241 `)
1242
1243 testJava(t, `
1244 android_app {
1245 name: "bar",
1246 srcs: ["b.java"],
1247 platform_apis: true,
1248 }
1249 `)
1250
1251 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001252 bp := `
1253 android_app {
1254 name: "foo",
1255 srcs: ["a.java"],
1256 product_specific: true,
1257 platform_apis: true,
1258 }
1259 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001260
1261 config := testAppConfig(nil, bp, nil)
1262 config.TestProductVariables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001263 if enforce {
Colin Cross98be1bb2019-12-13 20:41:13 -08001264 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 +09001265 } else {
Colin Cross98be1bb2019-12-13 20:41:13 -08001266 testJavaWithConfig(t, config)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001267 }
1268 }
1269}
1270
Paul Duffin50c217c2019-06-12 13:25:22 +01001271func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001272 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001273 cc_library {
1274 name: "libjni",
1275 system_shared_libs: [],
1276 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08001277 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001278 }
1279
1280 android_app {
1281 name: "app",
1282 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001283 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001284 }
1285
1286 android_app {
1287 name: "app_noembed",
1288 jni_libs: ["libjni"],
1289 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001290 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001291 }
1292
1293 android_app {
1294 name: "app_embed",
1295 jni_libs: ["libjni"],
1296 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001297 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001298 }
1299
1300 android_test {
1301 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00001302 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001303 jni_libs: ["libjni"],
1304 }
1305
1306 android_test {
1307 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001308 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001309 jni_libs: ["libjni"],
1310 use_embedded_native_libs: false,
1311 }
1312
1313 android_test_helper_app {
1314 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00001315 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001316 jni_libs: ["libjni"],
1317 }
1318
1319 android_test_helper_app {
1320 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001321 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001322 jni_libs: ["libjni"],
1323 use_embedded_native_libs: false,
1324 }
1325 `)
1326
1327 testCases := []struct {
1328 name string
1329 packaged bool
1330 compressed bool
1331 }{
1332 {"app", false, false},
1333 {"app_noembed", false, false},
1334 {"app_embed", true, false},
1335 {"test", true, false},
1336 {"test_noembed", true, true},
1337 {"test_helper", true, false},
1338 {"test_helper_noembed", true, true},
1339 }
1340
1341 for _, test := range testCases {
1342 t.Run(test.name, func(t *testing.T) {
1343 app := ctx.ModuleForTests(test.name, "android_common")
1344 jniLibZip := app.MaybeOutput("jnilibs.zip")
1345 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
1346 t.Errorf("expected jni packaged %v, got %v", w, g)
1347 }
1348
1349 if jniLibZip.Rule != nil {
1350 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
1351 t.Errorf("expected jni compressed %v, got %v", w, g)
1352 }
Colin Crossc511bc52020-04-07 16:50:32 +00001353
1354 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
1355 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
1356 }
Paul Duffin50c217c2019-06-12 13:25:22 +01001357 }
1358 })
1359 }
Colin Cross47fa9d32019-03-26 10:51:39 -07001360}
1361
Colin Cross3c007702020-05-08 11:20:24 -07001362func TestJNISDK(t *testing.T) {
1363 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
1364 cc_library {
1365 name: "libjni",
1366 system_shared_libs: [],
1367 stl: "none",
1368 sdk_version: "current",
1369 }
1370
1371 android_test {
1372 name: "app_platform",
1373 jni_libs: ["libjni"],
1374 platform_apis: true,
1375 }
1376
1377 android_test {
1378 name: "app_sdk",
1379 jni_libs: ["libjni"],
1380 sdk_version: "current",
1381 }
1382
1383 android_test {
1384 name: "app_force_platform",
1385 jni_libs: ["libjni"],
1386 sdk_version: "current",
1387 jni_uses_platform_apis: true,
1388 }
1389
1390 android_test {
1391 name: "app_force_sdk",
1392 jni_libs: ["libjni"],
1393 platform_apis: true,
1394 jni_uses_sdk_apis: true,
1395 }
Colin Crossc2d24052020-05-13 11:05:02 -07001396
1397 cc_library {
1398 name: "libvendorjni",
1399 system_shared_libs: [],
1400 stl: "none",
1401 vendor: true,
1402 }
1403
1404 android_test {
1405 name: "app_vendor",
1406 jni_libs: ["libvendorjni"],
1407 sdk_version: "current",
1408 vendor: true,
1409 }
Colin Cross3c007702020-05-08 11:20:24 -07001410 `)
1411
1412 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07001413 name string
1414 sdkJNI bool
1415 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07001416 }{
Colin Crossc2d24052020-05-13 11:05:02 -07001417 {name: "app_platform"},
1418 {name: "app_sdk", sdkJNI: true},
1419 {name: "app_force_platform"},
1420 {name: "app_force_sdk", sdkJNI: true},
1421 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07001422 }
1423
Colin Crossc2d24052020-05-13 11:05:02 -07001424 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
1425 Output("libjni.so").Output.String()
1426 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
1427 Output("libjni.so").Output.String()
1428 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
1429 Output("libvendorjni.so").Output.String()
1430
Colin Cross3c007702020-05-08 11:20:24 -07001431 for _, test := range testCases {
1432 t.Run(test.name, func(t *testing.T) {
1433 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07001434
1435 jniLibZip := app.MaybeOutput("jnilibs.zip")
1436 if len(jniLibZip.Implicits) != 1 {
1437 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
1438 }
1439 gotJNI := jniLibZip.Implicits[0].String()
1440
1441 if test.sdkJNI {
1442 if gotJNI != sdkJNI {
1443 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
1444 }
Colin Crossc2d24052020-05-13 11:05:02 -07001445 } else if test.vendorJNI {
1446 if gotJNI != vendorJNI {
1447 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
1448 }
Colin Cross3c007702020-05-08 11:20:24 -07001449 } else {
1450 if gotJNI != platformJNI {
1451 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
1452 }
1453 }
1454 })
1455 }
1456
1457 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
1458 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
1459 android_test {
1460 name: "app_platform",
1461 platform_apis: true,
1462 jni_uses_platform_apis: true,
1463 }
1464 `)
1465 })
1466
1467 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
1468 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
1469 android_test {
1470 name: "app_sdk",
1471 sdk_version: "current",
1472 jni_uses_sdk_apis: true,
1473 }
1474 `)
1475 })
1476
1477}
1478
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001479func TestCertificates(t *testing.T) {
1480 testCases := []struct {
1481 name string
1482 bp string
1483 certificateOverride string
Liz Kammere2b27f42020-05-07 13:24:05 -07001484 expectedLineage string
1485 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001486 }{
1487 {
1488 name: "default",
1489 bp: `
1490 android_app {
1491 name: "foo",
1492 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001493 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001494 }
1495 `,
1496 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001497 expectedLineage: "",
1498 expectedCertificate: "build/make/target/product/security/testkey.x509.pem build/make/target/product/security/testkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001499 },
1500 {
1501 name: "module certificate property",
1502 bp: `
1503 android_app {
1504 name: "foo",
1505 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001506 certificate: ":new_certificate",
1507 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001508 }
1509
1510 android_app_certificate {
1511 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001512 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001513 }
1514 `,
1515 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001516 expectedLineage: "",
1517 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001518 },
1519 {
1520 name: "path certificate property",
1521 bp: `
1522 android_app {
1523 name: "foo",
1524 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001525 certificate: "expiredkey",
1526 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001527 }
1528 `,
1529 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001530 expectedLineage: "",
1531 expectedCertificate: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001532 },
1533 {
1534 name: "certificate overrides",
1535 bp: `
1536 android_app {
1537 name: "foo",
1538 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001539 certificate: "expiredkey",
1540 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001541 }
1542
1543 android_app_certificate {
1544 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001545 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001546 }
1547 `,
1548 certificateOverride: "foo:new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001549 expectedLineage: "",
1550 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1551 },
1552 {
1553 name: "certificate lineage",
1554 bp: `
1555 android_app {
1556 name: "foo",
1557 srcs: ["a.java"],
1558 certificate: ":new_certificate",
1559 lineage: "lineage.bin",
1560 sdk_version: "current",
1561 }
1562
1563 android_app_certificate {
1564 name: "new_certificate",
1565 certificate: "cert/new_cert",
1566 }
1567 `,
1568 certificateOverride: "",
1569 expectedLineage: "--lineage lineage.bin",
1570 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001571 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001572 {
1573 name: "lineage from filegroup",
1574 bp: `
1575 android_app {
1576 name: "foo",
1577 srcs: ["a.java"],
1578 certificate: ":new_certificate",
1579 lineage: ":lineage_bin",
1580 sdk_version: "current",
1581 }
1582
1583 android_app_certificate {
1584 name: "new_certificate",
1585 certificate: "cert/new_cert",
1586 }
1587
1588 filegroup {
1589 name: "lineage_bin",
1590 srcs: ["lineage.bin"],
1591 }
1592 `,
1593 certificateOverride: "",
1594 expectedLineage: "--lineage lineage.bin",
1595 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1596 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001597 }
1598
1599 for _, test := range testCases {
1600 t.Run(test.name, func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -08001601 config := testAppConfig(nil, test.bp, nil)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001602 if test.certificateOverride != "" {
1603 config.TestProductVariables.CertificateOverrides = []string{test.certificateOverride}
1604 }
Colin Crossae8600b2020-10-29 17:09:13 -07001605 ctx := testContext(config)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001606
1607 run(t, ctx, config)
1608 foo := ctx.ModuleForTests("foo", "android_common")
1609
1610 signapk := foo.Output("foo.apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001611 signCertificateFlags := signapk.Args["certificates"]
1612 if test.expectedCertificate != signCertificateFlags {
1613 t.Errorf("Incorrect signing flags, expected: %q, got: %q", test.expectedCertificate, signCertificateFlags)
1614 }
1615
1616 signFlags := signapk.Args["flags"]
1617 if test.expectedLineage != signFlags {
1618 t.Errorf("Incorrect signing flags, expected: %q, got: %q", test.expectedLineage, signFlags)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001619 }
1620 })
1621 }
1622}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001623
Songchun Fan688de9a2020-03-24 20:32:24 -07001624func TestRequestV4SigningFlag(t *testing.T) {
1625 testCases := []struct {
1626 name string
1627 bp string
1628 expected string
1629 }{
1630 {
1631 name: "default",
1632 bp: `
1633 android_app {
1634 name: "foo",
1635 srcs: ["a.java"],
1636 sdk_version: "current",
1637 }
1638 `,
1639 expected: "",
1640 },
1641 {
1642 name: "default",
1643 bp: `
1644 android_app {
1645 name: "foo",
1646 srcs: ["a.java"],
1647 sdk_version: "current",
1648 v4_signature: false,
1649 }
1650 `,
1651 expected: "",
1652 },
1653 {
1654 name: "module certificate property",
1655 bp: `
1656 android_app {
1657 name: "foo",
1658 srcs: ["a.java"],
1659 sdk_version: "current",
1660 v4_signature: true,
1661 }
1662 `,
1663 expected: "--enable-v4",
1664 },
1665 }
1666
1667 for _, test := range testCases {
1668 t.Run(test.name, func(t *testing.T) {
1669 config := testAppConfig(nil, test.bp, nil)
Colin Crossae8600b2020-10-29 17:09:13 -07001670 ctx := testContext(config)
Songchun Fan688de9a2020-03-24 20:32:24 -07001671
1672 run(t, ctx, config)
1673 foo := ctx.ModuleForTests("foo", "android_common")
1674
1675 signapk := foo.Output("foo.apk")
1676 signFlags := signapk.Args["flags"]
1677 if test.expected != signFlags {
1678 t.Errorf("Incorrect signing flags, expected: %q, got: %q", test.expected, signFlags)
1679 }
1680 })
1681 }
1682}
1683
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001684func TestPackageNameOverride(t *testing.T) {
1685 testCases := []struct {
1686 name string
1687 bp string
1688 packageNameOverride string
1689 expected []string
1690 }{
1691 {
1692 name: "default",
1693 bp: `
1694 android_app {
1695 name: "foo",
1696 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001697 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001698 }
1699 `,
1700 packageNameOverride: "",
1701 expected: []string{
1702 buildDir + "/.intermediates/foo/android_common/foo.apk",
1703 buildDir + "/target/product/test_device/system/app/foo/foo.apk",
1704 },
1705 },
1706 {
1707 name: "overridden",
1708 bp: `
1709 android_app {
1710 name: "foo",
1711 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001712 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001713 }
1714 `,
1715 packageNameOverride: "foo:bar",
1716 expected: []string{
1717 // The package apk should be still be the original name for test dependencies.
Jaewoong Jung5a498812019-11-07 14:14:38 -08001718 buildDir + "/.intermediates/foo/android_common/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001719 buildDir + "/target/product/test_device/system/app/bar/bar.apk",
1720 },
1721 },
1722 }
1723
1724 for _, test := range testCases {
1725 t.Run(test.name, func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -08001726 config := testAppConfig(nil, test.bp, nil)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001727 if test.packageNameOverride != "" {
1728 config.TestProductVariables.PackageNameOverrides = []string{test.packageNameOverride}
1729 }
Colin Crossae8600b2020-10-29 17:09:13 -07001730 ctx := testContext(config)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001731
1732 run(t, ctx, config)
1733 foo := ctx.ModuleForTests("foo", "android_common")
1734
1735 outputs := foo.AllOutputs()
1736 outputMap := make(map[string]bool)
1737 for _, o := range outputs {
1738 outputMap[o] = true
1739 }
1740 for _, e := range test.expected {
1741 if _, exist := outputMap[e]; !exist {
1742 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
1743 }
1744 }
1745 })
1746 }
1747}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001748
1749func TestInstrumentationTargetOverridden(t *testing.T) {
1750 bp := `
1751 android_app {
1752 name: "foo",
1753 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001754 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001755 }
1756
1757 android_test {
1758 name: "bar",
1759 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001760 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001761 }
1762 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001763 config := testAppConfig(nil, bp, nil)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001764 config.TestProductVariables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
Colin Crossae8600b2020-10-29 17:09:13 -07001765 ctx := testContext(config)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001766
1767 run(t, ctx, config)
1768
1769 bar := ctx.ModuleForTests("bar", "android_common")
1770 res := bar.Output("package-res.apk")
1771 aapt2Flags := res.Args["flags"]
1772 e := "--rename-instrumentation-target-package org.dandroid.bp"
1773 if !strings.Contains(aapt2Flags, e) {
1774 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
1775 }
1776}
Jaewoong Jung525443a2019-02-28 15:35:54 -08001777
1778func TestOverrideAndroidApp(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001779 ctx, _ := testJava(t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08001780 android_app {
1781 name: "foo",
1782 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07001783 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001784 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001785 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001786 }
1787
1788 override_android_app {
1789 name: "bar",
1790 base: "foo",
1791 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001792 lineage: "lineage.bin",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001793 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001794 }
1795
1796 android_app_certificate {
1797 name: "new_certificate",
1798 certificate: "cert/new_cert",
1799 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001800
1801 override_android_app {
1802 name: "baz",
1803 base: "foo",
1804 package_name: "org.dandroid.bp",
1805 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001806
1807 override_android_app {
1808 name: "baz_no_rename_resources",
1809 base: "foo",
1810 package_name: "org.dandroid.bp",
1811 rename_resources_package: false,
1812 }
1813
1814 android_app {
1815 name: "foo_no_rename_resources",
1816 srcs: ["a.java"],
1817 certificate: "expiredkey",
1818 overrides: ["qux"],
1819 rename_resources_package: false,
1820 sdk_version: "current",
1821 }
1822
1823 override_android_app {
1824 name: "baz_base_no_rename_resources",
1825 base: "foo_no_rename_resources",
1826 package_name: "org.dandroid.bp",
1827 }
1828
1829 override_android_app {
1830 name: "baz_override_base_rename_resources",
1831 base: "foo_no_rename_resources",
1832 package_name: "org.dandroid.bp",
1833 rename_resources_package: true,
1834 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08001835 `)
1836
1837 expectedVariants := []struct {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001838 name string
1839 moduleName string
1840 variantName string
1841 apkName string
1842 apkPath string
1843 certFlag string
1844 lineageFlag string
1845 overrides []string
1846 packageFlag string
1847 renameResources bool
1848 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08001849 }{
1850 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001851 name: "foo",
1852 moduleName: "foo",
1853 variantName: "android_common",
1854 apkPath: "/target/product/test_device/system/app/foo/foo.apk",
1855 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1856 lineageFlag: "",
1857 overrides: []string{"qux"},
1858 packageFlag: "",
1859 renameResources: false,
1860 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001861 },
1862 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001863 name: "foo",
1864 moduleName: "bar",
1865 variantName: "android_common_bar",
1866 apkPath: "/target/product/test_device/system/app/bar/bar.apk",
1867 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
1868 lineageFlag: "--lineage lineage.bin",
1869 overrides: []string{"qux", "foo"},
1870 packageFlag: "",
1871 renameResources: false,
1872 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001873 },
1874 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001875 name: "foo",
1876 moduleName: "baz",
1877 variantName: "android_common_baz",
1878 apkPath: "/target/product/test_device/system/app/baz/baz.apk",
1879 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1880 lineageFlag: "",
1881 overrides: []string{"qux", "foo"},
1882 packageFlag: "org.dandroid.bp",
1883 renameResources: true,
1884 logging_parent: "",
1885 },
1886 {
1887 name: "foo",
1888 moduleName: "baz_no_rename_resources",
1889 variantName: "android_common_baz_no_rename_resources",
1890 apkPath: "/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
1891 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1892 lineageFlag: "",
1893 overrides: []string{"qux", "foo"},
1894 packageFlag: "org.dandroid.bp",
1895 renameResources: false,
1896 logging_parent: "",
1897 },
1898 {
1899 name: "foo_no_rename_resources",
1900 moduleName: "baz_base_no_rename_resources",
1901 variantName: "android_common_baz_base_no_rename_resources",
1902 apkPath: "/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
1903 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1904 lineageFlag: "",
1905 overrides: []string{"qux", "foo_no_rename_resources"},
1906 packageFlag: "org.dandroid.bp",
1907 renameResources: false,
1908 logging_parent: "",
1909 },
1910 {
1911 name: "foo_no_rename_resources",
1912 moduleName: "baz_override_base_rename_resources",
1913 variantName: "android_common_baz_override_base_rename_resources",
1914 apkPath: "/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
1915 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1916 lineageFlag: "",
1917 overrides: []string{"qux", "foo_no_rename_resources"},
1918 packageFlag: "org.dandroid.bp",
1919 renameResources: true,
1920 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001921 },
1922 }
1923 for _, expected := range expectedVariants {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001924 variant := ctx.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001925
1926 // Check the final apk name
1927 outputs := variant.AllOutputs()
1928 expectedApkPath := buildDir + expected.apkPath
1929 found := false
1930 for _, o := range outputs {
1931 if o == expectedApkPath {
1932 found = true
1933 break
1934 }
1935 }
1936 if !found {
1937 t.Errorf("Can't find %q in output files.\nAll outputs:%v", expectedApkPath, outputs)
1938 }
1939
1940 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08001941 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001942 certFlag := signapk.Args["certificates"]
1943 if expected.certFlag != certFlag {
1944 t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected.certFlag, certFlag)
1945 }
1946
1947 // Check the lineage flags
1948 lineageFlag := signapk.Args["flags"]
1949 if expected.lineageFlag != lineageFlag {
1950 t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected.lineageFlag, lineageFlag)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001951 }
1952
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001953 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08001954 mod := variant.Module().(*AndroidApp)
1955 if !reflect.DeepEqual(expected.overrides, mod.appProperties.Overrides) {
1956 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
1957 expected.overrides, mod.appProperties.Overrides)
1958 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001959
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001960 // Test Overridable property: Logging_parent
1961 logging_parent := mod.aapt.LoggingParent
1962 if expected.logging_parent != logging_parent {
1963 t.Errorf("Incorrect overrides property value for logging parent, expected: %q, got: %q",
1964 expected.logging_parent, logging_parent)
1965 }
1966
Liz Kammer1d5983b2020-05-19 19:15:37 +00001967 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001968 res := variant.Output("package-res.apk")
1969 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00001970 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
1971 expectedPackage := expected.packageFlag
1972 if !expected.renameResources {
1973 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00001974 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001975 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001976 }
1977}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07001978
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001979func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001980 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001981 android_app {
1982 name: "foo",
1983 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001984 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001985 }
1986
1987 override_android_app {
1988 name: "bar",
1989 base: "foo",
1990 package_name: "org.dandroid.bp",
1991 }
1992
1993 android_test {
1994 name: "baz",
1995 srcs: ["b.java"],
1996 instrumentation_for: "foo",
1997 }
1998
1999 android_test {
2000 name: "qux",
2001 srcs: ["b.java"],
2002 instrumentation_for: "bar",
2003 }
2004 `)
2005
2006 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
2007 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
2008 fooTurbine := filepath.Join(buildDir, ".intermediates", "foo", "android_common", "turbine-combined", "foo.jar")
2009 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2010 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2011 }
2012
2013 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
2014 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
2015 barTurbine := filepath.Join(buildDir, ".intermediates", "foo", "android_common_bar", "turbine-combined", "foo.jar")
2016 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2017 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2018 }
2019}
2020
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002021func TestOverrideAndroidTest(t *testing.T) {
2022 ctx, _ := testJava(t, `
2023 android_app {
2024 name: "foo",
2025 srcs: ["a.java"],
2026 package_name: "com.android.foo",
2027 sdk_version: "current",
2028 }
2029
2030 override_android_app {
2031 name: "bar",
2032 base: "foo",
2033 package_name: "com.android.bar",
2034 }
2035
2036 android_test {
2037 name: "foo_test",
2038 srcs: ["b.java"],
2039 instrumentation_for: "foo",
2040 }
2041
2042 override_android_test {
2043 name: "bar_test",
2044 base: "foo_test",
2045 package_name: "com.android.bar.test",
2046 instrumentation_for: "bar",
2047 instrumentation_target_package: "com.android.bar",
2048 }
2049 `)
2050
2051 expectedVariants := []struct {
2052 moduleName string
2053 variantName string
2054 apkPath string
2055 overrides []string
2056 targetVariant string
2057 packageFlag string
2058 targetPackageFlag string
2059 }{
2060 {
2061 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002062 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002063 overrides: nil,
2064 targetVariant: "android_common",
2065 packageFlag: "",
2066 targetPackageFlag: "",
2067 },
2068 {
2069 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002070 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002071 overrides: []string{"foo_test"},
2072 targetVariant: "android_common_bar",
2073 packageFlag: "com.android.bar.test",
2074 targetPackageFlag: "com.android.bar",
2075 },
2076 }
2077 for _, expected := range expectedVariants {
2078 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2079
2080 // Check the final apk name
2081 outputs := variant.AllOutputs()
2082 expectedApkPath := buildDir + expected.apkPath
2083 found := false
2084 for _, o := range outputs {
2085 if o == expectedApkPath {
2086 found = true
2087 break
2088 }
2089 }
2090 if !found {
2091 t.Errorf("Can't find %q in output files.\nAll outputs:%v", expectedApkPath, outputs)
2092 }
2093
2094 // Check if the overrides field values are correctly aggregated.
2095 mod := variant.Module().(*AndroidTest)
2096 if !reflect.DeepEqual(expected.overrides, mod.appProperties.Overrides) {
2097 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
2098 expected.overrides, mod.appProperties.Overrides)
2099 }
2100
2101 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
2102 javac := variant.Rule("javac")
2103 turbine := filepath.Join(buildDir, ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
2104 if !strings.Contains(javac.Args["classpath"], turbine) {
2105 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2106 }
2107
2108 // Check aapt2 flags.
2109 res := variant.Output("package-res.apk")
2110 aapt2Flags := res.Args["flags"]
2111 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002112 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002113 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2114 }
2115}
2116
Jaewoong Jung39982342020-01-14 10:27:18 -08002117func TestAndroidTest_FixTestConfig(t *testing.T) {
2118 ctx, _ := testJava(t, `
2119 android_app {
2120 name: "foo",
2121 srcs: ["a.java"],
2122 package_name: "com.android.foo",
2123 sdk_version: "current",
2124 }
2125
2126 android_test {
2127 name: "foo_test",
2128 srcs: ["b.java"],
2129 instrumentation_for: "foo",
2130 }
2131
2132 android_test {
2133 name: "bar_test",
2134 srcs: ["b.java"],
2135 package_name: "com.android.bar.test",
2136 instrumentation_for: "foo",
2137 }
2138
2139 override_android_test {
2140 name: "baz_test",
2141 base: "foo_test",
2142 package_name: "com.android.baz.test",
2143 }
2144 `)
2145
2146 testCases := []struct {
2147 moduleName string
2148 variantName string
2149 expectedFlags []string
2150 }{
2151 {
2152 moduleName: "foo_test",
2153 variantName: "android_common",
2154 },
2155 {
2156 moduleName: "bar_test",
2157 variantName: "android_common",
2158 expectedFlags: []string{
2159 "--manifest " + buildDir + "/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
2160 "--package-name com.android.bar.test",
2161 },
2162 },
2163 {
2164 moduleName: "foo_test",
2165 variantName: "android_common_baz_test",
2166 expectedFlags: []string{
2167 "--manifest " + buildDir +
2168 "/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
2169 "--package-name com.android.baz.test",
2170 "--test-file-name baz_test.apk",
2171 },
2172 },
2173 }
2174
2175 for _, test := range testCases {
2176 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
2177 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
2178
2179 if len(test.expectedFlags) > 0 {
2180 if params.Rule == nil {
2181 t.Errorf("test_config_fixer was expected to run, but didn't")
2182 } else {
2183 for _, flag := range test.expectedFlags {
2184 if !strings.Contains(params.RuleParams.Command, flag) {
2185 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
2186 }
2187 }
2188 }
2189 } else {
2190 if params.Rule != nil {
2191 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
2192 }
2193 }
2194
2195 }
2196}
2197
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002198func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002199 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002200 cc_library {
2201 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08002202 sdk_version: "current",
2203 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002204 }
2205
2206 android_test {
2207 name: "stl",
2208 jni_libs: ["libjni"],
2209 compile_multilib: "both",
2210 sdk_version: "current",
2211 stl: "c++_shared",
2212 }
2213
2214 android_test {
2215 name: "system",
2216 jni_libs: ["libjni"],
2217 compile_multilib: "both",
2218 sdk_version: "current",
2219 }
2220 `)
2221
2222 testCases := []struct {
2223 name string
2224 jnis []string
2225 }{
2226 {"stl",
2227 []string{
2228 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07002229 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002230 },
2231 },
2232 {"system",
2233 []string{
2234 "libjni.so",
2235 },
2236 },
2237 }
2238
2239 for _, test := range testCases {
2240 t.Run(test.name, func(t *testing.T) {
2241 app := ctx.ModuleForTests(test.name, "android_common")
2242 jniLibZip := app.Output("jnilibs.zip")
2243 var jnis []string
2244 args := strings.Fields(jniLibZip.Args["jarArgs"])
2245 for i := 0; i < len(args); i++ {
2246 if args[i] == "-f" {
2247 jnis = append(jnis, args[i+1])
2248 i += 1
2249 }
2250 }
2251 jnisJoined := strings.Join(jnis, " ")
2252 for _, jni := range test.jnis {
2253 if !strings.Contains(jnisJoined, jni) {
2254 t.Errorf("missing jni %q in %q", jni, jnis)
2255 }
2256 }
2257 })
2258 }
2259}
Colin Cross50ddcc42019-05-16 12:28:22 -07002260
2261func TestUsesLibraries(t *testing.T) {
2262 bp := `
2263 java_sdk_library {
2264 name: "foo",
2265 srcs: ["a.java"],
2266 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002267 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002268 }
2269
2270 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01002271 name: "qux",
2272 srcs: ["a.java"],
2273 api_packages: ["qux"],
2274 sdk_version: "current",
2275 }
2276
2277 java_sdk_library {
2278 name: "quuz",
2279 srcs: ["a.java"],
2280 api_packages: ["quuz"],
2281 sdk_version: "current",
2282 }
2283
2284 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002285 name: "fred",
2286 srcs: ["a.java"],
2287 api_packages: ["fred"],
2288 sdk_version: "current",
2289 }
2290
2291 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07002292 name: "bar",
2293 srcs: ["a.java"],
2294 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002295 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002296 }
2297
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01002298 java_sdk_library {
2299 name: "runtime-library",
2300 srcs: ["a.java"],
2301 sdk_version: "current",
2302 }
2303
2304 java_library {
2305 name: "static-runtime-helper",
2306 srcs: ["a.java"],
2307 libs: ["runtime-library"],
2308 sdk_version: "current",
2309 }
2310
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002311 // A library that has to use "provides_uses_lib", because:
2312 // - it is not an SDK library
2313 // - its library name is different from its module name
2314 java_library {
2315 name: "non-sdk-lib",
2316 provides_uses_lib: "com.non.sdk.lib",
2317 installable: true,
2318 srcs: ["a.java"],
2319 }
2320
Colin Cross50ddcc42019-05-16 12:28:22 -07002321 android_app {
2322 name: "app",
2323 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002324 libs: [
2325 "qux",
2326 "quuz.stubs"
2327 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002328 static_libs: [
2329 "static-runtime-helper",
2330 // statically linked component libraries should not pull their SDK libraries,
2331 // so "fred" should not be added to class loader context
2332 "fred.stubs",
2333 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002334 uses_libs: [
2335 "foo",
2336 "non-sdk-lib"
2337 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002338 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002339 optional_uses_libs: [
2340 "bar",
2341 "baz",
2342 ],
2343 }
2344
2345 android_app_import {
2346 name: "prebuilt",
2347 apk: "prebuilts/apk/app.apk",
2348 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002349 uses_libs: [
2350 "foo",
2351 "non-sdk-lib",
2352 "android.test.runner"
2353 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07002354 optional_uses_libs: [
2355 "bar",
2356 "baz",
2357 ],
2358 }
2359 `
2360
Paul Duffind234b412021-03-12 23:04:46 +00002361 result := javaFixtureFactory.Extend(
2362 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2363 variables.MissingUsesLibraries = []string{"baz"}
2364 }),
2365 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07002366
Paul Duffind234b412021-03-12 23:04:46 +00002367 app := result.ModuleForTests("app", "android_common")
2368 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07002369
Paul Duffin859fe962020-05-15 10:20:31 +01002370 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002371 // This should not include explicit `uses_libs`/`optional_uses_libs` entries.
2372 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2373 expectManifestFixerArgs := `--extract-native-libs=true ` +
2374 `--uses-library qux ` +
2375 `--uses-library quuz ` +
2376 `--uses-library foo ` + // TODO(b/132357300): "foo" should not be passed to manifest_fixer
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002377 `--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 +00002378 `--uses-library bar ` + // TODO(b/132357300): "bar" should not be passed to manifest_fixer
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002379 `--uses-library runtime-library`
Paul Duffind234b412021-03-12 23:04:46 +00002380 android.AssertStringEquals(t, "manifest_fixer args", expectManifestFixerArgs, actualManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01002381
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002382 // Test that all libraries are verified (library order matters).
2383 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
2384 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002385 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002386 `--uses-library qux ` +
2387 `--uses-library quuz ` +
2388 `--uses-library runtime-library ` +
2389 `--optional-uses-library bar ` +
2390 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002391 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002392
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002393 // Test that all libraries are verified for an APK (library order matters).
2394 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00002395 verifyApkArgs := `--uses-library foo ` +
2396 `--uses-library com.non.sdk.lib ` +
2397 `--uses-library android.test.runner ` +
2398 `--optional-uses-library bar ` +
2399 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002400 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002401
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002402 // Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002403 cmd := app.Rule("dexpreopt").RuleParams.Command
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002404 w := `--target-context-for-sdk any ` +
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002405 `PCL[/system/framework/qux.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002406 `PCL[/system/framework/quuz.jar]#` +
2407 `PCL[/system/framework/foo.jar]#` +
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002408 `PCL[/system/framework/non-sdk-lib.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002409 `PCL[/system/framework/bar.jar]#` +
2410 `PCL[/system/framework/runtime-library.jar]`
Paul Duffind234b412021-03-12 23:04:46 +00002411 android.AssertStringDoesContain(t, "dexpreopt app cmd args", cmd, w)
Colin Cross50ddcc42019-05-16 12:28:22 -07002412
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002413 // Test conditional context for target SDK version 28.
Paul Duffind234b412021-03-12 23:04:46 +00002414 android.AssertStringDoesContain(t, "dexpreopt app cmd 28", cmd,
2415 `--target-context-for-sdk 28`+
2416 ` PCL[/system/framework/org.apache.http.legacy.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002417
2418 // Test conditional context for target SDK version 29.
Paul Duffind234b412021-03-12 23:04:46 +00002419 android.AssertStringDoesContain(t, "dexpreopt app cmd 29", cmd,
2420 `--target-context-for-sdk 29`+
2421 ` PCL[/system/framework/android.hidl.manager-V1.0-java.jar]`+
2422 `#PCL[/system/framework/android.hidl.base-V1.0-java.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002423
2424 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002425 // "android.test.mock" is absent because "android.test.runner" is not used.
Paul Duffind234b412021-03-12 23:04:46 +00002426 android.AssertStringDoesContain(t, "dexpreopt app cmd 30", cmd,
2427 `--target-context-for-sdk 30`+
2428 ` PCL[/system/framework/android.test.base.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002429
Ulya Trafimovichfc24ad32020-08-19 16:32:54 +01002430 cmd = prebuilt.Rule("dexpreopt").RuleParams.Command
Paul Duffind234b412021-03-12 23:04:46 +00002431 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd", cmd,
2432 `--target-context-for-sdk any`+
2433 ` PCL[/system/framework/foo.jar]`+
2434 `#PCL[/system/framework/non-sdk-lib.jar]`+
2435 `#PCL[/system/framework/android.test.runner.jar]`+
2436 `#PCL[/system/framework/bar.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002437
2438 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002439 // "android.test.mock" is present because "android.test.runner" is used.
Paul Duffind234b412021-03-12 23:04:46 +00002440 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd 30", cmd,
2441 `--target-context-for-sdk 30`+
2442 ` PCL[/system/framework/android.test.base.jar]`+
2443 `#PCL[/system/framework/android.test.mock.jar] `)
Colin Cross50ddcc42019-05-16 12:28:22 -07002444}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002445
2446func TestCodelessApp(t *testing.T) {
2447 testCases := []struct {
2448 name string
2449 bp string
2450 noCode bool
2451 }{
2452 {
2453 name: "normal",
2454 bp: `
2455 android_app {
2456 name: "foo",
2457 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002458 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002459 }
2460 `,
2461 noCode: false,
2462 },
2463 {
2464 name: "app without sources",
2465 bp: `
2466 android_app {
2467 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002468 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002469 }
2470 `,
2471 noCode: true,
2472 },
2473 {
2474 name: "app with libraries",
2475 bp: `
2476 android_app {
2477 name: "foo",
2478 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002479 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002480 }
2481
2482 java_library {
2483 name: "lib",
2484 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002485 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002486 }
2487 `,
2488 noCode: false,
2489 },
2490 {
2491 name: "app with sourceless libraries",
2492 bp: `
2493 android_app {
2494 name: "foo",
2495 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002496 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002497 }
2498
2499 java_library {
2500 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002501 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002502 }
2503 `,
2504 // TODO(jungjw): this should probably be true
2505 noCode: false,
2506 },
2507 }
2508
2509 for _, test := range testCases {
2510 t.Run(test.name, func(t *testing.T) {
2511 ctx := testApp(t, test.bp)
2512
2513 foo := ctx.ModuleForTests("foo", "android_common")
2514 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2515 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
2516 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
2517 }
2518 })
2519 }
2520}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002521
2522func TestEmbedNotice(t *testing.T) {
Colin Cross238c1f32020-06-07 16:58:18 -07002523 ctx, _ := testJavaWithFS(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002524 android_app {
2525 name: "foo",
2526 srcs: ["a.java"],
2527 static_libs: ["javalib"],
2528 jni_libs: ["libjni"],
2529 notice: "APP_NOTICE",
2530 embed_notices: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002531 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002532 }
2533
2534 // No embed_notice flag
2535 android_app {
2536 name: "bar",
2537 srcs: ["a.java"],
2538 jni_libs: ["libjni"],
2539 notice: "APP_NOTICE",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002540 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002541 }
2542
2543 // No NOTICE files
2544 android_app {
2545 name: "baz",
2546 srcs: ["a.java"],
2547 embed_notices: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002548 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002549 }
2550
2551 cc_library {
2552 name: "libjni",
2553 system_shared_libs: [],
2554 stl: "none",
2555 notice: "LIB_NOTICE",
Colin Cross094cde42020-02-15 10:38:00 -08002556 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002557 }
2558
2559 java_library {
2560 name: "javalib",
2561 srcs: [
2562 ":gen",
2563 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002564 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002565 }
2566
2567 genrule {
2568 name: "gen",
2569 tools: ["gentool"],
2570 out: ["gen.java"],
2571 notice: "GENRULE_NOTICE",
2572 }
2573
2574 java_binary_host {
2575 name: "gentool",
2576 srcs: ["b.java"],
2577 notice: "TOOL_NOTICE",
2578 }
Colin Cross238c1f32020-06-07 16:58:18 -07002579 `, map[string][]byte{
2580 "APP_NOTICE": nil,
2581 "GENRULE_NOTICE": nil,
2582 "LIB_NOTICE": nil,
2583 "TOOL_NOTICE": nil,
2584 })
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002585
2586 // foo has NOTICE files to process, and embed_notices is true.
2587 foo := ctx.ModuleForTests("foo", "android_common")
2588 // verify merge notices rule.
2589 mergeNotices := foo.Rule("mergeNoticesRule")
2590 noticeInputs := mergeNotices.Inputs.Strings()
2591 // TOOL_NOTICE should be excluded as it's a host module.
2592 if len(mergeNotices.Inputs) != 3 {
2593 t.Errorf("number of input notice files: expected = 3, actual = %q", noticeInputs)
2594 }
2595 if !inList("APP_NOTICE", noticeInputs) {
2596 t.Errorf("APP_NOTICE is missing from notice files, %q", noticeInputs)
2597 }
2598 if !inList("LIB_NOTICE", noticeInputs) {
2599 t.Errorf("LIB_NOTICE is missing from notice files, %q", noticeInputs)
2600 }
2601 if !inList("GENRULE_NOTICE", noticeInputs) {
2602 t.Errorf("GENRULE_NOTICE is missing from notice files, %q", noticeInputs)
2603 }
2604 // aapt2 flags should include -A <NOTICE dir> so that its contents are put in the APK's /assets.
2605 res := foo.Output("package-res.apk")
2606 aapt2Flags := res.Args["flags"]
2607 e := "-A " + buildDir + "/.intermediates/foo/android_common/NOTICE"
2608 if !strings.Contains(aapt2Flags, e) {
2609 t.Errorf("asset dir flag for NOTICE, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
2610 }
2611
2612 // bar has NOTICE files to process, but embed_notices is not set.
2613 bar := ctx.ModuleForTests("bar", "android_common")
Jaewoong Jung98772792019-07-01 17:15:13 -07002614 res = bar.Output("package-res.apk")
2615 aapt2Flags = res.Args["flags"]
2616 e = "-A " + buildDir + "/.intermediates/bar/android_common/NOTICE"
2617 if strings.Contains(aapt2Flags, e) {
2618 t.Errorf("bar shouldn't have the asset dir flag for NOTICE: %q", e)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002619 }
2620
2621 // baz's embed_notice is true, but it doesn't have any NOTICE files.
2622 baz := ctx.ModuleForTests("baz", "android_common")
Jaewoong Jung98772792019-07-01 17:15:13 -07002623 res = baz.Output("package-res.apk")
2624 aapt2Flags = res.Args["flags"]
2625 e = "-A " + buildDir + "/.intermediates/baz/android_common/NOTICE"
2626 if strings.Contains(aapt2Flags, e) {
2627 t.Errorf("baz shouldn't have the asset dir flag for NOTICE: %q", e)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002628 }
2629}
Colin Cross53a87f52019-06-25 13:35:30 -07002630
2631func TestUncompressDex(t *testing.T) {
2632 testCases := []struct {
2633 name string
2634 bp string
2635
2636 uncompressedPlatform bool
2637 uncompressedUnbundled bool
2638 }{
2639 {
2640 name: "normal",
2641 bp: `
2642 android_app {
2643 name: "foo",
2644 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002645 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002646 }
2647 `,
2648 uncompressedPlatform: true,
2649 uncompressedUnbundled: false,
2650 },
2651 {
2652 name: "use_embedded_dex",
2653 bp: `
2654 android_app {
2655 name: "foo",
2656 use_embedded_dex: true,
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: true,
2663 },
2664 {
2665 name: "privileged",
2666 bp: `
2667 android_app {
2668 name: "foo",
2669 privileged: 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 },
David Srbeckye033cba2020-05-20 22:20:28 +01002677 {
2678 name: "normal_uncompress_dex_true",
2679 bp: `
2680 android_app {
2681 name: "foo",
2682 srcs: ["a.java"],
2683 sdk_version: "current",
2684 uncompress_dex: true,
2685 }
2686 `,
2687 uncompressedPlatform: true,
2688 uncompressedUnbundled: true,
2689 },
2690 {
2691 name: "normal_uncompress_dex_false",
2692 bp: `
2693 android_app {
2694 name: "foo",
2695 srcs: ["a.java"],
2696 sdk_version: "current",
2697 uncompress_dex: false,
2698 }
2699 `,
2700 uncompressedPlatform: false,
2701 uncompressedUnbundled: false,
2702 },
Colin Cross53a87f52019-06-25 13:35:30 -07002703 }
2704
2705 test := func(t *testing.T, bp string, want bool, unbundled bool) {
2706 t.Helper()
2707
Paul Duffincdb88a92021-03-14 00:36:50 +00002708 result := javaFixtureFactory.Extend(
2709 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2710 if unbundled {
2711 variables.Unbundled_build = proptools.BoolPtr(true)
2712 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
2713 }
2714 }),
2715 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07002716
Paul Duffincdb88a92021-03-14 00:36:50 +00002717 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07002718 dex := foo.Rule("r8")
2719 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
2720 aligned := foo.MaybeRule("zipalign").Rule != nil
2721
Paul Duffincdb88a92021-03-14 00:36:50 +00002722 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07002723
Paul Duffincdb88a92021-03-14 00:36:50 +00002724 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07002725 }
2726
2727 for _, tt := range testCases {
2728 t.Run(tt.name, func(t *testing.T) {
2729 t.Run("platform", func(t *testing.T) {
2730 test(t, tt.bp, tt.uncompressedPlatform, false)
2731 })
2732 t.Run("unbundled", func(t *testing.T) {
2733 test(t, tt.bp, tt.uncompressedUnbundled, true)
2734 })
2735 })
2736 }
2737}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002738
2739func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
2740 if expectedValue != "" {
2741 expectedFlag := "--" + flagName + " " + expectedValue
2742 if !strings.Contains(aapt2Flags, expectedFlag) {
2743 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
2744 }
2745 } else {
2746 unexpectedFlag := "--" + flagName
2747 if strings.Contains(aapt2Flags, unexpectedFlag) {
2748 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
2749 }
2750 }
2751}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08002752
Cole Faust9a631312020-10-22 21:05:24 +00002753func TestExportedProguardFlagFiles(t *testing.T) {
2754 ctx, _ := testJava(t, `
2755 android_app {
2756 name: "foo",
2757 sdk_version: "current",
2758 static_libs: ["lib1"],
2759 }
2760
2761 android_library {
2762 name: "lib1",
2763 sdk_version: "current",
2764 optimize: {
2765 proguard_flags_files: ["lib1proguard.cfg"],
2766 }
2767 }
2768 `)
2769
2770 m := ctx.ModuleForTests("foo", "android_common")
2771 hasLib1Proguard := false
2772 for _, s := range m.Rule("java.r8").Implicits.Strings() {
2773 if s == "lib1proguard.cfg" {
2774 hasLib1Proguard = true
2775 break
2776 }
2777 }
2778
2779 if !hasLib1Proguard {
2780 t.Errorf("App does not use library proguard config")
2781 }
2782}