xref: /aosp_15_r20/build/soong/java/dexpreopt_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage java
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"runtime"
20*333d2b36SAndroid Build Coastguard Worker	"strings"
21*333d2b36SAndroid Build Coastguard Worker	"testing"
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
24*333d2b36SAndroid Build Coastguard Worker	"android/soong/cc"
25*333d2b36SAndroid Build Coastguard Worker	"android/soong/dexpreopt"
26*333d2b36SAndroid Build Coastguard Worker)
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Workerfunc init() {
29*333d2b36SAndroid Build Coastguard Worker	RegisterFakeRuntimeApexMutator()
30*333d2b36SAndroid Build Coastguard Worker}
31*333d2b36SAndroid Build Coastguard Worker
32*333d2b36SAndroid Build Coastguard Workerfunc TestDexpreoptEnabled(t *testing.T) {
33*333d2b36SAndroid Build Coastguard Worker	tests := []struct {
34*333d2b36SAndroid Build Coastguard Worker		name        string
35*333d2b36SAndroid Build Coastguard Worker		bp          string
36*333d2b36SAndroid Build Coastguard Worker		moduleName  string
37*333d2b36SAndroid Build Coastguard Worker		apexVariant bool
38*333d2b36SAndroid Build Coastguard Worker		enabled     bool
39*333d2b36SAndroid Build Coastguard Worker	}{
40*333d2b36SAndroid Build Coastguard Worker		{
41*333d2b36SAndroid Build Coastguard Worker			name: "app",
42*333d2b36SAndroid Build Coastguard Worker			bp: `
43*333d2b36SAndroid Build Coastguard Worker				android_app {
44*333d2b36SAndroid Build Coastguard Worker					name: "foo",
45*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
46*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
47*333d2b36SAndroid Build Coastguard Worker				}`,
48*333d2b36SAndroid Build Coastguard Worker			enabled: true,
49*333d2b36SAndroid Build Coastguard Worker		},
50*333d2b36SAndroid Build Coastguard Worker		{
51*333d2b36SAndroid Build Coastguard Worker			name: "installable java library",
52*333d2b36SAndroid Build Coastguard Worker			bp: `
53*333d2b36SAndroid Build Coastguard Worker				java_library {
54*333d2b36SAndroid Build Coastguard Worker					name: "foo",
55*333d2b36SAndroid Build Coastguard Worker					installable: true,
56*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
57*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
58*333d2b36SAndroid Build Coastguard Worker				}`,
59*333d2b36SAndroid Build Coastguard Worker			enabled: true,
60*333d2b36SAndroid Build Coastguard Worker		},
61*333d2b36SAndroid Build Coastguard Worker		{
62*333d2b36SAndroid Build Coastguard Worker			name: "java binary",
63*333d2b36SAndroid Build Coastguard Worker			bp: `
64*333d2b36SAndroid Build Coastguard Worker				java_binary {
65*333d2b36SAndroid Build Coastguard Worker					name: "foo",
66*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
67*333d2b36SAndroid Build Coastguard Worker					main_class: "foo.bar.jb",
68*333d2b36SAndroid Build Coastguard Worker				}`,
69*333d2b36SAndroid Build Coastguard Worker			enabled: true,
70*333d2b36SAndroid Build Coastguard Worker		},
71*333d2b36SAndroid Build Coastguard Worker		{
72*333d2b36SAndroid Build Coastguard Worker			name: "app without sources",
73*333d2b36SAndroid Build Coastguard Worker			bp: `
74*333d2b36SAndroid Build Coastguard Worker				android_app {
75*333d2b36SAndroid Build Coastguard Worker					name: "foo",
76*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
77*333d2b36SAndroid Build Coastguard Worker				}`,
78*333d2b36SAndroid Build Coastguard Worker			enabled: false,
79*333d2b36SAndroid Build Coastguard Worker		},
80*333d2b36SAndroid Build Coastguard Worker		{
81*333d2b36SAndroid Build Coastguard Worker			name: "app with libraries",
82*333d2b36SAndroid Build Coastguard Worker			bp: `
83*333d2b36SAndroid Build Coastguard Worker				android_app {
84*333d2b36SAndroid Build Coastguard Worker					name: "foo",
85*333d2b36SAndroid Build Coastguard Worker					static_libs: ["lib"],
86*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
87*333d2b36SAndroid Build Coastguard Worker				}
88*333d2b36SAndroid Build Coastguard Worker
89*333d2b36SAndroid Build Coastguard Worker				java_library {
90*333d2b36SAndroid Build Coastguard Worker					name: "lib",
91*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
92*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
93*333d2b36SAndroid Build Coastguard Worker				}`,
94*333d2b36SAndroid Build Coastguard Worker			enabled: true,
95*333d2b36SAndroid Build Coastguard Worker		},
96*333d2b36SAndroid Build Coastguard Worker		{
97*333d2b36SAndroid Build Coastguard Worker			name: "installable java library without sources",
98*333d2b36SAndroid Build Coastguard Worker			bp: `
99*333d2b36SAndroid Build Coastguard Worker				java_library {
100*333d2b36SAndroid Build Coastguard Worker					name: "foo",
101*333d2b36SAndroid Build Coastguard Worker					installable: true,
102*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
103*333d2b36SAndroid Build Coastguard Worker				}`,
104*333d2b36SAndroid Build Coastguard Worker			enabled: false,
105*333d2b36SAndroid Build Coastguard Worker		},
106*333d2b36SAndroid Build Coastguard Worker		{
107*333d2b36SAndroid Build Coastguard Worker			name: "static java library",
108*333d2b36SAndroid Build Coastguard Worker			bp: `
109*333d2b36SAndroid Build Coastguard Worker				java_library {
110*333d2b36SAndroid Build Coastguard Worker					name: "foo",
111*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
112*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
113*333d2b36SAndroid Build Coastguard Worker				}`,
114*333d2b36SAndroid Build Coastguard Worker			enabled: false,
115*333d2b36SAndroid Build Coastguard Worker		},
116*333d2b36SAndroid Build Coastguard Worker		{
117*333d2b36SAndroid Build Coastguard Worker			name: "java test",
118*333d2b36SAndroid Build Coastguard Worker			bp: `
119*333d2b36SAndroid Build Coastguard Worker				java_test {
120*333d2b36SAndroid Build Coastguard Worker					name: "foo",
121*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
122*333d2b36SAndroid Build Coastguard Worker				}`,
123*333d2b36SAndroid Build Coastguard Worker			enabled: false,
124*333d2b36SAndroid Build Coastguard Worker		},
125*333d2b36SAndroid Build Coastguard Worker		{
126*333d2b36SAndroid Build Coastguard Worker			name: "android test",
127*333d2b36SAndroid Build Coastguard Worker			bp: `
128*333d2b36SAndroid Build Coastguard Worker				android_test {
129*333d2b36SAndroid Build Coastguard Worker					name: "foo",
130*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
131*333d2b36SAndroid Build Coastguard Worker				}`,
132*333d2b36SAndroid Build Coastguard Worker			enabled: false,
133*333d2b36SAndroid Build Coastguard Worker		},
134*333d2b36SAndroid Build Coastguard Worker		{
135*333d2b36SAndroid Build Coastguard Worker			name: "android test helper app",
136*333d2b36SAndroid Build Coastguard Worker			bp: `
137*333d2b36SAndroid Build Coastguard Worker				android_test_helper_app {
138*333d2b36SAndroid Build Coastguard Worker					name: "foo",
139*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
140*333d2b36SAndroid Build Coastguard Worker				}`,
141*333d2b36SAndroid Build Coastguard Worker			enabled: false,
142*333d2b36SAndroid Build Coastguard Worker		},
143*333d2b36SAndroid Build Coastguard Worker		{
144*333d2b36SAndroid Build Coastguard Worker			name: "compile_dex",
145*333d2b36SAndroid Build Coastguard Worker			bp: `
146*333d2b36SAndroid Build Coastguard Worker				java_library {
147*333d2b36SAndroid Build Coastguard Worker					name: "foo",
148*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
149*333d2b36SAndroid Build Coastguard Worker					compile_dex: true,
150*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
151*333d2b36SAndroid Build Coastguard Worker				}`,
152*333d2b36SAndroid Build Coastguard Worker			enabled: false,
153*333d2b36SAndroid Build Coastguard Worker		},
154*333d2b36SAndroid Build Coastguard Worker		{
155*333d2b36SAndroid Build Coastguard Worker			name: "dex_import",
156*333d2b36SAndroid Build Coastguard Worker			bp: `
157*333d2b36SAndroid Build Coastguard Worker				dex_import {
158*333d2b36SAndroid Build Coastguard Worker					name: "foo",
159*333d2b36SAndroid Build Coastguard Worker					jars: ["a.jar"],
160*333d2b36SAndroid Build Coastguard Worker				}`,
161*333d2b36SAndroid Build Coastguard Worker			enabled: true,
162*333d2b36SAndroid Build Coastguard Worker		},
163*333d2b36SAndroid Build Coastguard Worker		{
164*333d2b36SAndroid Build Coastguard Worker			name: "apex variant",
165*333d2b36SAndroid Build Coastguard Worker			bp: `
166*333d2b36SAndroid Build Coastguard Worker				java_library {
167*333d2b36SAndroid Build Coastguard Worker					name: "foo",
168*333d2b36SAndroid Build Coastguard Worker					installable: true,
169*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
170*333d2b36SAndroid Build Coastguard Worker					apex_available: ["com.android.apex1"],
171*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
172*333d2b36SAndroid Build Coastguard Worker				}`,
173*333d2b36SAndroid Build Coastguard Worker			apexVariant: true,
174*333d2b36SAndroid Build Coastguard Worker			enabled:     false,
175*333d2b36SAndroid Build Coastguard Worker		},
176*333d2b36SAndroid Build Coastguard Worker		{
177*333d2b36SAndroid Build Coastguard Worker			name: "apex variant of apex system server jar",
178*333d2b36SAndroid Build Coastguard Worker			bp: `
179*333d2b36SAndroid Build Coastguard Worker				java_library {
180*333d2b36SAndroid Build Coastguard Worker					name: "service-foo",
181*333d2b36SAndroid Build Coastguard Worker					installable: true,
182*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
183*333d2b36SAndroid Build Coastguard Worker					apex_available: ["com.android.apex1"],
184*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
185*333d2b36SAndroid Build Coastguard Worker				}`,
186*333d2b36SAndroid Build Coastguard Worker			moduleName:  "service-foo",
187*333d2b36SAndroid Build Coastguard Worker			apexVariant: true,
188*333d2b36SAndroid Build Coastguard Worker			enabled:     true,
189*333d2b36SAndroid Build Coastguard Worker		},
190*333d2b36SAndroid Build Coastguard Worker		{
191*333d2b36SAndroid Build Coastguard Worker			name: "apex variant of prebuilt apex system server jar",
192*333d2b36SAndroid Build Coastguard Worker			bp: `
193*333d2b36SAndroid Build Coastguard Worker				java_library {
194*333d2b36SAndroid Build Coastguard Worker					name: "prebuilt_service-foo",
195*333d2b36SAndroid Build Coastguard Worker					installable: true,
196*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
197*333d2b36SAndroid Build Coastguard Worker					apex_available: ["com.android.apex1"],
198*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
199*333d2b36SAndroid Build Coastguard Worker				}`,
200*333d2b36SAndroid Build Coastguard Worker			moduleName:  "prebuilt_service-foo",
201*333d2b36SAndroid Build Coastguard Worker			apexVariant: true,
202*333d2b36SAndroid Build Coastguard Worker			enabled:     true,
203*333d2b36SAndroid Build Coastguard Worker		},
204*333d2b36SAndroid Build Coastguard Worker		{
205*333d2b36SAndroid Build Coastguard Worker			name: "platform variant of apex system server jar",
206*333d2b36SAndroid Build Coastguard Worker			bp: `
207*333d2b36SAndroid Build Coastguard Worker				java_library {
208*333d2b36SAndroid Build Coastguard Worker					name: "service-foo",
209*333d2b36SAndroid Build Coastguard Worker					installable: true,
210*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
211*333d2b36SAndroid Build Coastguard Worker					apex_available: ["com.android.apex1"],
212*333d2b36SAndroid Build Coastguard Worker					sdk_version: "current",
213*333d2b36SAndroid Build Coastguard Worker				}`,
214*333d2b36SAndroid Build Coastguard Worker			moduleName:  "service-foo",
215*333d2b36SAndroid Build Coastguard Worker			apexVariant: false,
216*333d2b36SAndroid Build Coastguard Worker			enabled:     false,
217*333d2b36SAndroid Build Coastguard Worker		},
218*333d2b36SAndroid Build Coastguard Worker	}
219*333d2b36SAndroid Build Coastguard Worker
220*333d2b36SAndroid Build Coastguard Worker	for _, test := range tests {
221*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
222*333d2b36SAndroid Build Coastguard Worker			preparers := android.GroupFixturePreparers(
223*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithDexpreopt,
224*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithFakeApexMutator,
225*333d2b36SAndroid Build Coastguard Worker				dexpreopt.FixtureSetApexSystemServerJars("com.android.apex1:service-foo"),
226*333d2b36SAndroid Build Coastguard Worker			)
227*333d2b36SAndroid Build Coastguard Worker
228*333d2b36SAndroid Build Coastguard Worker			result := preparers.RunTestWithBp(t, test.bp)
229*333d2b36SAndroid Build Coastguard Worker			ctx := result.TestContext
230*333d2b36SAndroid Build Coastguard Worker
231*333d2b36SAndroid Build Coastguard Worker			moduleName := "foo"
232*333d2b36SAndroid Build Coastguard Worker			if test.moduleName != "" {
233*333d2b36SAndroid Build Coastguard Worker				moduleName = test.moduleName
234*333d2b36SAndroid Build Coastguard Worker			}
235*333d2b36SAndroid Build Coastguard Worker
236*333d2b36SAndroid Build Coastguard Worker			variant := "android_common"
237*333d2b36SAndroid Build Coastguard Worker			if test.apexVariant {
238*333d2b36SAndroid Build Coastguard Worker				variant += "_apex1000"
239*333d2b36SAndroid Build Coastguard Worker			}
240*333d2b36SAndroid Build Coastguard Worker
241*333d2b36SAndroid Build Coastguard Worker			dexpreopt := ctx.ModuleForTests(moduleName, variant).MaybeRule("dexpreopt")
242*333d2b36SAndroid Build Coastguard Worker			enabled := dexpreopt.Rule != nil
243*333d2b36SAndroid Build Coastguard Worker
244*333d2b36SAndroid Build Coastguard Worker			if enabled != test.enabled {
245*333d2b36SAndroid Build Coastguard Worker				t.Fatalf("want dexpreopt %s, got %s", enabledString(test.enabled), enabledString(enabled))
246*333d2b36SAndroid Build Coastguard Worker			}
247*333d2b36SAndroid Build Coastguard Worker		})
248*333d2b36SAndroid Build Coastguard Worker
249*333d2b36SAndroid Build Coastguard Worker	}
250*333d2b36SAndroid Build Coastguard Worker}
251*333d2b36SAndroid Build Coastguard Worker
252*333d2b36SAndroid Build Coastguard Workerfunc enabledString(enabled bool) string {
253*333d2b36SAndroid Build Coastguard Worker	if enabled {
254*333d2b36SAndroid Build Coastguard Worker		return "enabled"
255*333d2b36SAndroid Build Coastguard Worker	} else {
256*333d2b36SAndroid Build Coastguard Worker		return "disabled"
257*333d2b36SAndroid Build Coastguard Worker	}
258*333d2b36SAndroid Build Coastguard Worker}
259*333d2b36SAndroid Build Coastguard Worker
260*333d2b36SAndroid Build Coastguard Workerfunc TestDex2oatToolDeps(t *testing.T) {
261*333d2b36SAndroid Build Coastguard Worker	if runtime.GOOS != "linux" {
262*333d2b36SAndroid Build Coastguard Worker		// The host binary paths checked below are build OS dependent.
263*333d2b36SAndroid Build Coastguard Worker		t.Skipf("Unsupported build OS %s", runtime.GOOS)
264*333d2b36SAndroid Build Coastguard Worker	}
265*333d2b36SAndroid Build Coastguard Worker
266*333d2b36SAndroid Build Coastguard Worker	preparers := android.GroupFixturePreparers(
267*333d2b36SAndroid Build Coastguard Worker		cc.PrepareForTestWithCcDefaultModules,
268*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithDexpreoptWithoutFakeDex2oatd,
269*333d2b36SAndroid Build Coastguard Worker		dexpreopt.PrepareForTestByEnablingDexpreopt)
270*333d2b36SAndroid Build Coastguard Worker
271*333d2b36SAndroid Build Coastguard Worker	testDex2oatToolDep := func(sourceEnabled, prebuiltEnabled, prebuiltPreferred bool,
272*333d2b36SAndroid Build Coastguard Worker		expectedDex2oatPath string) {
273*333d2b36SAndroid Build Coastguard Worker		name := fmt.Sprintf("sourceEnabled:%t,prebuiltEnabled:%t,prebuiltPreferred:%t",
274*333d2b36SAndroid Build Coastguard Worker			sourceEnabled, prebuiltEnabled, prebuiltPreferred)
275*333d2b36SAndroid Build Coastguard Worker		t.Run(name, func(t *testing.T) {
276*333d2b36SAndroid Build Coastguard Worker			result := preparers.RunTestWithBp(t, fmt.Sprintf(`
277*333d2b36SAndroid Build Coastguard Worker					cc_binary {
278*333d2b36SAndroid Build Coastguard Worker						name: "dex2oatd",
279*333d2b36SAndroid Build Coastguard Worker						enabled: %t,
280*333d2b36SAndroid Build Coastguard Worker						host_supported: true,
281*333d2b36SAndroid Build Coastguard Worker					}
282*333d2b36SAndroid Build Coastguard Worker					cc_prebuilt_binary {
283*333d2b36SAndroid Build Coastguard Worker						name: "dex2oatd",
284*333d2b36SAndroid Build Coastguard Worker						enabled: %t,
285*333d2b36SAndroid Build Coastguard Worker						prefer: %t,
286*333d2b36SAndroid Build Coastguard Worker						host_supported: true,
287*333d2b36SAndroid Build Coastguard Worker						srcs: ["x86_64/bin/dex2oatd"],
288*333d2b36SAndroid Build Coastguard Worker					}
289*333d2b36SAndroid Build Coastguard Worker					java_library {
290*333d2b36SAndroid Build Coastguard Worker						name: "myjavalib",
291*333d2b36SAndroid Build Coastguard Worker					}
292*333d2b36SAndroid Build Coastguard Worker				`, sourceEnabled, prebuiltEnabled, prebuiltPreferred))
293*333d2b36SAndroid Build Coastguard Worker			pathContext := android.PathContextForTesting(result.Config)
294*333d2b36SAndroid Build Coastguard Worker			dex2oatPath := dexpreopt.GetCachedGlobalSoongConfig(pathContext).Dex2oat
295*333d2b36SAndroid Build Coastguard Worker			android.AssertStringEquals(t, "Testing "+name, expectedDex2oatPath, android.NormalizePathForTesting(dex2oatPath))
296*333d2b36SAndroid Build Coastguard Worker		})
297*333d2b36SAndroid Build Coastguard Worker	}
298*333d2b36SAndroid Build Coastguard Worker
299*333d2b36SAndroid Build Coastguard Worker	sourceDex2oatPath := "host/linux-x86/bin/dex2oatd"
300*333d2b36SAndroid Build Coastguard Worker	prebuiltDex2oatPath := ".intermediates/prebuilt_dex2oatd/linux_glibc_x86_64/dex2oatd"
301*333d2b36SAndroid Build Coastguard Worker
302*333d2b36SAndroid Build Coastguard Worker	testDex2oatToolDep(true, false, false, sourceDex2oatPath)
303*333d2b36SAndroid Build Coastguard Worker	testDex2oatToolDep(true, true, false, sourceDex2oatPath)
304*333d2b36SAndroid Build Coastguard Worker	testDex2oatToolDep(true, true, true, prebuiltDex2oatPath)
305*333d2b36SAndroid Build Coastguard Worker	testDex2oatToolDep(false, true, false, prebuiltDex2oatPath)
306*333d2b36SAndroid Build Coastguard Worker}
307*333d2b36SAndroid Build Coastguard Worker
308*333d2b36SAndroid Build Coastguard Workerfunc TestDexpreoptBuiltInstalledForApex(t *testing.T) {
309*333d2b36SAndroid Build Coastguard Worker	preparers := android.GroupFixturePreparers(
310*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithDexpreopt,
311*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithFakeApexMutator,
312*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetApexSystemServerJars("com.android.apex1:service-foo"),
313*333d2b36SAndroid Build Coastguard Worker	)
314*333d2b36SAndroid Build Coastguard Worker
315*333d2b36SAndroid Build Coastguard Worker	// An APEX system server jar.
316*333d2b36SAndroid Build Coastguard Worker	result := preparers.RunTestWithBp(t, `
317*333d2b36SAndroid Build Coastguard Worker		java_library {
318*333d2b36SAndroid Build Coastguard Worker			name: "service-foo",
319*333d2b36SAndroid Build Coastguard Worker			installable: true,
320*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
321*333d2b36SAndroid Build Coastguard Worker			apex_available: ["com.android.apex1"],
322*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
323*333d2b36SAndroid Build Coastguard Worker		}`)
324*333d2b36SAndroid Build Coastguard Worker	ctx := result.TestContext
325*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("service-foo", "android_common_apex1000")
326*333d2b36SAndroid Build Coastguard Worker	library := module.Module().(*Library)
327*333d2b36SAndroid Build Coastguard Worker
328*333d2b36SAndroid Build Coastguard Worker	installs := library.dexpreopter.DexpreoptBuiltInstalledForApex()
329*333d2b36SAndroid Build Coastguard Worker
330*333d2b36SAndroid Build Coastguard Worker	android.AssertIntEquals(t, "install count", 2, len(installs))
331*333d2b36SAndroid Build Coastguard Worker
332*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "installs[0] FullModuleName",
333*333d2b36SAndroid Build Coastguard Worker		"[email protected]@[email protected]@classes.odex",
334*333d2b36SAndroid Build Coastguard Worker		installs[0].FullModuleName())
335*333d2b36SAndroid Build Coastguard Worker
336*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "installs[0] SubModuleName",
337*333d2b36SAndroid Build Coastguard Worker		"[email protected]@[email protected]@classes.odex",
338*333d2b36SAndroid Build Coastguard Worker		installs[0].SubModuleName())
339*333d2b36SAndroid Build Coastguard Worker
340*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "installs[1] FullModuleName",
341*333d2b36SAndroid Build Coastguard Worker		"[email protected]@[email protected]@classes.vdex",
342*333d2b36SAndroid Build Coastguard Worker		installs[1].FullModuleName())
343*333d2b36SAndroid Build Coastguard Worker
344*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "installs[1] SubModuleName",
345*333d2b36SAndroid Build Coastguard Worker		"[email protected]@[email protected]@classes.vdex",
346*333d2b36SAndroid Build Coastguard Worker		installs[1].SubModuleName())
347*333d2b36SAndroid Build Coastguard Worker
348*333d2b36SAndroid Build Coastguard Worker	// Not an APEX system server jar.
349*333d2b36SAndroid Build Coastguard Worker	result = preparers.RunTestWithBp(t, `
350*333d2b36SAndroid Build Coastguard Worker		java_library {
351*333d2b36SAndroid Build Coastguard Worker			name: "foo",
352*333d2b36SAndroid Build Coastguard Worker			installable: true,
353*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
354*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
355*333d2b36SAndroid Build Coastguard Worker		}`)
356*333d2b36SAndroid Build Coastguard Worker	ctx = result.TestContext
357*333d2b36SAndroid Build Coastguard Worker	module = ctx.ModuleForTests("foo", "android_common")
358*333d2b36SAndroid Build Coastguard Worker	library = module.Module().(*Library)
359*333d2b36SAndroid Build Coastguard Worker
360*333d2b36SAndroid Build Coastguard Worker	installs = library.dexpreopter.DexpreoptBuiltInstalledForApex()
361*333d2b36SAndroid Build Coastguard Worker
362*333d2b36SAndroid Build Coastguard Worker	android.AssertIntEquals(t, "install count", 0, len(installs))
363*333d2b36SAndroid Build Coastguard Worker}
364*333d2b36SAndroid Build Coastguard Worker
365*333d2b36SAndroid Build Coastguard Workerfunc filterDexpreoptEntriesList(entriesList []android.AndroidMkEntries) []android.AndroidMkEntries {
366*333d2b36SAndroid Build Coastguard Worker	var results []android.AndroidMkEntries
367*333d2b36SAndroid Build Coastguard Worker	for _, entries := range entriesList {
368*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(entries.EntryMap["LOCAL_MODULE"][0], "-dexpreopt-") {
369*333d2b36SAndroid Build Coastguard Worker			results = append(results, entries)
370*333d2b36SAndroid Build Coastguard Worker		}
371*333d2b36SAndroid Build Coastguard Worker	}
372*333d2b36SAndroid Build Coastguard Worker	return results
373*333d2b36SAndroid Build Coastguard Worker}
374*333d2b36SAndroid Build Coastguard Worker
375*333d2b36SAndroid Build Coastguard Workerfunc verifyEntries(t *testing.T, message string, expectedModule string,
376*333d2b36SAndroid Build Coastguard Worker	expectedPrebuiltModuleFile string, expectedModulePath string, expectedInstalledModuleStem string,
377*333d2b36SAndroid Build Coastguard Worker	entries android.AndroidMkEntries) {
378*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, message+" LOCAL_MODULE", expectedModule,
379*333d2b36SAndroid Build Coastguard Worker		entries.EntryMap["LOCAL_MODULE"][0])
380*333d2b36SAndroid Build Coastguard Worker
381*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, message+" LOCAL_MODULE_CLASS", "ETC",
382*333d2b36SAndroid Build Coastguard Worker		entries.EntryMap["LOCAL_MODULE_CLASS"][0])
383*333d2b36SAndroid Build Coastguard Worker
384*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, message+" LOCAL_PREBUILT_MODULE_FILE",
385*333d2b36SAndroid Build Coastguard Worker		entries.EntryMap["LOCAL_PREBUILT_MODULE_FILE"][0], expectedPrebuiltModuleFile)
386*333d2b36SAndroid Build Coastguard Worker
387*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, message+" LOCAL_MODULE_PATH",
388*333d2b36SAndroid Build Coastguard Worker		entries.EntryMap["LOCAL_MODULE_PATH"][0], expectedModulePath)
389*333d2b36SAndroid Build Coastguard Worker
390*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, message+" LOCAL_INSTALLED_MODULE_STEM",
391*333d2b36SAndroid Build Coastguard Worker		expectedInstalledModuleStem, entries.EntryMap["LOCAL_INSTALLED_MODULE_STEM"][0])
392*333d2b36SAndroid Build Coastguard Worker
393*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, message+" LOCAL_NOT_AVAILABLE_FOR_PLATFORM",
394*333d2b36SAndroid Build Coastguard Worker		"false", entries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"][0])
395*333d2b36SAndroid Build Coastguard Worker}
396*333d2b36SAndroid Build Coastguard Worker
397*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidMkEntriesForApex(t *testing.T) {
398*333d2b36SAndroid Build Coastguard Worker	preparers := android.GroupFixturePreparers(
399*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithDexpreopt,
400*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithFakeApexMutator,
401*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetApexSystemServerJars("com.android.apex1:service-foo"),
402*333d2b36SAndroid Build Coastguard Worker	)
403*333d2b36SAndroid Build Coastguard Worker
404*333d2b36SAndroid Build Coastguard Worker	// An APEX system server jar.
405*333d2b36SAndroid Build Coastguard Worker	result := preparers.RunTestWithBp(t, `
406*333d2b36SAndroid Build Coastguard Worker		java_library {
407*333d2b36SAndroid Build Coastguard Worker			name: "service-foo",
408*333d2b36SAndroid Build Coastguard Worker			installable: true,
409*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
410*333d2b36SAndroid Build Coastguard Worker			apex_available: ["com.android.apex1"],
411*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
412*333d2b36SAndroid Build Coastguard Worker		}`)
413*333d2b36SAndroid Build Coastguard Worker	ctx := result.TestContext
414*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("service-foo", "android_common_apex1000")
415*333d2b36SAndroid Build Coastguard Worker
416*333d2b36SAndroid Build Coastguard Worker	entriesList := android.AndroidMkEntriesForTest(t, ctx, module.Module())
417*333d2b36SAndroid Build Coastguard Worker	entriesList = filterDexpreoptEntriesList(entriesList)
418*333d2b36SAndroid Build Coastguard Worker
419*333d2b36SAndroid Build Coastguard Worker	android.AssertIntEquals(t, "entries count", 2, len(entriesList))
420*333d2b36SAndroid Build Coastguard Worker
421*333d2b36SAndroid Build Coastguard Worker	verifyEntries(t,
422*333d2b36SAndroid Build Coastguard Worker		"entriesList[0]",
423*333d2b36SAndroid Build Coastguard Worker		"[email protected]@[email protected]@classes.odex",
424*333d2b36SAndroid Build Coastguard Worker		"/dexpreopt/service-foo/oat/arm64/javalib.odex",
425*333d2b36SAndroid Build Coastguard Worker		"/system/framework/oat/arm64",
426*333d2b36SAndroid Build Coastguard Worker		"[email protected]@[email protected]@classes.odex",
427*333d2b36SAndroid Build Coastguard Worker		entriesList[0])
428*333d2b36SAndroid Build Coastguard Worker
429*333d2b36SAndroid Build Coastguard Worker	verifyEntries(t,
430*333d2b36SAndroid Build Coastguard Worker		"entriesList[1]",
431*333d2b36SAndroid Build Coastguard Worker		"[email protected]@[email protected]@classes.vdex",
432*333d2b36SAndroid Build Coastguard Worker		"/dexpreopt/service-foo/oat/arm64/javalib.vdex",
433*333d2b36SAndroid Build Coastguard Worker		"/system/framework/oat/arm64",
434*333d2b36SAndroid Build Coastguard Worker		"[email protected]@[email protected]@classes.vdex",
435*333d2b36SAndroid Build Coastguard Worker		entriesList[1])
436*333d2b36SAndroid Build Coastguard Worker
437*333d2b36SAndroid Build Coastguard Worker	// Not an APEX system server jar.
438*333d2b36SAndroid Build Coastguard Worker	result = preparers.RunTestWithBp(t, `
439*333d2b36SAndroid Build Coastguard Worker		java_library {
440*333d2b36SAndroid Build Coastguard Worker			name: "foo",
441*333d2b36SAndroid Build Coastguard Worker			installable: true,
442*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
443*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
444*333d2b36SAndroid Build Coastguard Worker		}`)
445*333d2b36SAndroid Build Coastguard Worker	ctx = result.TestContext
446*333d2b36SAndroid Build Coastguard Worker	module = ctx.ModuleForTests("foo", "android_common")
447*333d2b36SAndroid Build Coastguard Worker
448*333d2b36SAndroid Build Coastguard Worker	entriesList = android.AndroidMkEntriesForTest(t, ctx, module.Module())
449*333d2b36SAndroid Build Coastguard Worker	entriesList = filterDexpreoptEntriesList(entriesList)
450*333d2b36SAndroid Build Coastguard Worker
451*333d2b36SAndroid Build Coastguard Worker	android.AssertIntEquals(t, "entries count", 0, len(entriesList))
452*333d2b36SAndroid Build Coastguard Worker}
453*333d2b36SAndroid Build Coastguard Worker
454*333d2b36SAndroid Build Coastguard Workerfunc TestGenerateProfileEvenIfDexpreoptIsDisabled(t *testing.T) {
455*333d2b36SAndroid Build Coastguard Worker	preparers := android.GroupFixturePreparers(
456*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
457*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithFakeApexMutator,
458*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureDisableDexpreopt(true),
459*333d2b36SAndroid Build Coastguard Worker	)
460*333d2b36SAndroid Build Coastguard Worker
461*333d2b36SAndroid Build Coastguard Worker	result := preparers.RunTestWithBp(t, `
462*333d2b36SAndroid Build Coastguard Worker		java_library {
463*333d2b36SAndroid Build Coastguard Worker			name: "foo",
464*333d2b36SAndroid Build Coastguard Worker			installable: true,
465*333d2b36SAndroid Build Coastguard Worker			dex_preopt: {
466*333d2b36SAndroid Build Coastguard Worker				profile: "art-profile",
467*333d2b36SAndroid Build Coastguard Worker			},
468*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
469*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
470*333d2b36SAndroid Build Coastguard Worker		}`)
471*333d2b36SAndroid Build Coastguard Worker
472*333d2b36SAndroid Build Coastguard Worker	ctx := result.TestContext
473*333d2b36SAndroid Build Coastguard Worker	dexpreopt := ctx.ModuleForTests("foo", "android_common").MaybeRule("dexpreopt")
474*333d2b36SAndroid Build Coastguard Worker
475*333d2b36SAndroid Build Coastguard Worker	expected := []string{"out/soong/.intermediates/foo/android_common/dexpreopt/foo/profile.prof"}
476*333d2b36SAndroid Build Coastguard Worker
477*333d2b36SAndroid Build Coastguard Worker	android.AssertArrayString(t, "outputs", expected, dexpreopt.AllOutputs())
478*333d2b36SAndroid Build Coastguard Worker}
479