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