blob: 452a43efa716a8d2f1418c9999cc1c6ee1d3d3f9 [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) {
224 result := android.GroupFixturePreparers(
225 prepareForTestWithSystemserverclasspathFragment,
226 prepareForTestWithMyapex,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800227 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo", "myapex:bar"),
Jiakai Zhangc9864272021-09-26 03:52:19 +0000228 ).RunTestWithBp(t, `
Jiakai Zhang774dd302021-09-26 03:54:25 +0000229 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
Jiakai Zhangc9864272021-09-26 03:52:19 +0000242 java_import {
243 name: "foo",
244 jars: ["foo.jar"],
245 apex_available: [
246 "myapex",
247 ],
248 }
249
Jiakai Zhang81e46812023-02-08 21:56:07 +0800250 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
Jiakai Zhangc9864272021-09-26 03:52:19 +0000261 prebuilt_systemserverclasspath_fragment {
262 name: "mysystemserverclasspathfragment",
263 prefer: true,
264 contents: [
265 "foo",
Jiakai Zhang81e46812023-02-08 21:56:07 +0800266 "bar",
Jiakai Zhangc9864272021-09-26 03:52:19 +0000267 ],
268 apex_available: [
269 "myapex",
270 ],
271 }
272 `)
273
Jiakai Zhang81e46812023-02-08 21:56:07 +0800274 ctx := result.TestContext
275
276 java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000277 `all_apex_contributions`,
Spandan Das2069c3f2023-12-06 19:40:24 +0000278 `dex2oatd`,
Spandan Das3576e762024-01-03 18:57:03 +0000279 `prebuilt_myapex.apex.selector`,
280 `prebuilt_myapex.deapexer`,
Jiakai Zhang774dd302021-09-26 03:54:25 +0000281 `prebuilt_mysystemserverclasspathfragment`,
282 })
283
Jiakai Zhang81e46812023-02-08 21:56:07 +0800284 java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000285 `all_apex_contributions`,
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
Spandan Das2ea84dd2024-01-25 22:12:50 +0000297 assertProfileGuidedPrebuilt(t, ctx, "myapex", "foo", false)
298 assertProfileGuidedPrebuilt(t, ctx, "myapex", "bar", 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) {
384 result := android.GroupFixturePreparers(
385 prepareForTestWithSystemserverclasspathFragment,
386 prepareForTestWithMyapex,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800387 dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar"),
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000388 ).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
Jiakai Zhang81e46812023-02-08 21:56:07 +0800410 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
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000421 prebuilt_systemserverclasspath_fragment {
422 name: "mysystemserverclasspathfragment",
423 prefer: true,
424 standalone_contents: [
425 "foo",
Jiakai Zhang81e46812023-02-08 21:56:07 +0800426 "bar",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000427 ],
428 apex_available: [
429 "myapex",
430 ],
431 }
432 `)
433
Jiakai Zhang81e46812023-02-08 21:56:07 +0800434 ctx := result.TestContext
435
436 java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000437 `all_apex_contributions`,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800438 `prebuilt_bar`,
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000439 `prebuilt_foo`,
Spandan Das3576e762024-01-03 18:57:03 +0000440 `prebuilt_myapex.deapexer`,
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000441 })
Jiakai Zhang81e46812023-02-08 21:56:07 +0800442
Spandan Das3576e762024-01-03 18:57:03 +0000443 ensureExactDeapexedContents(t, ctx, "prebuilt_myapex", "android_common", []string{
Jiakai Zhang81e46812023-02-08 21:56:07 +0800444 "javalib/foo.jar",
445 "javalib/bar.jar",
446 "javalib/bar.jar.prof",
447 })
448
Spandan Das2ea84dd2024-01-25 22:12:50 +0000449 assertProfileGuidedPrebuilt(t, ctx, "myapex", "foo", false)
450 assertProfileGuidedPrebuilt(t, ctx, "myapex", "bar", true)
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000451}
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000452
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}
Spandan Das2ea84dd2024-01-25 22:12:50 +0000460
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}