blob: 609ddf1a8756066178a936edb63c157de0de78ab [file] [log] [blame]
Colin Cross3bc7ffa2017-11-22 16:19:37 -08001// Copyright 2017 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package java
16
17import (
Colin Crossd09b0b62018-04-18 11:06:47 -070018 "fmt"
Colin Crossa4f08812018-10-02 22:03:40 -070019 "path/filepath"
Colin Cross3bc7ffa2017-11-22 16:19:37 -080020 "reflect"
Colin Crossb69301e2017-12-01 10:48:26 -080021 "sort"
Colin Crossd09b0b62018-04-18 11:06:47 -070022 "strings"
Colin Cross3bc7ffa2017-11-22 16:19:37 -080023 "testing"
Jaewoong Junga5e5abc2019-04-26 14:31:50 -070024
25 "github.com/google/blueprint/proptools"
26
27 "android/soong/android"
28 "android/soong/cc"
Paul Duffinfb0fe9f2021-03-22 17:31:52 +000029 "android/soong/genrule"
Colin Cross3bc7ffa2017-11-22 16:19:37 -080030)
31
Paul Duffin0ed42d32021-03-13 02:19:32 +000032// testApp runs tests using the javaFixtureFactory
33//
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()
39 result := javaFixtureFactory.RunTestWithBp(t, bp)
40 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 Duffin0ed42d32021-03-13 02:19:32 +000058 result := javaFixtureFactory.Extend(
59 android.FixtureModifyMockFS(func(fs android.MockFS) {
60 for _, file := range resourceFiles {
61 fs[file] = nil
62 }
63 }),
64 ).RunTestWithBp(t, moduleType+` {
Colin Crossa97c5d32018-03-28 14:58:31 -070065 name: "foo",
66 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090067 sdk_version: "current"
Colin Crossa97c5d32018-03-28 14:58:31 -070068 }
69 `)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080070
Paul Duffin0ed42d32021-03-13 02:19:32 +000071 foo := result.ModuleForTests("foo", "android_common")
Colin Cross3bc7ffa2017-11-22 16:19:37 -080072
Colin Cross31656952018-05-24 16:11:20 -070073 var expectedLinkImplicits []string
74
75 manifestFixer := foo.Output("manifest_fixer/AndroidManifest.xml")
76 expectedLinkImplicits = append(expectedLinkImplicits, manifestFixer.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080077
Paul Duffin0ed42d32021-03-13 02:19:32 +000078 frameworkRes := result.ModuleForTests("framework-res", "android_common")
Colin Crossa97c5d32018-03-28 14:58:31 -070079 expectedLinkImplicits = append(expectedLinkImplicits,
80 frameworkRes.Output("package-res.apk").Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080081
Colin Crossa97c5d32018-03-28 14:58:31 -070082 // Test the mapping from input files to compiled output file names
83 compile := foo.Output(compiledResourceFiles[0])
Paul Duffin0ed42d32021-03-13 02:19:32 +000084 android.AssertDeepEquals(t, "aapt2 compile inputs", resourceFiles, compile.Inputs.Strings())
Colin Crossb69301e2017-12-01 10:48:26 -080085
Colin Crossa97c5d32018-03-28 14:58:31 -070086 compiledResourceOutputs := compile.Outputs.Strings()
87 sort.Strings(compiledResourceOutputs)
Colin Crossb69301e2017-12-01 10:48:26 -080088
Colin Crossa97c5d32018-03-28 14:58:31 -070089 expectedLinkImplicits = append(expectedLinkImplicits, compiledResourceOutputs...)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080090
Colin Crossa97c5d32018-03-28 14:58:31 -070091 list := foo.Output("aapt2/res.list")
92 expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080093
Colin Crossa97c5d32018-03-28 14:58:31 -070094 // Check that the link rule uses
Paul Duffin0ed42d32021-03-13 02:19:32 +000095 res := result.ModuleForTests("foo", "android_common").Output("package-res.apk")
96 android.AssertDeepEquals(t, "aapt2 link implicits", expectedLinkImplicits, res.Implicits.Strings())
Colin Crossa97c5d32018-03-28 14:58:31 -070097 })
Colin Cross3bc7ffa2017-11-22 16:19:37 -080098 }
99}
Colin Cross890ff552017-11-30 20:13:19 -0800100
Colin Crosse560c4a2019-03-19 16:03:11 -0700101func TestAppSplits(t *testing.T) {
102 ctx := testApp(t, `
103 android_app {
104 name: "foo",
105 srcs: ["a.java"],
106 package_splits: ["v4", "v7,hdpi"],
Jeongik Cha538c0d02019-07-11 15:54:27 +0900107 sdk_version: "current"
Colin Crosse560c4a2019-03-19 16:03:11 -0700108 }`)
109
110 foo := ctx.ModuleForTests("foo", "android_common")
111
112 expectedOutputs := []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000113 "out/soong/.intermediates/foo/android_common/foo.apk",
114 "out/soong/.intermediates/foo/android_common/foo_v4.apk",
115 "out/soong/.intermediates/foo/android_common/foo_v7_hdpi.apk",
Colin Crosse560c4a2019-03-19 16:03:11 -0700116 }
117 for _, expectedOutput := range expectedOutputs {
118 foo.Output(expectedOutput)
119 }
120
Colin Cross41955e82019-05-29 14:40:35 -0700121 outputFiles, err := foo.Module().(*AndroidApp).OutputFiles("")
122 if err != nil {
123 t.Fatal(err)
124 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000125 android.AssertPathsRelativeToTopEquals(t, `OutputFiles("")`, expectedOutputs, outputFiles)
Colin Crosse560c4a2019-03-19 16:03:11 -0700126}
127
Jeongik Cha538c0d02019-07-11 15:54:27 +0900128func TestPlatformAPIs(t *testing.T) {
129 testJava(t, `
130 android_app {
131 name: "foo",
132 srcs: ["a.java"],
133 platform_apis: true,
134 }
135 `)
136
137 testJava(t, `
138 android_app {
139 name: "foo",
140 srcs: ["a.java"],
141 sdk_version: "current",
142 }
143 `)
144
145 testJavaError(t, "platform_apis must be true when sdk_version is empty.", `
146 android_app {
147 name: "bar",
148 srcs: ["b.java"],
149 }
150 `)
151
152 testJavaError(t, "platform_apis must be false when sdk_version is not empty.", `
153 android_app {
154 name: "bar",
155 srcs: ["b.java"],
156 sdk_version: "system_current",
157 platform_apis: true,
158 }
159 `)
160}
161
Jeongik Chae403e9e2019-12-07 00:16:24 +0900162func TestAndroidAppLinkType(t *testing.T) {
163 testJava(t, `
164 android_app {
165 name: "foo",
166 srcs: ["a.java"],
167 libs: ["bar"],
168 static_libs: ["baz"],
169 platform_apis: true,
170 }
171
172 java_library {
173 name: "bar",
174 sdk_version: "current",
175 srcs: ["b.java"],
176 }
177
178 android_library {
179 name: "baz",
180 sdk_version: "system_current",
181 srcs: ["c.java"],
182 }
183 `)
184
Steven Moreland00298982020-11-17 21:44:36 +0000185 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900186 android_app {
187 name: "foo",
188 srcs: ["a.java"],
189 libs: ["bar"],
190 sdk_version: "current",
191 static_libs: ["baz"],
192 }
193
194 java_library {
195 name: "bar",
196 sdk_version: "current",
197 srcs: ["b.java"],
198 }
199
200 android_library {
201 name: "baz",
202 sdk_version: "system_current",
203 srcs: ["c.java"],
204 }
205 `)
206
207 testJava(t, `
208 android_app {
209 name: "foo",
210 srcs: ["a.java"],
211 libs: ["bar"],
212 sdk_version: "system_current",
213 static_libs: ["baz"],
214 }
215
216 java_library {
217 name: "bar",
218 sdk_version: "current",
219 srcs: ["b.java"],
220 }
221
222 android_library {
223 name: "baz",
224 sdk_version: "system_current",
225 srcs: ["c.java"],
226 }
227 `)
228
Steven Moreland00298982020-11-17 21:44:36 +0000229 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900230 android_app {
231 name: "foo",
232 srcs: ["a.java"],
233 libs: ["bar"],
234 sdk_version: "system_current",
235 static_libs: ["baz"],
236 }
237
238 java_library {
239 name: "bar",
240 sdk_version: "current",
241 srcs: ["b.java"],
242 }
243
244 android_library {
245 name: "baz",
246 srcs: ["c.java"],
247 }
248 `)
249}
250
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100251func TestUpdatableApps(t *testing.T) {
252 testCases := []struct {
253 name string
254 bp string
255 expectedError string
256 }{
257 {
258 name: "Stable public SDK",
259 bp: `android_app {
260 name: "foo",
261 srcs: ["a.java"],
262 sdk_version: "29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100263 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100264 updatable: true,
265 }`,
266 },
267 {
268 name: "Stable system SDK",
269 bp: `android_app {
270 name: "foo",
271 srcs: ["a.java"],
272 sdk_version: "system_29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100273 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100274 updatable: true,
275 }`,
276 },
277 {
278 name: "Current public SDK",
279 bp: `android_app {
280 name: "foo",
281 srcs: ["a.java"],
282 sdk_version: "current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100283 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100284 updatable: true,
285 }`,
286 },
287 {
288 name: "Current system SDK",
289 bp: `android_app {
290 name: "foo",
291 srcs: ["a.java"],
292 sdk_version: "system_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100293 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100294 updatable: true,
295 }`,
296 },
297 {
298 name: "Current module SDK",
299 bp: `android_app {
300 name: "foo",
301 srcs: ["a.java"],
302 sdk_version: "module_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100303 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100304 updatable: true,
305 }`,
306 },
307 {
308 name: "Current core SDK",
309 bp: `android_app {
310 name: "foo",
311 srcs: ["a.java"],
312 sdk_version: "core_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100313 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100314 updatable: true,
315 }`,
316 },
317 {
318 name: "No Platform APIs",
319 bp: `android_app {
320 name: "foo",
321 srcs: ["a.java"],
322 platform_apis: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100323 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100324 updatable: true,
325 }`,
326 expectedError: "Updatable apps must use stable SDKs",
327 },
328 {
329 name: "No Core Platform APIs",
330 bp: `android_app {
331 name: "foo",
332 srcs: ["a.java"],
333 sdk_version: "core_platform",
Artur Satayevf40fc852020-04-16 13:43:02 +0100334 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100335 updatable: true,
336 }`,
337 expectedError: "Updatable apps must use stable SDKs",
338 },
339 {
340 name: "No unspecified APIs",
341 bp: `android_app {
342 name: "foo",
343 srcs: ["a.java"],
344 updatable: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100345 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100346 }`,
347 expectedError: "Updatable apps must use stable SDK",
348 },
Artur Satayevf40fc852020-04-16 13:43:02 +0100349 {
350 name: "Must specify min_sdk_version",
351 bp: `android_app {
352 name: "app_without_min_sdk_version",
353 srcs: ["a.java"],
354 sdk_version: "29",
355 updatable: true,
356 }`,
357 expectedError: "updatable apps must set min_sdk_version.",
358 },
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100359 }
360
361 for _, test := range testCases {
362 t.Run(test.name, func(t *testing.T) {
Paul Duffincdb88a92021-03-14 00:36:50 +0000363 errorHandler := android.FixtureExpectsNoErrors
364 if test.expectedError != "" {
365 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100366 }
Paul Duffincdb88a92021-03-14 00:36:50 +0000367 javaFixtureFactory.
Paul Duffin2645a292021-03-13 02:36:00 +0000368 Extend(FixtureWithPrebuiltApis(map[string][]string{
369 "29": {"foo"},
370 })).
Paul Duffincdb88a92021-03-14 00:36:50 +0000371 ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, test.bp)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100372 })
373 }
374}
375
Jooyung Han749dc692020-04-15 11:03:39 +0900376func TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) {
377 testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+`
378 android_app {
379 name: "foo",
380 srcs: ["a.java"],
381 updatable: true,
382 sdk_version: "current",
383 min_sdk_version: "29",
384 static_libs: ["bar"],
385 }
386
387 java_library {
388 name: "bar",
389 sdk_version: "current",
390 }
391 `)
392}
393
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900394func TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) {
395 testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
396 android_app {
397 name: "foo",
398 srcs: ["a.java"],
399 updatable: true,
400 sdk_version: "current",
401 min_sdk_version: "current",
402 jni_libs: ["libjni"],
403 }
404
405 cc_library {
406 name: "libjni",
407 stl: "none",
408 system_shared_libs: [],
409 sdk_version: "current",
410 }
411 `)
412}
413
414func TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) {
415 bp := cc.GatherRequiredDepsForTest(android.Android) + `
416 android_app {
417 name: "foo",
418 srcs: ["a.java"],
419 updatable: true,
420 sdk_version: "current",
421 min_sdk_version: "29",
422 jni_libs: ["libjni"],
423 }
424
425 cc_library {
426 name: "libjni",
427 stl: "none",
428 system_shared_libs: [],
429 sdk_version: "29",
430 }
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900431 `
432 fs := map[string][]byte{
433 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
434 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil,
435 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil,
436 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil,
437 }
438
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000439 ctx, _ := testJavaWithFS(t, bp, fs)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900440
441 inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
442 var crtbeginFound, crtendFound bool
Dan Albert92fe7402020-07-15 13:33:30 -0700443 expectedCrtBegin := ctx.ModuleForTests("crtbegin_so",
444 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
445 expectedCrtEnd := ctx.ModuleForTests("crtend_so",
446 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
447 implicits := []string{}
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900448 for _, input := range inputs {
Dan Albert92fe7402020-07-15 13:33:30 -0700449 implicits = append(implicits, input.String())
450 if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900451 crtbeginFound = true
Dan Albert92fe7402020-07-15 13:33:30 -0700452 } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900453 crtendFound = true
454 }
455 }
Dan Albert92fe7402020-07-15 13:33:30 -0700456 if !crtbeginFound {
457 t.Error(fmt.Sprintf(
458 "expected implicit with suffix %q, have the following implicits:\n%s",
459 expectedCrtBegin, strings.Join(implicits, "\n")))
460 }
461 if !crtendFound {
462 t.Error(fmt.Sprintf(
463 "expected implicit with suffix %q, have the following implicits:\n%s",
464 expectedCrtEnd, strings.Join(implicits, "\n")))
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900465 }
466}
467
468func TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
469 bp := cc.GatherRequiredDepsForTest(android.Android) + `
470 android_app {
471 name: "foo",
472 srcs: ["a.java"],
473 updatable: true,
474 sdk_version: "current",
475 min_sdk_version: "29", // this APK should support 29
476 jni_libs: ["libjni"],
477 }
478
479 cc_library {
480 name: "libjni",
481 stl: "none",
482 sdk_version: "current",
483 }
484 `
485 testJavaError(t, `"libjni" .*: sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
486}
487
488func TestUpdatableApps_ErrorIfDepSdkVersionIsHigher(t *testing.T) {
489 bp := cc.GatherRequiredDepsForTest(android.Android) + `
490 android_app {
491 name: "foo",
492 srcs: ["a.java"],
493 updatable: true,
494 sdk_version: "current",
495 min_sdk_version: "29", // this APK should support 29
496 jni_libs: ["libjni"],
497 }
498
499 cc_library {
500 name: "libjni",
501 stl: "none",
502 shared_libs: ["libbar"],
503 system_shared_libs: [],
504 sdk_version: "27",
505 }
506
507 cc_library {
508 name: "libbar",
509 stl: "none",
510 system_shared_libs: [],
511 sdk_version: "current",
512 }
513 `
514 testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
515}
516
Colin Cross0ddae7f2019-02-07 15:30:01 -0800517func TestResourceDirs(t *testing.T) {
518 testCases := []struct {
519 name string
520 prop string
521 resources []string
522 }{
523 {
524 name: "no resource_dirs",
525 prop: "",
526 resources: []string{"res/res/values/strings.xml"},
527 },
528 {
529 name: "resource_dirs",
530 prop: `resource_dirs: ["res"]`,
531 resources: []string{"res/res/values/strings.xml"},
532 },
533 {
534 name: "empty resource_dirs",
535 prop: `resource_dirs: []`,
536 resources: nil,
537 },
538 }
539
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000540 fs := android.MockFS{
Colin Cross0ddae7f2019-02-07 15:30:01 -0800541 "res/res/values/strings.xml": nil,
542 }
543
544 bp := `
545 android_app {
546 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900547 sdk_version: "current",
Colin Cross0ddae7f2019-02-07 15:30:01 -0800548 %s
549 }
550 `
551
552 for _, testCase := range testCases {
553 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000554 result := android.GroupFixturePreparers(
555 PrepareForTestWithJavaDefaultModules,
556 PrepareForTestWithOverlayBuildComponents,
557 fs.AddToFixture(),
558 ).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop))
Colin Cross0ddae7f2019-02-07 15:30:01 -0800559
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000560 module := result.ModuleForTests("foo", "android_common")
Colin Cross0ddae7f2019-02-07 15:30:01 -0800561 resourceList := module.MaybeOutput("aapt2/res.list")
562
563 var resources []string
564 if resourceList.Rule != nil {
565 for _, compiledResource := range resourceList.Inputs.Strings() {
566 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
567 }
568 }
569
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000570 android.AssertDeepEquals(t, "resource files", testCase.resources, resources)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800571 })
572 }
573}
574
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800575func TestLibraryAssets(t *testing.T) {
576 bp := `
577 android_app {
578 name: "foo",
579 sdk_version: "current",
580 static_libs: ["lib1", "lib2", "lib3"],
581 }
582
583 android_library {
584 name: "lib1",
585 sdk_version: "current",
586 asset_dirs: ["assets_a"],
587 }
588
589 android_library {
590 name: "lib2",
591 sdk_version: "current",
592 }
593
594 android_library {
595 name: "lib3",
596 sdk_version: "current",
597 static_libs: ["lib4"],
598 }
599
600 android_library {
601 name: "lib4",
602 sdk_version: "current",
603 asset_dirs: ["assets_b"],
604 }
605 `
606
607 testCases := []struct {
608 name string
609 assetFlag string
610 assetPackages []string
611 }{
612 {
613 name: "foo",
614 // lib1 has its own asset. lib3 doesn't have any, but provides lib4's transitively.
615 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000616 "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
617 "out/soong/.intermediates/lib1/android_common/assets.zip",
618 "out/soong/.intermediates/lib3/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800619 },
620 },
621 {
622 name: "lib1",
623 assetFlag: "-A assets_a",
624 },
625 {
626 name: "lib2",
627 },
628 {
629 name: "lib3",
630 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000631 "out/soong/.intermediates/lib3/android_common/aapt2/package-res.apk",
632 "out/soong/.intermediates/lib4/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800633 },
634 },
635 {
636 name: "lib4",
637 assetFlag: "-A assets_b",
638 },
639 }
640 ctx := testApp(t, bp)
641
642 for _, test := range testCases {
643 t.Run(test.name, func(t *testing.T) {
644 m := ctx.ModuleForTests(test.name, "android_common")
645
646 // Check asset flag in aapt2 link flags
647 var aapt2link android.TestingBuildParams
648 if len(test.assetPackages) > 0 {
649 aapt2link = m.Output("aapt2/package-res.apk")
650 } else {
651 aapt2link = m.Output("package-res.apk")
652 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000653 aapt2link = aapt2link.RelativeToTop()
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800654 aapt2Flags := aapt2link.Args["flags"]
655 if test.assetFlag != "" {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000656 android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800657 } else {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000658 android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800659 }
660
661 // Check asset merge rule.
662 if len(test.assetPackages) > 0 {
663 mergeAssets := m.Output("package-res.apk")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000664 android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800665 }
666 })
667 }
668}
669
Colin Crossb014f072021-02-26 14:54:36 -0800670func TestAppJavaResources(t *testing.T) {
671 bp := `
672 android_app {
673 name: "foo",
674 sdk_version: "current",
675 java_resources: ["resources/a"],
676 srcs: ["a.java"],
677 }
678
679 android_app {
680 name: "bar",
681 sdk_version: "current",
682 java_resources: ["resources/a"],
683 }
684 `
685
686 ctx := testApp(t, bp)
687
688 foo := ctx.ModuleForTests("foo", "android_common")
689 fooResources := foo.Output("res/foo.jar")
690 fooDexJar := foo.Output("dex-withres/foo.jar")
691 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
692 fooApk := foo.Rule("combineApk")
693
694 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
695 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
696 }
697
698 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
699 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
700 }
701
702 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
703 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
704 }
705
706 bar := ctx.ModuleForTests("bar", "android_common")
707 barResources := bar.Output("res/bar.jar")
708 barApk := bar.Rule("combineApk")
709
710 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
711 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
712 }
713}
714
Colin Crossbec85302019-02-13 13:15:46 -0800715func TestAndroidResources(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -0800716 testCases := []struct {
717 name string
718 enforceRROTargets []string
719 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -0800720 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -0800721 overlayFiles map[string][]string
722 rroDirs map[string][]string
723 }{
724 {
725 name: "no RRO",
726 enforceRROTargets: nil,
727 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -0800728 resourceFiles: map[string][]string{
729 "foo": nil,
730 "bar": {"bar/res/res/values/strings.xml"},
731 "lib": nil,
732 "lib2": {"lib2/res/res/values/strings.xml"},
733 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800734 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800735 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000736 "out/soong/.intermediates/lib2/android_common/package-res.apk",
737 "out/soong/.intermediates/lib/android_common/package-res.apk",
738 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800739 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800740 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
741 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +0000742 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800743 },
Colin Crossbec85302019-02-13 13:15:46 -0800744 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800745 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
746 "device/vendor/blah/overlay/bar/res/values/strings.xml",
747 },
Colin Crossbec85302019-02-13 13:15:46 -0800748 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000749 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800750 "lib/res/res/values/strings.xml",
751 "device/vendor/blah/overlay/lib/res/values/strings.xml",
752 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800753 },
754 rroDirs: map[string][]string{
755 "foo": nil,
756 "bar": nil,
757 },
758 },
759 {
760 name: "enforce RRO on foo",
761 enforceRROTargets: []string{"foo"},
762 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -0800763 resourceFiles: map[string][]string{
764 "foo": nil,
765 "bar": {"bar/res/res/values/strings.xml"},
766 "lib": nil,
767 "lib2": {"lib2/res/res/values/strings.xml"},
768 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800769 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800770 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000771 "out/soong/.intermediates/lib2/android_common/package-res.apk",
772 "out/soong/.intermediates/lib/android_common/package-res.apk",
773 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800774 "foo/res/res/values/strings.xml",
775 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
776 },
Colin Crossbec85302019-02-13 13:15:46 -0800777 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800778 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
779 "device/vendor/blah/overlay/bar/res/values/strings.xml",
780 },
Colin Crossbec85302019-02-13 13:15:46 -0800781 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000782 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800783 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -0800784 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800785 },
Colin Crossc1c37552019-01-31 11:42:41 -0800786
Colin Cross5c4791c2019-02-01 11:44:44 -0800787 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800788 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000789 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +0000790 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700791 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800792 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800793 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700794 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800795 },
796 },
797 {
798 name: "enforce RRO on all",
799 enforceRROTargets: []string{"*"},
800 enforceRROExcludedOverlays: []string{
801 // Excluding specific apps/res directories also allowed.
802 "device/vendor/blah/static_overlay/foo",
803 "device/vendor/blah/static_overlay/bar/res",
804 },
Colin Crossbec85302019-02-13 13:15:46 -0800805 resourceFiles: map[string][]string{
806 "foo": nil,
807 "bar": {"bar/res/res/values/strings.xml"},
808 "lib": nil,
809 "lib2": {"lib2/res/res/values/strings.xml"},
810 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800811 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800812 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000813 "out/soong/.intermediates/lib2/android_common/package-res.apk",
814 "out/soong/.intermediates/lib/android_common/package-res.apk",
815 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800816 "foo/res/res/values/strings.xml",
817 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
818 },
Colin Crossbec85302019-02-13 13:15:46 -0800819 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
820 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000821 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800822 "lib/res/res/values/strings.xml",
823 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800824 },
825 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800826 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000827 "device:device/vendor/blah/overlay/foo/res",
828 "product:product/vendor/blah/overlay/foo/res",
829 // Lib dep comes after the direct deps
830 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800831 },
Anton Hansson53c88442019-03-18 15:53:16 +0000832 "bar": {"device:device/vendor/blah/overlay/bar/res"},
833 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800834 },
835 },
836 }
837
Anton Hansson53c88442019-03-18 15:53:16 +0000838 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -0800839 "device/vendor/blah/overlay",
840 "device/vendor/blah/overlay2",
841 "device/vendor/blah/static_overlay",
842 }
843
Anton Hansson53c88442019-03-18 15:53:16 +0000844 productResourceOverlays := []string{
845 "product/vendor/blah/overlay",
846 }
847
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000848 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -0800849 "foo/res/res/values/strings.xml": nil,
850 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800851 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -0800852 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800853 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
854 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800855 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800856 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
857 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
858 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +0000859 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800860 }
861
862 bp := `
863 android_app {
864 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900865 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800866 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +0000867 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -0800868 }
869
870 android_app {
871 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900872 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800873 resource_dirs: ["bar/res"],
874 }
Colin Cross6ed7dea2019-01-31 14:44:30 -0800875
876 android_library {
877 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900878 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800879 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -0800880 static_libs: ["lib2"],
881 }
882
883 android_library {
884 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900885 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -0800886 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -0800887 }
Anton Hansson53c88442019-03-18 15:53:16 +0000888
889 // This library has the same resources as lib (should not lead to dupe RROs)
890 android_library {
891 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900892 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +0000893 resource_dirs: ["lib/res"]
894 }
Colin Cross890ff552017-11-30 20:13:19 -0800895 `
896
Colin Cross5c4791c2019-02-01 11:44:44 -0800897 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -0800898 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000899 result := android.GroupFixturePreparers(
900 PrepareForTestWithJavaDefaultModules,
901 PrepareForTestWithOverlayBuildComponents,
902 fs.AddToFixture(),
903 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
904 variables.DeviceResourceOverlays = deviceResourceOverlays
905 variables.ProductResourceOverlays = productResourceOverlays
906 if testCase.enforceRROTargets != nil {
907 variables.EnforceRROTargets = testCase.enforceRROTargets
908 }
909 if testCase.enforceRROExcludedOverlays != nil {
910 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
911 }
912 }),
913 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -0800914
Colin Crossbec85302019-02-13 13:15:46 -0800915 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
916 for _, o := range list {
917 res := module.MaybeOutput(o)
918 if res.Rule != nil {
919 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
920 // verify the inputs to the .arsc.flat rule.
921 files = append(files, res.Inputs.Strings()...)
922 } else {
923 // Otherwise, verify the full path to the output of the other module
924 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +0000925 }
Colin Cross890ff552017-11-30 20:13:19 -0800926 }
Colin Crossbec85302019-02-13 13:15:46 -0800927 return files
Colin Cross890ff552017-11-30 20:13:19 -0800928 }
929
Colin Crossbec85302019-02-13 13:15:46 -0800930 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000931 module := result.ModuleForTests(moduleName, "android_common")
Colin Crossbec85302019-02-13 13:15:46 -0800932 resourceList := module.MaybeOutput("aapt2/res.list")
933 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000934 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +0000935 }
Colin Crossbec85302019-02-13 13:15:46 -0800936 overlayList := module.MaybeOutput("aapt2/overlay.list")
937 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000938 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -0800939 }
940
Anton Hansson53c88442019-03-18 15:53:16 +0000941 for _, d := range module.Module().(AndroidLibraryDependency).ExportedRRODirs() {
942 var prefix string
943 if d.overlayType == device {
944 prefix = "device:"
945 } else if d.overlayType == product {
946 prefix = "product:"
947 } else {
948 t.Fatalf("Unexpected overlayType %d", d.overlayType)
949 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000950 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +0000951 }
Colin Crossbec85302019-02-13 13:15:46 -0800952
953 return resourceFiles, overlayFiles, rroDirs
954 }
955
956 modules := []string{"foo", "bar", "lib", "lib2"}
957 for _, module := range modules {
958 resourceFiles, overlayFiles, rroDirs := getResources(module)
959
960 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
961 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
962 module, testCase.resourceFiles[module], resourceFiles)
963 }
964 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
965 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
966 module, testCase.overlayFiles[module], overlayFiles)
967 }
968 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +0000969 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -0800970 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +0000971 }
Colin Cross890ff552017-11-30 20:13:19 -0800972 }
Colin Cross890ff552017-11-30 20:13:19 -0800973 })
974 }
975}
Colin Crossd09b0b62018-04-18 11:06:47 -0700976
Paul Duffincdb88a92021-03-14 00:36:50 +0000977func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
978 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +0900979 link := foo.Output("package-res.apk")
980 linkFlags := strings.Split(link.Args["flags"], " ")
981 min := android.IndexList("--min-sdk-version", linkFlags)
982 target := android.IndexList("--target-sdk-version", linkFlags)
983
984 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
985 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
986 }
987
988 gotMinSdkVersion := linkFlags[min+1]
989 gotTargetSdkVersion := linkFlags[target+1]
990
Paul Duffincdb88a92021-03-14 00:36:50 +0000991 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +0900992
Paul Duffincdb88a92021-03-14 00:36:50 +0000993 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +0900994}
995
Colin Crossd09b0b62018-04-18 11:06:47 -0700996func TestAppSdkVersion(t *testing.T) {
997 testCases := []struct {
998 name string
999 sdkVersion string
1000 platformSdkInt int
1001 platformSdkCodename string
1002 platformSdkFinal bool
1003 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001004 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001005 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001006 }{
1007 {
1008 name: "current final SDK",
1009 sdkVersion: "current",
1010 platformSdkInt: 27,
1011 platformSdkCodename: "REL",
1012 platformSdkFinal: true,
1013 expectedMinSdkVersion: "27",
1014 },
1015 {
1016 name: "current non-final SDK",
1017 sdkVersion: "current",
1018 platformSdkInt: 27,
1019 platformSdkCodename: "OMR1",
1020 platformSdkFinal: false,
1021 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001022 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001023 },
1024 {
1025 name: "default final SDK",
1026 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001027 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001028 platformSdkInt: 27,
1029 platformSdkCodename: "REL",
1030 platformSdkFinal: true,
1031 expectedMinSdkVersion: "27",
1032 },
1033 {
1034 name: "default non-final SDK",
1035 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001036 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001037 platformSdkInt: 27,
1038 platformSdkCodename: "OMR1",
1039 platformSdkFinal: false,
1040 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001041 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001042 },
1043 {
1044 name: "14",
1045 sdkVersion: "14",
1046 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001047 platformSdkCodename: "S",
1048 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001049 },
1050 }
1051
1052 for _, moduleType := range []string{"android_app", "android_library"} {
1053 for _, test := range testCases {
1054 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001055 platformApiProp := ""
1056 if test.platformApis {
1057 platformApiProp = "platform_apis: true,"
1058 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001059 bp := fmt.Sprintf(`%s {
1060 name: "foo",
1061 srcs: ["a.java"],
1062 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001063 %s
1064 }`, moduleType, test.sdkVersion, platformApiProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001065
Paul Duffincdb88a92021-03-14 00:36:50 +00001066 result := javaFixtureFactory.Extend(
1067 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1068 variables.Platform_sdk_version = &test.platformSdkInt
1069 variables.Platform_sdk_codename = &test.platformSdkCodename
1070 variables.Platform_version_active_codenames = test.activeCodenames
1071 variables.Platform_sdk_final = &test.platformSdkFinal
1072 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001073 FixtureWithPrebuiltApis(map[string][]string{
1074 "14": {"foo"},
1075 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001076 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001077
Paul Duffincdb88a92021-03-14 00:36:50 +00001078 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001079 })
1080 }
1081 }
1082}
Colin Crossa4f08812018-10-02 22:03:40 -07001083
Jeongik Cha219141c2020-08-06 23:00:37 +09001084func TestVendorAppSdkVersion(t *testing.T) {
1085 testCases := []struct {
1086 name string
1087 sdkVersion string
1088 platformSdkInt int
1089 platformSdkCodename string
1090 platformSdkFinal bool
1091 deviceCurrentApiLevelForVendorModules string
1092 expectedMinSdkVersion string
1093 }{
1094 {
1095 name: "current final SDK",
1096 sdkVersion: "current",
1097 platformSdkInt: 29,
1098 platformSdkCodename: "REL",
1099 platformSdkFinal: true,
1100 deviceCurrentApiLevelForVendorModules: "29",
1101 expectedMinSdkVersion: "29",
1102 },
1103 {
1104 name: "current final SDK",
1105 sdkVersion: "current",
1106 platformSdkInt: 29,
1107 platformSdkCodename: "REL",
1108 platformSdkFinal: true,
1109 deviceCurrentApiLevelForVendorModules: "28",
1110 expectedMinSdkVersion: "28",
1111 },
1112 {
1113 name: "current final SDK",
1114 sdkVersion: "current",
1115 platformSdkInt: 29,
1116 platformSdkCodename: "Q",
1117 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001118 deviceCurrentApiLevelForVendorModules: "28",
1119 expectedMinSdkVersion: "28",
1120 },
1121 }
1122
1123 for _, moduleType := range []string{"android_app", "android_library"} {
1124 for _, sdkKind := range []string{"", "system_"} {
1125 for _, test := range testCases {
1126 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1127 bp := fmt.Sprintf(`%s {
1128 name: "foo",
1129 srcs: ["a.java"],
1130 sdk_version: "%s%s",
1131 vendor: true,
1132 }`, moduleType, sdkKind, test.sdkVersion)
1133
Paul Duffincdb88a92021-03-14 00:36:50 +00001134 result := javaFixtureFactory.Extend(
1135 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1136 variables.Platform_sdk_version = &test.platformSdkInt
1137 variables.Platform_sdk_codename = &test.platformSdkCodename
1138 variables.Platform_sdk_final = &test.platformSdkFinal
1139 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1140 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1141 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001142 FixtureWithPrebuiltApis(map[string][]string{
1143 "28": {"foo"},
1144 "29": {"foo"},
1145 "current": {"foo"},
1146 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001147 ).RunTestWithBp(t, bp)
1148
1149 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001150 })
1151 }
1152 }
1153 }
1154}
1155
Paul Duffin50c217c2019-06-12 13:25:22 +01001156func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001157 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001158 cc_library {
1159 name: "libjni",
1160 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001161 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001162 stl: "none",
1163 }
1164
1165 android_test {
1166 name: "test",
1167 sdk_version: "core_platform",
1168 jni_libs: ["libjni"],
1169 }
1170
1171 android_test {
1172 name: "test_first",
1173 sdk_version: "core_platform",
1174 compile_multilib: "first",
1175 jni_libs: ["libjni"],
1176 }
1177
1178 android_test {
1179 name: "test_both",
1180 sdk_version: "core_platform",
1181 compile_multilib: "both",
1182 jni_libs: ["libjni"],
1183 }
1184
1185 android_test {
1186 name: "test_32",
1187 sdk_version: "core_platform",
1188 compile_multilib: "32",
1189 jni_libs: ["libjni"],
1190 }
1191
1192 android_test {
1193 name: "test_64",
1194 sdk_version: "core_platform",
1195 compile_multilib: "64",
1196 jni_libs: ["libjni"],
1197 }
1198 `)
1199
1200 testCases := []struct {
1201 name string
1202 abis []string
1203 }{
1204 {"test", []string{"arm64-v8a"}},
1205 {"test_first", []string{"arm64-v8a"}},
1206 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1207 {"test_32", []string{"armeabi-v7a"}},
1208 {"test_64", []string{"arm64-v8a"}},
1209 }
1210
1211 for _, test := range testCases {
1212 t.Run(test.name, func(t *testing.T) {
1213 app := ctx.ModuleForTests(test.name, "android_common")
1214 jniLibZip := app.Output("jnilibs.zip")
1215 var abis []string
1216 args := strings.Fields(jniLibZip.Args["jarArgs"])
1217 for i := 0; i < len(args); i++ {
1218 if args[i] == "-P" {
1219 abis = append(abis, filepath.Base(args[i+1]))
1220 i++
1221 }
1222 }
1223 if !reflect.DeepEqual(abis, test.abis) {
1224 t.Errorf("want abis %v, got %v", test.abis, abis)
1225 }
1226 })
1227 }
1228}
1229
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001230func TestAppSdkVersionByPartition(t *testing.T) {
1231 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1232 android_app {
1233 name: "foo",
1234 srcs: ["a.java"],
1235 vendor: true,
1236 platform_apis: true,
1237 }
1238 `)
1239
1240 testJava(t, `
1241 android_app {
1242 name: "bar",
1243 srcs: ["b.java"],
1244 platform_apis: true,
1245 }
1246 `)
1247
1248 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001249 bp := `
1250 android_app {
1251 name: "foo",
1252 srcs: ["a.java"],
1253 product_specific: true,
1254 platform_apis: true,
1255 }
1256 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001257
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001258 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001259 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001260 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 +09001261 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001262
1263 android.GroupFixturePreparers(
1264 PrepareForTestWithJavaDefaultModules,
1265 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1266 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
1267 }),
1268 ).
1269 ExtendWithErrorHandler(errorHandler).
1270 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001271 }
1272}
1273
Paul Duffin50c217c2019-06-12 13:25:22 +01001274func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001275 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001276 cc_library {
1277 name: "libjni",
1278 system_shared_libs: [],
1279 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08001280 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001281 }
1282
1283 android_app {
1284 name: "app",
1285 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001286 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001287 }
1288
1289 android_app {
1290 name: "app_noembed",
1291 jni_libs: ["libjni"],
1292 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001293 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001294 }
1295
1296 android_app {
1297 name: "app_embed",
1298 jni_libs: ["libjni"],
1299 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001300 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001301 }
1302
1303 android_test {
1304 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00001305 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001306 jni_libs: ["libjni"],
1307 }
1308
1309 android_test {
1310 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001311 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001312 jni_libs: ["libjni"],
1313 use_embedded_native_libs: false,
1314 }
1315
1316 android_test_helper_app {
1317 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00001318 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001319 jni_libs: ["libjni"],
1320 }
1321
1322 android_test_helper_app {
1323 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001324 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001325 jni_libs: ["libjni"],
1326 use_embedded_native_libs: false,
1327 }
1328 `)
1329
1330 testCases := []struct {
1331 name string
1332 packaged bool
1333 compressed bool
1334 }{
1335 {"app", false, false},
1336 {"app_noembed", false, false},
1337 {"app_embed", true, false},
1338 {"test", true, false},
1339 {"test_noembed", true, true},
1340 {"test_helper", true, false},
1341 {"test_helper_noembed", true, true},
1342 }
1343
1344 for _, test := range testCases {
1345 t.Run(test.name, func(t *testing.T) {
1346 app := ctx.ModuleForTests(test.name, "android_common")
1347 jniLibZip := app.MaybeOutput("jnilibs.zip")
1348 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
1349 t.Errorf("expected jni packaged %v, got %v", w, g)
1350 }
1351
1352 if jniLibZip.Rule != nil {
1353 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
1354 t.Errorf("expected jni compressed %v, got %v", w, g)
1355 }
Colin Crossc511bc52020-04-07 16:50:32 +00001356
1357 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
1358 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
1359 }
Paul Duffin50c217c2019-06-12 13:25:22 +01001360 }
1361 })
1362 }
Colin Cross47fa9d32019-03-26 10:51:39 -07001363}
1364
Colin Cross3c007702020-05-08 11:20:24 -07001365func TestJNISDK(t *testing.T) {
1366 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
1367 cc_library {
1368 name: "libjni",
1369 system_shared_libs: [],
1370 stl: "none",
1371 sdk_version: "current",
1372 }
1373
1374 android_test {
1375 name: "app_platform",
1376 jni_libs: ["libjni"],
1377 platform_apis: true,
1378 }
1379
1380 android_test {
1381 name: "app_sdk",
1382 jni_libs: ["libjni"],
1383 sdk_version: "current",
1384 }
1385
1386 android_test {
1387 name: "app_force_platform",
1388 jni_libs: ["libjni"],
1389 sdk_version: "current",
1390 jni_uses_platform_apis: true,
1391 }
1392
1393 android_test {
1394 name: "app_force_sdk",
1395 jni_libs: ["libjni"],
1396 platform_apis: true,
1397 jni_uses_sdk_apis: true,
1398 }
Colin Crossc2d24052020-05-13 11:05:02 -07001399
1400 cc_library {
1401 name: "libvendorjni",
1402 system_shared_libs: [],
1403 stl: "none",
1404 vendor: true,
1405 }
1406
1407 android_test {
1408 name: "app_vendor",
1409 jni_libs: ["libvendorjni"],
1410 sdk_version: "current",
1411 vendor: true,
1412 }
Colin Cross3c007702020-05-08 11:20:24 -07001413 `)
1414
1415 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07001416 name string
1417 sdkJNI bool
1418 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07001419 }{
Colin Crossc2d24052020-05-13 11:05:02 -07001420 {name: "app_platform"},
1421 {name: "app_sdk", sdkJNI: true},
1422 {name: "app_force_platform"},
1423 {name: "app_force_sdk", sdkJNI: true},
1424 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07001425 }
1426
Colin Crossc2d24052020-05-13 11:05:02 -07001427 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
1428 Output("libjni.so").Output.String()
1429 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
1430 Output("libjni.so").Output.String()
1431 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
1432 Output("libvendorjni.so").Output.String()
1433
Colin Cross3c007702020-05-08 11:20:24 -07001434 for _, test := range testCases {
1435 t.Run(test.name, func(t *testing.T) {
1436 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07001437
1438 jniLibZip := app.MaybeOutput("jnilibs.zip")
1439 if len(jniLibZip.Implicits) != 1 {
1440 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
1441 }
1442 gotJNI := jniLibZip.Implicits[0].String()
1443
1444 if test.sdkJNI {
1445 if gotJNI != sdkJNI {
1446 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
1447 }
Colin Crossc2d24052020-05-13 11:05:02 -07001448 } else if test.vendorJNI {
1449 if gotJNI != vendorJNI {
1450 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
1451 }
Colin Cross3c007702020-05-08 11:20:24 -07001452 } else {
1453 if gotJNI != platformJNI {
1454 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
1455 }
1456 }
1457 })
1458 }
1459
1460 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
1461 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
1462 android_test {
1463 name: "app_platform",
1464 platform_apis: true,
1465 jni_uses_platform_apis: true,
1466 }
1467 `)
1468 })
1469
1470 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
1471 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
1472 android_test {
1473 name: "app_sdk",
1474 sdk_version: "current",
1475 jni_uses_sdk_apis: true,
1476 }
1477 `)
1478 })
1479
1480}
1481
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001482func TestCertificates(t *testing.T) {
1483 testCases := []struct {
1484 name string
1485 bp string
1486 certificateOverride string
Liz Kammere2b27f42020-05-07 13:24:05 -07001487 expectedLineage string
1488 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001489 }{
1490 {
1491 name: "default",
1492 bp: `
1493 android_app {
1494 name: "foo",
1495 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001496 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001497 }
1498 `,
1499 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001500 expectedLineage: "",
1501 expectedCertificate: "build/make/target/product/security/testkey.x509.pem build/make/target/product/security/testkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001502 },
1503 {
1504 name: "module certificate property",
1505 bp: `
1506 android_app {
1507 name: "foo",
1508 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001509 certificate: ":new_certificate",
1510 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001511 }
1512
1513 android_app_certificate {
1514 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001515 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001516 }
1517 `,
1518 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001519 expectedLineage: "",
1520 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001521 },
1522 {
1523 name: "path certificate property",
1524 bp: `
1525 android_app {
1526 name: "foo",
1527 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001528 certificate: "expiredkey",
1529 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001530 }
1531 `,
1532 certificateOverride: "",
Liz Kammere2b27f42020-05-07 13:24:05 -07001533 expectedLineage: "",
1534 expectedCertificate: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001535 },
1536 {
1537 name: "certificate overrides",
1538 bp: `
1539 android_app {
1540 name: "foo",
1541 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001542 certificate: "expiredkey",
1543 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001544 }
1545
1546 android_app_certificate {
1547 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001548 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001549 }
1550 `,
1551 certificateOverride: "foo:new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001552 expectedLineage: "",
1553 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1554 },
1555 {
1556 name: "certificate lineage",
1557 bp: `
1558 android_app {
1559 name: "foo",
1560 srcs: ["a.java"],
1561 certificate: ":new_certificate",
1562 lineage: "lineage.bin",
1563 sdk_version: "current",
1564 }
1565
1566 android_app_certificate {
1567 name: "new_certificate",
1568 certificate: "cert/new_cert",
1569 }
1570 `,
1571 certificateOverride: "",
1572 expectedLineage: "--lineage lineage.bin",
1573 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001574 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001575 {
1576 name: "lineage from filegroup",
1577 bp: `
1578 android_app {
1579 name: "foo",
1580 srcs: ["a.java"],
1581 certificate: ":new_certificate",
1582 lineage: ":lineage_bin",
1583 sdk_version: "current",
1584 }
1585
1586 android_app_certificate {
1587 name: "new_certificate",
1588 certificate: "cert/new_cert",
1589 }
1590
1591 filegroup {
1592 name: "lineage_bin",
1593 srcs: ["lineage.bin"],
1594 }
1595 `,
1596 certificateOverride: "",
1597 expectedLineage: "--lineage lineage.bin",
1598 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
1599 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001600 }
1601
1602 for _, test := range testCases {
1603 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001604 result := android.GroupFixturePreparers(
1605 PrepareForTestWithJavaDefaultModules,
1606 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1607 if test.certificateOverride != "" {
1608 variables.CertificateOverrides = []string{test.certificateOverride}
1609 }
1610 }),
1611 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001612
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001613 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001614
1615 signapk := foo.Output("foo.apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001616 signCertificateFlags := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001617 android.AssertStringEquals(t, "certificates flags", test.expectedCertificate, signCertificateFlags)
Liz Kammere2b27f42020-05-07 13:24:05 -07001618
1619 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001620 android.AssertStringEquals(t, "signing flags", test.expectedLineage, signFlags)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001621 })
1622 }
1623}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001624
Songchun Fan688de9a2020-03-24 20:32:24 -07001625func TestRequestV4SigningFlag(t *testing.T) {
1626 testCases := []struct {
1627 name string
1628 bp string
1629 expected string
1630 }{
1631 {
1632 name: "default",
1633 bp: `
1634 android_app {
1635 name: "foo",
1636 srcs: ["a.java"],
1637 sdk_version: "current",
1638 }
1639 `,
1640 expected: "",
1641 },
1642 {
1643 name: "default",
1644 bp: `
1645 android_app {
1646 name: "foo",
1647 srcs: ["a.java"],
1648 sdk_version: "current",
1649 v4_signature: false,
1650 }
1651 `,
1652 expected: "",
1653 },
1654 {
1655 name: "module certificate property",
1656 bp: `
1657 android_app {
1658 name: "foo",
1659 srcs: ["a.java"],
1660 sdk_version: "current",
1661 v4_signature: true,
1662 }
1663 `,
1664 expected: "--enable-v4",
1665 },
1666 }
1667
1668 for _, test := range testCases {
1669 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001670 result := android.GroupFixturePreparers(
1671 PrepareForTestWithJavaDefaultModules,
1672 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07001673
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001674 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07001675
1676 signapk := foo.Output("foo.apk")
1677 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001678 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07001679 })
1680 }
1681}
1682
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001683func TestPackageNameOverride(t *testing.T) {
1684 testCases := []struct {
1685 name string
1686 bp string
1687 packageNameOverride string
1688 expected []string
1689 }{
1690 {
1691 name: "default",
1692 bp: `
1693 android_app {
1694 name: "foo",
1695 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001696 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001697 }
1698 `,
1699 packageNameOverride: "",
1700 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001701 "out/soong/.intermediates/foo/android_common/foo.apk",
1702 "out/soong/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001703 },
1704 },
1705 {
1706 name: "overridden",
1707 bp: `
1708 android_app {
1709 name: "foo",
1710 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001711 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001712 }
1713 `,
1714 packageNameOverride: "foo:bar",
1715 expected: []string{
1716 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001717 "out/soong/.intermediates/foo/android_common/bar.apk",
1718 "out/soong/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001719 },
1720 },
1721 }
1722
1723 for _, test := range testCases {
1724 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001725 result := android.GroupFixturePreparers(
1726 PrepareForTestWithJavaDefaultModules,
1727 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1728 if test.packageNameOverride != "" {
1729 variables.PackageNameOverrides = []string{test.packageNameOverride}
1730 }
1731 }),
1732 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001733
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001734 foo := result.ModuleForTests("foo", "android_common")
1735
1736 outSoongDir := result.Config.BuildDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001737
1738 outputs := foo.AllOutputs()
1739 outputMap := make(map[string]bool)
1740 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001741 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001742 }
1743 for _, e := range test.expected {
1744 if _, exist := outputMap[e]; !exist {
1745 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
1746 }
1747 }
1748 })
1749 }
1750}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001751
1752func TestInstrumentationTargetOverridden(t *testing.T) {
1753 bp := `
1754 android_app {
1755 name: "foo",
1756 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001757 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001758 }
1759
1760 android_test {
1761 name: "bar",
1762 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001763 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001764 }
1765 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001766
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001767 result := android.GroupFixturePreparers(
1768 PrepareForTestWithJavaDefaultModules,
1769 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1770 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
1771 }),
1772 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001773
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001774 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001775 res := bar.Output("package-res.apk")
1776 aapt2Flags := res.Args["flags"]
1777 e := "--rename-instrumentation-target-package org.dandroid.bp"
1778 if !strings.Contains(aapt2Flags, e) {
1779 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
1780 }
1781}
Jaewoong Jung525443a2019-02-28 15:35:54 -08001782
1783func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001784 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
1785 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08001786 android_app {
1787 name: "foo",
1788 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07001789 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001790 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001791 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001792 }
1793
1794 override_android_app {
1795 name: "bar",
1796 base: "foo",
1797 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001798 lineage: "lineage.bin",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001799 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001800 }
1801
1802 android_app_certificate {
1803 name: "new_certificate",
1804 certificate: "cert/new_cert",
1805 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001806
1807 override_android_app {
1808 name: "baz",
1809 base: "foo",
1810 package_name: "org.dandroid.bp",
1811 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001812
1813 override_android_app {
1814 name: "baz_no_rename_resources",
1815 base: "foo",
1816 package_name: "org.dandroid.bp",
1817 rename_resources_package: false,
1818 }
1819
1820 android_app {
1821 name: "foo_no_rename_resources",
1822 srcs: ["a.java"],
1823 certificate: "expiredkey",
1824 overrides: ["qux"],
1825 rename_resources_package: false,
1826 sdk_version: "current",
1827 }
1828
1829 override_android_app {
1830 name: "baz_base_no_rename_resources",
1831 base: "foo_no_rename_resources",
1832 package_name: "org.dandroid.bp",
1833 }
1834
1835 override_android_app {
1836 name: "baz_override_base_rename_resources",
1837 base: "foo_no_rename_resources",
1838 package_name: "org.dandroid.bp",
1839 rename_resources_package: true,
1840 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08001841 `)
1842
1843 expectedVariants := []struct {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001844 name string
1845 moduleName string
1846 variantName string
1847 apkName string
1848 apkPath string
1849 certFlag string
1850 lineageFlag string
1851 overrides []string
1852 packageFlag string
1853 renameResources bool
1854 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08001855 }{
1856 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001857 name: "foo",
1858 moduleName: "foo",
1859 variantName: "android_common",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001860 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001861 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1862 lineageFlag: "",
1863 overrides: []string{"qux"},
1864 packageFlag: "",
1865 renameResources: false,
1866 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001867 },
1868 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001869 name: "foo",
1870 moduleName: "bar",
1871 variantName: "android_common_bar",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001872 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001873 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
1874 lineageFlag: "--lineage lineage.bin",
1875 overrides: []string{"qux", "foo"},
1876 packageFlag: "",
1877 renameResources: false,
1878 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001879 },
1880 {
Liz Kammer9f9fd022020-06-18 19:44:06 +00001881 name: "foo",
1882 moduleName: "baz",
1883 variantName: "android_common_baz",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001884 apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001885 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1886 lineageFlag: "",
1887 overrides: []string{"qux", "foo"},
1888 packageFlag: "org.dandroid.bp",
1889 renameResources: true,
1890 logging_parent: "",
1891 },
1892 {
1893 name: "foo",
1894 moduleName: "baz_no_rename_resources",
1895 variantName: "android_common_baz_no_rename_resources",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001896 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 +00001897 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1898 lineageFlag: "",
1899 overrides: []string{"qux", "foo"},
1900 packageFlag: "org.dandroid.bp",
1901 renameResources: false,
1902 logging_parent: "",
1903 },
1904 {
1905 name: "foo_no_rename_resources",
1906 moduleName: "baz_base_no_rename_resources",
1907 variantName: "android_common_baz_base_no_rename_resources",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001908 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 +00001909 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1910 lineageFlag: "",
1911 overrides: []string{"qux", "foo_no_rename_resources"},
1912 packageFlag: "org.dandroid.bp",
1913 renameResources: false,
1914 logging_parent: "",
1915 },
1916 {
1917 name: "foo_no_rename_resources",
1918 moduleName: "baz_override_base_rename_resources",
1919 variantName: "android_common_baz_override_base_rename_resources",
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001920 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 +00001921 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1922 lineageFlag: "",
1923 overrides: []string{"qux", "foo_no_rename_resources"},
1924 packageFlag: "org.dandroid.bp",
1925 renameResources: true,
1926 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001927 },
1928 }
1929 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001930 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001931
1932 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001933 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001934
1935 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08001936 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001937 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001938 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07001939
1940 // Check the lineage flags
1941 lineageFlag := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001942 android.AssertStringEquals(t, "signing flags", expected.lineageFlag, lineageFlag)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001943
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001944 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08001945 mod := variant.Module().(*AndroidApp)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001946 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.appProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001947
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001948 // Test Overridable property: Logging_parent
1949 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001950 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001951
Liz Kammer1d5983b2020-05-19 19:15:37 +00001952 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001953 res := variant.Output("package-res.apk")
1954 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00001955 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
1956 expectedPackage := expected.packageFlag
1957 if !expected.renameResources {
1958 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00001959 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001960 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001961 }
1962}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07001963
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001964func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001965 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001966 android_app {
1967 name: "foo",
1968 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001969 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001970 }
1971
1972 override_android_app {
1973 name: "bar",
1974 base: "foo",
1975 package_name: "org.dandroid.bp",
1976 }
1977
1978 android_test {
1979 name: "baz",
1980 srcs: ["b.java"],
1981 instrumentation_for: "foo",
1982 }
1983
1984 android_test {
1985 name: "qux",
1986 srcs: ["b.java"],
1987 instrumentation_for: "bar",
1988 }
1989 `)
1990
1991 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001992 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac").RelativeToTop()
1993 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001994 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
1995 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
1996 }
1997
1998 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001999 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac").RelativeToTop()
2000 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002001 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2002 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2003 }
2004}
2005
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002006func TestOverrideAndroidTest(t *testing.T) {
2007 ctx, _ := testJava(t, `
2008 android_app {
2009 name: "foo",
2010 srcs: ["a.java"],
2011 package_name: "com.android.foo",
2012 sdk_version: "current",
2013 }
2014
2015 override_android_app {
2016 name: "bar",
2017 base: "foo",
2018 package_name: "com.android.bar",
2019 }
2020
2021 android_test {
2022 name: "foo_test",
2023 srcs: ["b.java"],
2024 instrumentation_for: "foo",
2025 }
2026
2027 override_android_test {
2028 name: "bar_test",
2029 base: "foo_test",
2030 package_name: "com.android.bar.test",
2031 instrumentation_for: "bar",
2032 instrumentation_target_package: "com.android.bar",
2033 }
2034 `)
2035
2036 expectedVariants := []struct {
2037 moduleName string
2038 variantName string
2039 apkPath string
2040 overrides []string
2041 targetVariant string
2042 packageFlag string
2043 targetPackageFlag string
2044 }{
2045 {
2046 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002047 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002048 overrides: nil,
2049 targetVariant: "android_common",
2050 packageFlag: "",
2051 targetPackageFlag: "",
2052 },
2053 {
2054 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002055 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002056 overrides: []string{"foo_test"},
2057 targetVariant: "android_common_bar",
2058 packageFlag: "com.android.bar.test",
2059 targetPackageFlag: "com.android.bar",
2060 },
2061 }
2062 for _, expected := range expectedVariants {
2063 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2064
2065 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002066 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002067
2068 // Check if the overrides field values are correctly aggregated.
2069 mod := variant.Module().(*AndroidTest)
2070 if !reflect.DeepEqual(expected.overrides, mod.appProperties.Overrides) {
2071 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
2072 expected.overrides, mod.appProperties.Overrides)
2073 }
2074
2075 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002076 javac := variant.Rule("javac").RelativeToTop()
2077 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002078 if !strings.Contains(javac.Args["classpath"], turbine) {
2079 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2080 }
2081
2082 // Check aapt2 flags.
2083 res := variant.Output("package-res.apk")
2084 aapt2Flags := res.Args["flags"]
2085 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002086 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002087 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2088 }
2089}
2090
Jaewoong Jung39982342020-01-14 10:27:18 -08002091func TestAndroidTest_FixTestConfig(t *testing.T) {
2092 ctx, _ := testJava(t, `
2093 android_app {
2094 name: "foo",
2095 srcs: ["a.java"],
2096 package_name: "com.android.foo",
2097 sdk_version: "current",
2098 }
2099
2100 android_test {
2101 name: "foo_test",
2102 srcs: ["b.java"],
2103 instrumentation_for: "foo",
2104 }
2105
2106 android_test {
2107 name: "bar_test",
2108 srcs: ["b.java"],
2109 package_name: "com.android.bar.test",
2110 instrumentation_for: "foo",
2111 }
2112
2113 override_android_test {
2114 name: "baz_test",
2115 base: "foo_test",
2116 package_name: "com.android.baz.test",
2117 }
2118 `)
2119
2120 testCases := []struct {
2121 moduleName string
2122 variantName string
2123 expectedFlags []string
2124 }{
2125 {
2126 moduleName: "foo_test",
2127 variantName: "android_common",
2128 },
2129 {
2130 moduleName: "bar_test",
2131 variantName: "android_common",
2132 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002133 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002134 "--package-name com.android.bar.test",
2135 },
2136 },
2137 {
2138 moduleName: "foo_test",
2139 variantName: "android_common_baz_test",
2140 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002141 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002142 "--package-name com.android.baz.test",
2143 "--test-file-name baz_test.apk",
2144 },
2145 },
2146 }
2147
2148 for _, test := range testCases {
2149 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002150 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml").RelativeToTop()
Jaewoong Jung39982342020-01-14 10:27:18 -08002151
2152 if len(test.expectedFlags) > 0 {
2153 if params.Rule == nil {
2154 t.Errorf("test_config_fixer was expected to run, but didn't")
2155 } else {
2156 for _, flag := range test.expectedFlags {
2157 if !strings.Contains(params.RuleParams.Command, flag) {
2158 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
2159 }
2160 }
2161 }
2162 } else {
2163 if params.Rule != nil {
2164 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
2165 }
2166 }
2167
2168 }
2169}
2170
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002171func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002172 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002173 cc_library {
2174 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08002175 sdk_version: "current",
2176 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002177 }
2178
2179 android_test {
2180 name: "stl",
2181 jni_libs: ["libjni"],
2182 compile_multilib: "both",
2183 sdk_version: "current",
2184 stl: "c++_shared",
2185 }
2186
2187 android_test {
2188 name: "system",
2189 jni_libs: ["libjni"],
2190 compile_multilib: "both",
2191 sdk_version: "current",
2192 }
2193 `)
2194
2195 testCases := []struct {
2196 name string
2197 jnis []string
2198 }{
2199 {"stl",
2200 []string{
2201 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07002202 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002203 },
2204 },
2205 {"system",
2206 []string{
2207 "libjni.so",
2208 },
2209 },
2210 }
2211
2212 for _, test := range testCases {
2213 t.Run(test.name, func(t *testing.T) {
2214 app := ctx.ModuleForTests(test.name, "android_common")
2215 jniLibZip := app.Output("jnilibs.zip")
2216 var jnis []string
2217 args := strings.Fields(jniLibZip.Args["jarArgs"])
2218 for i := 0; i < len(args); i++ {
2219 if args[i] == "-f" {
2220 jnis = append(jnis, args[i+1])
2221 i += 1
2222 }
2223 }
2224 jnisJoined := strings.Join(jnis, " ")
2225 for _, jni := range test.jnis {
2226 if !strings.Contains(jnisJoined, jni) {
2227 t.Errorf("missing jni %q in %q", jni, jnis)
2228 }
2229 }
2230 })
2231 }
2232}
Colin Cross50ddcc42019-05-16 12:28:22 -07002233
2234func TestUsesLibraries(t *testing.T) {
2235 bp := `
2236 java_sdk_library {
2237 name: "foo",
2238 srcs: ["a.java"],
2239 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002240 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002241 }
2242
2243 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01002244 name: "qux",
2245 srcs: ["a.java"],
2246 api_packages: ["qux"],
2247 sdk_version: "current",
2248 }
2249
2250 java_sdk_library {
2251 name: "quuz",
2252 srcs: ["a.java"],
2253 api_packages: ["quuz"],
2254 sdk_version: "current",
2255 }
2256
2257 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002258 name: "fred",
2259 srcs: ["a.java"],
2260 api_packages: ["fred"],
2261 sdk_version: "current",
2262 }
2263
2264 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07002265 name: "bar",
2266 srcs: ["a.java"],
2267 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002268 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002269 }
2270
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01002271 java_sdk_library {
2272 name: "runtime-library",
2273 srcs: ["a.java"],
2274 sdk_version: "current",
2275 }
2276
2277 java_library {
2278 name: "static-runtime-helper",
2279 srcs: ["a.java"],
2280 libs: ["runtime-library"],
2281 sdk_version: "current",
2282 }
2283
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002284 // A library that has to use "provides_uses_lib", because:
2285 // - it is not an SDK library
2286 // - its library name is different from its module name
2287 java_library {
2288 name: "non-sdk-lib",
2289 provides_uses_lib: "com.non.sdk.lib",
2290 installable: true,
2291 srcs: ["a.java"],
2292 }
2293
Colin Cross50ddcc42019-05-16 12:28:22 -07002294 android_app {
2295 name: "app",
2296 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002297 libs: [
2298 "qux",
2299 "quuz.stubs"
2300 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002301 static_libs: [
2302 "static-runtime-helper",
2303 // statically linked component libraries should not pull their SDK libraries,
2304 // so "fred" should not be added to class loader context
2305 "fred.stubs",
2306 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002307 uses_libs: [
2308 "foo",
2309 "non-sdk-lib"
2310 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002311 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002312 optional_uses_libs: [
2313 "bar",
2314 "baz",
2315 ],
2316 }
2317
2318 android_app_import {
2319 name: "prebuilt",
2320 apk: "prebuilts/apk/app.apk",
2321 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002322 uses_libs: [
2323 "foo",
2324 "non-sdk-lib",
2325 "android.test.runner"
2326 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07002327 optional_uses_libs: [
2328 "bar",
2329 "baz",
2330 ],
2331 }
2332 `
2333
Paul Duffind234b412021-03-12 23:04:46 +00002334 result := javaFixtureFactory.Extend(
Paul Duffin2645a292021-03-13 02:36:00 +00002335 PrepareForTestWithJavaSdkLibraryFiles,
2336 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Paul Duffind234b412021-03-12 23:04:46 +00002337 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2338 variables.MissingUsesLibraries = []string{"baz"}
2339 }),
2340 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07002341
Paul Duffind234b412021-03-12 23:04:46 +00002342 app := result.ModuleForTests("app", "android_common")
2343 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07002344
Paul Duffin859fe962020-05-15 10:20:31 +01002345 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002346 // This should not include explicit `uses_libs`/`optional_uses_libs` entries.
2347 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2348 expectManifestFixerArgs := `--extract-native-libs=true ` +
2349 `--uses-library qux ` +
2350 `--uses-library quuz ` +
2351 `--uses-library foo ` + // TODO(b/132357300): "foo" should not be passed to manifest_fixer
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002352 `--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 +00002353 `--uses-library bar ` + // TODO(b/132357300): "bar" should not be passed to manifest_fixer
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002354 `--uses-library runtime-library`
Paul Duffind234b412021-03-12 23:04:46 +00002355 android.AssertStringEquals(t, "manifest_fixer args", expectManifestFixerArgs, actualManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01002356
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002357 // Test that all libraries are verified (library order matters).
2358 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
2359 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002360 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002361 `--uses-library qux ` +
2362 `--uses-library quuz ` +
2363 `--uses-library runtime-library ` +
2364 `--optional-uses-library bar ` +
2365 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002366 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002367
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002368 // Test that all libraries are verified for an APK (library order matters).
2369 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00002370 verifyApkArgs := `--uses-library foo ` +
2371 `--uses-library com.non.sdk.lib ` +
2372 `--uses-library android.test.runner ` +
2373 `--optional-uses-library bar ` +
2374 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002375 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002376
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002377 // Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002378 cmd := app.Rule("dexpreopt").RuleParams.Command
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002379 w := `--target-context-for-sdk any ` +
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002380 `PCL[/system/framework/qux.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002381 `PCL[/system/framework/quuz.jar]#` +
2382 `PCL[/system/framework/foo.jar]#` +
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002383 `PCL[/system/framework/non-sdk-lib.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002384 `PCL[/system/framework/bar.jar]#` +
2385 `PCL[/system/framework/runtime-library.jar]`
Paul Duffind234b412021-03-12 23:04:46 +00002386 android.AssertStringDoesContain(t, "dexpreopt app cmd args", cmd, w)
Colin Cross50ddcc42019-05-16 12:28:22 -07002387
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002388 // Test conditional context for target SDK version 28.
Paul Duffind234b412021-03-12 23:04:46 +00002389 android.AssertStringDoesContain(t, "dexpreopt app cmd 28", cmd,
2390 `--target-context-for-sdk 28`+
2391 ` PCL[/system/framework/org.apache.http.legacy.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002392
2393 // Test conditional context for target SDK version 29.
Paul Duffind234b412021-03-12 23:04:46 +00002394 android.AssertStringDoesContain(t, "dexpreopt app cmd 29", cmd,
2395 `--target-context-for-sdk 29`+
2396 ` PCL[/system/framework/android.hidl.manager-V1.0-java.jar]`+
2397 `#PCL[/system/framework/android.hidl.base-V1.0-java.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002398
2399 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002400 // "android.test.mock" is absent because "android.test.runner" is not used.
Paul Duffind234b412021-03-12 23:04:46 +00002401 android.AssertStringDoesContain(t, "dexpreopt app cmd 30", cmd,
2402 `--target-context-for-sdk 30`+
2403 ` PCL[/system/framework/android.test.base.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002404
Ulya Trafimovichfc24ad32020-08-19 16:32:54 +01002405 cmd = prebuilt.Rule("dexpreopt").RuleParams.Command
Paul Duffind234b412021-03-12 23:04:46 +00002406 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd", cmd,
2407 `--target-context-for-sdk any`+
2408 ` PCL[/system/framework/foo.jar]`+
2409 `#PCL[/system/framework/non-sdk-lib.jar]`+
2410 `#PCL[/system/framework/android.test.runner.jar]`+
2411 `#PCL[/system/framework/bar.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002412
2413 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002414 // "android.test.mock" is present because "android.test.runner" is used.
Paul Duffind234b412021-03-12 23:04:46 +00002415 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd 30", cmd,
2416 `--target-context-for-sdk 30`+
2417 ` PCL[/system/framework/android.test.base.jar]`+
2418 `#PCL[/system/framework/android.test.mock.jar] `)
Colin Cross50ddcc42019-05-16 12:28:22 -07002419}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002420
2421func TestCodelessApp(t *testing.T) {
2422 testCases := []struct {
2423 name string
2424 bp string
2425 noCode bool
2426 }{
2427 {
2428 name: "normal",
2429 bp: `
2430 android_app {
2431 name: "foo",
2432 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002433 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002434 }
2435 `,
2436 noCode: false,
2437 },
2438 {
2439 name: "app without sources",
2440 bp: `
2441 android_app {
2442 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002443 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002444 }
2445 `,
2446 noCode: true,
2447 },
2448 {
2449 name: "app with libraries",
2450 bp: `
2451 android_app {
2452 name: "foo",
2453 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002454 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002455 }
2456
2457 java_library {
2458 name: "lib",
2459 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002460 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002461 }
2462 `,
2463 noCode: false,
2464 },
2465 {
2466 name: "app with sourceless libraries",
2467 bp: `
2468 android_app {
2469 name: "foo",
2470 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002471 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002472 }
2473
2474 java_library {
2475 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002476 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002477 }
2478 `,
2479 // TODO(jungjw): this should probably be true
2480 noCode: false,
2481 },
2482 }
2483
2484 for _, test := range testCases {
2485 t.Run(test.name, func(t *testing.T) {
2486 ctx := testApp(t, test.bp)
2487
2488 foo := ctx.ModuleForTests("foo", "android_common")
2489 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2490 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
2491 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
2492 }
2493 })
2494 }
2495}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002496
2497func TestEmbedNotice(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002498 result := android.GroupFixturePreparers(
2499 PrepareForTestWithJavaDefaultModules,
2500 cc.PrepareForTestWithCcDefaultModules,
2501 genrule.PrepareForTestWithGenRuleBuildComponents,
2502 android.MockFS{
2503 "APP_NOTICE": nil,
2504 "GENRULE_NOTICE": nil,
2505 "LIB_NOTICE": nil,
2506 "TOOL_NOTICE": nil,
2507 }.AddToFixture(),
2508 ).RunTestWithBp(t, `
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002509 android_app {
2510 name: "foo",
2511 srcs: ["a.java"],
2512 static_libs: ["javalib"],
2513 jni_libs: ["libjni"],
2514 notice: "APP_NOTICE",
2515 embed_notices: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002516 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002517 }
2518
2519 // No embed_notice flag
2520 android_app {
2521 name: "bar",
2522 srcs: ["a.java"],
2523 jni_libs: ["libjni"],
2524 notice: "APP_NOTICE",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002525 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002526 }
2527
2528 // No NOTICE files
2529 android_app {
2530 name: "baz",
2531 srcs: ["a.java"],
2532 embed_notices: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09002533 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002534 }
2535
2536 cc_library {
2537 name: "libjni",
2538 system_shared_libs: [],
2539 stl: "none",
2540 notice: "LIB_NOTICE",
Colin Cross094cde42020-02-15 10:38:00 -08002541 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002542 }
2543
2544 java_library {
2545 name: "javalib",
2546 srcs: [
2547 ":gen",
2548 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002549 sdk_version: "current",
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002550 }
2551
2552 genrule {
2553 name: "gen",
2554 tools: ["gentool"],
2555 out: ["gen.java"],
2556 notice: "GENRULE_NOTICE",
2557 }
2558
2559 java_binary_host {
2560 name: "gentool",
2561 srcs: ["b.java"],
2562 notice: "TOOL_NOTICE",
2563 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002564 `)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002565
2566 // foo has NOTICE files to process, and embed_notices is true.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002567 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002568 // verify merge notices rule.
2569 mergeNotices := foo.Rule("mergeNoticesRule")
2570 noticeInputs := mergeNotices.Inputs.Strings()
2571 // TOOL_NOTICE should be excluded as it's a host module.
2572 if len(mergeNotices.Inputs) != 3 {
2573 t.Errorf("number of input notice files: expected = 3, actual = %q", noticeInputs)
2574 }
2575 if !inList("APP_NOTICE", noticeInputs) {
2576 t.Errorf("APP_NOTICE is missing from notice files, %q", noticeInputs)
2577 }
2578 if !inList("LIB_NOTICE", noticeInputs) {
2579 t.Errorf("LIB_NOTICE is missing from notice files, %q", noticeInputs)
2580 }
2581 if !inList("GENRULE_NOTICE", noticeInputs) {
2582 t.Errorf("GENRULE_NOTICE is missing from notice files, %q", noticeInputs)
2583 }
2584 // 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 +00002585 res := foo.Output("package-res.apk").RelativeToTop()
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002586 aapt2Flags := res.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002587 e := "-A out/soong/.intermediates/foo/android_common/NOTICE"
2588 android.AssertStringDoesContain(t, "expected.apkPath", aapt2Flags, e)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002589
2590 // bar has NOTICE files to process, but embed_notices is not set.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002591 bar := result.ModuleForTests("bar", "android_common")
2592 res = bar.Output("package-res.apk").RelativeToTop()
Jaewoong Jung98772792019-07-01 17:15:13 -07002593 aapt2Flags = res.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002594 e = "-A out/soong/.intermediates/bar/android_common/NOTICE"
2595 android.AssertStringDoesNotContain(t, "bar shouldn't have the asset dir flag for NOTICE", aapt2Flags, e)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002596
2597 // baz's embed_notice is true, but it doesn't have any NOTICE files.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002598 baz := result.ModuleForTests("baz", "android_common")
Jaewoong Jung98772792019-07-01 17:15:13 -07002599 res = baz.Output("package-res.apk")
2600 aapt2Flags = res.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002601 e = "-A out/soong/.intermediates/baz/android_common/NOTICE"
Jaewoong Jung98772792019-07-01 17:15:13 -07002602 if strings.Contains(aapt2Flags, e) {
2603 t.Errorf("baz shouldn't have the asset dir flag for NOTICE: %q", e)
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002604 }
2605}
Colin Cross53a87f52019-06-25 13:35:30 -07002606
2607func TestUncompressDex(t *testing.T) {
2608 testCases := []struct {
2609 name string
2610 bp string
2611
2612 uncompressedPlatform bool
2613 uncompressedUnbundled bool
2614 }{
2615 {
2616 name: "normal",
2617 bp: `
2618 android_app {
2619 name: "foo",
2620 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002621 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002622 }
2623 `,
2624 uncompressedPlatform: true,
2625 uncompressedUnbundled: false,
2626 },
2627 {
2628 name: "use_embedded_dex",
2629 bp: `
2630 android_app {
2631 name: "foo",
2632 use_embedded_dex: true,
2633 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002634 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002635 }
2636 `,
2637 uncompressedPlatform: true,
2638 uncompressedUnbundled: true,
2639 },
2640 {
2641 name: "privileged",
2642 bp: `
2643 android_app {
2644 name: "foo",
2645 privileged: true,
2646 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002647 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002648 }
2649 `,
2650 uncompressedPlatform: true,
2651 uncompressedUnbundled: true,
2652 },
David Srbeckye033cba2020-05-20 22:20:28 +01002653 {
2654 name: "normal_uncompress_dex_true",
2655 bp: `
2656 android_app {
2657 name: "foo",
2658 srcs: ["a.java"],
2659 sdk_version: "current",
2660 uncompress_dex: true,
2661 }
2662 `,
2663 uncompressedPlatform: true,
2664 uncompressedUnbundled: true,
2665 },
2666 {
2667 name: "normal_uncompress_dex_false",
2668 bp: `
2669 android_app {
2670 name: "foo",
2671 srcs: ["a.java"],
2672 sdk_version: "current",
2673 uncompress_dex: false,
2674 }
2675 `,
2676 uncompressedPlatform: false,
2677 uncompressedUnbundled: false,
2678 },
Colin Cross53a87f52019-06-25 13:35:30 -07002679 }
2680
2681 test := func(t *testing.T, bp string, want bool, unbundled bool) {
2682 t.Helper()
2683
Paul Duffincdb88a92021-03-14 00:36:50 +00002684 result := javaFixtureFactory.Extend(
Paul Duffin2645a292021-03-13 02:36:00 +00002685 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00002686 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2687 if unbundled {
2688 variables.Unbundled_build = proptools.BoolPtr(true)
2689 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
2690 }
2691 }),
2692 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07002693
Paul Duffincdb88a92021-03-14 00:36:50 +00002694 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07002695 dex := foo.Rule("r8")
2696 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
2697 aligned := foo.MaybeRule("zipalign").Rule != nil
2698
Paul Duffincdb88a92021-03-14 00:36:50 +00002699 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07002700
Paul Duffincdb88a92021-03-14 00:36:50 +00002701 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07002702 }
2703
2704 for _, tt := range testCases {
2705 t.Run(tt.name, func(t *testing.T) {
2706 t.Run("platform", func(t *testing.T) {
2707 test(t, tt.bp, tt.uncompressedPlatform, false)
2708 })
2709 t.Run("unbundled", func(t *testing.T) {
2710 test(t, tt.bp, tt.uncompressedUnbundled, true)
2711 })
2712 })
2713 }
2714}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002715
2716func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
2717 if expectedValue != "" {
2718 expectedFlag := "--" + flagName + " " + expectedValue
2719 if !strings.Contains(aapt2Flags, expectedFlag) {
2720 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
2721 }
2722 } else {
2723 unexpectedFlag := "--" + flagName
2724 if strings.Contains(aapt2Flags, unexpectedFlag) {
2725 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
2726 }
2727 }
2728}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08002729
Cole Faust9a631312020-10-22 21:05:24 +00002730func TestExportedProguardFlagFiles(t *testing.T) {
2731 ctx, _ := testJava(t, `
2732 android_app {
2733 name: "foo",
2734 sdk_version: "current",
2735 static_libs: ["lib1"],
2736 }
2737
2738 android_library {
2739 name: "lib1",
2740 sdk_version: "current",
2741 optimize: {
2742 proguard_flags_files: ["lib1proguard.cfg"],
2743 }
2744 }
2745 `)
2746
2747 m := ctx.ModuleForTests("foo", "android_common")
2748 hasLib1Proguard := false
2749 for _, s := range m.Rule("java.r8").Implicits.Strings() {
2750 if s == "lib1proguard.cfg" {
2751 hasLib1Proguard = true
2752 break
2753 }
2754 }
2755
2756 if !hasLib1Proguard {
2757 t.Errorf("App does not use library proguard config")
2758 }
2759}