blob: 01629c9d24b15d2c8859a3cf9f551e61529bdbd0 [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{
satayev333a1732021-05-17 21:35:26 +0100109 `myapex.key`,
110 `mysystemserverclasspathfragment`,
111 })
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000112
113 assertProfileGuided(t, ctx, "foo", "android_common_apex10000", false)
114 assertProfileGuided(t, ctx, "bar", "android_common_apex10000", true)
115 assertProfileGuided(t, ctx, "baz", "android_common_apex10000", false)
satayev333a1732021-05-17 21:35:26 +0100116}
satayevb98371c2021-06-15 16:49:50 +0100117
118func TestSystemserverclasspathFragmentNoGeneratedProto(t *testing.T) {
119 result := android.GroupFixturePreparers(
120 prepareForTestWithSystemserverclasspathFragment,
121 prepareForTestWithMyapex,
satayevabcd5972021-08-06 17:49:46 +0100122 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
satayevb98371c2021-06-15 16:49:50 +0100123 ).RunTestWithBp(t, `
124 apex {
125 name: "myapex",
126 key: "myapex.key",
127 systemserverclasspath_fragments: [
128 "mysystemserverclasspathfragment",
129 ],
130 updatable: false,
131 }
132
133 apex_key {
134 name: "myapex.key",
135 public_key: "testkey.avbpubkey",
136 private_key: "testkey.pem",
137 }
138
139 java_library {
140 name: "foo",
141 srcs: ["b.java"],
142 installable: true,
143 apex_available: [
144 "myapex",
145 ],
146 }
147
148 systemserverclasspath_fragment {
149 name: "mysystemserverclasspathfragment",
150 generate_classpaths_proto: false,
151 contents: [
152 "foo",
153 ],
154 apex_available: [
155 "myapex",
156 ],
157 }
158 `)
159
Jooyung Hana0503a52023-08-23 13:12:50 +0900160 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
satayevb98371c2021-06-15 16:49:50 +0100161 "javalib/foo.jar",
162 })
163
Jooyung Hana0503a52023-08-23 13:12:50 +0900164 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex", []string{
satayevb98371c2021-06-15 16:49:50 +0100165 `myapex.key`,
166 `mysystemserverclasspathfragment`,
167 })
168}
satayevd34eb0c2021-08-06 13:20:28 +0100169
170func TestSystemServerClasspathFragmentWithContentNotInMake(t *testing.T) {
171 android.GroupFixturePreparers(
172 prepareForTestWithSystemserverclasspathFragment,
173 prepareForTestWithMyapex,
174 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
175 ).
176 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Ulya Trafimoviche5b2b492021-10-04 15:42:53 +0100177 `in contents must also be declared in PRODUCT_APEX_SYSTEM_SERVER_JARS`)).
satayevd34eb0c2021-08-06 13:20:28 +0100178 RunTestWithBp(t, `
179 apex {
180 name: "myapex",
181 key: "myapex.key",
182 systemserverclasspath_fragments: [
183 "mysystemserverclasspathfragment",
184 ],
185 updatable: false,
186 }
187
188 apex_key {
189 name: "myapex.key",
190 public_key: "testkey.avbpubkey",
191 private_key: "testkey.pem",
192 }
193
194 java_library {
195 name: "foo",
196 srcs: ["b.java"],
197 installable: true,
198 apex_available: ["myapex"],
199 }
200
201 java_library {
202 name: "bar",
203 srcs: ["b.java"],
204 installable: true,
205 apex_available: ["myapex"],
206 }
207
208 systemserverclasspath_fragment {
209 name: "mysystemserverclasspathfragment",
210 contents: [
211 "foo",
212 "bar",
213 ],
214 apex_available: [
215 "myapex",
216 ],
217 }
218 `)
219}
Jiakai Zhangc9864272021-09-26 03:52:19 +0000220
221func TestPrebuiltSystemserverclasspathFragmentContents(t *testing.T) {
222 result := android.GroupFixturePreparers(
223 prepareForTestWithSystemserverclasspathFragment,
224 prepareForTestWithMyapex,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800225 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo", "myapex:bar"),
Jiakai Zhangc9864272021-09-26 03:52:19 +0000226 ).RunTestWithBp(t, `
Jiakai Zhang774dd302021-09-26 03:54:25 +0000227 prebuilt_apex {
228 name: "myapex",
229 arch: {
230 arm64: {
231 src: "myapex-arm64.apex",
232 },
233 arm: {
234 src: "myapex-arm.apex",
235 },
236 },
237 exported_systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
238 }
239
Jiakai Zhangc9864272021-09-26 03:52:19 +0000240 java_import {
241 name: "foo",
242 jars: ["foo.jar"],
243 apex_available: [
244 "myapex",
245 ],
246 }
247
Jiakai Zhang81e46812023-02-08 21:56:07 +0800248 java_import {
249 name: "bar",
250 jars: ["bar.jar"],
251 dex_preopt: {
252 profile_guided: true,
253 },
254 apex_available: [
255 "myapex",
256 ],
257 }
258
Jiakai Zhangc9864272021-09-26 03:52:19 +0000259 prebuilt_systemserverclasspath_fragment {
260 name: "mysystemserverclasspathfragment",
261 prefer: true,
262 contents: [
263 "foo",
Jiakai Zhang81e46812023-02-08 21:56:07 +0800264 "bar",
Jiakai Zhangc9864272021-09-26 03:52:19 +0000265 ],
266 apex_available: [
267 "myapex",
268 ],
269 }
270 `)
271
Jiakai Zhang81e46812023-02-08 21:56:07 +0800272 ctx := result.TestContext
273
274 java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex", []string{
Spandan Das2069c3f2023-12-06 19:40:24 +0000275 `dex2oatd`,
Spandan Das3576e762024-01-03 18:57:03 +0000276 `prebuilt_myapex.apex.selector`,
277 `prebuilt_myapex.deapexer`,
Jiakai Zhang774dd302021-09-26 03:54:25 +0000278 `prebuilt_mysystemserverclasspathfragment`,
279 })
280
Jiakai Zhang81e46812023-02-08 21:56:07 +0800281 java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{
Jiakai Zhang81e46812023-02-08 21:56:07 +0800282 `prebuilt_bar`,
Jiakai Zhangc9864272021-09-26 03:52:19 +0000283 `prebuilt_foo`,
Spandan Das3576e762024-01-03 18:57:03 +0000284 `prebuilt_myapex.deapexer`,
Jiakai Zhangc9864272021-09-26 03:52:19 +0000285 })
Jiakai Zhang81e46812023-02-08 21:56:07 +0800286
Spandan Das3576e762024-01-03 18:57:03 +0000287 ensureExactDeapexedContents(t, ctx, "prebuilt_myapex", "android_common", []string{
Jiakai Zhang81e46812023-02-08 21:56:07 +0800288 "javalib/foo.jar",
289 "javalib/bar.jar",
290 "javalib/bar.jar.prof",
291 })
292
293 assertProfileGuided(t, ctx, "foo", "android_common_myapex", false)
294 assertProfileGuided(t, ctx, "bar", "android_common_myapex", true)
Jiakai Zhangc9864272021-09-26 03:52:19 +0000295}
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000296
297func TestSystemserverclasspathFragmentStandaloneContents(t *testing.T) {
298 result := android.GroupFixturePreparers(
299 prepareForTestWithSystemserverclasspathFragment,
300 prepareForTestWithMyapex,
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000301 dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar", "myapex:baz"),
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000302 ).RunTestWithBp(t, `
303 apex {
304 name: "myapex",
305 key: "myapex.key",
306 systemserverclasspath_fragments: [
307 "mysystemserverclasspathfragment",
308 ],
309 updatable: false,
310 }
311
312 apex_key {
313 name: "myapex.key",
314 public_key: "testkey.avbpubkey",
315 private_key: "testkey.pem",
316 }
317
318 java_library {
319 name: "foo",
320 srcs: ["b.java"],
321 installable: true,
322 apex_available: [
323 "myapex",
324 ],
325 }
326
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800327 java_library {
328 name: "bar",
329 srcs: ["c.java"],
330 dex_preopt: {
331 profile: "bar-art-profile",
332 },
333 installable: true,
334 apex_available: [
335 "myapex",
336 ],
337 }
338
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000339 java_library {
340 name: "baz",
341 srcs: ["d.java"],
342 dex_preopt: {
343 profile_guided: true, // ignored
344 },
345 installable: true,
346 apex_available: [
347 "myapex",
348 ],
349 }
350
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000351 systemserverclasspath_fragment {
352 name: "mysystemserverclasspathfragment",
353 standalone_contents: [
354 "foo",
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800355 "bar",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000356 "baz",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000357 ],
358 apex_available: [
359 "myapex",
360 ],
361 }
362 `)
363
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000364 ctx := result.TestContext
365
Jooyung Hana0503a52023-08-23 13:12:50 +0900366 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000367 "etc/classpaths/systemserverclasspath.pb",
368 "javalib/foo.jar",
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800369 "javalib/bar.jar",
370 "javalib/bar.jar.prof",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000371 "javalib/baz.jar",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000372 })
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000373
374 assertProfileGuided(t, ctx, "foo", "android_common_apex10000", false)
375 assertProfileGuided(t, ctx, "bar", "android_common_apex10000", true)
376 assertProfileGuided(t, ctx, "baz", "android_common_apex10000", false)
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000377}
378
379func TestPrebuiltStandaloneSystemserverclasspathFragmentContents(t *testing.T) {
380 result := android.GroupFixturePreparers(
381 prepareForTestWithSystemserverclasspathFragment,
382 prepareForTestWithMyapex,
Jiakai Zhang81e46812023-02-08 21:56:07 +0800383 dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar"),
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000384 ).RunTestWithBp(t, `
385 prebuilt_apex {
386 name: "myapex",
387 arch: {
388 arm64: {
389 src: "myapex-arm64.apex",
390 },
391 arm: {
392 src: "myapex-arm.apex",
393 },
394 },
395 exported_systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
396 }
397
398 java_import {
399 name: "foo",
400 jars: ["foo.jar"],
401 apex_available: [
402 "myapex",
403 ],
404 }
405
Jiakai Zhang81e46812023-02-08 21:56:07 +0800406 java_import {
407 name: "bar",
408 jars: ["bar.jar"],
409 dex_preopt: {
410 profile_guided: true,
411 },
412 apex_available: [
413 "myapex",
414 ],
415 }
416
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000417 prebuilt_systemserverclasspath_fragment {
418 name: "mysystemserverclasspathfragment",
419 prefer: true,
420 standalone_contents: [
421 "foo",
Jiakai Zhang81e46812023-02-08 21:56:07 +0800422 "bar",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000423 ],
424 apex_available: [
425 "myapex",
426 ],
427 }
428 `)
429
Jiakai Zhang81e46812023-02-08 21:56:07 +0800430 ctx := result.TestContext
431
432 java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{
Jiakai Zhang81e46812023-02-08 21:56:07 +0800433 `prebuilt_bar`,
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000434 `prebuilt_foo`,
Spandan Das3576e762024-01-03 18:57:03 +0000435 `prebuilt_myapex.deapexer`,
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000436 })
Jiakai Zhang81e46812023-02-08 21:56:07 +0800437
Spandan Das3576e762024-01-03 18:57:03 +0000438 ensureExactDeapexedContents(t, ctx, "prebuilt_myapex", "android_common", []string{
Jiakai Zhang81e46812023-02-08 21:56:07 +0800439 "javalib/foo.jar",
440 "javalib/bar.jar",
441 "javalib/bar.jar.prof",
442 })
443
444 assertProfileGuided(t, ctx, "foo", "android_common_myapex", false)
445 assertProfileGuided(t, ctx, "bar", "android_common_myapex", true)
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000446}
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000447
448func assertProfileGuided(t *testing.T, ctx *android.TestContext, moduleName string, variant string, expected bool) {
449 dexpreopt := ctx.ModuleForTests(moduleName, variant).Rule("dexpreopt")
450 actual := strings.Contains(dexpreopt.RuleParams.Command, "--profile-file=")
451 if expected != actual {
452 t.Fatalf("Expected profile-guided to be %v, got %v", expected, actual)
453 }
454}