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