blob: 53a0d71fd482822739744e3f4d82d628d0be3b92 [file] [log] [blame]
Colin Cross638149e2019-01-05 22:12:12 -08001// Copyright 2018 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 (
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +010018 "fmt"
Colin Cross0c66bc62021-07-20 09:47:41 -070019 "runtime"
Jiakai Zhang519c5c82021-09-16 06:15:39 +000020 "strings"
Colin Cross638149e2019-01-05 22:12:12 -080021 "testing"
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +010022
23 "android/soong/android"
24 "android/soong/cc"
25 "android/soong/dexpreopt"
Colin Cross638149e2019-01-05 22:12:12 -080026)
27
Jiakai Zhang519c5c82021-09-16 06:15:39 +000028func init() {
29 RegisterFakeRuntimeApexMutator()
30}
31
Colin Cross638149e2019-01-05 22:12:12 -080032func TestDexpreoptEnabled(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -080033 t.Parallel()
Colin Cross638149e2019-01-05 22:12:12 -080034 tests := []struct {
Jiakai Zhang519c5c82021-09-16 06:15:39 +000035 name string
36 bp string
37 moduleName string
38 apexVariant bool
39 enabled bool
Colin Cross638149e2019-01-05 22:12:12 -080040 }{
41 {
42 name: "app",
43 bp: `
44 android_app {
45 name: "foo",
46 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090047 sdk_version: "current",
Colin Cross638149e2019-01-05 22:12:12 -080048 }`,
49 enabled: true,
50 },
51 {
52 name: "installable java library",
53 bp: `
54 java_library {
55 name: "foo",
56 installable: true,
57 srcs: ["a.java"],
Jihoon Kang85bc1932024-07-01 17:04:46 +000058 sdk_version: "current",
Colin Cross638149e2019-01-05 22:12:12 -080059 }`,
60 enabled: true,
61 },
62 {
63 name: "java binary",
64 bp: `
65 java_binary {
66 name: "foo",
67 srcs: ["a.java"],
Zi Wangca65b402022-10-10 13:45:06 -070068 main_class: "foo.bar.jb",
Colin Cross638149e2019-01-05 22:12:12 -080069 }`,
70 enabled: true,
71 },
Colin Cross638149e2019-01-05 22:12:12 -080072 {
73 name: "app without sources",
74 bp: `
75 android_app {
76 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +090077 sdk_version: "current",
Colin Cross638149e2019-01-05 22:12:12 -080078 }`,
Jaewoong Junga24af3b2019-05-13 09:23:20 -070079 enabled: false,
80 },
81 {
82 name: "app with libraries",
83 bp: `
84 android_app {
85 name: "foo",
86 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090087 sdk_version: "current",
Jaewoong Junga24af3b2019-05-13 09:23:20 -070088 }
89
90 java_library {
91 name: "lib",
92 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090093 sdk_version: "current",
Jaewoong Junga24af3b2019-05-13 09:23:20 -070094 }`,
Colin Cross638149e2019-01-05 22:12:12 -080095 enabled: true,
96 },
97 {
98 name: "installable java library without sources",
99 bp: `
100 java_library {
101 name: "foo",
102 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +0000103 sdk_version: "current",
Colin Cross638149e2019-01-05 22:12:12 -0800104 }`,
Jaewoong Junga24af3b2019-05-13 09:23:20 -0700105 enabled: false,
Colin Cross638149e2019-01-05 22:12:12 -0800106 },
Colin Cross638149e2019-01-05 22:12:12 -0800107 {
108 name: "static java library",
109 bp: `
110 java_library {
111 name: "foo",
112 srcs: ["a.java"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000113 sdk_version: "current",
Colin Cross638149e2019-01-05 22:12:12 -0800114 }`,
115 enabled: false,
116 },
117 {
Colin Crosse3026872019-01-05 22:30:13 -0800118 name: "java test",
119 bp: `
120 java_test {
121 name: "foo",
122 srcs: ["a.java"],
123 }`,
124 enabled: false,
125 },
126 {
Colin Cross638149e2019-01-05 22:12:12 -0800127 name: "android test",
128 bp: `
129 android_test {
130 name: "foo",
131 srcs: ["a.java"],
132 }`,
133 enabled: false,
134 },
135 {
136 name: "android test helper app",
137 bp: `
138 android_test_helper_app {
139 name: "foo",
140 srcs: ["a.java"],
141 }`,
142 enabled: false,
143 },
Colin Crossdc2da912019-01-05 22:13:05 -0800144 {
145 name: "compile_dex",
146 bp: `
147 java_library {
148 name: "foo",
149 srcs: ["a.java"],
150 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +0000151 sdk_version: "current",
Colin Crossdc2da912019-01-05 22:13:05 -0800152 }`,
153 enabled: false,
154 },
Colin Cross42be7612019-02-21 18:12:14 -0800155 {
156 name: "dex_import",
157 bp: `
158 dex_import {
159 name: "foo",
160 jars: ["a.jar"],
161 }`,
162 enabled: true,
163 },
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000164 {
165 name: "apex variant",
166 bp: `
167 java_library {
168 name: "foo",
169 installable: true,
170 srcs: ["a.java"],
171 apex_available: ["com.android.apex1"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000172 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000173 }`,
174 apexVariant: true,
175 enabled: false,
176 },
177 {
178 name: "apex variant of apex system server jar",
179 bp: `
180 java_library {
181 name: "service-foo",
182 installable: true,
183 srcs: ["a.java"],
184 apex_available: ["com.android.apex1"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000185 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000186 }`,
187 moduleName: "service-foo",
188 apexVariant: true,
189 enabled: true,
190 },
191 {
192 name: "apex variant of prebuilt apex system server jar",
193 bp: `
194 java_library {
195 name: "prebuilt_service-foo",
196 installable: true,
197 srcs: ["a.java"],
198 apex_available: ["com.android.apex1"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000199 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000200 }`,
201 moduleName: "prebuilt_service-foo",
202 apexVariant: true,
203 enabled: true,
204 },
205 {
206 name: "platform variant of apex system server jar",
207 bp: `
208 java_library {
209 name: "service-foo",
210 installable: true,
211 srcs: ["a.java"],
212 apex_available: ["com.android.apex1"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000213 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000214 }`,
215 moduleName: "service-foo",
216 apexVariant: false,
217 enabled: false,
218 },
Colin Cross638149e2019-01-05 22:12:12 -0800219 }
220
221 for _, test := range tests {
222 t.Run(test.name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800223 t.Parallel()
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000224 preparers := android.GroupFixturePreparers(
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100225 PrepareForTestWithDexpreopt,
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000226 PrepareForTestWithFakeApexMutator,
227 dexpreopt.FixtureSetApexSystemServerJars("com.android.apex1:service-foo"),
228 )
Colin Cross638149e2019-01-05 22:12:12 -0800229
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000230 result := preparers.RunTestWithBp(t, test.bp)
231 ctx := result.TestContext
232
233 moduleName := "foo"
234 if test.moduleName != "" {
235 moduleName = test.moduleName
236 }
237
238 variant := "android_common"
239 if test.apexVariant {
240 variant += "_apex1000"
241 }
242
243 dexpreopt := ctx.ModuleForTests(moduleName, variant).MaybeRule("dexpreopt")
Colin Cross638149e2019-01-05 22:12:12 -0800244 enabled := dexpreopt.Rule != nil
245
246 if enabled != test.enabled {
247 t.Fatalf("want dexpreopt %s, got %s", enabledString(test.enabled), enabledString(enabled))
248 }
249 })
250
251 }
252}
253
254func enabledString(enabled bool) string {
255 if enabled {
256 return "enabled"
257 } else {
258 return "disabled"
259 }
260}
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +0100261
262func TestDex2oatToolDeps(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800263 t.Parallel()
Colin Cross0c66bc62021-07-20 09:47:41 -0700264 if runtime.GOOS != "linux" {
Martin Stjernholm1b784a72021-05-20 15:24:34 +0100265 // The host binary paths checked below are build OS dependent.
Colin Cross0c66bc62021-07-20 09:47:41 -0700266 t.Skipf("Unsupported build OS %s", runtime.GOOS)
Martin Stjernholm1b784a72021-05-20 15:24:34 +0100267 }
268
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +0100269 preparers := android.GroupFixturePreparers(
270 cc.PrepareForTestWithCcDefaultModules,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100271 PrepareForTestWithDexpreoptWithoutFakeDex2oatd,
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +0100272 dexpreopt.PrepareForTestByEnablingDexpreopt)
273
274 testDex2oatToolDep := func(sourceEnabled, prebuiltEnabled, prebuiltPreferred bool,
275 expectedDex2oatPath string) {
276 name := fmt.Sprintf("sourceEnabled:%t,prebuiltEnabled:%t,prebuiltPreferred:%t",
277 sourceEnabled, prebuiltEnabled, prebuiltPreferred)
278 t.Run(name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800279 t.Parallel()
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +0100280 result := preparers.RunTestWithBp(t, fmt.Sprintf(`
281 cc_binary {
282 name: "dex2oatd",
283 enabled: %t,
284 host_supported: true,
285 }
286 cc_prebuilt_binary {
287 name: "dex2oatd",
288 enabled: %t,
289 prefer: %t,
290 host_supported: true,
291 srcs: ["x86_64/bin/dex2oatd"],
292 }
293 java_library {
294 name: "myjavalib",
295 }
296 `, sourceEnabled, prebuiltEnabled, prebuiltPreferred))
297 pathContext := android.PathContextForTesting(result.Config)
298 dex2oatPath := dexpreopt.GetCachedGlobalSoongConfig(pathContext).Dex2oat
299 android.AssertStringEquals(t, "Testing "+name, expectedDex2oatPath, android.NormalizePathForTesting(dex2oatPath))
300 })
301 }
302
Cole Faust6b7075f2024-12-17 10:42:42 -0800303 sourceDex2oatPath := "../host/linux-x86/bin/dex2oatd"
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +0100304 prebuiltDex2oatPath := ".intermediates/prebuilt_dex2oatd/linux_glibc_x86_64/dex2oatd"
305
306 testDex2oatToolDep(true, false, false, sourceDex2oatPath)
307 testDex2oatToolDep(true, true, false, sourceDex2oatPath)
308 testDex2oatToolDep(true, true, true, prebuiltDex2oatPath)
309 testDex2oatToolDep(false, true, false, prebuiltDex2oatPath)
310}
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000311
312func TestDexpreoptBuiltInstalledForApex(t *testing.T) {
313 preparers := android.GroupFixturePreparers(
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100314 PrepareForTestWithDexpreopt,
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000315 PrepareForTestWithFakeApexMutator,
316 dexpreopt.FixtureSetApexSystemServerJars("com.android.apex1:service-foo"),
317 )
318
319 // An APEX system server jar.
320 result := preparers.RunTestWithBp(t, `
321 java_library {
322 name: "service-foo",
323 installable: true,
324 srcs: ["a.java"],
325 apex_available: ["com.android.apex1"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000326 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000327 }`)
328 ctx := result.TestContext
329 module := ctx.ModuleForTests("service-foo", "android_common_apex1000")
330 library := module.Module().(*Library)
331
332 installs := library.dexpreopter.DexpreoptBuiltInstalledForApex()
333
334 android.AssertIntEquals(t, "install count", 2, len(installs))
335
336 android.AssertStringEquals(t, "installs[0] FullModuleName",
337 "service-foo-dexpreopt-arm64-apex@com.android.apex1@javalib@service-foo.jar@classes.odex",
338 installs[0].FullModuleName())
339
340 android.AssertStringEquals(t, "installs[0] SubModuleName",
341 "-dexpreopt-arm64-apex@com.android.apex1@javalib@service-foo.jar@classes.odex",
342 installs[0].SubModuleName())
343
344 android.AssertStringEquals(t, "installs[1] FullModuleName",
345 "service-foo-dexpreopt-arm64-apex@com.android.apex1@javalib@service-foo.jar@classes.vdex",
346 installs[1].FullModuleName())
347
348 android.AssertStringEquals(t, "installs[1] SubModuleName",
349 "-dexpreopt-arm64-apex@com.android.apex1@javalib@service-foo.jar@classes.vdex",
350 installs[1].SubModuleName())
351
352 // Not an APEX system server jar.
353 result = preparers.RunTestWithBp(t, `
354 java_library {
355 name: "foo",
356 installable: true,
357 srcs: ["a.java"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000358 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000359 }`)
360 ctx = result.TestContext
361 module = ctx.ModuleForTests("foo", "android_common")
362 library = module.Module().(*Library)
363
364 installs = library.dexpreopter.DexpreoptBuiltInstalledForApex()
365
366 android.AssertIntEquals(t, "install count", 0, len(installs))
367}
368
369func filterDexpreoptEntriesList(entriesList []android.AndroidMkEntries) []android.AndroidMkEntries {
370 var results []android.AndroidMkEntries
371 for _, entries := range entriesList {
372 if strings.Contains(entries.EntryMap["LOCAL_MODULE"][0], "-dexpreopt-") {
373 results = append(results, entries)
374 }
375 }
376 return results
377}
378
379func verifyEntries(t *testing.T, message string, expectedModule string,
380 expectedPrebuiltModuleFile string, expectedModulePath string, expectedInstalledModuleStem string,
381 entries android.AndroidMkEntries) {
382 android.AssertStringEquals(t, message+" LOCAL_MODULE", expectedModule,
383 entries.EntryMap["LOCAL_MODULE"][0])
384
385 android.AssertStringEquals(t, message+" LOCAL_MODULE_CLASS", "ETC",
386 entries.EntryMap["LOCAL_MODULE_CLASS"][0])
387
388 android.AssertStringDoesContain(t, message+" LOCAL_PREBUILT_MODULE_FILE",
389 entries.EntryMap["LOCAL_PREBUILT_MODULE_FILE"][0], expectedPrebuiltModuleFile)
390
391 android.AssertStringDoesContain(t, message+" LOCAL_MODULE_PATH",
392 entries.EntryMap["LOCAL_MODULE_PATH"][0], expectedModulePath)
393
394 android.AssertStringEquals(t, message+" LOCAL_INSTALLED_MODULE_STEM",
395 expectedInstalledModuleStem, entries.EntryMap["LOCAL_INSTALLED_MODULE_STEM"][0])
396
397 android.AssertStringEquals(t, message+" LOCAL_NOT_AVAILABLE_FOR_PLATFORM",
398 "false", entries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"][0])
399}
400
401func TestAndroidMkEntriesForApex(t *testing.T) {
402 preparers := android.GroupFixturePreparers(
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100403 PrepareForTestWithDexpreopt,
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000404 PrepareForTestWithFakeApexMutator,
405 dexpreopt.FixtureSetApexSystemServerJars("com.android.apex1:service-foo"),
406 )
407
408 // An APEX system server jar.
409 result := preparers.RunTestWithBp(t, `
410 java_library {
411 name: "service-foo",
412 installable: true,
413 srcs: ["a.java"],
414 apex_available: ["com.android.apex1"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000415 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000416 }`)
417 ctx := result.TestContext
418 module := ctx.ModuleForTests("service-foo", "android_common_apex1000")
419
420 entriesList := android.AndroidMkEntriesForTest(t, ctx, module.Module())
421 entriesList = filterDexpreoptEntriesList(entriesList)
422
423 android.AssertIntEquals(t, "entries count", 2, len(entriesList))
424
425 verifyEntries(t,
426 "entriesList[0]",
427 "service-foo-dexpreopt-arm64-apex@com.android.apex1@javalib@service-foo.jar@classes.odex",
Spandan Das2069c3f2023-12-06 19:40:24 +0000428 "/dexpreopt/service-foo/oat/arm64/javalib.odex",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000429 "/system/framework/oat/arm64",
430 "apex@com.android.apex1@javalib@service-foo.jar@classes.odex",
431 entriesList[0])
432
433 verifyEntries(t,
434 "entriesList[1]",
435 "service-foo-dexpreopt-arm64-apex@com.android.apex1@javalib@service-foo.jar@classes.vdex",
Spandan Das2069c3f2023-12-06 19:40:24 +0000436 "/dexpreopt/service-foo/oat/arm64/javalib.vdex",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000437 "/system/framework/oat/arm64",
438 "apex@com.android.apex1@javalib@service-foo.jar@classes.vdex",
439 entriesList[1])
440
441 // Not an APEX system server jar.
442 result = preparers.RunTestWithBp(t, `
443 java_library {
444 name: "foo",
445 installable: true,
446 srcs: ["a.java"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000447 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000448 }`)
449 ctx = result.TestContext
450 module = ctx.ModuleForTests("foo", "android_common")
451
452 entriesList = android.AndroidMkEntriesForTest(t, ctx, module.Module())
453 entriesList = filterDexpreoptEntriesList(entriesList)
454
455 android.AssertIntEquals(t, "entries count", 0, len(entriesList))
456}
Jiakai Zhangcf61e3c2023-05-08 16:28:38 +0000457
458func TestGenerateProfileEvenIfDexpreoptIsDisabled(t *testing.T) {
459 preparers := android.GroupFixturePreparers(
460 PrepareForTestWithJavaDefaultModules,
461 PrepareForTestWithFakeApexMutator,
462 dexpreopt.FixtureDisableDexpreopt(true),
463 )
464
465 result := preparers.RunTestWithBp(t, `
466 java_library {
467 name: "foo",
468 installable: true,
469 dex_preopt: {
470 profile: "art-profile",
471 },
472 srcs: ["a.java"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000473 sdk_version: "current",
Jiakai Zhangcf61e3c2023-05-08 16:28:38 +0000474 }`)
475
476 ctx := result.TestContext
477 dexpreopt := ctx.ModuleForTests("foo", "android_common").MaybeRule("dexpreopt")
478
Spandan Das2069c3f2023-12-06 19:40:24 +0000479 expected := []string{"out/soong/.intermediates/foo/android_common/dexpreopt/foo/profile.prof"}
Jiakai Zhangcf61e3c2023-05-08 16:28:38 +0000480
481 android.AssertArrayString(t, "outputs", expected, dexpreopt.AllOutputs())
482}