blob: 25235336415701c17207f42ec4bceb914f9eb1a2 [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 Duffin71ae5942021-03-22 15:36:52 +000032// testApp runs tests using the prepareForJavaTest
Paul Duffin0ed42d32021-03-13 02:19:32 +000033//
34// See testJava for an explanation as to how to stop using this deprecated method.
35//
36// deprecated
37func testApp(t *testing.T, bp string) *android.TestContext {
38 t.Helper()
Paul Duffin71ae5942021-03-22 15:36:52 +000039 result := prepareForJavaTest.RunTestWithBp(t, bp)
Paul Duffin0ed42d32021-03-13 02:19:32 +000040 return result.TestContext
41}
42
43func TestApp(t *testing.T) {
44 resourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080045 "res/layout/layout.xml",
46 "res/values/strings.xml",
47 "res/values-en-rUS/strings.xml",
48 }
49
Paul Duffin0ed42d32021-03-13 02:19:32 +000050 compiledResourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080051 "aapt2/res/layout_layout.xml.flat",
52 "aapt2/res/values_strings.arsc.flat",
53 "aapt2/res/values-en-rUS_strings.arsc.flat",
54 }
Colin Cross3bc7ffa2017-11-22 16:19:37 -080055
Colin Crossa97c5d32018-03-28 14:58:31 -070056 for _, moduleType := range []string{"android_app", "android_library"} {
57 t.Run(moduleType, func(t *testing.T) {
Paul Duffin71ae5942021-03-22 15:36:52 +000058 result := android.GroupFixturePreparers(
59 prepareForJavaTest,
Paul Duffin0ed42d32021-03-13 02:19:32 +000060 android.FixtureModifyMockFS(func(fs android.MockFS) {
61 for _, file := range resourceFiles {
62 fs[file] = nil
63 }
64 }),
65 ).RunTestWithBp(t, moduleType+` {
Colin Crossa97c5d32018-03-28 14:58:31 -070066 name: "foo",
67 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090068 sdk_version: "current"
Colin Crossa97c5d32018-03-28 14:58:31 -070069 }
70 `)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080071
Paul Duffin0ed42d32021-03-13 02:19:32 +000072 foo := result.ModuleForTests("foo", "android_common")
Colin Cross3bc7ffa2017-11-22 16:19:37 -080073
Colin Cross31656952018-05-24 16:11:20 -070074 var expectedLinkImplicits []string
75
76 manifestFixer := foo.Output("manifest_fixer/AndroidManifest.xml")
77 expectedLinkImplicits = append(expectedLinkImplicits, manifestFixer.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080078
Paul Duffin0ed42d32021-03-13 02:19:32 +000079 frameworkRes := result.ModuleForTests("framework-res", "android_common")
Colin Crossa97c5d32018-03-28 14:58:31 -070080 expectedLinkImplicits = append(expectedLinkImplicits,
81 frameworkRes.Output("package-res.apk").Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080082
Colin Crossa97c5d32018-03-28 14:58:31 -070083 // Test the mapping from input files to compiled output file names
84 compile := foo.Output(compiledResourceFiles[0])
Paul Duffin0ed42d32021-03-13 02:19:32 +000085 android.AssertDeepEquals(t, "aapt2 compile inputs", resourceFiles, compile.Inputs.Strings())
Colin Crossb69301e2017-12-01 10:48:26 -080086
Colin Crossa97c5d32018-03-28 14:58:31 -070087 compiledResourceOutputs := compile.Outputs.Strings()
88 sort.Strings(compiledResourceOutputs)
Colin Crossb69301e2017-12-01 10:48:26 -080089
Colin Crossa97c5d32018-03-28 14:58:31 -070090 expectedLinkImplicits = append(expectedLinkImplicits, compiledResourceOutputs...)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080091
Colin Crossa97c5d32018-03-28 14:58:31 -070092 list := foo.Output("aapt2/res.list")
93 expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080094
Colin Crossa97c5d32018-03-28 14:58:31 -070095 // Check that the link rule uses
Paul Duffin0ed42d32021-03-13 02:19:32 +000096 res := result.ModuleForTests("foo", "android_common").Output("package-res.apk")
97 android.AssertDeepEquals(t, "aapt2 link implicits", expectedLinkImplicits, res.Implicits.Strings())
Colin Crossa97c5d32018-03-28 14:58:31 -070098 })
Colin Cross3bc7ffa2017-11-22 16:19:37 -080099 }
100}
Colin Cross890ff552017-11-30 20:13:19 -0800101
Colin Crosse560c4a2019-03-19 16:03:11 -0700102func TestAppSplits(t *testing.T) {
103 ctx := testApp(t, `
104 android_app {
105 name: "foo",
106 srcs: ["a.java"],
107 package_splits: ["v4", "v7,hdpi"],
Jeongik Cha538c0d02019-07-11 15:54:27 +0900108 sdk_version: "current"
Colin Crosse560c4a2019-03-19 16:03:11 -0700109 }`)
110
111 foo := ctx.ModuleForTests("foo", "android_common")
112
113 expectedOutputs := []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000114 "out/soong/.intermediates/foo/android_common/foo.apk",
115 "out/soong/.intermediates/foo/android_common/foo_v4.apk",
116 "out/soong/.intermediates/foo/android_common/foo_v7_hdpi.apk",
Colin Crosse560c4a2019-03-19 16:03:11 -0700117 }
118 for _, expectedOutput := range expectedOutputs {
119 foo.Output(expectedOutput)
120 }
121
Colin Cross41955e82019-05-29 14:40:35 -0700122 outputFiles, err := foo.Module().(*AndroidApp).OutputFiles("")
123 if err != nil {
124 t.Fatal(err)
125 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000126 android.AssertPathsRelativeToTopEquals(t, `OutputFiles("")`, expectedOutputs, outputFiles)
Colin Crosse560c4a2019-03-19 16:03:11 -0700127}
128
Jeongik Cha538c0d02019-07-11 15:54:27 +0900129func TestPlatformAPIs(t *testing.T) {
130 testJava(t, `
131 android_app {
132 name: "foo",
133 srcs: ["a.java"],
134 platform_apis: true,
135 }
136 `)
137
138 testJava(t, `
139 android_app {
140 name: "foo",
141 srcs: ["a.java"],
142 sdk_version: "current",
143 }
144 `)
145
146 testJavaError(t, "platform_apis must be true when sdk_version is empty.", `
147 android_app {
148 name: "bar",
149 srcs: ["b.java"],
150 }
151 `)
152
153 testJavaError(t, "platform_apis must be false when sdk_version is not empty.", `
154 android_app {
155 name: "bar",
156 srcs: ["b.java"],
157 sdk_version: "system_current",
158 platform_apis: true,
159 }
160 `)
161}
162
Jeongik Chae403e9e2019-12-07 00:16:24 +0900163func TestAndroidAppLinkType(t *testing.T) {
164 testJava(t, `
165 android_app {
166 name: "foo",
167 srcs: ["a.java"],
168 libs: ["bar"],
169 static_libs: ["baz"],
170 platform_apis: true,
171 }
172
173 java_library {
174 name: "bar",
175 sdk_version: "current",
176 srcs: ["b.java"],
177 }
178
179 android_library {
180 name: "baz",
181 sdk_version: "system_current",
182 srcs: ["c.java"],
183 }
184 `)
185
Steven Moreland00298982020-11-17 21:44:36 +0000186 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900187 android_app {
188 name: "foo",
189 srcs: ["a.java"],
190 libs: ["bar"],
191 sdk_version: "current",
192 static_libs: ["baz"],
193 }
194
195 java_library {
196 name: "bar",
197 sdk_version: "current",
198 srcs: ["b.java"],
199 }
200
201 android_library {
202 name: "baz",
203 sdk_version: "system_current",
204 srcs: ["c.java"],
205 }
206 `)
207
208 testJava(t, `
209 android_app {
210 name: "foo",
211 srcs: ["a.java"],
212 libs: ["bar"],
213 sdk_version: "system_current",
214 static_libs: ["baz"],
215 }
216
217 java_library {
218 name: "bar",
219 sdk_version: "current",
220 srcs: ["b.java"],
221 }
222
223 android_library {
224 name: "baz",
225 sdk_version: "system_current",
226 srcs: ["c.java"],
227 }
228 `)
229
Steven Moreland00298982020-11-17 21:44:36 +0000230 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900231 android_app {
232 name: "foo",
233 srcs: ["a.java"],
234 libs: ["bar"],
235 sdk_version: "system_current",
236 static_libs: ["baz"],
237 }
238
239 java_library {
240 name: "bar",
241 sdk_version: "current",
242 srcs: ["b.java"],
243 }
244
245 android_library {
246 name: "baz",
247 srcs: ["c.java"],
248 }
249 `)
250}
251
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100252func TestUpdatableApps(t *testing.T) {
253 testCases := []struct {
254 name string
255 bp string
256 expectedError string
257 }{
258 {
259 name: "Stable public SDK",
260 bp: `android_app {
261 name: "foo",
262 srcs: ["a.java"],
263 sdk_version: "29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100264 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100265 updatable: true,
266 }`,
267 },
268 {
269 name: "Stable system SDK",
270 bp: `android_app {
271 name: "foo",
272 srcs: ["a.java"],
273 sdk_version: "system_29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100274 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100275 updatable: true,
276 }`,
277 },
278 {
279 name: "Current public SDK",
280 bp: `android_app {
281 name: "foo",
282 srcs: ["a.java"],
283 sdk_version: "current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100284 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100285 updatable: true,
286 }`,
287 },
288 {
289 name: "Current system SDK",
290 bp: `android_app {
291 name: "foo",
292 srcs: ["a.java"],
293 sdk_version: "system_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100294 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100295 updatable: true,
296 }`,
297 },
298 {
299 name: "Current module SDK",
300 bp: `android_app {
301 name: "foo",
302 srcs: ["a.java"],
303 sdk_version: "module_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100304 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100305 updatable: true,
306 }`,
307 },
308 {
309 name: "Current core SDK",
310 bp: `android_app {
311 name: "foo",
312 srcs: ["a.java"],
313 sdk_version: "core_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100314 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100315 updatable: true,
316 }`,
317 },
318 {
319 name: "No Platform APIs",
320 bp: `android_app {
321 name: "foo",
322 srcs: ["a.java"],
323 platform_apis: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100324 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100325 updatable: true,
326 }`,
327 expectedError: "Updatable apps must use stable SDKs",
328 },
329 {
330 name: "No Core Platform APIs",
331 bp: `android_app {
332 name: "foo",
333 srcs: ["a.java"],
334 sdk_version: "core_platform",
Artur Satayevf40fc852020-04-16 13:43:02 +0100335 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100336 updatable: true,
337 }`,
338 expectedError: "Updatable apps must use stable SDKs",
339 },
340 {
341 name: "No unspecified APIs",
342 bp: `android_app {
343 name: "foo",
344 srcs: ["a.java"],
345 updatable: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100346 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100347 }`,
348 expectedError: "Updatable apps must use stable SDK",
349 },
Artur Satayevf40fc852020-04-16 13:43:02 +0100350 {
351 name: "Must specify min_sdk_version",
352 bp: `android_app {
353 name: "app_without_min_sdk_version",
354 srcs: ["a.java"],
355 sdk_version: "29",
356 updatable: true,
357 }`,
358 expectedError: "updatable apps must set min_sdk_version.",
359 },
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100360 }
361
362 for _, test := range testCases {
363 t.Run(test.name, func(t *testing.T) {
Paul Duffincdb88a92021-03-14 00:36:50 +0000364 errorHandler := android.FixtureExpectsNoErrors
365 if test.expectedError != "" {
366 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100367 }
Paul Duffin71ae5942021-03-22 15:36:52 +0000368 android.GroupFixturePreparers(
369 prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{
Paul Duffin2645a292021-03-13 02:36:00 +0000370 "29": {"foo"},
371 })).
Paul Duffincdb88a92021-03-14 00:36:50 +0000372 ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, test.bp)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100373 })
374 }
375}
376
Jooyung Han749dc692020-04-15 11:03:39 +0900377func TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) {
378 testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+`
379 android_app {
380 name: "foo",
381 srcs: ["a.java"],
382 updatable: true,
383 sdk_version: "current",
384 min_sdk_version: "29",
385 static_libs: ["bar"],
386 }
387
388 java_library {
389 name: "bar",
390 sdk_version: "current",
391 }
392 `)
393}
394
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900395func TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) {
396 testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
397 android_app {
398 name: "foo",
399 srcs: ["a.java"],
400 updatable: true,
401 sdk_version: "current",
402 min_sdk_version: "current",
403 jni_libs: ["libjni"],
404 }
405
406 cc_library {
407 name: "libjni",
408 stl: "none",
409 system_shared_libs: [],
410 sdk_version: "current",
411 }
412 `)
413}
414
415func TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) {
416 bp := cc.GatherRequiredDepsForTest(android.Android) + `
417 android_app {
418 name: "foo",
419 srcs: ["a.java"],
420 updatable: true,
421 sdk_version: "current",
422 min_sdk_version: "29",
423 jni_libs: ["libjni"],
424 }
425
426 cc_library {
427 name: "libjni",
428 stl: "none",
429 system_shared_libs: [],
430 sdk_version: "29",
431 }
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900432 `
433 fs := map[string][]byte{
434 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
435 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil,
436 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil,
437 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil,
438 }
439
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000440 ctx, _ := testJavaWithFS(t, bp, fs)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900441
442 inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
443 var crtbeginFound, crtendFound bool
Dan Albert92fe7402020-07-15 13:33:30 -0700444 expectedCrtBegin := ctx.ModuleForTests("crtbegin_so",
445 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
446 expectedCrtEnd := ctx.ModuleForTests("crtend_so",
447 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
448 implicits := []string{}
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900449 for _, input := range inputs {
Dan Albert92fe7402020-07-15 13:33:30 -0700450 implicits = append(implicits, input.String())
451 if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900452 crtbeginFound = true
Dan Albert92fe7402020-07-15 13:33:30 -0700453 } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900454 crtendFound = true
455 }
456 }
Dan Albert92fe7402020-07-15 13:33:30 -0700457 if !crtbeginFound {
458 t.Error(fmt.Sprintf(
459 "expected implicit with suffix %q, have the following implicits:\n%s",
460 expectedCrtBegin, strings.Join(implicits, "\n")))
461 }
462 if !crtendFound {
463 t.Error(fmt.Sprintf(
464 "expected implicit with suffix %q, have the following implicits:\n%s",
465 expectedCrtEnd, strings.Join(implicits, "\n")))
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900466 }
467}
468
469func TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
470 bp := cc.GatherRequiredDepsForTest(android.Android) + `
471 android_app {
472 name: "foo",
473 srcs: ["a.java"],
474 updatable: true,
475 sdk_version: "current",
476 min_sdk_version: "29", // this APK should support 29
477 jni_libs: ["libjni"],
478 }
479
480 cc_library {
481 name: "libjni",
482 stl: "none",
483 sdk_version: "current",
484 }
485 `
486 testJavaError(t, `"libjni" .*: sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
487}
488
489func TestUpdatableApps_ErrorIfDepSdkVersionIsHigher(t *testing.T) {
490 bp := cc.GatherRequiredDepsForTest(android.Android) + `
491 android_app {
492 name: "foo",
493 srcs: ["a.java"],
494 updatable: true,
495 sdk_version: "current",
496 min_sdk_version: "29", // this APK should support 29
497 jni_libs: ["libjni"],
498 }
499
500 cc_library {
501 name: "libjni",
502 stl: "none",
503 shared_libs: ["libbar"],
504 system_shared_libs: [],
505 sdk_version: "27",
506 }
507
508 cc_library {
509 name: "libbar",
510 stl: "none",
511 system_shared_libs: [],
512 sdk_version: "current",
513 }
514 `
515 testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
516}
517
Colin Cross0ddae7f2019-02-07 15:30:01 -0800518func TestResourceDirs(t *testing.T) {
519 testCases := []struct {
520 name string
521 prop string
522 resources []string
523 }{
524 {
525 name: "no resource_dirs",
526 prop: "",
527 resources: []string{"res/res/values/strings.xml"},
528 },
529 {
530 name: "resource_dirs",
531 prop: `resource_dirs: ["res"]`,
532 resources: []string{"res/res/values/strings.xml"},
533 },
534 {
535 name: "empty resource_dirs",
536 prop: `resource_dirs: []`,
537 resources: nil,
538 },
539 }
540
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000541 fs := android.MockFS{
Colin Cross0ddae7f2019-02-07 15:30:01 -0800542 "res/res/values/strings.xml": nil,
543 }
544
545 bp := `
546 android_app {
547 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900548 sdk_version: "current",
Colin Cross0ddae7f2019-02-07 15:30:01 -0800549 %s
550 }
551 `
552
553 for _, testCase := range testCases {
554 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000555 result := android.GroupFixturePreparers(
556 PrepareForTestWithJavaDefaultModules,
557 PrepareForTestWithOverlayBuildComponents,
558 fs.AddToFixture(),
559 ).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop))
Colin Cross0ddae7f2019-02-07 15:30:01 -0800560
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000561 module := result.ModuleForTests("foo", "android_common")
Colin Cross0ddae7f2019-02-07 15:30:01 -0800562 resourceList := module.MaybeOutput("aapt2/res.list")
563
564 var resources []string
565 if resourceList.Rule != nil {
566 for _, compiledResource := range resourceList.Inputs.Strings() {
567 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
568 }
569 }
570
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000571 android.AssertDeepEquals(t, "resource files", testCase.resources, resources)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800572 })
573 }
574}
575
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800576func TestLibraryAssets(t *testing.T) {
577 bp := `
578 android_app {
579 name: "foo",
580 sdk_version: "current",
581 static_libs: ["lib1", "lib2", "lib3"],
582 }
583
584 android_library {
585 name: "lib1",
586 sdk_version: "current",
587 asset_dirs: ["assets_a"],
588 }
589
590 android_library {
591 name: "lib2",
592 sdk_version: "current",
593 }
594
595 android_library {
596 name: "lib3",
597 sdk_version: "current",
598 static_libs: ["lib4"],
599 }
600
601 android_library {
602 name: "lib4",
603 sdk_version: "current",
604 asset_dirs: ["assets_b"],
605 }
606 `
607
608 testCases := []struct {
609 name string
610 assetFlag string
611 assetPackages []string
612 }{
613 {
614 name: "foo",
615 // lib1 has its own asset. lib3 doesn't have any, but provides lib4's transitively.
616 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000617 "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
618 "out/soong/.intermediates/lib1/android_common/assets.zip",
619 "out/soong/.intermediates/lib3/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800620 },
621 },
622 {
623 name: "lib1",
624 assetFlag: "-A assets_a",
625 },
626 {
627 name: "lib2",
628 },
629 {
630 name: "lib3",
631 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000632 "out/soong/.intermediates/lib3/android_common/aapt2/package-res.apk",
633 "out/soong/.intermediates/lib4/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800634 },
635 },
636 {
637 name: "lib4",
638 assetFlag: "-A assets_b",
639 },
640 }
641 ctx := testApp(t, bp)
642
643 for _, test := range testCases {
644 t.Run(test.name, func(t *testing.T) {
645 m := ctx.ModuleForTests(test.name, "android_common")
646
647 // Check asset flag in aapt2 link flags
648 var aapt2link android.TestingBuildParams
649 if len(test.assetPackages) > 0 {
650 aapt2link = m.Output("aapt2/package-res.apk")
651 } else {
652 aapt2link = m.Output("package-res.apk")
653 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000654 aapt2link = aapt2link.RelativeToTop()
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800655 aapt2Flags := aapt2link.Args["flags"]
656 if test.assetFlag != "" {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000657 android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800658 } else {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000659 android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800660 }
661
662 // Check asset merge rule.
663 if len(test.assetPackages) > 0 {
664 mergeAssets := m.Output("package-res.apk")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000665 android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800666 }
667 })
668 }
669}
670
Colin Crossb014f072021-02-26 14:54:36 -0800671func TestAppJavaResources(t *testing.T) {
672 bp := `
673 android_app {
674 name: "foo",
675 sdk_version: "current",
676 java_resources: ["resources/a"],
677 srcs: ["a.java"],
678 }
679
680 android_app {
681 name: "bar",
682 sdk_version: "current",
683 java_resources: ["resources/a"],
684 }
685 `
686
687 ctx := testApp(t, bp)
688
689 foo := ctx.ModuleForTests("foo", "android_common")
690 fooResources := foo.Output("res/foo.jar")
691 fooDexJar := foo.Output("dex-withres/foo.jar")
692 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
693 fooApk := foo.Rule("combineApk")
694
695 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
696 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
697 }
698
699 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
700 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
701 }
702
703 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
704 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
705 }
706
707 bar := ctx.ModuleForTests("bar", "android_common")
708 barResources := bar.Output("res/bar.jar")
709 barApk := bar.Rule("combineApk")
710
711 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
712 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
713 }
714}
715
Colin Crossbec85302019-02-13 13:15:46 -0800716func TestAndroidResources(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -0800717 testCases := []struct {
718 name string
719 enforceRROTargets []string
720 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -0800721 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -0800722 overlayFiles map[string][]string
723 rroDirs map[string][]string
724 }{
725 {
726 name: "no RRO",
727 enforceRROTargets: nil,
728 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -0800729 resourceFiles: map[string][]string{
730 "foo": nil,
731 "bar": {"bar/res/res/values/strings.xml"},
732 "lib": nil,
733 "lib2": {"lib2/res/res/values/strings.xml"},
734 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800735 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800736 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000737 "out/soong/.intermediates/lib2/android_common/package-res.apk",
738 "out/soong/.intermediates/lib/android_common/package-res.apk",
739 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800740 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800741 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
742 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +0000743 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800744 },
Colin Crossbec85302019-02-13 13:15:46 -0800745 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800746 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
747 "device/vendor/blah/overlay/bar/res/values/strings.xml",
748 },
Colin Crossbec85302019-02-13 13:15:46 -0800749 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000750 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800751 "lib/res/res/values/strings.xml",
752 "device/vendor/blah/overlay/lib/res/values/strings.xml",
753 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800754 },
755 rroDirs: map[string][]string{
756 "foo": nil,
757 "bar": nil,
758 },
759 },
760 {
761 name: "enforce RRO on foo",
762 enforceRROTargets: []string{"foo"},
763 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -0800764 resourceFiles: map[string][]string{
765 "foo": nil,
766 "bar": {"bar/res/res/values/strings.xml"},
767 "lib": nil,
768 "lib2": {"lib2/res/res/values/strings.xml"},
769 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800770 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800771 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000772 "out/soong/.intermediates/lib2/android_common/package-res.apk",
773 "out/soong/.intermediates/lib/android_common/package-res.apk",
774 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800775 "foo/res/res/values/strings.xml",
776 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
777 },
Colin Crossbec85302019-02-13 13:15:46 -0800778 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800779 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
780 "device/vendor/blah/overlay/bar/res/values/strings.xml",
781 },
Colin Crossbec85302019-02-13 13:15:46 -0800782 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000783 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800784 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -0800785 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800786 },
Colin Crossc1c37552019-01-31 11:42:41 -0800787
Colin Cross5c4791c2019-02-01 11:44:44 -0800788 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800789 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000790 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +0000791 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700792 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800793 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800794 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700795 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800796 },
797 },
798 {
799 name: "enforce RRO on all",
800 enforceRROTargets: []string{"*"},
801 enforceRROExcludedOverlays: []string{
802 // Excluding specific apps/res directories also allowed.
803 "device/vendor/blah/static_overlay/foo",
804 "device/vendor/blah/static_overlay/bar/res",
805 },
Colin Crossbec85302019-02-13 13:15:46 -0800806 resourceFiles: map[string][]string{
807 "foo": nil,
808 "bar": {"bar/res/res/values/strings.xml"},
809 "lib": nil,
810 "lib2": {"lib2/res/res/values/strings.xml"},
811 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800812 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800813 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000814 "out/soong/.intermediates/lib2/android_common/package-res.apk",
815 "out/soong/.intermediates/lib/android_common/package-res.apk",
816 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800817 "foo/res/res/values/strings.xml",
818 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
819 },
Colin Crossbec85302019-02-13 13:15:46 -0800820 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
821 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000822 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800823 "lib/res/res/values/strings.xml",
824 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800825 },
826 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800827 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000828 "device:device/vendor/blah/overlay/foo/res",
829 "product:product/vendor/blah/overlay/foo/res",
830 // Lib dep comes after the direct deps
831 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800832 },
Anton Hansson53c88442019-03-18 15:53:16 +0000833 "bar": {"device:device/vendor/blah/overlay/bar/res"},
834 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800835 },
836 },
837 }
838
Anton Hansson53c88442019-03-18 15:53:16 +0000839 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -0800840 "device/vendor/blah/overlay",
841 "device/vendor/blah/overlay2",
842 "device/vendor/blah/static_overlay",
843 }
844
Anton Hansson53c88442019-03-18 15:53:16 +0000845 productResourceOverlays := []string{
846 "product/vendor/blah/overlay",
847 }
848
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000849 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -0800850 "foo/res/res/values/strings.xml": nil,
851 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800852 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -0800853 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800854 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
855 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800856 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800857 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
858 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
859 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +0000860 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800861 }
862
863 bp := `
864 android_app {
865 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900866 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800867 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +0000868 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -0800869 }
870
871 android_app {
872 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900873 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800874 resource_dirs: ["bar/res"],
875 }
Colin Cross6ed7dea2019-01-31 14:44:30 -0800876
877 android_library {
878 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900879 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800880 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -0800881 static_libs: ["lib2"],
882 }
883
884 android_library {
885 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900886 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -0800887 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -0800888 }
Anton Hansson53c88442019-03-18 15:53:16 +0000889
890 // This library has the same resources as lib (should not lead to dupe RROs)
891 android_library {
892 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900893 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +0000894 resource_dirs: ["lib/res"]
895 }
Colin Cross890ff552017-11-30 20:13:19 -0800896 `
897
Colin Cross5c4791c2019-02-01 11:44:44 -0800898 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -0800899 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000900 result := android.GroupFixturePreparers(
901 PrepareForTestWithJavaDefaultModules,
902 PrepareForTestWithOverlayBuildComponents,
903 fs.AddToFixture(),
904 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
905 variables.DeviceResourceOverlays = deviceResourceOverlays
906 variables.ProductResourceOverlays = productResourceOverlays
907 if testCase.enforceRROTargets != nil {
908 variables.EnforceRROTargets = testCase.enforceRROTargets
909 }
910 if testCase.enforceRROExcludedOverlays != nil {
911 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
912 }
913 }),
914 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -0800915
Colin Crossbec85302019-02-13 13:15:46 -0800916 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
917 for _, o := range list {
918 res := module.MaybeOutput(o)
919 if res.Rule != nil {
920 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
921 // verify the inputs to the .arsc.flat rule.
922 files = append(files, res.Inputs.Strings()...)
923 } else {
924 // Otherwise, verify the full path to the output of the other module
925 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +0000926 }
Colin Cross890ff552017-11-30 20:13:19 -0800927 }
Colin Crossbec85302019-02-13 13:15:46 -0800928 return files
Colin Cross890ff552017-11-30 20:13:19 -0800929 }
930
Colin Crossbec85302019-02-13 13:15:46 -0800931 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000932 module := result.ModuleForTests(moduleName, "android_common")
Colin Crossbec85302019-02-13 13:15:46 -0800933 resourceList := module.MaybeOutput("aapt2/res.list")
934 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000935 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +0000936 }
Colin Crossbec85302019-02-13 13:15:46 -0800937 overlayList := module.MaybeOutput("aapt2/overlay.list")
938 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000939 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -0800940 }
941
Anton Hansson53c88442019-03-18 15:53:16 +0000942 for _, d := range module.Module().(AndroidLibraryDependency).ExportedRRODirs() {
943 var prefix string
944 if d.overlayType == device {
945 prefix = "device:"
946 } else if d.overlayType == product {
947 prefix = "product:"
948 } else {
949 t.Fatalf("Unexpected overlayType %d", d.overlayType)
950 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000951 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +0000952 }
Colin Crossbec85302019-02-13 13:15:46 -0800953
954 return resourceFiles, overlayFiles, rroDirs
955 }
956
957 modules := []string{"foo", "bar", "lib", "lib2"}
958 for _, module := range modules {
959 resourceFiles, overlayFiles, rroDirs := getResources(module)
960
961 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
962 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
963 module, testCase.resourceFiles[module], resourceFiles)
964 }
965 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
966 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
967 module, testCase.overlayFiles[module], overlayFiles)
968 }
969 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +0000970 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -0800971 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +0000972 }
Colin Cross890ff552017-11-30 20:13:19 -0800973 }
Colin Cross890ff552017-11-30 20:13:19 -0800974 })
975 }
976}
Colin Crossd09b0b62018-04-18 11:06:47 -0700977
Paul Duffincdb88a92021-03-14 00:36:50 +0000978func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
979 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +0900980 link := foo.Output("package-res.apk")
981 linkFlags := strings.Split(link.Args["flags"], " ")
982 min := android.IndexList("--min-sdk-version", linkFlags)
983 target := android.IndexList("--target-sdk-version", linkFlags)
984
985 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
986 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
987 }
988
989 gotMinSdkVersion := linkFlags[min+1]
990 gotTargetSdkVersion := linkFlags[target+1]
991
Paul Duffincdb88a92021-03-14 00:36:50 +0000992 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +0900993
Paul Duffincdb88a92021-03-14 00:36:50 +0000994 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +0900995}
996
Colin Crossd09b0b62018-04-18 11:06:47 -0700997func TestAppSdkVersion(t *testing.T) {
998 testCases := []struct {
999 name string
1000 sdkVersion string
1001 platformSdkInt int
1002 platformSdkCodename string
1003 platformSdkFinal bool
1004 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001005 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001006 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001007 }{
1008 {
1009 name: "current final SDK",
1010 sdkVersion: "current",
1011 platformSdkInt: 27,
1012 platformSdkCodename: "REL",
1013 platformSdkFinal: true,
1014 expectedMinSdkVersion: "27",
1015 },
1016 {
1017 name: "current non-final SDK",
1018 sdkVersion: "current",
1019 platformSdkInt: 27,
1020 platformSdkCodename: "OMR1",
1021 platformSdkFinal: false,
1022 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001023 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001024 },
1025 {
1026 name: "default final SDK",
1027 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001028 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001029 platformSdkInt: 27,
1030 platformSdkCodename: "REL",
1031 platformSdkFinal: true,
1032 expectedMinSdkVersion: "27",
1033 },
1034 {
1035 name: "default non-final SDK",
1036 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001037 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001038 platformSdkInt: 27,
1039 platformSdkCodename: "OMR1",
1040 platformSdkFinal: false,
1041 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001042 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001043 },
1044 {
1045 name: "14",
1046 sdkVersion: "14",
1047 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001048 platformSdkCodename: "S",
1049 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001050 },
1051 }
1052
1053 for _, moduleType := range []string{"android_app", "android_library"} {
1054 for _, test := range testCases {
1055 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001056 platformApiProp := ""
1057 if test.platformApis {
1058 platformApiProp = "platform_apis: true,"
1059 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001060 bp := fmt.Sprintf(`%s {
1061 name: "foo",
1062 srcs: ["a.java"],
1063 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001064 %s
1065 }`, moduleType, test.sdkVersion, platformApiProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001066
Paul Duffin71ae5942021-03-22 15:36:52 +00001067 result := android.GroupFixturePreparers(
1068 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001069 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1070 variables.Platform_sdk_version = &test.platformSdkInt
1071 variables.Platform_sdk_codename = &test.platformSdkCodename
1072 variables.Platform_version_active_codenames = test.activeCodenames
1073 variables.Platform_sdk_final = &test.platformSdkFinal
1074 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001075 FixtureWithPrebuiltApis(map[string][]string{
1076 "14": {"foo"},
1077 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001078 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001079
Paul Duffincdb88a92021-03-14 00:36:50 +00001080 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001081 })
1082 }
1083 }
1084}
Colin Crossa4f08812018-10-02 22:03:40 -07001085
Jeongik Cha219141c2020-08-06 23:00:37 +09001086func TestVendorAppSdkVersion(t *testing.T) {
1087 testCases := []struct {
1088 name string
1089 sdkVersion string
1090 platformSdkInt int
1091 platformSdkCodename string
1092 platformSdkFinal bool
1093 deviceCurrentApiLevelForVendorModules string
1094 expectedMinSdkVersion string
1095 }{
1096 {
1097 name: "current final SDK",
1098 sdkVersion: "current",
1099 platformSdkInt: 29,
1100 platformSdkCodename: "REL",
1101 platformSdkFinal: true,
1102 deviceCurrentApiLevelForVendorModules: "29",
1103 expectedMinSdkVersion: "29",
1104 },
1105 {
1106 name: "current final SDK",
1107 sdkVersion: "current",
1108 platformSdkInt: 29,
1109 platformSdkCodename: "REL",
1110 platformSdkFinal: true,
1111 deviceCurrentApiLevelForVendorModules: "28",
1112 expectedMinSdkVersion: "28",
1113 },
1114 {
1115 name: "current final SDK",
1116 sdkVersion: "current",
1117 platformSdkInt: 29,
1118 platformSdkCodename: "Q",
1119 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001120 deviceCurrentApiLevelForVendorModules: "28",
1121 expectedMinSdkVersion: "28",
1122 },
1123 }
1124
1125 for _, moduleType := range []string{"android_app", "android_library"} {
1126 for _, sdkKind := range []string{"", "system_"} {
1127 for _, test := range testCases {
1128 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1129 bp := fmt.Sprintf(`%s {
1130 name: "foo",
1131 srcs: ["a.java"],
1132 sdk_version: "%s%s",
1133 vendor: true,
1134 }`, moduleType, sdkKind, test.sdkVersion)
1135
Paul Duffin71ae5942021-03-22 15:36:52 +00001136 result := android.GroupFixturePreparers(
1137 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001138 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1139 variables.Platform_sdk_version = &test.platformSdkInt
1140 variables.Platform_sdk_codename = &test.platformSdkCodename
1141 variables.Platform_sdk_final = &test.platformSdkFinal
1142 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1143 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1144 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001145 FixtureWithPrebuiltApis(map[string][]string{
1146 "28": {"foo"},
1147 "29": {"foo"},
1148 "current": {"foo"},
1149 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001150 ).RunTestWithBp(t, bp)
1151
1152 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001153 })
1154 }
1155 }
1156 }
1157}
1158
Paul Duffin50c217c2019-06-12 13:25:22 +01001159func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001160 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001161 cc_library {
1162 name: "libjni",
1163 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001164 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001165 stl: "none",
1166 }
1167
1168 android_test {
1169 name: "test",
1170 sdk_version: "core_platform",
1171 jni_libs: ["libjni"],
1172 }
1173
1174 android_test {
1175 name: "test_first",
1176 sdk_version: "core_platform",
1177 compile_multilib: "first",
1178 jni_libs: ["libjni"],
1179 }
1180
1181 android_test {
1182 name: "test_both",
1183 sdk_version: "core_platform",
1184 compile_multilib: "both",
1185 jni_libs: ["libjni"],
1186 }
1187
1188 android_test {
1189 name: "test_32",
1190 sdk_version: "core_platform",
1191 compile_multilib: "32",
1192 jni_libs: ["libjni"],
1193 }
1194
1195 android_test {
1196 name: "test_64",
1197 sdk_version: "core_platform",
1198 compile_multilib: "64",
1199 jni_libs: ["libjni"],
1200 }
1201 `)
1202
1203 testCases := []struct {
1204 name string
1205 abis []string
1206 }{
1207 {"test", []string{"arm64-v8a"}},
1208 {"test_first", []string{"arm64-v8a"}},
1209 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1210 {"test_32", []string{"armeabi-v7a"}},
1211 {"test_64", []string{"arm64-v8a"}},
1212 }
1213
1214 for _, test := range testCases {
1215 t.Run(test.name, func(t *testing.T) {
1216 app := ctx.ModuleForTests(test.name, "android_common")
1217 jniLibZip := app.Output("jnilibs.zip")
1218 var abis []string
1219 args := strings.Fields(jniLibZip.Args["jarArgs"])
1220 for i := 0; i < len(args); i++ {
1221 if args[i] == "-P" {
1222 abis = append(abis, filepath.Base(args[i+1]))
1223 i++
1224 }
1225 }
1226 if !reflect.DeepEqual(abis, test.abis) {
1227 t.Errorf("want abis %v, got %v", test.abis, abis)
1228 }
1229 })
1230 }
1231}
1232
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001233func TestAppSdkVersionByPartition(t *testing.T) {
1234 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1235 android_app {
1236 name: "foo",
1237 srcs: ["a.java"],
1238 vendor: true,
1239 platform_apis: true,
1240 }
1241 `)
1242
1243 testJava(t, `
1244 android_app {
1245 name: "bar",
1246 srcs: ["b.java"],
1247 platform_apis: true,
1248 }
1249 `)
1250
1251 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001252 bp := `
1253 android_app {
1254 name: "foo",
1255 srcs: ["a.java"],
1256 product_specific: true,
1257 platform_apis: true,
1258 }
1259 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001260
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001261 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001262 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001263 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern("sdk_version must have a value when the module is located at vendor or product")
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001264 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001265
1266 android.GroupFixturePreparers(
1267 PrepareForTestWithJavaDefaultModules,
1268 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1269 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
1270 }),
1271 ).
1272 ExtendWithErrorHandler(errorHandler).
1273 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001274 }
1275}
1276
Paul Duffin50c217c2019-06-12 13:25:22 +01001277func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001278 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001279 cc_library {
1280 name: "libjni",
1281 system_shared_libs: [],
1282 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08001283 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001284 }
1285
1286 android_app {
1287 name: "app",
1288 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001289 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001290 }
1291
1292 android_app {
1293 name: "app_noembed",
1294 jni_libs: ["libjni"],
1295 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001296 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001297 }
1298
1299 android_app {
1300 name: "app_embed",
1301 jni_libs: ["libjni"],
1302 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001303 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001304 }
1305
1306 android_test {
1307 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00001308 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001309 jni_libs: ["libjni"],
1310 }
1311
1312 android_test {
1313 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001314 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001315 jni_libs: ["libjni"],
1316 use_embedded_native_libs: false,
1317 }
1318
1319 android_test_helper_app {
1320 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00001321 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001322 jni_libs: ["libjni"],
1323 }
1324
1325 android_test_helper_app {
1326 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001327 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001328 jni_libs: ["libjni"],
1329 use_embedded_native_libs: false,
1330 }
1331 `)
1332
1333 testCases := []struct {
1334 name string
1335 packaged bool
1336 compressed bool
1337 }{
1338 {"app", false, false},
1339 {"app_noembed", false, false},
1340 {"app_embed", true, false},
1341 {"test", true, false},
1342 {"test_noembed", true, true},
1343 {"test_helper", true, false},
1344 {"test_helper_noembed", true, true},
1345 }
1346
1347 for _, test := range testCases {
1348 t.Run(test.name, func(t *testing.T) {
1349 app := ctx.ModuleForTests(test.name, "android_common")
1350 jniLibZip := app.MaybeOutput("jnilibs.zip")
1351 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
1352 t.Errorf("expected jni packaged %v, got %v", w, g)
1353 }
1354
1355 if jniLibZip.Rule != nil {
1356 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
1357 t.Errorf("expected jni compressed %v, got %v", w, g)
1358 }
Colin Crossc511bc52020-04-07 16:50:32 +00001359
1360 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
1361 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
1362 }
Paul Duffin50c217c2019-06-12 13:25:22 +01001363 }
1364 })
1365 }
Colin Cross47fa9d32019-03-26 10:51:39 -07001366}
1367
Colin Cross3c007702020-05-08 11:20:24 -07001368func TestJNISDK(t *testing.T) {
1369 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
1370 cc_library {
1371 name: "libjni",
1372 system_shared_libs: [],
1373 stl: "none",
1374 sdk_version: "current",
1375 }
1376
1377 android_test {
1378 name: "app_platform",
1379 jni_libs: ["libjni"],
1380 platform_apis: true,
1381 }
1382
1383 android_test {
1384 name: "app_sdk",
1385 jni_libs: ["libjni"],
1386 sdk_version: "current",
1387 }
1388
1389 android_test {
1390 name: "app_force_platform",
1391 jni_libs: ["libjni"],
1392 sdk_version: "current",
1393 jni_uses_platform_apis: true,
1394 }
1395
1396 android_test {
1397 name: "app_force_sdk",
1398 jni_libs: ["libjni"],
1399 platform_apis: true,
1400 jni_uses_sdk_apis: true,
1401 }
Colin Crossc2d24052020-05-13 11:05:02 -07001402
1403 cc_library {
1404 name: "libvendorjni",
1405 system_shared_libs: [],
1406 stl: "none",
1407 vendor: true,
1408 }
1409
1410 android_test {
1411 name: "app_vendor",
1412 jni_libs: ["libvendorjni"],
1413 sdk_version: "current",
1414 vendor: true,
1415 }
Colin Cross3c007702020-05-08 11:20:24 -07001416 `)
1417
1418 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07001419 name string
1420 sdkJNI bool
1421 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07001422 }{
Colin Crossc2d24052020-05-13 11:05:02 -07001423 {name: "app_platform"},
1424 {name: "app_sdk", sdkJNI: true},
1425 {name: "app_force_platform"},
1426 {name: "app_force_sdk", sdkJNI: true},
1427 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07001428 }
1429
Colin Crossc2d24052020-05-13 11:05:02 -07001430 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
1431 Output("libjni.so").Output.String()
1432 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
1433 Output("libjni.so").Output.String()
1434 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
1435 Output("libvendorjni.so").Output.String()
1436
Colin Cross3c007702020-05-08 11:20:24 -07001437 for _, test := range testCases {
1438 t.Run(test.name, func(t *testing.T) {
1439 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07001440
1441 jniLibZip := app.MaybeOutput("jnilibs.zip")
1442 if len(jniLibZip.Implicits) != 1 {
1443 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
1444 }
1445 gotJNI := jniLibZip.Implicits[0].String()
1446
1447 if test.sdkJNI {
1448 if gotJNI != sdkJNI {
1449 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
1450 }
Colin Crossc2d24052020-05-13 11:05:02 -07001451 } else if test.vendorJNI {
1452 if gotJNI != vendorJNI {
1453 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
1454 }
Colin Cross3c007702020-05-08 11:20:24 -07001455 } else {
1456 if gotJNI != platformJNI {
1457 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
1458 }
1459 }
1460 })
1461 }
1462
1463 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
1464 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
1465 android_test {
1466 name: "app_platform",
1467 platform_apis: true,
1468 jni_uses_platform_apis: true,
1469 }
1470 `)
1471 })
1472
1473 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
1474 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
1475 android_test {
1476 name: "app_sdk",
1477 sdk_version: "current",
1478 jni_uses_sdk_apis: true,
1479 }
1480 `)
1481 })
1482
1483}
1484
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001485func TestCertificates(t *testing.T) {
1486 testCases := []struct {
1487 name string
1488 bp string
1489 certificateOverride string
Liz Kammere2b27f42020-05-07 13:24:05 -07001490 expectedLineage string
1491 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001492 }{
1493 {
1494 name: "default",
1495 bp: `
1496 android_app {
1497 name: "foo",
1498 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001499 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001500 }
1501 `,
1502 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001503 expectedLineage: "",
1504 expectedCertificate: "build/make/target/product/security/testkey.x509.pem build/make/target/product/security/testkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001505 },
1506 {
1507 name: "module certificate property",
1508 bp: `
1509 android_app {
1510 name: "foo",
1511 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001512 certificate: ":new_certificate",
1513 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001514 }
1515
1516 android_app_certificate {
1517 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001518 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001519 }
1520 `,
1521 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001522 expectedLineage: "",
1523 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001524 },
1525 {
1526 name: "path certificate property",
1527 bp: `
1528 android_app {
1529 name: "foo",
1530 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001531 certificate: "expiredkey",
1532 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001533 }
1534 `,
1535 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001536 expectedLineage: "",
1537 expectedCertificate: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001538 },
1539 {
1540 name: "certificate overrides",
1541 bp: `
1542 android_app {
1543 name: "foo",
1544 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001545 certificate: "expiredkey",
1546 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001547 }
1548
1549 android_app_certificate {
1550 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001551 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001552 }
1553 `,
1554 certificateOverride: "foo:new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001555 expectedLineage: "",
1556 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1557 },
1558 {
1559 name: "certificate lineage",
1560 bp: `
1561 android_app {
1562 name: "foo",
1563 srcs: ["a.java"],
1564 certificate: ":new_certificate",
1565 lineage: "lineage.bin",
1566 sdk_version: "current",
1567 }
1568
1569 android_app_certificate {
1570 name: "new_certificate",
1571 certificate: "cert/new_cert",
1572 }
1573 `,
1574 certificateOverride: "",
1575 expectedLineage: "--lineage lineage.bin",
1576 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001577 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001578 {
1579 name: "lineage from filegroup",
1580 bp: `
1581 android_app {
1582 name: "foo",
1583 srcs: ["a.java"],
1584 certificate: ":new_certificate",
1585 lineage: ":lineage_bin",
1586 sdk_version: "current",
1587 }
1588
1589 android_app_certificate {
1590 name: "new_certificate",
1591 certificate: "cert/new_cert",
1592 }
1593
1594 filegroup {
1595 name: "lineage_bin",
1596 srcs: ["lineage.bin"],
1597 }
1598 `,
1599 certificateOverride: "",
1600 expectedLineage: "--lineage lineage.bin",
1601 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1602 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001603 }
1604
1605 for _, test := range testCases {
1606 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001607 result := android.GroupFixturePreparers(
1608 PrepareForTestWithJavaDefaultModules,
1609 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1610 if test.certificateOverride != "" {
1611 variables.CertificateOverrides = []string{test.certificateOverride}
1612 }
1613 }),
1614 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001615
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001616 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001617
1618 signapk := foo.Output("foo.apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001619 signCertificateFlags := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001620 android.AssertStringEquals(t, "certificates flags", test.expectedCertificate, signCertificateFlags)
Liz Kammere2b27f42020-05-07 13:24:05 -07001621
1622 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001623 android.AssertStringEquals(t, "signing flags", test.expectedLineage, signFlags)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001624 })
1625 }
1626}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001627
Songchun Fan688de9a2020-03-24 20:32:24 -07001628func TestRequestV4SigningFlag(t *testing.T) {
1629 testCases := []struct {
1630 name string
1631 bp string
1632 expected string
1633 }{
1634 {
1635 name: "default",
1636 bp: `
1637 android_app {
1638 name: "foo",
1639 srcs: ["a.java"],
1640 sdk_version: "current",
1641 }
1642 `,
1643 expected: "",
1644 },
1645 {
1646 name: "default",
1647 bp: `
1648 android_app {
1649 name: "foo",
1650 srcs: ["a.java"],
1651 sdk_version: "current",
1652 v4_signature: false,
1653 }
1654 `,
1655 expected: "",
1656 },
1657 {
1658 name: "module certificate property",
1659 bp: `
1660 android_app {
1661 name: "foo",
1662 srcs: ["a.java"],
1663 sdk_version: "current",
1664 v4_signature: true,
1665 }
1666 `,
1667 expected: "--enable-v4",
1668 },
1669 }
1670
1671 for _, test := range testCases {
1672 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001673 result := android.GroupFixturePreparers(
1674 PrepareForTestWithJavaDefaultModules,
1675 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07001676
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001677 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07001678
1679 signapk := foo.Output("foo.apk")
1680 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001681 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07001682 })
1683 }
1684}
1685
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001686func TestPackageNameOverride(t *testing.T) {
1687 testCases := []struct {
1688 name string
1689 bp string
1690 packageNameOverride string
1691 expected []string
1692 }{
1693 {
1694 name: "default",
1695 bp: `
1696 android_app {
1697 name: "foo",
1698 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001699 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001700 }
1701 `,
1702 packageNameOverride: "",
1703 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001704 "out/soong/.intermediates/foo/android_common/foo.apk",
1705 "out/soong/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001706 },
1707 },
1708 {
1709 name: "overridden",
1710 bp: `
1711 android_app {
1712 name: "foo",
1713 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001714 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001715 }
1716 `,
1717 packageNameOverride: "foo:bar",
1718 expected: []string{
1719 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001720 "out/soong/.intermediates/foo/android_common/bar.apk",
1721 "out/soong/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001722 },
1723 },
1724 }
1725
1726 for _, test := range testCases {
1727 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001728 result := android.GroupFixturePreparers(
1729 PrepareForTestWithJavaDefaultModules,
1730 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1731 if test.packageNameOverride != "" {
1732 variables.PackageNameOverrides = []string{test.packageNameOverride}
1733 }
1734 }),
1735 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001736
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001737 foo := result.ModuleForTests("foo", "android_common")
1738
1739 outSoongDir := result.Config.BuildDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001740
1741 outputs := foo.AllOutputs()
1742 outputMap := make(map[string]bool)
1743 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001744 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001745 }
1746 for _, e := range test.expected {
1747 if _, exist := outputMap[e]; !exist {
1748 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
1749 }
1750 }
1751 })
1752 }
1753}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001754
1755func TestInstrumentationTargetOverridden(t *testing.T) {
1756 bp := `
1757 android_app {
1758 name: "foo",
1759 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001760 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001761 }
1762
1763 android_test {
1764 name: "bar",
1765 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001766 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001767 }
1768 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001769
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001770 result := android.GroupFixturePreparers(
1771 PrepareForTestWithJavaDefaultModules,
1772 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1773 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
1774 }),
1775 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001776
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001777 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001778 res := bar.Output("package-res.apk")
1779 aapt2Flags := res.Args["flags"]
1780 e := "--rename-instrumentation-target-package org.dandroid.bp"
1781 if !strings.Contains(aapt2Flags, e) {
1782 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
1783 }
1784}
Jaewoong Jung525443a2019-02-28 15:35:54 -08001785
1786func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001787 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
1788 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08001789 android_app {
1790 name: "foo",
1791 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07001792 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001793 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001794 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001795 }
1796
1797 override_android_app {
1798 name: "bar",
1799 base: "foo",
1800 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001801 lineage: "lineage.bin",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001802 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001803 }
1804
1805 android_app_certificate {
1806 name: "new_certificate",
1807 certificate: "cert/new_cert",
1808 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001809
1810 override_android_app {
1811 name: "baz",
1812 base: "foo",
1813 package_name: "org.dandroid.bp",
1814 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001815
1816 override_android_app {
1817 name: "baz_no_rename_resources",
1818 base: "foo",
1819 package_name: "org.dandroid.bp",
1820 rename_resources_package: false,
1821 }
1822
1823 android_app {
1824 name: "foo_no_rename_resources",
1825 srcs: ["a.java"],
1826 certificate: "expiredkey",
1827 overrides: ["qux"],
1828 rename_resources_package: false,
1829 sdk_version: "current",
1830 }
1831
1832 override_android_app {
1833 name: "baz_base_no_rename_resources",
1834 base: "foo_no_rename_resources",
1835 package_name: "org.dandroid.bp",
1836 }
1837
1838 override_android_app {
1839 name: "baz_override_base_rename_resources",
1840 base: "foo_no_rename_resources",
1841 package_name: "org.dandroid.bp",
1842 rename_resources_package: true,
1843 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08001844 `)
1845
1846 expectedVariants := []struct {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001847 name string
1848 moduleName string
1849 variantName string
1850 apkName string
1851 apkPath string
1852 certFlag string
1853 lineageFlag string
1854 overrides []string
1855 packageFlag string
1856 renameResources bool
1857 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08001858 }{
1859 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001860 name: "foo",
1861 moduleName: "foo",
1862 variantName: "android_common",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001863 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001864 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1865 lineageFlag: "",
1866 overrides: []string{"qux"},
1867 packageFlag: "",
1868 renameResources: false,
1869 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001870 },
1871 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001872 name: "foo",
1873 moduleName: "bar",
1874 variantName: "android_common_bar",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001875 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001876 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
1877 lineageFlag: "--lineage lineage.bin",
1878 overrides: []string{"qux", "foo"},
1879 packageFlag: "",
1880 renameResources: false,
1881 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001882 },
1883 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001884 name: "foo",
1885 moduleName: "baz",
1886 variantName: "android_common_baz",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001887 apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001888 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1889 lineageFlag: "",
1890 overrides: []string{"qux", "foo"},
1891 packageFlag: "org.dandroid.bp",
1892 renameResources: true,
1893 logging_parent: "",
1894 },
1895 {
1896 name: "foo",
1897 moduleName: "baz_no_rename_resources",
1898 variantName: "android_common_baz_no_rename_resources",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001899 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 +00001900 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1901 lineageFlag: "",
1902 overrides: []string{"qux", "foo"},
1903 packageFlag: "org.dandroid.bp",
1904 renameResources: false,
1905 logging_parent: "",
1906 },
1907 {
1908 name: "foo_no_rename_resources",
1909 moduleName: "baz_base_no_rename_resources",
1910 variantName: "android_common_baz_base_no_rename_resources",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001911 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 +00001912 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1913 lineageFlag: "",
1914 overrides: []string{"qux", "foo_no_rename_resources"},
1915 packageFlag: "org.dandroid.bp",
1916 renameResources: false,
1917 logging_parent: "",
1918 },
1919 {
1920 name: "foo_no_rename_resources",
1921 moduleName: "baz_override_base_rename_resources",
1922 variantName: "android_common_baz_override_base_rename_resources",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001923 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 +00001924 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1925 lineageFlag: "",
1926 overrides: []string{"qux", "foo_no_rename_resources"},
1927 packageFlag: "org.dandroid.bp",
1928 renameResources: true,
1929 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001930 },
1931 }
1932 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001933 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001934
1935 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001936 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001937
1938 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08001939 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001940 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001941 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07001942
1943 // Check the lineage flags
1944 lineageFlag := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001945 android.AssertStringEquals(t, "signing flags", expected.lineageFlag, lineageFlag)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001946
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001947 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08001948 mod := variant.Module().(*AndroidApp)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001949 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.appProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001950
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001951 // Test Overridable property: Logging_parent
1952 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001953 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001954
Liz Kammer1d5983b2020-05-19 19:15:37 +00001955 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001956 res := variant.Output("package-res.apk")
1957 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00001958 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
1959 expectedPackage := expected.packageFlag
1960 if !expected.renameResources {
1961 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00001962 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001963 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001964 }
1965}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07001966
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001967func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001968 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001969 android_app {
1970 name: "foo",
1971 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001972 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001973 }
1974
1975 override_android_app {
1976 name: "bar",
1977 base: "foo",
1978 package_name: "org.dandroid.bp",
1979 }
1980
1981 android_test {
1982 name: "baz",
1983 srcs: ["b.java"],
1984 instrumentation_for: "foo",
1985 }
1986
1987 android_test {
1988 name: "qux",
1989 srcs: ["b.java"],
1990 instrumentation_for: "bar",
1991 }
1992 `)
1993
1994 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001995 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac").RelativeToTop()
1996 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001997 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
1998 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
1999 }
2000
2001 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002002 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac").RelativeToTop()
2003 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002004 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2005 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2006 }
2007}
2008
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002009func TestOverrideAndroidTest(t *testing.T) {
2010 ctx, _ := testJava(t, `
2011 android_app {
2012 name: "foo",
2013 srcs: ["a.java"],
2014 package_name: "com.android.foo",
2015 sdk_version: "current",
2016 }
2017
2018 override_android_app {
2019 name: "bar",
2020 base: "foo",
2021 package_name: "com.android.bar",
2022 }
2023
2024 android_test {
2025 name: "foo_test",
2026 srcs: ["b.java"],
2027 instrumentation_for: "foo",
2028 }
2029
2030 override_android_test {
2031 name: "bar_test",
2032 base: "foo_test",
2033 package_name: "com.android.bar.test",
2034 instrumentation_for: "bar",
2035 instrumentation_target_package: "com.android.bar",
2036 }
2037 `)
2038
2039 expectedVariants := []struct {
2040 moduleName string
2041 variantName string
2042 apkPath string
2043 overrides []string
2044 targetVariant string
2045 packageFlag string
2046 targetPackageFlag string
2047 }{
2048 {
2049 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002050 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002051 overrides: nil,
2052 targetVariant: "android_common",
2053 packageFlag: "",
2054 targetPackageFlag: "",
2055 },
2056 {
2057 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002058 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002059 overrides: []string{"foo_test"},
2060 targetVariant: "android_common_bar",
2061 packageFlag: "com.android.bar.test",
2062 targetPackageFlag: "com.android.bar",
2063 },
2064 }
2065 for _, expected := range expectedVariants {
2066 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2067
2068 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002069 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002070
2071 // Check if the overrides field values are correctly aggregated.
2072 mod := variant.Module().(*AndroidTest)
2073 if !reflect.DeepEqual(expected.overrides, mod.appProperties.Overrides) {
2074 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
2075 expected.overrides, mod.appProperties.Overrides)
2076 }
2077
2078 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002079 javac := variant.Rule("javac").RelativeToTop()
2080 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002081 if !strings.Contains(javac.Args["classpath"], turbine) {
2082 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2083 }
2084
2085 // Check aapt2 flags.
2086 res := variant.Output("package-res.apk")
2087 aapt2Flags := res.Args["flags"]
2088 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002089 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002090 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2091 }
2092}
2093
Jaewoong Jung39982342020-01-14 10:27:18 -08002094func TestAndroidTest_FixTestConfig(t *testing.T) {
2095 ctx, _ := testJava(t, `
2096 android_app {
2097 name: "foo",
2098 srcs: ["a.java"],
2099 package_name: "com.android.foo",
2100 sdk_version: "current",
2101 }
2102
2103 android_test {
2104 name: "foo_test",
2105 srcs: ["b.java"],
2106 instrumentation_for: "foo",
2107 }
2108
2109 android_test {
2110 name: "bar_test",
2111 srcs: ["b.java"],
2112 package_name: "com.android.bar.test",
2113 instrumentation_for: "foo",
2114 }
2115
2116 override_android_test {
2117 name: "baz_test",
2118 base: "foo_test",
2119 package_name: "com.android.baz.test",
2120 }
2121 `)
2122
2123 testCases := []struct {
2124 moduleName string
2125 variantName string
2126 expectedFlags []string
2127 }{
2128 {
2129 moduleName: "foo_test",
2130 variantName: "android_common",
2131 },
2132 {
2133 moduleName: "bar_test",
2134 variantName: "android_common",
2135 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002136 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002137 "--package-name com.android.bar.test",
2138 },
2139 },
2140 {
2141 moduleName: "foo_test",
2142 variantName: "android_common_baz_test",
2143 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002144 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002145 "--package-name com.android.baz.test",
2146 "--test-file-name baz_test.apk",
2147 },
2148 },
2149 }
2150
2151 for _, test := range testCases {
2152 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002153 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml").RelativeToTop()
Jaewoong Jung39982342020-01-14 10:27:18 -08002154
2155 if len(test.expectedFlags) > 0 {
2156 if params.Rule == nil {
2157 t.Errorf("test_config_fixer was expected to run, but didn't")
2158 } else {
2159 for _, flag := range test.expectedFlags {
2160 if !strings.Contains(params.RuleParams.Command, flag) {
2161 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
2162 }
2163 }
2164 }
2165 } else {
2166 if params.Rule != nil {
2167 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
2168 }
2169 }
2170
2171 }
2172}
2173
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002174func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002175 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002176 cc_library {
2177 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08002178 sdk_version: "current",
2179 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002180 }
2181
2182 android_test {
2183 name: "stl",
2184 jni_libs: ["libjni"],
2185 compile_multilib: "both",
2186 sdk_version: "current",
2187 stl: "c++_shared",
2188 }
2189
2190 android_test {
2191 name: "system",
2192 jni_libs: ["libjni"],
2193 compile_multilib: "both",
2194 sdk_version: "current",
2195 }
2196 `)
2197
2198 testCases := []struct {
2199 name string
2200 jnis []string
2201 }{
2202 {"stl",
2203 []string{
2204 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07002205 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002206 },
2207 },
2208 {"system",
2209 []string{
2210 "libjni.so",
2211 },
2212 },
2213 }
2214
2215 for _, test := range testCases {
2216 t.Run(test.name, func(t *testing.T) {
2217 app := ctx.ModuleForTests(test.name, "android_common")
2218 jniLibZip := app.Output("jnilibs.zip")
2219 var jnis []string
2220 args := strings.Fields(jniLibZip.Args["jarArgs"])
2221 for i := 0; i < len(args); i++ {
2222 if args[i] == "-f" {
2223 jnis = append(jnis, args[i+1])
2224 i += 1
2225 }
2226 }
2227 jnisJoined := strings.Join(jnis, " ")
2228 for _, jni := range test.jnis {
2229 if !strings.Contains(jnisJoined, jni) {
2230 t.Errorf("missing jni %q in %q", jni, jnis)
2231 }
2232 }
2233 })
2234 }
2235}
Colin Cross50ddcc42019-05-16 12:28:22 -07002236
2237func TestUsesLibraries(t *testing.T) {
2238 bp := `
2239 java_sdk_library {
2240 name: "foo",
2241 srcs: ["a.java"],
2242 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002243 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002244 }
2245
2246 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01002247 name: "qux",
2248 srcs: ["a.java"],
2249 api_packages: ["qux"],
2250 sdk_version: "current",
2251 }
2252
2253 java_sdk_library {
2254 name: "quuz",
2255 srcs: ["a.java"],
2256 api_packages: ["quuz"],
2257 sdk_version: "current",
2258 }
2259
2260 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002261 name: "fred",
2262 srcs: ["a.java"],
2263 api_packages: ["fred"],
2264 sdk_version: "current",
2265 }
2266
2267 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07002268 name: "bar",
2269 srcs: ["a.java"],
2270 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002271 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002272 }
2273
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01002274 java_sdk_library {
2275 name: "runtime-library",
2276 srcs: ["a.java"],
2277 sdk_version: "current",
2278 }
2279
2280 java_library {
2281 name: "static-runtime-helper",
2282 srcs: ["a.java"],
2283 libs: ["runtime-library"],
2284 sdk_version: "current",
2285 }
2286
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002287 // A library that has to use "provides_uses_lib", because:
2288 // - it is not an SDK library
2289 // - its library name is different from its module name
2290 java_library {
2291 name: "non-sdk-lib",
2292 provides_uses_lib: "com.non.sdk.lib",
2293 installable: true,
2294 srcs: ["a.java"],
2295 }
2296
Colin Cross50ddcc42019-05-16 12:28:22 -07002297 android_app {
2298 name: "app",
2299 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002300 libs: [
2301 "qux",
2302 "quuz.stubs"
2303 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002304 static_libs: [
2305 "static-runtime-helper",
2306 // statically linked component libraries should not pull their SDK libraries,
2307 // so "fred" should not be added to class loader context
2308 "fred.stubs",
2309 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002310 uses_libs: [
2311 "foo",
2312 "non-sdk-lib"
2313 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002314 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002315 optional_uses_libs: [
2316 "bar",
2317 "baz",
2318 ],
2319 }
2320
2321 android_app_import {
2322 name: "prebuilt",
2323 apk: "prebuilts/apk/app.apk",
2324 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002325 uses_libs: [
2326 "foo",
2327 "non-sdk-lib",
2328 "android.test.runner"
2329 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07002330 optional_uses_libs: [
2331 "bar",
2332 "baz",
2333 ],
2334 }
2335 `
2336
Paul Duffin71ae5942021-03-22 15:36:52 +00002337 result := android.GroupFixturePreparers(
2338 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00002339 PrepareForTestWithJavaSdkLibraryFiles,
2340 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Paul Duffind234b412021-03-12 23:04:46 +00002341 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2342 variables.MissingUsesLibraries = []string{"baz"}
2343 }),
2344 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07002345
Paul Duffind234b412021-03-12 23:04:46 +00002346 app := result.ModuleForTests("app", "android_common")
2347 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07002348
Paul Duffin859fe962020-05-15 10:20:31 +01002349 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002350 // This should not include explicit `uses_libs`/`optional_uses_libs` entries.
2351 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2352 expectManifestFixerArgs := `--extract-native-libs=true ` +
2353 `--uses-library qux ` +
2354 `--uses-library quuz ` +
2355 `--uses-library foo ` + // TODO(b/132357300): "foo" should not be passed to manifest_fixer
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002356 `--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 +00002357 `--uses-library bar ` + // TODO(b/132357300): "bar" should not be passed to manifest_fixer
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002358 `--uses-library runtime-library`
Paul Duffind234b412021-03-12 23:04:46 +00002359 android.AssertStringEquals(t, "manifest_fixer args", expectManifestFixerArgs, actualManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01002360
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002361 // Test that all libraries are verified (library order matters).
2362 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
2363 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002364 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002365 `--uses-library qux ` +
2366 `--uses-library quuz ` +
2367 `--uses-library runtime-library ` +
2368 `--optional-uses-library bar ` +
2369 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002370 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002371
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002372 // Test that all libraries are verified for an APK (library order matters).
2373 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00002374 verifyApkArgs := `--uses-library foo ` +
2375 `--uses-library com.non.sdk.lib ` +
2376 `--uses-library android.test.runner ` +
2377 `--optional-uses-library bar ` +
2378 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002379 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002380
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002381 // Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002382 cmd := app.Rule("dexpreopt").RuleParams.Command
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002383 w := `--target-context-for-sdk any ` +
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002384 `PCL[/system/framework/qux.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002385 `PCL[/system/framework/quuz.jar]#` +
2386 `PCL[/system/framework/foo.jar]#` +
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002387 `PCL[/system/framework/non-sdk-lib.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002388 `PCL[/system/framework/bar.jar]#` +
2389 `PCL[/system/framework/runtime-library.jar]`
Paul Duffind234b412021-03-12 23:04:46 +00002390 android.AssertStringDoesContain(t, "dexpreopt app cmd args", cmd, w)
Colin Cross50ddcc42019-05-16 12:28:22 -07002391
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002392 // Test conditional context for target SDK version 28.
Paul Duffind234b412021-03-12 23:04:46 +00002393 android.AssertStringDoesContain(t, "dexpreopt app cmd 28", cmd,
2394 `--target-context-for-sdk 28`+
2395 ` PCL[/system/framework/org.apache.http.legacy.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002396
2397 // Test conditional context for target SDK version 29.
Paul Duffind234b412021-03-12 23:04:46 +00002398 android.AssertStringDoesContain(t, "dexpreopt app cmd 29", cmd,
2399 `--target-context-for-sdk 29`+
2400 ` PCL[/system/framework/android.hidl.manager-V1.0-java.jar]`+
2401 `#PCL[/system/framework/android.hidl.base-V1.0-java.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002402
2403 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002404 // "android.test.mock" is absent because "android.test.runner" is not used.
Paul Duffind234b412021-03-12 23:04:46 +00002405 android.AssertStringDoesContain(t, "dexpreopt app cmd 30", cmd,
2406 `--target-context-for-sdk 30`+
2407 ` PCL[/system/framework/android.test.base.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002408
Ulya Trafimovichfc24ad32020-08-19 16:32:54 +01002409 cmd = prebuilt.Rule("dexpreopt").RuleParams.Command
Paul Duffind234b412021-03-12 23:04:46 +00002410 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd", cmd,
2411 `--target-context-for-sdk any`+
2412 ` PCL[/system/framework/foo.jar]`+
2413 `#PCL[/system/framework/non-sdk-lib.jar]`+
2414 `#PCL[/system/framework/android.test.runner.jar]`+
2415 `#PCL[/system/framework/bar.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002416
2417 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002418 // "android.test.mock" is present because "android.test.runner" is used.
Paul Duffind234b412021-03-12 23:04:46 +00002419 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd 30", cmd,
2420 `--target-context-for-sdk 30`+
2421 ` PCL[/system/framework/android.test.base.jar]`+
2422 `#PCL[/system/framework/android.test.mock.jar] `)
Colin Cross50ddcc42019-05-16 12:28:22 -07002423}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002424
2425func TestCodelessApp(t *testing.T) {
2426 testCases := []struct {
2427 name string
2428 bp string
2429 noCode bool
2430 }{
2431 {
2432 name: "normal",
2433 bp: `
2434 android_app {
2435 name: "foo",
2436 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002437 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002438 }
2439 `,
2440 noCode: false,
2441 },
2442 {
2443 name: "app without sources",
2444 bp: `
2445 android_app {
2446 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002447 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002448 }
2449 `,
2450 noCode: true,
2451 },
2452 {
2453 name: "app with libraries",
2454 bp: `
2455 android_app {
2456 name: "foo",
2457 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002458 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002459 }
2460
2461 java_library {
2462 name: "lib",
2463 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002464 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002465 }
2466 `,
2467 noCode: false,
2468 },
2469 {
2470 name: "app with sourceless libraries",
2471 bp: `
2472 android_app {
2473 name: "foo",
2474 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002475 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002476 }
2477
2478 java_library {
2479 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002480 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002481 }
2482 `,
2483 // TODO(jungjw): this should probably be true
2484 noCode: false,
2485 },
2486 }
2487
2488 for _, test := range testCases {
2489 t.Run(test.name, func(t *testing.T) {
2490 ctx := testApp(t, test.bp)
2491
2492 foo := ctx.ModuleForTests("foo", "android_common")
2493 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2494 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
2495 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
2496 }
2497 })
2498 }
2499}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002500
2501func TestEmbedNotice(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002502 result := android.GroupFixturePreparers(
2503 PrepareForTestWithJavaDefaultModules,
2504 cc.PrepareForTestWithCcDefaultModules,
2505 genrule.PrepareForTestWithGenRuleBuildComponents,
2506 android.MockFS{
2507 "APP_NOTICE": nil,
2508 "GENRULE_NOTICE": nil,
2509 "LIB_NOTICE": nil,
2510 "TOOL_NOTICE": nil,
2511 }.AddToFixture(),
2512 ).RunTestWithBp(t, `
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002513 android_app {
2514 name: "foo",
2515 srcs: ["a.java"],
2516 static_libs: ["javalib"],
2517 jni_libs: ["libjni"],
2518 notice: "APP_NOTICE",
2519 embed_notices: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002520 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002521 }
2522
2523 // No embed_notice flag
2524 android_app {
2525 name: "bar",
2526 srcs: ["a.java"],
2527 jni_libs: ["libjni"],
2528 notice: "APP_NOTICE",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002529 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002530 }
2531
2532 // No NOTICE files
2533 android_app {
2534 name: "baz",
2535 srcs: ["a.java"],
2536 embed_notices: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002537 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002538 }
2539
2540 cc_library {
2541 name: "libjni",
2542 system_shared_libs: [],
2543 stl: "none",
2544 notice: "LIB_NOTICE",
Colin Cross094cde42020-02-15 10:38:00 -08002545 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002546 }
2547
2548 java_library {
2549 name: "javalib",
2550 srcs: [
2551 ":gen",
2552 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002553 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002554 }
2555
2556 genrule {
2557 name: "gen",
2558 tools: ["gentool"],
2559 out: ["gen.java"],
2560 notice: "GENRULE_NOTICE",
2561 }
2562
2563 java_binary_host {
2564 name: "gentool",
2565 srcs: ["b.java"],
2566 notice: "TOOL_NOTICE",
2567 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002568 `)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002569
2570 // foo has NOTICE files to process, and embed_notices is true.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002571 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002572 // verify merge notices rule.
2573 mergeNotices := foo.Rule("mergeNoticesRule")
2574 noticeInputs := mergeNotices.Inputs.Strings()
2575 // TOOL_NOTICE should be excluded as it's a host module.
2576 if len(mergeNotices.Inputs) != 3 {
2577 t.Errorf("number of input notice files: expected = 3, actual = %q", noticeInputs)
2578 }
2579 if !inList("APP_NOTICE", noticeInputs) {
2580 t.Errorf("APP_NOTICE is missing from notice files, %q", noticeInputs)
2581 }
2582 if !inList("LIB_NOTICE", noticeInputs) {
2583 t.Errorf("LIB_NOTICE is missing from notice files, %q", noticeInputs)
2584 }
2585 if !inList("GENRULE_NOTICE", noticeInputs) {
2586 t.Errorf("GENRULE_NOTICE is missing from notice files, %q", noticeInputs)
2587 }
2588 // 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 +00002589 res := foo.Output("package-res.apk").RelativeToTop()
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002590 aapt2Flags := res.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002591 e := "-A out/soong/.intermediates/foo/android_common/NOTICE"
2592 android.AssertStringDoesContain(t, "expected.apkPath", aapt2Flags, e)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002593
2594 // bar has NOTICE files to process, but embed_notices is not set.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002595 bar := result.ModuleForTests("bar", "android_common")
2596 res = bar.Output("package-res.apk").RelativeToTop()
Jaewoong Jung98772792019-07-01 17:15:13 -07002597 aapt2Flags = res.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002598 e = "-A out/soong/.intermediates/bar/android_common/NOTICE"
2599 android.AssertStringDoesNotContain(t, "bar shouldn't have the asset dir flag for NOTICE", aapt2Flags, e)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002600
2601 // baz's embed_notice is true, but it doesn't have any NOTICE files.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002602 baz := result.ModuleForTests("baz", "android_common")
Jaewoong Jung98772792019-07-01 17:15:13 -07002603 res = baz.Output("package-res.apk")
2604 aapt2Flags = res.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002605 e = "-A out/soong/.intermediates/baz/android_common/NOTICE"
Jaewoong Jung98772792019-07-01 17:15:13 -07002606 if strings.Contains(aapt2Flags, e) {
2607 t.Errorf("baz shouldn't have the asset dir flag for NOTICE: %q", e)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002608 }
2609}
Colin Cross53a87f52019-06-25 13:35:30 -07002610
2611func TestUncompressDex(t *testing.T) {
2612 testCases := []struct {
2613 name string
2614 bp string
2615
2616 uncompressedPlatform bool
2617 uncompressedUnbundled bool
2618 }{
2619 {
2620 name: "normal",
2621 bp: `
2622 android_app {
2623 name: "foo",
2624 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002625 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002626 }
2627 `,
2628 uncompressedPlatform: true,
2629 uncompressedUnbundled: false,
2630 },
2631 {
2632 name: "use_embedded_dex",
2633 bp: `
2634 android_app {
2635 name: "foo",
2636 use_embedded_dex: true,
2637 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002638 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002639 }
2640 `,
2641 uncompressedPlatform: true,
2642 uncompressedUnbundled: true,
2643 },
2644 {
2645 name: "privileged",
2646 bp: `
2647 android_app {
2648 name: "foo",
2649 privileged: true,
2650 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002651 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002652 }
2653 `,
2654 uncompressedPlatform: true,
2655 uncompressedUnbundled: true,
2656 },
David Srbeckye033cba2020-05-20 22:20:28 +01002657 {
2658 name: "normal_uncompress_dex_true",
2659 bp: `
2660 android_app {
2661 name: "foo",
2662 srcs: ["a.java"],
2663 sdk_version: "current",
2664 uncompress_dex: true,
2665 }
2666 `,
2667 uncompressedPlatform: true,
2668 uncompressedUnbundled: true,
2669 },
2670 {
2671 name: "normal_uncompress_dex_false",
2672 bp: `
2673 android_app {
2674 name: "foo",
2675 srcs: ["a.java"],
2676 sdk_version: "current",
2677 uncompress_dex: false,
2678 }
2679 `,
2680 uncompressedPlatform: false,
2681 uncompressedUnbundled: false,
2682 },
Colin Cross53a87f52019-06-25 13:35:30 -07002683 }
2684
2685 test := func(t *testing.T, bp string, want bool, unbundled bool) {
2686 t.Helper()
2687
Paul Duffin71ae5942021-03-22 15:36:52 +00002688 result := android.GroupFixturePreparers(
2689 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00002690 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00002691 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2692 if unbundled {
2693 variables.Unbundled_build = proptools.BoolPtr(true)
2694 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
2695 }
2696 }),
2697 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07002698
Paul Duffincdb88a92021-03-14 00:36:50 +00002699 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07002700 dex := foo.Rule("r8")
2701 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
2702 aligned := foo.MaybeRule("zipalign").Rule != nil
2703
Paul Duffincdb88a92021-03-14 00:36:50 +00002704 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07002705
Paul Duffincdb88a92021-03-14 00:36:50 +00002706 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07002707 }
2708
2709 for _, tt := range testCases {
2710 t.Run(tt.name, func(t *testing.T) {
2711 t.Run("platform", func(t *testing.T) {
2712 test(t, tt.bp, tt.uncompressedPlatform, false)
2713 })
2714 t.Run("unbundled", func(t *testing.T) {
2715 test(t, tt.bp, tt.uncompressedUnbundled, true)
2716 })
2717 })
2718 }
2719}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002720
2721func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
2722 if expectedValue != "" {
2723 expectedFlag := "--" + flagName + " " + expectedValue
2724 if !strings.Contains(aapt2Flags, expectedFlag) {
2725 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
2726 }
2727 } else {
2728 unexpectedFlag := "--" + flagName
2729 if strings.Contains(aapt2Flags, unexpectedFlag) {
2730 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
2731 }
2732 }
2733}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08002734
Cole Faust9a631312020-10-22 21:05:24 +00002735func TestExportedProguardFlagFiles(t *testing.T) {
2736 ctx, _ := testJava(t, `
2737 android_app {
2738 name: "foo",
2739 sdk_version: "current",
2740 static_libs: ["lib1"],
2741 }
2742
2743 android_library {
2744 name: "lib1",
2745 sdk_version: "current",
2746 optimize: {
2747 proguard_flags_files: ["lib1proguard.cfg"],
2748 }
2749 }
2750 `)
2751
2752 m := ctx.ModuleForTests("foo", "android_common")
2753 hasLib1Proguard := false
2754 for _, s := range m.Rule("java.r8").Implicits.Strings() {
2755 if s == "lib1proguard.cfg" {
2756 hasLib1Proguard = true
2757 break
2758 }
2759 }
2760
2761 if !hasLib1Proguard {
2762 t.Errorf("App does not use library proguard config")
2763 }
2764}