blob: 23635b960b6f2fc7be45e913b698ed639c526159 [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"
Ulya Trafimovich9023b022021-03-22 16:02:28 +000029 "android/soong/dexpreopt"
Colin Cross3bc7ffa2017-11-22 16:19:37 -080030)
31
Paul Duffin71ae5942021-03-22 15:36:52 +000032// testApp runs tests using the prepareForJavaTest
Paul Duffin0ed42d32021-03-13 02:19:32 +000033//
34// See testJava for an explanation as to how to stop using this deprecated method.
35//
36// deprecated
37func testApp(t *testing.T, bp string) *android.TestContext {
38 t.Helper()
Paul Duffin71ae5942021-03-22 15:36:52 +000039 result := prepareForJavaTest.RunTestWithBp(t, bp)
Paul Duffin0ed42d32021-03-13 02:19:32 +000040 return result.TestContext
41}
42
43func TestApp(t *testing.T) {
44 resourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080045 "res/layout/layout.xml",
46 "res/values/strings.xml",
47 "res/values-en-rUS/strings.xml",
48 }
49
Paul Duffin0ed42d32021-03-13 02:19:32 +000050 compiledResourceFiles := []string{
Colin Cross3bc7ffa2017-11-22 16:19:37 -080051 "aapt2/res/layout_layout.xml.flat",
52 "aapt2/res/values_strings.arsc.flat",
53 "aapt2/res/values-en-rUS_strings.arsc.flat",
54 }
Colin Cross3bc7ffa2017-11-22 16:19:37 -080055
Colin Crossa97c5d32018-03-28 14:58:31 -070056 for _, moduleType := range []string{"android_app", "android_library"} {
57 t.Run(moduleType, func(t *testing.T) {
Paul Duffin71ae5942021-03-22 15:36:52 +000058 result := android.GroupFixturePreparers(
59 prepareForJavaTest,
Paul Duffin0ed42d32021-03-13 02:19:32 +000060 android.FixtureModifyMockFS(func(fs android.MockFS) {
61 for _, file := range resourceFiles {
62 fs[file] = nil
63 }
64 }),
65 ).RunTestWithBp(t, moduleType+` {
Colin Crossa97c5d32018-03-28 14:58:31 -070066 name: "foo",
67 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090068 sdk_version: "current"
Colin Crossa97c5d32018-03-28 14:58:31 -070069 }
70 `)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080071
Paul Duffin0ed42d32021-03-13 02:19:32 +000072 foo := result.ModuleForTests("foo", "android_common")
Colin Cross3bc7ffa2017-11-22 16:19:37 -080073
Colin Cross31656952018-05-24 16:11:20 -070074 var expectedLinkImplicits []string
75
76 manifestFixer := foo.Output("manifest_fixer/AndroidManifest.xml")
77 expectedLinkImplicits = append(expectedLinkImplicits, manifestFixer.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080078
Paul Duffin0ed42d32021-03-13 02:19:32 +000079 frameworkRes := result.ModuleForTests("framework-res", "android_common")
Colin Crossa97c5d32018-03-28 14:58:31 -070080 expectedLinkImplicits = append(expectedLinkImplicits,
81 frameworkRes.Output("package-res.apk").Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080082
Colin Crossa97c5d32018-03-28 14:58:31 -070083 // Test the mapping from input files to compiled output file names
84 compile := foo.Output(compiledResourceFiles[0])
Paul Duffin0ed42d32021-03-13 02:19:32 +000085 android.AssertDeepEquals(t, "aapt2 compile inputs", resourceFiles, compile.Inputs.Strings())
Colin Crossb69301e2017-12-01 10:48:26 -080086
Colin Crossa97c5d32018-03-28 14:58:31 -070087 compiledResourceOutputs := compile.Outputs.Strings()
88 sort.Strings(compiledResourceOutputs)
Colin Crossb69301e2017-12-01 10:48:26 -080089
Colin Crossa97c5d32018-03-28 14:58:31 -070090 expectedLinkImplicits = append(expectedLinkImplicits, compiledResourceOutputs...)
Colin Cross3bc7ffa2017-11-22 16:19:37 -080091
Colin Crossa97c5d32018-03-28 14:58:31 -070092 list := foo.Output("aapt2/res.list")
93 expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String())
Colin Cross3bc7ffa2017-11-22 16:19:37 -080094
Colin Crossa97c5d32018-03-28 14:58:31 -070095 // Check that the link rule uses
Paul Duffin0ed42d32021-03-13 02:19:32 +000096 res := result.ModuleForTests("foo", "android_common").Output("package-res.apk")
97 android.AssertDeepEquals(t, "aapt2 link implicits", expectedLinkImplicits, res.Implicits.Strings())
Colin Crossa97c5d32018-03-28 14:58:31 -070098 })
Colin Cross3bc7ffa2017-11-22 16:19:37 -080099 }
100}
Colin Cross890ff552017-11-30 20:13:19 -0800101
Colin Crosse560c4a2019-03-19 16:03:11 -0700102func TestAppSplits(t *testing.T) {
103 ctx := testApp(t, `
104 android_app {
105 name: "foo",
106 srcs: ["a.java"],
107 package_splits: ["v4", "v7,hdpi"],
Jeongik Cha538c0d02019-07-11 15:54:27 +0900108 sdk_version: "current"
Colin Crosse560c4a2019-03-19 16:03:11 -0700109 }`)
110
111 foo := ctx.ModuleForTests("foo", "android_common")
112
113 expectedOutputs := []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000114 "out/soong/.intermediates/foo/android_common/foo.apk",
115 "out/soong/.intermediates/foo/android_common/foo_v4.apk",
116 "out/soong/.intermediates/foo/android_common/foo_v7_hdpi.apk",
Colin Crosse560c4a2019-03-19 16:03:11 -0700117 }
118 for _, expectedOutput := range expectedOutputs {
119 foo.Output(expectedOutput)
120 }
121
Colin Cross41955e82019-05-29 14:40:35 -0700122 outputFiles, err := foo.Module().(*AndroidApp).OutputFiles("")
123 if err != nil {
124 t.Fatal(err)
125 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000126 android.AssertPathsRelativeToTopEquals(t, `OutputFiles("")`, expectedOutputs, outputFiles)
Colin Crosse560c4a2019-03-19 16:03:11 -0700127}
128
Jeongik Cha538c0d02019-07-11 15:54:27 +0900129func TestPlatformAPIs(t *testing.T) {
130 testJava(t, `
131 android_app {
132 name: "foo",
133 srcs: ["a.java"],
134 platform_apis: true,
135 }
136 `)
137
138 testJava(t, `
139 android_app {
140 name: "foo",
141 srcs: ["a.java"],
142 sdk_version: "current",
143 }
144 `)
145
Spandan Das60999342021-11-16 04:15:33 +0000146 testJavaError(t, "This module has conflicting settings. sdk_version is empty, which means that this module is build against platform APIs. However platform_apis is not set to true", `
Jeongik Cha538c0d02019-07-11 15:54:27 +0900147 android_app {
148 name: "bar",
149 srcs: ["b.java"],
150 }
151 `)
152
Spandan Das60999342021-11-16 04:15:33 +0000153 testJavaError(t, "This module has conflicting settings. sdk_version is not empty, which means this module cannot use platform APIs. However platform_apis is set to true.", `
Jeongik Cha538c0d02019-07-11 15:54:27 +0900154 android_app {
155 name: "bar",
156 srcs: ["b.java"],
157 sdk_version: "system_current",
158 platform_apis: true,
159 }
160 `)
161}
162
Jeongik Chae403e9e2019-12-07 00:16:24 +0900163func TestAndroidAppLinkType(t *testing.T) {
164 testJava(t, `
165 android_app {
166 name: "foo",
167 srcs: ["a.java"],
168 libs: ["bar"],
169 static_libs: ["baz"],
170 platform_apis: true,
171 }
172
173 java_library {
174 name: "bar",
175 sdk_version: "current",
176 srcs: ["b.java"],
177 }
178
179 android_library {
180 name: "baz",
181 sdk_version: "system_current",
182 srcs: ["c.java"],
183 }
184 `)
185
Steven Moreland00298982020-11-17 21:44:36 +0000186 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900187 android_app {
188 name: "foo",
189 srcs: ["a.java"],
190 libs: ["bar"],
191 sdk_version: "current",
192 static_libs: ["baz"],
193 }
194
195 java_library {
196 name: "bar",
197 sdk_version: "current",
198 srcs: ["b.java"],
199 }
200
201 android_library {
202 name: "baz",
203 sdk_version: "system_current",
204 srcs: ["c.java"],
205 }
206 `)
207
208 testJava(t, `
209 android_app {
210 name: "foo",
211 srcs: ["a.java"],
212 libs: ["bar"],
213 sdk_version: "system_current",
214 static_libs: ["baz"],
215 }
216
217 java_library {
218 name: "bar",
219 sdk_version: "current",
220 srcs: ["b.java"],
221 }
222
223 android_library {
224 name: "baz",
225 sdk_version: "system_current",
226 srcs: ["c.java"],
227 }
228 `)
229
Steven Moreland00298982020-11-17 21:44:36 +0000230 testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
Jeongik Chae403e9e2019-12-07 00:16:24 +0900231 android_app {
232 name: "foo",
233 srcs: ["a.java"],
234 libs: ["bar"],
235 sdk_version: "system_current",
236 static_libs: ["baz"],
237 }
238
239 java_library {
240 name: "bar",
241 sdk_version: "current",
242 srcs: ["b.java"],
243 }
244
245 android_library {
246 name: "baz",
247 srcs: ["c.java"],
248 }
249 `)
250}
251
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100252func TestUpdatableApps(t *testing.T) {
253 testCases := []struct {
254 name string
255 bp string
256 expectedError string
257 }{
258 {
259 name: "Stable public SDK",
260 bp: `android_app {
261 name: "foo",
262 srcs: ["a.java"],
263 sdk_version: "29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100264 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100265 updatable: true,
266 }`,
267 },
268 {
269 name: "Stable system SDK",
270 bp: `android_app {
271 name: "foo",
272 srcs: ["a.java"],
273 sdk_version: "system_29",
Artur Satayevf40fc852020-04-16 13:43:02 +0100274 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100275 updatable: true,
276 }`,
277 },
278 {
279 name: "Current public SDK",
280 bp: `android_app {
281 name: "foo",
282 srcs: ["a.java"],
283 sdk_version: "current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100284 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100285 updatable: true,
286 }`,
287 },
288 {
289 name: "Current system SDK",
290 bp: `android_app {
291 name: "foo",
292 srcs: ["a.java"],
293 sdk_version: "system_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100294 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100295 updatable: true,
296 }`,
297 },
298 {
299 name: "Current module SDK",
300 bp: `android_app {
301 name: "foo",
302 srcs: ["a.java"],
303 sdk_version: "module_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100304 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100305 updatable: true,
306 }`,
307 },
308 {
309 name: "Current core SDK",
310 bp: `android_app {
311 name: "foo",
312 srcs: ["a.java"],
313 sdk_version: "core_current",
Artur Satayevf40fc852020-04-16 13:43:02 +0100314 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100315 updatable: true,
316 }`,
317 },
318 {
319 name: "No Platform APIs",
320 bp: `android_app {
321 name: "foo",
322 srcs: ["a.java"],
323 platform_apis: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100324 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100325 updatable: true,
326 }`,
327 expectedError: "Updatable apps must use stable SDKs",
328 },
329 {
330 name: "No Core Platform APIs",
331 bp: `android_app {
332 name: "foo",
333 srcs: ["a.java"],
334 sdk_version: "core_platform",
Artur Satayevf40fc852020-04-16 13:43:02 +0100335 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100336 updatable: true,
337 }`,
338 expectedError: "Updatable apps must use stable SDKs",
339 },
340 {
341 name: "No unspecified APIs",
342 bp: `android_app {
343 name: "foo",
344 srcs: ["a.java"],
345 updatable: true,
Artur Satayevf40fc852020-04-16 13:43:02 +0100346 min_sdk_version: "29",
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100347 }`,
348 expectedError: "Updatable apps must use stable SDK",
349 },
Artur Satayevf40fc852020-04-16 13:43:02 +0100350 {
351 name: "Must specify min_sdk_version",
352 bp: `android_app {
353 name: "app_without_min_sdk_version",
354 srcs: ["a.java"],
355 sdk_version: "29",
356 updatable: true,
357 }`,
358 expectedError: "updatable apps must set min_sdk_version.",
359 },
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100360 }
361
362 for _, test := range testCases {
363 t.Run(test.name, func(t *testing.T) {
Paul Duffincdb88a92021-03-14 00:36:50 +0000364 errorHandler := android.FixtureExpectsNoErrors
365 if test.expectedError != "" {
366 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100367 }
Paul Duffin71ae5942021-03-22 15:36:52 +0000368 android.GroupFixturePreparers(
369 prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{
Paul Duffin2645a292021-03-13 02:36:00 +0000370 "29": {"foo"},
371 })).
Paul Duffincdb88a92021-03-14 00:36:50 +0000372 ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, test.bp)
Artur Satayev2db1c3f2020-04-08 19:09:30 +0100373 })
374 }
375}
376
Jooyung Han749dc692020-04-15 11:03:39 +0900377func TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) {
378 testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+`
379 android_app {
380 name: "foo",
381 srcs: ["a.java"],
382 updatable: true,
383 sdk_version: "current",
384 min_sdk_version: "29",
385 static_libs: ["bar"],
386 }
387
388 java_library {
389 name: "bar",
390 sdk_version: "current",
391 }
392 `)
393}
394
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900395func TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) {
396 testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
397 android_app {
398 name: "foo",
399 srcs: ["a.java"],
400 updatable: true,
401 sdk_version: "current",
402 min_sdk_version: "current",
403 jni_libs: ["libjni"],
404 }
405
406 cc_library {
407 name: "libjni",
408 stl: "none",
409 system_shared_libs: [],
410 sdk_version: "current",
411 }
412 `)
413}
414
415func TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) {
416 bp := cc.GatherRequiredDepsForTest(android.Android) + `
417 android_app {
418 name: "foo",
419 srcs: ["a.java"],
420 updatable: true,
421 sdk_version: "current",
422 min_sdk_version: "29",
423 jni_libs: ["libjni"],
424 }
425
426 cc_library {
427 name: "libjni",
428 stl: "none",
429 system_shared_libs: [],
Spandan Das2e8c0442022-05-08 00:39:35 +0000430 sdk_version: "current",
431 min_sdk_version: "29",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900432 }
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900433 `
434 fs := map[string][]byte{
435 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
436 "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil,
437 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil,
438 "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil,
439 }
440
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000441 ctx, _ := testJavaWithFS(t, bp, fs)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900442
443 inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
444 var crtbeginFound, crtendFound bool
Dan Albert92fe7402020-07-15 13:33:30 -0700445 expectedCrtBegin := ctx.ModuleForTests("crtbegin_so",
446 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
447 expectedCrtEnd := ctx.ModuleForTests("crtend_so",
448 "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
449 implicits := []string{}
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900450 for _, input := range inputs {
Dan Albert92fe7402020-07-15 13:33:30 -0700451 implicits = append(implicits, input.String())
452 if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900453 crtbeginFound = true
Dan Albert92fe7402020-07-15 13:33:30 -0700454 } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900455 crtendFound = true
456 }
457 }
Dan Albert92fe7402020-07-15 13:33:30 -0700458 if !crtbeginFound {
459 t.Error(fmt.Sprintf(
460 "expected implicit with suffix %q, have the following implicits:\n%s",
461 expectedCrtBegin, strings.Join(implicits, "\n")))
462 }
463 if !crtendFound {
464 t.Error(fmt.Sprintf(
465 "expected implicit with suffix %q, have the following implicits:\n%s",
466 expectedCrtEnd, strings.Join(implicits, "\n")))
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900467 }
468}
469
470func TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
471 bp := cc.GatherRequiredDepsForTest(android.Android) + `
472 android_app {
473 name: "foo",
474 srcs: ["a.java"],
475 updatable: true,
476 sdk_version: "current",
477 min_sdk_version: "29", // this APK should support 29
478 jni_libs: ["libjni"],
479 }
480
481 cc_library {
482 name: "libjni",
483 stl: "none",
484 sdk_version: "current",
Spandan Das2e8c0442022-05-08 00:39:35 +0000485 min_sdk_version: "current",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900486 }
487 `
Spandan Das2e8c0442022-05-08 00:39:35 +0000488 testJavaError(t, `"libjni" .*: min_sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900489}
490
Spandan Das2e8c0442022-05-08 00:39:35 +0000491func TestUpdatableApps_ErrorIfDepMinSdkVersionIsHigher(t *testing.T) {
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900492 bp := cc.GatherRequiredDepsForTest(android.Android) + `
493 android_app {
494 name: "foo",
495 srcs: ["a.java"],
496 updatable: true,
497 sdk_version: "current",
498 min_sdk_version: "29", // this APK should support 29
499 jni_libs: ["libjni"],
500 }
501
502 cc_library {
503 name: "libjni",
504 stl: "none",
505 shared_libs: ["libbar"],
506 system_shared_libs: [],
507 sdk_version: "27",
Spandan Das2e8c0442022-05-08 00:39:35 +0000508 min_sdk_version: "27",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900509 }
510
511 cc_library {
512 name: "libbar",
513 stl: "none",
514 system_shared_libs: [],
515 sdk_version: "current",
Spandan Das2e8c0442022-05-08 00:39:35 +0000516 min_sdk_version: "current",
Jooyung Hanbbc3fb72020-04-29 14:01:06 +0900517 }
518 `
519 testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
520}
521
Colin Cross0ddae7f2019-02-07 15:30:01 -0800522func TestResourceDirs(t *testing.T) {
523 testCases := []struct {
524 name string
525 prop string
526 resources []string
527 }{
528 {
529 name: "no resource_dirs",
530 prop: "",
531 resources: []string{"res/res/values/strings.xml"},
532 },
533 {
534 name: "resource_dirs",
535 prop: `resource_dirs: ["res"]`,
536 resources: []string{"res/res/values/strings.xml"},
537 },
538 {
539 name: "empty resource_dirs",
540 prop: `resource_dirs: []`,
541 resources: nil,
542 },
543 }
544
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000545 fs := android.MockFS{
Colin Cross0ddae7f2019-02-07 15:30:01 -0800546 "res/res/values/strings.xml": nil,
547 }
548
549 bp := `
550 android_app {
551 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900552 sdk_version: "current",
Colin Cross0ddae7f2019-02-07 15:30:01 -0800553 %s
554 }
555 `
556
557 for _, testCase := range testCases {
558 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000559 result := android.GroupFixturePreparers(
560 PrepareForTestWithJavaDefaultModules,
561 PrepareForTestWithOverlayBuildComponents,
562 fs.AddToFixture(),
563 ).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop))
Colin Cross0ddae7f2019-02-07 15:30:01 -0800564
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000565 module := result.ModuleForTests("foo", "android_common")
Colin Cross0ddae7f2019-02-07 15:30:01 -0800566 resourceList := module.MaybeOutput("aapt2/res.list")
567
568 var resources []string
569 if resourceList.Rule != nil {
570 for _, compiledResource := range resourceList.Inputs.Strings() {
571 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
572 }
573 }
574
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000575 android.AssertDeepEquals(t, "resource files", testCase.resources, resources)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800576 })
577 }
578}
579
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800580func TestLibraryAssets(t *testing.T) {
581 bp := `
582 android_app {
583 name: "foo",
584 sdk_version: "current",
585 static_libs: ["lib1", "lib2", "lib3"],
586 }
587
588 android_library {
589 name: "lib1",
590 sdk_version: "current",
591 asset_dirs: ["assets_a"],
592 }
593
594 android_library {
595 name: "lib2",
596 sdk_version: "current",
597 }
598
599 android_library {
600 name: "lib3",
601 sdk_version: "current",
602 static_libs: ["lib4"],
603 }
604
605 android_library {
606 name: "lib4",
607 sdk_version: "current",
608 asset_dirs: ["assets_b"],
609 }
610 `
611
612 testCases := []struct {
613 name string
614 assetFlag string
615 assetPackages []string
616 }{
617 {
618 name: "foo",
619 // lib1 has its own asset. lib3 doesn't have any, but provides lib4's transitively.
620 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000621 "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
622 "out/soong/.intermediates/lib1/android_common/assets.zip",
623 "out/soong/.intermediates/lib3/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800624 },
625 },
626 {
627 name: "lib1",
628 assetFlag: "-A assets_a",
629 },
630 {
631 name: "lib2",
632 },
633 {
634 name: "lib3",
635 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000636 "out/soong/.intermediates/lib3/android_common/aapt2/package-res.apk",
637 "out/soong/.intermediates/lib4/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800638 },
639 },
640 {
641 name: "lib4",
642 assetFlag: "-A assets_b",
643 },
644 }
645 ctx := testApp(t, bp)
646
647 for _, test := range testCases {
648 t.Run(test.name, func(t *testing.T) {
649 m := ctx.ModuleForTests(test.name, "android_common")
650
651 // Check asset flag in aapt2 link flags
652 var aapt2link android.TestingBuildParams
653 if len(test.assetPackages) > 0 {
654 aapt2link = m.Output("aapt2/package-res.apk")
655 } else {
656 aapt2link = m.Output("package-res.apk")
657 }
Paul Duffina71a67a2021-03-29 00:42:57 +0100658 aapt2link = aapt2link
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800659 aapt2Flags := aapt2link.Args["flags"]
660 if test.assetFlag != "" {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000661 android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800662 } else {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000663 android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800664 }
665
666 // Check asset merge rule.
667 if len(test.assetPackages) > 0 {
668 mergeAssets := m.Output("package-res.apk")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000669 android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800670 }
671 })
672 }
673}
674
Colin Crossb014f072021-02-26 14:54:36 -0800675func TestAppJavaResources(t *testing.T) {
676 bp := `
677 android_app {
678 name: "foo",
679 sdk_version: "current",
680 java_resources: ["resources/a"],
681 srcs: ["a.java"],
682 }
683
684 android_app {
685 name: "bar",
686 sdk_version: "current",
687 java_resources: ["resources/a"],
688 }
689 `
690
691 ctx := testApp(t, bp)
692
693 foo := ctx.ModuleForTests("foo", "android_common")
694 fooResources := foo.Output("res/foo.jar")
695 fooDexJar := foo.Output("dex-withres/foo.jar")
696 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
697 fooApk := foo.Rule("combineApk")
698
699 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
700 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
701 }
702
703 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
704 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
705 }
706
707 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
708 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
709 }
710
711 bar := ctx.ModuleForTests("bar", "android_common")
712 barResources := bar.Output("res/bar.jar")
713 barApk := bar.Rule("combineApk")
714
715 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
716 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
717 }
718}
719
Colin Crossbec85302019-02-13 13:15:46 -0800720func TestAndroidResources(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -0800721 testCases := []struct {
722 name string
723 enforceRROTargets []string
724 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -0800725 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -0800726 overlayFiles map[string][]string
727 rroDirs map[string][]string
728 }{
729 {
730 name: "no RRO",
731 enforceRROTargets: nil,
732 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -0800733 resourceFiles: map[string][]string{
734 "foo": nil,
735 "bar": {"bar/res/res/values/strings.xml"},
736 "lib": nil,
737 "lib2": {"lib2/res/res/values/strings.xml"},
738 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800739 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800740 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000741 "out/soong/.intermediates/lib2/android_common/package-res.apk",
742 "out/soong/.intermediates/lib/android_common/package-res.apk",
743 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800744 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800745 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
746 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +0000747 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -0800748 },
Colin Crossbec85302019-02-13 13:15:46 -0800749 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800750 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
751 "device/vendor/blah/overlay/bar/res/values/strings.xml",
752 },
Colin Crossbec85302019-02-13 13:15:46 -0800753 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000754 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800755 "lib/res/res/values/strings.xml",
756 "device/vendor/blah/overlay/lib/res/values/strings.xml",
757 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800758 },
759 rroDirs: map[string][]string{
760 "foo": nil,
761 "bar": nil,
762 },
763 },
764 {
765 name: "enforce RRO on foo",
766 enforceRROTargets: []string{"foo"},
767 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -0800768 resourceFiles: map[string][]string{
769 "foo": nil,
770 "bar": {"bar/res/res/values/strings.xml"},
771 "lib": nil,
772 "lib2": {"lib2/res/res/values/strings.xml"},
773 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800774 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800775 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000776 "out/soong/.intermediates/lib2/android_common/package-res.apk",
777 "out/soong/.intermediates/lib/android_common/package-res.apk",
778 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800779 "foo/res/res/values/strings.xml",
780 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
781 },
Colin Crossbec85302019-02-13 13:15:46 -0800782 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -0800783 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
784 "device/vendor/blah/overlay/bar/res/values/strings.xml",
785 },
Colin Crossbec85302019-02-13 13:15:46 -0800786 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000787 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800788 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -0800789 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800790 },
Colin Crossc1c37552019-01-31 11:42:41 -0800791
Colin Cross5c4791c2019-02-01 11:44:44 -0800792 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800793 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000794 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +0000795 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700796 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800797 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800798 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700799 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800800 },
801 },
802 {
803 name: "enforce RRO on all",
804 enforceRROTargets: []string{"*"},
805 enforceRROExcludedOverlays: []string{
806 // Excluding specific apps/res directories also allowed.
807 "device/vendor/blah/static_overlay/foo",
808 "device/vendor/blah/static_overlay/bar/res",
809 },
Colin Crossbec85302019-02-13 13:15:46 -0800810 resourceFiles: map[string][]string{
811 "foo": nil,
812 "bar": {"bar/res/res/values/strings.xml"},
813 "lib": nil,
814 "lib2": {"lib2/res/res/values/strings.xml"},
815 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800816 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800817 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000818 "out/soong/.intermediates/lib2/android_common/package-res.apk",
819 "out/soong/.intermediates/lib/android_common/package-res.apk",
820 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800821 "foo/res/res/values/strings.xml",
822 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
823 },
Colin Crossbec85302019-02-13 13:15:46 -0800824 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
825 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000826 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -0800827 "lib/res/res/values/strings.xml",
828 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800829 },
830 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800831 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +0000832 "device:device/vendor/blah/overlay/foo/res",
833 "product:product/vendor/blah/overlay/foo/res",
834 // Lib dep comes after the direct deps
835 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -0800836 },
Anton Hansson53c88442019-03-18 15:53:16 +0000837 "bar": {"device:device/vendor/blah/overlay/bar/res"},
838 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -0800839 },
840 },
841 }
842
Anton Hansson53c88442019-03-18 15:53:16 +0000843 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -0800844 "device/vendor/blah/overlay",
845 "device/vendor/blah/overlay2",
846 "device/vendor/blah/static_overlay",
847 }
848
Anton Hansson53c88442019-03-18 15:53:16 +0000849 productResourceOverlays := []string{
850 "product/vendor/blah/overlay",
851 }
852
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000853 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -0800854 "foo/res/res/values/strings.xml": nil,
855 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800856 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -0800857 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800858 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
859 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -0800860 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800861 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
862 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
863 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +0000864 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -0800865 }
866
867 bp := `
868 android_app {
869 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900870 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800871 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +0000872 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -0800873 }
874
875 android_app {
876 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +0900877 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -0800878 resource_dirs: ["bar/res"],
879 }
Colin Cross6ed7dea2019-01-31 14:44:30 -0800880
881 android_library {
882 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900883 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800884 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -0800885 static_libs: ["lib2"],
886 }
887
888 android_library {
889 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900890 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -0800891 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -0800892 }
Anton Hansson53c88442019-03-18 15:53:16 +0000893
894 // This library has the same resources as lib (should not lead to dupe RROs)
895 android_library {
896 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +0900897 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +0000898 resource_dirs: ["lib/res"]
899 }
Colin Cross890ff552017-11-30 20:13:19 -0800900 `
901
Colin Cross5c4791c2019-02-01 11:44:44 -0800902 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -0800903 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000904 result := android.GroupFixturePreparers(
905 PrepareForTestWithJavaDefaultModules,
906 PrepareForTestWithOverlayBuildComponents,
907 fs.AddToFixture(),
908 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
909 variables.DeviceResourceOverlays = deviceResourceOverlays
910 variables.ProductResourceOverlays = productResourceOverlays
911 if testCase.enforceRROTargets != nil {
912 variables.EnforceRROTargets = testCase.enforceRROTargets
913 }
914 if testCase.enforceRROExcludedOverlays != nil {
915 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
916 }
917 }),
918 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -0800919
Colin Crossbec85302019-02-13 13:15:46 -0800920 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
921 for _, o := range list {
922 res := module.MaybeOutput(o)
923 if res.Rule != nil {
924 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
925 // verify the inputs to the .arsc.flat rule.
926 files = append(files, res.Inputs.Strings()...)
927 } else {
928 // Otherwise, verify the full path to the output of the other module
929 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +0000930 }
Colin Cross890ff552017-11-30 20:13:19 -0800931 }
Colin Crossbec85302019-02-13 13:15:46 -0800932 return files
Colin Cross890ff552017-11-30 20:13:19 -0800933 }
934
Colin Crossbec85302019-02-13 13:15:46 -0800935 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000936 module := result.ModuleForTests(moduleName, "android_common")
Colin Crossbec85302019-02-13 13:15:46 -0800937 resourceList := module.MaybeOutput("aapt2/res.list")
938 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000939 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +0000940 }
Colin Crossbec85302019-02-13 13:15:46 -0800941 overlayList := module.MaybeOutput("aapt2/overlay.list")
942 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000943 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -0800944 }
945
Anton Hansson53c88442019-03-18 15:53:16 +0000946 for _, d := range module.Module().(AndroidLibraryDependency).ExportedRRODirs() {
947 var prefix string
948 if d.overlayType == device {
949 prefix = "device:"
950 } else if d.overlayType == product {
951 prefix = "product:"
952 } else {
953 t.Fatalf("Unexpected overlayType %d", d.overlayType)
954 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000955 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +0000956 }
Colin Crossbec85302019-02-13 13:15:46 -0800957
958 return resourceFiles, overlayFiles, rroDirs
959 }
960
961 modules := []string{"foo", "bar", "lib", "lib2"}
962 for _, module := range modules {
963 resourceFiles, overlayFiles, rroDirs := getResources(module)
964
965 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
966 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
967 module, testCase.resourceFiles[module], resourceFiles)
968 }
969 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
970 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
971 module, testCase.overlayFiles[module], overlayFiles)
972 }
973 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +0000974 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -0800975 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +0000976 }
Colin Cross890ff552017-11-30 20:13:19 -0800977 }
Colin Cross890ff552017-11-30 20:13:19 -0800978 })
979 }
980}
Colin Crossd09b0b62018-04-18 11:06:47 -0700981
Paul Duffincdb88a92021-03-14 00:36:50 +0000982func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
983 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +0900984 link := foo.Output("package-res.apk")
985 linkFlags := strings.Split(link.Args["flags"], " ")
986 min := android.IndexList("--min-sdk-version", linkFlags)
987 target := android.IndexList("--target-sdk-version", linkFlags)
988
989 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
990 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
991 }
992
993 gotMinSdkVersion := linkFlags[min+1]
994 gotTargetSdkVersion := linkFlags[target+1]
995
Paul Duffincdb88a92021-03-14 00:36:50 +0000996 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +0900997
Paul Duffincdb88a92021-03-14 00:36:50 +0000998 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +0900999}
1000
Colin Crossd09b0b62018-04-18 11:06:47 -07001001func TestAppSdkVersion(t *testing.T) {
1002 testCases := []struct {
1003 name string
1004 sdkVersion string
1005 platformSdkInt int
1006 platformSdkCodename string
1007 platformSdkFinal bool
1008 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001009 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001010 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001011 }{
1012 {
1013 name: "current final SDK",
1014 sdkVersion: "current",
1015 platformSdkInt: 27,
1016 platformSdkCodename: "REL",
1017 platformSdkFinal: true,
1018 expectedMinSdkVersion: "27",
1019 },
1020 {
1021 name: "current non-final SDK",
1022 sdkVersion: "current",
1023 platformSdkInt: 27,
1024 platformSdkCodename: "OMR1",
1025 platformSdkFinal: false,
1026 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001027 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001028 },
1029 {
1030 name: "default final SDK",
1031 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001032 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001033 platformSdkInt: 27,
1034 platformSdkCodename: "REL",
1035 platformSdkFinal: true,
1036 expectedMinSdkVersion: "27",
1037 },
1038 {
1039 name: "default non-final SDK",
1040 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001041 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001042 platformSdkInt: 27,
1043 platformSdkCodename: "OMR1",
1044 platformSdkFinal: false,
1045 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001046 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001047 },
1048 {
1049 name: "14",
1050 sdkVersion: "14",
1051 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001052 platformSdkCodename: "S",
1053 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001054 },
1055 }
1056
1057 for _, moduleType := range []string{"android_app", "android_library"} {
1058 for _, test := range testCases {
1059 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001060 platformApiProp := ""
1061 if test.platformApis {
1062 platformApiProp = "platform_apis: true,"
1063 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001064 bp := fmt.Sprintf(`%s {
1065 name: "foo",
1066 srcs: ["a.java"],
1067 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001068 %s
1069 }`, moduleType, test.sdkVersion, platformApiProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001070
Paul Duffin71ae5942021-03-22 15:36:52 +00001071 result := android.GroupFixturePreparers(
1072 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001073 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1074 variables.Platform_sdk_version = &test.platformSdkInt
1075 variables.Platform_sdk_codename = &test.platformSdkCodename
1076 variables.Platform_version_active_codenames = test.activeCodenames
1077 variables.Platform_sdk_final = &test.platformSdkFinal
1078 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001079 FixtureWithPrebuiltApis(map[string][]string{
1080 "14": {"foo"},
1081 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001082 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001083
Paul Duffincdb88a92021-03-14 00:36:50 +00001084 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001085 })
1086 }
1087 }
1088}
Colin Crossa4f08812018-10-02 22:03:40 -07001089
Jeongik Cha219141c2020-08-06 23:00:37 +09001090func TestVendorAppSdkVersion(t *testing.T) {
1091 testCases := []struct {
1092 name string
1093 sdkVersion string
1094 platformSdkInt int
1095 platformSdkCodename string
1096 platformSdkFinal bool
1097 deviceCurrentApiLevelForVendorModules string
1098 expectedMinSdkVersion string
1099 }{
1100 {
1101 name: "current final SDK",
1102 sdkVersion: "current",
1103 platformSdkInt: 29,
1104 platformSdkCodename: "REL",
1105 platformSdkFinal: true,
1106 deviceCurrentApiLevelForVendorModules: "29",
1107 expectedMinSdkVersion: "29",
1108 },
1109 {
1110 name: "current final SDK",
1111 sdkVersion: "current",
1112 platformSdkInt: 29,
1113 platformSdkCodename: "REL",
1114 platformSdkFinal: true,
1115 deviceCurrentApiLevelForVendorModules: "28",
1116 expectedMinSdkVersion: "28",
1117 },
1118 {
1119 name: "current final SDK",
1120 sdkVersion: "current",
1121 platformSdkInt: 29,
1122 platformSdkCodename: "Q",
1123 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001124 deviceCurrentApiLevelForVendorModules: "28",
1125 expectedMinSdkVersion: "28",
1126 },
1127 }
1128
1129 for _, moduleType := range []string{"android_app", "android_library"} {
1130 for _, sdkKind := range []string{"", "system_"} {
1131 for _, test := range testCases {
1132 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1133 bp := fmt.Sprintf(`%s {
1134 name: "foo",
1135 srcs: ["a.java"],
1136 sdk_version: "%s%s",
1137 vendor: true,
1138 }`, moduleType, sdkKind, test.sdkVersion)
1139
Paul Duffin71ae5942021-03-22 15:36:52 +00001140 result := android.GroupFixturePreparers(
1141 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001142 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1143 variables.Platform_sdk_version = &test.platformSdkInt
1144 variables.Platform_sdk_codename = &test.platformSdkCodename
1145 variables.Platform_sdk_final = &test.platformSdkFinal
1146 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1147 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1148 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001149 FixtureWithPrebuiltApis(map[string][]string{
1150 "28": {"foo"},
1151 "29": {"foo"},
1152 "current": {"foo"},
1153 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001154 ).RunTestWithBp(t, bp)
1155
1156 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001157 })
1158 }
1159 }
1160 }
1161}
1162
Paul Duffin50c217c2019-06-12 13:25:22 +01001163func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001164 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001165 cc_library {
1166 name: "libjni",
1167 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001168 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001169 stl: "none",
1170 }
1171
1172 android_test {
1173 name: "test",
1174 sdk_version: "core_platform",
1175 jni_libs: ["libjni"],
1176 }
1177
1178 android_test {
1179 name: "test_first",
1180 sdk_version: "core_platform",
1181 compile_multilib: "first",
1182 jni_libs: ["libjni"],
1183 }
1184
1185 android_test {
1186 name: "test_both",
1187 sdk_version: "core_platform",
1188 compile_multilib: "both",
1189 jni_libs: ["libjni"],
1190 }
1191
1192 android_test {
1193 name: "test_32",
1194 sdk_version: "core_platform",
1195 compile_multilib: "32",
1196 jni_libs: ["libjni"],
1197 }
1198
1199 android_test {
1200 name: "test_64",
1201 sdk_version: "core_platform",
1202 compile_multilib: "64",
1203 jni_libs: ["libjni"],
1204 }
1205 `)
1206
1207 testCases := []struct {
1208 name string
1209 abis []string
1210 }{
1211 {"test", []string{"arm64-v8a"}},
1212 {"test_first", []string{"arm64-v8a"}},
1213 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1214 {"test_32", []string{"armeabi-v7a"}},
1215 {"test_64", []string{"arm64-v8a"}},
1216 }
1217
1218 for _, test := range testCases {
1219 t.Run(test.name, func(t *testing.T) {
1220 app := ctx.ModuleForTests(test.name, "android_common")
Sam Delmerico82602492022-06-10 17:05:42 +00001221 jniLibZip := app.Output(jniJarOutputPathString)
Paul Duffin50c217c2019-06-12 13:25:22 +01001222 var abis []string
1223 args := strings.Fields(jniLibZip.Args["jarArgs"])
1224 for i := 0; i < len(args); i++ {
1225 if args[i] == "-P" {
1226 abis = append(abis, filepath.Base(args[i+1]))
1227 i++
1228 }
1229 }
1230 if !reflect.DeepEqual(abis, test.abis) {
1231 t.Errorf("want abis %v, got %v", test.abis, abis)
1232 }
1233 })
1234 }
1235}
1236
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001237func TestAppSdkVersionByPartition(t *testing.T) {
1238 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1239 android_app {
1240 name: "foo",
1241 srcs: ["a.java"],
1242 vendor: true,
1243 platform_apis: true,
1244 }
1245 `)
1246
1247 testJava(t, `
1248 android_app {
1249 name: "bar",
1250 srcs: ["b.java"],
1251 platform_apis: true,
1252 }
1253 `)
1254
1255 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001256 bp := `
1257 android_app {
1258 name: "foo",
1259 srcs: ["a.java"],
1260 product_specific: true,
1261 platform_apis: true,
1262 }
1263 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001264
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001265 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001266 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001267 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 +09001268 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001269
1270 android.GroupFixturePreparers(
1271 PrepareForTestWithJavaDefaultModules,
1272 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1273 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
1274 }),
1275 ).
1276 ExtendWithErrorHandler(errorHandler).
1277 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001278 }
1279}
1280
Paul Duffin50c217c2019-06-12 13:25:22 +01001281func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001282 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001283 cc_library {
1284 name: "libjni",
1285 system_shared_libs: [],
1286 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08001287 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001288 }
1289
1290 android_app {
1291 name: "app",
1292 jni_libs: ["libjni"],
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_noembed",
1298 jni_libs: ["libjni"],
1299 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001300 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001301 }
1302
1303 android_app {
1304 name: "app_embed",
1305 jni_libs: ["libjni"],
1306 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001307 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001308 }
1309
1310 android_test {
1311 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00001312 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001313 jni_libs: ["libjni"],
1314 }
1315
1316 android_test {
1317 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001318 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001319 jni_libs: ["libjni"],
1320 use_embedded_native_libs: false,
1321 }
1322
1323 android_test_helper_app {
1324 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00001325 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001326 jni_libs: ["libjni"],
1327 }
1328
1329 android_test_helper_app {
1330 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001331 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001332 jni_libs: ["libjni"],
1333 use_embedded_native_libs: false,
1334 }
1335 `)
1336
1337 testCases := []struct {
1338 name string
1339 packaged bool
1340 compressed bool
1341 }{
1342 {"app", false, false},
1343 {"app_noembed", false, false},
1344 {"app_embed", true, false},
1345 {"test", true, false},
1346 {"test_noembed", true, true},
1347 {"test_helper", true, false},
1348 {"test_helper_noembed", true, true},
1349 }
1350
1351 for _, test := range testCases {
1352 t.Run(test.name, func(t *testing.T) {
1353 app := ctx.ModuleForTests(test.name, "android_common")
Sam Delmerico82602492022-06-10 17:05:42 +00001354 jniLibZip := app.MaybeOutput(jniJarOutputPathString)
Paul Duffin50c217c2019-06-12 13:25:22 +01001355 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
1356 t.Errorf("expected jni packaged %v, got %v", w, g)
1357 }
1358
1359 if jniLibZip.Rule != nil {
1360 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
1361 t.Errorf("expected jni compressed %v, got %v", w, g)
1362 }
Colin Crossc511bc52020-04-07 16:50:32 +00001363
1364 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
1365 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
1366 }
Paul Duffin50c217c2019-06-12 13:25:22 +01001367 }
1368 })
1369 }
Colin Cross47fa9d32019-03-26 10:51:39 -07001370}
1371
Colin Cross3c007702020-05-08 11:20:24 -07001372func TestJNISDK(t *testing.T) {
1373 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
1374 cc_library {
1375 name: "libjni",
1376 system_shared_libs: [],
1377 stl: "none",
1378 sdk_version: "current",
1379 }
1380
1381 android_test {
1382 name: "app_platform",
1383 jni_libs: ["libjni"],
1384 platform_apis: true,
1385 }
1386
1387 android_test {
1388 name: "app_sdk",
1389 jni_libs: ["libjni"],
1390 sdk_version: "current",
1391 }
1392
1393 android_test {
1394 name: "app_force_platform",
1395 jni_libs: ["libjni"],
1396 sdk_version: "current",
1397 jni_uses_platform_apis: true,
1398 }
1399
1400 android_test {
1401 name: "app_force_sdk",
1402 jni_libs: ["libjni"],
1403 platform_apis: true,
1404 jni_uses_sdk_apis: true,
1405 }
Colin Crossc2d24052020-05-13 11:05:02 -07001406
1407 cc_library {
1408 name: "libvendorjni",
1409 system_shared_libs: [],
1410 stl: "none",
1411 vendor: true,
1412 }
1413
1414 android_test {
1415 name: "app_vendor",
1416 jni_libs: ["libvendorjni"],
1417 sdk_version: "current",
1418 vendor: true,
1419 }
Colin Cross3c007702020-05-08 11:20:24 -07001420 `)
1421
1422 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07001423 name string
1424 sdkJNI bool
1425 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07001426 }{
Colin Crossc2d24052020-05-13 11:05:02 -07001427 {name: "app_platform"},
1428 {name: "app_sdk", sdkJNI: true},
1429 {name: "app_force_platform"},
1430 {name: "app_force_sdk", sdkJNI: true},
1431 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07001432 }
1433
Colin Crossc2d24052020-05-13 11:05:02 -07001434 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
1435 Output("libjni.so").Output.String()
1436 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
1437 Output("libjni.so").Output.String()
1438 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
1439 Output("libvendorjni.so").Output.String()
1440
Colin Cross3c007702020-05-08 11:20:24 -07001441 for _, test := range testCases {
1442 t.Run(test.name, func(t *testing.T) {
1443 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07001444
Sam Delmerico82602492022-06-10 17:05:42 +00001445 jniLibZip := app.MaybeOutput(jniJarOutputPathString)
Colin Cross3c007702020-05-08 11:20:24 -07001446 if len(jniLibZip.Implicits) != 1 {
1447 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
1448 }
1449 gotJNI := jniLibZip.Implicits[0].String()
1450
1451 if test.sdkJNI {
1452 if gotJNI != sdkJNI {
1453 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
1454 }
Colin Crossc2d24052020-05-13 11:05:02 -07001455 } else if test.vendorJNI {
1456 if gotJNI != vendorJNI {
1457 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
1458 }
Colin Cross3c007702020-05-08 11:20:24 -07001459 } else {
1460 if gotJNI != platformJNI {
1461 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
1462 }
1463 }
1464 })
1465 }
1466
1467 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
1468 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
1469 android_test {
1470 name: "app_platform",
1471 platform_apis: true,
1472 jni_uses_platform_apis: true,
1473 }
1474 `)
1475 })
1476
1477 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
1478 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
1479 android_test {
1480 name: "app_sdk",
1481 sdk_version: "current",
1482 jni_uses_sdk_apis: true,
1483 }
1484 `)
1485 })
1486
1487}
1488
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001489func TestCertificates(t *testing.T) {
1490 testCases := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001491 name string
1492 bp string
1493 certificateOverride string
1494 expectedCertSigningFlags string
1495 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001496 }{
1497 {
1498 name: "default",
1499 bp: `
1500 android_app {
1501 name: "foo",
1502 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001503 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001504 }
1505 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001506 certificateOverride: "",
1507 expectedCertSigningFlags: "",
1508 expectedCertificate: "build/make/target/product/security/testkey.x509.pem build/make/target/product/security/testkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001509 },
1510 {
1511 name: "module certificate property",
1512 bp: `
1513 android_app {
1514 name: "foo",
1515 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001516 certificate: ":new_certificate",
1517 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001518 }
1519
1520 android_app_certificate {
1521 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001522 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001523 }
1524 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001525 certificateOverride: "",
1526 expectedCertSigningFlags: "",
1527 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001528 },
1529 {
1530 name: "path certificate property",
1531 bp: `
1532 android_app {
1533 name: "foo",
1534 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001535 certificate: "expiredkey",
1536 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001537 }
1538 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001539 certificateOverride: "",
1540 expectedCertSigningFlags: "",
1541 expectedCertificate: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001542 },
1543 {
1544 name: "certificate overrides",
1545 bp: `
1546 android_app {
1547 name: "foo",
1548 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001549 certificate: "expiredkey",
1550 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001551 }
1552
1553 android_app_certificate {
1554 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001555 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001556 }
1557 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001558 certificateOverride: "foo:new_certificate",
1559 expectedCertSigningFlags: "",
1560 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Liz Kammere2b27f42020-05-07 13:24:05 -07001561 },
1562 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001563 name: "certificate signing flags",
Liz Kammere2b27f42020-05-07 13:24:05 -07001564 bp: `
1565 android_app {
1566 name: "foo",
1567 srcs: ["a.java"],
1568 certificate: ":new_certificate",
1569 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001570 rotationMinSdkVersion: "32",
Liz Kammere2b27f42020-05-07 13:24:05 -07001571 sdk_version: "current",
1572 }
1573
1574 android_app_certificate {
1575 name: "new_certificate",
1576 certificate: "cert/new_cert",
1577 }
1578 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001579 certificateOverride: "",
1580 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
1581 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001582 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001583 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001584 name: "cert signing flags from filegroup",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001585 bp: `
1586 android_app {
1587 name: "foo",
1588 srcs: ["a.java"],
1589 certificate: ":new_certificate",
1590 lineage: ":lineage_bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001591 rotationMinSdkVersion: "32",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001592 sdk_version: "current",
1593 }
1594
1595 android_app_certificate {
1596 name: "new_certificate",
1597 certificate: "cert/new_cert",
1598 }
1599
1600 filegroup {
1601 name: "lineage_bin",
1602 srcs: ["lineage.bin"],
1603 }
1604 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001605 certificateOverride: "",
1606 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
1607 expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001608 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001609 }
1610
1611 for _, test := range testCases {
1612 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001613 result := android.GroupFixturePreparers(
1614 PrepareForTestWithJavaDefaultModules,
1615 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1616 if test.certificateOverride != "" {
1617 variables.CertificateOverrides = []string{test.certificateOverride}
1618 }
1619 }),
1620 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001621
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001622 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001623
1624 signapk := foo.Output("foo.apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001625 signCertificateFlags := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001626 android.AssertStringEquals(t, "certificates flags", test.expectedCertificate, signCertificateFlags)
Liz Kammere2b27f42020-05-07 13:24:05 -07001627
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001628 certSigningFlags := signapk.Args["flags"]
1629 android.AssertStringEquals(t, "cert signing flags", test.expectedCertSigningFlags, certSigningFlags)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001630 })
1631 }
1632}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001633
Songchun Fan688de9a2020-03-24 20:32:24 -07001634func TestRequestV4SigningFlag(t *testing.T) {
1635 testCases := []struct {
1636 name string
1637 bp string
1638 expected string
1639 }{
1640 {
1641 name: "default",
1642 bp: `
1643 android_app {
1644 name: "foo",
1645 srcs: ["a.java"],
1646 sdk_version: "current",
1647 }
1648 `,
1649 expected: "",
1650 },
1651 {
1652 name: "default",
1653 bp: `
1654 android_app {
1655 name: "foo",
1656 srcs: ["a.java"],
1657 sdk_version: "current",
1658 v4_signature: false,
1659 }
1660 `,
1661 expected: "",
1662 },
1663 {
1664 name: "module certificate property",
1665 bp: `
1666 android_app {
1667 name: "foo",
1668 srcs: ["a.java"],
1669 sdk_version: "current",
1670 v4_signature: true,
1671 }
1672 `,
1673 expected: "--enable-v4",
1674 },
1675 }
1676
1677 for _, test := range testCases {
1678 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001679 result := android.GroupFixturePreparers(
1680 PrepareForTestWithJavaDefaultModules,
1681 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07001682
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001683 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07001684
1685 signapk := foo.Output("foo.apk")
1686 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001687 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07001688 })
1689 }
1690}
1691
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001692func TestPackageNameOverride(t *testing.T) {
1693 testCases := []struct {
1694 name string
1695 bp string
1696 packageNameOverride string
1697 expected []string
1698 }{
1699 {
1700 name: "default",
1701 bp: `
1702 android_app {
1703 name: "foo",
1704 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001705 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001706 }
1707 `,
1708 packageNameOverride: "",
1709 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001710 "out/soong/.intermediates/foo/android_common/foo.apk",
1711 "out/soong/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001712 },
1713 },
1714 {
Jooyung Han29e2f6d2022-01-08 12:13:59 +09001715 name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001716 bp: `
1717 android_app {
1718 name: "foo",
1719 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001720 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001721 }
1722 `,
1723 packageNameOverride: "foo:bar",
1724 expected: []string{
1725 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001726 "out/soong/.intermediates/foo/android_common/bar.apk",
1727 "out/soong/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001728 },
1729 },
Jooyung Han29e2f6d2022-01-08 12:13:59 +09001730 {
1731 name: "overridden via stem",
1732 bp: `
1733 android_app {
1734 name: "foo",
1735 srcs: ["a.java"],
1736 sdk_version: "current",
1737 stem: "bar",
1738 }
1739 `,
1740 packageNameOverride: "",
1741 expected: []string{
1742 "out/soong/.intermediates/foo/android_common/bar.apk",
1743 "out/soong/target/product/test_device/system/app/bar/bar.apk",
1744 },
1745 },
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001746 }
1747
1748 for _, test := range testCases {
1749 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001750 result := android.GroupFixturePreparers(
1751 PrepareForTestWithJavaDefaultModules,
1752 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1753 if test.packageNameOverride != "" {
1754 variables.PackageNameOverrides = []string{test.packageNameOverride}
1755 }
1756 }),
1757 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001758
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001759 foo := result.ModuleForTests("foo", "android_common")
1760
Lukacs T. Berkifbaf7252021-08-19 09:36:42 +02001761 outSoongDir := result.Config.SoongOutDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001762
1763 outputs := foo.AllOutputs()
1764 outputMap := make(map[string]bool)
1765 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001766 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001767 }
1768 for _, e := range test.expected {
1769 if _, exist := outputMap[e]; !exist {
1770 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
1771 }
1772 }
1773 })
1774 }
1775}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001776
1777func TestInstrumentationTargetOverridden(t *testing.T) {
1778 bp := `
1779 android_app {
1780 name: "foo",
1781 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001782 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001783 }
1784
1785 android_test {
1786 name: "bar",
1787 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001788 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001789 }
1790 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001791
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001792 result := android.GroupFixturePreparers(
1793 PrepareForTestWithJavaDefaultModules,
1794 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1795 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
1796 }),
1797 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001798
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001799 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08001800 res := bar.Output("package-res.apk")
1801 aapt2Flags := res.Args["flags"]
1802 e := "--rename-instrumentation-target-package org.dandroid.bp"
1803 if !strings.Contains(aapt2Flags, e) {
1804 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
1805 }
1806}
Jaewoong Jung525443a2019-02-28 15:35:54 -08001807
1808func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001809 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
1810 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08001811 android_app {
1812 name: "foo",
1813 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07001814 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07001815 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001816 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001817 }
1818
1819 override_android_app {
1820 name: "bar",
1821 base: "foo",
1822 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07001823 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001824 rotationMinSdkVersion: "32",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001825 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001826 }
1827
1828 android_app_certificate {
1829 name: "new_certificate",
1830 certificate: "cert/new_cert",
1831 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001832
1833 override_android_app {
1834 name: "baz",
1835 base: "foo",
1836 package_name: "org.dandroid.bp",
1837 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001838
1839 override_android_app {
1840 name: "baz_no_rename_resources",
1841 base: "foo",
1842 package_name: "org.dandroid.bp",
1843 rename_resources_package: false,
1844 }
1845
1846 android_app {
1847 name: "foo_no_rename_resources",
1848 srcs: ["a.java"],
1849 certificate: "expiredkey",
1850 overrides: ["qux"],
1851 rename_resources_package: false,
1852 sdk_version: "current",
1853 }
1854
1855 override_android_app {
1856 name: "baz_base_no_rename_resources",
1857 base: "foo_no_rename_resources",
1858 package_name: "org.dandroid.bp",
1859 }
1860
1861 override_android_app {
1862 name: "baz_override_base_rename_resources",
1863 base: "foo_no_rename_resources",
1864 package_name: "org.dandroid.bp",
1865 rename_resources_package: true,
1866 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08001867 `)
1868
1869 expectedVariants := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001870 name string
1871 moduleName string
1872 variantName string
1873 apkName string
1874 apkPath string
1875 certFlag string
1876 certSigningFlags string
1877 overrides []string
1878 packageFlag string
1879 renameResources bool
1880 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08001881 }{
1882 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001883 name: "foo",
1884 moduleName: "foo",
1885 variantName: "android_common",
1886 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
1887 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1888 certSigningFlags: "",
1889 overrides: []string{"qux"},
1890 packageFlag: "",
1891 renameResources: false,
1892 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001893 },
1894 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001895 name: "foo",
1896 moduleName: "bar",
1897 variantName: "android_common_bar",
1898 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
1899 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
1900 certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
1901 overrides: []string{"qux", "foo"},
1902 packageFlag: "",
1903 renameResources: false,
1904 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001905 },
1906 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001907 name: "foo",
1908 moduleName: "baz",
1909 variantName: "android_common_baz",
1910 apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk",
1911 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1912 certSigningFlags: "",
1913 overrides: []string{"qux", "foo"},
1914 packageFlag: "org.dandroid.bp",
1915 renameResources: true,
1916 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001917 },
1918 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001919 name: "foo",
1920 moduleName: "baz_no_rename_resources",
1921 variantName: "android_common_baz_no_rename_resources",
1922 apkPath: "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
1923 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1924 certSigningFlags: "",
1925 overrides: []string{"qux", "foo"},
1926 packageFlag: "org.dandroid.bp",
1927 renameResources: false,
1928 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001929 },
1930 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001931 name: "foo_no_rename_resources",
1932 moduleName: "baz_base_no_rename_resources",
1933 variantName: "android_common_baz_base_no_rename_resources",
1934 apkPath: "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
1935 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1936 certSigningFlags: "",
1937 overrides: []string{"qux", "foo_no_rename_resources"},
1938 packageFlag: "org.dandroid.bp",
1939 renameResources: false,
1940 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00001941 },
1942 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001943 name: "foo_no_rename_resources",
1944 moduleName: "baz_override_base_rename_resources",
1945 variantName: "android_common_baz_override_base_rename_resources",
1946 apkPath: "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
1947 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
1948 certSigningFlags: "",
1949 overrides: []string{"qux", "foo_no_rename_resources"},
1950 packageFlag: "org.dandroid.bp",
1951 renameResources: true,
1952 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08001953 },
1954 }
1955 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001956 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001957
1958 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001959 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001960
1961 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08001962 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07001963 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001964 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07001965
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001966 // Check the cert signing flags
1967 certSigningFlags := signapk.Args["flags"]
1968 android.AssertStringEquals(t, "cert signing flags", expected.certSigningFlags, certSigningFlags)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001969
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001970 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08001971 mod := variant.Module().(*AndroidApp)
zhidoua2ce78f2022-02-17 02:33:12 +00001972 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001973
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001974 // Test Overridable property: Logging_parent
1975 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001976 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08001977
Liz Kammer1d5983b2020-05-19 19:15:37 +00001978 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07001979 res := variant.Output("package-res.apk")
1980 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00001981 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
1982 expectedPackage := expected.packageFlag
1983 if !expected.renameResources {
1984 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00001985 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00001986 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08001987 }
1988}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07001989
zhidoua2ce78f2022-02-17 02:33:12 +00001990func TestOverrideAndroidAppOverrides(t *testing.T) {
1991 ctx, _ := testJava(
1992 t, `
1993 android_app {
1994 name: "foo",
1995 srcs: ["a.java"],
1996 sdk_version: "current",
1997 overrides: ["qux"]
1998 }
1999
2000 android_app {
2001 name: "bar",
2002 srcs: ["b.java"],
2003 sdk_version: "current",
2004 overrides: ["foo"]
2005 }
2006
2007 override_android_app {
2008 name: "foo_override",
2009 base: "foo",
2010 overrides: ["bar"]
2011 }
2012 `)
2013
2014 expectedVariants := []struct {
2015 name string
2016 moduleName string
2017 variantName string
2018 overrides []string
2019 }{
2020 {
2021 name: "foo",
2022 moduleName: "foo",
2023 variantName: "android_common",
2024 overrides: []string{"qux"},
2025 },
2026 {
2027 name: "bar",
2028 moduleName: "bar",
2029 variantName: "android_common",
2030 overrides: []string{"foo"},
2031 },
2032 {
2033 name: "foo",
2034 moduleName: "foo_override",
2035 variantName: "android_common_foo_override",
2036 overrides: []string{"bar", "foo"},
2037 },
2038 }
2039 for _, expected := range expectedVariants {
2040 variant := ctx.ModuleForTests(expected.name, expected.variantName)
2041
2042 // Check if the overrides field values are correctly aggregated.
2043 mod := variant.Module().(*AndroidApp)
2044 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2045 }
2046}
2047
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002048func TestOverrideAndroidAppWithPrebuilt(t *testing.T) {
2049 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2050 t, `
2051 android_app {
2052 name: "foo",
2053 srcs: ["a.java"],
2054 sdk_version: "current",
2055 }
2056
2057 override_android_app {
2058 name: "bar",
2059 base: "foo",
2060 }
2061
2062 android_app_import {
2063 name: "bar",
2064 prefer: true,
2065 apk: "bar.apk",
2066 presigned: true,
2067 }
2068 `)
2069
2070 // An app that has an override that also has a prebuilt should not be hidden.
2071 foo := result.ModuleForTests("foo", "android_common")
2072 if foo.Module().IsHideFromMake() {
2073 t.Errorf("expected foo to have HideFromMake false")
2074 }
2075
2076 // An override that also has a prebuilt should be hidden.
2077 barOverride := result.ModuleForTests("foo", "android_common_bar")
2078 if !barOverride.Module().IsHideFromMake() {
2079 t.Errorf("expected bar override variant of foo to have HideFromMake true")
2080 }
2081}
2082
Jooyung Han01d80d82022-01-08 12:16:32 +09002083func TestOverrideAndroidAppStem(t *testing.T) {
2084 ctx, _ := testJava(t, `
2085 android_app {
2086 name: "foo",
2087 srcs: ["a.java"],
2088 sdk_version: "current",
2089 }
2090 override_android_app {
2091 name: "bar",
2092 base: "foo",
2093 }
2094 override_android_app {
2095 name: "baz",
2096 base: "foo",
2097 stem: "baz_stem",
2098 }
2099 android_app {
2100 name: "foo2",
2101 srcs: ["a.java"],
2102 sdk_version: "current",
2103 stem: "foo2_stem",
2104 }
2105 override_android_app {
2106 name: "bar2",
2107 base: "foo2",
2108 }
2109 override_android_app {
2110 name: "baz2",
2111 base: "foo2",
2112 stem: "baz2_stem",
2113 }
2114 `)
2115 for _, expected := range []struct {
2116 moduleName string
2117 variantName string
2118 apkPath string
2119 }{
2120 {
2121 moduleName: "foo",
2122 variantName: "android_common",
2123 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2124 },
2125 {
2126 moduleName: "foo",
2127 variantName: "android_common_bar",
2128 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2129 },
2130 {
2131 moduleName: "foo",
2132 variantName: "android_common_baz",
2133 apkPath: "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk",
2134 },
2135 {
2136 moduleName: "foo2",
2137 variantName: "android_common",
2138 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2139 },
2140 {
2141 moduleName: "foo2",
2142 variantName: "android_common_bar2",
2143 // Note that this may cause the duplicate output error.
2144 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2145 },
2146 {
2147 moduleName: "foo2",
2148 variantName: "android_common_baz2",
2149 apkPath: "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
2150 },
2151 } {
2152 variant := ctx.ModuleForTests(expected.moduleName, expected.variantName)
2153 variant.Output(expected.apkPath)
2154 }
2155}
2156
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002157func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002158 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002159 android_app {
2160 name: "foo",
2161 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002162 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002163 }
2164
2165 override_android_app {
2166 name: "bar",
2167 base: "foo",
2168 package_name: "org.dandroid.bp",
2169 }
2170
2171 android_test {
2172 name: "baz",
2173 srcs: ["b.java"],
2174 instrumentation_for: "foo",
2175 }
2176
2177 android_test {
2178 name: "qux",
2179 srcs: ["b.java"],
2180 instrumentation_for: "bar",
2181 }
2182 `)
2183
2184 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002185 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002186 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002187 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2188 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2189 }
2190
2191 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002192 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002193 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002194 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2195 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2196 }
2197}
2198
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002199func TestOverrideAndroidTest(t *testing.T) {
2200 ctx, _ := testJava(t, `
2201 android_app {
2202 name: "foo",
2203 srcs: ["a.java"],
2204 package_name: "com.android.foo",
2205 sdk_version: "current",
2206 }
2207
2208 override_android_app {
2209 name: "bar",
2210 base: "foo",
2211 package_name: "com.android.bar",
2212 }
2213
2214 android_test {
2215 name: "foo_test",
2216 srcs: ["b.java"],
2217 instrumentation_for: "foo",
2218 }
2219
2220 override_android_test {
2221 name: "bar_test",
2222 base: "foo_test",
2223 package_name: "com.android.bar.test",
2224 instrumentation_for: "bar",
2225 instrumentation_target_package: "com.android.bar",
2226 }
2227 `)
2228
2229 expectedVariants := []struct {
2230 moduleName string
2231 variantName string
2232 apkPath string
2233 overrides []string
2234 targetVariant string
2235 packageFlag string
2236 targetPackageFlag string
2237 }{
2238 {
2239 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002240 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002241 overrides: nil,
2242 targetVariant: "android_common",
2243 packageFlag: "",
2244 targetPackageFlag: "",
2245 },
2246 {
2247 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002248 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002249 overrides: []string{"foo_test"},
2250 targetVariant: "android_common_bar",
2251 packageFlag: "com.android.bar.test",
2252 targetPackageFlag: "com.android.bar",
2253 },
2254 }
2255 for _, expected := range expectedVariants {
2256 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2257
2258 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002259 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002260
2261 // Check if the overrides field values are correctly aggregated.
2262 mod := variant.Module().(*AndroidTest)
zhidoua2ce78f2022-02-17 02:33:12 +00002263 if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002264 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
zhidoua2ce78f2022-02-17 02:33:12 +00002265 expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002266 }
2267
2268 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01002269 javac := variant.Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002270 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002271 if !strings.Contains(javac.Args["classpath"], turbine) {
2272 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2273 }
2274
2275 // Check aapt2 flags.
2276 res := variant.Output("package-res.apk")
2277 aapt2Flags := res.Args["flags"]
2278 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002279 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002280 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2281 }
2282}
2283
Jaewoong Jung39982342020-01-14 10:27:18 -08002284func TestAndroidTest_FixTestConfig(t *testing.T) {
2285 ctx, _ := testJava(t, `
2286 android_app {
2287 name: "foo",
2288 srcs: ["a.java"],
2289 package_name: "com.android.foo",
2290 sdk_version: "current",
2291 }
2292
2293 android_test {
2294 name: "foo_test",
2295 srcs: ["b.java"],
2296 instrumentation_for: "foo",
2297 }
2298
2299 android_test {
2300 name: "bar_test",
2301 srcs: ["b.java"],
2302 package_name: "com.android.bar.test",
2303 instrumentation_for: "foo",
2304 }
2305
2306 override_android_test {
2307 name: "baz_test",
2308 base: "foo_test",
2309 package_name: "com.android.baz.test",
2310 }
2311 `)
2312
2313 testCases := []struct {
2314 moduleName string
2315 variantName string
2316 expectedFlags []string
2317 }{
2318 {
2319 moduleName: "foo_test",
2320 variantName: "android_common",
2321 },
2322 {
2323 moduleName: "bar_test",
2324 variantName: "android_common",
2325 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002326 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002327 "--package-name com.android.bar.test",
2328 },
2329 },
2330 {
2331 moduleName: "foo_test",
2332 variantName: "android_common_baz_test",
2333 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002334 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002335 "--package-name com.android.baz.test",
2336 "--test-file-name baz_test.apk",
2337 },
2338 },
2339 }
2340
2341 for _, test := range testCases {
2342 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01002343 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08002344
2345 if len(test.expectedFlags) > 0 {
2346 if params.Rule == nil {
2347 t.Errorf("test_config_fixer was expected to run, but didn't")
2348 } else {
2349 for _, flag := range test.expectedFlags {
2350 if !strings.Contains(params.RuleParams.Command, flag) {
2351 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
2352 }
2353 }
2354 }
2355 } else {
2356 if params.Rule != nil {
2357 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
2358 }
2359 }
Jaewoong Jung39982342020-01-14 10:27:18 -08002360 }
2361}
2362
Paul Duffin53a70a42022-01-11 14:35:55 +00002363func TestInstrumentationTargetPrebuilt(t *testing.T) {
2364 bp := `
2365 android_app_import {
2366 name: "foo",
2367 apk: "foo.apk",
2368 presigned: true,
2369 }
2370
2371 android_test {
2372 name: "bar",
2373 srcs: ["a.java"],
2374 instrumentation_for: "foo",
2375 sdk_version: "current",
2376 }
2377 `
2378
2379 android.GroupFixturePreparers(
2380 PrepareForTestWithJavaDefaultModules,
2381 ).ExtendWithErrorHandler(
2382 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
2383 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
2384 RunTestWithBp(t, bp)
2385}
2386
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002387func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002388 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002389 cc_library {
2390 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08002391 sdk_version: "current",
2392 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002393 }
2394
2395 android_test {
2396 name: "stl",
2397 jni_libs: ["libjni"],
2398 compile_multilib: "both",
2399 sdk_version: "current",
2400 stl: "c++_shared",
2401 }
2402
2403 android_test {
2404 name: "system",
2405 jni_libs: ["libjni"],
2406 compile_multilib: "both",
2407 sdk_version: "current",
2408 }
2409 `)
2410
2411 testCases := []struct {
2412 name string
2413 jnis []string
2414 }{
2415 {"stl",
2416 []string{
2417 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07002418 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002419 },
2420 },
2421 {"system",
2422 []string{
2423 "libjni.so",
2424 },
2425 },
2426 }
2427
2428 for _, test := range testCases {
2429 t.Run(test.name, func(t *testing.T) {
2430 app := ctx.ModuleForTests(test.name, "android_common")
Sam Delmerico82602492022-06-10 17:05:42 +00002431 jniLibZip := app.Output(jniJarOutputPathString)
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002432 var jnis []string
2433 args := strings.Fields(jniLibZip.Args["jarArgs"])
2434 for i := 0; i < len(args); i++ {
2435 if args[i] == "-f" {
2436 jnis = append(jnis, args[i+1])
2437 i += 1
2438 }
2439 }
2440 jnisJoined := strings.Join(jnis, " ")
2441 for _, jni := range test.jnis {
2442 if !strings.Contains(jnisJoined, jni) {
2443 t.Errorf("missing jni %q in %q", jni, jnis)
2444 }
2445 }
2446 })
2447 }
2448}
Colin Cross50ddcc42019-05-16 12:28:22 -07002449
2450func TestUsesLibraries(t *testing.T) {
2451 bp := `
2452 java_sdk_library {
2453 name: "foo",
2454 srcs: ["a.java"],
2455 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002456 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002457 }
2458
2459 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01002460 name: "qux",
2461 srcs: ["a.java"],
2462 api_packages: ["qux"],
2463 sdk_version: "current",
2464 }
2465
2466 java_sdk_library {
2467 name: "quuz",
2468 srcs: ["a.java"],
2469 api_packages: ["quuz"],
2470 sdk_version: "current",
2471 }
2472
2473 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002474 name: "fred",
2475 srcs: ["a.java"],
2476 api_packages: ["fred"],
2477 sdk_version: "current",
2478 }
2479
2480 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07002481 name: "bar",
2482 srcs: ["a.java"],
2483 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002484 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002485 }
2486
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01002487 java_sdk_library {
2488 name: "runtime-library",
2489 srcs: ["a.java"],
2490 sdk_version: "current",
2491 }
2492
2493 java_library {
2494 name: "static-runtime-helper",
2495 srcs: ["a.java"],
2496 libs: ["runtime-library"],
2497 sdk_version: "current",
2498 }
2499
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002500 java_library {
2501 name: "runtime-required-x",
2502 srcs: ["a.java"],
2503 installable: true,
2504 sdk_version: "current",
2505 }
2506
2507 java_library {
2508 name: "runtime-optional-x",
2509 srcs: ["a.java"],
2510 installable: true,
2511 sdk_version: "current",
2512 }
2513
2514 android_library {
2515 name: "static-x",
2516 uses_libs: ["runtime-required-x"],
2517 optional_uses_libs: ["runtime-optional-x"],
2518 sdk_version: "current",
2519 }
2520
2521 java_library {
2522 name: "runtime-required-y",
2523 srcs: ["a.java"],
2524 installable: true,
2525 sdk_version: "current",
2526 }
2527
2528 java_library {
2529 name: "runtime-optional-y",
2530 srcs: ["a.java"],
2531 installable: true,
2532 sdk_version: "current",
2533 }
2534
2535 java_library {
2536 name: "static-y",
2537 srcs: ["a.java"],
2538 uses_libs: ["runtime-required-y"],
2539 optional_uses_libs: ["runtime-optional-y"],
2540 sdk_version: "current",
2541 }
2542
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002543 // A library that has to use "provides_uses_lib", because:
2544 // - it is not an SDK library
2545 // - its library name is different from its module name
2546 java_library {
2547 name: "non-sdk-lib",
2548 provides_uses_lib: "com.non.sdk.lib",
2549 installable: true,
2550 srcs: ["a.java"],
2551 }
2552
Colin Cross50ddcc42019-05-16 12:28:22 -07002553 android_app {
2554 name: "app",
2555 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002556 libs: [
2557 "qux",
2558 "quuz.stubs"
2559 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002560 static_libs: [
2561 "static-runtime-helper",
2562 // statically linked component libraries should not pull their SDK libraries,
2563 // so "fred" should not be added to class loader context
2564 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002565 "static-x",
2566 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002567 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002568 uses_libs: [
2569 "foo",
2570 "non-sdk-lib"
2571 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002572 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002573 optional_uses_libs: [
2574 "bar",
2575 "baz",
2576 ],
2577 }
2578
2579 android_app_import {
2580 name: "prebuilt",
2581 apk: "prebuilts/apk/app.apk",
2582 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002583 uses_libs: [
2584 "foo",
2585 "non-sdk-lib",
2586 "android.test.runner"
2587 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07002588 optional_uses_libs: [
2589 "bar",
2590 "baz",
2591 ],
2592 }
2593 `
2594
Paul Duffin71ae5942021-03-22 15:36:52 +00002595 result := android.GroupFixturePreparers(
2596 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00002597 PrepareForTestWithJavaSdkLibraryFiles,
2598 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Paul Duffind234b412021-03-12 23:04:46 +00002599 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2600 variables.MissingUsesLibraries = []string{"baz"}
2601 }),
2602 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07002603
Paul Duffind234b412021-03-12 23:04:46 +00002604 app := result.ModuleForTests("app", "android_common")
2605 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07002606
Paul Duffin859fe962020-05-15 10:20:31 +01002607 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01002608 // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be
2609 // propagated from dependencies.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002610 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2611 expectManifestFixerArgs := `--extract-native-libs=true ` +
2612 `--uses-library qux ` +
2613 `--uses-library quuz ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01002614 `--uses-library foo ` +
2615 `--uses-library com.non.sdk.lib ` +
2616 `--uses-library runtime-library ` +
2617 `--uses-library runtime-required-x ` +
2618 `--uses-library runtime-required-y ` +
2619 `--optional-uses-library bar ` +
2620 `--optional-uses-library runtime-optional-x ` +
2621 `--optional-uses-library runtime-optional-y`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00002622 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01002623
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002624 // Test that all libraries are verified (library order matters).
2625 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
2626 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002627 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002628 `--uses-library qux ` +
2629 `--uses-library quuz ` +
2630 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002631 `--uses-library runtime-required-x ` +
2632 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002633 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002634 `--optional-uses-library baz ` +
2635 `--optional-uses-library runtime-optional-x ` +
2636 `--optional-uses-library runtime-optional-y `
Paul Duffind234b412021-03-12 23:04:46 +00002637 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002638
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002639 // Test that all libraries are verified for an APK (library order matters).
2640 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00002641 verifyApkArgs := `--uses-library foo ` +
2642 `--uses-library com.non.sdk.lib ` +
2643 `--uses-library android.test.runner ` +
2644 `--optional-uses-library bar ` +
2645 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002646 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002647
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002648 // Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002649 cmd := app.Rule("dexpreopt").RuleParams.Command
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002650 w := `--target-context-for-sdk any ` +
Ulya Trafimovich8130c482020-10-07 15:17:13 +01002651 `PCL[/system/framework/qux.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002652 `PCL[/system/framework/quuz.jar]#` +
2653 `PCL[/system/framework/foo.jar]#` +
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002654 `PCL[/system/framework/non-sdk-lib.jar]#` +
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +00002655 `PCL[/system/framework/bar.jar]#` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002656 `PCL[/system/framework/runtime-library.jar]#` +
2657 `PCL[/system/framework/runtime-required-x.jar]#` +
2658 `PCL[/system/framework/runtime-optional-x.jar]#` +
2659 `PCL[/system/framework/runtime-required-y.jar]#` +
2660 `PCL[/system/framework/runtime-optional-y.jar] `
Paul Duffind234b412021-03-12 23:04:46 +00002661 android.AssertStringDoesContain(t, "dexpreopt app cmd args", cmd, w)
Colin Cross50ddcc42019-05-16 12:28:22 -07002662
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002663 // Test conditional context for target SDK version 28.
Paul Duffind234b412021-03-12 23:04:46 +00002664 android.AssertStringDoesContain(t, "dexpreopt app cmd 28", cmd,
2665 `--target-context-for-sdk 28`+
2666 ` PCL[/system/framework/org.apache.http.legacy.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002667
2668 // Test conditional context for target SDK version 29.
Paul Duffind234b412021-03-12 23:04:46 +00002669 android.AssertStringDoesContain(t, "dexpreopt app cmd 29", cmd,
2670 `--target-context-for-sdk 29`+
2671 ` PCL[/system/framework/android.hidl.manager-V1.0-java.jar]`+
2672 `#PCL[/system/framework/android.hidl.base-V1.0-java.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002673
2674 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002675 // "android.test.mock" is absent because "android.test.runner" is not used.
Paul Duffind234b412021-03-12 23:04:46 +00002676 android.AssertStringDoesContain(t, "dexpreopt app cmd 30", cmd,
2677 `--target-context-for-sdk 30`+
2678 ` PCL[/system/framework/android.test.base.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002679
Ulya Trafimovichfc24ad32020-08-19 16:32:54 +01002680 cmd = prebuilt.Rule("dexpreopt").RuleParams.Command
Paul Duffind234b412021-03-12 23:04:46 +00002681 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd", cmd,
2682 `--target-context-for-sdk any`+
2683 ` PCL[/system/framework/foo.jar]`+
2684 `#PCL[/system/framework/non-sdk-lib.jar]`+
2685 `#PCL[/system/framework/android.test.runner.jar]`+
2686 `#PCL[/system/framework/bar.jar] `)
Ulya Trafimovich24813e12020-10-07 15:05:21 +01002687
2688 // Test conditional context for target SDK version 30.
Ulya Trafimovich46b3d5b2020-10-21 13:20:55 +01002689 // "android.test.mock" is present because "android.test.runner" is used.
Paul Duffind234b412021-03-12 23:04:46 +00002690 android.AssertStringDoesContain(t, "dexpreopt prebuilt cmd 30", cmd,
2691 `--target-context-for-sdk 30`+
2692 ` PCL[/system/framework/android.test.base.jar]`+
2693 `#PCL[/system/framework/android.test.mock.jar] `)
Colin Cross50ddcc42019-05-16 12:28:22 -07002694}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002695
Ulya Trafimovich9023b022021-03-22 16:02:28 +00002696func TestDexpreoptBcp(t *testing.T) {
2697 bp := `
2698 java_sdk_library {
2699 name: "foo",
2700 srcs: ["a.java"],
2701 api_packages: ["foo"],
2702 sdk_version: "current",
2703 }
2704
2705 java_sdk_library {
2706 name: "bar",
2707 srcs: ["a.java"],
2708 api_packages: ["bar"],
2709 permitted_packages: ["bar"],
2710 sdk_version: "current",
2711 }
2712
2713 android_app {
2714 name: "app",
2715 srcs: ["a.java"],
2716 sdk_version: "current",
2717 }
2718 `
2719
2720 testCases := []struct {
2721 name string
2722 with bool
2723 expect string
2724 }{
2725 {
2726 name: "with updatable bcp",
2727 with: true,
2728 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
2729 },
2730 {
2731 name: "without updatable bcp",
2732 with: false,
2733 expect: "/system/framework/foo.jar",
2734 },
2735 }
2736
2737 for _, test := range testCases {
2738 t.Run(test.name, func(t *testing.T) {
2739 result := android.GroupFixturePreparers(
2740 prepareForJavaTest,
2741 PrepareForTestWithJavaSdkLibraryFiles,
2742 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
2743 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01002744 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00002745 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
2746 ).RunTestWithBp(t, bp)
2747
2748 app := result.ModuleForTests("app", "android_common")
2749 cmd := app.Rule("dexpreopt").RuleParams.Command
2750 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
2751 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
2752 })
2753 }
2754}
2755
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002756func TestCodelessApp(t *testing.T) {
2757 testCases := []struct {
2758 name string
2759 bp string
2760 noCode bool
2761 }{
2762 {
2763 name: "normal",
2764 bp: `
2765 android_app {
2766 name: "foo",
2767 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002768 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002769 }
2770 `,
2771 noCode: false,
2772 },
2773 {
2774 name: "app without sources",
2775 bp: `
2776 android_app {
2777 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002778 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002779 }
2780 `,
2781 noCode: true,
2782 },
2783 {
2784 name: "app with libraries",
2785 bp: `
2786 android_app {
2787 name: "foo",
2788 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002789 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002790 }
2791
2792 java_library {
2793 name: "lib",
2794 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002795 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002796 }
2797 `,
2798 noCode: false,
2799 },
2800 {
2801 name: "app with sourceless libraries",
2802 bp: `
2803 android_app {
2804 name: "foo",
2805 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002806 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002807 }
2808
2809 java_library {
2810 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002811 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002812 }
2813 `,
2814 // TODO(jungjw): this should probably be true
2815 noCode: false,
2816 },
2817 }
2818
2819 for _, test := range testCases {
2820 t.Run(test.name, func(t *testing.T) {
2821 ctx := testApp(t, test.bp)
2822
2823 foo := ctx.ModuleForTests("foo", "android_common")
2824 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2825 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
2826 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
2827 }
2828 })
2829 }
2830}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07002831
Colin Cross53a87f52019-06-25 13:35:30 -07002832func TestUncompressDex(t *testing.T) {
2833 testCases := []struct {
2834 name string
2835 bp string
2836
2837 uncompressedPlatform bool
2838 uncompressedUnbundled bool
2839 }{
2840 {
2841 name: "normal",
2842 bp: `
2843 android_app {
2844 name: "foo",
2845 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002846 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002847 }
2848 `,
2849 uncompressedPlatform: true,
2850 uncompressedUnbundled: false,
2851 },
2852 {
2853 name: "use_embedded_dex",
2854 bp: `
2855 android_app {
2856 name: "foo",
2857 use_embedded_dex: true,
2858 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002859 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002860 }
2861 `,
2862 uncompressedPlatform: true,
2863 uncompressedUnbundled: true,
2864 },
2865 {
2866 name: "privileged",
2867 bp: `
2868 android_app {
2869 name: "foo",
2870 privileged: true,
2871 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002872 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07002873 }
2874 `,
2875 uncompressedPlatform: true,
2876 uncompressedUnbundled: true,
2877 },
David Srbeckye033cba2020-05-20 22:20:28 +01002878 {
2879 name: "normal_uncompress_dex_true",
2880 bp: `
2881 android_app {
2882 name: "foo",
2883 srcs: ["a.java"],
2884 sdk_version: "current",
2885 uncompress_dex: true,
2886 }
2887 `,
2888 uncompressedPlatform: true,
2889 uncompressedUnbundled: true,
2890 },
2891 {
2892 name: "normal_uncompress_dex_false",
2893 bp: `
2894 android_app {
2895 name: "foo",
2896 srcs: ["a.java"],
2897 sdk_version: "current",
2898 uncompress_dex: false,
2899 }
2900 `,
2901 uncompressedPlatform: false,
2902 uncompressedUnbundled: false,
2903 },
Colin Cross53a87f52019-06-25 13:35:30 -07002904 }
2905
2906 test := func(t *testing.T, bp string, want bool, unbundled bool) {
2907 t.Helper()
2908
Paul Duffin71ae5942021-03-22 15:36:52 +00002909 result := android.GroupFixturePreparers(
2910 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00002911 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00002912 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2913 if unbundled {
2914 variables.Unbundled_build = proptools.BoolPtr(true)
2915 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
2916 }
2917 }),
2918 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07002919
Paul Duffincdb88a92021-03-14 00:36:50 +00002920 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07002921 dex := foo.Rule("r8")
2922 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
2923 aligned := foo.MaybeRule("zipalign").Rule != nil
2924
Paul Duffincdb88a92021-03-14 00:36:50 +00002925 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07002926
Paul Duffincdb88a92021-03-14 00:36:50 +00002927 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07002928 }
2929
2930 for _, tt := range testCases {
2931 t.Run(tt.name, func(t *testing.T) {
2932 t.Run("platform", func(t *testing.T) {
2933 test(t, tt.bp, tt.uncompressedPlatform, false)
2934 })
2935 t.Run("unbundled", func(t *testing.T) {
2936 test(t, tt.bp, tt.uncompressedUnbundled, true)
2937 })
2938 })
2939 }
2940}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002941
2942func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
2943 if expectedValue != "" {
2944 expectedFlag := "--" + flagName + " " + expectedValue
2945 if !strings.Contains(aapt2Flags, expectedFlag) {
2946 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
2947 }
2948 } else {
2949 unexpectedFlag := "--" + flagName
2950 if strings.Contains(aapt2Flags, unexpectedFlag) {
2951 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
2952 }
2953 }
2954}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08002955
Cole Faust9a631312020-10-22 21:05:24 +00002956func TestExportedProguardFlagFiles(t *testing.T) {
2957 ctx, _ := testJava(t, `
2958 android_app {
2959 name: "foo",
2960 sdk_version: "current",
2961 static_libs: ["lib1"],
2962 }
2963
2964 android_library {
2965 name: "lib1",
2966 sdk_version: "current",
2967 optimize: {
2968 proguard_flags_files: ["lib1proguard.cfg"],
2969 }
2970 }
2971 `)
2972
2973 m := ctx.ModuleForTests("foo", "android_common")
2974 hasLib1Proguard := false
2975 for _, s := range m.Rule("java.r8").Implicits.Strings() {
2976 if s == "lib1proguard.cfg" {
2977 hasLib1Proguard = true
2978 break
2979 }
2980 }
2981
2982 if !hasLib1Proguard {
2983 t.Errorf("App does not use library proguard config")
2984 }
2985}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00002986
2987func TestTargetSdkVersionManifestFixer(t *testing.T) {
2988 platform_sdk_codename := "Tiramisu"
2989 testCases := []struct {
2990 name string
2991 targetSdkVersionInBp string
2992 targetSdkVersionExpected string
2993 unbundledBuild bool
2994 }{
2995 {
2996 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
2997 targetSdkVersionInBp: "30",
2998 targetSdkVersionExpected: "30",
2999 unbundledBuild: false,
3000 },
3001 {
3002 name: "Unbundled build: Android.bp has targetSdkVersion",
3003 targetSdkVersionInBp: "30",
3004 targetSdkVersionExpected: "30",
3005 unbundledBuild: true,
3006 },
3007 {
3008 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3009 targetSdkVersionInBp: platform_sdk_codename,
3010 targetSdkVersionExpected: platform_sdk_codename,
3011 unbundledBuild: false,
3012 },
3013 {
3014 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3015 targetSdkVersionInBp: platform_sdk_codename,
3016 targetSdkVersionExpected: "10000",
3017 unbundledBuild: true,
3018 },
3019
3020 {
3021 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
3022 targetSdkVersionExpected: platform_sdk_codename,
3023 unbundledBuild: false,
3024 },
3025 {
3026 name: "Unbundled build: Android.bp has no targetSdkVersion",
3027 targetSdkVersionExpected: "10000",
3028 unbundledBuild: true,
3029 },
3030 }
3031 for _, testCase := range testCases {
3032 bp := fmt.Sprintf(`
3033 android_app {
3034 name: "foo",
3035 sdk_version: "current",
3036 target_sdk_version: "%v",
3037 }
3038 `, testCase.targetSdkVersionInBp)
3039 fixture := android.GroupFixturePreparers(
3040 prepareForJavaTest,
3041 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3042 // explicitly set platform_sdk_codename to make the test deterministic
3043 variables.Platform_sdk_codename = &platform_sdk_codename
3044 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3045 // create a non-empty list if unbundledBuild==true
3046 if testCase.unbundledBuild {
3047 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3048 }
3049 }),
3050 )
3051
3052 result := fixture.RunTestWithBp(t, bp)
3053 foo := result.ModuleForTests("foo", "android_common")
3054
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003055 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3056 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003057 }
3058}
Colin Cross412436f2022-04-07 17:40:07 -07003059
3060func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
3061 result := android.GroupFixturePreparers(
3062 PrepareForTestWithJavaDefaultModules,
3063 android.PrepareForTestWithAllowMissingDependencies,
3064 android.PrepareForTestWithAndroidMk,
3065 ).RunTestWithBp(t, `
3066 android_app {
3067 name: "foo",
3068 srcs: ["a.java"],
3069 certificate: ":missing_certificate",
3070 sdk_version: "current",
3071 }`)
3072
3073 foo := result.ModuleForTests("foo", "android_common")
3074 fooApk := foo.Output("foo.apk")
3075 if fooApk.Rule != android.ErrorRule {
3076 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
3077 }
3078 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
3079}
Sam Delmerico82602492022-06-10 17:05:42 +00003080
3081func TestAppIncludesJniPackages(t *testing.T) {
3082 ctx := android.GroupFixturePreparers(
3083 PrepareForTestWithJavaDefaultModules,
3084 ).RunTestWithBp(t, `
3085 android_library_import {
3086 name: "aary-nodeps",
3087 aars: ["aary.aar"],
3088 extract_jni: true,
3089 }
3090
3091 android_library {
3092 name: "aary-lib",
3093 sdk_version: "current",
3094 min_sdk_version: "21",
3095 static_libs: ["aary-nodeps"],
3096 }
3097
3098 android_app {
3099 name: "aary-lib-dep",
3100 sdk_version: "current",
3101 min_sdk_version: "21",
3102 manifest: "AndroidManifest.xml",
3103 static_libs: ["aary-lib"],
3104 use_embedded_native_libs: true,
3105 }
3106
3107 android_app {
3108 name: "aary-import-dep",
3109 sdk_version: "current",
3110 min_sdk_version: "21",
3111 manifest: "AndroidManifest.xml",
3112 static_libs: ["aary-nodeps"],
3113 use_embedded_native_libs: true,
3114 }
3115
3116 android_app {
3117 name: "aary-no-use-embedded",
3118 sdk_version: "current",
3119 min_sdk_version: "21",
3120 manifest: "AndroidManifest.xml",
3121 static_libs: ["aary-nodeps"],
3122 }`)
3123
3124 testCases := []struct {
3125 name string
3126 hasPackage bool
3127 }{
3128 {
3129 name: "aary-import-dep",
3130 hasPackage: true,
3131 },
3132 {
3133 name: "aary-lib-dep",
3134 hasPackage: true,
3135 },
3136 {
3137 name: "aary-no-use-embedded",
3138 hasPackage: false,
3139 },
3140 }
3141
3142 for _, tc := range testCases {
3143 t.Run(tc.name, func(t *testing.T) {
3144 app := ctx.ModuleForTests(tc.name, "android_common")
3145
3146 outputFile := "jnilibs.zip"
3147 jniOutputLibZip := app.MaybeOutput(outputFile)
3148 if jniOutputLibZip.Rule == nil && !tc.hasPackage {
3149 return
3150 }
3151
3152 jniPackage := "arm64-v8a_jni.zip"
3153 inputs := jniOutputLibZip.Inputs
3154 foundPackage := false
3155 for i := 0; i < len(inputs); i++ {
3156 if strings.Contains(inputs[i].String(), jniPackage) {
3157 foundPackage = true
3158 }
3159 }
3160 if foundPackage != tc.hasPackage {
3161 t.Errorf("expected to find %v in %v inputs; inputs = %v", jniPackage, outputFile, inputs)
3162 }
3163 })
3164 }
3165}
Spandan Das9f7ae7f2022-07-25 00:34:18 +00003166
3167func TestTargetSdkVersionMtsTests(t *testing.T) {
3168 platformSdkCodename := "Tiramisu"
3169 android_test := "android_test"
3170 android_test_helper_app := "android_test_helper_app"
3171 bpTemplate := `
3172 %v {
3173 name: "mytest",
3174 target_sdk_version: "%v",
3175 test_suites: ["othersuite", "%v"],
3176 }
3177 `
3178 testCases := []struct {
3179 desc string
3180 moduleType string
3181 targetSdkVersionInBp string
3182 targetSdkVersionExpected string
3183 testSuites string
3184 }{
3185 {
3186 desc: "Non-MTS android_test_apps targeting current should not be upgraded to 10000",
3187 moduleType: android_test,
3188 targetSdkVersionInBp: "current",
3189 targetSdkVersionExpected: platformSdkCodename,
3190 testSuites: "non-mts-suite",
3191 },
3192 {
3193 desc: "MTS android_test_apps targeting released sdks should not be upgraded to 10000",
3194 moduleType: android_test,
3195 targetSdkVersionInBp: "29",
3196 targetSdkVersionExpected: "29",
3197 testSuites: "mts-suite",
3198 },
3199 {
3200 desc: "MTS android_test_apps targeting current should be upgraded to 10000",
3201 moduleType: android_test,
3202 targetSdkVersionInBp: "current",
3203 targetSdkVersionExpected: "10000",
3204 testSuites: "mts-suite",
3205 },
3206 {
3207 desc: "MTS android_test_helper_apps targeting current should be upgraded to 10000",
3208 moduleType: android_test_helper_app,
3209 targetSdkVersionInBp: "current",
3210 targetSdkVersionExpected: "10000",
3211 testSuites: "mts-suite",
3212 },
3213 }
3214 fixture := android.GroupFixturePreparers(
3215 prepareForJavaTest,
3216 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3217 variables.Platform_sdk_codename = &platformSdkCodename
3218 variables.Platform_version_active_codenames = []string{platformSdkCodename}
3219 }),
3220 )
3221 for _, testCase := range testCases {
3222 result := fixture.RunTestWithBp(t, fmt.Sprintf(bpTemplate, testCase.moduleType, testCase.targetSdkVersionInBp, testCase.testSuites))
3223 mytest := result.ModuleForTests("mytest", "android_common")
3224 manifestFixerArgs := mytest.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3225 android.AssertStringDoesContain(t, testCase.desc, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3226 }
3227}