blob: 7dbac5fde0cf2b4269ccc895182187293031dfa2 [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) {
Colin Crossa2fdb612024-10-11 12:52:56 -070032 t.Parallel()
satayev333a1732021-05-17 21:35:26 +010033 result := android.GroupFixturePreparers(
34 prepareForTestWithSystemserverclasspathFragment,
35 prepareForTestWithMyapex,
Jiakai Zhang1f4542c2023-02-15 22:43:09 +000036 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo", "myapex:bar", "myapex:baz"),
satayev333a1732021-05-17 21:35:26 +010037 ).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
Jiakai Zhang3317ce72023-02-08 01:19:19 +080062 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
Jiakai Zhang1f4542c2023-02-15 22:43:09 +000074 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 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +000084 sdk_version: "core_current",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +000085 }
86
satayev333a1732021-05-17 21:35:26 +010087 systemserverclasspath_fragment {
88 name: "mysystemserverclasspathfragment",
89 contents: [
90 "foo",
Jiakai Zhang3317ce72023-02-08 01:19:19 +080091 "bar",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +000092 "baz",
satayev333a1732021-05-17 21:35:26 +010093 ],
94 apex_available: [
95 "myapex",
96 ],
97 }
98 `)
99
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000100 ctx := result.TestContext
101
Jooyung Hana0503a52023-08-23 13:12:50 +0900102 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
satayev227e7452021-05-20 21:35:06 +0100103 "etc/classpaths/systemserverclasspath.pb",
satayev333a1732021-05-17 21:35:26 +0100104 "javalib/foo.jar",
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800105 "javalib/bar.jar",
106 "javalib/bar.jar.prof",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000107 "javalib/baz.jar",
satayev333a1732021-05-17 21:35:26 +0100108 })
109
Jooyung Hana0503a52023-08-23 13:12:50 +0900110 java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex", []string{
Spandan Dase21a8d42024-01-23 23:56:29 +0000111 `dex2oatd`,
satayev333a1732021-05-17 21:35:26 +0100112 `myapex.key`,
113 `mysystemserverclasspathfragment`,
114 })
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000115
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)
satayev333a1732021-05-17 21:35:26 +0100119}
satayevb98371c2021-06-15 16:49:50 +0100120
121func TestSystemserverclasspathFragmentNoGeneratedProto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700122 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +0100123 result := android.GroupFixturePreparers(
124 prepareForTestWithSystemserverclasspathFragment,
125 prepareForTestWithMyapex,
satayevabcd5972021-08-06 17:49:46 +0100126 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
satayevb98371c2021-06-15 16:49:50 +0100127 ).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
Jooyung Hana0503a52023-08-23 13:12:50 +0900164 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
satayevb98371c2021-06-15 16:49:50 +0100165 "javalib/foo.jar",
166 })
167
Jooyung Hana0503a52023-08-23 13:12:50 +0900168 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex", []string{
Spandan Dase21a8d42024-01-23 23:56:29 +0000169 `dex2oatd`,
satayevb98371c2021-06-15 16:49:50 +0100170 `myapex.key`,
171 `mysystemserverclasspathfragment`,
172 })
173}
satayevd34eb0c2021-08-06 13:20:28 +0100174
175func TestSystemServerClasspathFragmentWithContentNotInMake(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700176 t.Parallel()
satayevd34eb0c2021-08-06 13:20:28 +0100177 android.GroupFixturePreparers(
178 prepareForTestWithSystemserverclasspathFragment,
179 prepareForTestWithMyapex,
180 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
181 ).
182 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Ulya Trafimoviche5b2b492021-10-04 15:42:53 +0100183 `in contents must also be declared in PRODUCT_APEX_SYSTEM_SERVER_JARS`)).
satayevd34eb0c2021-08-06 13:20:28 +0100184 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}
Jiakai Zhangc9864272021-09-26 03:52:19 +0000226
227func TestPrebuiltSystemserverclasspathFragmentContents(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700228 t.Parallel()
Jiakai Zhangc9864272021-09-26 03:52:19 +0000229 result := android.GroupFixturePreparers(
230 prepareForTestWithSystemserverclasspathFragment,
231 prepareForTestWithMyapex,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800232 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo", "myapex:bar"),
Jiakai Zhangc9864272021-09-26 03:52:19 +0000233 ).RunTestWithBp(t, `
Jiakai Zhang774dd302021-09-26 03:54:25 +0000234 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
Jiakai Zhangc9864272021-09-26 03:52:19 +0000247 java_import {
248 name: "foo",
249 jars: ["foo.jar"],
250 apex_available: [
251 "myapex",
252 ],
253 }
254
Jiakai Zhang81e46812023-02-08 21:56:07 +0800255 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
Jiakai Zhangc9864272021-09-26 03:52:19 +0000266 prebuilt_systemserverclasspath_fragment {
267 name: "mysystemserverclasspathfragment",
268 prefer: true,
269 contents: [
270 "foo",
Jiakai Zhang81e46812023-02-08 21:56:07 +0800271 "bar",
Jiakai Zhangc9864272021-09-26 03:52:19 +0000272 ],
273 apex_available: [
274 "myapex",
275 ],
276 }
277 `)
278
Jiakai Zhang81e46812023-02-08 21:56:07 +0800279 ctx := result.TestContext
280
281 java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000282 `all_apex_contributions`,
Spandan Das2069c3f2023-12-06 19:40:24 +0000283 `dex2oatd`,
Jiakai Zhang774dd302021-09-26 03:54:25 +0000284 `prebuilt_mysystemserverclasspathfragment`,
285 })
286
Jiakai Zhang81e46812023-02-08 21:56:07 +0800287 java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000288 `all_apex_contributions`,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800289 `prebuilt_bar`,
Jiakai Zhangc9864272021-09-26 03:52:19 +0000290 `prebuilt_foo`,
291 })
Jiakai Zhang81e46812023-02-08 21:56:07 +0800292
Spandan Das52c01a12024-09-20 01:09:48 +0000293 ensureExactDeapexedContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang81e46812023-02-08 21:56:07 +0800294 "javalib/foo.jar",
295 "javalib/bar.jar",
296 "javalib/bar.jar.prof",
297 })
298
Spandan Das2ea84dd2024-01-25 22:12:50 +0000299 assertProfileGuidedPrebuilt(t, ctx, "myapex", "foo", false)
300 assertProfileGuidedPrebuilt(t, ctx, "myapex", "bar", true)
Jiakai Zhangc9864272021-09-26 03:52:19 +0000301}
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000302
303func TestSystemserverclasspathFragmentStandaloneContents(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700304 t.Parallel()
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000305 result := android.GroupFixturePreparers(
306 prepareForTestWithSystemserverclasspathFragment,
307 prepareForTestWithMyapex,
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000308 dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar", "myapex:baz"),
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000309 ).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
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800334 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
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000346 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 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000356 sdk_version: "core_current",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000357 }
358
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000359 systemserverclasspath_fragment {
360 name: "mysystemserverclasspathfragment",
361 standalone_contents: [
362 "foo",
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800363 "bar",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000364 "baz",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000365 ],
366 apex_available: [
367 "myapex",
368 ],
369 }
370 `)
371
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000372 ctx := result.TestContext
373
Jooyung Hana0503a52023-08-23 13:12:50 +0900374 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000375 "etc/classpaths/systemserverclasspath.pb",
376 "javalib/foo.jar",
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800377 "javalib/bar.jar",
378 "javalib/bar.jar.prof",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000379 "javalib/baz.jar",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000380 })
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000381
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)
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000385}
386
387func TestPrebuiltStandaloneSystemserverclasspathFragmentContents(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700388 t.Parallel()
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000389 result := android.GroupFixturePreparers(
390 prepareForTestWithSystemserverclasspathFragment,
391 prepareForTestWithMyapex,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800392 dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar"),
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000393 ).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
Jiakai Zhang81e46812023-02-08 21:56:07 +0800415 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
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000426 prebuilt_systemserverclasspath_fragment {
427 name: "mysystemserverclasspathfragment",
428 prefer: true,
429 standalone_contents: [
430 "foo",
Jiakai Zhang81e46812023-02-08 21:56:07 +0800431 "bar",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000432 ],
433 apex_available: [
434 "myapex",
435 ],
436 }
437 `)
438
Jiakai Zhang81e46812023-02-08 21:56:07 +0800439 ctx := result.TestContext
440
441 java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000442 `all_apex_contributions`,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800443 `prebuilt_bar`,
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000444 `prebuilt_foo`,
445 })
Jiakai Zhang81e46812023-02-08 21:56:07 +0800446
Spandan Das52c01a12024-09-20 01:09:48 +0000447 ensureExactDeapexedContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang81e46812023-02-08 21:56:07 +0800448 "javalib/foo.jar",
449 "javalib/bar.jar",
450 "javalib/bar.jar.prof",
451 })
452
Spandan Das2ea84dd2024-01-25 22:12:50 +0000453 assertProfileGuidedPrebuilt(t, ctx, "myapex", "foo", false)
454 assertProfileGuidedPrebuilt(t, ctx, "myapex", "bar", true)
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000455}
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000456
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}
Spandan Das2ea84dd2024-01-25 22:12:50 +0000464
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}