blob: a7ebbeeb27b54033a5a1b7a59f600b9755b1d85a [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"
Paul Duffinfb0fe9f2021-03-22 17:31:52 +000029 "android/soong/genrule"
Colin Cross3bc7ffa2017-11-22 16:19:37 -080030)
31
Paul Duffin0ed42d32021-03-13 02:19:32 +000032// testAppConfig is a legacy way of creating a test Config for testing java app modules.
33//
34// See testJava for an explanation as to how to stop using this deprecated method.
35//
36// deprecated
37func testAppConfig(env map[string]string, bp string, fs map[string][]byte) android.Config {
38 return testConfig(env, bp, fs)
39}
40
41// testApp runs tests using the javaFixtureFactory
42//
43// See testJava for an explanation as to how to stop using this deprecated method.
44//
45// deprecated
46func testApp(t *testing.T, bp string) *android.TestContext {
47 t.Helper()
48 result := javaFixtureFactory.RunTestWithBp(t, bp)
49 return result.TestContext
50}
51
52func TestApp(t *testing.T) {
53 resourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080054 "res/layout/layout.xml",
55 "res/values/strings.xml",
56 "res/values-en-rUS/strings.xml",
57 }
58
Paul Duffin0ed42d32021-03-13 02:19:32 +000059 compiledResourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080060 "aapt2/res/layout_layout.xml.flat",
61 "aapt2/res/values_strings.arsc.flat",
62 "aapt2/res/values-en-rUS_strings.arsc.flat",
63 }
Colin Cross3bc7ffa2017-11-22 16:19:37 -080064
Colin Crossa97c5d32018-03-28 14:58:31 -070065 for _, moduleType := range []string{"android_app", "android_library"} {
66 t.Run(moduleType, func(t *testing.T) {
Paul Duffin0ed42d32021-03-13 02:19:32 +000067 result := javaFixtureFactory.Extend(
68 android.FixtureModifyMockFS(func(fs android.MockFS) {
69 for _, file := range resourceFiles {
70 fs[file] = nil
71 }
72 }),
73 ).RunTestWithBp(t, moduleType+` {
Colin Crossa97c5d32018-03-28 14:58:31 -070074 name: "foo",
75 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090076 sdk_version: "current"
Colin Crossa97c5d32018-03-28 14:58:31 -070077 }
78 `)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080079
Paul Duffin0ed42d32021-03-13 02:19:32 +000080 foo := result.ModuleForTests("foo", "android_common")
Colin Cross3bc7ffa2017-11-22 16:19:37 -080081
Colin Cross31656952018-05-24 16:11:20 -070082 var expectedLinkImplicits []string
83
84 manifestFixer := foo.Output("manifest_fixer/AndroidManifest.xml")
85 expectedLinkImplicits = append(expectedLinkImplicits, manifestFixer.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080086
Paul Duffin0ed42d32021-03-13 02:19:32 +000087 frameworkRes := result.ModuleForTests("framework-res", "android_common")
Colin Crossa97c5d32018-03-28 14:58:31 -070088 expectedLinkImplicits = append(expectedLinkImplicits,
89 frameworkRes.Output("package-res.apk").Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080090
Colin Crossa97c5d32018-03-28 14:58:31 -070091 // Test the mapping from input files to compiled output file names
92 compile := foo.Output(compiledResourceFiles[0])
Paul Duffin0ed42d32021-03-13 02:19:32 +000093 android.AssertDeepEquals(t, "aapt2 compile inputs", resourceFiles, compile.Inputs.Strings())
Colin Crossb69301e2017-12-01 10:48:26 -080094
Colin Crossa97c5d32018-03-28 14:58:31 -070095 compiledResourceOutputs := compile.Outputs.Strings()
96 sort.Strings(compiledResourceOutputs)
Colin Crossb69301e2017-12-01 10:48:26 -080097
Colin Crossa97c5d32018-03-28 14:58:31 -070098 expectedLinkImplicits = append(expectedLinkImplicits, compiledResourceOutputs...)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080099
Colin Crossa97c5d32018-03-28 14:58:31 -0700100 list := foo.Output("aapt2/res.list")
101 expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800102
Colin Crossa97c5d32018-03-28 14:58:31 -0700103 // Check that the link rule uses
Paul Duffin0ed42d32021-03-13 02:19:32 +0000104 res := result.ModuleForTests("foo", "android_common").Output("package-res.apk")
105 android.AssertDeepEquals(t, "aapt2 link implicits", expectedLinkImplicits, res.Implicits.Strings())
Colin Crossa97c5d32018-03-28 14:58:31 -0700106 })
Colin Cross3bc7ffa2017-11-22 16:19:37 -0800107 }
108}
Colin Cross890ff552017-11-30 20:13:19 -0800109
Colin Crosse560c4a2019-03-19 16:03:11 -0700110func TestAppSplits(t *testing.T) {
111 ctx := testApp(t, `
112 android_app {
113 name: "foo",
114 srcs: ["a.java"],
115 package_splits: ["v4", "v7,hdpi"],
Jeongik Cha538c0d02019-07-11 15:54:27 +0900116 sdk_version: "current"
Colin Crosse560c4a2019-03-19 16:03:11 -0700117 }`)
118
119 foo := ctx.ModuleForTests("foo", "android_common")
120
121 expectedOutputs := []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000122 "out/soong/.intermediates/foo/android_common/foo.apk",
123 "out/soong/.intermediates/foo/android_common/foo_v4.apk",
124 "out/soong/.intermediates/foo/android_common/foo_v7_hdpi.apk",
Colin Crosse560c4a2019-03-19 16:03:11 -0700125 }
126 for _, expectedOutput := range expectedOutputs {
127 foo.Output(expectedOutput)
128 }
129
Colin Cross41955e82019-05-29 14:40:35 -0700130 outputFiles, err := foo.Module().(*AndroidApp).OutputFiles("")
131 if err != nil {
132 t.Fatal(err)
133 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000134 android.AssertPathsRelativeToTopEquals(t, `OutputFiles("")`, expectedOutputs, outputFiles)
Colin Crosse560c4a2019-03-19 16:03:11 -0700135}
136
Jeongik Cha538c0d02019-07-11 15:54:27 +0900137func TestPlatformAPIs(t *testing.T) {
138 testJava(t, `
139 android_app {
140 name: "foo",
141 srcs: ["a.java"],
142 platform_apis: true,
143 }
144 `)
145
146 testJava(t, `
147 android_app {
148 name: "foo",
149 srcs: ["a.java"],
150 sdk_version: "current",
151 }
152 `)
153
154 testJavaError(t, "platform_apis must be true when sdk_version is empty.", `
155 android_app {
156 name: "bar",
157 srcs: ["b.java"],
158 }
159 `)
160
161 testJavaError(t, "platform_apis must be false when sdk_version is not empty.", `
162 android_app {
163 name: "bar",
164 srcs: ["b.java"],
165 sdk_version: "system_current",
166 platform_apis: true,
167 }
168 `)
169}
170
Jeongik Chae403e9e2019-12-07 00:16:24 +0900171func TestAndroidAppLinkType(t *testing.T) {
172 testJava(t, `
173 android_app {
174 name: "foo",
175 srcs: ["a.java"],
176 libs: ["bar"],
177 static_libs: ["baz"],
178 platform_apis: true,
179 }
180
181 java_library {
182 name: "bar",
183 sdk_version: "current",
184 srcs: ["b.java"],
185 }
186
187 android_library {
188 name: "baz",
189 sdk_version: "system_current",
190 srcs: ["c.java"],
191 }
192 `)
193
Steven Moreland00298982020-11-17 21:44:36 +0000194 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900195 android_app {
196 name: "foo",
197 srcs: ["a.java"],
198 libs: ["bar"],
199 sdk_version: "current",
200 static_libs: ["baz"],
201 }
202
203 java_library {
204 name: "bar",
205 sdk_version: "current",
206 srcs: ["b.java"],
207 }
208
209 android_library {
210 name: "baz",
211 sdk_version: "system_current",
212 srcs: ["c.java"],
213 }
214 `)
215
216 testJava(t, `
217 android_app {
218 name: "foo",
219 srcs: ["a.java"],
220 libs: ["bar"],
221 sdk_version: "system_current",
222 static_libs: ["baz"],
223 }
224
225 java_library {
226 name: "bar",
227 sdk_version: "current",
228 srcs: ["b.java"],
229 }
230
231 android_library {
232 name: "baz",
233 sdk_version: "system_current",
234 srcs: ["c.java"],
235 }
236 `)
237
Steven Moreland00298982020-11-17 21:44:36 +0000238 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900239 android_app {
240 name: "foo",
241 srcs: ["a.java"],
242 libs: ["bar"],
243 sdk_version: "system_current",
244 static_libs: ["baz"],
245 }
246
247 java_library {
248 name: "bar",
249 sdk_version: "current",
250 srcs: ["b.java"],
251 }
252
253 android_library {
254 name: "baz",
255 srcs: ["c.java"],
256 }
257 `)
258}
259
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100260func TestUpdatableApps(t *testing.T) {
261 testCases := []struct {
262 name string
263 bp string
264 expectedError string
265 }{
266 {
267 name: "Stable public SDK",
268 bp: `android_app {
269 name: "foo",
270 srcs: ["a.java"],
271 sdk_version: "29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100272 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100273 updatable: true,
274 }`,
275 },
276 {
277 name: "Stable system SDK",
278 bp: `android_app {
279 name: "foo",
280 srcs: ["a.java"],
281 sdk_version: "system_29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100282 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100283 updatable: true,
284 }`,
285 },
286 {
287 name: "Current public SDK",
288 bp: `android_app {
289 name: "foo",
290 srcs: ["a.java"],
291 sdk_version: "current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100292 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100293 updatable: true,
294 }`,
295 },
296 {
297 name: "Current system SDK",
298 bp: `android_app {
299 name: "foo",
300 srcs: ["a.java"],
301 sdk_version: "system_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100302 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100303 updatable: true,
304 }`,
305 },
306 {
307 name: "Current module SDK",
308 bp: `android_app {
309 name: "foo",
310 srcs: ["a.java"],
311 sdk_version: "module_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100312 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100313 updatable: true,
314 }`,
315 },
316 {
317 name: "Current core SDK",
318 bp: `android_app {
319 name: "foo",
320 srcs: ["a.java"],
321 sdk_version: "core_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100322 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100323 updatable: true,
324 }`,
325 },
326 {
327 name: "No Platform APIs",
328 bp: `android_app {
329 name: "foo",
330 srcs: ["a.java"],
331 platform_apis: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100332 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100333 updatable: true,
334 }`,
335 expectedError: "Updatable apps must use stable SDKs",
336 },
337 {
338 name: "No Core Platform APIs",
339 bp: `android_app {
340 name: "foo",
341 srcs: ["a.java"],
342 sdk_version: "core_platform",
Artur Satayevf40fc852020-04-16 13:43:02 +0100343 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100344 updatable: true,
345 }`,
346 expectedError: "Updatable apps must use stable SDKs",
347 },
348 {
349 name: "No unspecified APIs",
350 bp: `android_app {
351 name: "foo",
352 srcs: ["a.java"],
353 updatable: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100354 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100355 }`,
356 expectedError: "Updatable apps must use stable SDK",
357 },
Artur Satayevf40fc852020-04-16 13:43:02 +0100358 {
359 name: "Must specify min_sdk_version",
360 bp: `android_app {
361 name: "app_without_min_sdk_version",
362 srcs: ["a.java"],
363 sdk_version: "29",
364 updatable: true,
365 }`,
366 expectedError: "updatable apps must set min_sdk_version.",
367 },
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100368 }
369
370 for _, test := range testCases {
371 t.Run(test.name, func(t *testing.T) {
Paul Duffincdb88a92021-03-14 00:36:50 +0000372 errorHandler := android.FixtureExpectsNoErrors
373 if test.expectedError != "" {
374 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100375 }
Paul Duffincdb88a92021-03-14 00:36:50 +0000376 javaFixtureFactory.
Paul Duffin2645a292021-03-13 02:36:00 +0000377 Extend(FixtureWithPrebuiltApis(map[string][]string{
378 "29": {"foo"},
379 })).
Paul Duffincdb88a92021-03-14 00:36:50 +0000380 ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, test.bp)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100381 })
382 }
383}
384
Jooyung Han749dc692020-04-15 11:03:39 +0900385func TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) {
386 testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+`
387 android_app {
388 name: "foo",
389 srcs: ["a.java"],
390 updatable: true,
391 sdk_version: "current",
392 min_sdk_version: "29",
393 static_libs: ["bar"],
394 }
395
396 java_library {
397 name: "bar",
398 sdk_version: "current",
399 }
400 `)
401}
402
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900403func TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) {
404 testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
405 android_app {
406 name: "foo",
407 srcs: ["a.java"],
408 updatable: true,
409 sdk_version: "current",
410 min_sdk_version: "current",
411 jni_libs: ["libjni"],
412 }
413
414 cc_library {
415 name: "libjni",
416 stl: "none",
417 system_shared_libs: [],
418 sdk_version: "current",
419 }
420 `)
421}
422
423func TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) {
424 bp := cc.GatherRequiredDepsForTest(android.Android) + `
425 android_app {
426 name: "foo",
427 srcs: ["a.java"],
428 updatable: true,
429 sdk_version: "current",
430 min_sdk_version: "29",
431 jni_libs: ["libjni"],
432 }
433
434 cc_library {
435 name: "libjni",
436 stl: "none",
437 system_shared_libs: [],
438 sdk_version: "29",
439 }
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900440 `
441 fs := map[string][]byte{
442 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
443 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil,
444 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil,
445 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil,
446 }
447
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000448 ctx, _ := testJavaWithFS(t, bp, fs)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900449
450 inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
451 var crtbeginFound, crtendFound bool
Dan Albert92fe7402020-07-15 13:33:30 -0700452 expectedCrtBegin := ctx.ModuleForTests("crtbegin_so",
453 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
454 expectedCrtEnd := ctx.ModuleForTests("crtend_so",
455 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
456 implicits := []string{}
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900457 for _, input := range inputs {
Dan Albert92fe7402020-07-15 13:33:30 -0700458 implicits = append(implicits, input.String())
459 if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900460 crtbeginFound = true
Dan Albert92fe7402020-07-15 13:33:30 -0700461 } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900462 crtendFound = true
463 }
464 }
Dan Albert92fe7402020-07-15 13:33:30 -0700465 if !crtbeginFound {
466 t.Error(fmt.Sprintf(
467 "expected implicit with suffix %q, have the following implicits:\n%s",
468 expectedCrtBegin, strings.Join(implicits, "\n")))
469 }
470 if !crtendFound {
471 t.Error(fmt.Sprintf(
472 "expected implicit with suffix %q, have the following implicits:\n%s",
473 expectedCrtEnd, strings.Join(implicits, "\n")))
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900474 }
475}
476
477func TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
478 bp := cc.GatherRequiredDepsForTest(android.Android) + `
479 android_app {
480 name: "foo",
481 srcs: ["a.java"],
482 updatable: true,
483 sdk_version: "current",
484 min_sdk_version: "29", // this APK should support 29
485 jni_libs: ["libjni"],
486 }
487
488 cc_library {
489 name: "libjni",
490 stl: "none",
491 sdk_version: "current",
492 }
493 `
494 testJavaError(t, `"libjni" .*: sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
495}
496
497func TestUpdatableApps_ErrorIfDepSdkVersionIsHigher(t *testing.T) {
498 bp := cc.GatherRequiredDepsForTest(android.Android) + `
499 android_app {
500 name: "foo",
501 srcs: ["a.java"],
502 updatable: true,
503 sdk_version: "current",
504 min_sdk_version: "29", // this APK should support 29
505 jni_libs: ["libjni"],
506 }
507
508 cc_library {
509 name: "libjni",
510 stl: "none",
511 shared_libs: ["libbar"],
512 system_shared_libs: [],
513 sdk_version: "27",
514 }
515
516 cc_library {
517 name: "libbar",
518 stl: "none",
519 system_shared_libs: [],
520 sdk_version: "current",
521 }
522 `
523 testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
524}
525
Colin Cross0ddae7f2019-02-07 15:30:01 -0800526func TestResourceDirs(t *testing.T) {
527 testCases := []struct {
528 name string
529 prop string
530 resources []string
531 }{
532 {
533 name: "no resource_dirs",
534 prop: "",
535 resources: []string{"res/res/values/strings.xml"},
536 },
537 {
538 name: "resource_dirs",
539 prop: `resource_dirs: ["res"]`,
540 resources: []string{"res/res/values/strings.xml"},
541 },
542 {
543 name: "empty resource_dirs",
544 prop: `resource_dirs: []`,
545 resources: nil,
546 },
547 }
548
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000549 fs := android.MockFS{
Colin Cross0ddae7f2019-02-07 15:30:01 -0800550 "res/res/values/strings.xml": nil,
551 }
552
553 bp := `
554 android_app {
555 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900556 sdk_version: "current",
Colin Cross0ddae7f2019-02-07 15:30:01 -0800557 %s
558 }
559 `
560
561 for _, testCase := range testCases {
562 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000563 result := android.GroupFixturePreparers(
564 PrepareForTestWithJavaDefaultModules,
565 PrepareForTestWithOverlayBuildComponents,
566 fs.AddToFixture(),
567 ).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop))
Colin Cross0ddae7f2019-02-07 15:30:01 -0800568
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000569 module := result.ModuleForTests("foo", "android_common")
Colin Cross0ddae7f2019-02-07 15:30:01 -0800570 resourceList := module.MaybeOutput("aapt2/res.list")
571
572 var resources []string
573 if resourceList.Rule != nil {
574 for _, compiledResource := range resourceList.Inputs.Strings() {
575 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
576 }
577 }
578
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000579 android.AssertDeepEquals(t, "resource files", testCase.resources, resources)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800580 })
581 }
582}
583
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800584func TestLibraryAssets(t *testing.T) {
585 bp := `
586 android_app {
587 name: "foo",
588 sdk_version: "current",
589 static_libs: ["lib1", "lib2", "lib3"],
590 }
591
592 android_library {
593 name: "lib1",
594 sdk_version: "current",
595 asset_dirs: ["assets_a"],
596 }
597
598 android_library {
599 name: "lib2",
600 sdk_version: "current",
601 }
602
603 android_library {
604 name: "lib3",
605 sdk_version: "current",
606 static_libs: ["lib4"],
607 }
608
609 android_library {
610 name: "lib4",
611 sdk_version: "current",
612 asset_dirs: ["assets_b"],
613 }
614 `
615
616 testCases := []struct {
617 name string
618 assetFlag string
619 assetPackages []string
620 }{
621 {
622 name: "foo",
623 // lib1 has its own asset. lib3 doesn't have any, but provides lib4's transitively.
624 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000625 "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
626 "out/soong/.intermediates/lib1/android_common/assets.zip",
627 "out/soong/.intermediates/lib3/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800628 },
629 },
630 {
631 name: "lib1",
632 assetFlag: "-A assets_a",
633 },
634 {
635 name: "lib2",
636 },
637 {
638 name: "lib3",
639 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000640 "out/soong/.intermediates/lib3/android_common/aapt2/package-res.apk",
641 "out/soong/.intermediates/lib4/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800642 },
643 },
644 {
645 name: "lib4",
646 assetFlag: "-A assets_b",
647 },
648 }
649 ctx := testApp(t, bp)
650
651 for _, test := range testCases {
652 t.Run(test.name, func(t *testing.T) {
653 m := ctx.ModuleForTests(test.name, "android_common")
654
655 // Check asset flag in aapt2 link flags
656 var aapt2link android.TestingBuildParams
657 if len(test.assetPackages) > 0 {
658 aapt2link = m.Output("aapt2/package-res.apk")
659 } else {
660 aapt2link = m.Output("package-res.apk")
661 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000662 aapt2link = aapt2link.RelativeToTop()
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800663 aapt2Flags := aapt2link.Args["flags"]
664 if test.assetFlag != "" {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000665 android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800666 } else {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000667 android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800668 }
669
670 // Check asset merge rule.
671 if len(test.assetPackages) > 0 {
672 mergeAssets := m.Output("package-res.apk")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000673 android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800674 }
675 })
676 }
677}
678
Colin Crossb014f072021-02-26 14:54:36 -0800679func TestAppJavaResources(t *testing.T) {
680 bp := `
681 android_app {
682 name: "foo",
683 sdk_version: "current",
684 java_resources: ["resources/a"],
685 srcs: ["a.java"],
686 }
687
688 android_app {
689 name: "bar",
690 sdk_version: "current",
691 java_resources: ["resources/a"],
692 }
693 `
694
695 ctx := testApp(t, bp)
696
697 foo := ctx.ModuleForTests("foo", "android_common")
698 fooResources := foo.Output("res/foo.jar")
699 fooDexJar := foo.Output("dex-withres/foo.jar")
700 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
701 fooApk := foo.Rule("combineApk")
702
703 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
704 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
705 }
706
707 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
708 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
709 }
710
711 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
712 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
713 }
714
715 bar := ctx.ModuleForTests("bar", "android_common")
716 barResources := bar.Output("res/bar.jar")
717 barApk := bar.Rule("combineApk")
718
719 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
720 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
721 }
722}
723
Colin Crossbec85302019-02-13 13:15:46 -0800724func TestAndroidResources(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -0800725 testCases := []struct {
726 name string
727 enforceRROTargets []string
728 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -0800729 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -0800730 overlayFiles map[string][]string
731 rroDirs map[string][]string
732 }{
733 {
734 name: "no RRO",
735 enforceRROTargets: nil,
736 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -0800737 resourceFiles: map[string][]string{
738 "foo": nil,
739 "bar": {"bar/res/res/values/strings.xml"},
740 "lib": nil,
741 "lib2": {"lib2/res/res/values/strings.xml"},
742 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800743 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800744 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000745 "out/soong/.intermediates/lib2/android_common/package-res.apk",
746 "out/soong/.intermediates/lib/android_common/package-res.apk",
747 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800748 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800749 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
750 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +0000751 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800752 },
Colin Crossbec85302019-02-13 13:15:46 -0800753 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800754 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
755 "device/vendor/blah/overlay/bar/res/values/strings.xml",
756 },
Colin Crossbec85302019-02-13 13:15:46 -0800757 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000758 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800759 "lib/res/res/values/strings.xml",
760 "device/vendor/blah/overlay/lib/res/values/strings.xml",
761 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800762 },
763 rroDirs: map[string][]string{
764 "foo": nil,
765 "bar": nil,
766 },
767 },
768 {
769 name: "enforce RRO on foo",
770 enforceRROTargets: []string{"foo"},
771 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -0800772 resourceFiles: map[string][]string{
773 "foo": nil,
774 "bar": {"bar/res/res/values/strings.xml"},
775 "lib": nil,
776 "lib2": {"lib2/res/res/values/strings.xml"},
777 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800778 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800779 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000780 "out/soong/.intermediates/lib2/android_common/package-res.apk",
781 "out/soong/.intermediates/lib/android_common/package-res.apk",
782 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800783 "foo/res/res/values/strings.xml",
784 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
785 },
Colin Crossbec85302019-02-13 13:15:46 -0800786 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800787 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
788 "device/vendor/blah/overlay/bar/res/values/strings.xml",
789 },
Colin Crossbec85302019-02-13 13:15:46 -0800790 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000791 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800792 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -0800793 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800794 },
Colin Crossc1c37552019-01-31 11:42:41 -0800795
Colin Cross5c4791c2019-02-01 11:44:44 -0800796 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800797 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000798 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +0000799 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700800 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800801 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800802 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700803 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800804 },
805 },
806 {
807 name: "enforce RRO on all",
808 enforceRROTargets: []string{"*"},
809 enforceRROExcludedOverlays: []string{
810 // Excluding specific apps/res directories also allowed.
811 "device/vendor/blah/static_overlay/foo",
812 "device/vendor/blah/static_overlay/bar/res",
813 },
Colin Crossbec85302019-02-13 13:15:46 -0800814 resourceFiles: map[string][]string{
815 "foo": nil,
816 "bar": {"bar/res/res/values/strings.xml"},
817 "lib": nil,
818 "lib2": {"lib2/res/res/values/strings.xml"},
819 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800820 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800821 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000822 "out/soong/.intermediates/lib2/android_common/package-res.apk",
823 "out/soong/.intermediates/lib/android_common/package-res.apk",
824 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800825 "foo/res/res/values/strings.xml",
826 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
827 },
Colin Crossbec85302019-02-13 13:15:46 -0800828 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
829 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000830 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800831 "lib/res/res/values/strings.xml",
832 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800833 },
834 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800835 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000836 "device:device/vendor/blah/overlay/foo/res",
837 "product:product/vendor/blah/overlay/foo/res",
838 // Lib dep comes after the direct deps
839 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800840 },
Anton Hansson53c88442019-03-18 15:53:16 +0000841 "bar": {"device:device/vendor/blah/overlay/bar/res"},
842 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800843 },
844 },
845 }
846
Anton Hansson53c88442019-03-18 15:53:16 +0000847 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -0800848 "device/vendor/blah/overlay",
849 "device/vendor/blah/overlay2",
850 "device/vendor/blah/static_overlay",
851 }
852
Anton Hansson53c88442019-03-18 15:53:16 +0000853 productResourceOverlays := []string{
854 "product/vendor/blah/overlay",
855 }
856
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000857 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -0800858 "foo/res/res/values/strings.xml": nil,
859 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800860 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -0800861 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800862 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
863 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800864 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800865 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
866 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
867 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +0000868 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800869 }
870
871 bp := `
872 android_app {
873 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900874 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800875 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +0000876 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -0800877 }
878
879 android_app {
880 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900881 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800882 resource_dirs: ["bar/res"],
883 }
Colin Cross6ed7dea2019-01-31 14:44:30 -0800884
885 android_library {
886 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900887 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800888 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -0800889 static_libs: ["lib2"],
890 }
891
892 android_library {
893 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900894 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -0800895 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -0800896 }
Anton Hansson53c88442019-03-18 15:53:16 +0000897
898 // This library has the same resources as lib (should not lead to dupe RROs)
899 android_library {
900 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900901 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +0000902 resource_dirs: ["lib/res"]
903 }
Colin Cross890ff552017-11-30 20:13:19 -0800904 `
905
Colin Cross5c4791c2019-02-01 11:44:44 -0800906 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -0800907 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000908 result := android.GroupFixturePreparers(
909 PrepareForTestWithJavaDefaultModules,
910 PrepareForTestWithOverlayBuildComponents,
911 fs.AddToFixture(),
912 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
913 variables.DeviceResourceOverlays = deviceResourceOverlays
914 variables.ProductResourceOverlays = productResourceOverlays
915 if testCase.enforceRROTargets != nil {
916 variables.EnforceRROTargets = testCase.enforceRROTargets
917 }
918 if testCase.enforceRROExcludedOverlays != nil {
919 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
920 }
921 }),
922 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -0800923
Colin Crossbec85302019-02-13 13:15:46 -0800924 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
925 for _, o := range list {
926 res := module.MaybeOutput(o)
927 if res.Rule != nil {
928 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
929 // verify the inputs to the .arsc.flat rule.
930 files = append(files, res.Inputs.Strings()...)
931 } else {
932 // Otherwise, verify the full path to the output of the other module
933 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +0000934 }
Colin Cross890ff552017-11-30 20:13:19 -0800935 }
Colin Crossbec85302019-02-13 13:15:46 -0800936 return files
Colin Cross890ff552017-11-30 20:13:19 -0800937 }
938
Colin Crossbec85302019-02-13 13:15:46 -0800939 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000940 module := result.ModuleForTests(moduleName, "android_common")
Colin Crossbec85302019-02-13 13:15:46 -0800941 resourceList := module.MaybeOutput("aapt2/res.list")
942 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000943 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +0000944 }
Colin Crossbec85302019-02-13 13:15:46 -0800945 overlayList := module.MaybeOutput("aapt2/overlay.list")
946 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000947 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -0800948 }
949
Anton Hansson53c88442019-03-18 15:53:16 +0000950 for _, d := range module.Module().(AndroidLibraryDependency).ExportedRRODirs() {
951 var prefix string
952 if d.overlayType == device {
953 prefix = "device:"
954 } else if d.overlayType == product {
955 prefix = "product:"
956 } else {
957 t.Fatalf("Unexpected overlayType %d", d.overlayType)
958 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000959 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +0000960 }
Colin Crossbec85302019-02-13 13:15:46 -0800961
962 return resourceFiles, overlayFiles, rroDirs
963 }
964
965 modules := []string{"foo", "bar", "lib", "lib2"}
966 for _, module := range modules {
967 resourceFiles, overlayFiles, rroDirs := getResources(module)
968
969 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
970 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
971 module, testCase.resourceFiles[module], resourceFiles)
972 }
973 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
974 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
975 module, testCase.overlayFiles[module], overlayFiles)
976 }
977 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +0000978 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -0800979 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +0000980 }
Colin Cross890ff552017-11-30 20:13:19 -0800981 }
Colin Cross890ff552017-11-30 20:13:19 -0800982 })
983 }
984}
Colin Crossd09b0b62018-04-18 11:06:47 -0700985
Paul Duffincdb88a92021-03-14 00:36:50 +0000986func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
987 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +0900988 link := foo.Output("package-res.apk")
989 linkFlags := strings.Split(link.Args["flags"], " ")
990 min := android.IndexList("--min-sdk-version", linkFlags)
991 target := android.IndexList("--target-sdk-version", linkFlags)
992
993 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
994 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
995 }
996
997 gotMinSdkVersion := linkFlags[min+1]
998 gotTargetSdkVersion := linkFlags[target+1]
999
Paul Duffincdb88a92021-03-14 00:36:50 +00001000 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001001
Paul Duffincdb88a92021-03-14 00:36:50 +00001002 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001003}
1004
Colin Crossd09b0b62018-04-18 11:06:47 -07001005func TestAppSdkVersion(t *testing.T) {
1006 testCases := []struct {
1007 name string
1008 sdkVersion string
1009 platformSdkInt int
1010 platformSdkCodename string
1011 platformSdkFinal bool
1012 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001013 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001014 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001015 }{
1016 {
1017 name: "current final SDK",
1018 sdkVersion: "current",
1019 platformSdkInt: 27,
1020 platformSdkCodename: "REL",
1021 platformSdkFinal: true,
1022 expectedMinSdkVersion: "27",
1023 },
1024 {
1025 name: "current non-final SDK",
1026 sdkVersion: "current",
1027 platformSdkInt: 27,
1028 platformSdkCodename: "OMR1",
1029 platformSdkFinal: false,
1030 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001031 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001032 },
1033 {
1034 name: "default final SDK",
1035 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001036 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001037 platformSdkInt: 27,
1038 platformSdkCodename: "REL",
1039 platformSdkFinal: true,
1040 expectedMinSdkVersion: "27",
1041 },
1042 {
1043 name: "default non-final SDK",
1044 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001045 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001046 platformSdkInt: 27,
1047 platformSdkCodename: "OMR1",
1048 platformSdkFinal: false,
1049 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001050 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001051 },
1052 {
1053 name: "14",
1054 sdkVersion: "14",
1055 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001056 platformSdkCodename: "S",
1057 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001058 },
1059 }
1060
1061 for _, moduleType := range []string{"android_app", "android_library"} {
1062 for _, test := range testCases {
1063 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001064 platformApiProp := ""
1065 if test.platformApis {
1066 platformApiProp = "platform_apis: true,"
1067 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001068 bp := fmt.Sprintf(`%s {
1069 name: "foo",
1070 srcs: ["a.java"],
1071 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001072 %s
1073 }`, moduleType, test.sdkVersion, platformApiProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001074
Paul Duffincdb88a92021-03-14 00:36:50 +00001075 result := javaFixtureFactory.Extend(
1076 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1077 variables.Platform_sdk_version = &test.platformSdkInt
1078 variables.Platform_sdk_codename = &test.platformSdkCodename
1079 variables.Platform_version_active_codenames = test.activeCodenames
1080 variables.Platform_sdk_final = &test.platformSdkFinal
1081 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001082 FixtureWithPrebuiltApis(map[string][]string{
1083 "14": {"foo"},
1084 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001085 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001086
Paul Duffincdb88a92021-03-14 00:36:50 +00001087 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001088 })
1089 }
1090 }
1091}
Colin Crossa4f08812018-10-02 22:03:40 -07001092
Jeongik Cha219141c2020-08-06 23:00:37 +09001093func TestVendorAppSdkVersion(t *testing.T) {
1094 testCases := []struct {
1095 name string
1096 sdkVersion string
1097 platformSdkInt int
1098 platformSdkCodename string
1099 platformSdkFinal bool
1100 deviceCurrentApiLevelForVendorModules string
1101 expectedMinSdkVersion string
1102 }{
1103 {
1104 name: "current final SDK",
1105 sdkVersion: "current",
1106 platformSdkInt: 29,
1107 platformSdkCodename: "REL",
1108 platformSdkFinal: true,
1109 deviceCurrentApiLevelForVendorModules: "29",
1110 expectedMinSdkVersion: "29",
1111 },
1112 {
1113 name: "current final SDK",
1114 sdkVersion: "current",
1115 platformSdkInt: 29,
1116 platformSdkCodename: "REL",
1117 platformSdkFinal: true,
1118 deviceCurrentApiLevelForVendorModules: "28",
1119 expectedMinSdkVersion: "28",
1120 },
1121 {
1122 name: "current final SDK",
1123 sdkVersion: "current",
1124 platformSdkInt: 29,
1125 platformSdkCodename: "Q",
1126 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001127 deviceCurrentApiLevelForVendorModules: "28",
1128 expectedMinSdkVersion: "28",
1129 },
1130 }
1131
1132 for _, moduleType := range []string{"android_app", "android_library"} {
1133 for _, sdkKind := range []string{"", "system_"} {
1134 for _, test := range testCases {
1135 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1136 bp := fmt.Sprintf(`%s {
1137 name: "foo",
1138 srcs: ["a.java"],
1139 sdk_version: "%s%s",
1140 vendor: true,
1141 }`, moduleType, sdkKind, test.sdkVersion)
1142
Paul Duffincdb88a92021-03-14 00:36:50 +00001143 result := javaFixtureFactory.Extend(
1144 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1145 variables.Platform_sdk_version = &test.platformSdkInt
1146 variables.Platform_sdk_codename = &test.platformSdkCodename
1147 variables.Platform_sdk_final = &test.platformSdkFinal
1148 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1149 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1150 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001151 FixtureWithPrebuiltApis(map[string][]string{
1152 "28": {"foo"},
1153 "29": {"foo"},
1154 "current": {"foo"},
1155 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001156 ).RunTestWithBp(t, bp)
1157
1158 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001159 })
1160 }
1161 }
1162 }
1163}
1164
Paul Duffin50c217c2019-06-12 13:25:22 +01001165func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001166 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001167 cc_library {
1168 name: "libjni",
1169 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001170 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001171 stl: "none",
1172 }
1173
1174 android_test {
1175 name: "test",
1176 sdk_version: "core_platform",
1177 jni_libs: ["libjni"],
1178 }
1179
1180 android_test {
1181 name: "test_first",
1182 sdk_version: "core_platform",
1183 compile_multilib: "first",
1184 jni_libs: ["libjni"],
1185 }
1186
1187 android_test {
1188 name: "test_both",
1189 sdk_version: "core_platform",
1190 compile_multilib: "both",
1191 jni_libs: ["libjni"],
1192 }
1193
1194 android_test {
1195 name: "test_32",
1196 sdk_version: "core_platform",
1197 compile_multilib: "32",
1198 jni_libs: ["libjni"],
1199 }
1200
1201 android_test {
1202 name: "test_64",
1203 sdk_version: "core_platform",
1204 compile_multilib: "64",
1205 jni_libs: ["libjni"],
1206 }
1207 `)
1208
1209 testCases := []struct {
1210 name string
1211 abis []string
1212 }{
1213 {"test", []string{"arm64-v8a"}},
1214 {"test_first", []string{"arm64-v8a"}},
1215 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1216 {"test_32", []string{"armeabi-v7a"}},
1217 {"test_64", []string{"arm64-v8a"}},
1218 }
1219
1220 for _, test := range testCases {
1221 t.Run(test.name, func(t *testing.T) {
1222 app := ctx.ModuleForTests(test.name, "android_common")
1223 jniLibZip := app.Output("jnilibs.zip")
1224 var abis []string
1225 args := strings.Fields(jniLibZip.Args["jarArgs"])
1226 for i := 0; i < len(args); i++ {
1227 if args[i] == "-P" {
1228 abis = append(abis, filepath.Base(args[i+1]))
1229 i++
1230 }
1231 }
1232 if !reflect.DeepEqual(abis, test.abis) {
1233 t.Errorf("want abis %v, got %v", test.abis, abis)
1234 }
1235 })
1236 }
1237}
1238
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001239func TestAppSdkVersionByPartition(t *testing.T) {
1240 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1241 android_app {
1242 name: "foo",
1243 srcs: ["a.java"],
1244 vendor: true,
1245 platform_apis: true,
1246 }
1247 `)
1248
1249 testJava(t, `
1250 android_app {
1251 name: "bar",
1252 srcs: ["b.java"],
1253 platform_apis: true,
1254 }
1255 `)
1256
1257 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001258 bp := `
1259 android_app {
1260 name: "foo",
1261 srcs: ["a.java"],
1262 product_specific: true,
1263 platform_apis: true,
1264 }
1265 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001266
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001267 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001268 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001269 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern("sdk_version must have a value when the module is located at vendor or product")
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001270 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001271
1272 android.GroupFixturePreparers(
1273 PrepareForTestWithJavaDefaultModules,
1274 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1275 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
1276 }),
1277 ).
1278 ExtendWithErrorHandler(errorHandler).
1279 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001280 }
1281}
1282
Paul Duffin50c217c2019-06-12 13:25:22 +01001283func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001284 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001285 cc_library {
1286 name: "libjni",
1287 system_shared_libs: [],
1288 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08001289 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001290 }
1291
1292 android_app {
1293 name: "app",
1294 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001295 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001296 }
1297
1298 android_app {
1299 name: "app_noembed",
1300 jni_libs: ["libjni"],
1301 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001302 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001303 }
1304
1305 android_app {
1306 name: "app_embed",
1307 jni_libs: ["libjni"],
1308 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001309 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001310 }
1311
1312 android_test {
1313 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00001314 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001315 jni_libs: ["libjni"],
1316 }
1317
1318 android_test {
1319 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001320 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001321 jni_libs: ["libjni"],
1322 use_embedded_native_libs: false,
1323 }
1324
1325 android_test_helper_app {
1326 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00001327 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001328 jni_libs: ["libjni"],
1329 }
1330
1331 android_test_helper_app {
1332 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001333 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001334 jni_libs: ["libjni"],
1335 use_embedded_native_libs: false,
1336 }
1337 `)
1338
1339 testCases := []struct {
1340 name string
1341 packaged bool
1342 compressed bool
1343 }{
1344 {"app", false, false},
1345 {"app_noembed", false, false},
1346 {"app_embed", true, false},
1347 {"test", true, false},
1348 {"test_noembed", true, true},
1349 {"test_helper", true, false},
1350 {"test_helper_noembed", true, true},
1351 }
1352
1353 for _, test := range testCases {
1354 t.Run(test.name, func(t *testing.T) {
1355 app := ctx.ModuleForTests(test.name, "android_common")
1356 jniLibZip := app.MaybeOutput("jnilibs.zip")
1357 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
1358 t.Errorf("expected jni packaged %v, got %v", w, g)
1359 }
1360
1361 if jniLibZip.Rule != nil {
1362 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
1363 t.Errorf("expected jni compressed %v, got %v", w, g)
1364 }
Colin Crossc511bc52020-04-07 16:50:32 +00001365
1366 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
1367 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
1368 }
Paul Duffin50c217c2019-06-12 13:25:22 +01001369 }
1370 })
1371 }
Colin Cross47fa9d32019-03-26 10:51:39 -07001372}
1373
Colin Cross3c007702020-05-08 11:20:24 -07001374func TestJNISDK(t *testing.T) {
1375 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
1376 cc_library {
1377 name: "libjni",
1378 system_shared_libs: [],
1379 stl: "none",
1380 sdk_version: "current",
1381 }
1382
1383 android_test {
1384 name: "app_platform",
1385 jni_libs: ["libjni"],
1386 platform_apis: true,
1387 }
1388
1389 android_test {
1390 name: "app_sdk",
1391 jni_libs: ["libjni"],
1392 sdk_version: "current",
1393 }
1394
1395 android_test {
1396 name: "app_force_platform",
1397 jni_libs: ["libjni"],
1398 sdk_version: "current",
1399 jni_uses_platform_apis: true,
1400 }
1401
1402 android_test {
1403 name: "app_force_sdk",
1404 jni_libs: ["libjni"],
1405 platform_apis: true,
1406 jni_uses_sdk_apis: true,
1407 }
Colin Crossc2d24052020-05-13 11:05:02 -07001408
1409 cc_library {
1410 name: "libvendorjni",
1411 system_shared_libs: [],
1412 stl: "none",
1413 vendor: true,
1414 }
1415
1416 android_test {
1417 name: "app_vendor",
1418 jni_libs: ["libvendorjni"],
1419 sdk_version: "current",
1420 vendor: true,
1421 }
Colin Cross3c007702020-05-08 11:20:24 -07001422 `)
1423
1424 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07001425 name string
1426 sdkJNI bool
1427 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07001428 }{
Colin Crossc2d24052020-05-13 11:05:02 -07001429 {name: "app_platform"},
1430 {name: "app_sdk", sdkJNI: true},
1431 {name: "app_force_platform"},
1432 {name: "app_force_sdk", sdkJNI: true},
1433 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07001434 }
1435
Colin Crossc2d24052020-05-13 11:05:02 -07001436 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
1437 Output("libjni.so").Output.String()
1438 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
1439 Output("libjni.so").Output.String()
1440 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
1441 Output("libvendorjni.so").Output.String()
1442
Colin Cross3c007702020-05-08 11:20:24 -07001443 for _, test := range testCases {
1444 t.Run(test.name, func(t *testing.T) {
1445 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07001446
1447 jniLibZip := app.MaybeOutput("jnilibs.zip")
1448 if len(jniLibZip.Implicits) != 1 {
1449 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
1450 }
1451 gotJNI := jniLibZip.Implicits[0].String()
1452
1453 if test.sdkJNI {
1454 if gotJNI != sdkJNI {
1455 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
1456 }
Colin Crossc2d24052020-05-13 11:05:02 -07001457 } else if test.vendorJNI {
1458 if gotJNI != vendorJNI {
1459 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
1460 }
Colin Cross3c007702020-05-08 11:20:24 -07001461 } else {
1462 if gotJNI != platformJNI {
1463 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
1464 }
1465 }
1466 })
1467 }
1468
1469 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
1470 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
1471 android_test {
1472 name: "app_platform",
1473 platform_apis: true,
1474 jni_uses_platform_apis: true,
1475 }
1476 `)
1477 })
1478
1479 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
1480 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
1481 android_test {
1482 name: "app_sdk",
1483 sdk_version: "current",
1484 jni_uses_sdk_apis: true,
1485 }
1486 `)
1487 })
1488
1489}
1490
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001491func TestCertificates(t *testing.T) {
1492 testCases := []struct {
1493 name string
1494 bp string
1495 certificateOverride string
Liz Kammere2b27f42020-05-07 13:24:05 -07001496 expectedLineage string
1497 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001498 }{
1499 {
1500 name: "default",
1501 bp: `
1502 android_app {
1503 name: "foo",
1504 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001505 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001506 }
1507 `,
1508 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001509 expectedLineage: "",
1510 expectedCertificate: "build/make/target/product/security/testkey.x509.pem build/make/target/product/security/testkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001511 },
1512 {
1513 name: "module certificate property",
1514 bp: `
1515 android_app {
1516 name: "foo",
1517 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001518 certificate: ":new_certificate",
1519 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001520 }
1521
1522 android_app_certificate {
1523 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001524 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001525 }
1526 `,
1527 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001528 expectedLineage: "",
1529 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001530 },
1531 {
1532 name: "path certificate property",
1533 bp: `
1534 android_app {
1535 name: "foo",
1536 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001537 certificate: "expiredkey",
1538 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001539 }
1540 `,
1541 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001542 expectedLineage: "",
1543 expectedCertificate: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001544 },
1545 {
1546 name: "certificate overrides",
1547 bp: `
1548 android_app {
1549 name: "foo",
1550 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001551 certificate: "expiredkey",
1552 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001553 }
1554
1555 android_app_certificate {
1556 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001557 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001558 }
1559 `,
1560 certificateOverride: "foo:new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001561 expectedLineage: "",
1562 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1563 },
1564 {
1565 name: "certificate lineage",
1566 bp: `
1567 android_app {
1568 name: "foo",
1569 srcs: ["a.java"],
1570 certificate: ":new_certificate",
1571 lineage: "lineage.bin",
1572 sdk_version: "current",
1573 }
1574
1575 android_app_certificate {
1576 name: "new_certificate",
1577 certificate: "cert/new_cert",
1578 }
1579 `,
1580 certificateOverride: "",
1581 expectedLineage: "--lineage lineage.bin",
1582 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001583 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001584 {
1585 name: "lineage from filegroup",
1586 bp: `
1587 android_app {
1588 name: "foo",
1589 srcs: ["a.java"],
1590 certificate: ":new_certificate",
1591 lineage: ":lineage_bin",
1592 sdk_version: "current",
1593 }
1594
1595 android_app_certificate {
1596 name: "new_certificate",
1597 certificate: "cert/new_cert",
1598 }
1599
1600 filegroup {
1601 name: "lineage_bin",
1602 srcs: ["lineage.bin"],
1603 }
1604 `,
1605 certificateOverride: "",
1606 expectedLineage: "--lineage lineage.bin",
1607 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1608 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001609 }
1610
1611 for _, test := range testCases {
1612 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001613 result := android.GroupFixturePreparers(
1614 PrepareForTestWithJavaDefaultModules,
1615 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1616 if test.certificateOverride != "" {
1617 variables.CertificateOverrides = []string{test.certificateOverride}
1618 }
1619 }),
1620 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001621
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001622 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001623
1624 signapk := foo.Output("foo.apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001625 signCertificateFlags := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001626 android.AssertStringEquals(t, "certificates flags", test.expectedCertificate, signCertificateFlags)
Liz Kammere2b27f42020-05-07 13:24:05 -07001627
1628 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001629 android.AssertStringEquals(t, "signing flags", test.expectedLineage, signFlags)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001630 })
1631 }
1632}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001633
Songchun Fan688de9a2020-03-24 20:32:24 -07001634func TestRequestV4SigningFlag(t *testing.T) {
1635 testCases := []struct {
1636 name string
1637 bp string
1638 expected string
1639 }{
1640 {
1641 name: "default",
1642 bp: `
1643 android_app {
1644 name: "foo",
1645 srcs: ["a.java"],
1646 sdk_version: "current",
1647 }
1648 `,
1649 expected: "",
1650 },
1651 {
1652 name: "default",
1653 bp: `
1654 android_app {
1655 name: "foo",
1656 srcs: ["a.java"],
1657 sdk_version: "current",
1658 v4_signature: false,
1659 }
1660 `,
1661 expected: "",
1662 },
1663 {
1664 name: "module certificate property",
1665 bp: `
1666 android_app {
1667 name: "foo",
1668 srcs: ["a.java"],
1669 sdk_version: "current",
1670 v4_signature: true,
1671 }
1672 `,
1673 expected: "--enable-v4",
1674 },
1675 }
1676
1677 for _, test := range testCases {
1678 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001679 result := android.GroupFixturePreparers(
1680 PrepareForTestWithJavaDefaultModules,
1681 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07001682
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001683 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07001684
1685 signapk := foo.Output("foo.apk")
1686 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001687 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07001688 })
1689 }
1690}
1691
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001692func TestPackageNameOverride(t *testing.T) {
1693 testCases := []struct {
1694 name string
1695 bp string
1696 packageNameOverride string
1697 expected []string
1698 }{
1699 {
1700 name: "default",
1701 bp: `
1702 android_app {
1703 name: "foo",
1704 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001705 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001706 }
1707 `,
1708 packageNameOverride: "",
1709 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001710 "out/soong/.intermediates/foo/android_common/foo.apk",
1711 "out/soong/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001712 },
1713 },
1714 {
1715 name: "overridden",
1716 bp: `
1717 android_app {
1718 name: "foo",
1719 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001720 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001721 }
1722 `,
1723 packageNameOverride: "foo:bar",
1724 expected: []string{
1725 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001726 "out/soong/.intermediates/foo/android_common/bar.apk",
1727 "out/soong/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001728 },
1729 },
1730 }
1731
1732 for _, test := range testCases {
1733 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001734 result := android.GroupFixturePreparers(
1735 PrepareForTestWithJavaDefaultModules,
1736 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1737 if test.packageNameOverride != "" {
1738 variables.PackageNameOverrides = []string{test.packageNameOverride}
1739 }
1740 }),
1741 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001742
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001743 foo := result.ModuleForTests("foo", "android_common")
1744
1745 outSoongDir := result.Config.BuildDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001746
1747 outputs := foo.AllOutputs()
1748 outputMap := make(map[string]bool)
1749 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001750 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001751 }
1752 for _, e := range test.expected {
1753 if _, exist := outputMap[e]; !exist {
1754 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
1755 }
1756 }
1757 })
1758 }
1759}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001760
1761func TestInstrumentationTargetOverridden(t *testing.T) {
1762 bp := `
1763 android_app {
1764 name: "foo",
1765 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001766 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001767 }
1768
1769 android_test {
1770 name: "bar",
1771 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001772 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001773 }
1774 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001775
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001776 result := android.GroupFixturePreparers(
1777 PrepareForTestWithJavaDefaultModules,
1778 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1779 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
1780 }),
1781 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001782
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001783 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001784 res := bar.Output("package-res.apk")
1785 aapt2Flags := res.Args["flags"]
1786 e := "--rename-instrumentation-target-package org.dandroid.bp"
1787 if !strings.Contains(aapt2Flags, e) {
1788 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
1789 }
1790}
Jaewoong Jung525443a2019-02-28 15:35:54 -08001791
1792func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001793 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
1794 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08001795 android_app {
1796 name: "foo",
1797 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07001798 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001799 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001800 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001801 }
1802
1803 override_android_app {
1804 name: "bar",
1805 base: "foo",
1806 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001807 lineage: "lineage.bin",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001808 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001809 }
1810
1811 android_app_certificate {
1812 name: "new_certificate",
1813 certificate: "cert/new_cert",
1814 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001815
1816 override_android_app {
1817 name: "baz",
1818 base: "foo",
1819 package_name: "org.dandroid.bp",
1820 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001821
1822 override_android_app {
1823 name: "baz_no_rename_resources",
1824 base: "foo",
1825 package_name: "org.dandroid.bp",
1826 rename_resources_package: false,
1827 }
1828
1829 android_app {
1830 name: "foo_no_rename_resources",
1831 srcs: ["a.java"],
1832 certificate: "expiredkey",
1833 overrides: ["qux"],
1834 rename_resources_package: false,
1835 sdk_version: "current",
1836 }
1837
1838 override_android_app {
1839 name: "baz_base_no_rename_resources",
1840 base: "foo_no_rename_resources",
1841 package_name: "org.dandroid.bp",
1842 }
1843
1844 override_android_app {
1845 name: "baz_override_base_rename_resources",
1846 base: "foo_no_rename_resources",
1847 package_name: "org.dandroid.bp",
1848 rename_resources_package: true,
1849 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08001850 `)
1851
1852 expectedVariants := []struct {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001853 name string
1854 moduleName string
1855 variantName string
1856 apkName string
1857 apkPath string
1858 certFlag string
1859 lineageFlag string
1860 overrides []string
1861 packageFlag string
1862 renameResources bool
1863 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08001864 }{
1865 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001866 name: "foo",
1867 moduleName: "foo",
1868 variantName: "android_common",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001869 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001870 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1871 lineageFlag: "",
1872 overrides: []string{"qux"},
1873 packageFlag: "",
1874 renameResources: false,
1875 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001876 },
1877 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001878 name: "foo",
1879 moduleName: "bar",
1880 variantName: "android_common_bar",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001881 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001882 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
1883 lineageFlag: "--lineage lineage.bin",
1884 overrides: []string{"qux", "foo"},
1885 packageFlag: "",
1886 renameResources: false,
1887 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001888 },
1889 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001890 name: "foo",
1891 moduleName: "baz",
1892 variantName: "android_common_baz",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001893 apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001894 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1895 lineageFlag: "",
1896 overrides: []string{"qux", "foo"},
1897 packageFlag: "org.dandroid.bp",
1898 renameResources: true,
1899 logging_parent: "",
1900 },
1901 {
1902 name: "foo",
1903 moduleName: "baz_no_rename_resources",
1904 variantName: "android_common_baz_no_rename_resources",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001905 apkPath: "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001906 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1907 lineageFlag: "",
1908 overrides: []string{"qux", "foo"},
1909 packageFlag: "org.dandroid.bp",
1910 renameResources: false,
1911 logging_parent: "",
1912 },
1913 {
1914 name: "foo_no_rename_resources",
1915 moduleName: "baz_base_no_rename_resources",
1916 variantName: "android_common_baz_base_no_rename_resources",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001917 apkPath: "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001918 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1919 lineageFlag: "",
1920 overrides: []string{"qux", "foo_no_rename_resources"},
1921 packageFlag: "org.dandroid.bp",
1922 renameResources: false,
1923 logging_parent: "",
1924 },
1925 {
1926 name: "foo_no_rename_resources",
1927 moduleName: "baz_override_base_rename_resources",
1928 variantName: "android_common_baz_override_base_rename_resources",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001929 apkPath: "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001930 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1931 lineageFlag: "",
1932 overrides: []string{"qux", "foo_no_rename_resources"},
1933 packageFlag: "org.dandroid.bp",
1934 renameResources: true,
1935 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001936 },
1937 }
1938 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001939 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001940
1941 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001942 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001943
1944 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08001945 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001946 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001947 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07001948
1949 // Check the lineage flags
1950 lineageFlag := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001951 android.AssertStringEquals(t, "signing flags", expected.lineageFlag, lineageFlag)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001952
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)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001955 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.appProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001956
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001957 // Test Overridable property: Logging_parent
1958 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001959 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001960
Liz Kammer1d5983b2020-05-19 19:15:37 +00001961 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001962 res := variant.Output("package-res.apk")
1963 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00001964 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
1965 expectedPackage := expected.packageFlag
1966 if !expected.renameResources {
1967 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00001968 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001969 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001970 }
1971}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07001972
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001973func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001974 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001975 android_app {
1976 name: "foo",
1977 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001978 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001979 }
1980
1981 override_android_app {
1982 name: "bar",
1983 base: "foo",
1984 package_name: "org.dandroid.bp",
1985 }
1986
1987 android_test {
1988 name: "baz",
1989 srcs: ["b.java"],
1990 instrumentation_for: "foo",
1991 }
1992
1993 android_test {
1994 name: "qux",
1995 srcs: ["b.java"],
1996 instrumentation_for: "bar",
1997 }
1998 `)
1999
2000 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002001 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac").RelativeToTop()
2002 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002003 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2004 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2005 }
2006
2007 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002008 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac").RelativeToTop()
2009 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002010 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2011 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2012 }
2013}
2014
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002015func TestOverrideAndroidTest(t *testing.T) {
2016 ctx, _ := testJava(t, `
2017 android_app {
2018 name: "foo",
2019 srcs: ["a.java"],
2020 package_name: "com.android.foo",
2021 sdk_version: "current",
2022 }
2023
2024 override_android_app {
2025 name: "bar",
2026 base: "foo",
2027 package_name: "com.android.bar",
2028 }
2029
2030 android_test {
2031 name: "foo_test",
2032 srcs: ["b.java"],
2033 instrumentation_for: "foo",
2034 }
2035
2036 override_android_test {
2037 name: "bar_test",
2038 base: "foo_test",
2039 package_name: "com.android.bar.test",
2040 instrumentation_for: "bar",
2041 instrumentation_target_package: "com.android.bar",
2042 }
2043 `)
2044
2045 expectedVariants := []struct {
2046 moduleName string
2047 variantName string
2048 apkPath string
2049 overrides []string
2050 targetVariant string
2051 packageFlag string
2052 targetPackageFlag string
2053 }{
2054 {
2055 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002056 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002057 overrides: nil,
2058 targetVariant: "android_common",
2059 packageFlag: "",
2060 targetPackageFlag: "",
2061 },
2062 {
2063 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002064 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002065 overrides: []string{"foo_test"},
2066 targetVariant: "android_common_bar",
2067 packageFlag: "com.android.bar.test",
2068 targetPackageFlag: "com.android.bar",
2069 },
2070 }
2071 for _, expected := range expectedVariants {
2072 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2073
2074 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002075 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002076
2077 // Check if the overrides field values are correctly aggregated.
2078 mod := variant.Module().(*AndroidTest)
2079 if !reflect.DeepEqual(expected.overrides, mod.appProperties.Overrides) {
2080 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
2081 expected.overrides, mod.appProperties.Overrides)
2082 }
2083
2084 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002085 javac := variant.Rule("javac").RelativeToTop()
2086 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002087 if !strings.Contains(javac.Args["classpath"], turbine) {
2088 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2089 }
2090
2091 // Check aapt2 flags.
2092 res := variant.Output("package-res.apk")
2093 aapt2Flags := res.Args["flags"]
2094 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002095 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002096 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2097 }
2098}
2099
Jaewoong Jung39982342020-01-14 10:27:18 -08002100func TestAndroidTest_FixTestConfig(t *testing.T) {
2101 ctx, _ := testJava(t, `
2102 android_app {
2103 name: "foo",
2104 srcs: ["a.java"],
2105 package_name: "com.android.foo",
2106 sdk_version: "current",
2107 }
2108
2109 android_test {
2110 name: "foo_test",
2111 srcs: ["b.java"],
2112 instrumentation_for: "foo",
2113 }
2114
2115 android_test {
2116 name: "bar_test",
2117 srcs: ["b.java"],
2118 package_name: "com.android.bar.test",
2119 instrumentation_for: "foo",
2120 }
2121
2122 override_android_test {
2123 name: "baz_test",
2124 base: "foo_test",
2125 package_name: "com.android.baz.test",
2126 }
2127 `)
2128
2129 testCases := []struct {
2130 moduleName string
2131 variantName string
2132 expectedFlags []string
2133 }{
2134 {
2135 moduleName: "foo_test",
2136 variantName: "android_common",
2137 },
2138 {
2139 moduleName: "bar_test",
2140 variantName: "android_common",
2141 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002142 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002143 "--package-name com.android.bar.test",
2144 },
2145 },
2146 {
2147 moduleName: "foo_test",
2148 variantName: "android_common_baz_test",
2149 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002150 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002151 "--package-name com.android.baz.test",
2152 "--test-file-name baz_test.apk",
2153 },
2154 },
2155 }
2156
2157 for _, test := range testCases {
2158 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002159 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml").RelativeToTop()
Jaewoong Jung39982342020-01-14 10:27:18 -08002160
2161 if len(test.expectedFlags) > 0 {
2162 if params.Rule == nil {
2163 t.Errorf("test_config_fixer was expected to run, but didn't")
2164 } else {
2165 for _, flag := range test.expectedFlags {
2166 if !strings.Contains(params.RuleParams.Command, flag) {
2167 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
2168 }
2169 }
2170 }
2171 } else {
2172 if params.Rule != nil {
2173 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
2174 }
2175 }
2176
2177 }
2178}
2179
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002180func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002181 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002182 cc_library {
2183 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08002184 sdk_version: "current",
2185 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002186 }
2187
2188 android_test {
2189 name: "stl",
2190 jni_libs: ["libjni"],
2191 compile_multilib: "both",
2192 sdk_version: "current",
2193 stl: "c++_shared",
2194 }
2195
2196 android_test {
2197 name: "system",
2198 jni_libs: ["libjni"],
2199 compile_multilib: "both",
2200 sdk_version: "current",
2201 }
2202 `)
2203
2204 testCases := []struct {
2205 name string
2206 jnis []string
2207 }{
2208 {"stl",
2209 []string{
2210 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07002211 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002212 },
2213 },
2214 {"system",
2215 []string{
2216 "libjni.so",
2217 },
2218 },
2219 }
2220
2221 for _, test := range testCases {
2222 t.Run(test.name, func(t *testing.T) {
2223 app := ctx.ModuleForTests(test.name, "android_common")
2224 jniLibZip := app.Output("jnilibs.zip")
2225 var jnis []string
2226 args := strings.Fields(jniLibZip.Args["jarArgs"])
2227 for i := 0; i < len(args); i++ {
2228 if args[i] == "-f" {
2229 jnis = append(jnis, args[i+1])
2230 i += 1
2231 }
2232 }
2233 jnisJoined := strings.Join(jnis, " ")
2234 for _, jni := range test.jnis {
2235 if !strings.Contains(jnisJoined, jni) {
2236 t.Errorf("missing jni %q in %q", jni, jnis)
2237 }
2238 }
2239 })
2240 }
2241}
Colin Cross50ddcc42019-05-16 12:28:22 -07002242
2243func TestUsesLibraries(t *testing.T) {
2244 bp := `
2245 java_sdk_library {
2246 name: "foo",
2247 srcs: ["a.java"],
2248 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002249 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002250 }
2251
2252 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01002253 name: "qux",
2254 srcs: ["a.java"],
2255 api_packages: ["qux"],
2256 sdk_version: "current",
2257 }
2258
2259 java_sdk_library {
2260 name: "quuz",
2261 srcs: ["a.java"],
2262 api_packages: ["quuz"],
2263 sdk_version: "current",
2264 }
2265
2266 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002267 name: "fred",
2268 srcs: ["a.java"],
2269 api_packages: ["fred"],
2270 sdk_version: "current",
2271 }
2272
2273 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07002274 name: "bar",
2275 srcs: ["a.java"],
2276 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002277 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002278 }
2279
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01002280 java_sdk_library {
2281 name: "runtime-library",
2282 srcs: ["a.java"],
2283 sdk_version: "current",
2284 }
2285
2286 java_library {
2287 name: "static-runtime-helper",
2288 srcs: ["a.java"],
2289 libs: ["runtime-library"],
2290 sdk_version: "current",
2291 }
2292
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002293 // A library that has to use "provides_uses_lib", because:
2294 // - it is not an SDK library
2295 // - its library name is different from its module name
2296 java_library {
2297 name: "non-sdk-lib",
2298 provides_uses_lib: "com.non.sdk.lib",
2299 installable: true,
2300 srcs: ["a.java"],
2301 }
2302
Colin Cross50ddcc42019-05-16 12:28:22 -07002303 android_app {
2304 name: "app",
2305 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002306 libs: [
2307 "qux",
2308 "quuz.stubs"
2309 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002310 static_libs: [
2311 "static-runtime-helper",
2312 // statically linked component libraries should not pull their SDK libraries,
2313 // so "fred" should not be added to class loader context
2314 "fred.stubs",
2315 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002316 uses_libs: [
2317 "foo",
2318 "non-sdk-lib"
2319 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002320 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002321 optional_uses_libs: [
2322 "bar",
2323 "baz",
2324 ],
2325 }
2326
2327 android_app_import {
2328 name: "prebuilt",
2329 apk: "prebuilts/apk/app.apk",
2330 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002331 uses_libs: [
2332 "foo",
2333 "non-sdk-lib",
2334 "android.test.runner"
2335 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07002336 optional_uses_libs: [
2337 "bar",
2338 "baz",
2339 ],
2340 }
2341 `
2342
Paul Duffind234b412021-03-12 23:04:46 +00002343 result := javaFixtureFactory.Extend(
Paul Duffin2645a292021-03-13 02:36:00 +00002344 PrepareForTestWithJavaSdkLibraryFiles,
2345 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Paul Duffind234b412021-03-12 23:04:46 +00002346 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2347 variables.MissingUsesLibraries = []string{"baz"}
2348 }),
2349 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07002350
Paul Duffind234b412021-03-12 23:04:46 +00002351 app := result.ModuleForTests("app", "android_common")
2352 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07002353
Paul Duffin859fe962020-05-15 10:20:31 +01002354 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002355 // This should not include explicit `uses_libs`/`optional_uses_libs` entries.
2356 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2357 expectManifestFixerArgs := `--extract-native-libs=true ` +
2358 `--uses-library qux ` +
2359 `--uses-library quuz ` +
2360 `--uses-library foo ` + // TODO(b/132357300): "foo" should not be passed to manifest_fixer
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002361 `--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 +00002362 `--uses-library bar ` + // TODO(b/132357300): "bar" should not be passed to manifest_fixer
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002363 `--uses-library runtime-library`
Paul Duffind234b412021-03-12 23:04:46 +00002364 android.AssertStringEquals(t, "manifest_fixer args", expectManifestFixerArgs, actualManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01002365
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002366 // Test that all libraries are verified (library order matters).
2367 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
2368 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002369 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002370 `--uses-library qux ` +
2371 `--uses-library quuz ` +
2372 `--uses-library runtime-library ` +
2373 `--optional-uses-library bar ` +
2374 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002375 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002376
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002377 // Test that all libraries are verified for an APK (library order matters).
2378 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00002379 verifyApkArgs := `--uses-library foo ` +
2380 `--uses-library com.non.sdk.lib ` +
2381 `--uses-library android.test.runner ` +
2382 `--optional-uses-library bar ` +
2383 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002384 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002385
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002386 // Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002387 cmd := app.Rule("dexpreopt").RuleParams.Command
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002388 w := `--target-context-for-sdk any ` +
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002389 `PCL[/system/framework/qux.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002390 `PCL[/system/framework/quuz.jar]#` +
2391 `PCL[/system/framework/foo.jar]#` +
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002392 `PCL[/system/framework/non-sdk-lib.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002393 `PCL[/system/framework/bar.jar]#` +
2394 `PCL[/system/framework/runtime-library.jar]`
Paul Duffind234b412021-03-12 23:04:46 +00002395 android.AssertStringDoesContain(t, "dexpreopt app cmd args", cmd, w)
Colin Cross50ddcc42019-05-16 12:28:22 -07002396
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002397 // Test conditional context for target SDK version 28.
Paul Duffind234b412021-03-12 23:04:46 +00002398 android.AssertStringDoesContain(t, "dexpreopt app cmd 28", cmd,
2399 `--target-context-for-sdk 28`+
2400 ` PCL[/system/framework/org.apache.http.legacy.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002401
2402 // Test conditional context for target SDK version 29.
Paul Duffind234b412021-03-12 23:04:46 +00002403 android.AssertStringDoesContain(t, "dexpreopt app cmd 29", cmd,
2404 `--target-context-for-sdk 29`+
2405 ` PCL[/system/framework/android.hidl.manager-V1.0-java.jar]`+
2406 `#PCL[/system/framework/android.hidl.base-V1.0-java.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002407
2408 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002409 // "android.test.mock" is absent because "android.test.runner" is not used.
Paul Duffind234b412021-03-12 23:04:46 +00002410 android.AssertStringDoesContain(t, "dexpreopt app cmd 30", cmd,
2411 `--target-context-for-sdk 30`+
2412 ` PCL[/system/framework/android.test.base.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002413
Ulya Trafimovichfc24ad32020-08-19 16:32:54 +01002414 cmd = prebuilt.Rule("dexpreopt").RuleParams.Command
Paul Duffind234b412021-03-12 23:04:46 +00002415 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd", cmd,
2416 `--target-context-for-sdk any`+
2417 ` PCL[/system/framework/foo.jar]`+
2418 `#PCL[/system/framework/non-sdk-lib.jar]`+
2419 `#PCL[/system/framework/android.test.runner.jar]`+
2420 `#PCL[/system/framework/bar.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002421
2422 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002423 // "android.test.mock" is present because "android.test.runner" is used.
Paul Duffind234b412021-03-12 23:04:46 +00002424 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd 30", cmd,
2425 `--target-context-for-sdk 30`+
2426 ` PCL[/system/framework/android.test.base.jar]`+
2427 `#PCL[/system/framework/android.test.mock.jar] `)
Colin Cross50ddcc42019-05-16 12:28:22 -07002428}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002429
2430func TestCodelessApp(t *testing.T) {
2431 testCases := []struct {
2432 name string
2433 bp string
2434 noCode bool
2435 }{
2436 {
2437 name: "normal",
2438 bp: `
2439 android_app {
2440 name: "foo",
2441 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002442 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002443 }
2444 `,
2445 noCode: false,
2446 },
2447 {
2448 name: "app without sources",
2449 bp: `
2450 android_app {
2451 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002452 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002453 }
2454 `,
2455 noCode: true,
2456 },
2457 {
2458 name: "app with libraries",
2459 bp: `
2460 android_app {
2461 name: "foo",
2462 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002463 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002464 }
2465
2466 java_library {
2467 name: "lib",
2468 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002469 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002470 }
2471 `,
2472 noCode: false,
2473 },
2474 {
2475 name: "app with sourceless libraries",
2476 bp: `
2477 android_app {
2478 name: "foo",
2479 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002480 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002481 }
2482
2483 java_library {
2484 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002485 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002486 }
2487 `,
2488 // TODO(jungjw): this should probably be true
2489 noCode: false,
2490 },
2491 }
2492
2493 for _, test := range testCases {
2494 t.Run(test.name, func(t *testing.T) {
2495 ctx := testApp(t, test.bp)
2496
2497 foo := ctx.ModuleForTests("foo", "android_common")
2498 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2499 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
2500 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
2501 }
2502 })
2503 }
2504}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002505
2506func TestEmbedNotice(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002507 result := android.GroupFixturePreparers(
2508 PrepareForTestWithJavaDefaultModules,
2509 cc.PrepareForTestWithCcDefaultModules,
2510 genrule.PrepareForTestWithGenRuleBuildComponents,
2511 android.MockFS{
2512 "APP_NOTICE": nil,
2513 "GENRULE_NOTICE": nil,
2514 "LIB_NOTICE": nil,
2515 "TOOL_NOTICE": nil,
2516 }.AddToFixture(),
2517 ).RunTestWithBp(t, `
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002518 android_app {
2519 name: "foo",
2520 srcs: ["a.java"],
2521 static_libs: ["javalib"],
2522 jni_libs: ["libjni"],
2523 notice: "APP_NOTICE",
2524 embed_notices: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002525 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002526 }
2527
2528 // No embed_notice flag
2529 android_app {
2530 name: "bar",
2531 srcs: ["a.java"],
2532 jni_libs: ["libjni"],
2533 notice: "APP_NOTICE",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002534 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002535 }
2536
2537 // No NOTICE files
2538 android_app {
2539 name: "baz",
2540 srcs: ["a.java"],
2541 embed_notices: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002542 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002543 }
2544
2545 cc_library {
2546 name: "libjni",
2547 system_shared_libs: [],
2548 stl: "none",
2549 notice: "LIB_NOTICE",
Colin Cross094cde42020-02-15 10:38:00 -08002550 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002551 }
2552
2553 java_library {
2554 name: "javalib",
2555 srcs: [
2556 ":gen",
2557 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002558 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002559 }
2560
2561 genrule {
2562 name: "gen",
2563 tools: ["gentool"],
2564 out: ["gen.java"],
2565 notice: "GENRULE_NOTICE",
2566 }
2567
2568 java_binary_host {
2569 name: "gentool",
2570 srcs: ["b.java"],
2571 notice: "TOOL_NOTICE",
2572 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002573 `)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002574
2575 // foo has NOTICE files to process, and embed_notices is true.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002576 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002577 // verify merge notices rule.
2578 mergeNotices := foo.Rule("mergeNoticesRule")
2579 noticeInputs := mergeNotices.Inputs.Strings()
2580 // TOOL_NOTICE should be excluded as it's a host module.
2581 if len(mergeNotices.Inputs) != 3 {
2582 t.Errorf("number of input notice files: expected = 3, actual = %q", noticeInputs)
2583 }
2584 if !inList("APP_NOTICE", noticeInputs) {
2585 t.Errorf("APP_NOTICE is missing from notice files, %q", noticeInputs)
2586 }
2587 if !inList("LIB_NOTICE", noticeInputs) {
2588 t.Errorf("LIB_NOTICE is missing from notice files, %q", noticeInputs)
2589 }
2590 if !inList("GENRULE_NOTICE", noticeInputs) {
2591 t.Errorf("GENRULE_NOTICE is missing from notice files, %q", noticeInputs)
2592 }
2593 // aapt2 flags should include -A <NOTICE dir> so that its contents are put in the APK's /assets.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002594 res := foo.Output("package-res.apk").RelativeToTop()
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002595 aapt2Flags := res.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002596 e := "-A out/soong/.intermediates/foo/android_common/NOTICE"
2597 android.AssertStringDoesContain(t, "expected.apkPath", aapt2Flags, e)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002598
2599 // bar has NOTICE files to process, but embed_notices is not set.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002600 bar := result.ModuleForTests("bar", "android_common")
2601 res = bar.Output("package-res.apk").RelativeToTop()
Jaewoong Jung98772792019-07-01 17:15:13 -07002602 aapt2Flags = res.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002603 e = "-A out/soong/.intermediates/bar/android_common/NOTICE"
2604 android.AssertStringDoesNotContain(t, "bar shouldn't have the asset dir flag for NOTICE", aapt2Flags, e)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002605
2606 // baz's embed_notice is true, but it doesn't have any NOTICE files.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002607 baz := result.ModuleForTests("baz", "android_common")
Jaewoong Jung98772792019-07-01 17:15:13 -07002608 res = baz.Output("package-res.apk")
2609 aapt2Flags = res.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002610 e = "-A out/soong/.intermediates/baz/android_common/NOTICE"
Jaewoong Jung98772792019-07-01 17:15:13 -07002611 if strings.Contains(aapt2Flags, e) {
2612 t.Errorf("baz shouldn't have the asset dir flag for NOTICE: %q", e)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002613 }
2614}
Colin Cross53a87f52019-06-25 13:35:30 -07002615
2616func TestUncompressDex(t *testing.T) {
2617 testCases := []struct {
2618 name string
2619 bp string
2620
2621 uncompressedPlatform bool
2622 uncompressedUnbundled bool
2623 }{
2624 {
2625 name: "normal",
2626 bp: `
2627 android_app {
2628 name: "foo",
2629 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002630 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002631 }
2632 `,
2633 uncompressedPlatform: true,
2634 uncompressedUnbundled: false,
2635 },
2636 {
2637 name: "use_embedded_dex",
2638 bp: `
2639 android_app {
2640 name: "foo",
2641 use_embedded_dex: true,
2642 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002643 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002644 }
2645 `,
2646 uncompressedPlatform: true,
2647 uncompressedUnbundled: true,
2648 },
2649 {
2650 name: "privileged",
2651 bp: `
2652 android_app {
2653 name: "foo",
2654 privileged: true,
2655 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002656 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002657 }
2658 `,
2659 uncompressedPlatform: true,
2660 uncompressedUnbundled: true,
2661 },
David Srbeckye033cba2020-05-20 22:20:28 +01002662 {
2663 name: "normal_uncompress_dex_true",
2664 bp: `
2665 android_app {
2666 name: "foo",
2667 srcs: ["a.java"],
2668 sdk_version: "current",
2669 uncompress_dex: true,
2670 }
2671 `,
2672 uncompressedPlatform: true,
2673 uncompressedUnbundled: true,
2674 },
2675 {
2676 name: "normal_uncompress_dex_false",
2677 bp: `
2678 android_app {
2679 name: "foo",
2680 srcs: ["a.java"],
2681 sdk_version: "current",
2682 uncompress_dex: false,
2683 }
2684 `,
2685 uncompressedPlatform: false,
2686 uncompressedUnbundled: false,
2687 },
Colin Cross53a87f52019-06-25 13:35:30 -07002688 }
2689
2690 test := func(t *testing.T, bp string, want bool, unbundled bool) {
2691 t.Helper()
2692
Paul Duffincdb88a92021-03-14 00:36:50 +00002693 result := javaFixtureFactory.Extend(
Paul Duffin2645a292021-03-13 02:36:00 +00002694 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00002695 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2696 if unbundled {
2697 variables.Unbundled_build = proptools.BoolPtr(true)
2698 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
2699 }
2700 }),
2701 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07002702
Paul Duffincdb88a92021-03-14 00:36:50 +00002703 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07002704 dex := foo.Rule("r8")
2705 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
2706 aligned := foo.MaybeRule("zipalign").Rule != nil
2707
Paul Duffincdb88a92021-03-14 00:36:50 +00002708 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07002709
Paul Duffincdb88a92021-03-14 00:36:50 +00002710 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07002711 }
2712
2713 for _, tt := range testCases {
2714 t.Run(tt.name, func(t *testing.T) {
2715 t.Run("platform", func(t *testing.T) {
2716 test(t, tt.bp, tt.uncompressedPlatform, false)
2717 })
2718 t.Run("unbundled", func(t *testing.T) {
2719 test(t, tt.bp, tt.uncompressedUnbundled, true)
2720 })
2721 })
2722 }
2723}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002724
2725func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
2726 if expectedValue != "" {
2727 expectedFlag := "--" + flagName + " " + expectedValue
2728 if !strings.Contains(aapt2Flags, expectedFlag) {
2729 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
2730 }
2731 } else {
2732 unexpectedFlag := "--" + flagName
2733 if strings.Contains(aapt2Flags, unexpectedFlag) {
2734 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
2735 }
2736 }
2737}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08002738
Cole Faust9a631312020-10-22 21:05:24 +00002739func TestExportedProguardFlagFiles(t *testing.T) {
2740 ctx, _ := testJava(t, `
2741 android_app {
2742 name: "foo",
2743 sdk_version: "current",
2744 static_libs: ["lib1"],
2745 }
2746
2747 android_library {
2748 name: "lib1",
2749 sdk_version: "current",
2750 optimize: {
2751 proguard_flags_files: ["lib1proguard.cfg"],
2752 }
2753 }
2754 `)
2755
2756 m := ctx.ModuleForTests("foo", "android_common")
2757 hasLib1Proguard := false
2758 for _, s := range m.Rule("java.r8").Implicits.Strings() {
2759 if s == "lib1proguard.cfg" {
2760 hasLib1Proguard = true
2761 break
2762 }
2763 }
2764
2765 if !hasLib1Proguard {
2766 t.Errorf("App does not use library proguard config")
2767 }
2768}