blob: fd9020b7f9bb16faa95ce9134183efacd99445ce [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`,
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{
Spandan Das85bd4622024-08-01 00:51:20 +0000286 `all_apex_contributions`,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800287 `prebuilt_bar`,
Jiakai Zhangc9864272021-09-26 03:52:19 +0000288 `prebuilt_foo`,
Spandan Das3576e762024-01-03 18:57:03 +0000289 `prebuilt_myapex.deapexer`,
Jiakai Zhangc9864272021-09-26 03:52:19 +0000290 })
Jiakai Zhang81e46812023-02-08 21:56:07 +0800291
Spandan Das3576e762024-01-03 18:57:03 +0000292 ensureExactDeapexedContents(t, ctx, "prebuilt_myapex", "android_common", []string{
Jiakai Zhang81e46812023-02-08 21:56:07 +0800293 "javalib/foo.jar",
294 "javalib/bar.jar",
295 "javalib/bar.jar.prof",
296 })
297
Spandan Das2ea84dd2024-01-25 22:12:50 +0000298 assertProfileGuidedPrebuilt(t, ctx, "myapex", "foo", false)
299 assertProfileGuidedPrebuilt(t, ctx, "myapex", "bar", true)
Jiakai Zhangc9864272021-09-26 03:52:19 +0000300}
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000301
302func TestSystemserverclasspathFragmentStandaloneContents(t *testing.T) {
303 result := android.GroupFixturePreparers(
304 prepareForTestWithSystemserverclasspathFragment,
305 prepareForTestWithMyapex,
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000306 dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar", "myapex:baz"),
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000307 ).RunTestWithBp(t, `
308 apex {
309 name: "myapex",
310 key: "myapex.key",
311 systemserverclasspath_fragments: [
312 "mysystemserverclasspathfragment",
313 ],
314 updatable: false,
315 }
316
317 apex_key {
318 name: "myapex.key",
319 public_key: "testkey.avbpubkey",
320 private_key: "testkey.pem",
321 }
322
323 java_library {
324 name: "foo",
325 srcs: ["b.java"],
326 installable: true,
327 apex_available: [
328 "myapex",
329 ],
330 }
331
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800332 java_library {
333 name: "bar",
334 srcs: ["c.java"],
335 dex_preopt: {
336 profile: "bar-art-profile",
337 },
338 installable: true,
339 apex_available: [
340 "myapex",
341 ],
342 }
343
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000344 java_library {
345 name: "baz",
346 srcs: ["d.java"],
347 dex_preopt: {
348 profile_guided: true, // ignored
349 },
350 installable: true,
351 apex_available: [
352 "myapex",
353 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000354 sdk_version: "core_current",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000355 }
356
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000357 systemserverclasspath_fragment {
358 name: "mysystemserverclasspathfragment",
359 standalone_contents: [
360 "foo",
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800361 "bar",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000362 "baz",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000363 ],
364 apex_available: [
365 "myapex",
366 ],
367 }
368 `)
369
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000370 ctx := result.TestContext
371
Jooyung Hana0503a52023-08-23 13:12:50 +0900372 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000373 "etc/classpaths/systemserverclasspath.pb",
374 "javalib/foo.jar",
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800375 "javalib/bar.jar",
376 "javalib/bar.jar.prof",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000377 "javalib/baz.jar",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000378 })
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000379
380 assertProfileGuided(t, ctx, "foo", "android_common_apex10000", false)
381 assertProfileGuided(t, ctx, "bar", "android_common_apex10000", true)
382 assertProfileGuided(t, ctx, "baz", "android_common_apex10000", false)
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000383}
384
385func TestPrebuiltStandaloneSystemserverclasspathFragmentContents(t *testing.T) {
386 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{
Spandan Das85bd4622024-08-01 00:51:20 +0000439 `all_apex_contributions`,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800440 `prebuilt_bar`,
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000441 `prebuilt_foo`,
Spandan Das3576e762024-01-03 18:57:03 +0000442 `prebuilt_myapex.deapexer`,
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000443 })
Jiakai Zhang81e46812023-02-08 21:56:07 +0800444
Spandan Das3576e762024-01-03 18:57:03 +0000445 ensureExactDeapexedContents(t, ctx, "prebuilt_myapex", "android_common", []string{
Jiakai Zhang81e46812023-02-08 21:56:07 +0800446 "javalib/foo.jar",
447 "javalib/bar.jar",
448 "javalib/bar.jar.prof",
449 })
450
Spandan Das2ea84dd2024-01-25 22:12:50 +0000451 assertProfileGuidedPrebuilt(t, ctx, "myapex", "foo", false)
452 assertProfileGuidedPrebuilt(t, ctx, "myapex", "bar", true)
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000453}
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000454
455func assertProfileGuided(t *testing.T, ctx *android.TestContext, moduleName string, variant string, expected bool) {
456 dexpreopt := ctx.ModuleForTests(moduleName, variant).Rule("dexpreopt")
457 actual := strings.Contains(dexpreopt.RuleParams.Command, "--profile-file=")
458 if expected != actual {
459 t.Fatalf("Expected profile-guided to be %v, got %v", expected, actual)
460 }
461}
Spandan Das2ea84dd2024-01-25 22:12:50 +0000462
463func assertProfileGuidedPrebuilt(t *testing.T, ctx *android.TestContext, apexName string, moduleName string, expected bool) {
464 dexpreopt := ctx.ModuleForTests(apexName, "android_common_"+apexName).Rule("dexpreopt." + moduleName)
465 actual := strings.Contains(dexpreopt.RuleParams.Command, "--profile-file=")
466 if expected != actual {
467 t.Fatalf("Expected profile-guided to be %v, got %v", expected, actual)
468 }
469}