blob: 6b2c39777fc7bfd93c2d46bb88b2fe12f9853c72 [file] [log] [blame]
satayev333a1732021-05-17 21:35:26 +01001// 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 (
Jiakai Zhang1f4542c2023-02-15 22:43:09 +000018 "strings"
satayev333a1732021-05-17 21:35:26 +010019 "testing"
20
21 "android/soong/android"
Jiakai Zhang1f4542c2023-02-15 22:43:09 +000022 "android/soong/dexpreopt"
satayev333a1732021-05-17 21:35:26 +010023 "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,
Jiakai Zhang1f4542c2023-02-15 22:43:09 +000035 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo", "myapex:bar", "myapex:baz"),
satayev333a1732021-05-17 21:35:26 +010036 ).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
Jiakai Zhang3317ce72023-02-08 01:19:19 +080061 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
Jiakai Zhang1f4542c2023-02-15 22:43:09 +000073 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
satayev333a1732021-05-17 21:35:26 +010085 systemserverclasspath_fragment {
86 name: "mysystemserverclasspathfragment",
87 contents: [
88 "foo",
Jiakai Zhang3317ce72023-02-08 01:19:19 +080089 "bar",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +000090 "baz",
satayev333a1732021-05-17 21:35:26 +010091 ],
92 apex_available: [
93 "myapex",
94 ],
95 }
96 `)
97
Jiakai Zhang1f4542c2023-02-15 22:43:09 +000098 ctx := result.TestContext
99
Jooyung Hana0503a52023-08-23 13:12:50 +0900100 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
satayev227e7452021-05-20 21:35:06 +0100101 "etc/classpaths/systemserverclasspath.pb",
satayev333a1732021-05-17 21:35:26 +0100102 "javalib/foo.jar",
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800103 "javalib/bar.jar",
104 "javalib/bar.jar.prof",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000105 "javalib/baz.jar",
satayev333a1732021-05-17 21:35:26 +0100106 })
107
Jooyung Hana0503a52023-08-23 13:12:50 +0900108 java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex", []string{
Spandan Dase21a8d42024-01-23 23:56:29 +0000109 `dex2oatd`,
satayev333a1732021-05-17 21:35:26 +0100110 `myapex.key`,
111 `mysystemserverclasspathfragment`,
112 })
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000113
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)
satayev333a1732021-05-17 21:35:26 +0100117}
satayevb98371c2021-06-15 16:49:50 +0100118
119func TestSystemserverclasspathFragmentNoGeneratedProto(t *testing.T) {
120 result := android.GroupFixturePreparers(
121 prepareForTestWithSystemserverclasspathFragment,
122 prepareForTestWithMyapex,
satayevabcd5972021-08-06 17:49:46 +0100123 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
satayevb98371c2021-06-15 16:49:50 +0100124 ).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
Jooyung Hana0503a52023-08-23 13:12:50 +0900161 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
satayevb98371c2021-06-15 16:49:50 +0100162 "javalib/foo.jar",
163 })
164
Jooyung Hana0503a52023-08-23 13:12:50 +0900165 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex", []string{
Spandan Dase21a8d42024-01-23 23:56:29 +0000166 `dex2oatd`,
satayevb98371c2021-06-15 16:49:50 +0100167 `myapex.key`,
168 `mysystemserverclasspathfragment`,
169 })
170}
satayevd34eb0c2021-08-06 13:20:28 +0100171
172func TestSystemServerClasspathFragmentWithContentNotInMake(t *testing.T) {
173 android.GroupFixturePreparers(
174 prepareForTestWithSystemserverclasspathFragment,
175 prepareForTestWithMyapex,
176 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
177 ).
178 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Ulya Trafimoviche5b2b492021-10-04 15:42:53 +0100179 `in contents must also be declared in PRODUCT_APEX_SYSTEM_SERVER_JARS`)).
satayevd34eb0c2021-08-06 13:20:28 +0100180 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}
Jiakai Zhangc9864272021-09-26 03:52:19 +0000222
223func TestPrebuiltSystemserverclasspathFragmentContents(t *testing.T) {
Spandan Dase21a8d42024-01-23 23:56:29 +0000224 // TODO(spandandas): Fix the rules for profile guided dexpreopt of deapexed prebuilt jars
225 t.Skip()
Jiakai Zhangc9864272021-09-26 03:52:19 +0000226 result := android.GroupFixturePreparers(
227 prepareForTestWithSystemserverclasspathFragment,
228 prepareForTestWithMyapex,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800229 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo", "myapex:bar"),
Jiakai Zhangc9864272021-09-26 03:52:19 +0000230 ).RunTestWithBp(t, `
Jiakai Zhang774dd302021-09-26 03:54:25 +0000231 prebuilt_apex {
232 name: "myapex",
233 arch: {
234 arm64: {
235 src: "myapex-arm64.apex",
236 },
237 arm: {
238 src: "myapex-arm.apex",
239 },
240 },
241 exported_systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
242 }
243
Jiakai Zhangc9864272021-09-26 03:52:19 +0000244 java_import {
245 name: "foo",
246 jars: ["foo.jar"],
247 apex_available: [
248 "myapex",
249 ],
250 }
251
Jiakai Zhang81e46812023-02-08 21:56:07 +0800252 java_import {
253 name: "bar",
254 jars: ["bar.jar"],
255 dex_preopt: {
256 profile_guided: true,
257 },
258 apex_available: [
259 "myapex",
260 ],
261 }
262
Jiakai Zhangc9864272021-09-26 03:52:19 +0000263 prebuilt_systemserverclasspath_fragment {
264 name: "mysystemserverclasspathfragment",
265 prefer: true,
266 contents: [
267 "foo",
Jiakai Zhang81e46812023-02-08 21:56:07 +0800268 "bar",
Jiakai Zhangc9864272021-09-26 03:52:19 +0000269 ],
270 apex_available: [
271 "myapex",
272 ],
273 }
274 `)
275
Jiakai Zhang81e46812023-02-08 21:56:07 +0800276 ctx := result.TestContext
277
278 java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex", []string{
Spandan Das2069c3f2023-12-06 19:40:24 +0000279 `dex2oatd`,
Spandan Das3576e762024-01-03 18:57:03 +0000280 `prebuilt_myapex.apex.selector`,
281 `prebuilt_myapex.deapexer`,
Jiakai Zhang774dd302021-09-26 03:54:25 +0000282 `prebuilt_mysystemserverclasspathfragment`,
283 })
284
Jiakai Zhang81e46812023-02-08 21:56:07 +0800285 java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{
Jiakai Zhang81e46812023-02-08 21:56:07 +0800286 `prebuilt_bar`,
Jiakai Zhangc9864272021-09-26 03:52:19 +0000287 `prebuilt_foo`,
Spandan Das3576e762024-01-03 18:57:03 +0000288 `prebuilt_myapex.deapexer`,
Jiakai Zhangc9864272021-09-26 03:52:19 +0000289 })
Jiakai Zhang81e46812023-02-08 21:56:07 +0800290
Spandan Das3576e762024-01-03 18:57:03 +0000291 ensureExactDeapexedContents(t, ctx, "prebuilt_myapex", "android_common", []string{
Jiakai Zhang81e46812023-02-08 21:56:07 +0800292 "javalib/foo.jar",
293 "javalib/bar.jar",
294 "javalib/bar.jar.prof",
295 })
296
297 assertProfileGuided(t, ctx, "foo", "android_common_myapex", false)
298 assertProfileGuided(t, ctx, "bar", "android_common_myapex", true)
Jiakai Zhangc9864272021-09-26 03:52:19 +0000299}
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000300
301func TestSystemserverclasspathFragmentStandaloneContents(t *testing.T) {
302 result := android.GroupFixturePreparers(
303 prepareForTestWithSystemserverclasspathFragment,
304 prepareForTestWithMyapex,
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000305 dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar", "myapex:baz"),
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000306 ).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
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800331 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
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000343 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
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000355 systemserverclasspath_fragment {
356 name: "mysystemserverclasspathfragment",
357 standalone_contents: [
358 "foo",
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800359 "bar",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000360 "baz",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000361 ],
362 apex_available: [
363 "myapex",
364 ],
365 }
366 `)
367
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000368 ctx := result.TestContext
369
Jooyung Hana0503a52023-08-23 13:12:50 +0900370 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000371 "etc/classpaths/systemserverclasspath.pb",
372 "javalib/foo.jar",
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800373 "javalib/bar.jar",
374 "javalib/bar.jar.prof",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000375 "javalib/baz.jar",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000376 })
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000377
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)
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000381}
382
383func TestPrebuiltStandaloneSystemserverclasspathFragmentContents(t *testing.T) {
Spandan Dase21a8d42024-01-23 23:56:29 +0000384 // TODO(spandandas): Fix the rules for profile guided dexpreopt of deapexed prebuilt jars
385 t.Skip()
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000386 result := android.GroupFixturePreparers(
387 prepareForTestWithSystemserverclasspathFragment,
388 prepareForTestWithMyapex,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800389 dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar"),
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000390 ).RunTestWithBp(t, `
391 prebuilt_apex {
392 name: "myapex",
393 arch: {
394 arm64: {
395 src: "myapex-arm64.apex",
396 },
397 arm: {
398 src: "myapex-arm.apex",
399 },
400 },
401 exported_systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
402 }
403
404 java_import {
405 name: "foo",
406 jars: ["foo.jar"],
407 apex_available: [
408 "myapex",
409 ],
410 }
411
Jiakai Zhang81e46812023-02-08 21:56:07 +0800412 java_import {
413 name: "bar",
414 jars: ["bar.jar"],
415 dex_preopt: {
416 profile_guided: true,
417 },
418 apex_available: [
419 "myapex",
420 ],
421 }
422
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000423 prebuilt_systemserverclasspath_fragment {
424 name: "mysystemserverclasspathfragment",
425 prefer: true,
426 standalone_contents: [
427 "foo",
Jiakai Zhang81e46812023-02-08 21:56:07 +0800428 "bar",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000429 ],
430 apex_available: [
431 "myapex",
432 ],
433 }
434 `)
435
Jiakai Zhang81e46812023-02-08 21:56:07 +0800436 ctx := result.TestContext
437
438 java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{
Jiakai Zhang81e46812023-02-08 21:56:07 +0800439 `prebuilt_bar`,
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000440 `prebuilt_foo`,
Spandan Das3576e762024-01-03 18:57:03 +0000441 `prebuilt_myapex.deapexer`,
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000442 })
Jiakai Zhang81e46812023-02-08 21:56:07 +0800443
Spandan Das3576e762024-01-03 18:57:03 +0000444 ensureExactDeapexedContents(t, ctx, "prebuilt_myapex", "android_common", []string{
Jiakai Zhang81e46812023-02-08 21:56:07 +0800445 "javalib/foo.jar",
446 "javalib/bar.jar",
447 "javalib/bar.jar.prof",
448 })
449
450 assertProfileGuided(t, ctx, "foo", "android_common_myapex", false)
451 assertProfileGuided(t, ctx, "bar", "android_common_myapex", true)
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000452}
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000453
454func assertProfileGuided(t *testing.T, ctx *android.TestContext, moduleName string, variant string, expected bool) {
455 dexpreopt := ctx.ModuleForTests(moduleName, variant).Rule("dexpreopt")
456 actual := strings.Contains(dexpreopt.RuleParams.Command, "--profile-file=")
457 if expected != actual {
458 t.Fatalf("Expected profile-guided to be %v, got %v", expected, actual)
459 }
460}