blob: acb364973f3e232537e0905acf968ca5247e1a3f [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 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +000083 sdk_version: "core_current",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +000084 }
85
satayev333a1732021-05-17 21:35:26 +010086 systemserverclasspath_fragment {
87 name: "mysystemserverclasspathfragment",
88 contents: [
89 "foo",
Jiakai Zhang3317ce72023-02-08 01:19:19 +080090 "bar",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +000091 "baz",
satayev333a1732021-05-17 21:35:26 +010092 ],
93 apex_available: [
94 "myapex",
95 ],
96 }
97 `)
98
Jiakai Zhang1f4542c2023-02-15 22:43:09 +000099 ctx := result.TestContext
100
Jooyung Hana0503a52023-08-23 13:12:50 +0900101 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
satayev227e7452021-05-20 21:35:06 +0100102 "etc/classpaths/systemserverclasspath.pb",
satayev333a1732021-05-17 21:35:26 +0100103 "javalib/foo.jar",
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800104 "javalib/bar.jar",
105 "javalib/bar.jar.prof",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000106 "javalib/baz.jar",
satayev333a1732021-05-17 21:35:26 +0100107 })
108
Jooyung Hana0503a52023-08-23 13:12:50 +0900109 java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex", []string{
Spandan Dase21a8d42024-01-23 23:56:29 +0000110 `dex2oatd`,
satayev333a1732021-05-17 21:35:26 +0100111 `myapex.key`,
112 `mysystemserverclasspathfragment`,
113 })
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000114
115 assertProfileGuided(t, ctx, "foo", "android_common_apex10000", false)
116 assertProfileGuided(t, ctx, "bar", "android_common_apex10000", true)
117 assertProfileGuided(t, ctx, "baz", "android_common_apex10000", false)
satayev333a1732021-05-17 21:35:26 +0100118}
satayevb98371c2021-06-15 16:49:50 +0100119
120func TestSystemserverclasspathFragmentNoGeneratedProto(t *testing.T) {
121 result := android.GroupFixturePreparers(
122 prepareForTestWithSystemserverclasspathFragment,
123 prepareForTestWithMyapex,
satayevabcd5972021-08-06 17:49:46 +0100124 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
satayevb98371c2021-06-15 16:49:50 +0100125 ).RunTestWithBp(t, `
126 apex {
127 name: "myapex",
128 key: "myapex.key",
129 systemserverclasspath_fragments: [
130 "mysystemserverclasspathfragment",
131 ],
132 updatable: false,
133 }
134
135 apex_key {
136 name: "myapex.key",
137 public_key: "testkey.avbpubkey",
138 private_key: "testkey.pem",
139 }
140
141 java_library {
142 name: "foo",
143 srcs: ["b.java"],
144 installable: true,
145 apex_available: [
146 "myapex",
147 ],
148 }
149
150 systemserverclasspath_fragment {
151 name: "mysystemserverclasspathfragment",
152 generate_classpaths_proto: false,
153 contents: [
154 "foo",
155 ],
156 apex_available: [
157 "myapex",
158 ],
159 }
160 `)
161
Jooyung Hana0503a52023-08-23 13:12:50 +0900162 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
satayevb98371c2021-06-15 16:49:50 +0100163 "javalib/foo.jar",
164 })
165
Jooyung Hana0503a52023-08-23 13:12:50 +0900166 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex", []string{
Spandan Dase21a8d42024-01-23 23:56:29 +0000167 `dex2oatd`,
satayevb98371c2021-06-15 16:49:50 +0100168 `myapex.key`,
169 `mysystemserverclasspathfragment`,
170 })
171}
satayevd34eb0c2021-08-06 13:20:28 +0100172
173func TestSystemServerClasspathFragmentWithContentNotInMake(t *testing.T) {
174 android.GroupFixturePreparers(
175 prepareForTestWithSystemserverclasspathFragment,
176 prepareForTestWithMyapex,
177 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
178 ).
179 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Ulya Trafimoviche5b2b492021-10-04 15:42:53 +0100180 `in contents must also be declared in PRODUCT_APEX_SYSTEM_SERVER_JARS`)).
satayevd34eb0c2021-08-06 13:20:28 +0100181 RunTestWithBp(t, `
182 apex {
183 name: "myapex",
184 key: "myapex.key",
185 systemserverclasspath_fragments: [
186 "mysystemserverclasspathfragment",
187 ],
188 updatable: false,
189 }
190
191 apex_key {
192 name: "myapex.key",
193 public_key: "testkey.avbpubkey",
194 private_key: "testkey.pem",
195 }
196
197 java_library {
198 name: "foo",
199 srcs: ["b.java"],
200 installable: true,
201 apex_available: ["myapex"],
202 }
203
204 java_library {
205 name: "bar",
206 srcs: ["b.java"],
207 installable: true,
208 apex_available: ["myapex"],
209 }
210
211 systemserverclasspath_fragment {
212 name: "mysystemserverclasspathfragment",
213 contents: [
214 "foo",
215 "bar",
216 ],
217 apex_available: [
218 "myapex",
219 ],
220 }
221 `)
222}
Jiakai Zhangc9864272021-09-26 03:52:19 +0000223
224func TestPrebuiltSystemserverclasspathFragmentContents(t *testing.T) {
225 result := android.GroupFixturePreparers(
226 prepareForTestWithSystemserverclasspathFragment,
227 prepareForTestWithMyapex,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800228 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo", "myapex:bar"),
Jiakai Zhangc9864272021-09-26 03:52:19 +0000229 ).RunTestWithBp(t, `
Jiakai Zhang774dd302021-09-26 03:54:25 +0000230 prebuilt_apex {
231 name: "myapex",
232 arch: {
233 arm64: {
234 src: "myapex-arm64.apex",
235 },
236 arm: {
237 src: "myapex-arm.apex",
238 },
239 },
240 exported_systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
241 }
242
Jiakai Zhangc9864272021-09-26 03:52:19 +0000243 java_import {
244 name: "foo",
245 jars: ["foo.jar"],
246 apex_available: [
247 "myapex",
248 ],
249 }
250
Jiakai Zhang81e46812023-02-08 21:56:07 +0800251 java_import {
252 name: "bar",
253 jars: ["bar.jar"],
254 dex_preopt: {
255 profile_guided: true,
256 },
257 apex_available: [
258 "myapex",
259 ],
260 }
261
Jiakai Zhangc9864272021-09-26 03:52:19 +0000262 prebuilt_systemserverclasspath_fragment {
263 name: "mysystemserverclasspathfragment",
264 prefer: true,
265 contents: [
266 "foo",
Jiakai Zhang81e46812023-02-08 21:56:07 +0800267 "bar",
Jiakai Zhangc9864272021-09-26 03:52:19 +0000268 ],
269 apex_available: [
270 "myapex",
271 ],
272 }
273 `)
274
Jiakai Zhang81e46812023-02-08 21:56:07 +0800275 ctx := result.TestContext
276
277 java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000278 `all_apex_contributions`,
Spandan Das2069c3f2023-12-06 19:40:24 +0000279 `dex2oatd`,
Jiakai Zhang774dd302021-09-26 03:54:25 +0000280 `prebuilt_mysystemserverclasspathfragment`,
281 })
282
Jiakai Zhang81e46812023-02-08 21:56:07 +0800283 java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000284 `all_apex_contributions`,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800285 `prebuilt_bar`,
Jiakai Zhangc9864272021-09-26 03:52:19 +0000286 `prebuilt_foo`,
287 })
Jiakai Zhang81e46812023-02-08 21:56:07 +0800288
Spandan Das52c01a12024-09-20 01:09:48 +0000289 ensureExactDeapexedContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang81e46812023-02-08 21:56:07 +0800290 "javalib/foo.jar",
291 "javalib/bar.jar",
292 "javalib/bar.jar.prof",
293 })
294
Spandan Das2ea84dd2024-01-25 22:12:50 +0000295 assertProfileGuidedPrebuilt(t, ctx, "myapex", "foo", false)
296 assertProfileGuidedPrebuilt(t, ctx, "myapex", "bar", true)
Jiakai Zhangc9864272021-09-26 03:52:19 +0000297}
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000298
299func TestSystemserverclasspathFragmentStandaloneContents(t *testing.T) {
300 result := android.GroupFixturePreparers(
301 prepareForTestWithSystemserverclasspathFragment,
302 prepareForTestWithMyapex,
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000303 dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar", "myapex:baz"),
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000304 ).RunTestWithBp(t, `
305 apex {
306 name: "myapex",
307 key: "myapex.key",
308 systemserverclasspath_fragments: [
309 "mysystemserverclasspathfragment",
310 ],
311 updatable: false,
312 }
313
314 apex_key {
315 name: "myapex.key",
316 public_key: "testkey.avbpubkey",
317 private_key: "testkey.pem",
318 }
319
320 java_library {
321 name: "foo",
322 srcs: ["b.java"],
323 installable: true,
324 apex_available: [
325 "myapex",
326 ],
327 }
328
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800329 java_library {
330 name: "bar",
331 srcs: ["c.java"],
332 dex_preopt: {
333 profile: "bar-art-profile",
334 },
335 installable: true,
336 apex_available: [
337 "myapex",
338 ],
339 }
340
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000341 java_library {
342 name: "baz",
343 srcs: ["d.java"],
344 dex_preopt: {
345 profile_guided: true, // ignored
346 },
347 installable: true,
348 apex_available: [
349 "myapex",
350 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000351 sdk_version: "core_current",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000352 }
353
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000354 systemserverclasspath_fragment {
355 name: "mysystemserverclasspathfragment",
356 standalone_contents: [
357 "foo",
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800358 "bar",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000359 "baz",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000360 ],
361 apex_available: [
362 "myapex",
363 ],
364 }
365 `)
366
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000367 ctx := result.TestContext
368
Jooyung Hana0503a52023-08-23 13:12:50 +0900369 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000370 "etc/classpaths/systemserverclasspath.pb",
371 "javalib/foo.jar",
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800372 "javalib/bar.jar",
373 "javalib/bar.jar.prof",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000374 "javalib/baz.jar",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000375 })
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000376
377 assertProfileGuided(t, ctx, "foo", "android_common_apex10000", false)
378 assertProfileGuided(t, ctx, "bar", "android_common_apex10000", true)
379 assertProfileGuided(t, ctx, "baz", "android_common_apex10000", false)
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000380}
381
382func TestPrebuiltStandaloneSystemserverclasspathFragmentContents(t *testing.T) {
383 result := android.GroupFixturePreparers(
384 prepareForTestWithSystemserverclasspathFragment,
385 prepareForTestWithMyapex,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800386 dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar"),
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000387 ).RunTestWithBp(t, `
388 prebuilt_apex {
389 name: "myapex",
390 arch: {
391 arm64: {
392 src: "myapex-arm64.apex",
393 },
394 arm: {
395 src: "myapex-arm.apex",
396 },
397 },
398 exported_systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
399 }
400
401 java_import {
402 name: "foo",
403 jars: ["foo.jar"],
404 apex_available: [
405 "myapex",
406 ],
407 }
408
Jiakai Zhang81e46812023-02-08 21:56:07 +0800409 java_import {
410 name: "bar",
411 jars: ["bar.jar"],
412 dex_preopt: {
413 profile_guided: true,
414 },
415 apex_available: [
416 "myapex",
417 ],
418 }
419
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000420 prebuilt_systemserverclasspath_fragment {
421 name: "mysystemserverclasspathfragment",
422 prefer: true,
423 standalone_contents: [
424 "foo",
Jiakai Zhang81e46812023-02-08 21:56:07 +0800425 "bar",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000426 ],
427 apex_available: [
428 "myapex",
429 ],
430 }
431 `)
432
Jiakai Zhang81e46812023-02-08 21:56:07 +0800433 ctx := result.TestContext
434
435 java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000436 `all_apex_contributions`,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800437 `prebuilt_bar`,
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000438 `prebuilt_foo`,
439 })
Jiakai Zhang81e46812023-02-08 21:56:07 +0800440
Spandan Das52c01a12024-09-20 01:09:48 +0000441 ensureExactDeapexedContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang81e46812023-02-08 21:56:07 +0800442 "javalib/foo.jar",
443 "javalib/bar.jar",
444 "javalib/bar.jar.prof",
445 })
446
Spandan Das2ea84dd2024-01-25 22:12:50 +0000447 assertProfileGuidedPrebuilt(t, ctx, "myapex", "foo", false)
448 assertProfileGuidedPrebuilt(t, ctx, "myapex", "bar", true)
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000449}
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000450
451func assertProfileGuided(t *testing.T, ctx *android.TestContext, moduleName string, variant string, expected bool) {
452 dexpreopt := ctx.ModuleForTests(moduleName, variant).Rule("dexpreopt")
453 actual := strings.Contains(dexpreopt.RuleParams.Command, "--profile-file=")
454 if expected != actual {
455 t.Fatalf("Expected profile-guided to be %v, got %v", expected, actual)
456 }
457}
Spandan Das2ea84dd2024-01-25 22:12:50 +0000458
459func assertProfileGuidedPrebuilt(t *testing.T, ctx *android.TestContext, apexName string, moduleName string, expected bool) {
460 dexpreopt := ctx.ModuleForTests(apexName, "android_common_"+apexName).Rule("dexpreopt." + moduleName)
461 actual := strings.Contains(dexpreopt.RuleParams.Command, "--profile-file=")
462 if expected != actual {
463 t.Fatalf("Expected profile-guided to be %v, got %v", expected, actual)
464 }
465}