blob: 53afbb57714605ac92c353e6f5947ec95cbbb776 [file] [log] [blame]
Paul Duffin3451e162021-01-20 15:16:56 +00001// 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 (
Paul Duffinba6afd02019-11-19 19:44:10 +000018 "fmt"
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +000019 "path"
Paul Duffince918b02021-06-07 14:33:47 +010020 "sort"
Paul Duffina1d60252021-01-21 18:13:43 +000021 "strings"
Paul Duffin3451e162021-01-20 15:16:56 +000022 "testing"
23
24 "android/soong/android"
Jiakai Zhang49b1eb62021-11-26 18:09:27 +000025 "android/soong/dexpreopt"
Paul Duffin3451e162021-01-20 15:16:56 +000026 "android/soong/java"
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +010027
Paul Duffin5cca7c42021-05-26 10:16:01 +010028 "github.com/google/blueprint/proptools"
Paul Duffin3451e162021-01-20 15:16:56 +000029)
30
Paul Duffin7771eba2021-04-23 14:25:28 +010031// Contains tests for bootclasspath_fragment logic from java/bootclasspath_fragment.go as the ART
32// bootclasspath_fragment requires modules from the ART apex.
Paul Duffin3451e162021-01-20 15:16:56 +000033
Paul Duffin94f19632021-04-20 12:40:07 +010034var prepareForTestWithBootclasspathFragment = android.GroupFixturePreparers(
Paul Duffin52bfaa42021-03-23 23:40:12 +000035 java.PrepareForTestWithDexpreopt,
36 PrepareForTestWithApexBuildComponents,
37)
38
39// Some additional files needed for the art apex.
Jiakai Zhang49b1eb62021-11-26 18:09:27 +000040var prepareForTestWithArtApex = android.GroupFixturePreparers(
41 android.FixtureMergeMockFs(android.MockFS{
42 "com.android.art.avbpubkey": nil,
43 "com.android.art.pem": nil,
44 "system/sepolicy/apex/com.android.art-file_contexts": nil,
45 }),
46 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
47)
Paul Duffin52bfaa42021-03-23 23:40:12 +000048
Paul Duffin94f19632021-04-20 12:40:07 +010049func TestBootclasspathFragments(t *testing.T) {
Paul Duffin52bfaa42021-03-23 23:40:12 +000050 result := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +010051 prepareForTestWithBootclasspathFragment,
Paul Duffin7771eba2021-04-23 14:25:28 +010052 // Configure some libraries in the art bootclasspath_fragment and platform_bootclasspath.
Paul Duffin60264a02021-04-12 20:02:36 +010053 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz", "platform:foo", "platform:bar"),
Paul Duffin52bfaa42021-03-23 23:40:12 +000054 prepareForTestWithArtApex,
55
56 java.PrepareForTestWithJavaSdkLibraryFiles,
57 java.FixtureWithLastReleaseApis("foo"),
Paul Duffin34d433a2021-03-09 14:13:25 +000058 ).RunTestWithBp(t, `
Paul Duffin3451e162021-01-20 15:16:56 +000059 java_sdk_library {
60 name: "foo",
61 srcs: ["b.java"],
Paul Duffin3451e162021-01-20 15:16:56 +000062 }
63
64 java_library {
65 name: "bar",
66 srcs: ["b.java"],
67 installable: true,
68 }
69
70 apex {
71 name: "com.android.art",
72 key: "com.android.art.key",
Paul Duffin58e0e762021-05-21 19:27:58 +010073 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +000074 updatable: false,
Paul Duffin3451e162021-01-20 15:16:56 +000075 }
76
77 apex_key {
78 name: "com.android.art.key",
79 public_key: "com.android.art.avbpubkey",
80 private_key: "com.android.art.pem",
81 }
82
83 java_library {
84 name: "baz",
85 apex_available: [
86 "com.android.art",
87 ],
88 srcs: ["b.java"],
Paul Duffine5218812021-06-07 13:28:19 +010089 compile_dex: true,
Paul Duffin3451e162021-01-20 15:16:56 +000090 }
91
92 java_library {
93 name: "quuz",
94 apex_available: [
95 "com.android.art",
96 ],
97 srcs: ["b.java"],
Paul Duffine5218812021-06-07 13:28:19 +010098 compile_dex: true,
Paul Duffin3451e162021-01-20 15:16:56 +000099 }
Paul Duffin5bbfef82021-01-30 12:57:26 +0000100
Paul Duffin94f19632021-04-20 12:40:07 +0100101 bootclasspath_fragment {
102 name: "art-bootclasspath-fragment",
Paul Duffin5bbfef82021-01-30 12:57:26 +0000103 image_name: "art",
Paul Duffinf23bc472021-04-27 12:42:20 +0100104 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
105 contents: ["baz", "quuz"],
Paul Duffinc7ef9892021-03-23 23:21:59 +0000106 apex_available: [
107 "com.android.art",
108 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100109 hidden_api: {
110 split_packages: ["*"],
111 },
Paul Duffin5bbfef82021-01-30 12:57:26 +0000112 }
Paul Duffin3451e162021-01-20 15:16:56 +0000113`,
Paul Duffin3451e162021-01-20 15:16:56 +0000114 )
115
Paul Duffin94f19632021-04-20 12:40:07 +0100116 // Make sure that the art-bootclasspath-fragment is using the correct configuration.
Paul Duffin58e0e762021-05-21 19:27:58 +0100117 checkBootclasspathFragment(t, result, "art-bootclasspath-fragment", "android_common_apex10000",
Jiakai Zhangb47cacc2023-05-10 16:40:18 +0100118 "com.android.art:baz,com.android.art:quuz")
Paul Duffin3451e162021-01-20 15:16:56 +0000119}
120
Paul Duffinf1b358c2021-05-17 07:38:47 +0100121func TestBootclasspathFragments_FragmentDependency(t *testing.T) {
122 result := android.GroupFixturePreparers(
123 prepareForTestWithBootclasspathFragment,
124 // Configure some libraries in the art bootclasspath_fragment and platform_bootclasspath.
satayevabcd5972021-08-06 17:49:46 +0100125 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
126 java.FixtureConfigureApexBootJars("someapex:foo", "someapex:bar"),
Paul Duffinf1b358c2021-05-17 07:38:47 +0100127 prepareForTestWithArtApex,
128
129 java.PrepareForTestWithJavaSdkLibraryFiles,
130 java.FixtureWithLastReleaseApis("foo", "baz"),
131 ).RunTestWithBp(t, `
132 java_sdk_library {
133 name: "foo",
134 srcs: ["b.java"],
135 shared_library: false,
136 public: {
137 enabled: true,
138 },
139 system: {
140 enabled: true,
141 },
142 }
143
144 java_library {
145 name: "bar",
146 srcs: ["b.java"],
147 installable: true,
148 }
149
150 apex {
151 name: "com.android.art",
152 key: "com.android.art.key",
153 bootclasspath_fragments: ["art-bootclasspath-fragment"],
154 updatable: false,
155 }
156
157 apex_key {
158 name: "com.android.art.key",
159 public_key: "com.android.art.avbpubkey",
160 private_key: "com.android.art.pem",
161 }
162
163 java_sdk_library {
164 name: "baz",
165 apex_available: [
166 "com.android.art",
167 ],
168 srcs: ["b.java"],
169 shared_library: false,
170 public: {
171 enabled: true,
172 },
173 system: {
174 enabled: true,
175 },
176 test: {
177 enabled: true,
178 },
179 }
180
181 java_library {
182 name: "quuz",
183 apex_available: [
184 "com.android.art",
185 ],
186 srcs: ["b.java"],
187 compile_dex: true,
188 }
189
190 bootclasspath_fragment {
191 name: "art-bootclasspath-fragment",
192 image_name: "art",
193 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
194 contents: ["baz", "quuz"],
195 apex_available: [
196 "com.android.art",
197 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100198 hidden_api: {
199 split_packages: ["*"],
200 },
Paul Duffinf1b358c2021-05-17 07:38:47 +0100201 }
202
203 bootclasspath_fragment {
204 name: "other-bootclasspath-fragment",
205 contents: ["foo", "bar"],
206 fragments: [
207 {
208 apex: "com.android.art",
209 module: "art-bootclasspath-fragment",
210 },
211 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100212 hidden_api: {
213 split_packages: ["*"],
214 },
Paul Duffinf1b358c2021-05-17 07:38:47 +0100215 }
216`,
217 )
218
Paul Duffin31fad802021-06-18 18:14:25 +0100219 checkAPIScopeStubs := func(message string, info java.HiddenAPIInfo, apiScope *java.HiddenAPIScope, expectedPaths ...string) {
Paul Duffinf1b358c2021-05-17 07:38:47 +0100220 t.Helper()
Paul Duffin280a31a2021-06-27 20:28:29 +0100221 paths := info.TransitiveStubDexJarsByScope.StubDexJarsForScope(apiScope)
222 android.AssertPathsRelativeToTopEquals(t, fmt.Sprintf("%s %s", message, apiScope), expectedPaths, paths)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100223 }
224
225 // Check stub dex paths exported by art.
226 artFragment := result.Module("art-bootclasspath-fragment", "android_common")
227 artInfo := result.ModuleProvider(artFragment, java.HiddenAPIInfoProvider).(java.HiddenAPIInfo)
228
229 bazPublicStubs := "out/soong/.intermediates/baz.stubs/android_common/dex/baz.stubs.jar"
230 bazSystemStubs := "out/soong/.intermediates/baz.stubs.system/android_common/dex/baz.stubs.system.jar"
231 bazTestStubs := "out/soong/.intermediates/baz.stubs.test/android_common/dex/baz.stubs.test.jar"
232
Paul Duffin31fad802021-06-18 18:14:25 +0100233 checkAPIScopeStubs("art", artInfo, java.PublicHiddenAPIScope, bazPublicStubs)
234 checkAPIScopeStubs("art", artInfo, java.SystemHiddenAPIScope, bazSystemStubs)
235 checkAPIScopeStubs("art", artInfo, java.TestHiddenAPIScope, bazTestStubs)
236 checkAPIScopeStubs("art", artInfo, java.CorePlatformHiddenAPIScope)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100237
238 // Check stub dex paths exported by other.
239 otherFragment := result.Module("other-bootclasspath-fragment", "android_common")
240 otherInfo := result.ModuleProvider(otherFragment, java.HiddenAPIInfoProvider).(java.HiddenAPIInfo)
241
242 fooPublicStubs := "out/soong/.intermediates/foo.stubs/android_common/dex/foo.stubs.jar"
243 fooSystemStubs := "out/soong/.intermediates/foo.stubs.system/android_common/dex/foo.stubs.system.jar"
244
Paul Duffin31fad802021-06-18 18:14:25 +0100245 checkAPIScopeStubs("other", otherInfo, java.PublicHiddenAPIScope, bazPublicStubs, fooPublicStubs)
246 checkAPIScopeStubs("other", otherInfo, java.SystemHiddenAPIScope, bazSystemStubs, fooSystemStubs)
247 checkAPIScopeStubs("other", otherInfo, java.TestHiddenAPIScope, bazTestStubs, fooSystemStubs)
248 checkAPIScopeStubs("other", otherInfo, java.CorePlatformHiddenAPIScope)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100249}
250
Jiakai Zhangb47cacc2023-05-10 16:40:18 +0100251func checkBootclasspathFragment(t *testing.T, result *android.TestResult, moduleName, variantName string, expectedConfiguredModules string) {
Paul Duffin3451e162021-01-20 15:16:56 +0000252 t.Helper()
253
Paul Duffin58e0e762021-05-21 19:27:58 +0100254 bootclasspathFragment := result.ModuleForTests(moduleName, variantName).Module().(*java.BootclasspathFragmentModule)
Paul Duffin3451e162021-01-20 15:16:56 +0000255
Paul Duffine946b322021-04-25 23:04:00 +0100256 bootclasspathFragmentInfo := result.ModuleProvider(bootclasspathFragment, java.BootclasspathFragmentApexContentInfoProvider).(java.BootclasspathFragmentApexContentInfo)
257 modules := bootclasspathFragmentInfo.Modules()
Paul Duffin34d433a2021-03-09 14:13:25 +0000258 android.AssertStringEquals(t, "invalid modules for "+moduleName, expectedConfiguredModules, modules.String())
Paul Duffin3451e162021-01-20 15:16:56 +0000259}
Paul Duffina1d60252021-01-21 18:13:43 +0000260
Paul Duffin94f19632021-04-20 12:40:07 +0100261func TestBootclasspathFragmentInArtApex(t *testing.T) {
Paul Duffinba6afd02019-11-19 19:44:10 +0000262 commonPreparer := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100263 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000264 prepareForTestWithArtApex,
265
Paul Duffinba6afd02019-11-19 19:44:10 +0000266 android.FixtureWithRootAndroidBp(`
Paul Duffina1d60252021-01-21 18:13:43 +0000267 apex {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000268 name: "com.android.art",
269 key: "com.android.art.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100270 bootclasspath_fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100271 "art-bootclasspath-fragment",
Paul Duffina1d60252021-01-21 18:13:43 +0000272 ],
Paul Duffin4d101b62021-03-24 15:42:20 +0000273 // bar (like foo) should be transitively included in this apex because it is part of the
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100274 // art-bootclasspath-fragment bootclasspath_fragment.
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000275 updatable: false,
Paul Duffina1d60252021-01-21 18:13:43 +0000276 }
277
278 apex_key {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000279 name: "com.android.art.key",
Paul Duffina1d60252021-01-21 18:13:43 +0000280 public_key: "testkey.avbpubkey",
281 private_key: "testkey.pem",
282 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000283 `),
284 )
Paul Duffin65898052021-04-20 22:47:03 +0100285
Paul Duffinba6afd02019-11-19 19:44:10 +0000286 contentsInsert := func(contents []string) string {
287 insert := ""
288 if contents != nil {
289 insert = fmt.Sprintf(`contents: ["%s"],`, strings.Join(contents, `", "`))
Paul Duffin396229f2021-03-18 18:30:31 +0000290 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000291 return insert
292 }
Paul Duffina1d60252021-01-21 18:13:43 +0000293
Paul Duffinba6afd02019-11-19 19:44:10 +0000294 addSource := func(contents ...string) android.FixturePreparer {
295 text := fmt.Sprintf(`
296 bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100297 name: "art-bootclasspath-fragment",
Paul Duffinba6afd02019-11-19 19:44:10 +0000298 image_name: "art",
299 %s
300 apex_available: [
301 "com.android.art",
302 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100303 hidden_api: {
304 split_packages: ["*"],
305 },
Paul Duffinba6afd02019-11-19 19:44:10 +0000306 }
307 `, contentsInsert(contents))
308
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100309 for _, content := range contents {
310 text += fmt.Sprintf(`
311 java_library {
312 name: "%[1]s",
313 srcs: ["%[1]s.java"],
314 installable: true,
315 apex_available: [
316 "com.android.art",
317 ],
318 }
319 `, content)
320 }
321
Paul Duffinba6afd02019-11-19 19:44:10 +0000322 return android.FixtureAddTextFile("art/build/boot/Android.bp", text)
323 }
324
325 addPrebuilt := func(prefer bool, contents ...string) android.FixturePreparer {
326 text := fmt.Sprintf(`
Paul Duffince918b02021-06-07 14:33:47 +0100327 prebuilt_apex {
328 name: "com.android.art",
329 arch: {
330 arm64: {
331 src: "com.android.art-arm64.apex",
332 },
333 arm: {
334 src: "com.android.art-arm.apex",
335 },
336 },
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100337 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffince918b02021-06-07 14:33:47 +0100338 }
339
Paul Duffinba6afd02019-11-19 19:44:10 +0000340 prebuilt_bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100341 name: "art-bootclasspath-fragment",
Paul Duffinba6afd02019-11-19 19:44:10 +0000342 image_name: "art",
343 %s
344 prefer: %t,
345 apex_available: [
346 "com.android.art",
347 ],
Paul Duffin54e41972021-07-19 13:23:40 +0100348 hidden_api: {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100349 annotation_flags: "hiddenapi/annotation-flags.csv",
350 metadata: "hiddenapi/metadata.csv",
351 index: "hiddenapi/index.csv",
352 stub_flags: "hiddenapi/stub-flags.csv",
353 all_flags: "hiddenapi/all-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +0100354 },
Paul Duffinba6afd02019-11-19 19:44:10 +0000355 }
356 `, contentsInsert(contents), prefer)
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100357
358 for _, content := range contents {
359 text += fmt.Sprintf(`
360 java_import {
361 name: "%[1]s",
362 prefer: %[2]t,
363 jars: ["%[1]s.jar"],
364 apex_available: [
365 "com.android.art",
366 ],
367 compile_dex: true,
368 }
369 `, content, prefer)
370 }
371
Paul Duffinba6afd02019-11-19 19:44:10 +0000372 return android.FixtureAddTextFile("prebuilts/module_sdk/art/Android.bp", text)
373 }
374
Paul Duffince918b02021-06-07 14:33:47 +0100375 t.Run("boot image files from source", func(t *testing.T) {
376 result := android.GroupFixturePreparers(
377 commonPreparer,
378
379 // Configure some libraries in the art bootclasspath_fragment that match the source
380 // bootclasspath_fragment's contents property.
381 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
382 addSource("foo", "bar"),
Jiakai Zhang6decef92022-01-12 17:56:19 +0000383 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Paul Duffince918b02021-06-07 14:33:47 +0100384 ).RunTest(t)
385
386 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art_image", []string{
Jiakai Zhang49b1eb62021-11-26 18:09:27 +0000387 "etc/boot-image.prof",
Paul Duffince918b02021-06-07 14:33:47 +0100388 "etc/classpaths/bootclasspath.pb",
Paul Duffince918b02021-06-07 14:33:47 +0100389 "javalib/bar.jar",
390 "javalib/foo.jar",
391 })
392
393 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art_image", []string{
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100394 `art-bootclasspath-fragment`,
Paul Duffince918b02021-06-07 14:33:47 +0100395 `com.android.art.key`,
Paul Duffince918b02021-06-07 14:33:47 +0100396 })
397
398 // Make sure that the source bootclasspath_fragment copies its dex files to the predefined
399 // locations for the art image.
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100400 module := result.ModuleForTests("art-bootclasspath-fragment", "android_common_apex10000")
Paul Duffince918b02021-06-07 14:33:47 +0100401 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
402 })
403
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000404 t.Run("generate boot image profile even if dexpreopt is disabled", func(t *testing.T) {
405 result := android.GroupFixturePreparers(
406 commonPreparer,
407
408 // Configure some libraries in the art bootclasspath_fragment that match the source
409 // bootclasspath_fragment's contents property.
410 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
411 addSource("foo", "bar"),
412 java.FixtureSetBootImageInstallDirOnDevice("art", "system/framework"),
413 dexpreopt.FixtureDisableDexpreoptBootImages(true),
414 ).RunTest(t)
415
416 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art_image", []string{
417 "etc/boot-image.prof",
418 "etc/classpaths/bootclasspath.pb",
419 "javalib/bar.jar",
420 "javalib/foo.jar",
421 })
422 })
423
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000424 t.Run("boot image disable generate profile", func(t *testing.T) {
425 result := android.GroupFixturePreparers(
426 commonPreparer,
427
428 // Configure some libraries in the art bootclasspath_fragment that match the source
429 // bootclasspath_fragment's contents property.
430 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
431 addSource("foo", "bar"),
432 dexpreopt.FixtureDisableGenerateProfile(true),
433 ).RunTest(t)
434
435 files := getFiles(t, result.TestContext, "com.android.art", "android_common_com.android.art_image")
436 for _, file := range files {
437 matched, _ := path.Match("etc/boot-image.prof", file.path)
438 android.AssertBoolEquals(t, "\"etc/boot-image.prof\" should not be in the APEX", matched, false)
439 }
440 })
441
Paul Duffince918b02021-06-07 14:33:47 +0100442 t.Run("boot image files with preferred prebuilt", func(t *testing.T) {
Paul Duffinba6afd02019-11-19 19:44:10 +0000443 result := android.GroupFixturePreparers(
444 commonPreparer,
445
446 // Configure some libraries in the art bootclasspath_fragment that match the source
447 // bootclasspath_fragment's contents property.
448 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
449 addSource("foo", "bar"),
450
451 // Make sure that a preferred prebuilt with consistent contents doesn't affect the apex.
452 addPrebuilt(true, "foo", "bar"),
Jiakai Zhang6decef92022-01-12 17:56:19 +0000453
454 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Paul Duffinba6afd02019-11-19 19:44:10 +0000455 ).RunTest(t)
456
Jiakai Zhangebf48bf2023-02-10 01:51:53 +0800457 ensureExactDeapexedContents(t, result.TestContext, "com.android.art", "android_common", []string{
Jiakai Zhang49b1eb62021-11-26 18:09:27 +0000458 "etc/boot-image.prof",
Paul Duffinba6afd02019-11-19 19:44:10 +0000459 "javalib/bar.jar",
460 "javalib/foo.jar",
461 })
462
463 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art_image", []string{
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100464 `art-bootclasspath-fragment`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000465 `com.android.art.key`,
Paul Duffince918b02021-06-07 14:33:47 +0100466 `prebuilt_com.android.art`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000467 })
Paul Duffince918b02021-06-07 14:33:47 +0100468
469 // Make sure that the prebuilt bootclasspath_fragment copies its dex files to the predefined
470 // locations for the art image.
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100471 module := result.ModuleForTests("prebuilt_art-bootclasspath-fragment", "android_common_com.android.art")
Paul Duffince918b02021-06-07 14:33:47 +0100472 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffina1d60252021-01-21 18:13:43 +0000473 })
Paul Duffin396229f2021-03-18 18:30:31 +0000474
Paul Duffinba6afd02019-11-19 19:44:10 +0000475 t.Run("source with inconsistency between config and contents", func(t *testing.T) {
476 android.GroupFixturePreparers(
477 commonPreparer,
478
479 // Create an inconsistency between the ArtApexJars configuration and the art source
480 // bootclasspath_fragment module's contents property.
481 java.FixtureConfigureBootJars("com.android.art:foo"),
482 addSource("foo", "bar"),
483 ).
484 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
485 RunTest(t)
486 })
487
488 t.Run("prebuilt with inconsistency between config and contents", func(t *testing.T) {
489 android.GroupFixturePreparers(
490 commonPreparer,
491
492 // Create an inconsistency between the ArtApexJars configuration and the art
493 // prebuilt_bootclasspath_fragment module's contents property.
494 java.FixtureConfigureBootJars("com.android.art:foo"),
495 addPrebuilt(false, "foo", "bar"),
496 ).
497 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
498 RunTest(t)
499 })
500
501 t.Run("preferred prebuilt with inconsistency between config and contents", func(t *testing.T) {
502 android.GroupFixturePreparers(
503 commonPreparer,
504
505 // Create an inconsistency between the ArtApexJars configuration and the art
506 // prebuilt_bootclasspath_fragment module's contents property.
507 java.FixtureConfigureBootJars("com.android.art:foo"),
508 addPrebuilt(true, "foo", "bar"),
509
510 // Source contents property is consistent with the config.
511 addSource("foo"),
512 ).
513 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
514 RunTest(t)
515 })
516
517 t.Run("source preferred and prebuilt with inconsistency between config and contents", func(t *testing.T) {
518 android.GroupFixturePreparers(
519 commonPreparer,
520
521 // Create an inconsistency between the ArtApexJars configuration and the art
522 // prebuilt_bootclasspath_fragment module's contents property.
523 java.FixtureConfigureBootJars("com.android.art:foo"),
524 addPrebuilt(false, "foo", "bar"),
525
526 // Source contents property is consistent with the config.
527 addSource("foo"),
528
529 // This should pass because while the prebuilt is inconsistent with the configuration it is
530 // not actually used.
531 ).RunTest(t)
Paul Duffin396229f2021-03-18 18:30:31 +0000532 })
Paul Duffina1d60252021-01-21 18:13:43 +0000533}
534
Paul Duffin94f19632021-04-20 12:40:07 +0100535func TestBootclasspathFragmentInPrebuiltArtApex(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100536 preparers := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100537 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000538 prepareForTestWithArtApex,
539
540 android.FixtureMergeMockFs(android.MockFS{
541 "com.android.art-arm64.apex": nil,
542 "com.android.art-arm.apex": nil,
543 }),
544
Paul Duffin7771eba2021-04-23 14:25:28 +0100545 // Configure some libraries in the art bootclasspath_fragment.
Paul Duffin60264a02021-04-12 20:02:36 +0100546 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhange6e90db2022-01-28 14:58:56 +0000547 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100548 )
549
550 bp := `
Paul Duffin9ea71c02021-03-23 22:53:07 +0000551 prebuilt_apex {
552 name: "com.android.art",
553 arch: {
554 arm64: {
555 src: "com.android.art-arm64.apex",
556 },
557 arm: {
558 src: "com.android.art-arm.apex",
559 },
560 },
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100561 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000562 }
563
564 java_import {
565 name: "foo",
566 jars: ["foo.jar"],
567 apex_available: [
568 "com.android.art",
569 ],
570 }
571
572 java_import {
573 name: "bar",
574 jars: ["bar.jar"],
575 apex_available: [
576 "com.android.art",
577 ],
578 }
579
Paul Duffin7771eba2021-04-23 14:25:28 +0100580 prebuilt_bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100581 name: "art-bootclasspath-fragment",
Paul Duffin9ea71c02021-03-23 22:53:07 +0000582 image_name: "art",
Paul Duffinf23bc472021-04-27 12:42:20 +0100583 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
584 contents: ["foo", "bar"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000585 apex_available: [
586 "com.android.art",
587 ],
Paul Duffin54e41972021-07-19 13:23:40 +0100588 hidden_api: {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100589 annotation_flags: "hiddenapi/annotation-flags.csv",
590 metadata: "hiddenapi/metadata.csv",
591 index: "hiddenapi/index.csv",
592 stub_flags: "hiddenapi/stub-flags.csv",
593 all_flags: "hiddenapi/all-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +0100594 },
Paul Duffin9ea71c02021-03-23 22:53:07 +0000595 }
Paul Duffin9ea71c02021-03-23 22:53:07 +0000596
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100597 // A prebuilt apex with the same apex_name that shouldn't interfere when it isn't enabled.
598 prebuilt_apex {
599 name: "com.mycompany.android.art",
600 apex_name: "com.android.art",
601 %s
602 src: "com.mycompany.android.art.apex",
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100603 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100604 }
605 `
606
607 t.Run("disabled alternative APEX", func(t *testing.T) {
608 result := preparers.RunTestWithBp(t, fmt.Sprintf(bp, "enabled: false,"))
609
610 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
611 `com.android.art.apex.selector`,
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100612 `prebuilt_art-bootclasspath-fragment`,
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100613 })
614
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100615 java.CheckModuleDependencies(t, result.TestContext, "art-bootclasspath-fragment", "android_common_com.android.art", []string{
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100616 `com.android.art.deapexer`,
617 `dex2oatd`,
618 `prebuilt_bar`,
619 `prebuilt_foo`,
620 })
621
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100622 module := result.ModuleForTests("art-bootclasspath-fragment", "android_common_com.android.art")
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100623 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffin9ea71c02021-03-23 22:53:07 +0000624 })
625
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100626 t.Run("enabled alternative APEX", func(t *testing.T) {
627 preparers.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
628 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.art and com.mycompany.android.art")).
629 RunTestWithBp(t, fmt.Sprintf(bp, ""))
Paul Duffin9ea71c02021-03-23 22:53:07 +0000630 })
Paul Duffince918b02021-06-07 14:33:47 +0100631}
632
633// checkCopiesToPredefinedLocationForArt checks that the supplied modules are copied to the
634// predefined locations of boot dex jars used as inputs for the ART boot image.
635func checkCopiesToPredefinedLocationForArt(t *testing.T, config android.Config, module android.TestingModule, modules ...string) {
636 t.Helper()
637 bootJarLocations := []string{}
638 for _, output := range module.AllOutputs() {
639 output = android.StringRelativeToTop(config, output)
Jeongik Cha4753b392023-04-19 23:25:41 +0900640 if strings.HasPrefix(output, "out/soong/dexpreopt_arm64/dex_artjars_input/") {
Paul Duffince918b02021-06-07 14:33:47 +0100641 bootJarLocations = append(bootJarLocations, output)
642 }
643 }
644
645 sort.Strings(bootJarLocations)
646 expected := []string{}
647 for _, m := range modules {
Jeongik Cha4753b392023-04-19 23:25:41 +0900648 expected = append(expected, fmt.Sprintf("out/soong/dexpreopt_arm64/dex_artjars_input/%s.jar", m))
Paul Duffince918b02021-06-07 14:33:47 +0100649 }
650 sort.Strings(expected)
651
652 android.AssertArrayString(t, "copies to predefined locations for art", expected, bootJarLocations)
Paul Duffin9ea71c02021-03-23 22:53:07 +0000653}
654
Paul Duffin94f19632021-04-20 12:40:07 +0100655func TestBootclasspathFragmentContentsNoName(t *testing.T) {
Paul Duffin82886d62021-03-24 01:34:57 +0000656 result := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100657 prepareForTestWithBootclasspathFragment,
Paul Duffin82886d62021-03-24 01:34:57 +0000658 prepareForTestWithMyapex,
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100659 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100660 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100661 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
662 // is disabled.
663 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
664
665 java.PrepareForTestWithJavaSdkLibraryFiles,
666 java.FixtureWithLastReleaseApis("foo"),
Paul Duffin82886d62021-03-24 01:34:57 +0000667 ).RunTestWithBp(t, `
668 apex {
669 name: "myapex",
670 key: "myapex.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100671 bootclasspath_fragments: [
672 "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000673 ],
674 updatable: false,
675 }
676
677 apex_key {
678 name: "myapex.key",
679 public_key: "testkey.avbpubkey",
680 private_key: "testkey.pem",
681 }
682
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100683 java_sdk_library {
Paul Duffin82886d62021-03-24 01:34:57 +0000684 name: "foo",
685 srcs: ["b.java"],
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100686 shared_library: false,
687 public: {enabled: true},
Paul Duffin82886d62021-03-24 01:34:57 +0000688 apex_available: [
689 "myapex",
690 ],
691 }
692
693 java_library {
694 name: "bar",
695 srcs: ["b.java"],
696 installable: true,
697 apex_available: [
698 "myapex",
699 ],
700 }
701
Paul Duffin7771eba2021-04-23 14:25:28 +0100702 bootclasspath_fragment {
Paul Duffin94f19632021-04-20 12:40:07 +0100703 name: "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000704 contents: [
705 "foo",
706 "bar",
707 ],
708 apex_available: [
709 "myapex",
710 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100711 hidden_api: {
712 split_packages: ["*"],
713 },
Paul Duffin82886d62021-03-24 01:34:57 +0000714 }
715 `)
716
Paul Duffin4d101b62021-03-24 15:42:20 +0000717 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
718 // This does not include art, oat or vdex files as they are only included for the art boot
719 // image.
satayev227e7452021-05-20 21:35:06 +0100720 "etc/classpaths/bootclasspath.pb",
Paul Duffin4d101b62021-03-24 15:42:20 +0000721 "javalib/bar.jar",
722 "javalib/foo.jar",
723 })
Paul Duffin82886d62021-03-24 01:34:57 +0000724
725 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
726 `myapex.key`,
Paul Duffin94f19632021-04-20 12:40:07 +0100727 `mybootclasspathfragment`,
Paul Duffin82886d62021-03-24 01:34:57 +0000728 })
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100729
730 apex := result.ModuleForTests("myapex", "android_common_myapex_image")
731 apexRule := apex.Rule("apexRule")
732 copyCommands := apexRule.Args["copy_commands"]
733
734 // Make sure that the fragment provides the hidden API encoded dex jars to the APEX.
735 fragment := result.Module("mybootclasspathfragment", "android_common_apex10000")
736
737 info := result.ModuleProvider(fragment, java.BootclasspathFragmentApexContentInfoProvider).(java.BootclasspathFragmentApexContentInfo)
738
739 checkFragmentExportedDexJar := func(name string, expectedDexJar string) {
740 module := result.Module(name, "android_common_apex10000")
Paul Duffin1a8010a2021-05-15 12:39:23 +0100741 dexJar, err := info.DexBootJarPathForContentModule(module)
742 if err != nil {
743 t.Error(err)
744 }
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100745 android.AssertPathRelativeToTopEquals(t, name+" dex", expectedDexJar, dexJar)
746
747 expectedCopyCommand := fmt.Sprintf("&& cp -f %s out/soong/.intermediates/myapex/android_common_myapex_image/image.apex/javalib/%s.jar", expectedDexJar, name)
748 android.AssertStringDoesContain(t, name+" apex copy command", copyCommands, expectedCopyCommand)
749 }
750
Paul Duffin54c98f52021-05-15 08:54:30 +0100751 checkFragmentExportedDexJar("foo", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/foo.jar")
752 checkFragmentExportedDexJar("bar", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/bar.jar")
Paul Duffin82886d62021-03-24 01:34:57 +0000753}
754
Paul Duffin48b67412021-06-23 16:13:50 +0100755func getDexJarPath(result *android.TestResult, name string) string {
756 module := result.Module(name, "android_common")
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +0100757 return module.(java.UsesLibraryDependency).DexJarBuildPath().Path().RelativeToTop().String()
Paul Duffin48b67412021-06-23 16:13:50 +0100758}
759
760// TestBootclasspathFragment_HiddenAPIList checks to make sure that the correct parameters are
761// passed to the hiddenapi list tool.
762func TestBootclasspathFragment_HiddenAPIList(t *testing.T) {
763 result := android.GroupFixturePreparers(
764 prepareForTestWithBootclasspathFragment,
765 prepareForTestWithArtApex,
766 prepareForTestWithMyapex,
767 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
768 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
satayevd604b212021-07-21 14:23:52 +0100769 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin48b67412021-06-23 16:13:50 +0100770 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
771 // is disabled.
772 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
773
774 java.PrepareForTestWithJavaSdkLibraryFiles,
775 java.FixtureWithLastReleaseApis("foo", "quuz"),
776 ).RunTestWithBp(t, `
777 apex {
778 name: "com.android.art",
779 key: "com.android.art.key",
780 bootclasspath_fragments: ["art-bootclasspath-fragment"],
781 updatable: false,
782 }
783
784 apex_key {
785 name: "com.android.art.key",
786 public_key: "com.android.art.avbpubkey",
787 private_key: "com.android.art.pem",
788 }
789
790 java_library {
791 name: "baz",
792 apex_available: [
793 "com.android.art",
794 ],
795 srcs: ["b.java"],
796 compile_dex: true,
797 }
798
799 java_sdk_library {
800 name: "quuz",
801 apex_available: [
802 "com.android.art",
803 ],
804 srcs: ["b.java"],
805 compile_dex: true,
806 public: {enabled: true},
807 system: {enabled: true},
808 test: {enabled: true},
809 module_lib: {enabled: true},
810 }
811
812 bootclasspath_fragment {
813 name: "art-bootclasspath-fragment",
814 image_name: "art",
815 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
816 contents: ["baz", "quuz"],
817 apex_available: [
818 "com.android.art",
819 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100820 hidden_api: {
821 split_packages: ["*"],
822 },
Paul Duffin48b67412021-06-23 16:13:50 +0100823 }
824
825 apex {
826 name: "myapex",
827 key: "myapex.key",
828 bootclasspath_fragments: [
829 "mybootclasspathfragment",
830 ],
831 updatable: false,
832 }
833
834 apex_key {
835 name: "myapex.key",
836 public_key: "testkey.avbpubkey",
837 private_key: "testkey.pem",
838 }
839
840 java_sdk_library {
841 name: "foo",
842 srcs: ["b.java"],
843 shared_library: false,
844 public: {enabled: true},
845 apex_available: [
846 "myapex",
847 ],
848 }
849
850 java_library {
851 name: "bar",
852 srcs: ["b.java"],
853 installable: true,
854 apex_available: [
855 "myapex",
856 ],
857 }
858
859 bootclasspath_fragment {
860 name: "mybootclasspathfragment",
861 contents: [
862 "foo",
863 "bar",
864 ],
865 apex_available: [
866 "myapex",
867 ],
868 fragments: [
869 {
870 apex: "com.android.art",
871 module: "art-bootclasspath-fragment",
872 },
873 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100874 hidden_api: {
875 split_packages: ["*"],
876 },
Paul Duffin48b67412021-06-23 16:13:50 +0100877 }
878 `)
879
880 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
881 "art-bootclasspath-fragment",
882 "bar",
883 "dex2oatd",
884 "foo",
885 })
886
887 fooStubs := getDexJarPath(result, "foo.stubs")
888 quuzPublicStubs := getDexJarPath(result, "quuz.stubs")
889 quuzSystemStubs := getDexJarPath(result, "quuz.stubs.system")
890 quuzTestStubs := getDexJarPath(result, "quuz.stubs.test")
Paul Duffinb51db2e2021-06-21 14:08:08 +0100891 quuzModuleLibStubs := getDexJarPath(result, "quuz.stubs.module_lib")
Paul Duffin48b67412021-06-23 16:13:50 +0100892
893 // Make sure that the fragment uses the quuz stub dex jars when generating the hidden API flags.
894 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
895
896 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
897 command := rule.RuleParams.Command
898 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
899
900 // Make sure that the quuz stubs are available for resolving references from the implementation
901 // boot dex jars provided by this module.
Paul Duffinb51db2e2021-06-21 14:08:08 +0100902 android.AssertStringDoesContain(t, "quuz widest", command, "--dependency-stub-dex="+quuzModuleLibStubs)
Paul Duffin48b67412021-06-23 16:13:50 +0100903
904 // Make sure that the quuz stubs are available for resolving references from the different API
905 // stubs provided by this module.
906 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+quuzPublicStubs+":"+fooStubs)
907 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+quuzSystemStubs+":"+fooStubs)
908 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+quuzTestStubs+":"+fooStubs)
909}
910
Paul Duffin5cca7c42021-05-26 10:16:01 +0100911// TestBootclasspathFragment_AndroidNonUpdatable checks to make sure that setting
912// additional_stubs: ["android-non-updatable"] causes the source android-non-updatable modules to be
913// added to the hiddenapi list tool.
914func TestBootclasspathFragment_AndroidNonUpdatable(t *testing.T) {
915 result := android.GroupFixturePreparers(
916 prepareForTestWithBootclasspathFragment,
917 prepareForTestWithArtApex,
918 prepareForTestWithMyapex,
919 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100920 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
921 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +0100922 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
923 // is disabled.
924 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
925
926 java.PrepareForTestWithJavaSdkLibraryFiles,
927 java.FixtureWithLastReleaseApis("foo", "android-non-updatable"),
928 ).RunTestWithBp(t, `
929 java_sdk_library {
930 name: "android-non-updatable",
931 srcs: ["b.java"],
932 compile_dex: true,
933 public: {
934 enabled: true,
935 },
936 system: {
937 enabled: true,
938 },
939 test: {
940 enabled: true,
941 },
942 module_lib: {
943 enabled: true,
944 },
945 }
946
947 apex {
948 name: "com.android.art",
949 key: "com.android.art.key",
950 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +0100951 updatable: false,
952 }
953
954 apex_key {
955 name: "com.android.art.key",
956 public_key: "com.android.art.avbpubkey",
957 private_key: "com.android.art.pem",
958 }
959
960 java_library {
961 name: "baz",
962 apex_available: [
963 "com.android.art",
964 ],
965 srcs: ["b.java"],
966 compile_dex: true,
967 }
968
969 java_library {
970 name: "quuz",
971 apex_available: [
972 "com.android.art",
973 ],
974 srcs: ["b.java"],
975 compile_dex: true,
976 }
977
978 bootclasspath_fragment {
979 name: "art-bootclasspath-fragment",
980 image_name: "art",
981 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
982 contents: ["baz", "quuz"],
983 apex_available: [
984 "com.android.art",
985 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100986 hidden_api: {
987 split_packages: ["*"],
988 },
Paul Duffin5cca7c42021-05-26 10:16:01 +0100989 }
990
991 apex {
992 name: "myapex",
993 key: "myapex.key",
994 bootclasspath_fragments: [
995 "mybootclasspathfragment",
996 ],
997 updatable: false,
998 }
999
1000 apex_key {
1001 name: "myapex.key",
1002 public_key: "testkey.avbpubkey",
1003 private_key: "testkey.pem",
1004 }
1005
1006 java_sdk_library {
1007 name: "foo",
1008 srcs: ["b.java"],
1009 shared_library: false,
1010 public: {enabled: true},
1011 apex_available: [
1012 "myapex",
1013 ],
1014 }
1015
1016 java_library {
1017 name: "bar",
1018 srcs: ["b.java"],
1019 installable: true,
1020 apex_available: [
1021 "myapex",
1022 ],
1023 }
1024
1025 bootclasspath_fragment {
1026 name: "mybootclasspathfragment",
1027 contents: [
1028 "foo",
1029 "bar",
1030 ],
1031 apex_available: [
1032 "myapex",
1033 ],
1034 additional_stubs: ["android-non-updatable"],
1035 fragments: [
1036 {
1037 apex: "com.android.art",
1038 module: "art-bootclasspath-fragment",
1039 },
1040 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001041 hidden_api: {
1042 split_packages: ["*"],
1043 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001044 }
1045 `)
1046
1047 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
1048 "android-non-updatable.stubs",
1049 "android-non-updatable.stubs.module_lib",
1050 "android-non-updatable.stubs.system",
1051 "android-non-updatable.stubs.test",
1052 "art-bootclasspath-fragment",
1053 "bar",
1054 "dex2oatd",
1055 "foo",
1056 })
1057
1058 nonUpdatablePublicStubs := getDexJarPath(result, "android-non-updatable.stubs")
1059 nonUpdatableSystemStubs := getDexJarPath(result, "android-non-updatable.stubs.system")
1060 nonUpdatableTestStubs := getDexJarPath(result, "android-non-updatable.stubs.test")
1061 nonUpdatableModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.module_lib")
1062
1063 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1064 // API flags.
1065 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1066
1067 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1068 command := rule.RuleParams.Command
1069 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1070
1071 // Make sure that the module_lib non-updatable stubs are available for resolving references from
1072 // the implementation boot dex jars provided by this module.
1073 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
1074
1075 // Make sure that the appropriate non-updatable stubs are available for resolving references from
1076 // the different API stubs provided by this module.
1077 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
1078 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
1079 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
1080}
1081
1082// TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks checks to make sure that
1083// setting additional_stubs: ["android-non-updatable"] causes the prebuilt android-non-updatable
1084// modules to be added to the hiddenapi list tool.
1085func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *testing.T) {
1086 result := android.GroupFixturePreparers(
1087 prepareForTestWithBootclasspathFragment,
Jiakai Zhangb95998b2023-05-11 16:39:27 +01001088 java.PrepareForTestWithDexpreopt,
Paul Duffin5cca7c42021-05-26 10:16:01 +01001089 prepareForTestWithArtApex,
1090 prepareForTestWithMyapex,
1091 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +01001092 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
1093 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +01001094 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1095 // is disabled.
1096 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1097
1098 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1099 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
1100 }),
1101
1102 java.PrepareForTestWithJavaSdkLibraryFiles,
1103 java.FixtureWithPrebuiltApis(map[string][]string{
1104 "current": {"android-non-updatable"},
1105 "30": {"foo"},
1106 }),
1107 ).RunTestWithBp(t, `
1108 apex {
1109 name: "com.android.art",
1110 key: "com.android.art.key",
1111 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +01001112 updatable: false,
1113 }
1114
1115 apex_key {
1116 name: "com.android.art.key",
1117 public_key: "com.android.art.avbpubkey",
1118 private_key: "com.android.art.pem",
1119 }
1120
1121 java_library {
1122 name: "baz",
1123 apex_available: [
1124 "com.android.art",
1125 ],
1126 srcs: ["b.java"],
1127 compile_dex: true,
1128 }
1129
1130 java_library {
1131 name: "quuz",
1132 apex_available: [
1133 "com.android.art",
1134 ],
1135 srcs: ["b.java"],
1136 compile_dex: true,
1137 }
1138
1139 bootclasspath_fragment {
1140 name: "art-bootclasspath-fragment",
1141 image_name: "art",
1142 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
1143 contents: ["baz", "quuz"],
1144 apex_available: [
1145 "com.android.art",
1146 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001147 hidden_api: {
1148 split_packages: ["*"],
1149 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001150 }
1151
1152 apex {
1153 name: "myapex",
1154 key: "myapex.key",
1155 bootclasspath_fragments: [
1156 "mybootclasspathfragment",
1157 ],
1158 updatable: false,
1159 }
1160
1161 apex_key {
1162 name: "myapex.key",
1163 public_key: "testkey.avbpubkey",
1164 private_key: "testkey.pem",
1165 }
1166
1167 java_sdk_library {
1168 name: "foo",
1169 srcs: ["b.java"],
1170 shared_library: false,
1171 public: {enabled: true},
1172 apex_available: [
1173 "myapex",
1174 ],
1175 }
1176
1177 java_library {
1178 name: "bar",
1179 srcs: ["b.java"],
1180 installable: true,
1181 apex_available: [
1182 "myapex",
1183 ],
1184 }
1185
1186 bootclasspath_fragment {
1187 name: "mybootclasspathfragment",
1188 contents: [
1189 "foo",
1190 "bar",
1191 ],
1192 apex_available: [
1193 "myapex",
1194 ],
1195 additional_stubs: ["android-non-updatable"],
1196 fragments: [
1197 {
1198 apex: "com.android.art",
1199 module: "art-bootclasspath-fragment",
1200 },
1201 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001202 hidden_api: {
1203 split_packages: ["*"],
1204 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001205 }
1206 `)
1207
1208 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
1209 "art-bootclasspath-fragment",
1210 "bar",
1211 "dex2oatd",
1212 "foo",
1213 "prebuilt_sdk_module-lib_current_android-non-updatable",
1214 "prebuilt_sdk_public_current_android-non-updatable",
1215 "prebuilt_sdk_system_current_android-non-updatable",
1216 "prebuilt_sdk_test_current_android-non-updatable",
1217 })
1218
1219 nonUpdatablePublicStubs := getDexJarPath(result, "sdk_public_current_android-non-updatable")
1220 nonUpdatableSystemStubs := getDexJarPath(result, "sdk_system_current_android-non-updatable")
1221 nonUpdatableTestStubs := getDexJarPath(result, "sdk_test_current_android-non-updatable")
1222 nonUpdatableModuleLibStubs := getDexJarPath(result, "sdk_module-lib_current_android-non-updatable")
1223
1224 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1225 // API flags.
1226 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1227
1228 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1229 command := rule.RuleParams.Command
1230 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1231
1232 // Make sure that the module_lib non-updatable stubs are available for resolving references from
1233 // the implementation boot dex jars provided by this module.
1234 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
1235
1236 // Make sure that the appropriate non-updatable stubs are available for resolving references from
1237 // the different API stubs provided by this module.
1238 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
1239 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
1240 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
1241}
1242
Paul Duffina1d60252021-01-21 18:13:43 +00001243// TODO(b/177892522) - add test for host apex.