xref: /aosp_15_r20/build/soong/dexpreopt/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 dexpreopt
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
19*333d2b36SAndroid Build Coastguard Worker	"fmt"
20*333d2b36SAndroid Build Coastguard Worker	"testing"
21*333d2b36SAndroid Build Coastguard Worker)
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Workerfunc testSystemModuleConfig(ctx android.PathContext, name string) *ModuleConfig {
24*333d2b36SAndroid Build Coastguard Worker	return testModuleConfig(ctx, name, "system")
25*333d2b36SAndroid Build Coastguard Worker}
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Workerfunc testSystemProductModuleConfig(ctx android.PathContext, name string) *ModuleConfig {
28*333d2b36SAndroid Build Coastguard Worker	return testModuleConfig(ctx, name, "system/product")
29*333d2b36SAndroid Build Coastguard Worker}
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Workerfunc testProductModuleConfig(ctx android.PathContext, name string) *ModuleConfig {
32*333d2b36SAndroid Build Coastguard Worker	return testModuleConfig(ctx, name, "product")
33*333d2b36SAndroid Build Coastguard Worker}
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Workerfunc testModuleConfig(ctx android.PathContext, name, partition string) *ModuleConfig {
36*333d2b36SAndroid Build Coastguard Worker	return createTestModuleConfig(
37*333d2b36SAndroid Build Coastguard Worker		name,
38*333d2b36SAndroid Build Coastguard Worker		fmt.Sprintf("/%s/app/test/%s.apk", partition, name),
39*333d2b36SAndroid Build Coastguard Worker		android.PathForOutput(ctx, fmt.Sprintf("%s/%s.apk", name, name)),
40*333d2b36SAndroid Build Coastguard Worker		android.PathForOutput(ctx, fmt.Sprintf("%s/dex/%s.jar", name, name)),
41*333d2b36SAndroid Build Coastguard Worker		android.PathForOutput(ctx, fmt.Sprintf("%s/enforce_uses_libraries.status", name)))
42*333d2b36SAndroid Build Coastguard Worker}
43*333d2b36SAndroid Build Coastguard Worker
44*333d2b36SAndroid Build Coastguard Workerfunc testApexModuleConfig(ctx android.PathContext, name, apexName string) *ModuleConfig {
45*333d2b36SAndroid Build Coastguard Worker	ret := createTestModuleConfig(
46*333d2b36SAndroid Build Coastguard Worker		name,
47*333d2b36SAndroid Build Coastguard Worker		fmt.Sprintf("/apex/%s/javalib/%s.jar", apexName, name),
48*333d2b36SAndroid Build Coastguard Worker		android.PathForOutput(ctx, fmt.Sprintf("%s/dexpreopt/%s.jar", name, name)),
49*333d2b36SAndroid Build Coastguard Worker		android.PathForOutput(ctx, fmt.Sprintf("%s/aligned/%s.jar", name, name)),
50*333d2b36SAndroid Build Coastguard Worker		android.PathForOutput(ctx, fmt.Sprintf("%s/enforce_uses_libraries.status", name)))
51*333d2b36SAndroid Build Coastguard Worker	ret.ApexPartition = "/system"
52*333d2b36SAndroid Build Coastguard Worker	return ret
53*333d2b36SAndroid Build Coastguard Worker}
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Workerfunc testPlatformSystemServerModuleConfig(ctx android.PathContext, name string) *ModuleConfig {
56*333d2b36SAndroid Build Coastguard Worker	return createTestModuleConfig(
57*333d2b36SAndroid Build Coastguard Worker		name,
58*333d2b36SAndroid Build Coastguard Worker		fmt.Sprintf("/system/framework/%s.jar", name),
59*333d2b36SAndroid Build Coastguard Worker		android.PathForOutput(ctx, fmt.Sprintf("%s/dexpreopt/%s.jar", name, name)),
60*333d2b36SAndroid Build Coastguard Worker		android.PathForOutput(ctx, fmt.Sprintf("%s/aligned/%s.jar", name, name)),
61*333d2b36SAndroid Build Coastguard Worker		android.PathForOutput(ctx, fmt.Sprintf("%s/enforce_uses_libraries.status", name)))
62*333d2b36SAndroid Build Coastguard Worker}
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Workerfunc testSystemExtSystemServerModuleConfig(ctx android.PathContext, name string) *ModuleConfig {
65*333d2b36SAndroid Build Coastguard Worker	return createTestModuleConfig(
66*333d2b36SAndroid Build Coastguard Worker		name,
67*333d2b36SAndroid Build Coastguard Worker		fmt.Sprintf("/system_ext/framework/%s.jar", name),
68*333d2b36SAndroid Build Coastguard Worker		android.PathForOutput(ctx, fmt.Sprintf("%s/dexpreopt/%s.jar", name, name)),
69*333d2b36SAndroid Build Coastguard Worker		android.PathForOutput(ctx, fmt.Sprintf("%s/aligned/%s.jar", name, name)),
70*333d2b36SAndroid Build Coastguard Worker		android.PathForOutput(ctx, fmt.Sprintf("%s/enforce_uses_libraries.status", name)))
71*333d2b36SAndroid Build Coastguard Worker}
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Workerfunc createTestModuleConfig(name, dexLocation string, buildPath, dexPath, enforceUsesLibrariesStatusFile android.OutputPath) *ModuleConfig {
74*333d2b36SAndroid Build Coastguard Worker	return &ModuleConfig{
75*333d2b36SAndroid Build Coastguard Worker		Name:                            name,
76*333d2b36SAndroid Build Coastguard Worker		DexLocation:                     dexLocation,
77*333d2b36SAndroid Build Coastguard Worker		BuildPath:                       buildPath,
78*333d2b36SAndroid Build Coastguard Worker		DexPath:                         dexPath,
79*333d2b36SAndroid Build Coastguard Worker		UncompressedDex:                 false,
80*333d2b36SAndroid Build Coastguard Worker		HasApkLibraries:                 false,
81*333d2b36SAndroid Build Coastguard Worker		PreoptFlags:                     nil,
82*333d2b36SAndroid Build Coastguard Worker		ProfileClassListing:             android.OptionalPath{},
83*333d2b36SAndroid Build Coastguard Worker		ProfileIsTextListing:            false,
84*333d2b36SAndroid Build Coastguard Worker		EnforceUsesLibrariesStatusFile:  enforceUsesLibrariesStatusFile,
85*333d2b36SAndroid Build Coastguard Worker		EnforceUsesLibraries:            false,
86*333d2b36SAndroid Build Coastguard Worker		ClassLoaderContexts:             nil,
87*333d2b36SAndroid Build Coastguard Worker		Archs:                           []android.ArchType{android.Arm},
88*333d2b36SAndroid Build Coastguard Worker		DexPreoptImagesDeps:             []android.OutputPaths{android.OutputPaths{}},
89*333d2b36SAndroid Build Coastguard Worker		DexPreoptImageLocationsOnHost:   []string{},
90*333d2b36SAndroid Build Coastguard Worker		PreoptBootClassPathDexFiles:     nil,
91*333d2b36SAndroid Build Coastguard Worker		PreoptBootClassPathDexLocations: nil,
92*333d2b36SAndroid Build Coastguard Worker		NoCreateAppImage:                false,
93*333d2b36SAndroid Build Coastguard Worker		ForceCreateAppImage:             false,
94*333d2b36SAndroid Build Coastguard Worker		PresignedPrebuilt:               false,
95*333d2b36SAndroid Build Coastguard Worker	}
96*333d2b36SAndroid Build Coastguard Worker}
97*333d2b36SAndroid Build Coastguard Worker
98*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreopt(t *testing.T) {
99*333d2b36SAndroid Build Coastguard Worker	config := android.TestConfig("out", nil, "", nil)
100*333d2b36SAndroid Build Coastguard Worker	ctx := android.BuilderContextForTesting(config)
101*333d2b36SAndroid Build Coastguard Worker	globalSoong := globalSoongConfigForTests(ctx)
102*333d2b36SAndroid Build Coastguard Worker	global := GlobalConfigForTests(ctx)
103*333d2b36SAndroid Build Coastguard Worker	module := testSystemModuleConfig(ctx, "test")
104*333d2b36SAndroid Build Coastguard Worker	productPackages := android.PathForTesting("product_packages.txt")
105*333d2b36SAndroid Build Coastguard Worker
106*333d2b36SAndroid Build Coastguard Worker	rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, true)
107*333d2b36SAndroid Build Coastguard Worker	if err != nil {
108*333d2b36SAndroid Build Coastguard Worker		t.Fatal(err)
109*333d2b36SAndroid Build Coastguard Worker	}
110*333d2b36SAndroid Build Coastguard Worker
111*333d2b36SAndroid Build Coastguard Worker	wantInstalls := android.RuleBuilderInstalls{
112*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "test/oat/arm/package.odex"), "/system/app/test/oat/arm/test.odex"},
113*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "test/oat/arm/package.vdex"), "/system/app/test/oat/arm/test.vdex"},
114*333d2b36SAndroid Build Coastguard Worker	}
115*333d2b36SAndroid Build Coastguard Worker
116*333d2b36SAndroid Build Coastguard Worker	if rule.Installs().String() != wantInstalls.String() {
117*333d2b36SAndroid Build Coastguard Worker		t.Errorf("\nwant installs:\n   %v\ngot:\n   %v", wantInstalls, rule.Installs())
118*333d2b36SAndroid Build Coastguard Worker	}
119*333d2b36SAndroid Build Coastguard Worker
120*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "", rule.Inputs().RelativeToTop().Strings(),
121*333d2b36SAndroid Build Coastguard Worker		"out/soong/dexpreopt_test/uffd_gc_flag.txt")
122*333d2b36SAndroid Build Coastguard Worker}
123*333d2b36SAndroid Build Coastguard Worker
124*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptSystemOther(t *testing.T) {
125*333d2b36SAndroid Build Coastguard Worker	config := android.TestConfig("out", nil, "", nil)
126*333d2b36SAndroid Build Coastguard Worker	ctx := android.BuilderContextForTesting(config)
127*333d2b36SAndroid Build Coastguard Worker	globalSoong := globalSoongConfigForTests(ctx)
128*333d2b36SAndroid Build Coastguard Worker	global := GlobalConfigForTests(ctx)
129*333d2b36SAndroid Build Coastguard Worker	systemModule := testSystemModuleConfig(ctx, "Stest")
130*333d2b36SAndroid Build Coastguard Worker	systemProductModule := testSystemProductModuleConfig(ctx, "SPtest")
131*333d2b36SAndroid Build Coastguard Worker	productModule := testProductModuleConfig(ctx, "Ptest")
132*333d2b36SAndroid Build Coastguard Worker	productPackages := android.PathForTesting("product_packages.txt")
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Worker	global.HasSystemOther = true
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard Worker	type moduleTest struct {
137*333d2b36SAndroid Build Coastguard Worker		module            *ModuleConfig
138*333d2b36SAndroid Build Coastguard Worker		expectedPartition string
139*333d2b36SAndroid Build Coastguard Worker	}
140*333d2b36SAndroid Build Coastguard Worker	tests := []struct {
141*333d2b36SAndroid Build Coastguard Worker		patterns    []string
142*333d2b36SAndroid Build Coastguard Worker		moduleTests []moduleTest
143*333d2b36SAndroid Build Coastguard Worker	}{
144*333d2b36SAndroid Build Coastguard Worker		{
145*333d2b36SAndroid Build Coastguard Worker			patterns: []string{"app/%"},
146*333d2b36SAndroid Build Coastguard Worker			moduleTests: []moduleTest{
147*333d2b36SAndroid Build Coastguard Worker				{module: systemModule, expectedPartition: "system_other/system"},
148*333d2b36SAndroid Build Coastguard Worker				{module: systemProductModule, expectedPartition: "system/product"},
149*333d2b36SAndroid Build Coastguard Worker				{module: productModule, expectedPartition: "product"},
150*333d2b36SAndroid Build Coastguard Worker			},
151*333d2b36SAndroid Build Coastguard Worker		},
152*333d2b36SAndroid Build Coastguard Worker		// product/app/% only applies to product apps inside the system partition
153*333d2b36SAndroid Build Coastguard Worker		{
154*333d2b36SAndroid Build Coastguard Worker			patterns: []string{"app/%", "product/app/%"},
155*333d2b36SAndroid Build Coastguard Worker			moduleTests: []moduleTest{
156*333d2b36SAndroid Build Coastguard Worker				{module: systemModule, expectedPartition: "system_other/system"},
157*333d2b36SAndroid Build Coastguard Worker				{module: systemProductModule, expectedPartition: "system_other/system/product"},
158*333d2b36SAndroid Build Coastguard Worker				{module: productModule, expectedPartition: "system_other/product"},
159*333d2b36SAndroid Build Coastguard Worker			},
160*333d2b36SAndroid Build Coastguard Worker		},
161*333d2b36SAndroid Build Coastguard Worker	}
162*333d2b36SAndroid Build Coastguard Worker
163*333d2b36SAndroid Build Coastguard Worker	for _, test := range tests {
164*333d2b36SAndroid Build Coastguard Worker		global.PatternsOnSystemOther = test.patterns
165*333d2b36SAndroid Build Coastguard Worker		for _, mt := range test.moduleTests {
166*333d2b36SAndroid Build Coastguard Worker			rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, mt.module, productPackages, true)
167*333d2b36SAndroid Build Coastguard Worker			if err != nil {
168*333d2b36SAndroid Build Coastguard Worker				t.Fatal(err)
169*333d2b36SAndroid Build Coastguard Worker			}
170*333d2b36SAndroid Build Coastguard Worker
171*333d2b36SAndroid Build Coastguard Worker			name := mt.module.Name
172*333d2b36SAndroid Build Coastguard Worker			wantInstalls := android.RuleBuilderInstalls{
173*333d2b36SAndroid Build Coastguard Worker				{android.PathForOutput(ctx, name+"/oat/arm/package.odex"), fmt.Sprintf("/%s/app/test/oat/arm/%s.odex", mt.expectedPartition, name)},
174*333d2b36SAndroid Build Coastguard Worker				{android.PathForOutput(ctx, name+"/oat/arm/package.vdex"), fmt.Sprintf("/%s/app/test/oat/arm/%s.vdex", mt.expectedPartition, name)},
175*333d2b36SAndroid Build Coastguard Worker			}
176*333d2b36SAndroid Build Coastguard Worker
177*333d2b36SAndroid Build Coastguard Worker			if rule.Installs().String() != wantInstalls.String() {
178*333d2b36SAndroid Build Coastguard Worker				t.Errorf("\nwant installs:\n   %v\ngot:\n   %v", wantInstalls, rule.Installs())
179*333d2b36SAndroid Build Coastguard Worker			}
180*333d2b36SAndroid Build Coastguard Worker		}
181*333d2b36SAndroid Build Coastguard Worker	}
182*333d2b36SAndroid Build Coastguard Worker
183*333d2b36SAndroid Build Coastguard Worker}
184*333d2b36SAndroid Build Coastguard Worker
185*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptApexSystemServerJars(t *testing.T) {
186*333d2b36SAndroid Build Coastguard Worker	// modify the global variable for test
187*333d2b36SAndroid Build Coastguard Worker	var oldDexpreoptRunningInSoong = DexpreoptRunningInSoong
188*333d2b36SAndroid Build Coastguard Worker	DexpreoptRunningInSoong = true
189*333d2b36SAndroid Build Coastguard Worker
190*333d2b36SAndroid Build Coastguard Worker	// test begin
191*333d2b36SAndroid Build Coastguard Worker	config := android.TestConfig("out", nil, "", nil)
192*333d2b36SAndroid Build Coastguard Worker	ctx := android.BuilderContextForTesting(config)
193*333d2b36SAndroid Build Coastguard Worker	globalSoong := globalSoongConfigForTests(ctx)
194*333d2b36SAndroid Build Coastguard Worker	global := GlobalConfigForTests(ctx)
195*333d2b36SAndroid Build Coastguard Worker	module := testApexModuleConfig(ctx, "service-A", "com.android.apex1")
196*333d2b36SAndroid Build Coastguard Worker	productPackages := android.PathForTesting("product_packages.txt")
197*333d2b36SAndroid Build Coastguard Worker
198*333d2b36SAndroid Build Coastguard Worker	global.ApexSystemServerJars = android.CreateTestConfiguredJarList(
199*333d2b36SAndroid Build Coastguard Worker		[]string{"com.android.apex1:service-A"})
200*333d2b36SAndroid Build Coastguard Worker
201*333d2b36SAndroid Build Coastguard Worker	rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, true)
202*333d2b36SAndroid Build Coastguard Worker	if err != nil {
203*333d2b36SAndroid Build Coastguard Worker		t.Fatal(err)
204*333d2b36SAndroid Build Coastguard Worker	}
205*333d2b36SAndroid Build Coastguard Worker
206*333d2b36SAndroid Build Coastguard Worker	wantInstalls := android.RuleBuilderInstalls{
207*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.odex"), "/system/framework/oat/arm/apex@com.android.apex1@[email protected]@classes.odex"},
208*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.vdex"), "/system/framework/oat/arm/apex@com.android.apex1@[email protected]@classes.vdex"},
209*333d2b36SAndroid Build Coastguard Worker	}
210*333d2b36SAndroid Build Coastguard Worker
211*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "installs", wantInstalls.String(), rule.Installs().String())
212*333d2b36SAndroid Build Coastguard Worker
213*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "apex sscp jar copy", rule.Outputs().Strings(), "out/soong/system_server_dexjars/service-A.jar")
214*333d2b36SAndroid Build Coastguard Worker
215*333d2b36SAndroid Build Coastguard Worker	// rule with apex sscp cp as false
216*333d2b36SAndroid Build Coastguard Worker	rule, err = GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, false)
217*333d2b36SAndroid Build Coastguard Worker	if err != nil {
218*333d2b36SAndroid Build Coastguard Worker		t.Fatal(err)
219*333d2b36SAndroid Build Coastguard Worker	}
220*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListDoesNotContain(t, "apex sscp jar copy", rule.Outputs().Strings(), "out/soong/system_server_dexjars/service-A.jar")
221*333d2b36SAndroid Build Coastguard Worker
222*333d2b36SAndroid Build Coastguard Worker	// cleanup the global variable for test
223*333d2b36SAndroid Build Coastguard Worker	DexpreoptRunningInSoong = oldDexpreoptRunningInSoong
224*333d2b36SAndroid Build Coastguard Worker}
225*333d2b36SAndroid Build Coastguard Worker
226*333d2b36SAndroid Build Coastguard Worker// Same as `TestDexPreoptApexSystemServerJars`, but the apex jar is in /system_ext
227*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptApexSystemServerJarsSystemExt(t *testing.T) {
228*333d2b36SAndroid Build Coastguard Worker	// modify the global variable for test
229*333d2b36SAndroid Build Coastguard Worker	var oldDexpreoptRunningInSoong = DexpreoptRunningInSoong
230*333d2b36SAndroid Build Coastguard Worker	DexpreoptRunningInSoong = true
231*333d2b36SAndroid Build Coastguard Worker
232*333d2b36SAndroid Build Coastguard Worker	// test begin
233*333d2b36SAndroid Build Coastguard Worker	config := android.TestConfig("out", nil, "", nil)
234*333d2b36SAndroid Build Coastguard Worker	ctx := android.BuilderContextForTesting(config)
235*333d2b36SAndroid Build Coastguard Worker	globalSoong := globalSoongConfigForTests(ctx)
236*333d2b36SAndroid Build Coastguard Worker	global := GlobalConfigForTests(ctx)
237*333d2b36SAndroid Build Coastguard Worker	module := testApexModuleConfig(ctx, "service-A", "com.android.apex1")
238*333d2b36SAndroid Build Coastguard Worker	module.ApexPartition = "/system_ext"
239*333d2b36SAndroid Build Coastguard Worker	productPackages := android.PathForTesting("product_packages.txt")
240*333d2b36SAndroid Build Coastguard Worker
241*333d2b36SAndroid Build Coastguard Worker	global.ApexSystemServerJars = android.CreateTestConfiguredJarList(
242*333d2b36SAndroid Build Coastguard Worker		[]string{"com.android.apex1:service-A"})
243*333d2b36SAndroid Build Coastguard Worker
244*333d2b36SAndroid Build Coastguard Worker	rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, true)
245*333d2b36SAndroid Build Coastguard Worker	if err != nil {
246*333d2b36SAndroid Build Coastguard Worker		t.Fatal(err)
247*333d2b36SAndroid Build Coastguard Worker	}
248*333d2b36SAndroid Build Coastguard Worker
249*333d2b36SAndroid Build Coastguard Worker	wantInstalls := android.RuleBuilderInstalls{
250*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.odex"), "/system_ext/framework/oat/arm/apex@com.android.apex1@[email protected]@classes.odex"},
251*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.vdex"), "/system_ext/framework/oat/arm/apex@com.android.apex1@[email protected]@classes.vdex"},
252*333d2b36SAndroid Build Coastguard Worker	}
253*333d2b36SAndroid Build Coastguard Worker
254*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "installs", wantInstalls.String(), rule.Installs().String())
255*333d2b36SAndroid Build Coastguard Worker
256*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "apex sscp jar copy", rule.Outputs().Strings(), "out/soong/system_server_dexjars/service-A.jar")
257*333d2b36SAndroid Build Coastguard Worker
258*333d2b36SAndroid Build Coastguard Worker	// rule with apex sscp cp as false
259*333d2b36SAndroid Build Coastguard Worker	rule, err = GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, false)
260*333d2b36SAndroid Build Coastguard Worker	if err != nil {
261*333d2b36SAndroid Build Coastguard Worker		t.Fatal(err)
262*333d2b36SAndroid Build Coastguard Worker	}
263*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListDoesNotContain(t, "apex sscp jar copy", rule.Outputs().Strings(), "out/soong/system_server_dexjars/service-A.jar")
264*333d2b36SAndroid Build Coastguard Worker
265*333d2b36SAndroid Build Coastguard Worker	// cleanup the global variable for test
266*333d2b36SAndroid Build Coastguard Worker	DexpreoptRunningInSoong = oldDexpreoptRunningInSoong
267*333d2b36SAndroid Build Coastguard Worker}
268*333d2b36SAndroid Build Coastguard Worker
269*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptStandaloneSystemServerJars(t *testing.T) {
270*333d2b36SAndroid Build Coastguard Worker	config := android.TestConfig("out", nil, "", nil)
271*333d2b36SAndroid Build Coastguard Worker	ctx := android.BuilderContextForTesting(config)
272*333d2b36SAndroid Build Coastguard Worker	globalSoong := globalSoongConfigForTests(ctx)
273*333d2b36SAndroid Build Coastguard Worker	global := GlobalConfigForTests(ctx)
274*333d2b36SAndroid Build Coastguard Worker	module := testPlatformSystemServerModuleConfig(ctx, "service-A")
275*333d2b36SAndroid Build Coastguard Worker	productPackages := android.PathForTesting("product_packages.txt")
276*333d2b36SAndroid Build Coastguard Worker
277*333d2b36SAndroid Build Coastguard Worker	global.StandaloneSystemServerJars = android.CreateTestConfiguredJarList(
278*333d2b36SAndroid Build Coastguard Worker		[]string{"platform:service-A"})
279*333d2b36SAndroid Build Coastguard Worker
280*333d2b36SAndroid Build Coastguard Worker	rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, true)
281*333d2b36SAndroid Build Coastguard Worker	if err != nil {
282*333d2b36SAndroid Build Coastguard Worker		t.Fatal(err)
283*333d2b36SAndroid Build Coastguard Worker	}
284*333d2b36SAndroid Build Coastguard Worker
285*333d2b36SAndroid Build Coastguard Worker	wantInstalls := android.RuleBuilderInstalls{
286*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.odex"), "/system/framework/oat/arm/service-A.odex"},
287*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.vdex"), "/system/framework/oat/arm/service-A.vdex"},
288*333d2b36SAndroid Build Coastguard Worker	}
289*333d2b36SAndroid Build Coastguard Worker
290*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "installs", wantInstalls.String(), rule.Installs().String())
291*333d2b36SAndroid Build Coastguard Worker}
292*333d2b36SAndroid Build Coastguard Worker
293*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptSystemExtSystemServerJars(t *testing.T) {
294*333d2b36SAndroid Build Coastguard Worker	config := android.TestConfig("out", nil, "", nil)
295*333d2b36SAndroid Build Coastguard Worker	ctx := android.BuilderContextForTesting(config)
296*333d2b36SAndroid Build Coastguard Worker	globalSoong := globalSoongConfigForTests(ctx)
297*333d2b36SAndroid Build Coastguard Worker	global := GlobalConfigForTests(ctx)
298*333d2b36SAndroid Build Coastguard Worker	module := testSystemExtSystemServerModuleConfig(ctx, "service-A")
299*333d2b36SAndroid Build Coastguard Worker	productPackages := android.PathForTesting("product_packages.txt")
300*333d2b36SAndroid Build Coastguard Worker
301*333d2b36SAndroid Build Coastguard Worker	global.StandaloneSystemServerJars = android.CreateTestConfiguredJarList(
302*333d2b36SAndroid Build Coastguard Worker		[]string{"system_ext:service-A"})
303*333d2b36SAndroid Build Coastguard Worker
304*333d2b36SAndroid Build Coastguard Worker	rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, true)
305*333d2b36SAndroid Build Coastguard Worker	if err != nil {
306*333d2b36SAndroid Build Coastguard Worker		t.Fatal(err)
307*333d2b36SAndroid Build Coastguard Worker	}
308*333d2b36SAndroid Build Coastguard Worker
309*333d2b36SAndroid Build Coastguard Worker	wantInstalls := android.RuleBuilderInstalls{
310*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.odex"), "/system_ext/framework/oat/arm/service-A.odex"},
311*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.vdex"), "/system_ext/framework/oat/arm/service-A.vdex"},
312*333d2b36SAndroid Build Coastguard Worker	}
313*333d2b36SAndroid Build Coastguard Worker
314*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "installs", wantInstalls.String(), rule.Installs().String())
315*333d2b36SAndroid Build Coastguard Worker}
316*333d2b36SAndroid Build Coastguard Worker
317*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptApexStandaloneSystemServerJars(t *testing.T) {
318*333d2b36SAndroid Build Coastguard Worker	config := android.TestConfig("out", nil, "", nil)
319*333d2b36SAndroid Build Coastguard Worker	ctx := android.BuilderContextForTesting(config)
320*333d2b36SAndroid Build Coastguard Worker	globalSoong := globalSoongConfigForTests(ctx)
321*333d2b36SAndroid Build Coastguard Worker	global := GlobalConfigForTests(ctx)
322*333d2b36SAndroid Build Coastguard Worker	module := testApexModuleConfig(ctx, "service-A", "com.android.apex1")
323*333d2b36SAndroid Build Coastguard Worker	productPackages := android.PathForTesting("product_packages.txt")
324*333d2b36SAndroid Build Coastguard Worker
325*333d2b36SAndroid Build Coastguard Worker	global.ApexStandaloneSystemServerJars = android.CreateTestConfiguredJarList(
326*333d2b36SAndroid Build Coastguard Worker		[]string{"com.android.apex1:service-A"})
327*333d2b36SAndroid Build Coastguard Worker
328*333d2b36SAndroid Build Coastguard Worker	rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, true)
329*333d2b36SAndroid Build Coastguard Worker	if err != nil {
330*333d2b36SAndroid Build Coastguard Worker		t.Fatal(err)
331*333d2b36SAndroid Build Coastguard Worker	}
332*333d2b36SAndroid Build Coastguard Worker
333*333d2b36SAndroid Build Coastguard Worker	wantInstalls := android.RuleBuilderInstalls{
334*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.odex"), "/system/framework/oat/arm/apex@com.android.apex1@[email protected]@classes.odex"},
335*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.vdex"), "/system/framework/oat/arm/apex@com.android.apex1@[email protected]@classes.vdex"},
336*333d2b36SAndroid Build Coastguard Worker	}
337*333d2b36SAndroid Build Coastguard Worker
338*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "installs", wantInstalls.String(), rule.Installs().String())
339*333d2b36SAndroid Build Coastguard Worker}
340*333d2b36SAndroid Build Coastguard Worker
341*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptProfile(t *testing.T) {
342*333d2b36SAndroid Build Coastguard Worker	config := android.TestConfig("out", nil, "", nil)
343*333d2b36SAndroid Build Coastguard Worker	ctx := android.BuilderContextForTesting(config)
344*333d2b36SAndroid Build Coastguard Worker	globalSoong := globalSoongConfigForTests(ctx)
345*333d2b36SAndroid Build Coastguard Worker	global := GlobalConfigForTests(ctx)
346*333d2b36SAndroid Build Coastguard Worker	module := testSystemModuleConfig(ctx, "test")
347*333d2b36SAndroid Build Coastguard Worker	productPackages := android.PathForTesting("product_packages.txt")
348*333d2b36SAndroid Build Coastguard Worker
349*333d2b36SAndroid Build Coastguard Worker	module.ProfileClassListing = android.OptionalPathForPath(android.PathForTesting("profile"))
350*333d2b36SAndroid Build Coastguard Worker
351*333d2b36SAndroid Build Coastguard Worker	rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, true)
352*333d2b36SAndroid Build Coastguard Worker	if err != nil {
353*333d2b36SAndroid Build Coastguard Worker		t.Fatal(err)
354*333d2b36SAndroid Build Coastguard Worker	}
355*333d2b36SAndroid Build Coastguard Worker
356*333d2b36SAndroid Build Coastguard Worker	wantInstalls := android.RuleBuilderInstalls{
357*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "test/profile.prof"), "/system/app/test/test.apk.prof"},
358*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "test/oat/arm/package.art"), "/system/app/test/oat/arm/test.art"},
359*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "test/oat/arm/package.odex"), "/system/app/test/oat/arm/test.odex"},
360*333d2b36SAndroid Build Coastguard Worker		{android.PathForOutput(ctx, "test/oat/arm/package.vdex"), "/system/app/test/oat/arm/test.vdex"},
361*333d2b36SAndroid Build Coastguard Worker	}
362*333d2b36SAndroid Build Coastguard Worker
363*333d2b36SAndroid Build Coastguard Worker	if rule.Installs().String() != wantInstalls.String() {
364*333d2b36SAndroid Build Coastguard Worker		t.Errorf("\nwant installs:\n   %v\ngot:\n   %v", wantInstalls, rule.Installs())
365*333d2b36SAndroid Build Coastguard Worker	}
366*333d2b36SAndroid Build Coastguard Worker}
367*333d2b36SAndroid Build Coastguard Worker
368*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptConfigToJson(t *testing.T) {
369*333d2b36SAndroid Build Coastguard Worker	config := android.TestConfig("out", nil, "", nil)
370*333d2b36SAndroid Build Coastguard Worker	ctx := android.BuilderContextForTesting(config)
371*333d2b36SAndroid Build Coastguard Worker	module := testSystemModuleConfig(ctx, "test")
372*333d2b36SAndroid Build Coastguard Worker	data, err := moduleConfigToJSON(module)
373*333d2b36SAndroid Build Coastguard Worker	if err != nil {
374*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Failed to convert module config data to JSON, %v", err)
375*333d2b36SAndroid Build Coastguard Worker	}
376*333d2b36SAndroid Build Coastguard Worker	parsed, err := ParseModuleConfig(ctx, data)
377*333d2b36SAndroid Build Coastguard Worker	if err != nil {
378*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Failed to parse JSON, %v", err)
379*333d2b36SAndroid Build Coastguard Worker	}
380*333d2b36SAndroid Build Coastguard Worker	before := fmt.Sprintf("%v", module)
381*333d2b36SAndroid Build Coastguard Worker	after := fmt.Sprintf("%v", parsed)
382*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "The result must be the same as the original after marshalling and unmarshalling it.", before, after)
383*333d2b36SAndroid Build Coastguard Worker}
384*333d2b36SAndroid Build Coastguard Worker
385*333d2b36SAndroid Build Coastguard Workerfunc TestUffdGcFlagForce(t *testing.T) {
386*333d2b36SAndroid Build Coastguard Worker	for _, enableUffdGc := range []string{"true", "false"} {
387*333d2b36SAndroid Build Coastguard Worker		t.Run(enableUffdGc, func(t *testing.T) {
388*333d2b36SAndroid Build Coastguard Worker			preparers := android.GroupFixturePreparers(
389*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithFakeDex2oatd,
390*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithDexpreoptConfig,
391*333d2b36SAndroid Build Coastguard Worker				FixtureSetEnableUffdGc(enableUffdGc),
392*333d2b36SAndroid Build Coastguard Worker			)
393*333d2b36SAndroid Build Coastguard Worker
394*333d2b36SAndroid Build Coastguard Worker			result := preparers.RunTest(t)
395*333d2b36SAndroid Build Coastguard Worker			ctx := result.TestContext
396*333d2b36SAndroid Build Coastguard Worker
397*333d2b36SAndroid Build Coastguard Worker			ctx.SingletonForTests("dexpreopt-soong-config").Output("out/soong/dexpreopt/uffd_gc_flag.txt")
398*333d2b36SAndroid Build Coastguard Worker		})
399*333d2b36SAndroid Build Coastguard Worker	}
400*333d2b36SAndroid Build Coastguard Worker}
401*333d2b36SAndroid Build Coastguard Worker
402*333d2b36SAndroid Build Coastguard Workerfunc TestUffdGcFlagDefault(t *testing.T) {
403*333d2b36SAndroid Build Coastguard Worker	preparers := android.GroupFixturePreparers(
404*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithFakeDex2oatd,
405*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithDexpreoptConfig,
406*333d2b36SAndroid Build Coastguard Worker		FixtureSetEnableUffdGc("default"),
407*333d2b36SAndroid Build Coastguard Worker	)
408*333d2b36SAndroid Build Coastguard Worker
409*333d2b36SAndroid Build Coastguard Worker	result := preparers.RunTest(t)
410*333d2b36SAndroid Build Coastguard Worker	ctx := result.TestContext
411*333d2b36SAndroid Build Coastguard Worker	config := ctx.Config()
412*333d2b36SAndroid Build Coastguard Worker
413*333d2b36SAndroid Build Coastguard Worker	rule := ctx.SingletonForTests("dexpreopt-soong-config").Rule("dexpreopt_uffd_gc_flag")
414*333d2b36SAndroid Build Coastguard Worker
415*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "", rule.RuleParams.Command, "construct_uffd_gc_flag")
416*333d2b36SAndroid Build Coastguard Worker	android.AssertStringPathsRelativeToTopEquals(t, "", config, []string{
417*333d2b36SAndroid Build Coastguard Worker		"out/soong/dexpreopt/uffd_gc_flag.txt",
418*333d2b36SAndroid Build Coastguard Worker	}, rule.AllOutputs())
419*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "", []string{
420*333d2b36SAndroid Build Coastguard Worker		"out/soong/dexpreopt/kernel_version_for_uffd_gc.txt",
421*333d2b36SAndroid Build Coastguard Worker	}, rule.Implicits)
422*333d2b36SAndroid Build Coastguard Worker}
423*333d2b36SAndroid Build Coastguard Worker
424*333d2b36SAndroid Build Coastguard Workerfunc TestUffdGcFlagBogus(t *testing.T) {
425*333d2b36SAndroid Build Coastguard Worker	preparers := android.GroupFixturePreparers(
426*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithFakeDex2oatd,
427*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithDexpreoptConfig,
428*333d2b36SAndroid Build Coastguard Worker		FixtureSetEnableUffdGc("bogus"),
429*333d2b36SAndroid Build Coastguard Worker	)
430*333d2b36SAndroid Build Coastguard Worker
431*333d2b36SAndroid Build Coastguard Worker	preparers.
432*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
433*333d2b36SAndroid Build Coastguard Worker			"Unknown value of PRODUCT_ENABLE_UFFD_GC: bogus")).
434*333d2b36SAndroid Build Coastguard Worker		RunTest(t)
435*333d2b36SAndroid Build Coastguard Worker}
436