blob: 07d0595e6f2eb1c072117cd49621e79e213d0eb3 [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) {
33 tests := []struct {
Jiakai Zhang519c5c82021-09-16 06:15:39 +000034 name string
35 bp string
36 moduleName string
37 apexVariant bool
38 enabled bool
Colin Cross638149e2019-01-05 22:12:12 -080039 }{
40 {
41 name: "app",
42 bp: `
43 android_app {
44 name: "foo",
45 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090046 sdk_version: "current",
Colin Cross638149e2019-01-05 22:12:12 -080047 }`,
48 enabled: true,
49 },
50 {
51 name: "installable java library",
52 bp: `
53 java_library {
54 name: "foo",
55 installable: true,
56 srcs: ["a.java"],
Jihoon Kang85bc1932024-07-01 17:04:46 +000057 sdk_version: "current",
Colin Cross638149e2019-01-05 22:12:12 -080058 }`,
59 enabled: true,
60 },
61 {
62 name: "java binary",
63 bp: `
64 java_binary {
65 name: "foo",
66 srcs: ["a.java"],
Zi Wangca65b402022-10-10 13:45:06 -070067 main_class: "foo.bar.jb",
Colin Cross638149e2019-01-05 22:12:12 -080068 }`,
69 enabled: true,
70 },
Colin Cross638149e2019-01-05 22:12:12 -080071 {
72 name: "app without sources",
73 bp: `
74 android_app {
75 name: "foo",
Jeongik Cha538c0d02019-07-11 15:54:27 +090076 sdk_version: "current",
Colin Cross638149e2019-01-05 22:12:12 -080077 }`,
Jaewoong Junga24af3b2019-05-13 09:23:20 -070078 enabled: false,
79 },
80 {
81 name: "app with libraries",
82 bp: `
83 android_app {
84 name: "foo",
85 static_libs: ["lib"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090086 sdk_version: "current",
Jaewoong Junga24af3b2019-05-13 09:23:20 -070087 }
88
89 java_library {
90 name: "lib",
91 srcs: ["a.java"],
Jeongik Cha538c0d02019-07-11 15:54:27 +090092 sdk_version: "current",
Jaewoong Junga24af3b2019-05-13 09:23:20 -070093 }`,
Colin Cross638149e2019-01-05 22:12:12 -080094 enabled: true,
95 },
96 {
97 name: "installable java library without sources",
98 bp: `
99 java_library {
100 name: "foo",
101 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +0000102 sdk_version: "current",
Colin Cross638149e2019-01-05 22:12:12 -0800103 }`,
Jaewoong Junga24af3b2019-05-13 09:23:20 -0700104 enabled: false,
Colin Cross638149e2019-01-05 22:12:12 -0800105 },
Colin Cross638149e2019-01-05 22:12:12 -0800106 {
107 name: "static java library",
108 bp: `
109 java_library {
110 name: "foo",
111 srcs: ["a.java"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000112 sdk_version: "current",
Colin Cross638149e2019-01-05 22:12:12 -0800113 }`,
114 enabled: false,
115 },
116 {
Colin Crosse3026872019-01-05 22:30:13 -0800117 name: "java test",
118 bp: `
119 java_test {
120 name: "foo",
121 srcs: ["a.java"],
122 }`,
123 enabled: false,
124 },
125 {
Colin Cross638149e2019-01-05 22:12:12 -0800126 name: "android test",
127 bp: `
128 android_test {
129 name: "foo",
130 srcs: ["a.java"],
131 }`,
132 enabled: false,
133 },
134 {
135 name: "android test helper app",
136 bp: `
137 android_test_helper_app {
138 name: "foo",
139 srcs: ["a.java"],
140 }`,
141 enabled: false,
142 },
Colin Crossdc2da912019-01-05 22:13:05 -0800143 {
144 name: "compile_dex",
145 bp: `
146 java_library {
147 name: "foo",
148 srcs: ["a.java"],
149 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +0000150 sdk_version: "current",
Colin Crossdc2da912019-01-05 22:13:05 -0800151 }`,
152 enabled: false,
153 },
Colin Cross42be7612019-02-21 18:12:14 -0800154 {
155 name: "dex_import",
156 bp: `
157 dex_import {
158 name: "foo",
159 jars: ["a.jar"],
160 }`,
161 enabled: true,
162 },
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000163 {
164 name: "apex variant",
165 bp: `
166 java_library {
167 name: "foo",
168 installable: true,
169 srcs: ["a.java"],
170 apex_available: ["com.android.apex1"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000171 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000172 }`,
173 apexVariant: true,
174 enabled: false,
175 },
176 {
177 name: "apex variant of apex system server jar",
178 bp: `
179 java_library {
180 name: "service-foo",
181 installable: true,
182 srcs: ["a.java"],
183 apex_available: ["com.android.apex1"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000184 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000185 }`,
186 moduleName: "service-foo",
187 apexVariant: true,
188 enabled: true,
189 },
190 {
191 name: "apex variant of prebuilt apex system server jar",
192 bp: `
193 java_library {
194 name: "prebuilt_service-foo",
195 installable: true,
196 srcs: ["a.java"],
197 apex_available: ["com.android.apex1"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000198 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000199 }`,
200 moduleName: "prebuilt_service-foo",
201 apexVariant: true,
202 enabled: true,
203 },
204 {
205 name: "platform variant of apex system server jar",
206 bp: `
207 java_library {
208 name: "service-foo",
209 installable: true,
210 srcs: ["a.java"],
211 apex_available: ["com.android.apex1"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000212 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000213 }`,
214 moduleName: "service-foo",
215 apexVariant: false,
216 enabled: false,
217 },
Colin Cross638149e2019-01-05 22:12:12 -0800218 }
219
220 for _, test := range tests {
221 t.Run(test.name, func(t *testing.T) {
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000222 preparers := android.GroupFixturePreparers(
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100223 PrepareForTestWithDexpreopt,
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000224 PrepareForTestWithFakeApexMutator,
225 dexpreopt.FixtureSetApexSystemServerJars("com.android.apex1:service-foo"),
226 )
Colin Cross638149e2019-01-05 22:12:12 -0800227
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000228 result := preparers.RunTestWithBp(t, test.bp)
229 ctx := result.TestContext
230
231 moduleName := "foo"
232 if test.moduleName != "" {
233 moduleName = test.moduleName
234 }
235
236 variant := "android_common"
237 if test.apexVariant {
238 variant += "_apex1000"
239 }
240
241 dexpreopt := ctx.ModuleForTests(moduleName, variant).MaybeRule("dexpreopt")
Colin Cross638149e2019-01-05 22:12:12 -0800242 enabled := dexpreopt.Rule != nil
243
244 if enabled != test.enabled {
245 t.Fatalf("want dexpreopt %s, got %s", enabledString(test.enabled), enabledString(enabled))
246 }
247 })
248
249 }
250}
251
252func enabledString(enabled bool) string {
253 if enabled {
254 return "enabled"
255 } else {
256 return "disabled"
257 }
258}
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +0100259
260func TestDex2oatToolDeps(t *testing.T) {
Colin Cross0c66bc62021-07-20 09:47:41 -0700261 if runtime.GOOS != "linux" {
Martin Stjernholm1b784a72021-05-20 15:24:34 +0100262 // The host binary paths checked below are build OS dependent.
Colin Cross0c66bc62021-07-20 09:47:41 -0700263 t.Skipf("Unsupported build OS %s", runtime.GOOS)
Martin Stjernholm1b784a72021-05-20 15:24:34 +0100264 }
265
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +0100266 preparers := android.GroupFixturePreparers(
267 cc.PrepareForTestWithCcDefaultModules,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100268 PrepareForTestWithDexpreoptWithoutFakeDex2oatd,
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +0100269 dexpreopt.PrepareForTestByEnablingDexpreopt)
270
271 testDex2oatToolDep := func(sourceEnabled, prebuiltEnabled, prebuiltPreferred bool,
272 expectedDex2oatPath string) {
273 name := fmt.Sprintf("sourceEnabled:%t,prebuiltEnabled:%t,prebuiltPreferred:%t",
274 sourceEnabled, prebuiltEnabled, prebuiltPreferred)
275 t.Run(name, func(t *testing.T) {
276 result := preparers.RunTestWithBp(t, fmt.Sprintf(`
277 cc_binary {
278 name: "dex2oatd",
279 enabled: %t,
280 host_supported: true,
281 }
282 cc_prebuilt_binary {
283 name: "dex2oatd",
284 enabled: %t,
285 prefer: %t,
286 host_supported: true,
287 srcs: ["x86_64/bin/dex2oatd"],
288 }
289 java_library {
290 name: "myjavalib",
291 }
292 `, sourceEnabled, prebuiltEnabled, prebuiltPreferred))
293 pathContext := android.PathContextForTesting(result.Config)
294 dex2oatPath := dexpreopt.GetCachedGlobalSoongConfig(pathContext).Dex2oat
295 android.AssertStringEquals(t, "Testing "+name, expectedDex2oatPath, android.NormalizePathForTesting(dex2oatPath))
296 })
297 }
298
299 sourceDex2oatPath := "host/linux-x86/bin/dex2oatd"
300 prebuiltDex2oatPath := ".intermediates/prebuilt_dex2oatd/linux_glibc_x86_64/dex2oatd"
301
302 testDex2oatToolDep(true, false, false, sourceDex2oatPath)
303 testDex2oatToolDep(true, true, false, sourceDex2oatPath)
304 testDex2oatToolDep(true, true, true, prebuiltDex2oatPath)
305 testDex2oatToolDep(false, true, false, prebuiltDex2oatPath)
306}
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000307
308func TestDexpreoptBuiltInstalledForApex(t *testing.T) {
309 preparers := android.GroupFixturePreparers(
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100310 PrepareForTestWithDexpreopt,
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000311 PrepareForTestWithFakeApexMutator,
312 dexpreopt.FixtureSetApexSystemServerJars("com.android.apex1:service-foo"),
313 )
314
315 // An APEX system server jar.
316 result := preparers.RunTestWithBp(t, `
317 java_library {
318 name: "service-foo",
319 installable: true,
320 srcs: ["a.java"],
321 apex_available: ["com.android.apex1"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000322 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000323 }`)
324 ctx := result.TestContext
325 module := ctx.ModuleForTests("service-foo", "android_common_apex1000")
326 library := module.Module().(*Library)
327
328 installs := library.dexpreopter.DexpreoptBuiltInstalledForApex()
329
330 android.AssertIntEquals(t, "install count", 2, len(installs))
331
332 android.AssertStringEquals(t, "installs[0] FullModuleName",
333 "service-foo-dexpreopt-arm64-apex@com.android.apex1@javalib@service-foo.jar@classes.odex",
334 installs[0].FullModuleName())
335
336 android.AssertStringEquals(t, "installs[0] SubModuleName",
337 "-dexpreopt-arm64-apex@com.android.apex1@javalib@service-foo.jar@classes.odex",
338 installs[0].SubModuleName())
339
340 android.AssertStringEquals(t, "installs[1] FullModuleName",
341 "service-foo-dexpreopt-arm64-apex@com.android.apex1@javalib@service-foo.jar@classes.vdex",
342 installs[1].FullModuleName())
343
344 android.AssertStringEquals(t, "installs[1] SubModuleName",
345 "-dexpreopt-arm64-apex@com.android.apex1@javalib@service-foo.jar@classes.vdex",
346 installs[1].SubModuleName())
347
348 // Not an APEX system server jar.
349 result = preparers.RunTestWithBp(t, `
350 java_library {
351 name: "foo",
352 installable: true,
353 srcs: ["a.java"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000354 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000355 }`)
356 ctx = result.TestContext
357 module = ctx.ModuleForTests("foo", "android_common")
358 library = module.Module().(*Library)
359
360 installs = library.dexpreopter.DexpreoptBuiltInstalledForApex()
361
362 android.AssertIntEquals(t, "install count", 0, len(installs))
363}
364
365func filterDexpreoptEntriesList(entriesList []android.AndroidMkEntries) []android.AndroidMkEntries {
366 var results []android.AndroidMkEntries
367 for _, entries := range entriesList {
368 if strings.Contains(entries.EntryMap["LOCAL_MODULE"][0], "-dexpreopt-") {
369 results = append(results, entries)
370 }
371 }
372 return results
373}
374
375func verifyEntries(t *testing.T, message string, expectedModule string,
376 expectedPrebuiltModuleFile string, expectedModulePath string, expectedInstalledModuleStem string,
377 entries android.AndroidMkEntries) {
378 android.AssertStringEquals(t, message+" LOCAL_MODULE", expectedModule,
379 entries.EntryMap["LOCAL_MODULE"][0])
380
381 android.AssertStringEquals(t, message+" LOCAL_MODULE_CLASS", "ETC",
382 entries.EntryMap["LOCAL_MODULE_CLASS"][0])
383
384 android.AssertStringDoesContain(t, message+" LOCAL_PREBUILT_MODULE_FILE",
385 entries.EntryMap["LOCAL_PREBUILT_MODULE_FILE"][0], expectedPrebuiltModuleFile)
386
387 android.AssertStringDoesContain(t, message+" LOCAL_MODULE_PATH",
388 entries.EntryMap["LOCAL_MODULE_PATH"][0], expectedModulePath)
389
390 android.AssertStringEquals(t, message+" LOCAL_INSTALLED_MODULE_STEM",
391 expectedInstalledModuleStem, entries.EntryMap["LOCAL_INSTALLED_MODULE_STEM"][0])
392
393 android.AssertStringEquals(t, message+" LOCAL_NOT_AVAILABLE_FOR_PLATFORM",
394 "false", entries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"][0])
395}
396
397func TestAndroidMkEntriesForApex(t *testing.T) {
398 preparers := android.GroupFixturePreparers(
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100399 PrepareForTestWithDexpreopt,
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000400 PrepareForTestWithFakeApexMutator,
401 dexpreopt.FixtureSetApexSystemServerJars("com.android.apex1:service-foo"),
402 )
403
404 // An APEX system server jar.
405 result := preparers.RunTestWithBp(t, `
406 java_library {
407 name: "service-foo",
408 installable: true,
409 srcs: ["a.java"],
410 apex_available: ["com.android.apex1"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000411 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000412 }`)
413 ctx := result.TestContext
414 module := ctx.ModuleForTests("service-foo", "android_common_apex1000")
415
416 entriesList := android.AndroidMkEntriesForTest(t, ctx, module.Module())
417 entriesList = filterDexpreoptEntriesList(entriesList)
418
419 android.AssertIntEquals(t, "entries count", 2, len(entriesList))
420
421 verifyEntries(t,
422 "entriesList[0]",
423 "service-foo-dexpreopt-arm64-apex@com.android.apex1@javalib@service-foo.jar@classes.odex",
Spandan Das2069c3f2023-12-06 19:40:24 +0000424 "/dexpreopt/service-foo/oat/arm64/javalib.odex",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000425 "/system/framework/oat/arm64",
426 "apex@com.android.apex1@javalib@service-foo.jar@classes.odex",
427 entriesList[0])
428
429 verifyEntries(t,
430 "entriesList[1]",
431 "service-foo-dexpreopt-arm64-apex@com.android.apex1@javalib@service-foo.jar@classes.vdex",
Spandan Das2069c3f2023-12-06 19:40:24 +0000432 "/dexpreopt/service-foo/oat/arm64/javalib.vdex",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000433 "/system/framework/oat/arm64",
434 "apex@com.android.apex1@javalib@service-foo.jar@classes.vdex",
435 entriesList[1])
436
437 // Not an APEX system server jar.
438 result = preparers.RunTestWithBp(t, `
439 java_library {
440 name: "foo",
441 installable: true,
442 srcs: ["a.java"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000443 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000444 }`)
445 ctx = result.TestContext
446 module = ctx.ModuleForTests("foo", "android_common")
447
448 entriesList = android.AndroidMkEntriesForTest(t, ctx, module.Module())
449 entriesList = filterDexpreoptEntriesList(entriesList)
450
451 android.AssertIntEquals(t, "entries count", 0, len(entriesList))
452}
Jiakai Zhangcf61e3c2023-05-08 16:28:38 +0000453
454func TestGenerateProfileEvenIfDexpreoptIsDisabled(t *testing.T) {
455 preparers := android.GroupFixturePreparers(
456 PrepareForTestWithJavaDefaultModules,
457 PrepareForTestWithFakeApexMutator,
458 dexpreopt.FixtureDisableDexpreopt(true),
459 )
460
461 result := preparers.RunTestWithBp(t, `
462 java_library {
463 name: "foo",
464 installable: true,
465 dex_preopt: {
466 profile: "art-profile",
467 },
468 srcs: ["a.java"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000469 sdk_version: "current",
Jiakai Zhangcf61e3c2023-05-08 16:28:38 +0000470 }`)
471
472 ctx := result.TestContext
473 dexpreopt := ctx.ModuleForTests("foo", "android_common").MaybeRule("dexpreopt")
474
Spandan Das2069c3f2023-12-06 19:40:24 +0000475 expected := []string{"out/soong/.intermediates/foo/android_common/dexpreopt/foo/profile.prof"}
Jiakai Zhangcf61e3c2023-05-08 16:28:38 +0000476
477 android.AssertArrayString(t, "outputs", expected, dexpreopt.AllOutputs())
478}