xref: /aosp_15_r20/build/soong/apex/systemserver_classpath_fragment_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright (C) 2021 The Android Open Source Project
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 apex
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"strings"
19*333d2b36SAndroid Build Coastguard Worker	"testing"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
22*333d2b36SAndroid Build Coastguard Worker	"android/soong/dexpreopt"
23*333d2b36SAndroid Build Coastguard Worker	"android/soong/java"
24*333d2b36SAndroid Build Coastguard Worker)
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithSystemserverclasspathFragment = android.GroupFixturePreparers(
27*333d2b36SAndroid Build Coastguard Worker	java.PrepareForTestWithDexpreopt,
28*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithApexBuildComponents,
29*333d2b36SAndroid Build Coastguard Worker)
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Workerfunc TestSystemserverclasspathFragmentContents(t *testing.T) {
32*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
33*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
34*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithSystemserverclasspathFragment,
35*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
36*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetApexSystemServerJars("myapex:foo", "myapex:bar", "myapex:baz"),
37*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
38*333d2b36SAndroid Build Coastguard Worker		apex {
39*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
40*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
41*333d2b36SAndroid Build Coastguard Worker			systemserverclasspath_fragments: [
42*333d2b36SAndroid Build Coastguard Worker				"mysystemserverclasspathfragment",
43*333d2b36SAndroid Build Coastguard Worker			],
44*333d2b36SAndroid Build Coastguard Worker			updatable: false,
45*333d2b36SAndroid Build Coastguard Worker		}
46*333d2b36SAndroid Build Coastguard Worker
47*333d2b36SAndroid Build Coastguard Worker		apex_key {
48*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
49*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
50*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
51*333d2b36SAndroid Build Coastguard Worker		}
52*333d2b36SAndroid Build Coastguard Worker
53*333d2b36SAndroid Build Coastguard Worker		java_library {
54*333d2b36SAndroid Build Coastguard Worker			name: "foo",
55*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
56*333d2b36SAndroid Build Coastguard Worker			installable: true,
57*333d2b36SAndroid Build Coastguard Worker			apex_available: [
58*333d2b36SAndroid Build Coastguard Worker				"myapex",
59*333d2b36SAndroid Build Coastguard Worker			],
60*333d2b36SAndroid Build Coastguard Worker		}
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Worker		java_library {
63*333d2b36SAndroid Build Coastguard Worker			name: "bar",
64*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
65*333d2b36SAndroid Build Coastguard Worker			installable: true,
66*333d2b36SAndroid Build Coastguard Worker			dex_preopt: {
67*333d2b36SAndroid Build Coastguard Worker				profile: "bar-art-profile",
68*333d2b36SAndroid Build Coastguard Worker			},
69*333d2b36SAndroid Build Coastguard Worker			apex_available: [
70*333d2b36SAndroid Build Coastguard Worker				"myapex",
71*333d2b36SAndroid Build Coastguard Worker			],
72*333d2b36SAndroid Build Coastguard Worker		}
73*333d2b36SAndroid Build Coastguard Worker
74*333d2b36SAndroid Build Coastguard Worker		java_library {
75*333d2b36SAndroid Build Coastguard Worker			name: "baz",
76*333d2b36SAndroid Build Coastguard Worker			srcs: ["d.java"],
77*333d2b36SAndroid Build Coastguard Worker			installable: true,
78*333d2b36SAndroid Build Coastguard Worker			dex_preopt: {
79*333d2b36SAndroid Build Coastguard Worker				profile_guided: true, // ignored
80*333d2b36SAndroid Build Coastguard Worker			},
81*333d2b36SAndroid Build Coastguard Worker			apex_available: [
82*333d2b36SAndroid Build Coastguard Worker				"myapex",
83*333d2b36SAndroid Build Coastguard Worker			],
84*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_current",
85*333d2b36SAndroid Build Coastguard Worker		}
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker		systemserverclasspath_fragment {
88*333d2b36SAndroid Build Coastguard Worker			name: "mysystemserverclasspathfragment",
89*333d2b36SAndroid Build Coastguard Worker			contents: [
90*333d2b36SAndroid Build Coastguard Worker				"foo",
91*333d2b36SAndroid Build Coastguard Worker				"bar",
92*333d2b36SAndroid Build Coastguard Worker				"baz",
93*333d2b36SAndroid Build Coastguard Worker			],
94*333d2b36SAndroid Build Coastguard Worker			apex_available: [
95*333d2b36SAndroid Build Coastguard Worker				"myapex",
96*333d2b36SAndroid Build Coastguard Worker			],
97*333d2b36SAndroid Build Coastguard Worker		}
98*333d2b36SAndroid Build Coastguard Worker	`)
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Worker	ctx := result.TestContext
101*333d2b36SAndroid Build Coastguard Worker
102*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
103*333d2b36SAndroid Build Coastguard Worker		"etc/classpaths/systemserverclasspath.pb",
104*333d2b36SAndroid Build Coastguard Worker		"javalib/foo.jar",
105*333d2b36SAndroid Build Coastguard Worker		"javalib/bar.jar",
106*333d2b36SAndroid Build Coastguard Worker		"javalib/bar.jar.prof",
107*333d2b36SAndroid Build Coastguard Worker		"javalib/baz.jar",
108*333d2b36SAndroid Build Coastguard Worker	})
109*333d2b36SAndroid Build Coastguard Worker
110*333d2b36SAndroid Build Coastguard Worker	java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex", []string{
111*333d2b36SAndroid Build Coastguard Worker		`dex2oatd`,
112*333d2b36SAndroid Build Coastguard Worker		`myapex.key`,
113*333d2b36SAndroid Build Coastguard Worker		`mysystemserverclasspathfragment`,
114*333d2b36SAndroid Build Coastguard Worker	})
115*333d2b36SAndroid Build Coastguard Worker
116*333d2b36SAndroid Build Coastguard Worker	assertProfileGuided(t, ctx, "foo", "android_common_apex10000", false)
117*333d2b36SAndroid Build Coastguard Worker	assertProfileGuided(t, ctx, "bar", "android_common_apex10000", true)
118*333d2b36SAndroid Build Coastguard Worker	assertProfileGuided(t, ctx, "baz", "android_common_apex10000", false)
119*333d2b36SAndroid Build Coastguard Worker}
120*333d2b36SAndroid Build Coastguard Worker
121*333d2b36SAndroid Build Coastguard Workerfunc TestSystemserverclasspathFragmentNoGeneratedProto(t *testing.T) {
122*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
123*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
124*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithSystemserverclasspathFragment,
125*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
126*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
127*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
128*333d2b36SAndroid Build Coastguard Worker		apex {
129*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
130*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
131*333d2b36SAndroid Build Coastguard Worker			systemserverclasspath_fragments: [
132*333d2b36SAndroid Build Coastguard Worker				"mysystemserverclasspathfragment",
133*333d2b36SAndroid Build Coastguard Worker			],
134*333d2b36SAndroid Build Coastguard Worker			updatable: false,
135*333d2b36SAndroid Build Coastguard Worker		}
136*333d2b36SAndroid Build Coastguard Worker
137*333d2b36SAndroid Build Coastguard Worker		apex_key {
138*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
139*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
140*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
141*333d2b36SAndroid Build Coastguard Worker		}
142*333d2b36SAndroid Build Coastguard Worker
143*333d2b36SAndroid Build Coastguard Worker		java_library {
144*333d2b36SAndroid Build Coastguard Worker			name: "foo",
145*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
146*333d2b36SAndroid Build Coastguard Worker			installable: true,
147*333d2b36SAndroid Build Coastguard Worker			apex_available: [
148*333d2b36SAndroid Build Coastguard Worker				"myapex",
149*333d2b36SAndroid Build Coastguard Worker			],
150*333d2b36SAndroid Build Coastguard Worker		}
151*333d2b36SAndroid Build Coastguard Worker
152*333d2b36SAndroid Build Coastguard Worker		systemserverclasspath_fragment {
153*333d2b36SAndroid Build Coastguard Worker			name: "mysystemserverclasspathfragment",
154*333d2b36SAndroid Build Coastguard Worker			generate_classpaths_proto: false,
155*333d2b36SAndroid Build Coastguard Worker			contents: [
156*333d2b36SAndroid Build Coastguard Worker				"foo",
157*333d2b36SAndroid Build Coastguard Worker			],
158*333d2b36SAndroid Build Coastguard Worker			apex_available: [
159*333d2b36SAndroid Build Coastguard Worker				"myapex",
160*333d2b36SAndroid Build Coastguard Worker			],
161*333d2b36SAndroid Build Coastguard Worker		}
162*333d2b36SAndroid Build Coastguard Worker	`)
163*333d2b36SAndroid Build Coastguard Worker
164*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
165*333d2b36SAndroid Build Coastguard Worker		"javalib/foo.jar",
166*333d2b36SAndroid Build Coastguard Worker	})
167*333d2b36SAndroid Build Coastguard Worker
168*333d2b36SAndroid Build Coastguard Worker	java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex", []string{
169*333d2b36SAndroid Build Coastguard Worker		`dex2oatd`,
170*333d2b36SAndroid Build Coastguard Worker		`myapex.key`,
171*333d2b36SAndroid Build Coastguard Worker		`mysystemserverclasspathfragment`,
172*333d2b36SAndroid Build Coastguard Worker	})
173*333d2b36SAndroid Build Coastguard Worker}
174*333d2b36SAndroid Build Coastguard Worker
175*333d2b36SAndroid Build Coastguard Workerfunc TestSystemServerClasspathFragmentWithContentNotInMake(t *testing.T) {
176*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
177*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
178*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithSystemserverclasspathFragment,
179*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
180*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
181*333d2b36SAndroid Build Coastguard Worker	).
182*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
183*333d2b36SAndroid Build Coastguard Worker			`in contents must also be declared in PRODUCT_APEX_SYSTEM_SERVER_JARS`)).
184*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
185*333d2b36SAndroid Build Coastguard Worker			apex {
186*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
187*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
188*333d2b36SAndroid Build Coastguard Worker				systemserverclasspath_fragments: [
189*333d2b36SAndroid Build Coastguard Worker					"mysystemserverclasspathfragment",
190*333d2b36SAndroid Build Coastguard Worker				],
191*333d2b36SAndroid Build Coastguard Worker				updatable: false,
192*333d2b36SAndroid Build Coastguard Worker			}
193*333d2b36SAndroid Build Coastguard Worker
194*333d2b36SAndroid Build Coastguard Worker			apex_key {
195*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
196*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
197*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
198*333d2b36SAndroid Build Coastguard Worker			}
199*333d2b36SAndroid Build Coastguard Worker
200*333d2b36SAndroid Build Coastguard Worker			java_library {
201*333d2b36SAndroid Build Coastguard Worker				name: "foo",
202*333d2b36SAndroid Build Coastguard Worker				srcs: ["b.java"],
203*333d2b36SAndroid Build Coastguard Worker				installable: true,
204*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
205*333d2b36SAndroid Build Coastguard Worker			}
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Worker			java_library {
208*333d2b36SAndroid Build Coastguard Worker				name: "bar",
209*333d2b36SAndroid Build Coastguard Worker				srcs: ["b.java"],
210*333d2b36SAndroid Build Coastguard Worker				installable: true,
211*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
212*333d2b36SAndroid Build Coastguard Worker			}
213*333d2b36SAndroid Build Coastguard Worker
214*333d2b36SAndroid Build Coastguard Worker			systemserverclasspath_fragment {
215*333d2b36SAndroid Build Coastguard Worker				name: "mysystemserverclasspathfragment",
216*333d2b36SAndroid Build Coastguard Worker				contents: [
217*333d2b36SAndroid Build Coastguard Worker					"foo",
218*333d2b36SAndroid Build Coastguard Worker					"bar",
219*333d2b36SAndroid Build Coastguard Worker				],
220*333d2b36SAndroid Build Coastguard Worker				apex_available: [
221*333d2b36SAndroid Build Coastguard Worker					"myapex",
222*333d2b36SAndroid Build Coastguard Worker				],
223*333d2b36SAndroid Build Coastguard Worker			}
224*333d2b36SAndroid Build Coastguard Worker		`)
225*333d2b36SAndroid Build Coastguard Worker}
226*333d2b36SAndroid Build Coastguard Worker
227*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltSystemserverclasspathFragmentContents(t *testing.T) {
228*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
229*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
230*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithSystemserverclasspathFragment,
231*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
232*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetApexSystemServerJars("myapex:foo", "myapex:bar"),
233*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
234*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
235*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
236*333d2b36SAndroid Build Coastguard Worker			arch: {
237*333d2b36SAndroid Build Coastguard Worker				arm64: {
238*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm64.apex",
239*333d2b36SAndroid Build Coastguard Worker				},
240*333d2b36SAndroid Build Coastguard Worker				arm: {
241*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm.apex",
242*333d2b36SAndroid Build Coastguard Worker				},
243*333d2b36SAndroid Build Coastguard Worker			},
244*333d2b36SAndroid Build Coastguard Worker			exported_systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
245*333d2b36SAndroid Build Coastguard Worker		}
246*333d2b36SAndroid Build Coastguard Worker
247*333d2b36SAndroid Build Coastguard Worker		java_import {
248*333d2b36SAndroid Build Coastguard Worker			name: "foo",
249*333d2b36SAndroid Build Coastguard Worker			jars: ["foo.jar"],
250*333d2b36SAndroid Build Coastguard Worker			apex_available: [
251*333d2b36SAndroid Build Coastguard Worker				"myapex",
252*333d2b36SAndroid Build Coastguard Worker			],
253*333d2b36SAndroid Build Coastguard Worker		}
254*333d2b36SAndroid Build Coastguard Worker
255*333d2b36SAndroid Build Coastguard Worker		java_import {
256*333d2b36SAndroid Build Coastguard Worker			name: "bar",
257*333d2b36SAndroid Build Coastguard Worker			jars: ["bar.jar"],
258*333d2b36SAndroid Build Coastguard Worker			dex_preopt: {
259*333d2b36SAndroid Build Coastguard Worker				profile_guided: true,
260*333d2b36SAndroid Build Coastguard Worker			},
261*333d2b36SAndroid Build Coastguard Worker			apex_available: [
262*333d2b36SAndroid Build Coastguard Worker				"myapex",
263*333d2b36SAndroid Build Coastguard Worker			],
264*333d2b36SAndroid Build Coastguard Worker		}
265*333d2b36SAndroid Build Coastguard Worker
266*333d2b36SAndroid Build Coastguard Worker		prebuilt_systemserverclasspath_fragment {
267*333d2b36SAndroid Build Coastguard Worker			name: "mysystemserverclasspathfragment",
268*333d2b36SAndroid Build Coastguard Worker			prefer: true,
269*333d2b36SAndroid Build Coastguard Worker			contents: [
270*333d2b36SAndroid Build Coastguard Worker				"foo",
271*333d2b36SAndroid Build Coastguard Worker				"bar",
272*333d2b36SAndroid Build Coastguard Worker			],
273*333d2b36SAndroid Build Coastguard Worker			apex_available: [
274*333d2b36SAndroid Build Coastguard Worker				"myapex",
275*333d2b36SAndroid Build Coastguard Worker			],
276*333d2b36SAndroid Build Coastguard Worker		}
277*333d2b36SAndroid Build Coastguard Worker	`)
278*333d2b36SAndroid Build Coastguard Worker
279*333d2b36SAndroid Build Coastguard Worker	ctx := result.TestContext
280*333d2b36SAndroid Build Coastguard Worker
281*333d2b36SAndroid Build Coastguard Worker	java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex", []string{
282*333d2b36SAndroid Build Coastguard Worker		`all_apex_contributions`,
283*333d2b36SAndroid Build Coastguard Worker		`dex2oatd`,
284*333d2b36SAndroid Build Coastguard Worker		`prebuilt_mysystemserverclasspathfragment`,
285*333d2b36SAndroid Build Coastguard Worker	})
286*333d2b36SAndroid Build Coastguard Worker
287*333d2b36SAndroid Build Coastguard Worker	java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{
288*333d2b36SAndroid Build Coastguard Worker		`all_apex_contributions`,
289*333d2b36SAndroid Build Coastguard Worker		`prebuilt_bar`,
290*333d2b36SAndroid Build Coastguard Worker		`prebuilt_foo`,
291*333d2b36SAndroid Build Coastguard Worker	})
292*333d2b36SAndroid Build Coastguard Worker
293*333d2b36SAndroid Build Coastguard Worker	ensureExactDeapexedContents(t, ctx, "myapex", "android_common_myapex", []string{
294*333d2b36SAndroid Build Coastguard Worker		"javalib/foo.jar",
295*333d2b36SAndroid Build Coastguard Worker		"javalib/bar.jar",
296*333d2b36SAndroid Build Coastguard Worker		"javalib/bar.jar.prof",
297*333d2b36SAndroid Build Coastguard Worker	})
298*333d2b36SAndroid Build Coastguard Worker
299*333d2b36SAndroid Build Coastguard Worker	assertProfileGuidedPrebuilt(t, ctx, "myapex", "foo", false)
300*333d2b36SAndroid Build Coastguard Worker	assertProfileGuidedPrebuilt(t, ctx, "myapex", "bar", true)
301*333d2b36SAndroid Build Coastguard Worker}
302*333d2b36SAndroid Build Coastguard Worker
303*333d2b36SAndroid Build Coastguard Workerfunc TestSystemserverclasspathFragmentStandaloneContents(t *testing.T) {
304*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
305*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
306*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithSystemserverclasspathFragment,
307*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
308*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar", "myapex:baz"),
309*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
310*333d2b36SAndroid Build Coastguard Worker		apex {
311*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
312*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
313*333d2b36SAndroid Build Coastguard Worker			systemserverclasspath_fragments: [
314*333d2b36SAndroid Build Coastguard Worker				"mysystemserverclasspathfragment",
315*333d2b36SAndroid Build Coastguard Worker			],
316*333d2b36SAndroid Build Coastguard Worker			updatable: false,
317*333d2b36SAndroid Build Coastguard Worker		}
318*333d2b36SAndroid Build Coastguard Worker
319*333d2b36SAndroid Build Coastguard Worker		apex_key {
320*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
321*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
322*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
323*333d2b36SAndroid Build Coastguard Worker		}
324*333d2b36SAndroid Build Coastguard Worker
325*333d2b36SAndroid Build Coastguard Worker		java_library {
326*333d2b36SAndroid Build Coastguard Worker			name: "foo",
327*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
328*333d2b36SAndroid Build Coastguard Worker			installable: true,
329*333d2b36SAndroid Build Coastguard Worker			apex_available: [
330*333d2b36SAndroid Build Coastguard Worker				"myapex",
331*333d2b36SAndroid Build Coastguard Worker			],
332*333d2b36SAndroid Build Coastguard Worker		}
333*333d2b36SAndroid Build Coastguard Worker
334*333d2b36SAndroid Build Coastguard Worker		java_library {
335*333d2b36SAndroid Build Coastguard Worker			name: "bar",
336*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
337*333d2b36SAndroid Build Coastguard Worker			dex_preopt: {
338*333d2b36SAndroid Build Coastguard Worker				profile: "bar-art-profile",
339*333d2b36SAndroid Build Coastguard Worker			},
340*333d2b36SAndroid Build Coastguard Worker			installable: true,
341*333d2b36SAndroid Build Coastguard Worker			apex_available: [
342*333d2b36SAndroid Build Coastguard Worker				"myapex",
343*333d2b36SAndroid Build Coastguard Worker			],
344*333d2b36SAndroid Build Coastguard Worker		}
345*333d2b36SAndroid Build Coastguard Worker
346*333d2b36SAndroid Build Coastguard Worker		java_library {
347*333d2b36SAndroid Build Coastguard Worker			name: "baz",
348*333d2b36SAndroid Build Coastguard Worker			srcs: ["d.java"],
349*333d2b36SAndroid Build Coastguard Worker			dex_preopt: {
350*333d2b36SAndroid Build Coastguard Worker				profile_guided: true, // ignored
351*333d2b36SAndroid Build Coastguard Worker			},
352*333d2b36SAndroid Build Coastguard Worker			installable: true,
353*333d2b36SAndroid Build Coastguard Worker			apex_available: [
354*333d2b36SAndroid Build Coastguard Worker				"myapex",
355*333d2b36SAndroid Build Coastguard Worker			],
356*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_current",
357*333d2b36SAndroid Build Coastguard Worker		}
358*333d2b36SAndroid Build Coastguard Worker
359*333d2b36SAndroid Build Coastguard Worker		systemserverclasspath_fragment {
360*333d2b36SAndroid Build Coastguard Worker			name: "mysystemserverclasspathfragment",
361*333d2b36SAndroid Build Coastguard Worker			standalone_contents: [
362*333d2b36SAndroid Build Coastguard Worker				"foo",
363*333d2b36SAndroid Build Coastguard Worker				"bar",
364*333d2b36SAndroid Build Coastguard Worker				"baz",
365*333d2b36SAndroid Build Coastguard Worker			],
366*333d2b36SAndroid Build Coastguard Worker			apex_available: [
367*333d2b36SAndroid Build Coastguard Worker				"myapex",
368*333d2b36SAndroid Build Coastguard Worker			],
369*333d2b36SAndroid Build Coastguard Worker		}
370*333d2b36SAndroid Build Coastguard Worker	`)
371*333d2b36SAndroid Build Coastguard Worker
372*333d2b36SAndroid Build Coastguard Worker	ctx := result.TestContext
373*333d2b36SAndroid Build Coastguard Worker
374*333d2b36SAndroid Build Coastguard Worker	ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
375*333d2b36SAndroid Build Coastguard Worker		"etc/classpaths/systemserverclasspath.pb",
376*333d2b36SAndroid Build Coastguard Worker		"javalib/foo.jar",
377*333d2b36SAndroid Build Coastguard Worker		"javalib/bar.jar",
378*333d2b36SAndroid Build Coastguard Worker		"javalib/bar.jar.prof",
379*333d2b36SAndroid Build Coastguard Worker		"javalib/baz.jar",
380*333d2b36SAndroid Build Coastguard Worker	})
381*333d2b36SAndroid Build Coastguard Worker
382*333d2b36SAndroid Build Coastguard Worker	assertProfileGuided(t, ctx, "foo", "android_common_apex10000", false)
383*333d2b36SAndroid Build Coastguard Worker	assertProfileGuided(t, ctx, "bar", "android_common_apex10000", true)
384*333d2b36SAndroid Build Coastguard Worker	assertProfileGuided(t, ctx, "baz", "android_common_apex10000", false)
385*333d2b36SAndroid Build Coastguard Worker}
386*333d2b36SAndroid Build Coastguard Worker
387*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltStandaloneSystemserverclasspathFragmentContents(t *testing.T) {
388*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
389*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
390*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithSystemserverclasspathFragment,
391*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
392*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar"),
393*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
394*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
395*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
396*333d2b36SAndroid Build Coastguard Worker			arch: {
397*333d2b36SAndroid Build Coastguard Worker				arm64: {
398*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm64.apex",
399*333d2b36SAndroid Build Coastguard Worker				},
400*333d2b36SAndroid Build Coastguard Worker				arm: {
401*333d2b36SAndroid Build Coastguard Worker					src: "myapex-arm.apex",
402*333d2b36SAndroid Build Coastguard Worker				},
403*333d2b36SAndroid Build Coastguard Worker			},
404*333d2b36SAndroid Build Coastguard Worker			exported_systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
405*333d2b36SAndroid Build Coastguard Worker		}
406*333d2b36SAndroid Build Coastguard Worker
407*333d2b36SAndroid Build Coastguard Worker		java_import {
408*333d2b36SAndroid Build Coastguard Worker			name: "foo",
409*333d2b36SAndroid Build Coastguard Worker			jars: ["foo.jar"],
410*333d2b36SAndroid Build Coastguard Worker			apex_available: [
411*333d2b36SAndroid Build Coastguard Worker				"myapex",
412*333d2b36SAndroid Build Coastguard Worker			],
413*333d2b36SAndroid Build Coastguard Worker		}
414*333d2b36SAndroid Build Coastguard Worker
415*333d2b36SAndroid Build Coastguard Worker		java_import {
416*333d2b36SAndroid Build Coastguard Worker			name: "bar",
417*333d2b36SAndroid Build Coastguard Worker			jars: ["bar.jar"],
418*333d2b36SAndroid Build Coastguard Worker			dex_preopt: {
419*333d2b36SAndroid Build Coastguard Worker				profile_guided: true,
420*333d2b36SAndroid Build Coastguard Worker			},
421*333d2b36SAndroid Build Coastguard Worker			apex_available: [
422*333d2b36SAndroid Build Coastguard Worker				"myapex",
423*333d2b36SAndroid Build Coastguard Worker			],
424*333d2b36SAndroid Build Coastguard Worker		}
425*333d2b36SAndroid Build Coastguard Worker
426*333d2b36SAndroid Build Coastguard Worker		prebuilt_systemserverclasspath_fragment {
427*333d2b36SAndroid Build Coastguard Worker			name: "mysystemserverclasspathfragment",
428*333d2b36SAndroid Build Coastguard Worker			prefer: true,
429*333d2b36SAndroid Build Coastguard Worker			standalone_contents: [
430*333d2b36SAndroid Build Coastguard Worker				"foo",
431*333d2b36SAndroid Build Coastguard Worker				"bar",
432*333d2b36SAndroid Build Coastguard Worker			],
433*333d2b36SAndroid Build Coastguard Worker			apex_available: [
434*333d2b36SAndroid Build Coastguard Worker				"myapex",
435*333d2b36SAndroid Build Coastguard Worker			],
436*333d2b36SAndroid Build Coastguard Worker		}
437*333d2b36SAndroid Build Coastguard Worker	`)
438*333d2b36SAndroid Build Coastguard Worker
439*333d2b36SAndroid Build Coastguard Worker	ctx := result.TestContext
440*333d2b36SAndroid Build Coastguard Worker
441*333d2b36SAndroid Build Coastguard Worker	java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{
442*333d2b36SAndroid Build Coastguard Worker		`all_apex_contributions`,
443*333d2b36SAndroid Build Coastguard Worker		`prebuilt_bar`,
444*333d2b36SAndroid Build Coastguard Worker		`prebuilt_foo`,
445*333d2b36SAndroid Build Coastguard Worker	})
446*333d2b36SAndroid Build Coastguard Worker
447*333d2b36SAndroid Build Coastguard Worker	ensureExactDeapexedContents(t, ctx, "myapex", "android_common_myapex", []string{
448*333d2b36SAndroid Build Coastguard Worker		"javalib/foo.jar",
449*333d2b36SAndroid Build Coastguard Worker		"javalib/bar.jar",
450*333d2b36SAndroid Build Coastguard Worker		"javalib/bar.jar.prof",
451*333d2b36SAndroid Build Coastguard Worker	})
452*333d2b36SAndroid Build Coastguard Worker
453*333d2b36SAndroid Build Coastguard Worker	assertProfileGuidedPrebuilt(t, ctx, "myapex", "foo", false)
454*333d2b36SAndroid Build Coastguard Worker	assertProfileGuidedPrebuilt(t, ctx, "myapex", "bar", true)
455*333d2b36SAndroid Build Coastguard Worker}
456*333d2b36SAndroid Build Coastguard Worker
457*333d2b36SAndroid Build Coastguard Workerfunc assertProfileGuided(t *testing.T, ctx *android.TestContext, moduleName string, variant string, expected bool) {
458*333d2b36SAndroid Build Coastguard Worker	dexpreopt := ctx.ModuleForTests(moduleName, variant).Rule("dexpreopt")
459*333d2b36SAndroid Build Coastguard Worker	actual := strings.Contains(dexpreopt.RuleParams.Command, "--profile-file=")
460*333d2b36SAndroid Build Coastguard Worker	if expected != actual {
461*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("Expected profile-guided to be %v, got %v", expected, actual)
462*333d2b36SAndroid Build Coastguard Worker	}
463*333d2b36SAndroid Build Coastguard Worker}
464*333d2b36SAndroid Build Coastguard Worker
465*333d2b36SAndroid Build Coastguard Workerfunc assertProfileGuidedPrebuilt(t *testing.T, ctx *android.TestContext, apexName string, moduleName string, expected bool) {
466*333d2b36SAndroid Build Coastguard Worker	dexpreopt := ctx.ModuleForTests(apexName, "android_common_"+apexName).Rule("dexpreopt." + moduleName)
467*333d2b36SAndroid Build Coastguard Worker	actual := strings.Contains(dexpreopt.RuleParams.Command, "--profile-file=")
468*333d2b36SAndroid Build Coastguard Worker	if expected != actual {
469*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("Expected profile-guided to be %v, got %v", expected, actual)
470*333d2b36SAndroid Build Coastguard Worker	}
471*333d2b36SAndroid Build Coastguard Worker}
472