blob: f437da02ce4d89d480a9f57adc4bb65bfb7d2732 [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"
Colin Cross638149e2019-01-05 22:12:12 -080020 "testing"
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +010021
22 "android/soong/android"
23 "android/soong/cc"
24 "android/soong/dexpreopt"
Colin Cross638149e2019-01-05 22:12:12 -080025)
26
Jiakai Zhang519c5c82021-09-16 06:15:39 +000027func init() {
28 RegisterFakeRuntimeApexMutator()
29}
30
Colin Cross638149e2019-01-05 22:12:12 -080031func TestDexpreoptEnabled(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -080032 t.Parallel()
Colin Cross638149e2019-01-05 22:12:12 -080033 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) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800222 t.Parallel()
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000223 preparers := android.GroupFixturePreparers(
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100224 PrepareForTestWithDexpreopt,
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000225 PrepareForTestWithFakeApexMutator,
226 dexpreopt.FixtureSetApexSystemServerJars("com.android.apex1:service-foo"),
227 )
Colin Cross638149e2019-01-05 22:12:12 -0800228
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000229 result := preparers.RunTestWithBp(t, test.bp)
230 ctx := result.TestContext
231
232 moduleName := "foo"
233 if test.moduleName != "" {
234 moduleName = test.moduleName
235 }
236
237 variant := "android_common"
238 if test.apexVariant {
239 variant += "_apex1000"
240 }
241
Colin Cross90607e92025-02-11 14:58:07 -0800242 dexpreopt := ctx.ModuleForTests(t, moduleName, variant).MaybeRule("dexpreopt")
Colin Cross638149e2019-01-05 22:12:12 -0800243 enabled := dexpreopt.Rule != nil
244
245 if enabled != test.enabled {
246 t.Fatalf("want dexpreopt %s, got %s", enabledString(test.enabled), enabledString(enabled))
247 }
248 })
249
250 }
251}
252
253func enabledString(enabled bool) string {
254 if enabled {
255 return "enabled"
256 } else {
257 return "disabled"
258 }
259}
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +0100260
261func TestDex2oatToolDeps(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800262 t.Parallel()
Colin Cross0c66bc62021-07-20 09:47:41 -0700263 if runtime.GOOS != "linux" {
Martin Stjernholm1b784a72021-05-20 15:24:34 +0100264 // The host binary paths checked below are build OS dependent.
Colin Cross0c66bc62021-07-20 09:47:41 -0700265 t.Skipf("Unsupported build OS %s", runtime.GOOS)
Martin Stjernholm1b784a72021-05-20 15:24:34 +0100266 }
267
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +0100268 preparers := android.GroupFixturePreparers(
269 cc.PrepareForTestWithCcDefaultModules,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100270 PrepareForTestWithDexpreoptWithoutFakeDex2oatd,
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +0100271 dexpreopt.PrepareForTestByEnablingDexpreopt)
272
273 testDex2oatToolDep := func(sourceEnabled, prebuiltEnabled, prebuiltPreferred bool,
274 expectedDex2oatPath string) {
275 name := fmt.Sprintf("sourceEnabled:%t,prebuiltEnabled:%t,prebuiltPreferred:%t",
276 sourceEnabled, prebuiltEnabled, prebuiltPreferred)
277 t.Run(name, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800278 t.Parallel()
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +0100279 result := preparers.RunTestWithBp(t, fmt.Sprintf(`
280 cc_binary {
281 name: "dex2oatd",
282 enabled: %t,
283 host_supported: true,
284 }
285 cc_prebuilt_binary {
286 name: "dex2oatd",
287 enabled: %t,
288 prefer: %t,
289 host_supported: true,
290 srcs: ["x86_64/bin/dex2oatd"],
291 }
292 java_library {
293 name: "myjavalib",
294 }
295 `, sourceEnabled, prebuiltEnabled, prebuiltPreferred))
296 pathContext := android.PathContextForTesting(result.Config)
297 dex2oatPath := dexpreopt.GetCachedGlobalSoongConfig(pathContext).Dex2oat
298 android.AssertStringEquals(t, "Testing "+name, expectedDex2oatPath, android.NormalizePathForTesting(dex2oatPath))
299 })
300 }
301
Cole Faust6b7075f2024-12-17 10:42:42 -0800302 sourceDex2oatPath := "../host/linux-x86/bin/dex2oatd"
Martin Stjernholm0e4cceb2021-05-13 02:38:35 +0100303 prebuiltDex2oatPath := ".intermediates/prebuilt_dex2oatd/linux_glibc_x86_64/dex2oatd"
304
305 testDex2oatToolDep(true, false, false, sourceDex2oatPath)
306 testDex2oatToolDep(true, true, false, sourceDex2oatPath)
307 testDex2oatToolDep(true, true, true, prebuiltDex2oatPath)
308 testDex2oatToolDep(false, true, false, prebuiltDex2oatPath)
309}
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000310
Colin Cross388c6612025-01-28 14:00:12 -0800311func TestApexSystemServerDexpreoptInstalls(t *testing.T) {
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000312 preparers := android.GroupFixturePreparers(
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100313 PrepareForTestWithDexpreopt,
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000314 PrepareForTestWithFakeApexMutator,
315 dexpreopt.FixtureSetApexSystemServerJars("com.android.apex1:service-foo"),
316 )
317
318 // An APEX system server jar.
319 result := preparers.RunTestWithBp(t, `
320 java_library {
321 name: "service-foo",
322 installable: true,
323 srcs: ["a.java"],
324 apex_available: ["com.android.apex1"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000325 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000326 }`)
327 ctx := result.TestContext
Colin Cross90607e92025-02-11 14:58:07 -0800328 module := ctx.ModuleForTests(t, "service-foo", "android_common_apex1000")
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000329 library := module.Module().(*Library)
330
Colin Cross388c6612025-01-28 14:00:12 -0800331 installs := library.dexpreopter.ApexSystemServerDexpreoptInstalls()
332 dexJars := library.dexpreopter.ApexSystemServerDexJars()
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000333
334 android.AssertIntEquals(t, "install count", 2, len(installs))
Colin Cross388c6612025-01-28 14:00:12 -0800335 android.AssertIntEquals(t, "dexjar count", 1, len(dexJars))
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000336
Colin Cross388c6612025-01-28 14:00:12 -0800337 android.AssertPathRelativeToTopEquals(t, "installs[0] OutputPathOnHost",
338 "out/soong/.intermediates/service-foo/android_common_apex1000/dexpreopt/service-foo/oat/arm64/javalib.odex",
339 installs[0].OutputPathOnHost)
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000340
Colin Cross388c6612025-01-28 14:00:12 -0800341 android.AssertPathRelativeToTopEquals(t, "installs[0] InstallDirOnDevice",
342 "out/target/product/test_device/system/framework/oat/arm64",
343 installs[0].InstallDirOnDevice)
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000344
Colin Cross388c6612025-01-28 14:00:12 -0800345 android.AssertStringEquals(t, "installs[0] InstallFileOnDevice",
346 "apex@com.android.apex1@javalib@service-foo.jar@classes.odex",
347 installs[0].InstallFileOnDevice)
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000348
Colin Cross388c6612025-01-28 14:00:12 -0800349 android.AssertPathRelativeToTopEquals(t, "installs[1] OutputPathOnHost",
350 "out/soong/.intermediates/service-foo/android_common_apex1000/dexpreopt/service-foo/oat/arm64/javalib.vdex",
351 installs[1].OutputPathOnHost)
352
353 android.AssertPathRelativeToTopEquals(t, "installs[1] InstallDirOnDevice",
354 "out/target/product/test_device/system/framework/oat/arm64",
355 installs[1].InstallDirOnDevice)
356
357 android.AssertStringEquals(t, "installs[1] InstallFileOnDevice",
358 "apex@com.android.apex1@javalib@service-foo.jar@classes.vdex",
359 installs[1].InstallFileOnDevice)
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000360
361 // Not an APEX system server jar.
362 result = preparers.RunTestWithBp(t, `
363 java_library {
364 name: "foo",
365 installable: true,
366 srcs: ["a.java"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000367 sdk_version: "current",
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000368 }`)
369 ctx = result.TestContext
Colin Cross90607e92025-02-11 14:58:07 -0800370 module = ctx.ModuleForTests(t, "foo", "android_common")
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000371 library = module.Module().(*Library)
372
Colin Cross388c6612025-01-28 14:00:12 -0800373 installs = library.dexpreopter.ApexSystemServerDexpreoptInstalls()
374 dexJars = library.dexpreopter.ApexSystemServerDexJars()
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000375
376 android.AssertIntEquals(t, "install count", 0, len(installs))
Colin Cross388c6612025-01-28 14:00:12 -0800377 android.AssertIntEquals(t, "dexjar count", 0, len(dexJars))
Jiakai Zhang519c5c82021-09-16 06:15:39 +0000378}
Jiakai Zhangcf61e3c2023-05-08 16:28:38 +0000379
380func TestGenerateProfileEvenIfDexpreoptIsDisabled(t *testing.T) {
381 preparers := android.GroupFixturePreparers(
382 PrepareForTestWithJavaDefaultModules,
383 PrepareForTestWithFakeApexMutator,
384 dexpreopt.FixtureDisableDexpreopt(true),
385 )
386
387 result := preparers.RunTestWithBp(t, `
388 java_library {
389 name: "foo",
390 installable: true,
391 dex_preopt: {
392 profile: "art-profile",
393 },
394 srcs: ["a.java"],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000395 sdk_version: "current",
Jiakai Zhangcf61e3c2023-05-08 16:28:38 +0000396 }`)
397
398 ctx := result.TestContext
Colin Cross90607e92025-02-11 14:58:07 -0800399 dexpreopt := ctx.ModuleForTests(t, "foo", "android_common").MaybeRule("dexpreopt")
Jiakai Zhangcf61e3c2023-05-08 16:28:38 +0000400
Spandan Das2069c3f2023-12-06 19:40:24 +0000401 expected := []string{"out/soong/.intermediates/foo/android_common/dexpreopt/foo/profile.prof"}
Jiakai Zhangcf61e3c2023-05-08 16:28:38 +0000402
403 android.AssertArrayString(t, "outputs", expected, dexpreopt.AllOutputs())
404}