blob: 12c3a95590aeadab81d7d2608b1cb7be5ea75a34 [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",
Colin Crossdea1d032022-12-06 14:50:08 -0800446 "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
Dan Albert92fe7402020-07-15 13:33:30 -0700447 expectedCrtEnd := ctx.ModuleForTests("crtend_so",
Colin Crossdea1d032022-12-06 14:50:08 -0800448 "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output
Dan Albert92fe7402020-07-15 13:33:30 -0700449 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 Crossff3ff7f2023-07-05 14:04:12 -0700720func TestAndroidResourceProcessor(t *testing.T) {
721 testCases := []struct {
722 name string
723
724 dontVerifyApp bool
725 appResources []string
726 appOverlays []string
727 appImports []string
728 appSrcJars []string
729 appClasspath []string
730 appCombined []string
731
732 dontVerifyDirect bool
733 directResources []string
734 directOverlays []string
735 directImports []string
736 directSrcJars []string
737 directClasspath []string
738 directCombined []string
739
740 dontVerifyTransitive bool
741 transitiveResources []string
742 transitiveOverlays []string
743 transitiveImports []string
744 transitiveSrcJars []string
745 transitiveClasspath []string
746 transitiveCombined []string
747
748 dontVerifyDirectImport bool
749 directImportResources []string
750 directImportOverlays []string
751 directImportImports []string
752
753 dontVerifyTransitiveImport bool
754 transitiveImportResources []string
755 transitiveImportOverlays []string
756 transitiveImportImports []string
757 }{
758 {
759 name: "legacy",
760
761 appResources: nil,
762 appOverlays: []string{
763 "out/soong/.intermediates/transitive/android_common/package-res.apk",
764 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
765 "out/soong/.intermediates/direct/android_common/package-res.apk",
766 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
767 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
768 },
769 appImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
770 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
771 appClasspath: []string{
772 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
773 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
774 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
775 },
776 appCombined: []string{
777 "out/soong/.intermediates/app/android_common/javac/app.jar",
778 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
779 "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar",
780 },
781
782 directResources: nil,
783 directOverlays: []string{
784 "out/soong/.intermediates/transitive/android_common/package-res.apk",
785 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
786 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
787 },
788 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
789 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
790 directClasspath: []string{
791 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
792 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
793 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
794 },
795 directCombined: []string{
796 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
797 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
798 "out/soong/.intermediates/transitive_import/android_common/aar/classes-combined.jar",
799 },
800
801 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
802 transitiveOverlays: nil,
803 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
804 transitiveSrcJars: []string{"out/soong/.intermediates/transitive/android_common/gen/android/R.srcjar"},
805 transitiveClasspath: []string{"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar"},
806 transitiveCombined: nil,
807
808 directImportResources: nil,
809 directImportOverlays: []string{
810 "out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata",
811 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
812 },
813 directImportImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
814
815 transitiveImportResources: nil,
816 transitiveImportOverlays: []string{
817 "out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata",
818 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
819 },
820 transitiveImportImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
821 },
822 }
823
824 for _, testCase := range testCases {
825 t.Run(testCase.name, func(t *testing.T) {
826 bp := fmt.Sprintf(`
827 android_app {
828 name: "app",
829 sdk_version: "current",
830 srcs: ["app/app.java"],
831 resource_dirs: ["app/res"],
832 manifest: "app/AndroidManifest.xml",
833 static_libs: ["direct", "direct_import"],
834 }
835
836 android_library {
837 name: "direct",
838 sdk_version: "current",
839 srcs: ["direct/direct.java"],
840 resource_dirs: ["direct/res"],
841 manifest: "direct/AndroidManifest.xml",
842 static_libs: ["transitive", "transitive_import"],
843 }
844
845 android_library {
846 name: "transitive",
847 sdk_version: "current",
848 srcs: ["transitive/transitive.java"],
849 resource_dirs: ["transitive/res"],
850 manifest: "transitive/AndroidManifest.xml",
851 }
852
853 android_library_import {
854 name: "direct_import",
855 sdk_version: "current",
856 aars: ["direct_import.aar"],
857 static_libs: ["direct_import_dep"],
858 }
859
860 android_library_import {
861 name: "direct_import_dep",
862 sdk_version: "current",
863 aars: ["direct_import_dep.aar"],
864 }
865
866 android_library_import {
867 name: "transitive_import",
868 sdk_version: "current",
869 aars: ["transitive_import.aar"],
870 static_libs: ["transitive_import_dep"],
871 }
872
873 android_library_import {
874 name: "transitive_import_dep",
875 sdk_version: "current",
876 aars: ["transitive_import_dep.aar"],
877 }
878 `)
879
880 fs := android.MockFS{
881 "app/res/values/strings.xml": nil,
882 "direct/res/values/strings.xml": nil,
883 "transitive/res/values/strings.xml": nil,
884 }
885
886 result := android.GroupFixturePreparers(
887 PrepareForTestWithJavaDefaultModules,
888 PrepareForTestWithOverlayBuildComponents,
889 fs.AddToFixture(),
890 ).RunTestWithBp(t, bp)
891
892 type aaptInfo struct {
893 resources, overlays, imports, srcJars, classpath, combined android.Paths
894 }
895
896 getAaptInfo := func(moduleName string) (aaptInfo aaptInfo) {
897 mod := result.ModuleForTests(moduleName, "android_common")
898 resourceListRule := mod.MaybeOutput("aapt2/res.list")
899 overlayListRule := mod.MaybeOutput("aapt2/overlay.list")
900 aaptRule := mod.Rule("aapt2Link")
901 javacRule := mod.MaybeRule("javac")
902 combinedRule := mod.MaybeOutput("combined/" + moduleName + ".jar")
903
904 aaptInfo.resources = resourceListRule.Inputs
905 aaptInfo.overlays = overlayListRule.Inputs
906
907 aaptFlags := strings.Split(aaptRule.Args["flags"], " ")
908 for i, flag := range aaptFlags {
909 if flag == "-I" && i+1 < len(aaptFlags) {
910 aaptInfo.imports = append(aaptInfo.imports, android.PathForTesting(aaptFlags[i+1]))
911 }
912 }
913
914 if len(javacRule.Args["srcJars"]) > 0 {
915 aaptInfo.srcJars = android.PathsForTesting(strings.Split(javacRule.Args["srcJars"], " ")...)
916 }
917
918 if len(javacRule.Args["classpath"]) > 0 {
919 classpathArg := strings.TrimPrefix(javacRule.Args["classpath"], "-classpath ")
920 aaptInfo.classpath = android.PathsForTesting(strings.Split(classpathArg, ":")...)
921 }
922
923 aaptInfo.combined = combinedRule.Inputs
924 return
925 }
926
927 app := getAaptInfo("app")
928 direct := getAaptInfo("direct")
929 transitive := getAaptInfo("transitive")
930 directImport := getAaptInfo("direct_import")
931 transitiveImport := getAaptInfo("transitive_import")
932
933 if !testCase.dontVerifyApp {
934 android.AssertPathsRelativeToTopEquals(t, "app resources", testCase.appResources, app.resources)
935 android.AssertPathsRelativeToTopEquals(t, "app overlays", testCase.appOverlays, app.overlays)
936 android.AssertPathsRelativeToTopEquals(t, "app imports", testCase.appImports, app.imports)
937 android.AssertPathsRelativeToTopEquals(t, "app srcjars", testCase.appSrcJars, app.srcJars)
938 android.AssertPathsRelativeToTopEquals(t, "app classpath", testCase.appClasspath, app.classpath)
939 android.AssertPathsRelativeToTopEquals(t, "app combined", testCase.appCombined, app.combined)
940 }
941
942 if !testCase.dontVerifyDirect {
943 android.AssertPathsRelativeToTopEquals(t, "direct resources", testCase.directResources, direct.resources)
944 android.AssertPathsRelativeToTopEquals(t, "direct overlays", testCase.directOverlays, direct.overlays)
945 android.AssertPathsRelativeToTopEquals(t, "direct imports", testCase.directImports, direct.imports)
946 android.AssertPathsRelativeToTopEquals(t, "direct srcjars", testCase.directSrcJars, direct.srcJars)
947 android.AssertPathsRelativeToTopEquals(t, "direct classpath", testCase.directClasspath, direct.classpath)
948 android.AssertPathsRelativeToTopEquals(t, "direct combined", testCase.directCombined, direct.combined)
949 }
950
951 if !testCase.dontVerifyTransitive {
952 android.AssertPathsRelativeToTopEquals(t, "transitive resources", testCase.transitiveResources, transitive.resources)
953 android.AssertPathsRelativeToTopEquals(t, "transitive overlays", testCase.transitiveOverlays, transitive.overlays)
954 android.AssertPathsRelativeToTopEquals(t, "transitive imports", testCase.transitiveImports, transitive.imports)
955 android.AssertPathsRelativeToTopEquals(t, "transitive srcjars", testCase.transitiveSrcJars, transitive.srcJars)
956 android.AssertPathsRelativeToTopEquals(t, "transitive classpath", testCase.transitiveClasspath, transitive.classpath)
957 android.AssertPathsRelativeToTopEquals(t, "transitive combined", testCase.transitiveCombined, transitive.combined)
958 }
959
960 if !testCase.dontVerifyDirectImport {
961 android.AssertPathsRelativeToTopEquals(t, "direct_import resources", testCase.directImportResources, directImport.resources)
962 android.AssertPathsRelativeToTopEquals(t, "direct_import overlays", testCase.directImportOverlays, directImport.overlays)
963 android.AssertPathsRelativeToTopEquals(t, "direct_import imports", testCase.directImportImports, directImport.imports)
964 }
965
966 if !testCase.dontVerifyTransitiveImport {
967 android.AssertPathsRelativeToTopEquals(t, "transitive_import resources", testCase.transitiveImportResources, transitiveImport.resources)
968 android.AssertPathsRelativeToTopEquals(t, "transitive_import overlays", testCase.transitiveImportOverlays, transitiveImport.overlays)
969 android.AssertPathsRelativeToTopEquals(t, "transitive_import imports", testCase.transitiveImportImports, transitiveImport.imports)
970 }
971 })
972 }
973}
974
975func TestAndroidResourceOverlays(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -0800976 testCases := []struct {
977 name string
978 enforceRROTargets []string
979 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -0800980 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -0800981 overlayFiles map[string][]string
982 rroDirs map[string][]string
983 }{
984 {
985 name: "no RRO",
986 enforceRROTargets: nil,
987 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -0800988 resourceFiles: map[string][]string{
989 "foo": nil,
990 "bar": {"bar/res/res/values/strings.xml"},
991 "lib": nil,
992 "lib2": {"lib2/res/res/values/strings.xml"},
993 },
Colin Cross5c4791c2019-02-01 11:44:44 -0800994 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -0800995 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000996 "out/soong/.intermediates/lib2/android_common/package-res.apk",
997 "out/soong/.intermediates/lib/android_common/package-res.apk",
998 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -0800999 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001000 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1001 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +00001002 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001003 },
Colin Crossbec85302019-02-13 13:15:46 -08001004 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -08001005 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1006 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1007 },
Colin Crossbec85302019-02-13 13:15:46 -08001008 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001009 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001010 "lib/res/res/values/strings.xml",
1011 "device/vendor/blah/overlay/lib/res/values/strings.xml",
1012 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001013 },
1014 rroDirs: map[string][]string{
1015 "foo": nil,
1016 "bar": nil,
1017 },
1018 },
1019 {
1020 name: "enforce RRO on foo",
1021 enforceRROTargets: []string{"foo"},
1022 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -08001023 resourceFiles: map[string][]string{
1024 "foo": nil,
1025 "bar": {"bar/res/res/values/strings.xml"},
1026 "lib": nil,
1027 "lib2": {"lib2/res/res/values/strings.xml"},
1028 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001029 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001030 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001031 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1032 "out/soong/.intermediates/lib/android_common/package-res.apk",
1033 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001034 "foo/res/res/values/strings.xml",
1035 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1036 },
Colin Crossbec85302019-02-13 13:15:46 -08001037 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -08001038 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1039 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1040 },
Colin Crossbec85302019-02-13 13:15:46 -08001041 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001042 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001043 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -08001044 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001045 },
Colin Crossc1c37552019-01-31 11:42:41 -08001046
Colin Cross5c4791c2019-02-01 11:44:44 -08001047 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001048 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +00001049 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +00001050 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001051 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001052 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001053 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001054 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001055 },
1056 },
1057 {
1058 name: "enforce RRO on all",
1059 enforceRROTargets: []string{"*"},
1060 enforceRROExcludedOverlays: []string{
1061 // Excluding specific apps/res directories also allowed.
1062 "device/vendor/blah/static_overlay/foo",
1063 "device/vendor/blah/static_overlay/bar/res",
1064 },
Colin Crossbec85302019-02-13 13:15:46 -08001065 resourceFiles: map[string][]string{
1066 "foo": nil,
1067 "bar": {"bar/res/res/values/strings.xml"},
1068 "lib": nil,
1069 "lib2": {"lib2/res/res/values/strings.xml"},
1070 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001071 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001072 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001073 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1074 "out/soong/.intermediates/lib/android_common/package-res.apk",
1075 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001076 "foo/res/res/values/strings.xml",
1077 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1078 },
Colin Crossbec85302019-02-13 13:15:46 -08001079 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
1080 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001081 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001082 "lib/res/res/values/strings.xml",
1083 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001084 },
1085 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001086 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +00001087 "device:device/vendor/blah/overlay/foo/res",
1088 "product:product/vendor/blah/overlay/foo/res",
1089 // Lib dep comes after the direct deps
1090 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001091 },
Anton Hansson53c88442019-03-18 15:53:16 +00001092 "bar": {"device:device/vendor/blah/overlay/bar/res"},
1093 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001094 },
1095 },
1096 }
1097
Anton Hansson53c88442019-03-18 15:53:16 +00001098 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -08001099 "device/vendor/blah/overlay",
1100 "device/vendor/blah/overlay2",
1101 "device/vendor/blah/static_overlay",
1102 }
1103
Anton Hansson53c88442019-03-18 15:53:16 +00001104 productResourceOverlays := []string{
1105 "product/vendor/blah/overlay",
1106 }
1107
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001108 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -08001109 "foo/res/res/values/strings.xml": nil,
1110 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001111 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -08001112 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001113 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
1114 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001115 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001116 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
1117 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
1118 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +00001119 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001120 }
1121
1122 bp := `
1123 android_app {
1124 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001125 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001126 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +00001127 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -08001128 }
1129
1130 android_app {
1131 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001132 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001133 resource_dirs: ["bar/res"],
1134 }
Colin Cross6ed7dea2019-01-31 14:44:30 -08001135
1136 android_library {
1137 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001138 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001139 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -08001140 static_libs: ["lib2"],
1141 }
1142
1143 android_library {
1144 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001145 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -08001146 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -08001147 }
Anton Hansson53c88442019-03-18 15:53:16 +00001148
1149 // This library has the same resources as lib (should not lead to dupe RROs)
1150 android_library {
1151 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001152 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +00001153 resource_dirs: ["lib/res"]
1154 }
Colin Cross890ff552017-11-30 20:13:19 -08001155 `
1156
Colin Cross5c4791c2019-02-01 11:44:44 -08001157 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -08001158 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001159 result := android.GroupFixturePreparers(
1160 PrepareForTestWithJavaDefaultModules,
1161 PrepareForTestWithOverlayBuildComponents,
1162 fs.AddToFixture(),
1163 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1164 variables.DeviceResourceOverlays = deviceResourceOverlays
1165 variables.ProductResourceOverlays = productResourceOverlays
1166 if testCase.enforceRROTargets != nil {
1167 variables.EnforceRROTargets = testCase.enforceRROTargets
1168 }
1169 if testCase.enforceRROExcludedOverlays != nil {
1170 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
1171 }
1172 }),
1173 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -08001174
Colin Crossbec85302019-02-13 13:15:46 -08001175 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
1176 for _, o := range list {
1177 res := module.MaybeOutput(o)
1178 if res.Rule != nil {
1179 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
1180 // verify the inputs to the .arsc.flat rule.
1181 files = append(files, res.Inputs.Strings()...)
1182 } else {
1183 // Otherwise, verify the full path to the output of the other module
1184 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +00001185 }
Colin Cross890ff552017-11-30 20:13:19 -08001186 }
Colin Crossbec85302019-02-13 13:15:46 -08001187 return files
Colin Cross890ff552017-11-30 20:13:19 -08001188 }
1189
Colin Crossbec85302019-02-13 13:15:46 -08001190 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001191 module := result.ModuleForTests(moduleName, "android_common")
Colin Crossbec85302019-02-13 13:15:46 -08001192 resourceList := module.MaybeOutput("aapt2/res.list")
1193 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001194 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +00001195 }
Colin Crossbec85302019-02-13 13:15:46 -08001196 overlayList := module.MaybeOutput("aapt2/overlay.list")
1197 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001198 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -08001199 }
1200
Anton Hansson53c88442019-03-18 15:53:16 +00001201 for _, d := range module.Module().(AndroidLibraryDependency).ExportedRRODirs() {
1202 var prefix string
1203 if d.overlayType == device {
1204 prefix = "device:"
1205 } else if d.overlayType == product {
1206 prefix = "product:"
1207 } else {
1208 t.Fatalf("Unexpected overlayType %d", d.overlayType)
1209 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001210 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +00001211 }
Colin Crossbec85302019-02-13 13:15:46 -08001212
1213 return resourceFiles, overlayFiles, rroDirs
1214 }
1215
1216 modules := []string{"foo", "bar", "lib", "lib2"}
1217 for _, module := range modules {
1218 resourceFiles, overlayFiles, rroDirs := getResources(module)
1219
1220 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
1221 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
1222 module, testCase.resourceFiles[module], resourceFiles)
1223 }
1224 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
1225 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
1226 module, testCase.overlayFiles[module], overlayFiles)
1227 }
1228 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +00001229 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -08001230 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +00001231 }
Colin Cross890ff552017-11-30 20:13:19 -08001232 }
Colin Cross890ff552017-11-30 20:13:19 -08001233 })
1234 }
1235}
Colin Crossd09b0b62018-04-18 11:06:47 -07001236
Paul Duffincdb88a92021-03-14 00:36:50 +00001237func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
1238 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +09001239 link := foo.Output("package-res.apk")
1240 linkFlags := strings.Split(link.Args["flags"], " ")
1241 min := android.IndexList("--min-sdk-version", linkFlags)
1242 target := android.IndexList("--target-sdk-version", linkFlags)
1243
1244 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
1245 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
1246 }
1247
1248 gotMinSdkVersion := linkFlags[min+1]
1249 gotTargetSdkVersion := linkFlags[target+1]
1250
Paul Duffincdb88a92021-03-14 00:36:50 +00001251 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001252
Paul Duffincdb88a92021-03-14 00:36:50 +00001253 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001254}
1255
Colin Crossd09b0b62018-04-18 11:06:47 -07001256func TestAppSdkVersion(t *testing.T) {
1257 testCases := []struct {
1258 name string
1259 sdkVersion string
1260 platformSdkInt int
1261 platformSdkCodename string
1262 platformSdkFinal bool
Spandan Dasffb31af2023-03-01 19:46:18 +00001263 minSdkVersionBp string
Colin Crossd09b0b62018-04-18 11:06:47 -07001264 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001265 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001266 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001267 }{
1268 {
1269 name: "current final SDK",
1270 sdkVersion: "current",
1271 platformSdkInt: 27,
1272 platformSdkCodename: "REL",
1273 platformSdkFinal: true,
1274 expectedMinSdkVersion: "27",
1275 },
1276 {
1277 name: "current non-final SDK",
1278 sdkVersion: "current",
1279 platformSdkInt: 27,
1280 platformSdkCodename: "OMR1",
1281 platformSdkFinal: false,
1282 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001283 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001284 },
1285 {
1286 name: "default final SDK",
1287 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001288 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001289 platformSdkInt: 27,
1290 platformSdkCodename: "REL",
1291 platformSdkFinal: true,
1292 expectedMinSdkVersion: "27",
1293 },
1294 {
1295 name: "default non-final SDK",
1296 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001297 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001298 platformSdkInt: 27,
1299 platformSdkCodename: "OMR1",
1300 platformSdkFinal: false,
1301 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001302 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001303 },
1304 {
1305 name: "14",
1306 sdkVersion: "14",
1307 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001308 platformSdkCodename: "S",
1309 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001310 },
Spandan Dasffb31af2023-03-01 19:46:18 +00001311 {
1312 name: "two active SDKs",
1313 sdkVersion: "module_current",
1314 minSdkVersionBp: "UpsideDownCake",
1315 expectedMinSdkVersion: "UpsideDownCake", // And not VanillaIceCream
1316 platformSdkCodename: "VanillaIceCream",
1317 activeCodenames: []string{"UpsideDownCake", "VanillaIceCream"},
1318 },
Colin Crossd09b0b62018-04-18 11:06:47 -07001319 }
1320
1321 for _, moduleType := range []string{"android_app", "android_library"} {
1322 for _, test := range testCases {
1323 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001324 platformApiProp := ""
1325 if test.platformApis {
1326 platformApiProp = "platform_apis: true,"
1327 }
Spandan Dasffb31af2023-03-01 19:46:18 +00001328 minSdkVersionProp := ""
1329 if test.minSdkVersionBp != "" {
1330 minSdkVersionProp = fmt.Sprintf(` min_sdk_version: "%s",`, test.minSdkVersionBp)
1331 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001332 bp := fmt.Sprintf(`%s {
1333 name: "foo",
1334 srcs: ["a.java"],
1335 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001336 %s
Spandan Dasffb31af2023-03-01 19:46:18 +00001337 %s
1338 }`, moduleType, test.sdkVersion, platformApiProp, minSdkVersionProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001339
Paul Duffin71ae5942021-03-22 15:36:52 +00001340 result := android.GroupFixturePreparers(
1341 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001342 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1343 variables.Platform_sdk_version = &test.platformSdkInt
1344 variables.Platform_sdk_codename = &test.platformSdkCodename
1345 variables.Platform_version_active_codenames = test.activeCodenames
1346 variables.Platform_sdk_final = &test.platformSdkFinal
1347 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001348 FixtureWithPrebuiltApis(map[string][]string{
1349 "14": {"foo"},
1350 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001351 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001352
Paul Duffincdb88a92021-03-14 00:36:50 +00001353 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001354 })
1355 }
1356 }
1357}
Colin Crossa4f08812018-10-02 22:03:40 -07001358
Jeongik Cha219141c2020-08-06 23:00:37 +09001359func TestVendorAppSdkVersion(t *testing.T) {
1360 testCases := []struct {
1361 name string
1362 sdkVersion string
1363 platformSdkInt int
1364 platformSdkCodename string
1365 platformSdkFinal bool
1366 deviceCurrentApiLevelForVendorModules string
1367 expectedMinSdkVersion string
1368 }{
1369 {
1370 name: "current final SDK",
1371 sdkVersion: "current",
1372 platformSdkInt: 29,
1373 platformSdkCodename: "REL",
1374 platformSdkFinal: true,
1375 deviceCurrentApiLevelForVendorModules: "29",
1376 expectedMinSdkVersion: "29",
1377 },
1378 {
1379 name: "current final SDK",
1380 sdkVersion: "current",
1381 platformSdkInt: 29,
1382 platformSdkCodename: "REL",
1383 platformSdkFinal: true,
1384 deviceCurrentApiLevelForVendorModules: "28",
1385 expectedMinSdkVersion: "28",
1386 },
1387 {
1388 name: "current final SDK",
1389 sdkVersion: "current",
1390 platformSdkInt: 29,
1391 platformSdkCodename: "Q",
1392 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001393 deviceCurrentApiLevelForVendorModules: "28",
1394 expectedMinSdkVersion: "28",
1395 },
1396 }
1397
1398 for _, moduleType := range []string{"android_app", "android_library"} {
1399 for _, sdkKind := range []string{"", "system_"} {
1400 for _, test := range testCases {
1401 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1402 bp := fmt.Sprintf(`%s {
1403 name: "foo",
1404 srcs: ["a.java"],
1405 sdk_version: "%s%s",
1406 vendor: true,
1407 }`, moduleType, sdkKind, test.sdkVersion)
1408
Paul Duffin71ae5942021-03-22 15:36:52 +00001409 result := android.GroupFixturePreparers(
1410 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001411 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1412 variables.Platform_sdk_version = &test.platformSdkInt
1413 variables.Platform_sdk_codename = &test.platformSdkCodename
1414 variables.Platform_sdk_final = &test.platformSdkFinal
1415 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1416 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1417 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001418 FixtureWithPrebuiltApis(map[string][]string{
1419 "28": {"foo"},
1420 "29": {"foo"},
1421 "current": {"foo"},
1422 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001423 ).RunTestWithBp(t, bp)
1424
1425 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001426 })
1427 }
1428 }
1429 }
1430}
1431
Paul Duffin50c217c2019-06-12 13:25:22 +01001432func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001433 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001434 cc_library {
1435 name: "libjni",
1436 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001437 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001438 stl: "none",
1439 }
1440
1441 android_test {
1442 name: "test",
1443 sdk_version: "core_platform",
1444 jni_libs: ["libjni"],
1445 }
1446
1447 android_test {
1448 name: "test_first",
1449 sdk_version: "core_platform",
1450 compile_multilib: "first",
1451 jni_libs: ["libjni"],
1452 }
1453
1454 android_test {
1455 name: "test_both",
1456 sdk_version: "core_platform",
1457 compile_multilib: "both",
1458 jni_libs: ["libjni"],
1459 }
1460
1461 android_test {
1462 name: "test_32",
1463 sdk_version: "core_platform",
1464 compile_multilib: "32",
1465 jni_libs: ["libjni"],
1466 }
1467
1468 android_test {
1469 name: "test_64",
1470 sdk_version: "core_platform",
1471 compile_multilib: "64",
1472 jni_libs: ["libjni"],
1473 }
1474 `)
1475
1476 testCases := []struct {
1477 name string
1478 abis []string
1479 }{
1480 {"test", []string{"arm64-v8a"}},
1481 {"test_first", []string{"arm64-v8a"}},
1482 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1483 {"test_32", []string{"armeabi-v7a"}},
1484 {"test_64", []string{"arm64-v8a"}},
1485 }
1486
1487 for _, test := range testCases {
1488 t.Run(test.name, func(t *testing.T) {
1489 app := ctx.ModuleForTests(test.name, "android_common")
Sam Delmerico82602492022-06-10 17:05:42 +00001490 jniLibZip := app.Output(jniJarOutputPathString)
Paul Duffin50c217c2019-06-12 13:25:22 +01001491 var abis []string
1492 args := strings.Fields(jniLibZip.Args["jarArgs"])
1493 for i := 0; i < len(args); i++ {
1494 if args[i] == "-P" {
1495 abis = append(abis, filepath.Base(args[i+1]))
1496 i++
1497 }
1498 }
1499 if !reflect.DeepEqual(abis, test.abis) {
1500 t.Errorf("want abis %v, got %v", test.abis, abis)
1501 }
1502 })
1503 }
1504}
1505
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001506func TestAppSdkVersionByPartition(t *testing.T) {
1507 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1508 android_app {
1509 name: "foo",
1510 srcs: ["a.java"],
1511 vendor: true,
1512 platform_apis: true,
1513 }
1514 `)
1515
1516 testJava(t, `
1517 android_app {
1518 name: "bar",
1519 srcs: ["b.java"],
1520 platform_apis: true,
1521 }
1522 `)
1523
1524 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001525 bp := `
1526 android_app {
1527 name: "foo",
1528 srcs: ["a.java"],
1529 product_specific: true,
1530 platform_apis: true,
1531 }
1532 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001533
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001534 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001535 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001536 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 +09001537 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001538
1539 android.GroupFixturePreparers(
1540 PrepareForTestWithJavaDefaultModules,
1541 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1542 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
1543 }),
1544 ).
1545 ExtendWithErrorHandler(errorHandler).
1546 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001547 }
1548}
1549
Paul Duffin50c217c2019-06-12 13:25:22 +01001550func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001551 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001552 cc_library {
1553 name: "libjni",
1554 system_shared_libs: [],
1555 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08001556 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001557 }
1558
1559 android_app {
1560 name: "app",
1561 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001562 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001563 }
1564
1565 android_app {
1566 name: "app_noembed",
1567 jni_libs: ["libjni"],
1568 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001569 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001570 }
1571
1572 android_app {
1573 name: "app_embed",
1574 jni_libs: ["libjni"],
1575 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001576 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001577 }
1578
1579 android_test {
1580 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00001581 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001582 jni_libs: ["libjni"],
1583 }
1584
1585 android_test {
1586 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001587 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001588 jni_libs: ["libjni"],
1589 use_embedded_native_libs: false,
1590 }
1591
1592 android_test_helper_app {
1593 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00001594 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001595 jni_libs: ["libjni"],
1596 }
1597
1598 android_test_helper_app {
1599 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001600 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001601 jni_libs: ["libjni"],
1602 use_embedded_native_libs: false,
1603 }
1604 `)
1605
1606 testCases := []struct {
1607 name string
1608 packaged bool
1609 compressed bool
1610 }{
1611 {"app", false, false},
1612 {"app_noembed", false, false},
1613 {"app_embed", true, false},
1614 {"test", true, false},
1615 {"test_noembed", true, true},
1616 {"test_helper", true, false},
1617 {"test_helper_noembed", true, true},
1618 }
1619
1620 for _, test := range testCases {
1621 t.Run(test.name, func(t *testing.T) {
1622 app := ctx.ModuleForTests(test.name, "android_common")
Sam Delmerico82602492022-06-10 17:05:42 +00001623 jniLibZip := app.MaybeOutput(jniJarOutputPathString)
Paul Duffin50c217c2019-06-12 13:25:22 +01001624 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
1625 t.Errorf("expected jni packaged %v, got %v", w, g)
1626 }
1627
1628 if jniLibZip.Rule != nil {
1629 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
1630 t.Errorf("expected jni compressed %v, got %v", w, g)
1631 }
Colin Crossc511bc52020-04-07 16:50:32 +00001632
1633 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
1634 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
1635 }
Paul Duffin50c217c2019-06-12 13:25:22 +01001636 }
1637 })
1638 }
Colin Cross47fa9d32019-03-26 10:51:39 -07001639}
1640
Colin Cross3c007702020-05-08 11:20:24 -07001641func TestJNISDK(t *testing.T) {
1642 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
1643 cc_library {
1644 name: "libjni",
1645 system_shared_libs: [],
1646 stl: "none",
1647 sdk_version: "current",
1648 }
1649
1650 android_test {
1651 name: "app_platform",
1652 jni_libs: ["libjni"],
1653 platform_apis: true,
1654 }
1655
1656 android_test {
1657 name: "app_sdk",
1658 jni_libs: ["libjni"],
1659 sdk_version: "current",
1660 }
1661
1662 android_test {
1663 name: "app_force_platform",
1664 jni_libs: ["libjni"],
1665 sdk_version: "current",
1666 jni_uses_platform_apis: true,
1667 }
1668
1669 android_test {
1670 name: "app_force_sdk",
1671 jni_libs: ["libjni"],
1672 platform_apis: true,
1673 jni_uses_sdk_apis: true,
1674 }
Colin Crossc2d24052020-05-13 11:05:02 -07001675
1676 cc_library {
1677 name: "libvendorjni",
1678 system_shared_libs: [],
1679 stl: "none",
1680 vendor: true,
1681 }
1682
1683 android_test {
1684 name: "app_vendor",
1685 jni_libs: ["libvendorjni"],
1686 sdk_version: "current",
1687 vendor: true,
1688 }
Colin Cross3c007702020-05-08 11:20:24 -07001689 `)
1690
1691 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07001692 name string
1693 sdkJNI bool
1694 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07001695 }{
Colin Crossc2d24052020-05-13 11:05:02 -07001696 {name: "app_platform"},
1697 {name: "app_sdk", sdkJNI: true},
1698 {name: "app_force_platform"},
1699 {name: "app_force_sdk", sdkJNI: true},
1700 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07001701 }
1702
Colin Crossc2d24052020-05-13 11:05:02 -07001703 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
1704 Output("libjni.so").Output.String()
1705 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
1706 Output("libjni.so").Output.String()
1707 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
1708 Output("libvendorjni.so").Output.String()
1709
Colin Cross3c007702020-05-08 11:20:24 -07001710 for _, test := range testCases {
1711 t.Run(test.name, func(t *testing.T) {
1712 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07001713
Sam Delmerico82602492022-06-10 17:05:42 +00001714 jniLibZip := app.MaybeOutput(jniJarOutputPathString)
Colin Cross3c007702020-05-08 11:20:24 -07001715 if len(jniLibZip.Implicits) != 1 {
1716 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
1717 }
1718 gotJNI := jniLibZip.Implicits[0].String()
1719
1720 if test.sdkJNI {
1721 if gotJNI != sdkJNI {
1722 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
1723 }
Colin Crossc2d24052020-05-13 11:05:02 -07001724 } else if test.vendorJNI {
1725 if gotJNI != vendorJNI {
1726 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
1727 }
Colin Cross3c007702020-05-08 11:20:24 -07001728 } else {
1729 if gotJNI != platformJNI {
1730 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
1731 }
1732 }
1733 })
1734 }
1735
1736 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
1737 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
1738 android_test {
1739 name: "app_platform",
1740 platform_apis: true,
1741 jni_uses_platform_apis: true,
1742 }
1743 `)
1744 })
1745
1746 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
1747 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
1748 android_test {
1749 name: "app_sdk",
1750 sdk_version: "current",
1751 jni_uses_sdk_apis: true,
1752 }
1753 `)
1754 })
1755
1756}
1757
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001758func TestCertificates(t *testing.T) {
1759 testCases := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001760 name string
1761 bp string
Colin Cross5caad2b2022-12-12 15:11:46 -08001762 allowMissingDependencies bool
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001763 certificateOverride string
1764 expectedCertSigningFlags string
1765 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001766 }{
1767 {
1768 name: "default",
1769 bp: `
1770 android_app {
1771 name: "foo",
1772 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001773 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001774 }
1775 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001776 certificateOverride: "",
1777 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08001778 expectedCertificate: "build/make/target/product/security/testkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001779 },
1780 {
1781 name: "module certificate property",
1782 bp: `
1783 android_app {
1784 name: "foo",
1785 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001786 certificate: ":new_certificate",
1787 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001788 }
1789
1790 android_app_certificate {
1791 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001792 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001793 }
1794 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001795 certificateOverride: "",
1796 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08001797 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001798 },
1799 {
1800 name: "path certificate property",
1801 bp: `
1802 android_app {
1803 name: "foo",
1804 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001805 certificate: "expiredkey",
1806 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001807 }
1808 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001809 certificateOverride: "",
1810 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08001811 expectedCertificate: "build/make/target/product/security/expiredkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001812 },
1813 {
1814 name: "certificate overrides",
1815 bp: `
1816 android_app {
1817 name: "foo",
1818 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001819 certificate: "expiredkey",
1820 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001821 }
1822
1823 android_app_certificate {
1824 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07001825 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001826 }
1827 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001828 certificateOverride: "foo:new_certificate",
1829 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08001830 expectedCertificate: "cert/new_cert",
Liz Kammere2b27f42020-05-07 13:24:05 -07001831 },
1832 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001833 name: "certificate signing flags",
Liz Kammere2b27f42020-05-07 13:24:05 -07001834 bp: `
1835 android_app {
1836 name: "foo",
1837 srcs: ["a.java"],
1838 certificate: ":new_certificate",
1839 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001840 rotationMinSdkVersion: "32",
Liz Kammere2b27f42020-05-07 13:24:05 -07001841 sdk_version: "current",
1842 }
1843
1844 android_app_certificate {
1845 name: "new_certificate",
1846 certificate: "cert/new_cert",
1847 }
1848 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001849 certificateOverride: "",
1850 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08001851 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001852 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001853 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001854 name: "cert signing flags from filegroup",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001855 bp: `
1856 android_app {
1857 name: "foo",
1858 srcs: ["a.java"],
1859 certificate: ":new_certificate",
1860 lineage: ":lineage_bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001861 rotationMinSdkVersion: "32",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001862 sdk_version: "current",
1863 }
1864
1865 android_app_certificate {
1866 name: "new_certificate",
1867 certificate: "cert/new_cert",
1868 }
1869
1870 filegroup {
1871 name: "lineage_bin",
1872 srcs: ["lineage.bin"],
1873 }
1874 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04001875 certificateOverride: "",
1876 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08001877 expectedCertificate: "cert/new_cert",
1878 },
1879 {
1880 name: "missing with AllowMissingDependencies",
1881 bp: `
1882 android_app {
1883 name: "foo",
1884 srcs: ["a.java"],
1885 certificate: ":new_certificate",
1886 sdk_version: "current",
1887 }
1888 `,
1889 expectedCertificate: "out/soong/.intermediates/foo/android_common/missing",
1890 allowMissingDependencies: true,
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08001891 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001892 }
1893
1894 for _, test := range testCases {
1895 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001896 result := android.GroupFixturePreparers(
1897 PrepareForTestWithJavaDefaultModules,
1898 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1899 if test.certificateOverride != "" {
1900 variables.CertificateOverrides = []string{test.certificateOverride}
1901 }
Colin Cross5caad2b2022-12-12 15:11:46 -08001902 if test.allowMissingDependencies {
1903 variables.Allow_missing_dependencies = proptools.BoolPtr(true)
1904 }
1905 }),
1906 android.FixtureModifyContext(func(ctx *android.TestContext) {
1907 ctx.SetAllowMissingDependencies(test.allowMissingDependencies)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001908 }),
1909 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001910
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001911 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001912
Colin Cross5caad2b2022-12-12 15:11:46 -08001913 certificate := foo.Module().(*AndroidApp).certificate
1914 android.AssertPathRelativeToTopEquals(t, "certificates key", test.expectedCertificate+".pk8", certificate.Key)
1915 // The sign_target_files_apks and check_target_files_signatures
1916 // tools require that certificates have a .x509.pem extension.
1917 android.AssertPathRelativeToTopEquals(t, "certificates pem", test.expectedCertificate+".x509.pem", certificate.Pem)
Liz Kammere2b27f42020-05-07 13:24:05 -07001918
Colin Cross5caad2b2022-12-12 15:11:46 -08001919 signapk := foo.Output("foo.apk")
1920 if signapk.Rule != android.ErrorRule {
1921 signCertificateFlags := signapk.Args["certificates"]
1922 expectedFlags := certificate.Pem.String() + " " + certificate.Key.String()
1923 android.AssertStringEquals(t, "certificates flags", expectedFlags, signCertificateFlags)
1924
1925 certSigningFlags := signapk.Args["flags"]
1926 android.AssertStringEquals(t, "cert signing flags", test.expectedCertSigningFlags, certSigningFlags)
1927 }
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08001928 })
1929 }
1930}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001931
Songchun Fan688de9a2020-03-24 20:32:24 -07001932func TestRequestV4SigningFlag(t *testing.T) {
1933 testCases := []struct {
1934 name string
1935 bp string
1936 expected string
1937 }{
1938 {
1939 name: "default",
1940 bp: `
1941 android_app {
1942 name: "foo",
1943 srcs: ["a.java"],
1944 sdk_version: "current",
1945 }
1946 `,
1947 expected: "",
1948 },
1949 {
1950 name: "default",
1951 bp: `
1952 android_app {
1953 name: "foo",
1954 srcs: ["a.java"],
1955 sdk_version: "current",
1956 v4_signature: false,
1957 }
1958 `,
1959 expected: "",
1960 },
1961 {
1962 name: "module certificate property",
1963 bp: `
1964 android_app {
1965 name: "foo",
1966 srcs: ["a.java"],
1967 sdk_version: "current",
1968 v4_signature: true,
1969 }
1970 `,
1971 expected: "--enable-v4",
1972 },
1973 }
1974
1975 for _, test := range testCases {
1976 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001977 result := android.GroupFixturePreparers(
1978 PrepareForTestWithJavaDefaultModules,
1979 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07001980
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001981 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07001982
1983 signapk := foo.Output("foo.apk")
1984 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001985 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07001986 })
1987 }
1988}
1989
Jaewoong Jung9d22a912019-01-23 16:27:47 -08001990func TestPackageNameOverride(t *testing.T) {
1991 testCases := []struct {
1992 name string
1993 bp string
1994 packageNameOverride string
1995 expected []string
1996 }{
1997 {
1998 name: "default",
1999 bp: `
2000 android_app {
2001 name: "foo",
2002 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002003 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002004 }
2005 `,
2006 packageNameOverride: "",
2007 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002008 "out/soong/.intermediates/foo/android_common/foo.apk",
2009 "out/soong/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002010 },
2011 },
2012 {
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002013 name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002014 bp: `
2015 android_app {
2016 name: "foo",
2017 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002018 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002019 }
2020 `,
2021 packageNameOverride: "foo:bar",
2022 expected: []string{
2023 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002024 "out/soong/.intermediates/foo/android_common/bar.apk",
2025 "out/soong/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002026 },
2027 },
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002028 {
2029 name: "overridden via stem",
2030 bp: `
2031 android_app {
2032 name: "foo",
2033 srcs: ["a.java"],
2034 sdk_version: "current",
2035 stem: "bar",
2036 }
2037 `,
2038 packageNameOverride: "",
2039 expected: []string{
2040 "out/soong/.intermediates/foo/android_common/bar.apk",
2041 "out/soong/target/product/test_device/system/app/bar/bar.apk",
2042 },
2043 },
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002044 }
2045
2046 for _, test := range testCases {
2047 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002048 result := android.GroupFixturePreparers(
2049 PrepareForTestWithJavaDefaultModules,
2050 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2051 if test.packageNameOverride != "" {
2052 variables.PackageNameOverrides = []string{test.packageNameOverride}
2053 }
2054 }),
2055 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002056
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002057 foo := result.ModuleForTests("foo", "android_common")
2058
Lukacs T. Berkifbaf7252021-08-19 09:36:42 +02002059 outSoongDir := result.Config.SoongOutDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002060
2061 outputs := foo.AllOutputs()
2062 outputMap := make(map[string]bool)
2063 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002064 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002065 }
2066 for _, e := range test.expected {
2067 if _, exist := outputMap[e]; !exist {
2068 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
2069 }
2070 }
2071 })
2072 }
2073}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002074
2075func TestInstrumentationTargetOverridden(t *testing.T) {
2076 bp := `
2077 android_app {
2078 name: "foo",
2079 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002080 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002081 }
2082
2083 android_test {
2084 name: "bar",
2085 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002086 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002087 }
2088 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002089
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002090 result := android.GroupFixturePreparers(
2091 PrepareForTestWithJavaDefaultModules,
2092 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2093 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
2094 }),
2095 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002096
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002097 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002098 res := bar.Output("package-res.apk")
2099 aapt2Flags := res.Args["flags"]
2100 e := "--rename-instrumentation-target-package org.dandroid.bp"
2101 if !strings.Contains(aapt2Flags, e) {
2102 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
2103 }
2104}
Jaewoong Jung525443a2019-02-28 15:35:54 -08002105
2106func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002107 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2108 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08002109 android_app {
2110 name: "foo",
2111 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07002112 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002113 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002114 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002115 }
2116
2117 override_android_app {
2118 name: "bar",
2119 base: "foo",
2120 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07002121 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002122 rotationMinSdkVersion: "32",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002123 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002124 }
2125
2126 android_app_certificate {
2127 name: "new_certificate",
2128 certificate: "cert/new_cert",
2129 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002130
2131 override_android_app {
2132 name: "baz",
2133 base: "foo",
2134 package_name: "org.dandroid.bp",
2135 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002136
2137 override_android_app {
2138 name: "baz_no_rename_resources",
2139 base: "foo",
2140 package_name: "org.dandroid.bp",
2141 rename_resources_package: false,
2142 }
2143
2144 android_app {
2145 name: "foo_no_rename_resources",
2146 srcs: ["a.java"],
2147 certificate: "expiredkey",
2148 overrides: ["qux"],
2149 rename_resources_package: false,
2150 sdk_version: "current",
2151 }
2152
2153 override_android_app {
2154 name: "baz_base_no_rename_resources",
2155 base: "foo_no_rename_resources",
2156 package_name: "org.dandroid.bp",
2157 }
2158
2159 override_android_app {
2160 name: "baz_override_base_rename_resources",
2161 base: "foo_no_rename_resources",
2162 package_name: "org.dandroid.bp",
2163 rename_resources_package: true,
2164 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08002165 `)
2166
2167 expectedVariants := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002168 name string
2169 moduleName string
2170 variantName string
2171 apkName string
2172 apkPath string
2173 certFlag string
2174 certSigningFlags string
2175 overrides []string
2176 packageFlag string
2177 renameResources bool
2178 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08002179 }{
2180 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002181 name: "foo",
2182 moduleName: "foo",
2183 variantName: "android_common",
2184 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2185 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2186 certSigningFlags: "",
2187 overrides: []string{"qux"},
2188 packageFlag: "",
2189 renameResources: false,
2190 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002191 },
2192 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002193 name: "foo",
2194 moduleName: "bar",
2195 variantName: "android_common_bar",
2196 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2197 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
2198 certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
2199 overrides: []string{"qux", "foo"},
2200 packageFlag: "",
2201 renameResources: false,
2202 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002203 },
2204 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002205 name: "foo",
2206 moduleName: "baz",
2207 variantName: "android_common_baz",
2208 apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk",
2209 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2210 certSigningFlags: "",
2211 overrides: []string{"qux", "foo"},
2212 packageFlag: "org.dandroid.bp",
2213 renameResources: true,
2214 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002215 },
2216 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002217 name: "foo",
2218 moduleName: "baz_no_rename_resources",
2219 variantName: "android_common_baz_no_rename_resources",
2220 apkPath: "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
2221 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2222 certSigningFlags: "",
2223 overrides: []string{"qux", "foo"},
2224 packageFlag: "org.dandroid.bp",
2225 renameResources: false,
2226 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002227 },
2228 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002229 name: "foo_no_rename_resources",
2230 moduleName: "baz_base_no_rename_resources",
2231 variantName: "android_common_baz_base_no_rename_resources",
2232 apkPath: "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
2233 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2234 certSigningFlags: "",
2235 overrides: []string{"qux", "foo_no_rename_resources"},
2236 packageFlag: "org.dandroid.bp",
2237 renameResources: false,
2238 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002239 },
2240 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002241 name: "foo_no_rename_resources",
2242 moduleName: "baz_override_base_rename_resources",
2243 variantName: "android_common_baz_override_base_rename_resources",
2244 apkPath: "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
2245 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2246 certSigningFlags: "",
2247 overrides: []string{"qux", "foo_no_rename_resources"},
2248 packageFlag: "org.dandroid.bp",
2249 renameResources: true,
2250 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002251 },
2252 }
2253 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002254 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002255
2256 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002257 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002258
2259 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08002260 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07002261 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002262 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07002263
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002264 // Check the cert signing flags
2265 certSigningFlags := signapk.Args["flags"]
2266 android.AssertStringEquals(t, "cert signing flags", expected.certSigningFlags, certSigningFlags)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002267
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002268 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08002269 mod := variant.Module().(*AndroidApp)
zhidoua2ce78f2022-02-17 02:33:12 +00002270 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002271
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002272 // Test Overridable property: Logging_parent
2273 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002274 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002275
Liz Kammer1d5983b2020-05-19 19:15:37 +00002276 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002277 res := variant.Output("package-res.apk")
2278 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00002279 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
2280 expectedPackage := expected.packageFlag
2281 if !expected.renameResources {
2282 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00002283 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002284 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002285 }
2286}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07002287
zhidoua2ce78f2022-02-17 02:33:12 +00002288func TestOverrideAndroidAppOverrides(t *testing.T) {
2289 ctx, _ := testJava(
2290 t, `
2291 android_app {
2292 name: "foo",
2293 srcs: ["a.java"],
2294 sdk_version: "current",
2295 overrides: ["qux"]
2296 }
2297
2298 android_app {
2299 name: "bar",
2300 srcs: ["b.java"],
2301 sdk_version: "current",
2302 overrides: ["foo"]
2303 }
2304
2305 override_android_app {
2306 name: "foo_override",
2307 base: "foo",
2308 overrides: ["bar"]
2309 }
2310 `)
2311
2312 expectedVariants := []struct {
2313 name string
2314 moduleName string
2315 variantName string
2316 overrides []string
2317 }{
2318 {
2319 name: "foo",
2320 moduleName: "foo",
2321 variantName: "android_common",
2322 overrides: []string{"qux"},
2323 },
2324 {
2325 name: "bar",
2326 moduleName: "bar",
2327 variantName: "android_common",
2328 overrides: []string{"foo"},
2329 },
2330 {
2331 name: "foo",
2332 moduleName: "foo_override",
2333 variantName: "android_common_foo_override",
2334 overrides: []string{"bar", "foo"},
2335 },
2336 }
2337 for _, expected := range expectedVariants {
2338 variant := ctx.ModuleForTests(expected.name, expected.variantName)
2339
2340 // Check if the overrides field values are correctly aggregated.
2341 mod := variant.Module().(*AndroidApp)
2342 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2343 }
2344}
2345
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002346func TestOverrideAndroidAppWithPrebuilt(t *testing.T) {
2347 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2348 t, `
2349 android_app {
2350 name: "foo",
2351 srcs: ["a.java"],
2352 sdk_version: "current",
2353 }
2354
2355 override_android_app {
2356 name: "bar",
2357 base: "foo",
2358 }
2359
2360 android_app_import {
2361 name: "bar",
2362 prefer: true,
2363 apk: "bar.apk",
2364 presigned: true,
2365 }
2366 `)
2367
2368 // An app that has an override that also has a prebuilt should not be hidden.
2369 foo := result.ModuleForTests("foo", "android_common")
2370 if foo.Module().IsHideFromMake() {
2371 t.Errorf("expected foo to have HideFromMake false")
2372 }
2373
2374 // An override that also has a prebuilt should be hidden.
2375 barOverride := result.ModuleForTests("foo", "android_common_bar")
2376 if !barOverride.Module().IsHideFromMake() {
2377 t.Errorf("expected bar override variant of foo to have HideFromMake true")
2378 }
2379}
2380
Jooyung Han01d80d82022-01-08 12:16:32 +09002381func TestOverrideAndroidAppStem(t *testing.T) {
2382 ctx, _ := testJava(t, `
2383 android_app {
2384 name: "foo",
2385 srcs: ["a.java"],
2386 sdk_version: "current",
2387 }
2388 override_android_app {
2389 name: "bar",
2390 base: "foo",
2391 }
2392 override_android_app {
2393 name: "baz",
2394 base: "foo",
2395 stem: "baz_stem",
2396 }
2397 android_app {
2398 name: "foo2",
2399 srcs: ["a.java"],
2400 sdk_version: "current",
2401 stem: "foo2_stem",
2402 }
2403 override_android_app {
2404 name: "bar2",
2405 base: "foo2",
2406 }
2407 override_android_app {
2408 name: "baz2",
2409 base: "foo2",
2410 stem: "baz2_stem",
2411 }
2412 `)
2413 for _, expected := range []struct {
2414 moduleName string
2415 variantName string
2416 apkPath string
2417 }{
2418 {
2419 moduleName: "foo",
2420 variantName: "android_common",
2421 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2422 },
2423 {
2424 moduleName: "foo",
2425 variantName: "android_common_bar",
2426 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2427 },
2428 {
2429 moduleName: "foo",
2430 variantName: "android_common_baz",
2431 apkPath: "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk",
2432 },
2433 {
2434 moduleName: "foo2",
2435 variantName: "android_common",
2436 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2437 },
2438 {
2439 moduleName: "foo2",
2440 variantName: "android_common_bar2",
2441 // Note that this may cause the duplicate output error.
2442 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2443 },
2444 {
2445 moduleName: "foo2",
2446 variantName: "android_common_baz2",
2447 apkPath: "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
2448 },
2449 } {
2450 variant := ctx.ModuleForTests(expected.moduleName, expected.variantName)
2451 variant.Output(expected.apkPath)
2452 }
2453}
2454
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002455func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002456 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002457 android_app {
2458 name: "foo",
2459 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002460 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002461 }
2462
2463 override_android_app {
2464 name: "bar",
2465 base: "foo",
2466 package_name: "org.dandroid.bp",
2467 }
2468
2469 android_test {
2470 name: "baz",
2471 srcs: ["b.java"],
2472 instrumentation_for: "foo",
2473 }
2474
2475 android_test {
2476 name: "qux",
2477 srcs: ["b.java"],
2478 instrumentation_for: "bar",
2479 }
2480 `)
2481
2482 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002483 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002484 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002485 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2486 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2487 }
2488
2489 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002490 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002491 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002492 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2493 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2494 }
2495}
2496
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002497func TestOverrideAndroidTest(t *testing.T) {
2498 ctx, _ := testJava(t, `
2499 android_app {
2500 name: "foo",
2501 srcs: ["a.java"],
2502 package_name: "com.android.foo",
2503 sdk_version: "current",
2504 }
2505
2506 override_android_app {
2507 name: "bar",
2508 base: "foo",
2509 package_name: "com.android.bar",
2510 }
2511
2512 android_test {
2513 name: "foo_test",
2514 srcs: ["b.java"],
2515 instrumentation_for: "foo",
2516 }
2517
2518 override_android_test {
2519 name: "bar_test",
2520 base: "foo_test",
2521 package_name: "com.android.bar.test",
2522 instrumentation_for: "bar",
2523 instrumentation_target_package: "com.android.bar",
2524 }
2525 `)
2526
2527 expectedVariants := []struct {
2528 moduleName string
2529 variantName string
2530 apkPath string
2531 overrides []string
2532 targetVariant string
2533 packageFlag string
2534 targetPackageFlag string
2535 }{
2536 {
2537 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002538 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002539 overrides: nil,
2540 targetVariant: "android_common",
2541 packageFlag: "",
2542 targetPackageFlag: "",
2543 },
2544 {
2545 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002546 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002547 overrides: []string{"foo_test"},
2548 targetVariant: "android_common_bar",
2549 packageFlag: "com.android.bar.test",
2550 targetPackageFlag: "com.android.bar",
2551 },
2552 }
2553 for _, expected := range expectedVariants {
2554 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2555
2556 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002557 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002558
2559 // Check if the overrides field values are correctly aggregated.
2560 mod := variant.Module().(*AndroidTest)
zhidoua2ce78f2022-02-17 02:33:12 +00002561 if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002562 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
zhidoua2ce78f2022-02-17 02:33:12 +00002563 expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002564 }
2565
2566 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01002567 javac := variant.Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002568 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002569 if !strings.Contains(javac.Args["classpath"], turbine) {
2570 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
2571 }
2572
2573 // Check aapt2 flags.
2574 res := variant.Output("package-res.apk")
2575 aapt2Flags := res.Args["flags"]
2576 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00002577 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002578 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
2579 }
2580}
2581
Jaewoong Jung39982342020-01-14 10:27:18 -08002582func TestAndroidTest_FixTestConfig(t *testing.T) {
2583 ctx, _ := testJava(t, `
2584 android_app {
2585 name: "foo",
2586 srcs: ["a.java"],
2587 package_name: "com.android.foo",
2588 sdk_version: "current",
2589 }
2590
2591 android_test {
2592 name: "foo_test",
2593 srcs: ["b.java"],
2594 instrumentation_for: "foo",
2595 }
2596
2597 android_test {
2598 name: "bar_test",
2599 srcs: ["b.java"],
2600 package_name: "com.android.bar.test",
2601 instrumentation_for: "foo",
Seth Moorec6f4b532023-02-02 13:22:26 -08002602 mainline_package_name: "com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08002603 }
2604
2605 override_android_test {
2606 name: "baz_test",
2607 base: "foo_test",
2608 package_name: "com.android.baz.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08002609 mainline_package_name: "com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08002610 }
2611 `)
2612
2613 testCases := []struct {
2614 moduleName string
2615 variantName string
2616 expectedFlags []string
2617 }{
2618 {
2619 moduleName: "foo_test",
2620 variantName: "android_common",
2621 },
2622 {
2623 moduleName: "bar_test",
2624 variantName: "android_common",
2625 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002626 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002627 "--package-name com.android.bar.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08002628 "--mainline-package-name com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08002629 },
2630 },
2631 {
2632 moduleName: "foo_test",
2633 variantName: "android_common_baz_test",
2634 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002635 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08002636 "--package-name com.android.baz.test",
2637 "--test-file-name baz_test.apk",
Seth Moorec6f4b532023-02-02 13:22:26 -08002638 "out/soong/.intermediates/foo_test/android_common_baz_test/test_config_fixer/AndroidTest.xml",
2639 "--mainline-package-name com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08002640 },
2641 },
2642 }
2643
2644 for _, test := range testCases {
2645 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01002646 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08002647
2648 if len(test.expectedFlags) > 0 {
2649 if params.Rule == nil {
2650 t.Errorf("test_config_fixer was expected to run, but didn't")
2651 } else {
2652 for _, flag := range test.expectedFlags {
2653 if !strings.Contains(params.RuleParams.Command, flag) {
2654 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
2655 }
2656 }
2657 }
2658 } else {
2659 if params.Rule != nil {
2660 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
2661 }
2662 }
Jaewoong Jung39982342020-01-14 10:27:18 -08002663 }
2664}
2665
Paul Duffin53a70a42022-01-11 14:35:55 +00002666func TestInstrumentationTargetPrebuilt(t *testing.T) {
2667 bp := `
2668 android_app_import {
2669 name: "foo",
2670 apk: "foo.apk",
2671 presigned: true,
2672 }
2673
2674 android_test {
2675 name: "bar",
2676 srcs: ["a.java"],
2677 instrumentation_for: "foo",
2678 sdk_version: "current",
2679 }
2680 `
2681
2682 android.GroupFixturePreparers(
2683 PrepareForTestWithJavaDefaultModules,
2684 ).ExtendWithErrorHandler(
2685 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
2686 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
2687 RunTestWithBp(t, bp)
2688}
2689
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002690func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002691 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002692 cc_library {
2693 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08002694 sdk_version: "current",
2695 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002696 }
2697
2698 android_test {
2699 name: "stl",
2700 jni_libs: ["libjni"],
2701 compile_multilib: "both",
2702 sdk_version: "current",
2703 stl: "c++_shared",
2704 }
2705
2706 android_test {
2707 name: "system",
2708 jni_libs: ["libjni"],
2709 compile_multilib: "both",
2710 sdk_version: "current",
2711 }
2712 `)
2713
2714 testCases := []struct {
2715 name string
2716 jnis []string
2717 }{
2718 {"stl",
2719 []string{
2720 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07002721 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002722 },
2723 },
2724 {"system",
2725 []string{
2726 "libjni.so",
2727 },
2728 },
2729 }
2730
2731 for _, test := range testCases {
2732 t.Run(test.name, func(t *testing.T) {
2733 app := ctx.ModuleForTests(test.name, "android_common")
Sam Delmerico82602492022-06-10 17:05:42 +00002734 jniLibZip := app.Output(jniJarOutputPathString)
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07002735 var jnis []string
2736 args := strings.Fields(jniLibZip.Args["jarArgs"])
2737 for i := 0; i < len(args); i++ {
2738 if args[i] == "-f" {
2739 jnis = append(jnis, args[i+1])
2740 i += 1
2741 }
2742 }
2743 jnisJoined := strings.Join(jnis, " ")
2744 for _, jni := range test.jnis {
2745 if !strings.Contains(jnisJoined, jni) {
2746 t.Errorf("missing jni %q in %q", jni, jnis)
2747 }
2748 }
2749 })
2750 }
2751}
Colin Cross50ddcc42019-05-16 12:28:22 -07002752
2753func TestUsesLibraries(t *testing.T) {
2754 bp := `
2755 java_sdk_library {
2756 name: "foo",
2757 srcs: ["a.java"],
2758 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002759 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002760 }
2761
2762 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01002763 name: "qux",
2764 srcs: ["a.java"],
2765 api_packages: ["qux"],
2766 sdk_version: "current",
2767 }
2768
2769 java_sdk_library {
2770 name: "quuz",
2771 srcs: ["a.java"],
2772 api_packages: ["quuz"],
2773 sdk_version: "current",
2774 }
2775
2776 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002777 name: "fred",
2778 srcs: ["a.java"],
2779 api_packages: ["fred"],
2780 sdk_version: "current",
2781 }
2782
2783 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07002784 name: "bar",
2785 srcs: ["a.java"],
2786 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002787 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002788 }
2789
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01002790 java_sdk_library {
2791 name: "runtime-library",
2792 srcs: ["a.java"],
2793 sdk_version: "current",
2794 }
2795
2796 java_library {
2797 name: "static-runtime-helper",
2798 srcs: ["a.java"],
2799 libs: ["runtime-library"],
2800 sdk_version: "current",
2801 }
2802
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002803 java_library {
2804 name: "runtime-required-x",
2805 srcs: ["a.java"],
2806 installable: true,
2807 sdk_version: "current",
2808 }
2809
2810 java_library {
2811 name: "runtime-optional-x",
2812 srcs: ["a.java"],
2813 installable: true,
2814 sdk_version: "current",
2815 }
2816
2817 android_library {
2818 name: "static-x",
2819 uses_libs: ["runtime-required-x"],
2820 optional_uses_libs: ["runtime-optional-x"],
2821 sdk_version: "current",
2822 }
2823
2824 java_library {
2825 name: "runtime-required-y",
2826 srcs: ["a.java"],
2827 installable: true,
2828 sdk_version: "current",
2829 }
2830
2831 java_library {
2832 name: "runtime-optional-y",
2833 srcs: ["a.java"],
2834 installable: true,
2835 sdk_version: "current",
2836 }
2837
2838 java_library {
2839 name: "static-y",
2840 srcs: ["a.java"],
2841 uses_libs: ["runtime-required-y"],
2842 optional_uses_libs: ["runtime-optional-y"],
2843 sdk_version: "current",
2844 }
2845
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002846 // A library that has to use "provides_uses_lib", because:
2847 // - it is not an SDK library
2848 // - its library name is different from its module name
2849 java_library {
2850 name: "non-sdk-lib",
2851 provides_uses_lib: "com.non.sdk.lib",
2852 installable: true,
2853 srcs: ["a.java"],
2854 }
2855
Colin Cross50ddcc42019-05-16 12:28:22 -07002856 android_app {
2857 name: "app",
2858 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002859 libs: [
2860 "qux",
2861 "quuz.stubs"
2862 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002863 static_libs: [
2864 "static-runtime-helper",
2865 // statically linked component libraries should not pull their SDK libraries,
2866 // so "fred" should not be added to class loader context
2867 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002868 "static-x",
2869 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00002870 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002871 uses_libs: [
2872 "foo",
2873 "non-sdk-lib"
2874 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002875 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07002876 optional_uses_libs: [
2877 "bar",
2878 "baz",
2879 ],
2880 }
2881
2882 android_app_import {
2883 name: "prebuilt",
2884 apk: "prebuilts/apk/app.apk",
2885 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00002886 uses_libs: [
2887 "foo",
2888 "non-sdk-lib",
2889 "android.test.runner"
2890 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07002891 optional_uses_libs: [
2892 "bar",
2893 "baz",
2894 ],
2895 }
2896 `
2897
Paul Duffin71ae5942021-03-22 15:36:52 +00002898 result := android.GroupFixturePreparers(
2899 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00002900 PrepareForTestWithJavaSdkLibraryFiles,
2901 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Jiakai Zhang48203e32023-06-02 23:42:21 +01002902 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2903 variables.BuildWarningBadOptionalUsesLibsAllowlist = []string{"app", "prebuilt"}
2904 }),
Paul Duffind234b412021-03-12 23:04:46 +00002905 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07002906
Paul Duffind234b412021-03-12 23:04:46 +00002907 app := result.ModuleForTests("app", "android_common")
2908 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07002909
Paul Duffin859fe962020-05-15 10:20:31 +01002910 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01002911 // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be
2912 // propagated from dependencies.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002913 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
2914 expectManifestFixerArgs := `--extract-native-libs=true ` +
2915 `--uses-library qux ` +
2916 `--uses-library quuz ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01002917 `--uses-library foo ` +
2918 `--uses-library com.non.sdk.lib ` +
2919 `--uses-library runtime-library ` +
2920 `--uses-library runtime-required-x ` +
2921 `--uses-library runtime-required-y ` +
2922 `--optional-uses-library bar ` +
2923 `--optional-uses-library runtime-optional-x ` +
2924 `--optional-uses-library runtime-optional-y`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00002925 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01002926
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002927 // Test that all libraries are verified (library order matters).
2928 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
2929 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00002930 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002931 `--uses-library qux ` +
2932 `--uses-library quuz ` +
2933 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002934 `--uses-library runtime-required-x ` +
2935 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002936 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01002937 `--optional-uses-library baz ` +
2938 `--optional-uses-library runtime-optional-x ` +
2939 `--optional-uses-library runtime-optional-y `
Paul Duffind234b412021-03-12 23:04:46 +00002940 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002941
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002942 // Test that all libraries are verified for an APK (library order matters).
2943 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00002944 verifyApkArgs := `--uses-library foo ` +
2945 `--uses-library com.non.sdk.lib ` +
2946 `--uses-library android.test.runner ` +
2947 `--optional-uses-library bar ` +
2948 `--optional-uses-library baz `
Paul Duffind234b412021-03-12 23:04:46 +00002949 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07002950
Jiakai Zhanga4496782023-05-17 16:57:30 +01002951 // Test that necessary args are passed for constructing CLC in Ninja phase.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00002952 cmd := app.Rule("dexpreopt").RuleParams.Command
Jiakai Zhanga4496782023-05-17 16:57:30 +01002953 android.AssertStringDoesContain(t, "dexpreopt app cmd context", cmd, "--context-json=")
2954 android.AssertStringDoesContain(t, "dexpreopt app cmd product_packages", cmd,
Jiakai Zhang51b2a8b2023-06-26 16:47:38 +01002955 "--product-packages=out/soong/.intermediates/app/android_common/dexpreopt/product_packages.txt")
Colin Cross50ddcc42019-05-16 12:28:22 -07002956}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07002957
Ulya Trafimovich9023b022021-03-22 16:02:28 +00002958func TestDexpreoptBcp(t *testing.T) {
2959 bp := `
2960 java_sdk_library {
2961 name: "foo",
2962 srcs: ["a.java"],
2963 api_packages: ["foo"],
2964 sdk_version: "current",
2965 }
2966
2967 java_sdk_library {
2968 name: "bar",
2969 srcs: ["a.java"],
2970 api_packages: ["bar"],
2971 permitted_packages: ["bar"],
2972 sdk_version: "current",
2973 }
2974
2975 android_app {
2976 name: "app",
2977 srcs: ["a.java"],
2978 sdk_version: "current",
2979 }
2980 `
2981
2982 testCases := []struct {
2983 name string
2984 with bool
2985 expect string
2986 }{
2987 {
2988 name: "with updatable bcp",
2989 with: true,
2990 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
2991 },
2992 {
2993 name: "without updatable bcp",
2994 with: false,
2995 expect: "/system/framework/foo.jar",
2996 },
2997 }
2998
2999 for _, test := range testCases {
3000 t.Run(test.name, func(t *testing.T) {
3001 result := android.GroupFixturePreparers(
3002 prepareForJavaTest,
3003 PrepareForTestWithJavaSdkLibraryFiles,
3004 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
3005 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01003006 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003007 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
3008 ).RunTestWithBp(t, bp)
3009
3010 app := result.ModuleForTests("app", "android_common")
3011 cmd := app.Rule("dexpreopt").RuleParams.Command
3012 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
3013 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
3014 })
3015 }
3016}
3017
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003018func TestCodelessApp(t *testing.T) {
3019 testCases := []struct {
3020 name string
3021 bp string
3022 noCode bool
3023 }{
3024 {
3025 name: "normal",
3026 bp: `
3027 android_app {
3028 name: "foo",
3029 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003030 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003031 }
3032 `,
3033 noCode: false,
3034 },
3035 {
3036 name: "app without sources",
3037 bp: `
3038 android_app {
3039 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003040 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003041 }
3042 `,
3043 noCode: true,
3044 },
3045 {
3046 name: "app with libraries",
3047 bp: `
3048 android_app {
3049 name: "foo",
3050 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003051 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003052 }
3053
3054 java_library {
3055 name: "lib",
3056 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003057 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003058 }
3059 `,
3060 noCode: false,
3061 },
3062 {
3063 name: "app with sourceless libraries",
3064 bp: `
3065 android_app {
3066 name: "foo",
3067 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003068 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003069 }
3070
3071 java_library {
3072 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003073 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003074 }
3075 `,
3076 // TODO(jungjw): this should probably be true
3077 noCode: false,
3078 },
3079 }
3080
3081 for _, test := range testCases {
3082 t.Run(test.name, func(t *testing.T) {
3083 ctx := testApp(t, test.bp)
3084
3085 foo := ctx.ModuleForTests("foo", "android_common")
3086 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3087 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
3088 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
3089 }
3090 })
3091 }
3092}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07003093
Colin Cross53a87f52019-06-25 13:35:30 -07003094func TestUncompressDex(t *testing.T) {
3095 testCases := []struct {
3096 name string
3097 bp string
3098
3099 uncompressedPlatform bool
3100 uncompressedUnbundled bool
3101 }{
3102 {
3103 name: "normal",
3104 bp: `
3105 android_app {
3106 name: "foo",
3107 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003108 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003109 }
3110 `,
3111 uncompressedPlatform: true,
3112 uncompressedUnbundled: false,
3113 },
3114 {
3115 name: "use_embedded_dex",
3116 bp: `
3117 android_app {
3118 name: "foo",
3119 use_embedded_dex: true,
3120 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003121 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003122 }
3123 `,
3124 uncompressedPlatform: true,
3125 uncompressedUnbundled: true,
3126 },
3127 {
3128 name: "privileged",
3129 bp: `
3130 android_app {
3131 name: "foo",
3132 privileged: true,
3133 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003134 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003135 }
3136 `,
3137 uncompressedPlatform: true,
3138 uncompressedUnbundled: true,
3139 },
David Srbeckye033cba2020-05-20 22:20:28 +01003140 {
3141 name: "normal_uncompress_dex_true",
3142 bp: `
3143 android_app {
3144 name: "foo",
3145 srcs: ["a.java"],
3146 sdk_version: "current",
3147 uncompress_dex: true,
3148 }
3149 `,
3150 uncompressedPlatform: true,
3151 uncompressedUnbundled: true,
3152 },
3153 {
3154 name: "normal_uncompress_dex_false",
3155 bp: `
3156 android_app {
3157 name: "foo",
3158 srcs: ["a.java"],
3159 sdk_version: "current",
3160 uncompress_dex: false,
3161 }
3162 `,
3163 uncompressedPlatform: false,
3164 uncompressedUnbundled: false,
3165 },
Colin Cross53a87f52019-06-25 13:35:30 -07003166 }
3167
3168 test := func(t *testing.T, bp string, want bool, unbundled bool) {
3169 t.Helper()
3170
Paul Duffin71ae5942021-03-22 15:36:52 +00003171 result := android.GroupFixturePreparers(
3172 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003173 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00003174 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3175 if unbundled {
3176 variables.Unbundled_build = proptools.BoolPtr(true)
3177 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
3178 }
3179 }),
3180 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07003181
Paul Duffincdb88a92021-03-14 00:36:50 +00003182 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07003183 dex := foo.Rule("r8")
3184 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
3185 aligned := foo.MaybeRule("zipalign").Rule != nil
3186
Paul Duffincdb88a92021-03-14 00:36:50 +00003187 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07003188
Paul Duffincdb88a92021-03-14 00:36:50 +00003189 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07003190 }
3191
3192 for _, tt := range testCases {
3193 t.Run(tt.name, func(t *testing.T) {
3194 t.Run("platform", func(t *testing.T) {
3195 test(t, tt.bp, tt.uncompressedPlatform, false)
3196 })
3197 t.Run("unbundled", func(t *testing.T) {
3198 test(t, tt.bp, tt.uncompressedUnbundled, true)
3199 })
3200 })
3201 }
3202}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003203
3204func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
3205 if expectedValue != "" {
3206 expectedFlag := "--" + flagName + " " + expectedValue
3207 if !strings.Contains(aapt2Flags, expectedFlag) {
3208 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
3209 }
3210 } else {
3211 unexpectedFlag := "--" + flagName
3212 if strings.Contains(aapt2Flags, unexpectedFlag) {
3213 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
3214 }
3215 }
3216}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08003217
Cole Faust9a631312020-10-22 21:05:24 +00003218func TestExportedProguardFlagFiles(t *testing.T) {
3219 ctx, _ := testJava(t, `
3220 android_app {
3221 name: "foo",
3222 sdk_version: "current",
3223 static_libs: ["lib1"],
3224 }
3225
3226 android_library {
3227 name: "lib1",
3228 sdk_version: "current",
3229 optimize: {
3230 proguard_flags_files: ["lib1proguard.cfg"],
3231 }
3232 }
3233 `)
3234
3235 m := ctx.ModuleForTests("foo", "android_common")
3236 hasLib1Proguard := false
3237 for _, s := range m.Rule("java.r8").Implicits.Strings() {
3238 if s == "lib1proguard.cfg" {
3239 hasLib1Proguard = true
3240 break
3241 }
3242 }
3243
3244 if !hasLib1Proguard {
3245 t.Errorf("App does not use library proguard config")
3246 }
3247}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003248
3249func TestTargetSdkVersionManifestFixer(t *testing.T) {
3250 platform_sdk_codename := "Tiramisu"
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003251 platform_sdk_version := 33
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003252 testCases := []struct {
3253 name string
3254 targetSdkVersionInBp string
3255 targetSdkVersionExpected string
3256 unbundledBuild bool
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003257 platformSdkFinal bool
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003258 }{
3259 {
3260 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
3261 targetSdkVersionInBp: "30",
3262 targetSdkVersionExpected: "30",
3263 unbundledBuild: false,
3264 },
3265 {
3266 name: "Unbundled build: Android.bp has targetSdkVersion",
3267 targetSdkVersionInBp: "30",
3268 targetSdkVersionExpected: "30",
3269 unbundledBuild: true,
3270 },
3271 {
3272 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3273 targetSdkVersionInBp: platform_sdk_codename,
3274 targetSdkVersionExpected: platform_sdk_codename,
3275 unbundledBuild: false,
3276 },
3277 {
3278 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3279 targetSdkVersionInBp: platform_sdk_codename,
3280 targetSdkVersionExpected: "10000",
3281 unbundledBuild: true,
3282 },
3283
3284 {
3285 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
3286 targetSdkVersionExpected: platform_sdk_codename,
3287 unbundledBuild: false,
3288 },
3289 {
3290 name: "Unbundled build: Android.bp has no targetSdkVersion",
3291 targetSdkVersionExpected: "10000",
3292 unbundledBuild: true,
3293 },
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003294 {
3295 name: "Bundled build in REL branches",
3296 targetSdkVersionExpected: "33",
3297 unbundledBuild: false,
3298 platformSdkFinal: true,
3299 },
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003300 }
3301 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003302 targetSdkVersionTemplate := ""
3303 if testCase.targetSdkVersionInBp != "" {
3304 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, testCase.targetSdkVersionInBp)
3305 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003306 bp := fmt.Sprintf(`
3307 android_app {
3308 name: "foo",
3309 sdk_version: "current",
Spandan Dasca70fc42023-03-01 23:38:49 +00003310 %s
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003311 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003312 `, targetSdkVersionTemplate)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003313 fixture := android.GroupFixturePreparers(
3314 prepareForJavaTest,
3315 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003316 if testCase.platformSdkFinal {
3317 variables.Platform_sdk_final = proptools.BoolPtr(true)
3318 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003319 // explicitly set platform_sdk_codename to make the test deterministic
3320 variables.Platform_sdk_codename = &platform_sdk_codename
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003321 variables.Platform_sdk_version = &platform_sdk_version
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003322 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3323 // create a non-empty list if unbundledBuild==true
3324 if testCase.unbundledBuild {
3325 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3326 }
3327 }),
3328 )
3329
3330 result := fixture.RunTestWithBp(t, bp)
3331 foo := result.ModuleForTests("foo", "android_common")
3332
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003333 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3334 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003335 }
3336}
Colin Cross412436f2022-04-07 17:40:07 -07003337
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003338func TestDefaultAppTargetSdkVersionForUpdatableModules(t *testing.T) {
3339 platform_sdk_codename := "Tiramisu"
3340 platform_sdk_version := 33
3341 testCases := []struct {
3342 name string
3343 platform_sdk_final bool
3344 targetSdkVersionInBp *string
3345 targetSdkVersionExpected *string
3346 updatable bool
3347 }{
3348 {
3349 name: "Non-Updatable Module: Android.bp has older targetSdkVersion",
3350 targetSdkVersionInBp: proptools.StringPtr("29"),
3351 targetSdkVersionExpected: proptools.StringPtr("29"),
3352 updatable: false,
3353 },
3354 {
3355 name: "Updatable Module: Android.bp has older targetSdkVersion",
3356 targetSdkVersionInBp: proptools.StringPtr("30"),
3357 targetSdkVersionExpected: proptools.StringPtr("30"),
3358 updatable: true,
3359 },
3360 {
3361 name: "Updatable Module: Android.bp has no targetSdkVersion",
3362 targetSdkVersionExpected: proptools.StringPtr("10000"),
3363 updatable: true,
3364 },
3365 {
3366 name: "[SDK finalised] Non-Updatable Module: Android.bp has older targetSdkVersion",
3367 platform_sdk_final: true,
3368 targetSdkVersionInBp: proptools.StringPtr("30"),
3369 targetSdkVersionExpected: proptools.StringPtr("30"),
3370 updatable: false,
3371 },
3372 {
3373 name: "[SDK finalised] Updatable Module: Android.bp has older targetSdkVersion",
3374 platform_sdk_final: true,
3375 targetSdkVersionInBp: proptools.StringPtr("30"),
3376 targetSdkVersionExpected: proptools.StringPtr("30"),
3377 updatable: true,
3378 },
3379 {
3380 name: "[SDK finalised] Updatable Module: Android.bp has targetSdkVersion as platform sdk codename",
3381 platform_sdk_final: true,
3382 targetSdkVersionInBp: proptools.StringPtr(platform_sdk_codename),
3383 targetSdkVersionExpected: proptools.StringPtr("33"),
3384 updatable: true,
3385 },
3386 {
3387 name: "[SDK finalised] Updatable Module: Android.bp has no targetSdkVersion",
3388 platform_sdk_final: true,
3389 targetSdkVersionExpected: proptools.StringPtr("33"),
3390 updatable: true,
3391 },
3392 }
3393 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003394 targetSdkVersionTemplate := ""
3395 if testCase.targetSdkVersionInBp != nil {
3396 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, *testCase.targetSdkVersionInBp)
3397 }
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003398 bp := fmt.Sprintf(`
3399 android_app {
3400 name: "foo",
3401 sdk_version: "current",
3402 min_sdk_version: "29",
Spandan Dasca70fc42023-03-01 23:38:49 +00003403 %s
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003404 updatable: %t,
3405 enforce_default_target_sdk_version: %t
3406 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003407 `, targetSdkVersionTemplate, testCase.updatable, testCase.updatable) // enforce default target sdk version if app is updatable
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003408
3409 fixture := android.GroupFixturePreparers(
3410 PrepareForTestWithJavaDefaultModules,
3411 android.PrepareForTestWithAllowMissingDependencies,
3412 android.PrepareForTestWithAndroidMk,
3413 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3414 // explicitly set following platform variables to make the test deterministic
3415 variables.Platform_sdk_final = &testCase.platform_sdk_final
3416 variables.Platform_sdk_version = &platform_sdk_version
3417 variables.Platform_sdk_codename = &platform_sdk_codename
3418 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
Harshit Mahajan18845d02023-01-11 18:39:12 +00003419 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003420 variables.Unbundled_build_apps = []string{"sampleModule"}
3421 }),
3422 )
3423
3424 result := fixture.RunTestWithBp(t, bp)
3425 foo := result.ModuleForTests("foo", "android_common")
3426
3427 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3428 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+*testCase.targetSdkVersionExpected)
3429 }
3430}
3431
3432func TestEnforceDefaultAppTargetSdkVersionFlag(t *testing.T) {
3433 platform_sdk_codename := "Tiramisu"
3434 platform_sdk_version := 33
3435 testCases := []struct {
3436 name string
3437 enforceDefaultTargetSdkVersion bool
3438 expectedError string
3439 platform_sdk_final bool
3440 targetSdkVersionInBp string
3441 targetSdkVersionExpected string
3442 updatable bool
3443 }{
3444 {
3445 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
3446 enforceDefaultTargetSdkVersion: false,
3447 targetSdkVersionInBp: "29",
3448 targetSdkVersionExpected: "29",
3449 updatable: false,
3450 },
3451 {
3452 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3453 enforceDefaultTargetSdkVersion: true,
3454 platform_sdk_final: true,
3455 targetSdkVersionInBp: "current",
3456 targetSdkVersionExpected: "33",
3457 updatable: true,
3458 },
3459 {
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003460 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003461 enforceDefaultTargetSdkVersion: true,
3462 platform_sdk_final: false,
3463 targetSdkVersionInBp: "current",
3464 targetSdkVersionExpected: "10000",
3465 updatable: false,
3466 },
3467 {
3468 name: "Not enforcing Target SDK Version for Updatable app",
3469 enforceDefaultTargetSdkVersion: false,
3470 expectedError: "Updatable apps must enforce default target sdk version",
3471 targetSdkVersionInBp: "29",
3472 targetSdkVersionExpected: "29",
3473 updatable: true,
3474 },
3475 }
3476 for _, testCase := range testCases {
3477 errExpected := testCase.expectedError != ""
3478 bp := fmt.Sprintf(`
3479 android_app {
3480 name: "foo",
3481 enforce_default_target_sdk_version: %t,
3482 sdk_version: "current",
3483 min_sdk_version: "29",
3484 target_sdk_version: "%v",
3485 updatable: %t
3486 }
3487 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp, testCase.updatable)
3488
3489 fixture := android.GroupFixturePreparers(
3490 PrepareForTestWithJavaDefaultModules,
3491 android.PrepareForTestWithAllowMissingDependencies,
3492 android.PrepareForTestWithAndroidMk,
3493 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3494 // explicitly set following platform variables to make the test deterministic
3495 variables.Platform_sdk_final = &testCase.platform_sdk_final
3496 variables.Platform_sdk_version = &platform_sdk_version
3497 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00003498 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003499 variables.Unbundled_build_apps = []string{"sampleModule"}
3500 }),
3501 )
3502
3503 errorHandler := android.FixtureExpectsNoErrors
3504 if errExpected {
3505 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
3506 }
3507 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
3508
3509 if !errExpected {
3510 foo := result.ModuleForTests("foo", "android_common")
3511 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3512 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3513 }
3514 }
3515}
3516
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003517func TestEnforceDefaultAppTargetSdkVersionFlagForTests(t *testing.T) {
3518 platform_sdk_codename := "Tiramisu"
3519 platform_sdk_version := 33
3520 testCases := []struct {
3521 name string
3522 enforceDefaultTargetSdkVersion bool
3523 expectedError string
3524 platform_sdk_final bool
3525 targetSdkVersionInBp string
3526 targetSdkVersionExpected string
3527 }{
3528 {
3529 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
3530 enforceDefaultTargetSdkVersion: false,
3531 targetSdkVersionInBp: "29",
3532 targetSdkVersionExpected: "29",
3533 },
3534 {
3535 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3536 enforceDefaultTargetSdkVersion: true,
3537 platform_sdk_final: true,
3538 targetSdkVersionInBp: "current",
3539 targetSdkVersionExpected: "33",
3540 },
3541 {
3542 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3543 enforceDefaultTargetSdkVersion: true,
3544 platform_sdk_final: false,
3545 targetSdkVersionInBp: "current",
3546 targetSdkVersionExpected: "10000",
3547 },
3548 }
3549 for _, testCase := range testCases {
3550 errExpected := testCase.expectedError != ""
3551 bp := fmt.Sprintf(`
3552 android_test {
3553 name: "foo",
3554 enforce_default_target_sdk_version: %t,
3555 min_sdk_version: "29",
3556 target_sdk_version: "%v",
3557 }
3558 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp)
3559
3560 fixture := android.GroupFixturePreparers(
3561 PrepareForTestWithJavaDefaultModules,
3562 android.PrepareForTestWithAllowMissingDependencies,
3563 android.PrepareForTestWithAndroidMk,
3564 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3565 // explicitly set following platform variables to make the test deterministic
3566 variables.Platform_sdk_final = &testCase.platform_sdk_final
3567 variables.Platform_sdk_version = &platform_sdk_version
3568 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00003569 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003570 variables.Unbundled_build_apps = []string{"sampleModule"}
3571 }),
3572 )
3573
3574 errorHandler := android.FixtureExpectsNoErrors
3575 if errExpected {
3576 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
3577 }
3578 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
3579
3580 if !errExpected {
3581 foo := result.ModuleForTests("foo", "android_common")
3582 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3583 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3584 }
3585 }
3586}
3587
Colin Cross412436f2022-04-07 17:40:07 -07003588func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
3589 result := android.GroupFixturePreparers(
3590 PrepareForTestWithJavaDefaultModules,
3591 android.PrepareForTestWithAllowMissingDependencies,
3592 android.PrepareForTestWithAndroidMk,
3593 ).RunTestWithBp(t, `
3594 android_app {
3595 name: "foo",
3596 srcs: ["a.java"],
3597 certificate: ":missing_certificate",
3598 sdk_version: "current",
Zyan Wub7550aa2023-05-18 15:46:31 +08003599 }
3600
3601 android_app {
3602 name: "bar",
3603 srcs: ["a.java"],
3604 certificate: ":missing_certificate",
3605 product_specific: true,
3606 sdk_version: "current",
Colin Cross412436f2022-04-07 17:40:07 -07003607 }`)
3608
3609 foo := result.ModuleForTests("foo", "android_common")
3610 fooApk := foo.Output("foo.apk")
3611 if fooApk.Rule != android.ErrorRule {
3612 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
3613 }
3614 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
3615}
Sam Delmerico82602492022-06-10 17:05:42 +00003616
3617func TestAppIncludesJniPackages(t *testing.T) {
3618 ctx := android.GroupFixturePreparers(
3619 PrepareForTestWithJavaDefaultModules,
3620 ).RunTestWithBp(t, `
3621 android_library_import {
3622 name: "aary-nodeps",
3623 aars: ["aary.aar"],
3624 extract_jni: true,
3625 }
3626
3627 android_library {
3628 name: "aary-lib",
3629 sdk_version: "current",
3630 min_sdk_version: "21",
3631 static_libs: ["aary-nodeps"],
3632 }
3633
3634 android_app {
3635 name: "aary-lib-dep",
3636 sdk_version: "current",
3637 min_sdk_version: "21",
3638 manifest: "AndroidManifest.xml",
3639 static_libs: ["aary-lib"],
3640 use_embedded_native_libs: true,
3641 }
3642
3643 android_app {
3644 name: "aary-import-dep",
3645 sdk_version: "current",
3646 min_sdk_version: "21",
3647 manifest: "AndroidManifest.xml",
3648 static_libs: ["aary-nodeps"],
3649 use_embedded_native_libs: true,
3650 }
3651
3652 android_app {
3653 name: "aary-no-use-embedded",
3654 sdk_version: "current",
3655 min_sdk_version: "21",
3656 manifest: "AndroidManifest.xml",
3657 static_libs: ["aary-nodeps"],
3658 }`)
3659
3660 testCases := []struct {
3661 name string
3662 hasPackage bool
3663 }{
3664 {
3665 name: "aary-import-dep",
3666 hasPackage: true,
3667 },
3668 {
3669 name: "aary-lib-dep",
3670 hasPackage: true,
3671 },
3672 {
3673 name: "aary-no-use-embedded",
3674 hasPackage: false,
3675 },
3676 }
3677
3678 for _, tc := range testCases {
3679 t.Run(tc.name, func(t *testing.T) {
3680 app := ctx.ModuleForTests(tc.name, "android_common")
3681
3682 outputFile := "jnilibs.zip"
3683 jniOutputLibZip := app.MaybeOutput(outputFile)
3684 if jniOutputLibZip.Rule == nil && !tc.hasPackage {
3685 return
3686 }
3687
3688 jniPackage := "arm64-v8a_jni.zip"
3689 inputs := jniOutputLibZip.Inputs
3690 foundPackage := false
3691 for i := 0; i < len(inputs); i++ {
3692 if strings.Contains(inputs[i].String(), jniPackage) {
3693 foundPackage = true
3694 }
3695 }
3696 if foundPackage != tc.hasPackage {
3697 t.Errorf("expected to find %v in %v inputs; inputs = %v", jniPackage, outputFile, inputs)
3698 }
3699 })
3700 }
3701}
Spandan Das9f7ae7f2022-07-25 00:34:18 +00003702
3703func TestTargetSdkVersionMtsTests(t *testing.T) {
3704 platformSdkCodename := "Tiramisu"
3705 android_test := "android_test"
3706 android_test_helper_app := "android_test_helper_app"
3707 bpTemplate := `
3708 %v {
3709 name: "mytest",
3710 target_sdk_version: "%v",
3711 test_suites: ["othersuite", "%v"],
3712 }
3713 `
3714 testCases := []struct {
3715 desc string
3716 moduleType string
3717 targetSdkVersionInBp string
3718 targetSdkVersionExpected string
3719 testSuites string
3720 }{
3721 {
3722 desc: "Non-MTS android_test_apps targeting current should not be upgraded to 10000",
3723 moduleType: android_test,
3724 targetSdkVersionInBp: "current",
3725 targetSdkVersionExpected: platformSdkCodename,
3726 testSuites: "non-mts-suite",
3727 },
3728 {
3729 desc: "MTS android_test_apps targeting released sdks should not be upgraded to 10000",
3730 moduleType: android_test,
3731 targetSdkVersionInBp: "29",
3732 targetSdkVersionExpected: "29",
3733 testSuites: "mts-suite",
3734 },
3735 {
3736 desc: "MTS android_test_apps targeting current should be upgraded to 10000",
3737 moduleType: android_test,
3738 targetSdkVersionInBp: "current",
3739 targetSdkVersionExpected: "10000",
3740 testSuites: "mts-suite",
3741 },
3742 {
3743 desc: "MTS android_test_helper_apps targeting current should be upgraded to 10000",
3744 moduleType: android_test_helper_app,
3745 targetSdkVersionInBp: "current",
3746 targetSdkVersionExpected: "10000",
3747 testSuites: "mts-suite",
3748 },
3749 }
3750 fixture := android.GroupFixturePreparers(
3751 prepareForJavaTest,
3752 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3753 variables.Platform_sdk_codename = &platformSdkCodename
3754 variables.Platform_version_active_codenames = []string{platformSdkCodename}
3755 }),
3756 )
3757 for _, testCase := range testCases {
3758 result := fixture.RunTestWithBp(t, fmt.Sprintf(bpTemplate, testCase.moduleType, testCase.targetSdkVersionInBp, testCase.testSuites))
3759 mytest := result.ModuleForTests("mytest", "android_common")
3760 manifestFixerArgs := mytest.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3761 android.AssertStringDoesContain(t, testCase.desc, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3762 }
3763}
Andrei Onea580636b2022-08-17 16:53:46 +00003764
3765func TestPrivappAllowlist(t *testing.T) {
3766 testJavaError(t, "privileged must be set in order to use privapp_allowlist", `
3767 android_app {
3768 name: "foo",
3769 srcs: ["a.java"],
3770 privapp_allowlist: "perms.xml",
3771 }
3772 `)
3773
3774 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
3775 t,
3776 `
3777 android_app {
3778 name: "foo",
3779 srcs: ["a.java"],
Sam Delmerico15809f82023-05-15 17:21:47 -04003780 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
Andrei Onea580636b2022-08-17 16:53:46 +00003781 privileged: true,
Andrei Onea580636b2022-08-17 16:53:46 +00003782 sdk_version: "current",
3783 }
3784 override_android_app {
3785 name: "bar",
3786 base: "foo",
3787 package_name: "com.google.android.foo",
3788 }
3789 `,
3790 )
3791 app := result.ModuleForTests("foo", "android_common")
3792 overrideApp := result.ModuleForTests("foo", "android_common_bar")
3793
Sam Delmerico15809f82023-05-15 17:21:47 -04003794 // verify that privapp allowlist is created for override apps
Andrei Onea580636b2022-08-17 16:53:46 +00003795 overrideApp.Output("out/soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml")
Sam Delmerico15809f82023-05-15 17:21:47 -04003796 expectedAllowlistInput := "privapp_allowlist_com.android.foo.xml"
3797 overrideActualAllowlistInput := overrideApp.Rule("modifyAllowlist").Input.String()
3798 if expectedAllowlistInput != overrideActualAllowlistInput {
3799 t.Errorf("expected override allowlist to be %q; got %q", expectedAllowlistInput, overrideActualAllowlistInput)
Andrei Onea580636b2022-08-17 16:53:46 +00003800 }
3801
3802 // verify that permissions are copied to device
Anton Hansson0e486a42023-06-01 16:38:35 +00003803 app.Output("out/soong/target/product/test_device/system/etc/permissions/foo.xml")
3804 overrideApp.Output("out/soong/target/product/test_device/system/etc/permissions/bar.xml")
Andrei Onea580636b2022-08-17 16:53:46 +00003805}
Sam Delmericob1daccd2023-05-25 14:45:30 -04003806
3807func TestPrivappAllowlistAndroidMk(t *testing.T) {
3808 result := android.GroupFixturePreparers(
3809 PrepareForTestWithJavaDefaultModules,
3810 android.PrepareForTestWithAndroidMk,
3811 ).RunTestWithBp(
3812 t,
3813 `
3814 android_app {
3815 name: "foo",
3816 srcs: ["a.java"],
3817 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
3818 privileged: true,
3819 sdk_version: "current",
3820 }
3821 override_android_app {
3822 name: "bar",
3823 base: "foo",
3824 package_name: "com.google.android.foo",
3825 }
3826 `,
3827 )
3828 baseApp := result.ModuleForTests("foo", "android_common")
3829 overrideApp := result.ModuleForTests("foo", "android_common_bar")
3830
3831 baseAndroidApp := baseApp.Module().(*AndroidApp)
3832 baseEntries := android.AndroidMkEntriesForTest(t, result.TestContext, baseAndroidApp)[0]
3833 android.AssertStringMatches(
3834 t,
3835 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find foo.apk",
3836 baseEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
3837 "\\S+foo.apk",
3838 )
3839 android.AssertStringMatches(
3840 t,
3841 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include foo.apk",
3842 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
3843 "\\S+foo.apk",
3844 )
3845 android.AssertStringMatches(
3846 t,
3847 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
3848 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
3849 "\\S+foo.apk:\\S+/target/product/test_device/system/priv-app/foo/foo.apk",
3850 )
3851 android.AssertStringMatches(
3852 t,
3853 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
3854 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00003855 "privapp_allowlist_com.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/foo.xml",
Sam Delmericob1daccd2023-05-25 14:45:30 -04003856 )
3857
3858 overrideAndroidApp := overrideApp.Module().(*AndroidApp)
3859 overrideEntries := android.AndroidMkEntriesForTest(t, result.TestContext, overrideAndroidApp)[0]
3860 android.AssertStringMatches(
3861 t,
3862 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find bar.apk",
3863 overrideEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
3864 "\\S+bar.apk",
3865 )
3866 android.AssertStringMatches(
3867 t,
3868 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include bar.apk",
3869 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
3870 "\\S+bar.apk",
3871 )
3872 android.AssertStringMatches(
3873 t,
3874 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
3875 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
3876 "\\S+bar.apk:\\S+/target/product/test_device/system/priv-app/bar/bar.apk",
3877 )
3878 android.AssertStringMatches(
3879 t,
3880 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
3881 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00003882 "\\S+soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/bar.xml",
Sam Delmericob1daccd2023-05-25 14:45:30 -04003883 )
3884}