blob: d6ba0f1dd54e62a8cd69a5bf34f467780f49a5bd [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,
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000561 fs.AddToFixture(),
562 ).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop))
Colin Cross0ddae7f2019-02-07 15:30:01 -0800563
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000564 module := result.ModuleForTests("foo", "android_common")
Colin Cross0ddae7f2019-02-07 15:30:01 -0800565 resourceList := module.MaybeOutput("aapt2/res.list")
566
567 var resources []string
568 if resourceList.Rule != nil {
569 for _, compiledResource := range resourceList.Inputs.Strings() {
570 resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
571 }
572 }
573
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000574 android.AssertDeepEquals(t, "resource files", testCase.resources, resources)
Colin Cross0ddae7f2019-02-07 15:30:01 -0800575 })
576 }
577}
578
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800579func TestLibraryAssets(t *testing.T) {
580 bp := `
581 android_app {
582 name: "foo",
583 sdk_version: "current",
584 static_libs: ["lib1", "lib2", "lib3"],
585 }
586
587 android_library {
588 name: "lib1",
589 sdk_version: "current",
590 asset_dirs: ["assets_a"],
591 }
592
593 android_library {
594 name: "lib2",
595 sdk_version: "current",
596 }
597
598 android_library {
599 name: "lib3",
600 sdk_version: "current",
Colin Crossab8d1382023-07-14 17:23:41 +0000601 static_libs: ["lib4", "import"],
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800602 }
603
604 android_library {
605 name: "lib4",
606 sdk_version: "current",
607 asset_dirs: ["assets_b"],
608 }
Colin Crossab8d1382023-07-14 17:23:41 +0000609
Jiakai Zhangba82e282023-10-13 18:08:59 +0100610 android_library {
611 name: "lib5",
612 sdk_version: "current",
613 assets: [
614 "path/to/asset_file_1",
615 "path/to/asset_file_2",
616 ],
617 }
618
Colin Crossab8d1382023-07-14 17:23:41 +0000619 android_library_import {
620 name: "import",
621 sdk_version: "current",
622 aars: ["import.aar"],
623 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800624 `
625
626 testCases := []struct {
Jiakai Zhangba82e282023-10-13 18:08:59 +0100627 name string
628 assetFlag string
629 assetPackages []string
630 tmpAssetDirInputs []string
631 tmpAssetDirOutputs []string
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800632 }{
633 {
634 name: "foo",
Colin Crossab8d1382023-07-14 17:23:41 +0000635 // lib1 has its own assets. lib3 doesn't have any, but lib4 and import have assets.
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800636 assetPackages: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000637 "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
638 "out/soong/.intermediates/lib1/android_common/assets.zip",
Colin Crossab8d1382023-07-14 17:23:41 +0000639 "out/soong/.intermediates/lib4/android_common/assets.zip",
640 "out/soong/.intermediates/import/android_common/assets.zip",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800641 },
642 },
643 {
644 name: "lib1",
645 assetFlag: "-A assets_a",
646 },
647 {
648 name: "lib2",
649 },
650 {
651 name: "lib3",
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800652 },
653 {
654 name: "lib4",
655 assetFlag: "-A assets_b",
656 },
Jiakai Zhangba82e282023-10-13 18:08:59 +0100657 {
658 name: "lib5",
659 assetFlag: "-A out/soong/.intermediates/lib5/android_common/tmp_asset_dir",
660 tmpAssetDirInputs: []string{
661 "path/to/asset_file_1",
662 "path/to/asset_file_2",
663 },
664 tmpAssetDirOutputs: []string{
665 "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_1",
666 "out/soong/.intermediates/lib5/android_common/tmp_asset_dir/path/to/asset_file_2",
667 },
668 },
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800669 }
670 ctx := testApp(t, bp)
671
672 for _, test := range testCases {
673 t.Run(test.name, func(t *testing.T) {
674 m := ctx.ModuleForTests(test.name, "android_common")
675
676 // Check asset flag in aapt2 link flags
677 var aapt2link android.TestingBuildParams
678 if len(test.assetPackages) > 0 {
679 aapt2link = m.Output("aapt2/package-res.apk")
680 } else {
681 aapt2link = m.Output("package-res.apk")
682 }
Paul Duffina71a67a2021-03-29 00:42:57 +0100683 aapt2link = aapt2link
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800684 aapt2Flags := aapt2link.Args["flags"]
685 if test.assetFlag != "" {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000686 android.AssertStringDoesContain(t, "asset flag", aapt2Flags, test.assetFlag)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800687 } else {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000688 android.AssertStringDoesNotContain(t, "aapt2 link flags", aapt2Flags, " -A ")
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800689 }
690
691 // Check asset merge rule.
692 if len(test.assetPackages) > 0 {
693 mergeAssets := m.Output("package-res.apk")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +0000694 android.AssertPathsRelativeToTopEquals(t, "mergeAssets inputs", test.assetPackages, mergeAssets.Inputs)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800695 }
Jiakai Zhangba82e282023-10-13 18:08:59 +0100696
697 if len(test.tmpAssetDirInputs) > 0 {
698 rule := m.Rule("tmp_asset_dir")
699 inputs := rule.Implicits
700 outputs := append(android.WritablePaths{rule.Output}, rule.ImplicitOutputs...).Paths()
701 android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir inputs", test.tmpAssetDirInputs, inputs)
702 android.AssertPathsRelativeToTopEquals(t, "tmp_asset_dir outputs", test.tmpAssetDirOutputs, outputs)
703 }
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800704 })
705 }
706}
707
Colin Crossb014f072021-02-26 14:54:36 -0800708func TestAppJavaResources(t *testing.T) {
709 bp := `
710 android_app {
711 name: "foo",
712 sdk_version: "current",
713 java_resources: ["resources/a"],
714 srcs: ["a.java"],
715 }
716
717 android_app {
718 name: "bar",
719 sdk_version: "current",
720 java_resources: ["resources/a"],
721 }
722 `
723
724 ctx := testApp(t, bp)
725
726 foo := ctx.ModuleForTests("foo", "android_common")
727 fooResources := foo.Output("res/foo.jar")
728 fooDexJar := foo.Output("dex-withres/foo.jar")
729 fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar")
730 fooApk := foo.Rule("combineApk")
731
732 if g, w := fooDexJar.Inputs.Strings(), fooResources.Output.String(); !android.InList(w, g) {
733 t.Errorf("expected resource jar %q in foo dex jar inputs %q", w, g)
734 }
735
736 if g, w := fooDexJarAligned.Input.String(), fooDexJar.Output.String(); g != w {
737 t.Errorf("expected dex jar %q in foo aligned dex jar inputs %q", w, g)
738 }
739
740 if g, w := fooApk.Inputs.Strings(), fooDexJarAligned.Output.String(); !android.InList(w, g) {
741 t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g)
742 }
743
744 bar := ctx.ModuleForTests("bar", "android_common")
745 barResources := bar.Output("res/bar.jar")
746 barApk := bar.Rule("combineApk")
747
748 if g, w := barApk.Inputs.Strings(), barResources.Output.String(); !android.InList(w, g) {
749 t.Errorf("expected resources jar %q in bar apk inputs %q", w, g)
750 }
751}
752
Colin Crossff3ff7f2023-07-05 14:04:12 -0700753func TestAndroidResourceProcessor(t *testing.T) {
754 testCases := []struct {
Colin Cross8676c8c2023-10-12 15:58:57 -0700755 name string
756 appUsesRP bool
757 directLibUsesRP bool
758 transitiveLibUsesRP bool
759 sharedLibUsesRP bool
760 sharedTransitiveStaticLibUsesRP bool
761 sharedTransitiveSharedLibUsesRP bool
Colin Crossff3ff7f2023-07-05 14:04:12 -0700762
763 dontVerifyApp bool
764 appResources []string
765 appOverlays []string
766 appImports []string
767 appSrcJars []string
768 appClasspath []string
769 appCombined []string
770
771 dontVerifyDirect bool
772 directResources []string
773 directOverlays []string
774 directImports []string
775 directSrcJars []string
776 directClasspath []string
777 directCombined []string
778
779 dontVerifyTransitive bool
780 transitiveResources []string
781 transitiveOverlays []string
782 transitiveImports []string
783 transitiveSrcJars []string
784 transitiveClasspath []string
785 transitiveCombined []string
786
787 dontVerifyDirectImport bool
788 directImportResources []string
789 directImportOverlays []string
790 directImportImports []string
791
792 dontVerifyTransitiveImport bool
793 transitiveImportResources []string
794 transitiveImportOverlays []string
795 transitiveImportImports []string
Colin Cross8676c8c2023-10-12 15:58:57 -0700796
797 dontVerifyShared bool
798 sharedResources []string
799 sharedOverlays []string
800 sharedImports []string
801 sharedSrcJars []string
802 sharedClasspath []string
803 sharedCombined []string
Colin Crossff3ff7f2023-07-05 14:04:12 -0700804 }{
805 {
Colin Cross4eae06d2023-06-20 22:40:02 -0700806 // Test with all modules set to use_resource_processor: false (except android_library_import modules,
807 // which always use resource processor).
808 name: "legacy",
809 appUsesRP: false,
810 directLibUsesRP: false,
811 transitiveLibUsesRP: false,
Colin Crossff3ff7f2023-07-05 14:04:12 -0700812
813 appResources: nil,
814 appOverlays: []string{
815 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000816 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700817 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
818 "out/soong/.intermediates/direct/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000819 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700820 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
821 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
822 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700823 appImports: []string{
824 "out/soong/.intermediates/shared/android_common/package-res.apk",
825 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
826 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700827 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
828 appClasspath: []string{
829 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700830 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700831 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000832 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700833 },
834 appCombined: []string{
835 "out/soong/.intermediates/app/android_common/javac/app.jar",
836 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000837 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700838 },
839
840 directResources: nil,
841 directOverlays: []string{
842 "out/soong/.intermediates/transitive/android_common/package-res.apk",
Colin Crossab8d1382023-07-14 17:23:41 +0000843 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700844 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
845 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
846 },
847 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
848 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
849 directClasspath: []string{
850 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
851 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000852 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700853 },
854 directCombined: []string{
855 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
856 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000857 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700858 },
859
860 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
861 transitiveOverlays: nil,
862 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
863 transitiveSrcJars: []string{"out/soong/.intermediates/transitive/android_common/gen/android/R.srcjar"},
864 transitiveClasspath: []string{"out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar"},
865 transitiveCombined: nil,
866
Colin Cross8676c8c2023-10-12 15:58:57 -0700867 sharedResources: nil,
868 sharedOverlays: []string{
869 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
870 "out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat",
871 },
872 sharedImports: []string{
873 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
874 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
875 },
876 sharedSrcJars: []string{"out/soong/.intermediates/shared/android_common/gen/android/R.srcjar"},
877 sharedClasspath: []string{
878 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
879 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar",
880 "out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar",
881 },
882 sharedCombined: []string{
883 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
884 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
885 },
886
Colin Crossff3ff7f2023-07-05 14:04:12 -0700887 directImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700888 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
889 directImportImports: []string{
890 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700891 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
892 },
Colin Crossff3ff7f2023-07-05 14:04:12 -0700893
894 transitiveImportResources: nil,
Colin Cross4eae06d2023-06-20 22:40:02 -0700895 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
896 transitiveImportImports: []string{
897 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
Colin Crossff3ff7f2023-07-05 14:04:12 -0700898 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
899 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700900 },
901 {
902 // Test with all modules set to use_resource_processor: true.
Colin Cross8676c8c2023-10-12 15:58:57 -0700903 name: "resource_processor",
904 appUsesRP: true,
905 directLibUsesRP: true,
906 transitiveLibUsesRP: true,
907 sharedLibUsesRP: true,
908 sharedTransitiveSharedLibUsesRP: true,
909 sharedTransitiveStaticLibUsesRP: true,
Colin Cross4eae06d2023-06-20 22:40:02 -0700910
911 appResources: nil,
912 appOverlays: []string{
913 "out/soong/.intermediates/transitive/android_common/package-res.apk",
914 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
915 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
916 "out/soong/.intermediates/direct/android_common/package-res.apk",
917 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
918 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
919 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
920 },
Colin Cross8676c8c2023-10-12 15:58:57 -0700921 appImports: []string{
922 "out/soong/.intermediates/shared/android_common/package-res.apk",
923 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
924 },
Colin Cross4eae06d2023-06-20 22:40:02 -0700925 appSrcJars: nil,
926 appClasspath: []string{
927 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
928 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700929 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700930 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000931 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700932 },
933 appCombined: []string{
Colin Cross4eae06d2023-06-20 22:40:02 -0700934 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Crossfd620b22024-02-23 10:05:21 -0800935 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700936 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000937 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700938 },
939
940 directResources: nil,
941 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
942 directImports: []string{
943 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
944 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
945 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
946 "out/soong/.intermediates/transitive/android_common/package-res.apk",
947 },
948 directSrcJars: nil,
949 directClasspath: []string{
950 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700951 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -0800952 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
953 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
954 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700955 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000956 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700957 },
958 directCombined: []string{
959 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
960 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +0000961 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -0700962 },
963
964 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
965 transitiveOverlays: nil,
966 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
967 transitiveSrcJars: nil,
968 transitiveClasspath: []string{
969 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
970 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
971 },
972 transitiveCombined: nil,
973
Colin Cross8676c8c2023-10-12 15:58:57 -0700974 sharedResources: nil,
975 sharedOverlays: []string{"out/soong/.intermediates/shared/android_common/aapt2/shared/res/values_strings.arsc.flat"},
976 sharedImports: []string{
977 "out/soong/.intermediates/shared_transitive_shared/android_common/package-res.apk",
978 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
979 "out/soong/.intermediates/shared_transitive_static/android_common/package-res.apk",
980 },
981 sharedSrcJars: nil,
982 sharedClasspath: []string{
983 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -0800984 "out/soong/.intermediates/shared/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700985 "out/soong/.intermediates/shared_transitive_static/android_common/busybox/R.jar",
986 "out/soong/.intermediates/shared_transitive_shared/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -0700987 "out/soong/.intermediates/shared_transitive_shared/android_common/turbine-combined/shared_transitive_shared.jar",
988 "out/soong/.intermediates/shared_transitive_static/android_common/turbine-combined/shared_transitive_static.jar",
989 },
990 sharedCombined: []string{
991 "out/soong/.intermediates/shared/android_common/javac/shared.jar",
992 "out/soong/.intermediates/shared_transitive_static/android_common/javac/shared_transitive_static.jar",
993 },
994
Colin Cross4eae06d2023-06-20 22:40:02 -0700995 directImportResources: nil,
996 directImportOverlays: []string{"out/soong/.intermediates/direct_import/android_common/flat-res/gen_res.flata"},
997 directImportImports: []string{
998 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
999 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1000 },
1001
1002 transitiveImportResources: nil,
1003 transitiveImportOverlays: []string{"out/soong/.intermediates/transitive_import/android_common/flat-res/gen_res.flata"},
1004 transitiveImportImports: []string{
1005 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1006 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1007 },
1008 }, {
1009 // Test an app building with resource processor enabled but with dependencies built without
1010 // resource processor.
1011 name: "app_resource_processor",
1012 appUsesRP: true,
1013 directLibUsesRP: false,
1014 transitiveLibUsesRP: false,
1015
1016 appResources: nil,
1017 appOverlays: []string{
1018 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1019 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1020 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1021 "out/soong/.intermediates/direct/android_common/package-res.apk",
1022 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1023 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1024 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1025 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001026 appImports: []string{
1027 "out/soong/.intermediates/shared/android_common/package-res.apk",
1028 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1029 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001030 appSrcJars: nil,
1031 appClasspath: []string{
1032 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1033 // R.jar has to come before direct.jar
1034 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001035 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001036 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001037 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001038 },
1039 appCombined: []string{
Colin Cross4eae06d2023-06-20 22:40:02 -07001040 "out/soong/.intermediates/app/android_common/javac/app.jar",
Colin Crossfd620b22024-02-23 10:05:21 -08001041 "out/soong/.intermediates/app/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001042 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001043 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001044 },
1045
1046 dontVerifyDirect: true,
1047 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001048 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001049 dontVerifyDirectImport: true,
1050 dontVerifyTransitiveImport: true,
1051 },
1052 {
1053 // Test an app building without resource processor enabled but with a dependency built with
1054 // resource processor.
1055 name: "app_dependency_lib_resource_processor",
1056 appUsesRP: false,
1057 directLibUsesRP: true,
1058 transitiveLibUsesRP: false,
1059
1060 appOverlays: []string{
1061 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1062 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1063 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1064 "out/soong/.intermediates/direct/android_common/package-res.apk",
1065 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1066 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1067 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1068 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001069 appImports: []string{
1070 "out/soong/.intermediates/shared/android_common/package-res.apk",
1071 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1072 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001073 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1074 appClasspath: []string{
1075 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001076 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001077 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001078 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001079 },
1080 appCombined: []string{
1081 "out/soong/.intermediates/app/android_common/javac/app.jar",
1082 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001083 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001084 },
1085
1086 directResources: nil,
1087 directOverlays: []string{"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat"},
1088 directImports: []string{
1089 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1090 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1091 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1092 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1093 },
1094 directSrcJars: nil,
1095 directClasspath: []string{
1096 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001097 "out/soong/.intermediates/direct/android_common/busybox/R.jar",
Colin Cross1d3f5902024-03-05 11:51:54 -08001098 "out/soong/.intermediates/transitive_import_dep/android_common/busybox/R.jar",
1099 "out/soong/.intermediates/transitive_import/android_common/busybox/R.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001100 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001101 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001102 },
1103 directCombined: []string{
1104 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1105 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001106 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001107 },
1108
1109 dontVerifyTransitive: true,
Colin Cross8676c8c2023-10-12 15:58:57 -07001110 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001111 dontVerifyDirectImport: true,
1112 dontVerifyTransitiveImport: true,
1113 },
1114 {
1115 // Test a library building without resource processor enabled but with a dependency built with
1116 // resource processor.
1117 name: "lib_dependency_lib_resource_processor",
1118 appUsesRP: false,
1119 directLibUsesRP: false,
1120 transitiveLibUsesRP: true,
1121
1122 appOverlays: []string{
1123 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1124 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1125 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1126 "out/soong/.intermediates/direct/android_common/package-res.apk",
1127 "out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
1128 "out/soong/.intermediates/direct_import/android_common/package-res.apk",
1129 "out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
1130 },
Colin Cross8676c8c2023-10-12 15:58:57 -07001131 appImports: []string{
1132 "out/soong/.intermediates/shared/android_common/package-res.apk",
1133 "out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk",
1134 },
Colin Cross4eae06d2023-06-20 22:40:02 -07001135 appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
1136 appClasspath: []string{
1137 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
Colin Cross8676c8c2023-10-12 15:58:57 -07001138 "out/soong/.intermediates/shared/android_common/turbine-combined/shared.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001139 "out/soong/.intermediates/direct/android_common/turbine-combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001140 "out/soong/.intermediates/direct_import/android_common/turbine-combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001141 },
1142 appCombined: []string{
1143 "out/soong/.intermediates/app/android_common/javac/app.jar",
1144 "out/soong/.intermediates/direct/android_common/combined/direct.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001145 "out/soong/.intermediates/direct_import/android_common/combined/direct_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001146 },
1147
1148 directResources: nil,
1149 directOverlays: []string{
1150 "out/soong/.intermediates/transitive/android_common/package-res.apk",
1151 "out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
1152 "out/soong/.intermediates/transitive_import/android_common/package-res.apk",
1153 "out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
1154 },
1155 directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1156 directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
1157 directClasspath: []string{
1158 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1159 "out/soong/.intermediates/transitive/android_common/turbine-combined/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001160 "out/soong/.intermediates/transitive_import/android_common/turbine-combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001161 },
1162 directCombined: []string{
1163 "out/soong/.intermediates/direct/android_common/javac/direct.jar",
1164 "out/soong/.intermediates/transitive/android_common/javac/transitive.jar",
Colin Cross9055e212024-03-23 04:43:41 +00001165 "out/soong/.intermediates/transitive_import/android_common/combined/transitive_import.jar",
Colin Cross4eae06d2023-06-20 22:40:02 -07001166 },
1167
1168 transitiveResources: []string{"out/soong/.intermediates/transitive/android_common/aapt2/transitive/res/values_strings.arsc.flat"},
1169 transitiveOverlays: nil,
1170 transitiveImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
1171 transitiveSrcJars: nil,
1172 transitiveClasspath: []string{
1173 "out/soong/.intermediates/default/java/android_stubs_current/android_common/turbine-combined/android_stubs_current.jar",
1174 "out/soong/.intermediates/transitive/android_common/busybox/R.jar",
1175 },
1176 transitiveCombined: nil,
1177
Colin Cross8676c8c2023-10-12 15:58:57 -07001178 dontVerifyShared: true,
Colin Cross4eae06d2023-06-20 22:40:02 -07001179 dontVerifyDirectImport: true,
1180 dontVerifyTransitiveImport: true,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001181 },
1182 }
1183
1184 for _, testCase := range testCases {
1185 t.Run(testCase.name, func(t *testing.T) {
1186 bp := fmt.Sprintf(`
1187 android_app {
1188 name: "app",
1189 sdk_version: "current",
1190 srcs: ["app/app.java"],
1191 resource_dirs: ["app/res"],
1192 manifest: "app/AndroidManifest.xml",
Colin Cross8676c8c2023-10-12 15:58:57 -07001193 libs: ["shared"],
Colin Crossff3ff7f2023-07-05 14:04:12 -07001194 static_libs: ["direct", "direct_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001195 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001196 }
1197
1198 android_library {
1199 name: "direct",
1200 sdk_version: "current",
1201 srcs: ["direct/direct.java"],
1202 resource_dirs: ["direct/res"],
1203 manifest: "direct/AndroidManifest.xml",
1204 static_libs: ["transitive", "transitive_import"],
Colin Cross4eae06d2023-06-20 22:40:02 -07001205 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001206 }
1207
1208 android_library {
1209 name: "transitive",
1210 sdk_version: "current",
1211 srcs: ["transitive/transitive.java"],
1212 resource_dirs: ["transitive/res"],
1213 manifest: "transitive/AndroidManifest.xml",
Colin Cross4eae06d2023-06-20 22:40:02 -07001214 use_resource_processor: %v,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001215 }
1216
Colin Cross8676c8c2023-10-12 15:58:57 -07001217 android_library {
1218 name: "shared",
1219 sdk_version: "current",
1220 srcs: ["shared/shared.java"],
1221 resource_dirs: ["shared/res"],
1222 manifest: "shared/AndroidManifest.xml",
1223 use_resource_processor: %v,
1224 libs: ["shared_transitive_shared"],
1225 static_libs: ["shared_transitive_static"],
1226 }
1227
1228 android_library {
1229 name: "shared_transitive_shared",
1230 sdk_version: "current",
1231 srcs: ["shared_transitive_shared/shared_transitive_shared.java"],
1232 resource_dirs: ["shared_transitive_shared/res"],
1233 manifest: "shared_transitive_shared/AndroidManifest.xml",
1234 use_resource_processor: %v,
1235 }
1236
1237 android_library {
1238 name: "shared_transitive_static",
1239 sdk_version: "current",
1240 srcs: ["shared_transitive_static/shared.java"],
1241 resource_dirs: ["shared_transitive_static/res"],
1242 manifest: "shared_transitive_static/AndroidManifest.xml",
1243 use_resource_processor: %v,
1244 }
1245
Colin Crossff3ff7f2023-07-05 14:04:12 -07001246 android_library_import {
1247 name: "direct_import",
1248 sdk_version: "current",
1249 aars: ["direct_import.aar"],
1250 static_libs: ["direct_import_dep"],
1251 }
1252
1253 android_library_import {
1254 name: "direct_import_dep",
1255 sdk_version: "current",
1256 aars: ["direct_import_dep.aar"],
1257 }
1258
1259 android_library_import {
1260 name: "transitive_import",
1261 sdk_version: "current",
1262 aars: ["transitive_import.aar"],
1263 static_libs: ["transitive_import_dep"],
1264 }
1265
1266 android_library_import {
1267 name: "transitive_import_dep",
1268 sdk_version: "current",
1269 aars: ["transitive_import_dep.aar"],
1270 }
Colin Cross8676c8c2023-10-12 15:58:57 -07001271 `, testCase.appUsesRP, testCase.directLibUsesRP, testCase.transitiveLibUsesRP,
1272 testCase.sharedLibUsesRP, testCase.sharedTransitiveSharedLibUsesRP, testCase.sharedTransitiveStaticLibUsesRP)
Colin Crossff3ff7f2023-07-05 14:04:12 -07001273
1274 fs := android.MockFS{
Colin Cross8676c8c2023-10-12 15:58:57 -07001275 "app/res/values/strings.xml": nil,
1276 "direct/res/values/strings.xml": nil,
1277 "transitive/res/values/strings.xml": nil,
1278 "shared/res/values/strings.xml": nil,
1279 "shared_transitive_static/res/values/strings.xml": nil,
1280 "shared_transitive_shared/res/values/strings.xml": nil,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001281 }
1282
1283 result := android.GroupFixturePreparers(
1284 PrepareForTestWithJavaDefaultModules,
Colin Crossff3ff7f2023-07-05 14:04:12 -07001285 fs.AddToFixture(),
1286 ).RunTestWithBp(t, bp)
1287
1288 type aaptInfo struct {
1289 resources, overlays, imports, srcJars, classpath, combined android.Paths
1290 }
1291
1292 getAaptInfo := func(moduleName string) (aaptInfo aaptInfo) {
1293 mod := result.ModuleForTests(moduleName, "android_common")
1294 resourceListRule := mod.MaybeOutput("aapt2/res.list")
1295 overlayListRule := mod.MaybeOutput("aapt2/overlay.list")
1296 aaptRule := mod.Rule("aapt2Link")
1297 javacRule := mod.MaybeRule("javac")
1298 combinedRule := mod.MaybeOutput("combined/" + moduleName + ".jar")
1299
1300 aaptInfo.resources = resourceListRule.Inputs
1301 aaptInfo.overlays = overlayListRule.Inputs
1302
1303 aaptFlags := strings.Split(aaptRule.Args["flags"], " ")
1304 for i, flag := range aaptFlags {
1305 if flag == "-I" && i+1 < len(aaptFlags) {
1306 aaptInfo.imports = append(aaptInfo.imports, android.PathForTesting(aaptFlags[i+1]))
1307 }
1308 }
1309
1310 if len(javacRule.Args["srcJars"]) > 0 {
1311 aaptInfo.srcJars = android.PathsForTesting(strings.Split(javacRule.Args["srcJars"], " ")...)
1312 }
1313
1314 if len(javacRule.Args["classpath"]) > 0 {
1315 classpathArg := strings.TrimPrefix(javacRule.Args["classpath"], "-classpath ")
1316 aaptInfo.classpath = android.PathsForTesting(strings.Split(classpathArg, ":")...)
1317 }
1318
1319 aaptInfo.combined = combinedRule.Inputs
1320 return
1321 }
1322
1323 app := getAaptInfo("app")
1324 direct := getAaptInfo("direct")
1325 transitive := getAaptInfo("transitive")
Colin Cross8676c8c2023-10-12 15:58:57 -07001326 shared := getAaptInfo("shared")
Colin Crossff3ff7f2023-07-05 14:04:12 -07001327 directImport := getAaptInfo("direct_import")
1328 transitiveImport := getAaptInfo("transitive_import")
1329
1330 if !testCase.dontVerifyApp {
1331 android.AssertPathsRelativeToTopEquals(t, "app resources", testCase.appResources, app.resources)
1332 android.AssertPathsRelativeToTopEquals(t, "app overlays", testCase.appOverlays, app.overlays)
1333 android.AssertPathsRelativeToTopEquals(t, "app imports", testCase.appImports, app.imports)
1334 android.AssertPathsRelativeToTopEquals(t, "app srcjars", testCase.appSrcJars, app.srcJars)
1335 android.AssertPathsRelativeToTopEquals(t, "app classpath", testCase.appClasspath, app.classpath)
1336 android.AssertPathsRelativeToTopEquals(t, "app combined", testCase.appCombined, app.combined)
1337 }
1338
1339 if !testCase.dontVerifyDirect {
1340 android.AssertPathsRelativeToTopEquals(t, "direct resources", testCase.directResources, direct.resources)
1341 android.AssertPathsRelativeToTopEquals(t, "direct overlays", testCase.directOverlays, direct.overlays)
1342 android.AssertPathsRelativeToTopEquals(t, "direct imports", testCase.directImports, direct.imports)
1343 android.AssertPathsRelativeToTopEquals(t, "direct srcjars", testCase.directSrcJars, direct.srcJars)
1344 android.AssertPathsRelativeToTopEquals(t, "direct classpath", testCase.directClasspath, direct.classpath)
1345 android.AssertPathsRelativeToTopEquals(t, "direct combined", testCase.directCombined, direct.combined)
1346 }
1347
1348 if !testCase.dontVerifyTransitive {
1349 android.AssertPathsRelativeToTopEquals(t, "transitive resources", testCase.transitiveResources, transitive.resources)
1350 android.AssertPathsRelativeToTopEquals(t, "transitive overlays", testCase.transitiveOverlays, transitive.overlays)
1351 android.AssertPathsRelativeToTopEquals(t, "transitive imports", testCase.transitiveImports, transitive.imports)
1352 android.AssertPathsRelativeToTopEquals(t, "transitive srcjars", testCase.transitiveSrcJars, transitive.srcJars)
1353 android.AssertPathsRelativeToTopEquals(t, "transitive classpath", testCase.transitiveClasspath, transitive.classpath)
1354 android.AssertPathsRelativeToTopEquals(t, "transitive combined", testCase.transitiveCombined, transitive.combined)
1355 }
1356
Colin Cross8676c8c2023-10-12 15:58:57 -07001357 if !testCase.dontVerifyShared {
1358 android.AssertPathsRelativeToTopEquals(t, "shared resources", testCase.sharedResources, shared.resources)
1359 android.AssertPathsRelativeToTopEquals(t, "shared overlays", testCase.sharedOverlays, shared.overlays)
1360 android.AssertPathsRelativeToTopEquals(t, "shared imports", testCase.sharedImports, shared.imports)
1361 android.AssertPathsRelativeToTopEquals(t, "shared srcjars", testCase.sharedSrcJars, shared.srcJars)
1362 android.AssertPathsRelativeToTopEquals(t, "shared classpath", testCase.sharedClasspath, shared.classpath)
1363 android.AssertPathsRelativeToTopEquals(t, "shared combined", testCase.sharedCombined, shared.combined)
1364 }
1365
Colin Crossff3ff7f2023-07-05 14:04:12 -07001366 if !testCase.dontVerifyDirectImport {
1367 android.AssertPathsRelativeToTopEquals(t, "direct_import resources", testCase.directImportResources, directImport.resources)
1368 android.AssertPathsRelativeToTopEquals(t, "direct_import overlays", testCase.directImportOverlays, directImport.overlays)
1369 android.AssertPathsRelativeToTopEquals(t, "direct_import imports", testCase.directImportImports, directImport.imports)
1370 }
1371
1372 if !testCase.dontVerifyTransitiveImport {
1373 android.AssertPathsRelativeToTopEquals(t, "transitive_import resources", testCase.transitiveImportResources, transitiveImport.resources)
1374 android.AssertPathsRelativeToTopEquals(t, "transitive_import overlays", testCase.transitiveImportOverlays, transitiveImport.overlays)
1375 android.AssertPathsRelativeToTopEquals(t, "transitive_import imports", testCase.transitiveImportImports, transitiveImport.imports)
1376 }
1377 })
1378 }
1379}
1380
1381func TestAndroidResourceOverlays(t *testing.T) {
Colin Cross5c4791c2019-02-01 11:44:44 -08001382 testCases := []struct {
1383 name string
1384 enforceRROTargets []string
1385 enforceRROExcludedOverlays []string
Colin Crossbec85302019-02-13 13:15:46 -08001386 resourceFiles map[string][]string
Colin Cross5c4791c2019-02-01 11:44:44 -08001387 overlayFiles map[string][]string
1388 rroDirs map[string][]string
1389 }{
1390 {
1391 name: "no RRO",
1392 enforceRROTargets: nil,
1393 enforceRROExcludedOverlays: nil,
Colin Crossbec85302019-02-13 13:15:46 -08001394 resourceFiles: map[string][]string{
1395 "foo": nil,
1396 "bar": {"bar/res/res/values/strings.xml"},
1397 "lib": nil,
1398 "lib2": {"lib2/res/res/values/strings.xml"},
1399 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001400 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001401 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001402 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1403 "out/soong/.intermediates/lib/android_common/package-res.apk",
1404 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001405 "foo/res/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001406 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1407 "device/vendor/blah/overlay/foo/res/values/strings.xml",
Anton Hansson53c88442019-03-18 15:53:16 +00001408 "product/vendor/blah/overlay/foo/res/values/strings.xml",
Colin Cross5c4791c2019-02-01 11:44:44 -08001409 },
Colin Crossbec85302019-02-13 13:15:46 -08001410 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -08001411 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1412 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1413 },
Colin Crossbec85302019-02-13 13:15:46 -08001414 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001415 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001416 "lib/res/res/values/strings.xml",
1417 "device/vendor/blah/overlay/lib/res/values/strings.xml",
1418 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001419 },
1420 rroDirs: map[string][]string{
1421 "foo": nil,
1422 "bar": nil,
1423 },
1424 },
1425 {
1426 name: "enforce RRO on foo",
1427 enforceRROTargets: []string{"foo"},
1428 enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
Colin Crossbec85302019-02-13 13:15:46 -08001429 resourceFiles: map[string][]string{
1430 "foo": nil,
1431 "bar": {"bar/res/res/values/strings.xml"},
1432 "lib": nil,
1433 "lib2": {"lib2/res/res/values/strings.xml"},
1434 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001435 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001436 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001437 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1438 "out/soong/.intermediates/lib/android_common/package-res.apk",
1439 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001440 "foo/res/res/values/strings.xml",
1441 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1442 },
Colin Crossbec85302019-02-13 13:15:46 -08001443 "bar": {
Colin Cross5c4791c2019-02-01 11:44:44 -08001444 "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
1445 "device/vendor/blah/overlay/bar/res/values/strings.xml",
1446 },
Colin Crossbec85302019-02-13 13:15:46 -08001447 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001448 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001449 "lib/res/res/values/strings.xml",
Colin Crossbec85302019-02-13 13:15:46 -08001450 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001451 },
Colin Crossc1c37552019-01-31 11:42:41 -08001452
Colin Cross5c4791c2019-02-01 11:44:44 -08001453 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001454 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +00001455 "device:device/vendor/blah/overlay/foo/res",
Anton Hansson53c88442019-03-18 15:53:16 +00001456 "product:product/vendor/blah/overlay/foo/res",
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001457 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001458 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001459 "bar": nil,
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001460 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001461 },
1462 },
1463 {
1464 name: "enforce RRO on all",
1465 enforceRROTargets: []string{"*"},
1466 enforceRROExcludedOverlays: []string{
1467 // Excluding specific apps/res directories also allowed.
1468 "device/vendor/blah/static_overlay/foo",
1469 "device/vendor/blah/static_overlay/bar/res",
1470 },
Colin Crossbec85302019-02-13 13:15:46 -08001471 resourceFiles: map[string][]string{
1472 "foo": nil,
1473 "bar": {"bar/res/res/values/strings.xml"},
1474 "lib": nil,
1475 "lib2": {"lib2/res/res/values/strings.xml"},
1476 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001477 overlayFiles: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001478 "foo": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001479 "out/soong/.intermediates/lib2/android_common/package-res.apk",
1480 "out/soong/.intermediates/lib/android_common/package-res.apk",
1481 "out/soong/.intermediates/lib3/android_common/package-res.apk",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001482 "foo/res/res/values/strings.xml",
1483 "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
1484 },
Colin Crossbec85302019-02-13 13:15:46 -08001485 "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
1486 "lib": {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001487 "out/soong/.intermediates/lib2/android_common/package-res.apk",
Colin Crossbec85302019-02-13 13:15:46 -08001488 "lib/res/res/values/strings.xml",
1489 },
Colin Cross5c4791c2019-02-01 11:44:44 -08001490 },
1491 rroDirs: map[string][]string{
Colin Crossbec85302019-02-13 13:15:46 -08001492 "foo": {
Anton Hansson53c88442019-03-18 15:53:16 +00001493 "device:device/vendor/blah/overlay/foo/res",
1494 "product:product/vendor/blah/overlay/foo/res",
1495 // Lib dep comes after the direct deps
1496 "device:device/vendor/blah/overlay/lib/res",
Colin Crossc1c37552019-01-31 11:42:41 -08001497 },
Anton Hansson53c88442019-03-18 15:53:16 +00001498 "bar": {"device:device/vendor/blah/overlay/bar/res"},
1499 "lib": {"device:device/vendor/blah/overlay/lib/res"},
Colin Cross5c4791c2019-02-01 11:44:44 -08001500 },
1501 },
1502 }
1503
Anton Hansson53c88442019-03-18 15:53:16 +00001504 deviceResourceOverlays := []string{
Colin Cross890ff552017-11-30 20:13:19 -08001505 "device/vendor/blah/overlay",
1506 "device/vendor/blah/overlay2",
1507 "device/vendor/blah/static_overlay",
1508 }
1509
Anton Hansson53c88442019-03-18 15:53:16 +00001510 productResourceOverlays := []string{
1511 "product/vendor/blah/overlay",
1512 }
1513
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001514 fs := android.MockFS{
Colin Cross890ff552017-11-30 20:13:19 -08001515 "foo/res/res/values/strings.xml": nil,
1516 "bar/res/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001517 "lib/res/res/values/strings.xml": nil,
Colin Crossbec85302019-02-13 13:15:46 -08001518 "lib2/res/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001519 "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
1520 "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
Colin Cross6ed7dea2019-01-31 14:44:30 -08001521 "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001522 "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
1523 "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
1524 "device/vendor/blah/overlay2/res/values/strings.xml": nil,
Anton Hansson53c88442019-03-18 15:53:16 +00001525 "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
Colin Cross890ff552017-11-30 20:13:19 -08001526 }
1527
1528 bp := `
1529 android_app {
1530 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001531 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001532 resource_dirs: ["foo/res"],
Anton Hansson53c88442019-03-18 15:53:16 +00001533 static_libs: ["lib", "lib3"],
Colin Cross890ff552017-11-30 20:13:19 -08001534 }
1535
1536 android_app {
1537 name: "bar",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001538 sdk_version: "current",
Colin Cross890ff552017-11-30 20:13:19 -08001539 resource_dirs: ["bar/res"],
1540 }
Colin Cross6ed7dea2019-01-31 14:44:30 -08001541
1542 android_library {
1543 name: "lib",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001544 sdk_version: "current",
Colin Cross6ed7dea2019-01-31 14:44:30 -08001545 resource_dirs: ["lib/res"],
Colin Crossbec85302019-02-13 13:15:46 -08001546 static_libs: ["lib2"],
1547 }
1548
1549 android_library {
1550 name: "lib2",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001551 sdk_version: "current",
Colin Crossbec85302019-02-13 13:15:46 -08001552 resource_dirs: ["lib2/res"],
Colin Cross6ed7dea2019-01-31 14:44:30 -08001553 }
Anton Hansson53c88442019-03-18 15:53:16 +00001554
1555 // This library has the same resources as lib (should not lead to dupe RROs)
1556 android_library {
1557 name: "lib3",
Jeongik Cha75b83b02019-11-01 15:28:00 +09001558 sdk_version: "current",
Anton Hansson53c88442019-03-18 15:53:16 +00001559 resource_dirs: ["lib/res"]
1560 }
Colin Cross890ff552017-11-30 20:13:19 -08001561 `
1562
Colin Cross5c4791c2019-02-01 11:44:44 -08001563 for _, testCase := range testCases {
Colin Cross890ff552017-11-30 20:13:19 -08001564 t.Run(testCase.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001565 result := android.GroupFixturePreparers(
1566 PrepareForTestWithJavaDefaultModules,
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001567 fs.AddToFixture(),
1568 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1569 variables.DeviceResourceOverlays = deviceResourceOverlays
1570 variables.ProductResourceOverlays = productResourceOverlays
1571 if testCase.enforceRROTargets != nil {
1572 variables.EnforceRROTargets = testCase.enforceRROTargets
1573 }
1574 if testCase.enforceRROExcludedOverlays != nil {
1575 variables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
1576 }
1577 }),
1578 ).RunTestWithBp(t, bp)
Colin Cross890ff552017-11-30 20:13:19 -08001579
Colin Crossbec85302019-02-13 13:15:46 -08001580 resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
1581 for _, o := range list {
1582 res := module.MaybeOutput(o)
1583 if res.Rule != nil {
1584 // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
1585 // verify the inputs to the .arsc.flat rule.
1586 files = append(files, res.Inputs.Strings()...)
1587 } else {
1588 // Otherwise, verify the full path to the output of the other module
1589 files = append(files, o)
Anton Hansson94c93f32019-01-30 16:03:37 +00001590 }
Colin Cross890ff552017-11-30 20:13:19 -08001591 }
Colin Crossbec85302019-02-13 13:15:46 -08001592 return files
Colin Cross890ff552017-11-30 20:13:19 -08001593 }
1594
Colin Crossbec85302019-02-13 13:15:46 -08001595 getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001596 module := result.ModuleForTests(moduleName, "android_common")
Colin Crossbec85302019-02-13 13:15:46 -08001597 resourceList := module.MaybeOutput("aapt2/res.list")
1598 if resourceList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001599 resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs))
Anton Hansson0375a4f2019-01-24 14:39:19 +00001600 }
Colin Crossbec85302019-02-13 13:15:46 -08001601 overlayList := module.MaybeOutput("aapt2/overlay.list")
1602 if overlayList.Rule != nil {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001603 overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
Colin Crossbec85302019-02-13 13:15:46 -08001604 }
1605
Colin Crossab8d1382023-07-14 17:23:41 +00001606 for _, d := range module.Module().(AndroidLibraryDependency).RRODirsDepSet().ToList() {
Anton Hansson53c88442019-03-18 15:53:16 +00001607 var prefix string
1608 if d.overlayType == device {
1609 prefix = "device:"
1610 } else if d.overlayType == product {
1611 prefix = "product:"
1612 } else {
1613 t.Fatalf("Unexpected overlayType %d", d.overlayType)
1614 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001615 rroDirs = append(rroDirs, prefix+android.PathRelativeToTop(d.path))
Anton Hansson53c88442019-03-18 15:53:16 +00001616 }
Colin Crossbec85302019-02-13 13:15:46 -08001617
1618 return resourceFiles, overlayFiles, rroDirs
1619 }
1620
1621 modules := []string{"foo", "bar", "lib", "lib2"}
1622 for _, module := range modules {
1623 resourceFiles, overlayFiles, rroDirs := getResources(module)
1624
1625 if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
1626 t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
1627 module, testCase.resourceFiles[module], resourceFiles)
1628 }
1629 if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
1630 t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
1631 module, testCase.overlayFiles[module], overlayFiles)
1632 }
1633 if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
Anton Hansson0375a4f2019-01-24 14:39:19 +00001634 t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
Colin Crossbec85302019-02-13 13:15:46 -08001635 module, testCase.rroDirs[module], rroDirs)
Anton Hansson0375a4f2019-01-24 14:39:19 +00001636 }
Colin Cross890ff552017-11-30 20:13:19 -08001637 }
Colin Cross890ff552017-11-30 20:13:19 -08001638 })
1639 }
1640}
Colin Crossd09b0b62018-04-18 11:06:47 -07001641
Paul Duffincdb88a92021-03-14 00:36:50 +00001642func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) {
1643 foo := result.ModuleForTests("foo", "android_common")
Jeongik Cha219141c2020-08-06 23:00:37 +09001644 link := foo.Output("package-res.apk")
1645 linkFlags := strings.Split(link.Args["flags"], " ")
1646 min := android.IndexList("--min-sdk-version", linkFlags)
1647 target := android.IndexList("--target-sdk-version", linkFlags)
1648
1649 if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
1650 t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
1651 }
1652
1653 gotMinSdkVersion := linkFlags[min+1]
1654 gotTargetSdkVersion := linkFlags[target+1]
1655
Paul Duffincdb88a92021-03-14 00:36:50 +00001656 android.AssertStringEquals(t, "incorrect --min-sdk-version", expectedSdkVersion, gotMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001657
Paul Duffincdb88a92021-03-14 00:36:50 +00001658 android.AssertStringEquals(t, "incorrect --target-sdk-version", expectedSdkVersion, gotTargetSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001659}
1660
Colin Crossd09b0b62018-04-18 11:06:47 -07001661func TestAppSdkVersion(t *testing.T) {
1662 testCases := []struct {
1663 name string
1664 sdkVersion string
1665 platformSdkInt int
1666 platformSdkCodename string
1667 platformSdkFinal bool
Spandan Dasffb31af2023-03-01 19:46:18 +00001668 minSdkVersionBp string
Colin Crossd09b0b62018-04-18 11:06:47 -07001669 expectedMinSdkVersion string
Jeongik Cha538c0d02019-07-11 15:54:27 +09001670 platformApis bool
Dan Albert4f378d72020-07-23 17:32:15 -07001671 activeCodenames []string
Colin Crossd09b0b62018-04-18 11:06:47 -07001672 }{
1673 {
1674 name: "current final SDK",
1675 sdkVersion: "current",
1676 platformSdkInt: 27,
1677 platformSdkCodename: "REL",
1678 platformSdkFinal: true,
1679 expectedMinSdkVersion: "27",
1680 },
1681 {
1682 name: "current non-final SDK",
1683 sdkVersion: "current",
1684 platformSdkInt: 27,
1685 platformSdkCodename: "OMR1",
1686 platformSdkFinal: false,
1687 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001688 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001689 },
1690 {
1691 name: "default final SDK",
1692 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001693 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001694 platformSdkInt: 27,
1695 platformSdkCodename: "REL",
1696 platformSdkFinal: true,
1697 expectedMinSdkVersion: "27",
1698 },
1699 {
1700 name: "default non-final SDK",
1701 sdkVersion: "",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001702 platformApis: true,
Colin Crossd09b0b62018-04-18 11:06:47 -07001703 platformSdkInt: 27,
1704 platformSdkCodename: "OMR1",
1705 platformSdkFinal: false,
1706 expectedMinSdkVersion: "OMR1",
Dan Albert4f378d72020-07-23 17:32:15 -07001707 activeCodenames: []string{"OMR1"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001708 },
1709 {
1710 name: "14",
1711 sdkVersion: "14",
1712 expectedMinSdkVersion: "14",
Dan Albert4f378d72020-07-23 17:32:15 -07001713 platformSdkCodename: "S",
1714 activeCodenames: []string{"S"},
Colin Crossd09b0b62018-04-18 11:06:47 -07001715 },
Spandan Dasffb31af2023-03-01 19:46:18 +00001716 {
1717 name: "two active SDKs",
1718 sdkVersion: "module_current",
1719 minSdkVersionBp: "UpsideDownCake",
1720 expectedMinSdkVersion: "UpsideDownCake", // And not VanillaIceCream
1721 platformSdkCodename: "VanillaIceCream",
1722 activeCodenames: []string{"UpsideDownCake", "VanillaIceCream"},
1723 },
Colin Crossd09b0b62018-04-18 11:06:47 -07001724 }
1725
1726 for _, moduleType := range []string{"android_app", "android_library"} {
1727 for _, test := range testCases {
1728 t.Run(moduleType+" "+test.name, func(t *testing.T) {
Jeongik Cha538c0d02019-07-11 15:54:27 +09001729 platformApiProp := ""
1730 if test.platformApis {
1731 platformApiProp = "platform_apis: true,"
1732 }
Spandan Dasffb31af2023-03-01 19:46:18 +00001733 minSdkVersionProp := ""
1734 if test.minSdkVersionBp != "" {
1735 minSdkVersionProp = fmt.Sprintf(` min_sdk_version: "%s",`, test.minSdkVersionBp)
1736 }
Colin Crossd09b0b62018-04-18 11:06:47 -07001737 bp := fmt.Sprintf(`%s {
1738 name: "foo",
1739 srcs: ["a.java"],
1740 sdk_version: "%s",
Jeongik Cha538c0d02019-07-11 15:54:27 +09001741 %s
Spandan Dasffb31af2023-03-01 19:46:18 +00001742 %s
1743 }`, moduleType, test.sdkVersion, platformApiProp, minSdkVersionProp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001744
Paul Duffin71ae5942021-03-22 15:36:52 +00001745 result := android.GroupFixturePreparers(
1746 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001747 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1748 variables.Platform_sdk_version = &test.platformSdkInt
1749 variables.Platform_sdk_codename = &test.platformSdkCodename
1750 variables.Platform_version_active_codenames = test.activeCodenames
1751 variables.Platform_sdk_final = &test.platformSdkFinal
1752 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001753 FixtureWithPrebuiltApis(map[string][]string{
1754 "14": {"foo"},
1755 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001756 ).RunTestWithBp(t, bp)
Colin Crossd09b0b62018-04-18 11:06:47 -07001757
Paul Duffincdb88a92021-03-14 00:36:50 +00001758 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Colin Crossd09b0b62018-04-18 11:06:47 -07001759 })
1760 }
1761 }
1762}
Colin Crossa4f08812018-10-02 22:03:40 -07001763
Jeongik Cha219141c2020-08-06 23:00:37 +09001764func TestVendorAppSdkVersion(t *testing.T) {
1765 testCases := []struct {
1766 name string
1767 sdkVersion string
1768 platformSdkInt int
1769 platformSdkCodename string
1770 platformSdkFinal bool
1771 deviceCurrentApiLevelForVendorModules string
1772 expectedMinSdkVersion string
1773 }{
1774 {
1775 name: "current final SDK",
1776 sdkVersion: "current",
1777 platformSdkInt: 29,
1778 platformSdkCodename: "REL",
1779 platformSdkFinal: true,
1780 deviceCurrentApiLevelForVendorModules: "29",
1781 expectedMinSdkVersion: "29",
1782 },
1783 {
1784 name: "current final SDK",
1785 sdkVersion: "current",
1786 platformSdkInt: 29,
1787 platformSdkCodename: "REL",
1788 platformSdkFinal: true,
1789 deviceCurrentApiLevelForVendorModules: "28",
1790 expectedMinSdkVersion: "28",
1791 },
1792 {
1793 name: "current final SDK",
1794 sdkVersion: "current",
1795 platformSdkInt: 29,
1796 platformSdkCodename: "Q",
1797 platformSdkFinal: false,
Jeongik Cha219141c2020-08-06 23:00:37 +09001798 deviceCurrentApiLevelForVendorModules: "28",
1799 expectedMinSdkVersion: "28",
1800 },
1801 }
1802
1803 for _, moduleType := range []string{"android_app", "android_library"} {
1804 for _, sdkKind := range []string{"", "system_"} {
1805 for _, test := range testCases {
1806 t.Run(moduleType+" "+test.name, func(t *testing.T) {
1807 bp := fmt.Sprintf(`%s {
1808 name: "foo",
1809 srcs: ["a.java"],
1810 sdk_version: "%s%s",
1811 vendor: true,
1812 }`, moduleType, sdkKind, test.sdkVersion)
1813
Paul Duffin71ae5942021-03-22 15:36:52 +00001814 result := android.GroupFixturePreparers(
1815 prepareForJavaTest,
Paul Duffincdb88a92021-03-14 00:36:50 +00001816 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1817 variables.Platform_sdk_version = &test.platformSdkInt
1818 variables.Platform_sdk_codename = &test.platformSdkCodename
1819 variables.Platform_sdk_final = &test.platformSdkFinal
1820 variables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
1821 variables.DeviceSystemSdkVersions = []string{"28", "29"}
1822 }),
Paul Duffin2645a292021-03-13 02:36:00 +00001823 FixtureWithPrebuiltApis(map[string][]string{
1824 "28": {"foo"},
1825 "29": {"foo"},
1826 "current": {"foo"},
1827 }),
Paul Duffincdb88a92021-03-14 00:36:50 +00001828 ).RunTestWithBp(t, bp)
1829
1830 checkSdkVersion(t, result, test.expectedMinSdkVersion)
Jeongik Cha219141c2020-08-06 23:00:37 +09001831 })
1832 }
1833 }
1834 }
1835}
1836
Paul Duffin50c217c2019-06-12 13:25:22 +01001837func TestJNIABI(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001838 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001839 cc_library {
1840 name: "libjni",
1841 system_shared_libs: [],
Colin Crossc511bc52020-04-07 16:50:32 +00001842 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001843 stl: "none",
1844 }
1845
1846 android_test {
1847 name: "test",
1848 sdk_version: "core_platform",
1849 jni_libs: ["libjni"],
1850 }
1851
1852 android_test {
1853 name: "test_first",
1854 sdk_version: "core_platform",
1855 compile_multilib: "first",
1856 jni_libs: ["libjni"],
1857 }
1858
1859 android_test {
1860 name: "test_both",
1861 sdk_version: "core_platform",
1862 compile_multilib: "both",
1863 jni_libs: ["libjni"],
1864 }
1865
1866 android_test {
1867 name: "test_32",
1868 sdk_version: "core_platform",
1869 compile_multilib: "32",
1870 jni_libs: ["libjni"],
1871 }
1872
1873 android_test {
1874 name: "test_64",
1875 sdk_version: "core_platform",
1876 compile_multilib: "64",
1877 jni_libs: ["libjni"],
1878 }
1879 `)
1880
1881 testCases := []struct {
1882 name string
1883 abis []string
1884 }{
1885 {"test", []string{"arm64-v8a"}},
1886 {"test_first", []string{"arm64-v8a"}},
1887 {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
1888 {"test_32", []string{"armeabi-v7a"}},
1889 {"test_64", []string{"arm64-v8a"}},
1890 }
1891
1892 for _, test := range testCases {
1893 t.Run(test.name, func(t *testing.T) {
1894 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07001895 jniLibZip := app.Output("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01001896 var abis []string
1897 args := strings.Fields(jniLibZip.Args["jarArgs"])
1898 for i := 0; i < len(args); i++ {
1899 if args[i] == "-P" {
1900 abis = append(abis, filepath.Base(args[i+1]))
1901 i++
1902 }
1903 }
1904 if !reflect.DeepEqual(abis, test.abis) {
1905 t.Errorf("want abis %v, got %v", test.abis, abis)
1906 }
1907 })
1908 }
1909}
1910
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001911func TestAppSdkVersionByPartition(t *testing.T) {
1912 testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
1913 android_app {
1914 name: "foo",
1915 srcs: ["a.java"],
1916 vendor: true,
1917 platform_apis: true,
1918 }
1919 `)
1920
1921 testJava(t, `
1922 android_app {
1923 name: "bar",
1924 srcs: ["b.java"],
1925 platform_apis: true,
1926 }
1927 `)
1928
1929 for _, enforce := range []bool{true, false} {
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001930 bp := `
1931 android_app {
1932 name: "foo",
1933 srcs: ["a.java"],
1934 product_specific: true,
1935 platform_apis: true,
1936 }
1937 `
Colin Cross98be1bb2019-12-13 20:41:13 -08001938
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001939 errorHandler := android.FixtureExpectsNoErrors
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001940 if enforce {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001941 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 +09001942 }
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00001943
1944 android.GroupFixturePreparers(
1945 PrepareForTestWithJavaDefaultModules,
1946 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1947 variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
1948 }),
1949 ).
1950 ExtendWithErrorHandler(errorHandler).
1951 RunTestWithBp(t, bp)
Jeongik Cha2cc570d2019-10-29 15:44:45 +09001952 }
1953}
1954
Paul Duffin50c217c2019-06-12 13:25:22 +01001955func TestJNIPackaging(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07001956 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Paul Duffin50c217c2019-06-12 13:25:22 +01001957 cc_library {
1958 name: "libjni",
1959 system_shared_libs: [],
1960 stl: "none",
Colin Cross094cde42020-02-15 10:38:00 -08001961 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001962 }
1963
1964 android_app {
1965 name: "app",
1966 jni_libs: ["libjni"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09001967 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001968 }
1969
1970 android_app {
1971 name: "app_noembed",
1972 jni_libs: ["libjni"],
1973 use_embedded_native_libs: false,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001974 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001975 }
1976
1977 android_app {
1978 name: "app_embed",
1979 jni_libs: ["libjni"],
1980 use_embedded_native_libs: true,
Jeongik Cha538c0d02019-07-11 15:54:27 +09001981 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001982 }
1983
1984 android_test {
1985 name: "test",
Colin Crossc511bc52020-04-07 16:50:32 +00001986 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001987 jni_libs: ["libjni"],
1988 }
1989
1990 android_test {
1991 name: "test_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00001992 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01001993 jni_libs: ["libjni"],
1994 use_embedded_native_libs: false,
1995 }
1996
1997 android_test_helper_app {
1998 name: "test_helper",
Colin Crossc511bc52020-04-07 16:50:32 +00001999 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002000 jni_libs: ["libjni"],
2001 }
2002
2003 android_test_helper_app {
2004 name: "test_helper_noembed",
Colin Crossc511bc52020-04-07 16:50:32 +00002005 sdk_version: "current",
Paul Duffin50c217c2019-06-12 13:25:22 +01002006 jni_libs: ["libjni"],
2007 use_embedded_native_libs: false,
2008 }
2009 `)
2010
2011 testCases := []struct {
2012 name string
2013 packaged bool
2014 compressed bool
2015 }{
Jiyong Park20df11e2024-05-08 09:54:22 +00002016 {"app", true, false},
2017 {"app_noembed", true, false},
Paul Duffin50c217c2019-06-12 13:25:22 +01002018 {"app_embed", true, false},
2019 {"test", true, false},
2020 {"test_noembed", true, true},
2021 {"test_helper", true, false},
2022 {"test_helper_noembed", true, true},
2023 }
2024
2025 for _, test := range testCases {
2026 t.Run(test.name, func(t *testing.T) {
2027 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07002028 jniLibZip := app.MaybeOutput("jnilibs.zip")
Paul Duffin50c217c2019-06-12 13:25:22 +01002029 if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
2030 t.Errorf("expected jni packaged %v, got %v", w, g)
2031 }
2032
2033 if jniLibZip.Rule != nil {
2034 if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
2035 t.Errorf("expected jni compressed %v, got %v", w, g)
2036 }
Colin Crossc511bc52020-04-07 16:50:32 +00002037
2038 if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
2039 t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
2040 }
Paul Duffin50c217c2019-06-12 13:25:22 +01002041 }
2042 })
2043 }
Colin Cross47fa9d32019-03-26 10:51:39 -07002044}
2045
Jiyong Parke7168072024-05-09 10:57:07 +09002046func TestJNITranstiveDepsInstallation(t *testing.T) {
2047 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
2048 android_app {
2049 name: "app",
2050 jni_libs: ["libjni"],
2051 platform_apis: true,
2052 }
2053
2054 cc_library {
2055 name: "libjni",
2056 shared_libs: ["libplatform"],
2057 system_shared_libs: [],
2058 stl: "none",
2059 required: ["librequired"],
2060 }
2061
2062 cc_library {
2063 name: "libplatform",
2064 system_shared_libs: [],
2065 stl: "none",
2066 }
2067
2068 cc_library {
2069 name: "librequired",
2070 system_shared_libs: [],
2071 stl: "none",
2072 }
2073
2074 `)
2075
2076 app := ctx.ModuleForTests("app", "android_common")
2077 jniLibZip := app.Output("jnilibs.zip")
2078 android.AssertPathsEndWith(t, "embedd jni lib mismatch", []string{"libjni.so"}, jniLibZip.Implicits)
2079
2080 install := app.Rule("Cp")
2081 android.AssertPathsEndWith(t, "install dep mismatch", []string{"libplatform.so", "librequired.so"}, install.OrderOnly)
2082}
2083
Colin Cross3c007702020-05-08 11:20:24 -07002084func TestJNISDK(t *testing.T) {
2085 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
2086 cc_library {
2087 name: "libjni",
2088 system_shared_libs: [],
2089 stl: "none",
2090 sdk_version: "current",
2091 }
2092
2093 android_test {
2094 name: "app_platform",
2095 jni_libs: ["libjni"],
2096 platform_apis: true,
2097 }
2098
2099 android_test {
2100 name: "app_sdk",
2101 jni_libs: ["libjni"],
2102 sdk_version: "current",
2103 }
2104
2105 android_test {
2106 name: "app_force_platform",
2107 jni_libs: ["libjni"],
2108 sdk_version: "current",
2109 jni_uses_platform_apis: true,
2110 }
2111
2112 android_test {
2113 name: "app_force_sdk",
2114 jni_libs: ["libjni"],
2115 platform_apis: true,
2116 jni_uses_sdk_apis: true,
2117 }
Colin Crossc2d24052020-05-13 11:05:02 -07002118
2119 cc_library {
2120 name: "libvendorjni",
2121 system_shared_libs: [],
2122 stl: "none",
2123 vendor: true,
2124 }
2125
2126 android_test {
2127 name: "app_vendor",
2128 jni_libs: ["libvendorjni"],
2129 sdk_version: "current",
2130 vendor: true,
2131 }
Colin Cross3c007702020-05-08 11:20:24 -07002132 `)
2133
2134 testCases := []struct {
Colin Crossc2d24052020-05-13 11:05:02 -07002135 name string
2136 sdkJNI bool
2137 vendorJNI bool
Colin Cross3c007702020-05-08 11:20:24 -07002138 }{
Colin Crossc2d24052020-05-13 11:05:02 -07002139 {name: "app_platform"},
2140 {name: "app_sdk", sdkJNI: true},
2141 {name: "app_force_platform"},
2142 {name: "app_force_sdk", sdkJNI: true},
2143 {name: "app_vendor", vendorJNI: true},
Colin Cross3c007702020-05-08 11:20:24 -07002144 }
2145
Colin Crossc2d24052020-05-13 11:05:02 -07002146 platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
2147 Output("libjni.so").Output.String()
2148 sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
2149 Output("libjni.so").Output.String()
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +09002150 vendorJNI := ctx.ModuleForTests("libvendorjni", "android_vendor_arm64_armv8-a_shared").
Colin Crossc2d24052020-05-13 11:05:02 -07002151 Output("libvendorjni.so").Output.String()
2152
Colin Cross3c007702020-05-08 11:20:24 -07002153 for _, test := range testCases {
2154 t.Run(test.name, func(t *testing.T) {
2155 app := ctx.ModuleForTests(test.name, "android_common")
Colin Cross3c007702020-05-08 11:20:24 -07002156
Colin Crossb3168ba2023-07-26 16:14:56 -07002157 jniLibZip := app.MaybeOutput("jnilibs.zip")
Colin Cross3c007702020-05-08 11:20:24 -07002158 if len(jniLibZip.Implicits) != 1 {
2159 t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
2160 }
2161 gotJNI := jniLibZip.Implicits[0].String()
2162
2163 if test.sdkJNI {
2164 if gotJNI != sdkJNI {
2165 t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
2166 }
Colin Crossc2d24052020-05-13 11:05:02 -07002167 } else if test.vendorJNI {
2168 if gotJNI != vendorJNI {
2169 t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
2170 }
Colin Cross3c007702020-05-08 11:20:24 -07002171 } else {
2172 if gotJNI != platformJNI {
2173 t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
2174 }
2175 }
2176 })
2177 }
2178
2179 t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
2180 testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
2181 android_test {
2182 name: "app_platform",
2183 platform_apis: true,
2184 jni_uses_platform_apis: true,
2185 }
2186 `)
2187 })
2188
2189 t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
2190 testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
2191 android_test {
2192 name: "app_sdk",
2193 sdk_version: "current",
2194 jni_uses_sdk_apis: true,
2195 }
2196 `)
2197 })
2198
2199}
2200
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002201func TestCertificates(t *testing.T) {
2202 testCases := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002203 name string
2204 bp string
Colin Cross5caad2b2022-12-12 15:11:46 -08002205 allowMissingDependencies bool
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002206 certificateOverride string
2207 expectedCertSigningFlags string
2208 expectedCertificate string
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002209 }{
2210 {
2211 name: "default",
2212 bp: `
2213 android_app {
2214 name: "foo",
2215 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002216 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002217 }
2218 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002219 certificateOverride: "",
2220 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002221 expectedCertificate: "build/make/target/product/security/testkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002222 },
2223 {
2224 name: "module certificate property",
2225 bp: `
2226 android_app {
2227 name: "foo",
2228 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002229 certificate: ":new_certificate",
2230 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002231 }
2232
2233 android_app_certificate {
2234 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002235 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002236 }
2237 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002238 certificateOverride: "",
2239 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002240 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002241 },
2242 {
2243 name: "path certificate property",
2244 bp: `
2245 android_app {
2246 name: "foo",
2247 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002248 certificate: "expiredkey",
2249 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002250 }
2251 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002252 certificateOverride: "",
2253 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002254 expectedCertificate: "build/make/target/product/security/expiredkey",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002255 },
2256 {
2257 name: "certificate overrides",
2258 bp: `
2259 android_app {
2260 name: "foo",
2261 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002262 certificate: "expiredkey",
2263 sdk_version: "current",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002264 }
2265
2266 android_app_certificate {
2267 name: "new_certificate",
Colin Cross3c007702020-05-08 11:20:24 -07002268 certificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002269 }
2270 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002271 certificateOverride: "foo:new_certificate",
2272 expectedCertSigningFlags: "",
Colin Cross5caad2b2022-12-12 15:11:46 -08002273 expectedCertificate: "cert/new_cert",
Liz Kammere2b27f42020-05-07 13:24:05 -07002274 },
2275 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002276 name: "certificate signing flags",
Liz Kammere2b27f42020-05-07 13:24:05 -07002277 bp: `
2278 android_app {
2279 name: "foo",
2280 srcs: ["a.java"],
2281 certificate: ":new_certificate",
2282 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002283 rotationMinSdkVersion: "32",
Liz Kammere2b27f42020-05-07 13:24:05 -07002284 sdk_version: "current",
2285 }
2286
2287 android_app_certificate {
2288 name: "new_certificate",
2289 certificate: "cert/new_cert",
2290 }
2291 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002292 certificateOverride: "",
2293 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002294 expectedCertificate: "cert/new_cert",
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002295 },
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002296 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002297 name: "cert signing flags from filegroup",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002298 bp: `
2299 android_app {
2300 name: "foo",
2301 srcs: ["a.java"],
2302 certificate: ":new_certificate",
2303 lineage: ":lineage_bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002304 rotationMinSdkVersion: "32",
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002305 sdk_version: "current",
2306 }
2307
2308 android_app_certificate {
2309 name: "new_certificate",
2310 certificate: "cert/new_cert",
2311 }
2312
2313 filegroup {
2314 name: "lineage_bin",
2315 srcs: ["lineage.bin"],
2316 }
2317 `,
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002318 certificateOverride: "",
2319 expectedCertSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
Colin Cross5caad2b2022-12-12 15:11:46 -08002320 expectedCertificate: "cert/new_cert",
2321 },
2322 {
2323 name: "missing with AllowMissingDependencies",
2324 bp: `
2325 android_app {
2326 name: "foo",
2327 srcs: ["a.java"],
2328 certificate: ":new_certificate",
2329 sdk_version: "current",
2330 }
2331 `,
2332 expectedCertificate: "out/soong/.intermediates/foo/android_common/missing",
2333 allowMissingDependencies: true,
Jaewoong Jung1c1b6e62021-03-09 15:02:31 -08002334 },
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002335 }
2336
2337 for _, test := range testCases {
2338 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002339 result := android.GroupFixturePreparers(
2340 PrepareForTestWithJavaDefaultModules,
2341 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2342 if test.certificateOverride != "" {
2343 variables.CertificateOverrides = []string{test.certificateOverride}
2344 }
Colin Cross5caad2b2022-12-12 15:11:46 -08002345 if test.allowMissingDependencies {
2346 variables.Allow_missing_dependencies = proptools.BoolPtr(true)
2347 }
2348 }),
2349 android.FixtureModifyContext(func(ctx *android.TestContext) {
2350 ctx.SetAllowMissingDependencies(test.allowMissingDependencies)
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002351 }),
2352 ).RunTestWithBp(t, test.bp)
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002353
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002354 foo := result.ModuleForTests("foo", "android_common")
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002355
Colin Cross5caad2b2022-12-12 15:11:46 -08002356 certificate := foo.Module().(*AndroidApp).certificate
2357 android.AssertPathRelativeToTopEquals(t, "certificates key", test.expectedCertificate+".pk8", certificate.Key)
2358 // The sign_target_files_apks and check_target_files_signatures
2359 // tools require that certificates have a .x509.pem extension.
2360 android.AssertPathRelativeToTopEquals(t, "certificates pem", test.expectedCertificate+".x509.pem", certificate.Pem)
Liz Kammere2b27f42020-05-07 13:24:05 -07002361
Colin Cross5caad2b2022-12-12 15:11:46 -08002362 signapk := foo.Output("foo.apk")
2363 if signapk.Rule != android.ErrorRule {
2364 signCertificateFlags := signapk.Args["certificates"]
2365 expectedFlags := certificate.Pem.String() + " " + certificate.Key.String()
2366 android.AssertStringEquals(t, "certificates flags", expectedFlags, signCertificateFlags)
2367
2368 certSigningFlags := signapk.Args["flags"]
2369 android.AssertStringEquals(t, "cert signing flags", test.expectedCertSigningFlags, certSigningFlags)
2370 }
Jaewoong Jung2ad817c2019-01-18 14:27:16 -08002371 })
2372 }
2373}
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002374
Songchun Fan688de9a2020-03-24 20:32:24 -07002375func TestRequestV4SigningFlag(t *testing.T) {
2376 testCases := []struct {
2377 name string
2378 bp string
2379 expected string
2380 }{
2381 {
2382 name: "default",
2383 bp: `
2384 android_app {
2385 name: "foo",
2386 srcs: ["a.java"],
2387 sdk_version: "current",
2388 }
2389 `,
2390 expected: "",
2391 },
2392 {
2393 name: "default",
2394 bp: `
2395 android_app {
2396 name: "foo",
2397 srcs: ["a.java"],
2398 sdk_version: "current",
2399 v4_signature: false,
2400 }
2401 `,
2402 expected: "",
2403 },
2404 {
2405 name: "module certificate property",
2406 bp: `
2407 android_app {
2408 name: "foo",
2409 srcs: ["a.java"],
2410 sdk_version: "current",
2411 v4_signature: true,
2412 }
2413 `,
2414 expected: "--enable-v4",
2415 },
2416 }
2417
2418 for _, test := range testCases {
2419 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002420 result := android.GroupFixturePreparers(
2421 PrepareForTestWithJavaDefaultModules,
2422 ).RunTestWithBp(t, test.bp)
Songchun Fan688de9a2020-03-24 20:32:24 -07002423
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002424 foo := result.ModuleForTests("foo", "android_common")
Songchun Fan688de9a2020-03-24 20:32:24 -07002425
2426 signapk := foo.Output("foo.apk")
2427 signFlags := signapk.Args["flags"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002428 android.AssertStringEquals(t, "signing flags", test.expected, signFlags)
Songchun Fan688de9a2020-03-24 20:32:24 -07002429 })
2430 }
2431}
2432
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002433func TestPackageNameOverride(t *testing.T) {
2434 testCases := []struct {
2435 name string
2436 bp string
2437 packageNameOverride string
2438 expected []string
2439 }{
2440 {
2441 name: "default",
2442 bp: `
2443 android_app {
2444 name: "foo",
2445 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002446 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002447 }
2448 `,
2449 packageNameOverride: "",
2450 expected: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002451 "out/soong/.intermediates/foo/android_common/foo.apk",
2452 "out/soong/target/product/test_device/system/app/foo/foo.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002453 },
2454 },
2455 {
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002456 name: "overridden via PRODUCT_PACKAGE_NAME_OVERRIDES",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002457 bp: `
2458 android_app {
2459 name: "foo",
2460 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002461 sdk_version: "current",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002462 }
2463 `,
2464 packageNameOverride: "foo:bar",
2465 expected: []string{
2466 // The package apk should be still be the original name for test dependencies.
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002467 "out/soong/.intermediates/foo/android_common/bar.apk",
2468 "out/soong/target/product/test_device/system/app/bar/bar.apk",
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002469 },
2470 },
Jooyung Han29e2f6d2022-01-08 12:13:59 +09002471 {
2472 name: "overridden via stem",
2473 bp: `
2474 android_app {
2475 name: "foo",
2476 srcs: ["a.java"],
2477 sdk_version: "current",
2478 stem: "bar",
2479 }
2480 `,
2481 packageNameOverride: "",
2482 expected: []string{
2483 "out/soong/.intermediates/foo/android_common/bar.apk",
2484 "out/soong/target/product/test_device/system/app/bar/bar.apk",
2485 },
2486 },
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002487 }
2488
2489 for _, test := range testCases {
2490 t.Run(test.name, func(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002491 result := android.GroupFixturePreparers(
2492 PrepareForTestWithJavaDefaultModules,
2493 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2494 if test.packageNameOverride != "" {
2495 variables.PackageNameOverrides = []string{test.packageNameOverride}
2496 }
2497 }),
2498 ).RunTestWithBp(t, test.bp)
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002499
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002500 foo := result.ModuleForTests("foo", "android_common")
2501
Lukacs T. Berkifbaf7252021-08-19 09:36:42 +02002502 outSoongDir := result.Config.SoongOutDir()
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002503
2504 outputs := foo.AllOutputs()
2505 outputMap := make(map[string]bool)
2506 for _, o := range outputs {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002507 outputMap[android.StringPathRelativeToTop(outSoongDir, o)] = true
Jaewoong Jung9d22a912019-01-23 16:27:47 -08002508 }
2509 for _, e := range test.expected {
2510 if _, exist := outputMap[e]; !exist {
2511 t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
2512 }
2513 }
2514 })
2515 }
2516}
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002517
2518func TestInstrumentationTargetOverridden(t *testing.T) {
2519 bp := `
2520 android_app {
2521 name: "foo",
2522 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002523 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002524 }
2525
2526 android_test {
2527 name: "bar",
2528 instrumentation_for: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09002529 sdk_version: "current",
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002530 }
2531 `
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002532
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002533 result := android.GroupFixturePreparers(
2534 PrepareForTestWithJavaDefaultModules,
2535 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2536 variables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
2537 }),
2538 ).RunTestWithBp(t, bp)
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002539
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002540 bar := result.ModuleForTests("bar", "android_common")
Jaewoong Jung4102e5d2019-02-27 16:26:28 -08002541 res := bar.Output("package-res.apk")
2542 aapt2Flags := res.Args["flags"]
2543 e := "--rename-instrumentation-target-package org.dandroid.bp"
2544 if !strings.Contains(aapt2Flags, e) {
2545 t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
2546 }
2547}
Jaewoong Jung525443a2019-02-28 15:35:54 -08002548
2549func TestOverrideAndroidApp(t *testing.T) {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002550 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2551 t, `
Jaewoong Jung525443a2019-02-28 15:35:54 -08002552 android_app {
2553 name: "foo",
2554 srcs: ["a.java"],
Jaewoong Junga641ee92019-03-27 11:17:14 -07002555 certificate: "expiredkey",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002556 overrides: ["qux"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002557 sdk_version: "current",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002558 }
2559
2560 override_android_app {
2561 name: "bar",
2562 base: "foo",
2563 certificate: ":new_certificate",
Liz Kammere2b27f42020-05-07 13:24:05 -07002564 lineage: "lineage.bin",
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002565 rotationMinSdkVersion: "32",
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002566 logging_parent: "bah",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002567 }
2568
2569 android_app_certificate {
2570 name: "new_certificate",
2571 certificate: "cert/new_cert",
2572 }
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002573
2574 override_android_app {
2575 name: "baz",
2576 base: "foo",
2577 package_name: "org.dandroid.bp",
2578 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002579
2580 override_android_app {
2581 name: "baz_no_rename_resources",
2582 base: "foo",
2583 package_name: "org.dandroid.bp",
2584 rename_resources_package: false,
2585 }
2586
2587 android_app {
2588 name: "foo_no_rename_resources",
2589 srcs: ["a.java"],
2590 certificate: "expiredkey",
2591 overrides: ["qux"],
2592 rename_resources_package: false,
2593 sdk_version: "current",
2594 }
2595
2596 override_android_app {
2597 name: "baz_base_no_rename_resources",
2598 base: "foo_no_rename_resources",
2599 package_name: "org.dandroid.bp",
2600 }
2601
2602 override_android_app {
2603 name: "baz_override_base_rename_resources",
2604 base: "foo_no_rename_resources",
2605 package_name: "org.dandroid.bp",
2606 rename_resources_package: true,
2607 }
Jaewoong Jung525443a2019-02-28 15:35:54 -08002608 `)
2609
2610 expectedVariants := []struct {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002611 name string
2612 moduleName string
2613 variantName string
2614 apkName string
2615 apkPath string
2616 certFlag string
2617 certSigningFlags string
2618 overrides []string
2619 packageFlag string
2620 renameResources bool
2621 logging_parent string
Jaewoong Jung525443a2019-02-28 15:35:54 -08002622 }{
2623 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002624 name: "foo",
2625 moduleName: "foo",
2626 variantName: "android_common",
2627 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2628 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2629 certSigningFlags: "",
2630 overrides: []string{"qux"},
2631 packageFlag: "",
2632 renameResources: false,
2633 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002634 },
2635 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002636 name: "foo",
2637 moduleName: "bar",
2638 variantName: "android_common_bar",
2639 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2640 certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
2641 certSigningFlags: "--lineage lineage.bin --rotation-min-sdk-version 32",
2642 overrides: []string{"qux", "foo"},
2643 packageFlag: "",
2644 renameResources: false,
2645 logging_parent: "bah",
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002646 },
2647 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002648 name: "foo",
2649 moduleName: "baz",
2650 variantName: "android_common_baz",
2651 apkPath: "out/soong/target/product/test_device/system/app/baz/baz.apk",
2652 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2653 certSigningFlags: "",
2654 overrides: []string{"qux", "foo"},
2655 packageFlag: "org.dandroid.bp",
2656 renameResources: true,
2657 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002658 },
2659 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002660 name: "foo",
2661 moduleName: "baz_no_rename_resources",
2662 variantName: "android_common_baz_no_rename_resources",
2663 apkPath: "out/soong/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
2664 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2665 certSigningFlags: "",
2666 overrides: []string{"qux", "foo"},
2667 packageFlag: "org.dandroid.bp",
2668 renameResources: false,
2669 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002670 },
2671 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002672 name: "foo_no_rename_resources",
2673 moduleName: "baz_base_no_rename_resources",
2674 variantName: "android_common_baz_base_no_rename_resources",
2675 apkPath: "out/soong/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
2676 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2677 certSigningFlags: "",
2678 overrides: []string{"qux", "foo_no_rename_resources"},
2679 packageFlag: "org.dandroid.bp",
2680 renameResources: false,
2681 logging_parent: "",
Liz Kammer9f9fd022020-06-18 19:44:06 +00002682 },
2683 {
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002684 name: "foo_no_rename_resources",
2685 moduleName: "baz_override_base_rename_resources",
2686 variantName: "android_common_baz_override_base_rename_resources",
2687 apkPath: "out/soong/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
2688 certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
2689 certSigningFlags: "",
2690 overrides: []string{"qux", "foo_no_rename_resources"},
2691 packageFlag: "org.dandroid.bp",
2692 renameResources: true,
2693 logging_parent: "",
Jaewoong Jung525443a2019-02-28 15:35:54 -08002694 },
2695 }
2696 for _, expected := range expectedVariants {
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002697 variant := result.ModuleForTests(expected.name, expected.variantName)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002698
2699 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002700 variant.Output(expected.apkPath)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002701
2702 // Check the certificate paths
Jaewoong Jung5a498812019-11-07 14:14:38 -08002703 signapk := variant.Output(expected.moduleName + ".apk")
Liz Kammere2b27f42020-05-07 13:24:05 -07002704 certFlag := signapk.Args["certificates"]
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002705 android.AssertStringEquals(t, "certificates flags", expected.certFlag, certFlag)
Liz Kammere2b27f42020-05-07 13:24:05 -07002706
Rupert Shuttleworth8eab8692021-11-03 10:39:39 -04002707 // Check the cert signing flags
2708 certSigningFlags := signapk.Args["flags"]
2709 android.AssertStringEquals(t, "cert signing flags", expected.certSigningFlags, certSigningFlags)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002710
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002711 // Check if the overrides field values are correctly aggregated.
Jaewoong Jung525443a2019-02-28 15:35:54 -08002712 mod := variant.Module().(*AndroidApp)
zhidoua2ce78f2022-02-17 02:33:12 +00002713 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002714
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002715 // Test Overridable property: Logging_parent
2716 logging_parent := mod.aapt.LoggingParent
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002717 android.AssertStringEquals(t, "overrides property value for logging parent", expected.logging_parent, logging_parent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -08002718
Liz Kammer1d5983b2020-05-19 19:15:37 +00002719 // Check the package renaming flag, if exists.
Jaewoong Jung6f373f62019-03-13 10:13:24 -07002720 res := variant.Output("package-res.apk")
2721 aapt2Flags := res.Args["flags"]
Liz Kammer9f9fd022020-06-18 19:44:06 +00002722 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
2723 expectedPackage := expected.packageFlag
2724 if !expected.renameResources {
2725 expectedPackage = ""
Liz Kammer1d5983b2020-05-19 19:15:37 +00002726 }
Liz Kammer9f9fd022020-06-18 19:44:06 +00002727 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
Jaewoong Jung525443a2019-02-28 15:35:54 -08002728 }
2729}
Jaewoong Jungccbb3932019-04-15 09:48:31 -07002730
zhidoua2ce78f2022-02-17 02:33:12 +00002731func TestOverrideAndroidAppOverrides(t *testing.T) {
2732 ctx, _ := testJava(
2733 t, `
2734 android_app {
2735 name: "foo",
2736 srcs: ["a.java"],
2737 sdk_version: "current",
2738 overrides: ["qux"]
2739 }
2740
2741 android_app {
2742 name: "bar",
2743 srcs: ["b.java"],
2744 sdk_version: "current",
2745 overrides: ["foo"]
2746 }
2747
2748 override_android_app {
2749 name: "foo_override",
2750 base: "foo",
2751 overrides: ["bar"]
2752 }
2753 `)
2754
2755 expectedVariants := []struct {
2756 name string
2757 moduleName string
2758 variantName string
2759 overrides []string
2760 }{
2761 {
2762 name: "foo",
2763 moduleName: "foo",
2764 variantName: "android_common",
2765 overrides: []string{"qux"},
2766 },
2767 {
2768 name: "bar",
2769 moduleName: "bar",
2770 variantName: "android_common",
2771 overrides: []string{"foo"},
2772 },
2773 {
2774 name: "foo",
2775 moduleName: "foo_override",
2776 variantName: "android_common_foo_override",
2777 overrides: []string{"bar", "foo"},
2778 },
2779 }
2780 for _, expected := range expectedVariants {
2781 variant := ctx.ModuleForTests(expected.name, expected.variantName)
2782
2783 // Check if the overrides field values are correctly aggregated.
2784 mod := variant.Module().(*AndroidApp)
2785 android.AssertDeepEquals(t, "overrides property", expected.overrides, mod.overridableAppProperties.Overrides)
2786 }
2787}
2788
Colin Crossaaa0c1f2022-05-16 16:19:54 -07002789func TestOverrideAndroidAppWithPrebuilt(t *testing.T) {
2790 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
2791 t, `
2792 android_app {
2793 name: "foo",
2794 srcs: ["a.java"],
2795 sdk_version: "current",
2796 }
2797
2798 override_android_app {
2799 name: "bar",
2800 base: "foo",
2801 }
2802
2803 android_app_import {
2804 name: "bar",
2805 prefer: true,
2806 apk: "bar.apk",
2807 presigned: true,
2808 }
2809 `)
2810
2811 // An app that has an override that also has a prebuilt should not be hidden.
2812 foo := result.ModuleForTests("foo", "android_common")
2813 if foo.Module().IsHideFromMake() {
2814 t.Errorf("expected foo to have HideFromMake false")
2815 }
2816
2817 // An override that also has a prebuilt should be hidden.
2818 barOverride := result.ModuleForTests("foo", "android_common_bar")
2819 if !barOverride.Module().IsHideFromMake() {
2820 t.Errorf("expected bar override variant of foo to have HideFromMake true")
2821 }
2822}
2823
Jooyung Han01d80d82022-01-08 12:16:32 +09002824func TestOverrideAndroidAppStem(t *testing.T) {
2825 ctx, _ := testJava(t, `
2826 android_app {
2827 name: "foo",
2828 srcs: ["a.java"],
2829 sdk_version: "current",
2830 }
2831 override_android_app {
2832 name: "bar",
2833 base: "foo",
2834 }
2835 override_android_app {
2836 name: "baz",
2837 base: "foo",
2838 stem: "baz_stem",
2839 }
2840 android_app {
2841 name: "foo2",
2842 srcs: ["a.java"],
2843 sdk_version: "current",
2844 stem: "foo2_stem",
2845 }
2846 override_android_app {
2847 name: "bar2",
2848 base: "foo2",
2849 }
2850 override_android_app {
2851 name: "baz2",
2852 base: "foo2",
2853 stem: "baz2_stem",
2854 }
2855 `)
2856 for _, expected := range []struct {
2857 moduleName string
2858 variantName string
2859 apkPath string
2860 }{
2861 {
2862 moduleName: "foo",
2863 variantName: "android_common",
2864 apkPath: "out/soong/target/product/test_device/system/app/foo/foo.apk",
2865 },
2866 {
2867 moduleName: "foo",
2868 variantName: "android_common_bar",
2869 apkPath: "out/soong/target/product/test_device/system/app/bar/bar.apk",
2870 },
2871 {
2872 moduleName: "foo",
2873 variantName: "android_common_baz",
2874 apkPath: "out/soong/target/product/test_device/system/app/baz_stem/baz_stem.apk",
2875 },
2876 {
2877 moduleName: "foo2",
2878 variantName: "android_common",
2879 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2880 },
2881 {
2882 moduleName: "foo2",
2883 variantName: "android_common_bar2",
2884 // Note that this may cause the duplicate output error.
2885 apkPath: "out/soong/target/product/test_device/system/app/foo2_stem/foo2_stem.apk",
2886 },
2887 {
2888 moduleName: "foo2",
2889 variantName: "android_common_baz2",
2890 apkPath: "out/soong/target/product/test_device/system/app/baz2_stem/baz2_stem.apk",
2891 },
2892 } {
2893 variant := ctx.ModuleForTests(expected.moduleName, expected.variantName)
2894 variant.Output(expected.apkPath)
2895 }
2896}
2897
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002898func TestOverrideAndroidAppDependency(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07002899 ctx, _ := testJava(t, `
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002900 android_app {
2901 name: "foo",
2902 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09002903 sdk_version: "current",
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002904 }
2905
2906 override_android_app {
2907 name: "bar",
2908 base: "foo",
2909 package_name: "org.dandroid.bp",
2910 }
2911
2912 android_test {
2913 name: "baz",
2914 srcs: ["b.java"],
2915 instrumentation_for: "foo",
2916 }
2917
2918 android_test {
2919 name: "qux",
2920 srcs: ["b.java"],
2921 instrumentation_for: "bar",
2922 }
2923 `)
2924
2925 // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002926 javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002927 fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002928 if !strings.Contains(javac.Args["classpath"], fooTurbine) {
2929 t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
2930 }
2931
2932 // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
Paul Duffina71a67a2021-03-29 00:42:57 +01002933 javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00002934 barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar"
Jaewoong Jungb639a6a2019-05-10 15:16:29 -07002935 if !strings.Contains(javac.Args["classpath"], barTurbine) {
2936 t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
2937 }
2938}
2939
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002940func TestOverrideAndroidTest(t *testing.T) {
2941 ctx, _ := testJava(t, `
2942 android_app {
2943 name: "foo",
2944 srcs: ["a.java"],
2945 package_name: "com.android.foo",
2946 sdk_version: "current",
2947 }
2948
2949 override_android_app {
2950 name: "bar",
2951 base: "foo",
2952 package_name: "com.android.bar",
2953 }
2954
2955 android_test {
2956 name: "foo_test",
2957 srcs: ["b.java"],
2958 instrumentation_for: "foo",
2959 }
2960
2961 override_android_test {
2962 name: "bar_test",
2963 base: "foo_test",
2964 package_name: "com.android.bar.test",
2965 instrumentation_for: "bar",
2966 instrumentation_target_package: "com.android.bar",
2967 }
2968 `)
2969
2970 expectedVariants := []struct {
2971 moduleName string
2972 variantName string
2973 apkPath string
2974 overrides []string
2975 targetVariant string
2976 packageFlag string
2977 targetPackageFlag string
2978 }{
2979 {
2980 variantName: "android_common",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002981 apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002982 overrides: nil,
2983 targetVariant: "android_common",
2984 packageFlag: "",
2985 targetPackageFlag: "",
2986 },
2987 {
2988 variantName: "android_common_bar_test",
Jaewoong Jung326a9412019-11-21 10:41:00 -08002989 apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
Jaewoong Jung26dedd32019-06-06 08:45:58 -07002990 overrides: []string{"foo_test"},
2991 targetVariant: "android_common_bar",
2992 packageFlag: "com.android.bar.test",
2993 targetPackageFlag: "com.android.bar",
2994 },
2995 }
2996 for _, expected := range expectedVariants {
2997 variant := ctx.ModuleForTests("foo_test", expected.variantName)
2998
2999 // Check the final apk name
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003000 variant.Output("out/soong" + expected.apkPath)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003001
3002 // Check if the overrides field values are correctly aggregated.
3003 mod := variant.Module().(*AndroidTest)
zhidoua2ce78f2022-02-17 02:33:12 +00003004 if !reflect.DeepEqual(expected.overrides, mod.overridableAppProperties.Overrides) {
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003005 t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
zhidoua2ce78f2022-02-17 02:33:12 +00003006 expected.overrides, mod.overridableAppProperties.Overrides)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003007 }
3008
3009 // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
Paul Duffina71a67a2021-03-29 00:42:57 +01003010 javac := variant.Rule("javac")
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003011 turbine := filepath.Join("out", "soong", ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003012 if !strings.Contains(javac.Args["classpath"], turbine) {
3013 t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
3014 }
3015
3016 // Check aapt2 flags.
3017 res := variant.Output("package-res.apk")
3018 aapt2Flags := res.Args["flags"]
3019 checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
Liz Kammer9f9fd022020-06-18 19:44:06 +00003020 checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003021 checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
3022 }
3023}
3024
Jaewoong Jung39982342020-01-14 10:27:18 -08003025func TestAndroidTest_FixTestConfig(t *testing.T) {
3026 ctx, _ := testJava(t, `
3027 android_app {
3028 name: "foo",
3029 srcs: ["a.java"],
3030 package_name: "com.android.foo",
3031 sdk_version: "current",
3032 }
3033
3034 android_test {
3035 name: "foo_test",
3036 srcs: ["b.java"],
3037 instrumentation_for: "foo",
3038 }
3039
3040 android_test {
3041 name: "bar_test",
3042 srcs: ["b.java"],
3043 package_name: "com.android.bar.test",
3044 instrumentation_for: "foo",
Seth Moorec6f4b532023-02-02 13:22:26 -08003045 mainline_package_name: "com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08003046 }
3047
3048 override_android_test {
3049 name: "baz_test",
3050 base: "foo_test",
3051 package_name: "com.android.baz.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08003052 mainline_package_name: "com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08003053 }
3054 `)
3055
3056 testCases := []struct {
3057 moduleName string
3058 variantName string
3059 expectedFlags []string
3060 }{
3061 {
3062 moduleName: "foo_test",
3063 variantName: "android_common",
3064 },
3065 {
3066 moduleName: "bar_test",
3067 variantName: "android_common",
3068 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003069 "--manifest out/soong/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003070 "--package-name com.android.bar.test",
Seth Moorec6f4b532023-02-02 13:22:26 -08003071 "--mainline-package-name com.android.bar",
Jaewoong Jung39982342020-01-14 10:27:18 -08003072 },
3073 },
3074 {
3075 moduleName: "foo_test",
3076 variantName: "android_common_baz_test",
3077 expectedFlags: []string{
Paul Duffinfb0fe9f2021-03-22 17:31:52 +00003078 "--manifest out/soong/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
Jaewoong Jung39982342020-01-14 10:27:18 -08003079 "--package-name com.android.baz.test",
3080 "--test-file-name baz_test.apk",
Seth Moorec6f4b532023-02-02 13:22:26 -08003081 "out/soong/.intermediates/foo_test/android_common_baz_test/test_config_fixer/AndroidTest.xml",
3082 "--mainline-package-name com.android.baz",
Jaewoong Jung39982342020-01-14 10:27:18 -08003083 },
3084 },
3085 }
3086
3087 for _, test := range testCases {
3088 variant := ctx.ModuleForTests(test.moduleName, test.variantName)
Paul Duffina71a67a2021-03-29 00:42:57 +01003089 params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
Jaewoong Jung39982342020-01-14 10:27:18 -08003090
3091 if len(test.expectedFlags) > 0 {
3092 if params.Rule == nil {
3093 t.Errorf("test_config_fixer was expected to run, but didn't")
3094 } else {
3095 for _, flag := range test.expectedFlags {
3096 if !strings.Contains(params.RuleParams.Command, flag) {
3097 t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
3098 }
3099 }
3100 }
3101 } else {
3102 if params.Rule != nil {
3103 t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
3104 }
3105 }
Jaewoong Jung39982342020-01-14 10:27:18 -08003106 }
3107}
3108
Paul Duffin53a70a42022-01-11 14:35:55 +00003109func TestInstrumentationTargetPrebuilt(t *testing.T) {
3110 bp := `
3111 android_app_import {
3112 name: "foo",
3113 apk: "foo.apk",
3114 presigned: true,
3115 }
3116
3117 android_test {
3118 name: "bar",
3119 srcs: ["a.java"],
3120 instrumentation_for: "foo",
3121 sdk_version: "current",
3122 }
3123 `
3124
3125 android.GroupFixturePreparers(
3126 PrepareForTestWithJavaDefaultModules,
3127 ).ExtendWithErrorHandler(
3128 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
3129 "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
3130 RunTestWithBp(t, bp)
3131}
3132
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003133func TestStl(t *testing.T) {
Jaewoong Jungf9a04432019-07-17 11:15:09 -07003134 ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003135 cc_library {
3136 name: "libjni",
Peter Collingbournead84f972019-12-17 16:46:18 -08003137 sdk_version: "current",
3138 stl: "c++_shared",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003139 }
3140
3141 android_test {
3142 name: "stl",
3143 jni_libs: ["libjni"],
3144 compile_multilib: "both",
3145 sdk_version: "current",
3146 stl: "c++_shared",
3147 }
3148
3149 android_test {
3150 name: "system",
3151 jni_libs: ["libjni"],
3152 compile_multilib: "both",
3153 sdk_version: "current",
3154 }
3155 `)
3156
3157 testCases := []struct {
3158 name string
3159 jnis []string
3160 }{
3161 {"stl",
3162 []string{
3163 "libjni.so",
Jaewoong Jung710756a2019-06-04 11:53:47 -07003164 "libc++_shared.so",
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003165 },
3166 },
3167 {"system",
3168 []string{
3169 "libjni.so",
3170 },
3171 },
3172 }
3173
3174 for _, test := range testCases {
3175 t.Run(test.name, func(t *testing.T) {
3176 app := ctx.ModuleForTests(test.name, "android_common")
Colin Crossb3168ba2023-07-26 16:14:56 -07003177 jniLibZip := app.Output("jnilibs.zip")
Jaewoong Jungbc625cd2019-05-06 15:48:44 -07003178 var jnis []string
3179 args := strings.Fields(jniLibZip.Args["jarArgs"])
3180 for i := 0; i < len(args); i++ {
3181 if args[i] == "-f" {
3182 jnis = append(jnis, args[i+1])
3183 i += 1
3184 }
3185 }
3186 jnisJoined := strings.Join(jnis, " ")
3187 for _, jni := range test.jnis {
3188 if !strings.Contains(jnisJoined, jni) {
3189 t.Errorf("missing jni %q in %q", jni, jnis)
3190 }
3191 }
3192 })
3193 }
3194}
Colin Cross50ddcc42019-05-16 12:28:22 -07003195
3196func TestUsesLibraries(t *testing.T) {
3197 bp := `
3198 java_sdk_library {
3199 name: "foo",
3200 srcs: ["a.java"],
3201 api_packages: ["foo"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003202 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003203 }
3204
3205 java_sdk_library {
Paul Duffin859fe962020-05-15 10:20:31 +01003206 name: "qux",
3207 srcs: ["a.java"],
3208 api_packages: ["qux"],
3209 sdk_version: "current",
3210 }
3211
3212 java_sdk_library {
3213 name: "quuz",
3214 srcs: ["a.java"],
3215 api_packages: ["quuz"],
3216 sdk_version: "current",
3217 }
3218
3219 java_sdk_library {
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003220 name: "fred",
3221 srcs: ["a.java"],
3222 api_packages: ["fred"],
3223 sdk_version: "current",
3224 }
3225
3226 java_sdk_library {
Colin Cross50ddcc42019-05-16 12:28:22 -07003227 name: "bar",
3228 srcs: ["a.java"],
3229 api_packages: ["bar"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003230 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003231 }
3232
Ulya Trafimovich4b6d4c12020-08-19 14:58:01 +01003233 java_sdk_library {
3234 name: "runtime-library",
3235 srcs: ["a.java"],
3236 sdk_version: "current",
3237 }
3238
3239 java_library {
3240 name: "static-runtime-helper",
3241 srcs: ["a.java"],
3242 libs: ["runtime-library"],
3243 sdk_version: "current",
3244 }
3245
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003246 java_library {
3247 name: "runtime-required-x",
3248 srcs: ["a.java"],
3249 installable: true,
3250 sdk_version: "current",
3251 }
3252
3253 java_library {
3254 name: "runtime-optional-x",
3255 srcs: ["a.java"],
3256 installable: true,
3257 sdk_version: "current",
3258 }
3259
3260 android_library {
3261 name: "static-x",
3262 uses_libs: ["runtime-required-x"],
3263 optional_uses_libs: ["runtime-optional-x"],
3264 sdk_version: "current",
3265 }
3266
3267 java_library {
3268 name: "runtime-required-y",
3269 srcs: ["a.java"],
3270 installable: true,
3271 sdk_version: "current",
3272 }
3273
3274 java_library {
3275 name: "runtime-optional-y",
3276 srcs: ["a.java"],
3277 installable: true,
3278 sdk_version: "current",
3279 }
3280
3281 java_library {
3282 name: "static-y",
3283 srcs: ["a.java"],
3284 uses_libs: ["runtime-required-y"],
Jiakai Zhang36937082024-04-15 11:15:50 +00003285 optional_uses_libs: [
3286 "runtime-optional-y",
3287 "missing-lib-a",
3288 ],
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003289 sdk_version: "current",
3290 }
3291
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003292 // A library that has to use "provides_uses_lib", because:
3293 // - it is not an SDK library
3294 // - its library name is different from its module name
3295 java_library {
3296 name: "non-sdk-lib",
3297 provides_uses_lib: "com.non.sdk.lib",
3298 installable: true,
3299 srcs: ["a.java"],
3300 }
3301
Colin Cross50ddcc42019-05-16 12:28:22 -07003302 android_app {
3303 name: "app",
3304 srcs: ["a.java"],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003305 libs: [
3306 "qux",
3307 "quuz.stubs"
3308 ],
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003309 static_libs: [
3310 "static-runtime-helper",
3311 // statically linked component libraries should not pull their SDK libraries,
3312 // so "fred" should not be added to class loader context
3313 "fred.stubs",
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003314 "static-x",
3315 "static-y",
Ulya Trafimovich65b03192020-12-03 16:50:22 +00003316 ],
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003317 uses_libs: [
3318 "foo",
3319 "non-sdk-lib"
3320 ],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003321 sdk_version: "current",
Colin Cross50ddcc42019-05-16 12:28:22 -07003322 optional_uses_libs: [
3323 "bar",
Jiakai Zhangf98da192024-04-15 11:15:41 +00003324 "missing-lib-b",
Colin Cross50ddcc42019-05-16 12:28:22 -07003325 ],
3326 }
3327
3328 android_app_import {
3329 name: "prebuilt",
3330 apk: "prebuilts/apk/app.apk",
3331 certificate: "platform",
Ulya Trafimovich861a8962021-02-26 14:49:07 +00003332 uses_libs: [
3333 "foo",
3334 "non-sdk-lib",
3335 "android.test.runner"
3336 ],
Colin Cross50ddcc42019-05-16 12:28:22 -07003337 optional_uses_libs: [
3338 "bar",
Jiakai Zhangf98da192024-04-15 11:15:41 +00003339 "missing-lib-b",
Colin Cross50ddcc42019-05-16 12:28:22 -07003340 ],
3341 }
3342 `
3343
Paul Duffin71ae5942021-03-22 15:36:52 +00003344 result := android.GroupFixturePreparers(
3345 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003346 PrepareForTestWithJavaSdkLibraryFiles,
3347 FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
Jiakai Zhang48203e32023-06-02 23:42:21 +01003348 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3349 variables.BuildWarningBadOptionalUsesLibsAllowlist = []string{"app", "prebuilt"}
3350 }),
Paul Duffind234b412021-03-12 23:04:46 +00003351 ).RunTestWithBp(t, bp)
Colin Cross50ddcc42019-05-16 12:28:22 -07003352
Paul Duffind234b412021-03-12 23:04:46 +00003353 app := result.ModuleForTests("app", "android_common")
3354 prebuilt := result.ModuleForTests("prebuilt", "android_common")
Colin Cross50ddcc42019-05-16 12:28:22 -07003355
Paul Duffin859fe962020-05-15 10:20:31 +01003356 // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003357 // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be
3358 // propagated from dependencies.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003359 actualManifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
Jiyong Park20df11e2024-05-08 09:54:22 +00003360 expectManifestFixerArgs := `--uses-library foo ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003361 `--uses-library com.non.sdk.lib ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003362 `--uses-library qux ` +
3363 `--uses-library quuz ` +
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +01003364 `--uses-library runtime-library ` +
3365 `--uses-library runtime-required-x ` +
3366 `--uses-library runtime-required-y ` +
3367 `--optional-uses-library bar ` +
3368 `--optional-uses-library runtime-optional-x ` +
3369 `--optional-uses-library runtime-optional-y`
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003370 android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs)
Paul Duffin859fe962020-05-15 10:20:31 +01003371
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003372 // Test that all libraries are verified (library order matters).
3373 verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command
3374 verifyArgs := `--uses-library foo ` +
Ulya Trafimovicheea486a2021-02-26 11:38:21 +00003375 `--uses-library com.non.sdk.lib ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003376 `--uses-library qux ` +
3377 `--uses-library quuz ` +
3378 `--uses-library runtime-library ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003379 `--uses-library runtime-required-x ` +
3380 `--uses-library runtime-required-y ` +
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003381 `--optional-uses-library bar ` +
Ulya Trafimoviche4432872021-08-18 16:57:11 +01003382 `--optional-uses-library runtime-optional-x ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003383 `--optional-uses-library runtime-optional-y ` +
Jiakai Zhang36937082024-04-15 11:15:50 +00003384 `--missing-optional-uses-library missing-lib-b ` +
3385 `--missing-optional-uses-library missing-lib-a`
Paul Duffind234b412021-03-12 23:04:46 +00003386 android.AssertStringDoesContain(t, "verify cmd args", verifyCmd, verifyArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003387
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003388 // Test that all libraries are verified for an APK (library order matters).
3389 verifyApkCmd := prebuilt.Rule("verify_uses_libraries").RuleParams.Command
Ulya Trafimovich0aba2522021-03-03 16:38:37 +00003390 verifyApkArgs := `--uses-library foo ` +
3391 `--uses-library com.non.sdk.lib ` +
3392 `--uses-library android.test.runner ` +
3393 `--optional-uses-library bar ` +
Jiakai Zhangf98da192024-04-15 11:15:41 +00003394 `--missing-optional-uses-library missing-lib-b `
Paul Duffind234b412021-03-12 23:04:46 +00003395 android.AssertStringDoesContain(t, "verify apk cmd args", verifyApkCmd, verifyApkArgs)
Colin Cross50ddcc42019-05-16 12:28:22 -07003396
Jiakai Zhanga4496782023-05-17 16:57:30 +01003397 // Test that necessary args are passed for constructing CLC in Ninja phase.
Ulya Trafimovich2eaf5c52021-02-26 12:05:11 +00003398 cmd := app.Rule("dexpreopt").RuleParams.Command
Jiakai Zhanga4496782023-05-17 16:57:30 +01003399 android.AssertStringDoesContain(t, "dexpreopt app cmd context", cmd, "--context-json=")
3400 android.AssertStringDoesContain(t, "dexpreopt app cmd product_packages", cmd,
Spandan Das2069c3f2023-12-06 19:40:24 +00003401 "--product-packages=out/soong/.intermediates/app/android_common/dexpreopt/app/product_packages.txt")
Colin Cross50ddcc42019-05-16 12:28:22 -07003402}
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003403
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003404func TestDexpreoptBcp(t *testing.T) {
3405 bp := `
3406 java_sdk_library {
3407 name: "foo",
3408 srcs: ["a.java"],
3409 api_packages: ["foo"],
3410 sdk_version: "current",
3411 }
3412
3413 java_sdk_library {
3414 name: "bar",
3415 srcs: ["a.java"],
3416 api_packages: ["bar"],
3417 permitted_packages: ["bar"],
3418 sdk_version: "current",
3419 }
3420
3421 android_app {
3422 name: "app",
3423 srcs: ["a.java"],
3424 sdk_version: "current",
3425 }
3426 `
3427
3428 testCases := []struct {
3429 name string
3430 with bool
3431 expect string
3432 }{
3433 {
3434 name: "with updatable bcp",
3435 with: true,
3436 expect: "/system/framework/foo.jar:/system/framework/bar.jar",
3437 },
3438 {
3439 name: "without updatable bcp",
3440 with: false,
3441 expect: "/system/framework/foo.jar",
3442 },
3443 }
3444
3445 for _, test := range testCases {
3446 t.Run(test.name, func(t *testing.T) {
3447 result := android.GroupFixturePreparers(
3448 prepareForJavaTest,
3449 PrepareForTestWithJavaSdkLibraryFiles,
3450 FixtureWithLastReleaseApis("runtime-library", "foo", "bar"),
3451 dexpreopt.FixtureSetBootJars("platform:foo"),
satayevd604b212021-07-21 14:23:52 +01003452 dexpreopt.FixtureSetApexBootJars("platform:bar"),
Ulya Trafimovich9023b022021-03-22 16:02:28 +00003453 dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with),
3454 ).RunTestWithBp(t, bp)
3455
3456 app := result.ModuleForTests("app", "android_common")
3457 cmd := app.Rule("dexpreopt").RuleParams.Command
3458 bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters
3459 android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp)
3460 })
3461 }
3462}
3463
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003464func TestCodelessApp(t *testing.T) {
3465 testCases := []struct {
3466 name string
3467 bp string
3468 noCode bool
3469 }{
3470 {
3471 name: "normal",
3472 bp: `
3473 android_app {
3474 name: "foo",
3475 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003476 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003477 }
3478 `,
3479 noCode: false,
3480 },
3481 {
3482 name: "app without sources",
3483 bp: `
3484 android_app {
3485 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003486 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003487 }
3488 `,
3489 noCode: true,
3490 },
3491 {
3492 name: "app with libraries",
3493 bp: `
3494 android_app {
3495 name: "foo",
3496 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003497 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003498 }
3499
3500 java_library {
3501 name: "lib",
3502 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003503 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003504 }
3505 `,
3506 noCode: false,
3507 },
3508 {
3509 name: "app with sourceless libraries",
3510 bp: `
3511 android_app {
3512 name: "foo",
3513 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003514 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003515 }
3516
3517 java_library {
3518 name: "lib",
Jeongik Cha538c0d02019-07-11 15:54:27 +09003519 sdk_version: "current",
Jaewoong Jungc27ab662019-05-30 15:51:14 -07003520 }
3521 `,
3522 // TODO(jungjw): this should probably be true
3523 noCode: false,
3524 },
3525 }
3526
3527 for _, test := range testCases {
3528 t.Run(test.name, func(t *testing.T) {
3529 ctx := testApp(t, test.bp)
3530
3531 foo := ctx.ModuleForTests("foo", "android_common")
3532 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3533 if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
3534 t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
3535 }
3536 })
3537 }
3538}
Jaewoong Jung5b425e22019-06-17 17:40:56 -07003539
Colin Cross53a87f52019-06-25 13:35:30 -07003540func TestUncompressDex(t *testing.T) {
3541 testCases := []struct {
3542 name string
3543 bp string
3544
3545 uncompressedPlatform bool
3546 uncompressedUnbundled bool
3547 }{
3548 {
3549 name: "normal",
3550 bp: `
3551 android_app {
3552 name: "foo",
3553 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003554 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003555 }
3556 `,
3557 uncompressedPlatform: true,
3558 uncompressedUnbundled: false,
3559 },
3560 {
3561 name: "use_embedded_dex",
3562 bp: `
3563 android_app {
3564 name: "foo",
3565 use_embedded_dex: true,
3566 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003567 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003568 }
3569 `,
3570 uncompressedPlatform: true,
3571 uncompressedUnbundled: true,
3572 },
3573 {
3574 name: "privileged",
3575 bp: `
3576 android_app {
3577 name: "foo",
3578 privileged: true,
3579 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +09003580 sdk_version: "current",
Colin Cross53a87f52019-06-25 13:35:30 -07003581 }
3582 `,
3583 uncompressedPlatform: true,
3584 uncompressedUnbundled: true,
3585 },
David Srbeckye033cba2020-05-20 22:20:28 +01003586 {
3587 name: "normal_uncompress_dex_true",
3588 bp: `
3589 android_app {
3590 name: "foo",
3591 srcs: ["a.java"],
3592 sdk_version: "current",
3593 uncompress_dex: true,
3594 }
3595 `,
3596 uncompressedPlatform: true,
3597 uncompressedUnbundled: true,
3598 },
3599 {
3600 name: "normal_uncompress_dex_false",
3601 bp: `
3602 android_app {
3603 name: "foo",
3604 srcs: ["a.java"],
3605 sdk_version: "current",
3606 uncompress_dex: false,
3607 }
3608 `,
3609 uncompressedPlatform: false,
3610 uncompressedUnbundled: false,
3611 },
Colin Cross53a87f52019-06-25 13:35:30 -07003612 }
3613
3614 test := func(t *testing.T, bp string, want bool, unbundled bool) {
3615 t.Helper()
3616
Paul Duffin71ae5942021-03-22 15:36:52 +00003617 result := android.GroupFixturePreparers(
3618 prepareForJavaTest,
Paul Duffin2645a292021-03-13 02:36:00 +00003619 PrepareForTestWithPrebuiltsOfCurrentApi,
Paul Duffincdb88a92021-03-14 00:36:50 +00003620 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3621 if unbundled {
3622 variables.Unbundled_build = proptools.BoolPtr(true)
3623 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
3624 }
3625 }),
3626 ).RunTestWithBp(t, bp)
Colin Cross53a87f52019-06-25 13:35:30 -07003627
Paul Duffincdb88a92021-03-14 00:36:50 +00003628 foo := result.ModuleForTests("foo", "android_common")
Colin Cross53a87f52019-06-25 13:35:30 -07003629 dex := foo.Rule("r8")
3630 uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
3631 aligned := foo.MaybeRule("zipalign").Rule != nil
3632
Paul Duffincdb88a92021-03-14 00:36:50 +00003633 android.AssertBoolEquals(t, "uncompressed in dex", want, uncompressedInDexJar)
Colin Cross53a87f52019-06-25 13:35:30 -07003634
Paul Duffincdb88a92021-03-14 00:36:50 +00003635 android.AssertBoolEquals(t, "aligne", want, aligned)
Colin Cross53a87f52019-06-25 13:35:30 -07003636 }
3637
3638 for _, tt := range testCases {
3639 t.Run(tt.name, func(t *testing.T) {
3640 t.Run("platform", func(t *testing.T) {
3641 test(t, tt.bp, tt.uncompressedPlatform, false)
3642 })
3643 t.Run("unbundled", func(t *testing.T) {
3644 test(t, tt.bp, tt.uncompressedUnbundled, true)
3645 })
3646 })
3647 }
3648}
Jaewoong Jung26dedd32019-06-06 08:45:58 -07003649
3650func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
3651 if expectedValue != "" {
3652 expectedFlag := "--" + flagName + " " + expectedValue
3653 if !strings.Contains(aapt2Flags, expectedFlag) {
3654 t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
3655 }
3656 } else {
3657 unexpectedFlag := "--" + flagName
3658 if strings.Contains(aapt2Flags, unexpectedFlag) {
3659 t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
3660 }
3661 }
3662}
Jaewoong Jung9befb0c2020-01-18 10:33:43 -08003663
Cole Faust9a631312020-10-22 21:05:24 +00003664func TestExportedProguardFlagFiles(t *testing.T) {
3665 ctx, _ := testJava(t, `
3666 android_app {
3667 name: "foo",
3668 sdk_version: "current",
Colin Crosscde55342024-03-27 14:11:51 -07003669 static_libs: [
3670 "lib1",
3671 "lib3",
3672 ],
Cole Faust9a631312020-10-22 21:05:24 +00003673 }
3674
3675 android_library {
3676 name: "lib1",
3677 sdk_version: "current",
3678 optimize: {
3679 proguard_flags_files: ["lib1proguard.cfg"],
Colin Crosscde55342024-03-27 14:11:51 -07003680 },
3681 static_libs: ["lib2"],
3682 }
3683
3684 android_library {
3685 name: "lib2",
3686 sdk_version: "current",
3687 optimize: {
3688 proguard_flags_files: ["lib2proguard.cfg"],
Cole Faust9a631312020-10-22 21:05:24 +00003689 }
3690 }
Colin Crosscde55342024-03-27 14:11:51 -07003691
3692 android_library_import {
3693 name: "lib3",
3694 sdk_version: "current",
3695 aars: ["lib3.aar"],
3696 static_libs: ["lib4"],
3697 }
3698
3699 android_library {
3700 name: "lib4",
3701 sdk_version: "current",
3702 optimize: {
3703 proguard_flags_files: ["lib4proguard.cfg"],
3704 }
3705 }
3706
3707
Cole Faust9a631312020-10-22 21:05:24 +00003708 `)
3709
3710 m := ctx.ModuleForTests("foo", "android_common")
Colin Crosscde55342024-03-27 14:11:51 -07003711 r8 := m.Rule("java.r8")
3712 implicits := r8.Implicits.RelativeToTop().Strings()
3713 android.AssertStringListContains(t, "r8 implicits", implicits, "lib1proguard.cfg")
3714 android.AssertStringListContains(t, "r8 implicits", implicits, "lib2proguard.cfg")
3715 android.AssertStringListContains(t, "r8 implicits", implicits, "lib4proguard.cfg")
3716 android.AssertStringListContains(t, "r8 implicits", implicits, "out/soong/.intermediates/lib3/android_common/aar/proguard.txt")
Cole Faust9a631312020-10-22 21:05:24 +00003717
Colin Crosscde55342024-03-27 14:11:51 -07003718 flags := r8.Args["r8Flags"]
3719 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib1proguard.cfg")
3720 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib2proguard.cfg")
3721 android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib4proguard.cfg")
3722 android.AssertStringDoesContain(t, "r8 flags", flags, "-include out/soong/.intermediates/lib3/android_common/aar/proguard.txt")
Cole Faust9a631312020-10-22 21:05:24 +00003723}
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003724
3725func TestTargetSdkVersionManifestFixer(t *testing.T) {
3726 platform_sdk_codename := "Tiramisu"
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003727 platform_sdk_version := 33
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003728 testCases := []struct {
3729 name string
3730 targetSdkVersionInBp string
3731 targetSdkVersionExpected string
3732 unbundledBuild bool
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003733 platformSdkFinal bool
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003734 }{
3735 {
3736 name: "Non-Unbundled build: Android.bp has targetSdkVersion",
3737 targetSdkVersionInBp: "30",
3738 targetSdkVersionExpected: "30",
3739 unbundledBuild: false,
3740 },
3741 {
3742 name: "Unbundled build: Android.bp has targetSdkVersion",
3743 targetSdkVersionInBp: "30",
3744 targetSdkVersionExpected: "30",
3745 unbundledBuild: true,
3746 },
3747 {
3748 name: "Non-Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3749 targetSdkVersionInBp: platform_sdk_codename,
3750 targetSdkVersionExpected: platform_sdk_codename,
3751 unbundledBuild: false,
3752 },
3753 {
3754 name: "Unbundled build: Android.bp has targetSdkVersion equal to platform_sdk_codename",
3755 targetSdkVersionInBp: platform_sdk_codename,
3756 targetSdkVersionExpected: "10000",
3757 unbundledBuild: true,
3758 },
3759
3760 {
3761 name: "Non-Unbundled build: Android.bp has no targetSdkVersion",
3762 targetSdkVersionExpected: platform_sdk_codename,
3763 unbundledBuild: false,
3764 },
3765 {
3766 name: "Unbundled build: Android.bp has no targetSdkVersion",
3767 targetSdkVersionExpected: "10000",
3768 unbundledBuild: true,
3769 },
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003770 {
3771 name: "Bundled build in REL branches",
3772 targetSdkVersionExpected: "33",
3773 unbundledBuild: false,
3774 platformSdkFinal: true,
3775 },
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003776 }
3777 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003778 targetSdkVersionTemplate := ""
3779 if testCase.targetSdkVersionInBp != "" {
3780 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, testCase.targetSdkVersionInBp)
3781 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003782 bp := fmt.Sprintf(`
3783 android_app {
3784 name: "foo",
3785 sdk_version: "current",
Spandan Dasca70fc42023-03-01 23:38:49 +00003786 %s
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003787 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003788 `, targetSdkVersionTemplate)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003789 fixture := android.GroupFixturePreparers(
3790 prepareForJavaTest,
3791 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003792 if testCase.platformSdkFinal {
3793 variables.Platform_sdk_final = proptools.BoolPtr(true)
3794 }
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003795 // explicitly set platform_sdk_codename to make the test deterministic
3796 variables.Platform_sdk_codename = &platform_sdk_codename
Spandan Dasfb6a1ee2023-04-27 16:08:26 +00003797 variables.Platform_sdk_version = &platform_sdk_version
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003798 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
3799 // create a non-empty list if unbundledBuild==true
3800 if testCase.unbundledBuild {
3801 variables.Unbundled_build_apps = []string{"apex_a", "apex_b"}
3802 }
3803 }),
3804 )
3805
3806 result := fixture.RunTestWithBp(t, bp)
3807 foo := result.ModuleForTests("foo", "android_common")
3808
Gurpreet Singh75d65f32022-01-24 17:44:05 +00003809 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3810 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
Spandan Dasc8cb0c32021-12-08 17:00:38 +00003811 }
3812}
Colin Cross412436f2022-04-07 17:40:07 -07003813
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003814func TestDefaultAppTargetSdkVersionForUpdatableModules(t *testing.T) {
3815 platform_sdk_codename := "Tiramisu"
3816 platform_sdk_version := 33
3817 testCases := []struct {
3818 name string
3819 platform_sdk_final bool
3820 targetSdkVersionInBp *string
3821 targetSdkVersionExpected *string
3822 updatable bool
3823 }{
3824 {
3825 name: "Non-Updatable Module: Android.bp has older targetSdkVersion",
3826 targetSdkVersionInBp: proptools.StringPtr("29"),
3827 targetSdkVersionExpected: proptools.StringPtr("29"),
3828 updatable: false,
3829 },
3830 {
3831 name: "Updatable Module: Android.bp has older targetSdkVersion",
3832 targetSdkVersionInBp: proptools.StringPtr("30"),
3833 targetSdkVersionExpected: proptools.StringPtr("30"),
3834 updatable: true,
3835 },
3836 {
3837 name: "Updatable Module: Android.bp has no targetSdkVersion",
3838 targetSdkVersionExpected: proptools.StringPtr("10000"),
3839 updatable: true,
3840 },
3841 {
3842 name: "[SDK finalised] Non-Updatable Module: Android.bp has older targetSdkVersion",
3843 platform_sdk_final: true,
3844 targetSdkVersionInBp: proptools.StringPtr("30"),
3845 targetSdkVersionExpected: proptools.StringPtr("30"),
3846 updatable: false,
3847 },
3848 {
3849 name: "[SDK finalised] Updatable Module: Android.bp has older targetSdkVersion",
3850 platform_sdk_final: true,
3851 targetSdkVersionInBp: proptools.StringPtr("30"),
3852 targetSdkVersionExpected: proptools.StringPtr("30"),
3853 updatable: true,
3854 },
3855 {
3856 name: "[SDK finalised] Updatable Module: Android.bp has targetSdkVersion as platform sdk codename",
3857 platform_sdk_final: true,
3858 targetSdkVersionInBp: proptools.StringPtr(platform_sdk_codename),
3859 targetSdkVersionExpected: proptools.StringPtr("33"),
3860 updatable: true,
3861 },
3862 {
3863 name: "[SDK finalised] Updatable Module: Android.bp has no targetSdkVersion",
3864 platform_sdk_final: true,
3865 targetSdkVersionExpected: proptools.StringPtr("33"),
3866 updatable: true,
3867 },
3868 }
3869 for _, testCase := range testCases {
Spandan Dasca70fc42023-03-01 23:38:49 +00003870 targetSdkVersionTemplate := ""
3871 if testCase.targetSdkVersionInBp != nil {
3872 targetSdkVersionTemplate = fmt.Sprintf(`target_sdk_version: "%s",`, *testCase.targetSdkVersionInBp)
3873 }
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003874 bp := fmt.Sprintf(`
3875 android_app {
3876 name: "foo",
3877 sdk_version: "current",
3878 min_sdk_version: "29",
Spandan Dasca70fc42023-03-01 23:38:49 +00003879 %s
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003880 updatable: %t,
3881 enforce_default_target_sdk_version: %t
3882 }
Spandan Dasca70fc42023-03-01 23:38:49 +00003883 `, targetSdkVersionTemplate, testCase.updatable, testCase.updatable) // enforce default target sdk version if app is updatable
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003884
3885 fixture := android.GroupFixturePreparers(
3886 PrepareForTestWithJavaDefaultModules,
3887 android.PrepareForTestWithAllowMissingDependencies,
3888 android.PrepareForTestWithAndroidMk,
3889 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3890 // explicitly set following platform variables to make the test deterministic
3891 variables.Platform_sdk_final = &testCase.platform_sdk_final
3892 variables.Platform_sdk_version = &platform_sdk_version
3893 variables.Platform_sdk_codename = &platform_sdk_codename
3894 variables.Platform_version_active_codenames = []string{platform_sdk_codename}
Harshit Mahajan18845d02023-01-11 18:39:12 +00003895 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003896 variables.Unbundled_build_apps = []string{"sampleModule"}
3897 }),
3898 )
3899
3900 result := fixture.RunTestWithBp(t, bp)
3901 foo := result.ModuleForTests("foo", "android_common")
3902
3903 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3904 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+*testCase.targetSdkVersionExpected)
3905 }
3906}
3907
3908func TestEnforceDefaultAppTargetSdkVersionFlag(t *testing.T) {
3909 platform_sdk_codename := "Tiramisu"
3910 platform_sdk_version := 33
3911 testCases := []struct {
3912 name string
3913 enforceDefaultTargetSdkVersion bool
3914 expectedError string
3915 platform_sdk_final bool
3916 targetSdkVersionInBp string
3917 targetSdkVersionExpected string
3918 updatable bool
3919 }{
3920 {
3921 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
3922 enforceDefaultTargetSdkVersion: false,
3923 targetSdkVersionInBp: "29",
3924 targetSdkVersionExpected: "29",
3925 updatable: false,
3926 },
3927 {
3928 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
3929 enforceDefaultTargetSdkVersion: true,
3930 platform_sdk_final: true,
3931 targetSdkVersionInBp: "current",
3932 targetSdkVersionExpected: "33",
3933 updatable: true,
3934 },
3935 {
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003936 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003937 enforceDefaultTargetSdkVersion: true,
3938 platform_sdk_final: false,
3939 targetSdkVersionInBp: "current",
3940 targetSdkVersionExpected: "10000",
3941 updatable: false,
3942 },
3943 {
3944 name: "Not enforcing Target SDK Version for Updatable app",
3945 enforceDefaultTargetSdkVersion: false,
3946 expectedError: "Updatable apps must enforce default target sdk version",
3947 targetSdkVersionInBp: "29",
3948 targetSdkVersionExpected: "29",
3949 updatable: true,
3950 },
3951 }
3952 for _, testCase := range testCases {
3953 errExpected := testCase.expectedError != ""
3954 bp := fmt.Sprintf(`
3955 android_app {
3956 name: "foo",
3957 enforce_default_target_sdk_version: %t,
3958 sdk_version: "current",
3959 min_sdk_version: "29",
3960 target_sdk_version: "%v",
3961 updatable: %t
3962 }
3963 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp, testCase.updatable)
3964
3965 fixture := android.GroupFixturePreparers(
3966 PrepareForTestWithJavaDefaultModules,
3967 android.PrepareForTestWithAllowMissingDependencies,
3968 android.PrepareForTestWithAndroidMk,
3969 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3970 // explicitly set following platform variables to make the test deterministic
3971 variables.Platform_sdk_final = &testCase.platform_sdk_final
3972 variables.Platform_sdk_version = &platform_sdk_version
3973 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00003974 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +00003975 variables.Unbundled_build_apps = []string{"sampleModule"}
3976 }),
3977 )
3978
3979 errorHandler := android.FixtureExpectsNoErrors
3980 if errExpected {
3981 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
3982 }
3983 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
3984
3985 if !errExpected {
3986 foo := result.ModuleForTests("foo", "android_common")
3987 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
3988 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
3989 }
3990 }
3991}
3992
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00003993func TestEnforceDefaultAppTargetSdkVersionFlagForTests(t *testing.T) {
3994 platform_sdk_codename := "Tiramisu"
3995 platform_sdk_version := 33
3996 testCases := []struct {
3997 name string
3998 enforceDefaultTargetSdkVersion bool
3999 expectedError string
4000 platform_sdk_final bool
4001 targetSdkVersionInBp string
4002 targetSdkVersionExpected string
4003 }{
4004 {
4005 name: "Not enforcing Target SDK Version: Android.bp has older targetSdkVersion",
4006 enforceDefaultTargetSdkVersion: false,
4007 targetSdkVersionInBp: "29",
4008 targetSdkVersionExpected: "29",
4009 },
4010 {
4011 name: "[SDK finalised] Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4012 enforceDefaultTargetSdkVersion: true,
4013 platform_sdk_final: true,
4014 targetSdkVersionInBp: "current",
4015 targetSdkVersionExpected: "33",
4016 },
4017 {
4018 name: "Enforce Target SDK Version: Android.bp has current targetSdkVersion",
4019 enforceDefaultTargetSdkVersion: true,
4020 platform_sdk_final: false,
4021 targetSdkVersionInBp: "current",
4022 targetSdkVersionExpected: "10000",
4023 },
4024 }
4025 for _, testCase := range testCases {
4026 errExpected := testCase.expectedError != ""
4027 bp := fmt.Sprintf(`
4028 android_test {
4029 name: "foo",
4030 enforce_default_target_sdk_version: %t,
4031 min_sdk_version: "29",
4032 target_sdk_version: "%v",
4033 }
4034 `, testCase.enforceDefaultTargetSdkVersion, testCase.targetSdkVersionInBp)
4035
4036 fixture := android.GroupFixturePreparers(
4037 PrepareForTestWithJavaDefaultModules,
4038 android.PrepareForTestWithAllowMissingDependencies,
4039 android.PrepareForTestWithAndroidMk,
4040 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4041 // explicitly set following platform variables to make the test deterministic
4042 variables.Platform_sdk_final = &testCase.platform_sdk_final
4043 variables.Platform_sdk_version = &platform_sdk_version
4044 variables.Platform_sdk_codename = &platform_sdk_codename
Harshit Mahajan18845d02023-01-11 18:39:12 +00004045 variables.Unbundled_build = proptools.BoolPtr(true)
Harshit Mahajan8f202ad2023-01-09 20:45:55 +00004046 variables.Unbundled_build_apps = []string{"sampleModule"}
4047 }),
4048 )
4049
4050 errorHandler := android.FixtureExpectsNoErrors
4051 if errExpected {
4052 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.expectedError)
4053 }
4054 result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp)
4055
4056 if !errExpected {
4057 foo := result.ModuleForTests("foo", "android_common")
4058 manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4059 android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4060 }
4061 }
4062}
4063
Colin Cross412436f2022-04-07 17:40:07 -07004064func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) {
4065 result := android.GroupFixturePreparers(
4066 PrepareForTestWithJavaDefaultModules,
4067 android.PrepareForTestWithAllowMissingDependencies,
4068 android.PrepareForTestWithAndroidMk,
4069 ).RunTestWithBp(t, `
4070 android_app {
4071 name: "foo",
4072 srcs: ["a.java"],
4073 certificate: ":missing_certificate",
4074 sdk_version: "current",
Zyan Wub7550aa2023-05-18 15:46:31 +08004075 }
4076
4077 android_app {
4078 name: "bar",
4079 srcs: ["a.java"],
4080 certificate: ":missing_certificate",
4081 product_specific: true,
4082 sdk_version: "current",
Colin Cross412436f2022-04-07 17:40:07 -07004083 }`)
4084
4085 foo := result.ModuleForTests("foo", "android_common")
4086 fooApk := foo.Output("foo.apk")
4087 if fooApk.Rule != android.ErrorRule {
4088 t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String())
4089 }
4090 android.AssertStringDoesContain(t, "expected error rule message", fooApk.Args["error"], "missing dependencies: missing_certificate\n")
4091}
Sam Delmerico82602492022-06-10 17:05:42 +00004092
4093func TestAppIncludesJniPackages(t *testing.T) {
4094 ctx := android.GroupFixturePreparers(
4095 PrepareForTestWithJavaDefaultModules,
4096 ).RunTestWithBp(t, `
4097 android_library_import {
4098 name: "aary-nodeps",
4099 aars: ["aary.aar"],
4100 extract_jni: true,
4101 }
4102
4103 android_library {
4104 name: "aary-lib",
4105 sdk_version: "current",
4106 min_sdk_version: "21",
4107 static_libs: ["aary-nodeps"],
4108 }
4109
4110 android_app {
4111 name: "aary-lib-dep",
4112 sdk_version: "current",
4113 min_sdk_version: "21",
4114 manifest: "AndroidManifest.xml",
4115 static_libs: ["aary-lib"],
4116 use_embedded_native_libs: true,
4117 }
4118
4119 android_app {
4120 name: "aary-import-dep",
4121 sdk_version: "current",
4122 min_sdk_version: "21",
4123 manifest: "AndroidManifest.xml",
4124 static_libs: ["aary-nodeps"],
4125 use_embedded_native_libs: true,
4126 }
4127
4128 android_app {
4129 name: "aary-no-use-embedded",
4130 sdk_version: "current",
4131 min_sdk_version: "21",
4132 manifest: "AndroidManifest.xml",
4133 static_libs: ["aary-nodeps"],
4134 }`)
4135
4136 testCases := []struct {
4137 name string
4138 hasPackage bool
4139 }{
4140 {
4141 name: "aary-import-dep",
4142 hasPackage: true,
4143 },
4144 {
4145 name: "aary-lib-dep",
4146 hasPackage: true,
4147 },
4148 {
4149 name: "aary-no-use-embedded",
Jiyong Park20df11e2024-05-08 09:54:22 +00004150 hasPackage: true,
Sam Delmerico82602492022-06-10 17:05:42 +00004151 },
4152 }
4153
4154 for _, tc := range testCases {
4155 t.Run(tc.name, func(t *testing.T) {
4156 app := ctx.ModuleForTests(tc.name, "android_common")
4157
4158 outputFile := "jnilibs.zip"
4159 jniOutputLibZip := app.MaybeOutput(outputFile)
4160 if jniOutputLibZip.Rule == nil && !tc.hasPackage {
4161 return
4162 }
4163
4164 jniPackage := "arm64-v8a_jni.zip"
4165 inputs := jniOutputLibZip.Inputs
4166 foundPackage := false
4167 for i := 0; i < len(inputs); i++ {
4168 if strings.Contains(inputs[i].String(), jniPackage) {
4169 foundPackage = true
4170 }
4171 }
4172 if foundPackage != tc.hasPackage {
4173 t.Errorf("expected to find %v in %v inputs; inputs = %v", jniPackage, outputFile, inputs)
4174 }
4175 })
4176 }
4177}
Spandan Das9f7ae7f2022-07-25 00:34:18 +00004178
4179func TestTargetSdkVersionMtsTests(t *testing.T) {
4180 platformSdkCodename := "Tiramisu"
4181 android_test := "android_test"
4182 android_test_helper_app := "android_test_helper_app"
4183 bpTemplate := `
4184 %v {
4185 name: "mytest",
4186 target_sdk_version: "%v",
4187 test_suites: ["othersuite", "%v"],
4188 }
4189 `
4190 testCases := []struct {
4191 desc string
4192 moduleType string
4193 targetSdkVersionInBp string
4194 targetSdkVersionExpected string
4195 testSuites string
4196 }{
4197 {
4198 desc: "Non-MTS android_test_apps targeting current should not be upgraded to 10000",
4199 moduleType: android_test,
4200 targetSdkVersionInBp: "current",
4201 targetSdkVersionExpected: platformSdkCodename,
4202 testSuites: "non-mts-suite",
4203 },
4204 {
4205 desc: "MTS android_test_apps targeting released sdks should not be upgraded to 10000",
4206 moduleType: android_test,
4207 targetSdkVersionInBp: "29",
4208 targetSdkVersionExpected: "29",
4209 testSuites: "mts-suite",
4210 },
4211 {
4212 desc: "MTS android_test_apps targeting current should be upgraded to 10000",
4213 moduleType: android_test,
4214 targetSdkVersionInBp: "current",
4215 targetSdkVersionExpected: "10000",
4216 testSuites: "mts-suite",
4217 },
4218 {
4219 desc: "MTS android_test_helper_apps targeting current should be upgraded to 10000",
4220 moduleType: android_test_helper_app,
4221 targetSdkVersionInBp: "current",
4222 targetSdkVersionExpected: "10000",
4223 testSuites: "mts-suite",
4224 },
4225 }
4226 fixture := android.GroupFixturePreparers(
4227 prepareForJavaTest,
4228 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4229 variables.Platform_sdk_codename = &platformSdkCodename
4230 variables.Platform_version_active_codenames = []string{platformSdkCodename}
4231 }),
4232 )
4233 for _, testCase := range testCases {
4234 result := fixture.RunTestWithBp(t, fmt.Sprintf(bpTemplate, testCase.moduleType, testCase.targetSdkVersionInBp, testCase.testSuites))
4235 mytest := result.ModuleForTests("mytest", "android_common")
4236 manifestFixerArgs := mytest.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
4237 android.AssertStringDoesContain(t, testCase.desc, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected)
4238 }
4239}
Andrei Onea580636b2022-08-17 16:53:46 +00004240
4241func TestPrivappAllowlist(t *testing.T) {
4242 testJavaError(t, "privileged must be set in order to use privapp_allowlist", `
4243 android_app {
4244 name: "foo",
4245 srcs: ["a.java"],
4246 privapp_allowlist: "perms.xml",
4247 }
4248 `)
4249
4250 result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(
4251 t,
4252 `
4253 android_app {
4254 name: "foo",
4255 srcs: ["a.java"],
Sam Delmerico15809f82023-05-15 17:21:47 -04004256 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
Andrei Onea580636b2022-08-17 16:53:46 +00004257 privileged: true,
Andrei Onea580636b2022-08-17 16:53:46 +00004258 sdk_version: "current",
4259 }
4260 override_android_app {
4261 name: "bar",
4262 base: "foo",
4263 package_name: "com.google.android.foo",
4264 }
4265 `,
4266 )
4267 app := result.ModuleForTests("foo", "android_common")
4268 overrideApp := result.ModuleForTests("foo", "android_common_bar")
4269
Sam Delmerico15809f82023-05-15 17:21:47 -04004270 // verify that privapp allowlist is created for override apps
Andrei Onea580636b2022-08-17 16:53:46 +00004271 overrideApp.Output("out/soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml")
Sam Delmerico15809f82023-05-15 17:21:47 -04004272 expectedAllowlistInput := "privapp_allowlist_com.android.foo.xml"
4273 overrideActualAllowlistInput := overrideApp.Rule("modifyAllowlist").Input.String()
4274 if expectedAllowlistInput != overrideActualAllowlistInput {
4275 t.Errorf("expected override allowlist to be %q; got %q", expectedAllowlistInput, overrideActualAllowlistInput)
Andrei Onea580636b2022-08-17 16:53:46 +00004276 }
4277
4278 // verify that permissions are copied to device
Anton Hansson0e486a42023-06-01 16:38:35 +00004279 app.Output("out/soong/target/product/test_device/system/etc/permissions/foo.xml")
4280 overrideApp.Output("out/soong/target/product/test_device/system/etc/permissions/bar.xml")
Andrei Onea580636b2022-08-17 16:53:46 +00004281}
Sam Delmericob1daccd2023-05-25 14:45:30 -04004282
4283func TestPrivappAllowlistAndroidMk(t *testing.T) {
4284 result := android.GroupFixturePreparers(
4285 PrepareForTestWithJavaDefaultModules,
4286 android.PrepareForTestWithAndroidMk,
4287 ).RunTestWithBp(
4288 t,
4289 `
4290 android_app {
4291 name: "foo",
4292 srcs: ["a.java"],
4293 privapp_allowlist: "privapp_allowlist_com.android.foo.xml",
4294 privileged: true,
4295 sdk_version: "current",
4296 }
4297 override_android_app {
4298 name: "bar",
4299 base: "foo",
4300 package_name: "com.google.android.foo",
4301 }
4302 `,
4303 )
4304 baseApp := result.ModuleForTests("foo", "android_common")
4305 overrideApp := result.ModuleForTests("foo", "android_common_bar")
4306
4307 baseAndroidApp := baseApp.Module().(*AndroidApp)
4308 baseEntries := android.AndroidMkEntriesForTest(t, result.TestContext, baseAndroidApp)[0]
4309 android.AssertStringMatches(
4310 t,
4311 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find foo.apk",
4312 baseEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4313 "\\S+foo.apk",
4314 )
4315 android.AssertStringMatches(
4316 t,
4317 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include foo.apk",
4318 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4319 "\\S+foo.apk",
4320 )
4321 android.AssertStringMatches(
4322 t,
4323 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4324 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4325 "\\S+foo.apk:\\S+/target/product/test_device/system/priv-app/foo/foo.apk",
4326 )
4327 android.AssertStringMatches(
4328 t,
4329 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4330 baseEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004331 "privapp_allowlist_com.android.foo.xml:\\S+/target/product/test_device/system/etc/permissions/foo.xml",
Sam Delmericob1daccd2023-05-25 14:45:30 -04004332 )
4333
4334 overrideAndroidApp := overrideApp.Module().(*AndroidApp)
4335 overrideEntries := android.AndroidMkEntriesForTest(t, result.TestContext, overrideAndroidApp)[0]
4336 android.AssertStringMatches(
4337 t,
4338 "androidmk has incorrect LOCAL_SOONG_INSTALLED_MODULE; expected to find bar.apk",
4339 overrideEntries.EntryMap["LOCAL_SOONG_INSTALLED_MODULE"][0],
4340 "\\S+bar.apk",
4341 )
4342 android.AssertStringMatches(
4343 t,
4344 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include bar.apk",
4345 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4346 "\\S+bar.apk",
4347 )
4348 android.AssertStringMatches(
4349 t,
4350 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include app",
4351 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
4352 "\\S+bar.apk:\\S+/target/product/test_device/system/priv-app/bar/bar.apk",
4353 )
4354 android.AssertStringMatches(
4355 t,
4356 "androidmk has incorrect LOCAL_SOONG_INSTALL_PAIRS; expected to it to include privapp_allowlist",
4357 overrideEntries.EntryMap["LOCAL_SOONG_INSTALL_PAIRS"][0],
Anton Hansson0e486a42023-06-01 16:38:35 +00004358 "\\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 -04004359 )
4360}
Sam Delmerico0e0d96e2023-08-18 22:43:28 +00004361
4362func TestApexGlobalMinSdkVersionOverride(t *testing.T) {
4363 result := android.GroupFixturePreparers(
4364 PrepareForTestWithJavaDefaultModules,
4365 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4366 variables.ApexGlobalMinSdkVersionOverride = proptools.StringPtr("Tiramisu")
4367 }),
4368 ).RunTestWithBp(t, `
4369 android_app {
4370 name: "com.android.bar",
4371 srcs: ["a.java"],
4372 sdk_version: "current",
4373 }
4374 android_app {
4375 name: "com.android.foo",
4376 srcs: ["a.java"],
4377 sdk_version: "current",
4378 min_sdk_version: "S",
4379 updatable: true,
4380 }
4381 override_android_app {
4382 name: "com.android.go.foo",
4383 base: "com.android.foo",
4384 }
4385 `)
4386 foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
4387 fooOverride := result.ModuleForTests("com.android.foo", "android_common_com.android.go.foo").Rule("manifestFixer")
4388 bar := result.ModuleForTests("com.android.bar", "android_common").Rule("manifestFixer")
4389
4390 android.AssertStringDoesContain(t,
4391 "expected manifest fixer to set com.android.bar minSdkVersion to S",
4392 bar.BuildParams.Args["args"],
4393 "--minSdkVersion S",
4394 )
4395 android.AssertStringDoesContain(t,
4396 "com.android.foo: expected manifest fixer to set minSdkVersion to T",
4397 foo.BuildParams.Args["args"],
4398 "--minSdkVersion T",
4399 )
4400 android.AssertStringDoesContain(t,
4401 "com.android.go.foo: expected manifest fixer to set minSdkVersion to T",
4402 fooOverride.BuildParams.Args["args"],
4403 "--minSdkVersion T",
4404 )
4405
4406}
Jihoon Kang84b25892023-12-01 22:01:06 +00004407
4408func TestAppFlagsPackages(t *testing.T) {
4409 ctx := testApp(t, `
4410 android_app {
4411 name: "foo",
4412 srcs: ["a.java"],
4413 sdk_version: "current",
4414 flags_packages: [
4415 "bar",
4416 "baz",
4417 ],
4418 }
4419 aconfig_declarations {
4420 name: "bar",
Dennis Shen4e7773d2024-01-05 19:06:50 +00004421 package: "com.example.package.bar",
Yu Liu315a53c2024-04-24 16:41:57 +00004422 container: "com.android.foo",
Jihoon Kang84b25892023-12-01 22:01:06 +00004423 srcs: [
4424 "bar.aconfig",
4425 ],
4426 }
4427 aconfig_declarations {
4428 name: "baz",
Dennis Shen4e7773d2024-01-05 19:06:50 +00004429 package: "com.example.package.baz",
Yu Liu315a53c2024-04-24 16:41:57 +00004430 container: "com.android.foo",
Jihoon Kang84b25892023-12-01 22:01:06 +00004431 srcs: [
4432 "baz.aconfig",
4433 ],
4434 }
4435 `)
4436
4437 foo := ctx.ModuleForTests("foo", "android_common")
4438
4439 // android_app module depends on aconfig_declarations listed in flags_packages
4440 android.AssertBoolEquals(t, "foo expected to depend on bar", true,
4441 CheckModuleHasDependency(t, ctx, "foo", "android_common", "bar"))
4442
4443 android.AssertBoolEquals(t, "foo expected to depend on baz", true,
4444 CheckModuleHasDependency(t, ctx, "foo", "android_common", "baz"))
4445
4446 aapt2LinkRule := foo.Rule("android/soong/java.aapt2Link")
4447 linkInFlags := aapt2LinkRule.Args["inFlags"]
4448 android.AssertStringDoesContain(t,
4449 "aapt2 link command expected to pass feature flags arguments",
4450 linkInFlags,
4451 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
4452 )
4453}
Spandan Das0727ba72024-02-13 16:37:43 +00004454
4455// Test that dexpreopt is disabled if an optional_uses_libs exists, but does not provide an implementation.
4456func TestNoDexpreoptOptionalUsesLibDoesNotHaveImpl(t *testing.T) {
4457 bp := `
4458 java_sdk_library_import {
4459 name: "sdklib_noimpl",
4460 public: {
4461 jars: ["stub.jar"],
4462 },
4463 }
4464 android_app {
4465 name: "app",
4466 srcs: ["a.java"],
4467 sdk_version: "current",
4468 optional_uses_libs: [
4469 "sdklib_noimpl",
4470 ],
4471 }
4472 `
4473 result := prepareForJavaTest.RunTestWithBp(t, bp)
4474 dexpreopt := result.ModuleForTests("app", "android_common").MaybeRule("dexpreopt").Rule
4475 android.AssertBoolEquals(t, "dexpreopt should be disabled if optional_uses_libs does not have an implementation", true, dexpreopt == nil)
4476}
yangbill2af0b6e2024-03-15 09:29:29 +00004477
Ronald Braunsteincdc66f42024-04-12 11:23:19 -07004478func TestTestOnlyApp(t *testing.T) {
4479 t.Parallel()
4480 ctx := android.GroupFixturePreparers(
4481 prepareForJavaTest,
4482 ).RunTestWithBp(t, `
4483 // These should be test-only
4484 android_test {
4485 name: "android-test",
4486 }
4487 android_test_helper_app {
4488 name: "helper-app",
4489 }
4490 override_android_test {
4491 name: "override-test",
4492 base: "android-app",
4493 }
4494 // And these should not be
4495 android_app {
4496 name: "android-app",
4497 srcs: ["b.java"],
4498 sdk_version: "current",
4499 }
4500 `)
4501
4502 expectedTestOnly := []string{
4503 "android-test",
4504 "helper-app",
4505 "override-test",
4506 }
4507
4508 expectedTopLevel := []string{
4509 "android-test",
4510 "override-test",
4511 }
4512
4513 assertTestOnlyAndTopLevel(t, ctx, expectedTestOnly, expectedTopLevel)
4514}
4515
yangbill2af0b6e2024-03-15 09:29:29 +00004516func TestAppStem(t *testing.T) {
4517 ctx := testApp(t, `
4518 android_app {
4519 name: "foo",
4520 srcs: ["a.java"],
4521 stem: "foo-new",
4522 sdk_version: "current",
4523 }`)
4524
4525 foo := ctx.ModuleForTests("foo", "android_common")
4526
4527 outputs := fmt.Sprint(foo.AllOutputs())
4528 if !strings.Contains(outputs, "foo-new.apk") {
4529 t.Errorf("Module output does not contain expected apk %s", "foo-new.apk")
4530 }
4531}