blob: 1803fcfb964a62bf8c6d9c9ef9699d0f3099e8af [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
100 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []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
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000108 java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex_image", []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
160 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
161 "javalib/foo.jar",
162 })
163
164 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
165 `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,
225 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
226 ).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
248 prebuilt_systemserverclasspath_fragment {
249 name: "mysystemserverclasspathfragment",
250 prefer: true,
251 contents: [
252 "foo",
253 ],
254 apex_available: [
255 "myapex",
256 ],
257 }
258 `)
259
Jiakai Zhang774dd302021-09-26 03:54:25 +0000260 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex", []string{
261 `myapex.apex.selector`,
262 `prebuilt_mysystemserverclasspathfragment`,
263 })
264
265 java.CheckModuleDependencies(t, result.TestContext, "mysystemserverclasspathfragment", "android_common_myapex", []string{
266 `myapex.deapexer`,
Jiakai Zhangc9864272021-09-26 03:52:19 +0000267 `prebuilt_foo`,
268 })
269}
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000270
271func TestSystemserverclasspathFragmentStandaloneContents(t *testing.T) {
272 result := android.GroupFixturePreparers(
273 prepareForTestWithSystemserverclasspathFragment,
274 prepareForTestWithMyapex,
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000275 dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo", "myapex:bar", "myapex:baz"),
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000276 ).RunTestWithBp(t, `
277 apex {
278 name: "myapex",
279 key: "myapex.key",
280 systemserverclasspath_fragments: [
281 "mysystemserverclasspathfragment",
282 ],
283 updatable: false,
284 }
285
286 apex_key {
287 name: "myapex.key",
288 public_key: "testkey.avbpubkey",
289 private_key: "testkey.pem",
290 }
291
292 java_library {
293 name: "foo",
294 srcs: ["b.java"],
295 installable: true,
296 apex_available: [
297 "myapex",
298 ],
299 }
300
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800301 java_library {
302 name: "bar",
303 srcs: ["c.java"],
304 dex_preopt: {
305 profile: "bar-art-profile",
306 },
307 installable: true,
308 apex_available: [
309 "myapex",
310 ],
311 }
312
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000313 java_library {
314 name: "baz",
315 srcs: ["d.java"],
316 dex_preopt: {
317 profile_guided: true, // ignored
318 },
319 installable: true,
320 apex_available: [
321 "myapex",
322 ],
323 }
324
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000325 systemserverclasspath_fragment {
326 name: "mysystemserverclasspathfragment",
327 standalone_contents: [
328 "foo",
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800329 "bar",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000330 "baz",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000331 ],
332 apex_available: [
333 "myapex",
334 ],
335 }
336 `)
337
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000338 ctx := result.TestContext
339
340 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000341 "etc/classpaths/systemserverclasspath.pb",
342 "javalib/foo.jar",
Jiakai Zhang3317ce72023-02-08 01:19:19 +0800343 "javalib/bar.jar",
344 "javalib/bar.jar.prof",
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000345 "javalib/baz.jar",
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000346 })
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000347
348 assertProfileGuided(t, ctx, "foo", "android_common_apex10000", false)
349 assertProfileGuided(t, ctx, "bar", "android_common_apex10000", true)
350 assertProfileGuided(t, ctx, "baz", "android_common_apex10000", false)
Jiakai Zhangcee9e192021-10-29 19:46:45 +0000351}
352
353func TestPrebuiltStandaloneSystemserverclasspathFragmentContents(t *testing.T) {
354 result := android.GroupFixturePreparers(
355 prepareForTestWithSystemserverclasspathFragment,
356 prepareForTestWithMyapex,
357 dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo"),
358 ).RunTestWithBp(t, `
359 prebuilt_apex {
360 name: "myapex",
361 arch: {
362 arm64: {
363 src: "myapex-arm64.apex",
364 },
365 arm: {
366 src: "myapex-arm.apex",
367 },
368 },
369 exported_systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
370 }
371
372 java_import {
373 name: "foo",
374 jars: ["foo.jar"],
375 apex_available: [
376 "myapex",
377 ],
378 }
379
380 prebuilt_systemserverclasspath_fragment {
381 name: "mysystemserverclasspathfragment",
382 prefer: true,
383 standalone_contents: [
384 "foo",
385 ],
386 apex_available: [
387 "myapex",
388 ],
389 }
390 `)
391
392 java.CheckModuleDependencies(t, result.TestContext, "mysystemserverclasspathfragment", "android_common_myapex", []string{
393 `myapex.deapexer`,
394 `prebuilt_foo`,
395 })
396}
Jiakai Zhang1f4542c2023-02-15 22:43:09 +0000397
398func assertProfileGuided(t *testing.T, ctx *android.TestContext, moduleName string, variant string, expected bool) {
399 dexpreopt := ctx.ModuleForTests(moduleName, variant).Rule("dexpreopt")
400 actual := strings.Contains(dexpreopt.RuleParams.Command, "--profile-file=")
401 if expected != actual {
402 t.Fatalf("Expected profile-guided to be %v, got %v", expected, actual)
403 }
404}