blob: 60d111f67cb0de37c006e01f7025b493fecfea8e [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 Duffinf1b358c2021-05-17 07:38:47 +010049func TestBootclasspathFragments_FragmentDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070050 t.Parallel()
Paul Duffinf1b358c2021-05-17 07:38:47 +010051 result := android.GroupFixturePreparers(
52 prepareForTestWithBootclasspathFragment,
53 // Configure some libraries in the art bootclasspath_fragment and platform_bootclasspath.
satayevabcd5972021-08-06 17:49:46 +010054 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
55 java.FixtureConfigureApexBootJars("someapex:foo", "someapex:bar"),
Paul Duffinf1b358c2021-05-17 07:38:47 +010056 prepareForTestWithArtApex,
Colin Crossa66b4632024-08-08 15:50:47 -070057 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Paul Duffinf1b358c2021-05-17 07:38:47 +010058 java.PrepareForTestWithJavaSdkLibraryFiles,
59 java.FixtureWithLastReleaseApis("foo", "baz"),
60 ).RunTestWithBp(t, `
61 java_sdk_library {
62 name: "foo",
63 srcs: ["b.java"],
64 shared_library: false,
65 public: {
66 enabled: true,
67 },
68 system: {
69 enabled: true,
70 },
71 }
72
73 java_library {
74 name: "bar",
75 srcs: ["b.java"],
76 installable: true,
77 }
78
79 apex {
80 name: "com.android.art",
81 key: "com.android.art.key",
82 bootclasspath_fragments: ["art-bootclasspath-fragment"],
83 updatable: false,
84 }
85
86 apex_key {
87 name: "com.android.art.key",
88 public_key: "com.android.art.avbpubkey",
89 private_key: "com.android.art.pem",
90 }
91
92 java_sdk_library {
93 name: "baz",
94 apex_available: [
95 "com.android.art",
96 ],
97 srcs: ["b.java"],
98 shared_library: false,
99 public: {
100 enabled: true,
101 },
102 system: {
103 enabled: true,
104 },
105 test: {
106 enabled: true,
107 },
Jihoon Kang85bc1932024-07-01 17:04:46 +0000108 sdk_version: "core_current",
Paul Duffinf1b358c2021-05-17 07:38:47 +0100109 }
110
111 java_library {
112 name: "quuz",
113 apex_available: [
114 "com.android.art",
115 ],
116 srcs: ["b.java"],
117 compile_dex: true,
118 }
119
120 bootclasspath_fragment {
121 name: "art-bootclasspath-fragment",
122 image_name: "art",
123 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
124 contents: ["baz", "quuz"],
125 apex_available: [
126 "com.android.art",
127 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100128 hidden_api: {
129 split_packages: ["*"],
130 },
Paul Duffinf1b358c2021-05-17 07:38:47 +0100131 }
132
133 bootclasspath_fragment {
134 name: "other-bootclasspath-fragment",
135 contents: ["foo", "bar"],
136 fragments: [
137 {
138 apex: "com.android.art",
139 module: "art-bootclasspath-fragment",
140 },
141 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100142 hidden_api: {
143 split_packages: ["*"],
144 },
Paul Duffinf1b358c2021-05-17 07:38:47 +0100145 }
146`,
147 )
148
Paul Duffin31fad802021-06-18 18:14:25 +0100149 checkAPIScopeStubs := func(message string, info java.HiddenAPIInfo, apiScope *java.HiddenAPIScope, expectedPaths ...string) {
Paul Duffinf1b358c2021-05-17 07:38:47 +0100150 t.Helper()
Paul Duffin280a31a2021-06-27 20:28:29 +0100151 paths := info.TransitiveStubDexJarsByScope.StubDexJarsForScope(apiScope)
152 android.AssertPathsRelativeToTopEquals(t, fmt.Sprintf("%s %s", message, apiScope), expectedPaths, paths)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100153 }
154
155 // Check stub dex paths exported by art.
156 artFragment := result.Module("art-bootclasspath-fragment", "android_common")
Yu Liu663e4502024-08-12 18:23:59 +0000157 artInfo, _ := android.OtherModuleProvider(result, artFragment, java.HiddenAPIInfoProvider)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100158
Jihoon Kangbd093452023-12-26 19:08:01 +0000159 bazPublicStubs := "out/soong/.intermediates/baz.stubs.exportable/android_common/dex/baz.stubs.exportable.jar"
160 bazSystemStubs := "out/soong/.intermediates/baz.stubs.exportable.system/android_common/dex/baz.stubs.exportable.system.jar"
161 bazTestStubs := "out/soong/.intermediates/baz.stubs.exportable.test/android_common/dex/baz.stubs.exportable.test.jar"
Paul Duffinf1b358c2021-05-17 07:38:47 +0100162
Paul Duffin31fad802021-06-18 18:14:25 +0100163 checkAPIScopeStubs("art", artInfo, java.PublicHiddenAPIScope, bazPublicStubs)
164 checkAPIScopeStubs("art", artInfo, java.SystemHiddenAPIScope, bazSystemStubs)
165 checkAPIScopeStubs("art", artInfo, java.TestHiddenAPIScope, bazTestStubs)
166 checkAPIScopeStubs("art", artInfo, java.CorePlatformHiddenAPIScope)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100167
168 // Check stub dex paths exported by other.
169 otherFragment := result.Module("other-bootclasspath-fragment", "android_common")
Yu Liu663e4502024-08-12 18:23:59 +0000170 otherInfo, _ := android.OtherModuleProvider(result, otherFragment, java.HiddenAPIInfoProvider)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100171
Jihoon Kangbd093452023-12-26 19:08:01 +0000172 fooPublicStubs := "out/soong/.intermediates/foo.stubs.exportable/android_common/dex/foo.stubs.exportable.jar"
173 fooSystemStubs := "out/soong/.intermediates/foo.stubs.exportable.system/android_common/dex/foo.stubs.exportable.system.jar"
Paul Duffinf1b358c2021-05-17 07:38:47 +0100174
Paul Duffin31fad802021-06-18 18:14:25 +0100175 checkAPIScopeStubs("other", otherInfo, java.PublicHiddenAPIScope, bazPublicStubs, fooPublicStubs)
176 checkAPIScopeStubs("other", otherInfo, java.SystemHiddenAPIScope, bazSystemStubs, fooSystemStubs)
177 checkAPIScopeStubs("other", otherInfo, java.TestHiddenAPIScope, bazTestStubs, fooSystemStubs)
178 checkAPIScopeStubs("other", otherInfo, java.CorePlatformHiddenAPIScope)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100179}
180
Paul Duffin94f19632021-04-20 12:40:07 +0100181func TestBootclasspathFragmentInArtApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700182 t.Parallel()
Paul Duffinba6afd02019-11-19 19:44:10 +0000183 commonPreparer := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100184 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000185 prepareForTestWithArtApex,
186
Paul Duffinba6afd02019-11-19 19:44:10 +0000187 android.FixtureWithRootAndroidBp(`
Paul Duffina1d60252021-01-21 18:13:43 +0000188 apex {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000189 name: "com.android.art",
190 key: "com.android.art.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100191 bootclasspath_fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100192 "art-bootclasspath-fragment",
Paul Duffina1d60252021-01-21 18:13:43 +0000193 ],
Paul Duffin4d101b62021-03-24 15:42:20 +0000194 // bar (like foo) should be transitively included in this apex because it is part of the
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100195 // art-bootclasspath-fragment bootclasspath_fragment.
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000196 updatable: false,
Paul Duffina1d60252021-01-21 18:13:43 +0000197 }
198
Spandan Das7fd531f2024-06-05 19:27:18 +0000199 override_apex {
200 name: "com.mycompany.android.art",
201 base: "com.android.art",
202 min_sdk_version: "33", // mycompany overrides the min_sdk_version
203 }
204
Paul Duffina1d60252021-01-21 18:13:43 +0000205 apex_key {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000206 name: "com.android.art.key",
Paul Duffina1d60252021-01-21 18:13:43 +0000207 public_key: "testkey.avbpubkey",
208 private_key: "testkey.pem",
209 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000210 `),
211 )
Paul Duffin65898052021-04-20 22:47:03 +0100212
Paul Duffinba6afd02019-11-19 19:44:10 +0000213 contentsInsert := func(contents []string) string {
214 insert := ""
215 if contents != nil {
216 insert = fmt.Sprintf(`contents: ["%s"],`, strings.Join(contents, `", "`))
Paul Duffin396229f2021-03-18 18:30:31 +0000217 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000218 return insert
219 }
Paul Duffina1d60252021-01-21 18:13:43 +0000220
Paul Duffinba6afd02019-11-19 19:44:10 +0000221 addSource := func(contents ...string) android.FixturePreparer {
222 text := fmt.Sprintf(`
223 bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100224 name: "art-bootclasspath-fragment",
Paul Duffinba6afd02019-11-19 19:44:10 +0000225 image_name: "art",
226 %s
227 apex_available: [
228 "com.android.art",
229 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100230 hidden_api: {
231 split_packages: ["*"],
232 },
Paul Duffinba6afd02019-11-19 19:44:10 +0000233 }
234 `, contentsInsert(contents))
235
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100236 for _, content := range contents {
237 text += fmt.Sprintf(`
238 java_library {
239 name: "%[1]s",
240 srcs: ["%[1]s.java"],
241 installable: true,
242 apex_available: [
243 "com.android.art",
244 ],
Colin Cross09dbc012024-12-18 13:45:58 -0800245 min_sdk_version: "33",
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100246 }
247 `, content)
248 }
249
Paul Duffinba6afd02019-11-19 19:44:10 +0000250 return android.FixtureAddTextFile("art/build/boot/Android.bp", text)
251 }
252
253 addPrebuilt := func(prefer bool, contents ...string) android.FixturePreparer {
254 text := fmt.Sprintf(`
Paul Duffince918b02021-06-07 14:33:47 +0100255 prebuilt_apex {
256 name: "com.android.art",
257 arch: {
258 arm64: {
259 src: "com.android.art-arm64.apex",
260 },
261 arm: {
262 src: "com.android.art-arm.apex",
263 },
264 },
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100265 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffince918b02021-06-07 14:33:47 +0100266 }
267
Paul Duffinba6afd02019-11-19 19:44:10 +0000268 prebuilt_bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100269 name: "art-bootclasspath-fragment",
Paul Duffinba6afd02019-11-19 19:44:10 +0000270 image_name: "art",
271 %s
272 prefer: %t,
273 apex_available: [
274 "com.android.art",
275 ],
Paul Duffin54e41972021-07-19 13:23:40 +0100276 hidden_api: {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100277 annotation_flags: "hiddenapi/annotation-flags.csv",
278 metadata: "hiddenapi/metadata.csv",
279 index: "hiddenapi/index.csv",
280 stub_flags: "hiddenapi/stub-flags.csv",
281 all_flags: "hiddenapi/all-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +0100282 },
Paul Duffinba6afd02019-11-19 19:44:10 +0000283 }
284 `, contentsInsert(contents), prefer)
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100285
286 for _, content := range contents {
287 text += fmt.Sprintf(`
288 java_import {
289 name: "%[1]s",
290 prefer: %[2]t,
291 jars: ["%[1]s.jar"],
292 apex_available: [
293 "com.android.art",
294 ],
Colin Cross1cea5302024-12-03 16:40:08 -0800295 min_sdk_version: "33",
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100296 compile_dex: true,
297 }
298 `, content, prefer)
299 }
300
Paul Duffinba6afd02019-11-19 19:44:10 +0000301 return android.FixtureAddTextFile("prebuilts/module_sdk/art/Android.bp", text)
302 }
303
Paul Duffince918b02021-06-07 14:33:47 +0100304 t.Run("boot image files from source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700305 t.Parallel()
Paul Duffince918b02021-06-07 14:33:47 +0100306 result := android.GroupFixturePreparers(
307 commonPreparer,
308
309 // Configure some libraries in the art bootclasspath_fragment that match the source
310 // bootclasspath_fragment's contents property.
311 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100312 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Paul Duffince918b02021-06-07 14:33:47 +0100313 addSource("foo", "bar"),
Jiakai Zhang6decef92022-01-12 17:56:19 +0000314 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Paul Duffince918b02021-06-07 14:33:47 +0100315 ).RunTest(t)
316
Jooyung Hana0503a52023-08-23 13:12:50 +0900317 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhang49b1eb62021-11-26 18:09:27 +0000318 "etc/boot-image.prof",
Paul Duffince918b02021-06-07 14:33:47 +0100319 "etc/classpaths/bootclasspath.pb",
Paul Duffince918b02021-06-07 14:33:47 +0100320 "javalib/bar.jar",
321 "javalib/foo.jar",
322 })
323
Jooyung Hana0503a52023-08-23 13:12:50 +0900324 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Colin Cross388c6612025-01-28 14:00:12 -0800325 `all_apex_contributions`,
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100326 `art-bootclasspath-fragment`,
Paul Duffince918b02021-06-07 14:33:47 +0100327 `com.android.art.key`,
Spandan Dase21a8d42024-01-23 23:56:29 +0000328 `dex2oatd`,
Paul Duffince918b02021-06-07 14:33:47 +0100329 })
330
331 // Make sure that the source bootclasspath_fragment copies its dex files to the predefined
332 // locations for the art image.
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100333 module := result.ModuleForTests("dex_bootjars", "android_common")
Paul Duffince918b02021-06-07 14:33:47 +0100334 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
335 })
336
Spandan Das7fd531f2024-06-05 19:27:18 +0000337 t.Run("boot image files from source of override apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700338 t.Parallel()
Spandan Das7fd531f2024-06-05 19:27:18 +0000339 result := android.GroupFixturePreparers(
340 commonPreparer,
341
342 // Configure some libraries in the art bootclasspath_fragment that match the source
343 // bootclasspath_fragment's contents property.
344 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
345 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
346 addSource("foo", "bar"),
347 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
348 ).RunTest(t)
349
350 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.mycompany.android.art_com.mycompany.android.art", []string{
351 "etc/boot-image.prof",
352 "etc/classpaths/bootclasspath.pb",
353 "javalib/bar.jar",
354 "javalib/foo.jar",
355 })
356 })
357
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000358 t.Run("generate boot image profile even if dexpreopt is disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700359 t.Parallel()
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000360 result := android.GroupFixturePreparers(
361 commonPreparer,
362
363 // Configure some libraries in the art bootclasspath_fragment that match the source
364 // bootclasspath_fragment's contents property.
365 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
366 addSource("foo", "bar"),
367 java.FixtureSetBootImageInstallDirOnDevice("art", "system/framework"),
368 dexpreopt.FixtureDisableDexpreoptBootImages(true),
369 ).RunTest(t)
370
Jooyung Hana0503a52023-08-23 13:12:50 +0900371 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000372 "etc/boot-image.prof",
373 "etc/classpaths/bootclasspath.pb",
374 "javalib/bar.jar",
375 "javalib/foo.jar",
376 })
377 })
378
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000379 t.Run("boot image disable generate profile", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700380 t.Parallel()
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000381 result := android.GroupFixturePreparers(
382 commonPreparer,
383
384 // Configure some libraries in the art bootclasspath_fragment that match the source
385 // bootclasspath_fragment's contents property.
386 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
387 addSource("foo", "bar"),
388 dexpreopt.FixtureDisableGenerateProfile(true),
389 ).RunTest(t)
390
Jooyung Hana0503a52023-08-23 13:12:50 +0900391 files := getFiles(t, result.TestContext, "com.android.art", "android_common_com.android.art")
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000392 for _, file := range files {
393 matched, _ := path.Match("etc/boot-image.prof", file.path)
394 android.AssertBoolEquals(t, "\"etc/boot-image.prof\" should not be in the APEX", matched, false)
395 }
396 })
397
Paul Duffince918b02021-06-07 14:33:47 +0100398 t.Run("boot image files with preferred prebuilt", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700399 t.Parallel()
Paul Duffinba6afd02019-11-19 19:44:10 +0000400 result := android.GroupFixturePreparers(
401 commonPreparer,
402
403 // Configure some libraries in the art bootclasspath_fragment that match the source
404 // bootclasspath_fragment's contents property.
405 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100406 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Paul Duffinba6afd02019-11-19 19:44:10 +0000407 addSource("foo", "bar"),
408
409 // Make sure that a preferred prebuilt with consistent contents doesn't affect the apex.
410 addPrebuilt(true, "foo", "bar"),
Spandan Das52c01a12024-09-20 01:09:48 +0000411 android.FixtureMergeMockFs(android.MockFS{
412 "apex_contributions/Android.bp": []byte(`
413 apex_contributions {
414 name: "prebuilt_art_contributions",
415 contents: ["prebuilt_com.android.art"],
416 api_domain: "com.android.art",
417 }
418 `)}),
419 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ART", "prebuilt_art_contributions"),
Jiakai Zhang6decef92022-01-12 17:56:19 +0000420
421 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Paul Duffinba6afd02019-11-19 19:44:10 +0000422 ).RunTest(t)
423
Colin Cross1cea5302024-12-03 16:40:08 -0800424 ensureExactDeapexedContents(t, result.TestContext, "prebuilt_com.android.art", "android_common_prebuilt_com.android.art", []string{
Jiakai Zhang49b1eb62021-11-26 18:09:27 +0000425 "etc/boot-image.prof",
Paul Duffinba6afd02019-11-19 19:44:10 +0000426 "javalib/bar.jar",
427 "javalib/foo.jar",
428 })
429
Jooyung Hana0503a52023-08-23 13:12:50 +0900430 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Colin Cross388c6612025-01-28 14:00:12 -0800431 `all_apex_contributions`,
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100432 `art-bootclasspath-fragment`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000433 `com.android.art.key`,
Spandan Dase21a8d42024-01-23 23:56:29 +0000434 `dex2oatd`,
Colin Crossbdd344b2025-01-14 16:01:03 -0800435 `prebuilt_art-bootclasspath-fragment`,
Paul Duffince918b02021-06-07 14:33:47 +0100436 `prebuilt_com.android.art`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000437 })
Paul Duffince918b02021-06-07 14:33:47 +0100438
439 // Make sure that the prebuilt bootclasspath_fragment copies its dex files to the predefined
440 // locations for the art image.
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100441 module := result.ModuleForTests("dex_bootjars", "android_common")
Paul Duffince918b02021-06-07 14:33:47 +0100442 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffina1d60252021-01-21 18:13:43 +0000443 })
Paul Duffin396229f2021-03-18 18:30:31 +0000444
Paul Duffinba6afd02019-11-19 19:44:10 +0000445 t.Run("source with inconsistency between config and contents", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700446 t.Parallel()
Paul Duffinba6afd02019-11-19 19:44:10 +0000447 android.GroupFixturePreparers(
448 commonPreparer,
449
450 // Create an inconsistency between the ArtApexJars configuration and the art source
451 // bootclasspath_fragment module's contents property.
452 java.FixtureConfigureBootJars("com.android.art:foo"),
453 addSource("foo", "bar"),
454 ).
455 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
456 RunTest(t)
457 })
458
459 t.Run("prebuilt with inconsistency between config and contents", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700460 t.Parallel()
Paul Duffinba6afd02019-11-19 19:44:10 +0000461 android.GroupFixturePreparers(
462 commonPreparer,
463
464 // Create an inconsistency between the ArtApexJars configuration and the art
465 // prebuilt_bootclasspath_fragment module's contents property.
466 java.FixtureConfigureBootJars("com.android.art:foo"),
467 addPrebuilt(false, "foo", "bar"),
468 ).
469 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
470 RunTest(t)
471 })
472
473 t.Run("preferred prebuilt with inconsistency between config and contents", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700474 t.Parallel()
Paul Duffinba6afd02019-11-19 19:44:10 +0000475 android.GroupFixturePreparers(
476 commonPreparer,
477
478 // Create an inconsistency between the ArtApexJars configuration and the art
479 // prebuilt_bootclasspath_fragment module's contents property.
480 java.FixtureConfigureBootJars("com.android.art:foo"),
481 addPrebuilt(true, "foo", "bar"),
482
483 // Source contents property is consistent with the config.
484 addSource("foo"),
485 ).
486 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
487 RunTest(t)
488 })
489
490 t.Run("source preferred and prebuilt with inconsistency between config and contents", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700491 t.Parallel()
Paul Duffinba6afd02019-11-19 19:44:10 +0000492 android.GroupFixturePreparers(
493 commonPreparer,
494
495 // Create an inconsistency between the ArtApexJars configuration and the art
496 // prebuilt_bootclasspath_fragment module's contents property.
497 java.FixtureConfigureBootJars("com.android.art:foo"),
498 addPrebuilt(false, "foo", "bar"),
499
500 // Source contents property is consistent with the config.
501 addSource("foo"),
502
503 // This should pass because while the prebuilt is inconsistent with the configuration it is
504 // not actually used.
505 ).RunTest(t)
Paul Duffin396229f2021-03-18 18:30:31 +0000506 })
Paul Duffina1d60252021-01-21 18:13:43 +0000507}
508
Paul Duffin94f19632021-04-20 12:40:07 +0100509func TestBootclasspathFragmentInPrebuiltArtApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700510 t.Parallel()
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100511 preparers := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100512 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000513 prepareForTestWithArtApex,
514
515 android.FixtureMergeMockFs(android.MockFS{
516 "com.android.art-arm64.apex": nil,
517 "com.android.art-arm.apex": nil,
518 }),
519
Paul Duffin7771eba2021-04-23 14:25:28 +0100520 // Configure some libraries in the art bootclasspath_fragment.
Paul Duffin60264a02021-04-12 20:02:36 +0100521 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100522 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhange6e90db2022-01-28 14:58:56 +0000523 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Spandan Das52c01a12024-09-20 01:09:48 +0000524 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ART", "prebuilt_art_contributions"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100525 )
526
527 bp := `
Paul Duffin9ea71c02021-03-23 22:53:07 +0000528 prebuilt_apex {
529 name: "com.android.art",
530 arch: {
531 arm64: {
532 src: "com.android.art-arm64.apex",
533 },
534 arm: {
535 src: "com.android.art-arm.apex",
536 },
537 },
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100538 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000539 }
540
541 java_import {
542 name: "foo",
543 jars: ["foo.jar"],
544 apex_available: [
545 "com.android.art",
546 ],
547 }
548
549 java_import {
550 name: "bar",
551 jars: ["bar.jar"],
552 apex_available: [
553 "com.android.art",
554 ],
555 }
556
Paul Duffin7771eba2021-04-23 14:25:28 +0100557 prebuilt_bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100558 name: "art-bootclasspath-fragment",
Paul Duffin9ea71c02021-03-23 22:53:07 +0000559 image_name: "art",
Paul Duffinf23bc472021-04-27 12:42:20 +0100560 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
561 contents: ["foo", "bar"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000562 apex_available: [
563 "com.android.art",
564 ],
Paul Duffin54e41972021-07-19 13:23:40 +0100565 hidden_api: {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100566 annotation_flags: "hiddenapi/annotation-flags.csv",
567 metadata: "hiddenapi/metadata.csv",
568 index: "hiddenapi/index.csv",
569 stub_flags: "hiddenapi/stub-flags.csv",
570 all_flags: "hiddenapi/all-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +0100571 },
Paul Duffin9ea71c02021-03-23 22:53:07 +0000572 }
Paul Duffin9ea71c02021-03-23 22:53:07 +0000573
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100574 // A prebuilt apex with the same apex_name that shouldn't interfere when it isn't enabled.
575 prebuilt_apex {
576 name: "com.mycompany.android.art",
577 apex_name: "com.android.art",
578 %s
579 src: "com.mycompany.android.art.apex",
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100580 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100581 }
Spandan Das52c01a12024-09-20 01:09:48 +0000582
583 apex_contributions {
584 name: "prebuilt_art_contributions",
585 contents: ["prebuilt_com.android.art"],
586 api_domain: "com.android.art",
587 }
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100588 `
589
590 t.Run("disabled alternative APEX", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700591 t.Parallel()
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100592 result := preparers.RunTestWithBp(t, fmt.Sprintf(bp, "enabled: false,"))
593
Colin Cross1cea5302024-12-03 16:40:08 -0800594 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_prebuilt_com.android.art", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000595 `all_apex_contributions`,
Spandan Das2069c3f2023-12-06 19:40:24 +0000596 `dex2oatd`,
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100597 `prebuilt_art-bootclasspath-fragment`,
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100598 })
599
Colin Cross1cea5302024-12-03 16:40:08 -0800600 java.CheckModuleDependencies(t, result.TestContext, "art-bootclasspath-fragment", "android_common_prebuilt_com.android.art", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000601 `all_apex_contributions`,
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100602 `dex2oatd`,
603 `prebuilt_bar`,
604 `prebuilt_foo`,
605 })
606
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100607 module := result.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100608 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffin9ea71c02021-03-23 22:53:07 +0000609 })
Paul Duffince918b02021-06-07 14:33:47 +0100610}
611
612// checkCopiesToPredefinedLocationForArt checks that the supplied modules are copied to the
613// predefined locations of boot dex jars used as inputs for the ART boot image.
614func checkCopiesToPredefinedLocationForArt(t *testing.T, config android.Config, module android.TestingModule, modules ...string) {
615 t.Helper()
616 bootJarLocations := []string{}
617 for _, output := range module.AllOutputs() {
618 output = android.StringRelativeToTop(config, output)
Jeongik Cha4753b392023-04-19 23:25:41 +0900619 if strings.HasPrefix(output, "out/soong/dexpreopt_arm64/dex_artjars_input/") {
Paul Duffince918b02021-06-07 14:33:47 +0100620 bootJarLocations = append(bootJarLocations, output)
621 }
622 }
623
624 sort.Strings(bootJarLocations)
625 expected := []string{}
626 for _, m := range modules {
Jeongik Cha4753b392023-04-19 23:25:41 +0900627 expected = append(expected, fmt.Sprintf("out/soong/dexpreopt_arm64/dex_artjars_input/%s.jar", m))
Paul Duffince918b02021-06-07 14:33:47 +0100628 }
629 sort.Strings(expected)
630
631 android.AssertArrayString(t, "copies to predefined locations for art", expected, bootJarLocations)
Paul Duffin9ea71c02021-03-23 22:53:07 +0000632}
633
Paul Duffin94f19632021-04-20 12:40:07 +0100634func TestBootclasspathFragmentContentsNoName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700635 t.Parallel()
Paul Duffin82886d62021-03-24 01:34:57 +0000636 result := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100637 prepareForTestWithBootclasspathFragment,
Paul Duffin82886d62021-03-24 01:34:57 +0000638 prepareForTestWithMyapex,
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100639 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100640 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100641 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
642 // is disabled.
643 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
644
645 java.PrepareForTestWithJavaSdkLibraryFiles,
646 java.FixtureWithLastReleaseApis("foo"),
Paul Duffin82886d62021-03-24 01:34:57 +0000647 ).RunTestWithBp(t, `
648 apex {
649 name: "myapex",
650 key: "myapex.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100651 bootclasspath_fragments: [
652 "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000653 ],
654 updatable: false,
655 }
656
657 apex_key {
658 name: "myapex.key",
659 public_key: "testkey.avbpubkey",
660 private_key: "testkey.pem",
661 }
662
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100663 java_sdk_library {
Paul Duffin82886d62021-03-24 01:34:57 +0000664 name: "foo",
665 srcs: ["b.java"],
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100666 shared_library: false,
667 public: {enabled: true},
Paul Duffin82886d62021-03-24 01:34:57 +0000668 apex_available: [
669 "myapex",
670 ],
671 }
672
673 java_library {
674 name: "bar",
675 srcs: ["b.java"],
676 installable: true,
677 apex_available: [
678 "myapex",
679 ],
680 }
681
Paul Duffin7771eba2021-04-23 14:25:28 +0100682 bootclasspath_fragment {
Paul Duffin94f19632021-04-20 12:40:07 +0100683 name: "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000684 contents: [
685 "foo",
686 "bar",
687 ],
688 apex_available: [
689 "myapex",
690 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100691 hidden_api: {
692 split_packages: ["*"],
693 },
Paul Duffin82886d62021-03-24 01:34:57 +0000694 }
695 `)
696
Jooyung Hana0503a52023-08-23 13:12:50 +0900697 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Paul Duffin4d101b62021-03-24 15:42:20 +0000698 // This does not include art, oat or vdex files as they are only included for the art boot
699 // image.
satayev227e7452021-05-20 21:35:06 +0100700 "etc/classpaths/bootclasspath.pb",
Paul Duffin4d101b62021-03-24 15:42:20 +0000701 "javalib/bar.jar",
702 "javalib/foo.jar",
703 })
Paul Duffin82886d62021-03-24 01:34:57 +0000704
Jooyung Hana0503a52023-08-23 13:12:50 +0900705 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex", []string{
Colin Cross388c6612025-01-28 14:00:12 -0800706 `all_apex_contributions`,
Spandan Dase21a8d42024-01-23 23:56:29 +0000707 `dex2oatd`,
Paul Duffin82886d62021-03-24 01:34:57 +0000708 `myapex.key`,
Paul Duffin94f19632021-04-20 12:40:07 +0100709 `mybootclasspathfragment`,
Paul Duffin82886d62021-03-24 01:34:57 +0000710 })
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100711
Jooyung Hana0503a52023-08-23 13:12:50 +0900712 apex := result.ModuleForTests("myapex", "android_common_myapex")
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100713 apexRule := apex.Rule("apexRule")
714 copyCommands := apexRule.Args["copy_commands"]
715
716 // Make sure that the fragment provides the hidden API encoded dex jars to the APEX.
Colin Crosse5c7d7c2024-12-18 17:08:07 -0800717 fragment := result.Module("mybootclasspathfragment", "android_common_myapex")
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100718
Yu Liu663e4502024-08-12 18:23:59 +0000719 info, _ := android.OtherModuleProvider(result, fragment, java.BootclasspathFragmentApexContentInfoProvider)
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100720
721 checkFragmentExportedDexJar := func(name string, expectedDexJar string) {
722 module := result.Module(name, "android_common_apex10000")
Paul Duffin1a8010a2021-05-15 12:39:23 +0100723 dexJar, err := info.DexBootJarPathForContentModule(module)
724 if err != nil {
725 t.Error(err)
726 }
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100727 android.AssertPathRelativeToTopEquals(t, name+" dex", expectedDexJar, dexJar)
728
Jooyung Hana0503a52023-08-23 13:12:50 +0900729 expectedCopyCommand := fmt.Sprintf("&& cp -f %s out/soong/.intermediates/myapex/android_common_myapex/image.apex/javalib/%s.jar", expectedDexJar, name)
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100730 android.AssertStringDoesContain(t, name+" apex copy command", copyCommands, expectedCopyCommand)
731 }
732
Colin Crosse5c7d7c2024-12-18 17:08:07 -0800733 checkFragmentExportedDexJar("foo", "out/soong/.intermediates/mybootclasspathfragment/android_common_myapex/hiddenapi-modular/encoded/foo.jar")
734 checkFragmentExportedDexJar("bar", "out/soong/.intermediates/mybootclasspathfragment/android_common_myapex/hiddenapi-modular/encoded/bar.jar")
Paul Duffin82886d62021-03-24 01:34:57 +0000735}
736
Paul Duffin48b67412021-06-23 16:13:50 +0100737func getDexJarPath(result *android.TestResult, name string) string {
738 module := result.Module(name, "android_common")
Spandan Das59a4a2b2024-01-09 21:35:56 +0000739 return module.(java.UsesLibraryDependency).DexJarBuildPath(moduleErrorfTestCtx{}).Path().RelativeToTop().String()
Paul Duffin48b67412021-06-23 16:13:50 +0100740}
741
742// TestBootclasspathFragment_HiddenAPIList checks to make sure that the correct parameters are
743// passed to the hiddenapi list tool.
744func TestBootclasspathFragment_HiddenAPIList(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700745 t.Parallel()
Paul Duffin48b67412021-06-23 16:13:50 +0100746 result := android.GroupFixturePreparers(
747 prepareForTestWithBootclasspathFragment,
748 prepareForTestWithArtApex,
749 prepareForTestWithMyapex,
750 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
751 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
satayevd604b212021-07-21 14:23:52 +0100752 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin48b67412021-06-23 16:13:50 +0100753 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
754 // is disabled.
755 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
756
757 java.PrepareForTestWithJavaSdkLibraryFiles,
758 java.FixtureWithLastReleaseApis("foo", "quuz"),
Colin Crossa66b4632024-08-08 15:50:47 -0700759 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Paul Duffin48b67412021-06-23 16:13:50 +0100760 ).RunTestWithBp(t, `
761 apex {
762 name: "com.android.art",
763 key: "com.android.art.key",
764 bootclasspath_fragments: ["art-bootclasspath-fragment"],
765 updatable: false,
766 }
767
768 apex_key {
769 name: "com.android.art.key",
770 public_key: "com.android.art.avbpubkey",
771 private_key: "com.android.art.pem",
772 }
773
774 java_library {
775 name: "baz",
776 apex_available: [
777 "com.android.art",
778 ],
779 srcs: ["b.java"],
780 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +0000781 sdk_version: "core_current",
Paul Duffin48b67412021-06-23 16:13:50 +0100782 }
783
784 java_sdk_library {
785 name: "quuz",
786 apex_available: [
787 "com.android.art",
788 ],
789 srcs: ["b.java"],
790 compile_dex: true,
791 public: {enabled: true},
792 system: {enabled: true},
793 test: {enabled: true},
794 module_lib: {enabled: true},
795 }
796
797 bootclasspath_fragment {
798 name: "art-bootclasspath-fragment",
799 image_name: "art",
800 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
801 contents: ["baz", "quuz"],
802 apex_available: [
803 "com.android.art",
804 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100805 hidden_api: {
806 split_packages: ["*"],
807 },
Paul Duffin48b67412021-06-23 16:13:50 +0100808 }
809
810 apex {
811 name: "myapex",
812 key: "myapex.key",
813 bootclasspath_fragments: [
814 "mybootclasspathfragment",
815 ],
816 updatable: false,
817 }
818
819 apex_key {
820 name: "myapex.key",
821 public_key: "testkey.avbpubkey",
822 private_key: "testkey.pem",
823 }
824
825 java_sdk_library {
826 name: "foo",
827 srcs: ["b.java"],
828 shared_library: false,
829 public: {enabled: true},
830 apex_available: [
831 "myapex",
832 ],
833 }
834
835 java_library {
836 name: "bar",
837 srcs: ["b.java"],
838 installable: true,
839 apex_available: [
840 "myapex",
841 ],
842 }
843
844 bootclasspath_fragment {
845 name: "mybootclasspathfragment",
846 contents: [
847 "foo",
848 "bar",
849 ],
850 apex_available: [
851 "myapex",
852 ],
853 fragments: [
854 {
855 apex: "com.android.art",
856 module: "art-bootclasspath-fragment",
857 },
858 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100859 hidden_api: {
860 split_packages: ["*"],
861 },
Paul Duffin48b67412021-06-23 16:13:50 +0100862 }
863 `)
864
Colin Crosse5c7d7c2024-12-18 17:08:07 -0800865 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_myapex", []string{
Spandan Das16791922024-09-06 00:49:31 +0000866 "all_apex_contributions",
Paul Duffin48b67412021-06-23 16:13:50 +0100867 "bar",
Colin Crossd6495802025-01-14 15:50:48 -0800868 "com.android.art",
Paul Duffin48b67412021-06-23 16:13:50 +0100869 "dex2oatd",
870 "foo",
871 })
872
Jihoon Kangbd093452023-12-26 19:08:01 +0000873 fooStubs := getDexJarPath(result, "foo.stubs.exportable")
874 quuzPublicStubs := getDexJarPath(result, "quuz.stubs.exportable")
875 quuzSystemStubs := getDexJarPath(result, "quuz.stubs.exportable.system")
876 quuzTestStubs := getDexJarPath(result, "quuz.stubs.exportable.test")
877 quuzModuleLibStubs := getDexJarPath(result, "quuz.stubs.exportable.module_lib")
Paul Duffin48b67412021-06-23 16:13:50 +0100878
879 // Make sure that the fragment uses the quuz stub dex jars when generating the hidden API flags.
Colin Crosse5c7d7c2024-12-18 17:08:07 -0800880 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_myapex")
Paul Duffin48b67412021-06-23 16:13:50 +0100881
882 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
883 command := rule.RuleParams.Command
884 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
885
886 // Make sure that the quuz stubs are available for resolving references from the implementation
887 // boot dex jars provided by this module.
Paul Duffinb51db2e2021-06-21 14:08:08 +0100888 android.AssertStringDoesContain(t, "quuz widest", command, "--dependency-stub-dex="+quuzModuleLibStubs)
Paul Duffin48b67412021-06-23 16:13:50 +0100889
890 // Make sure that the quuz stubs are available for resolving references from the different API
891 // stubs provided by this module.
892 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+quuzPublicStubs+":"+fooStubs)
893 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+quuzSystemStubs+":"+fooStubs)
894 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+quuzTestStubs+":"+fooStubs)
895}
896
Paul Duffin5cca7c42021-05-26 10:16:01 +0100897// TestBootclasspathFragment_AndroidNonUpdatable checks to make sure that setting
898// additional_stubs: ["android-non-updatable"] causes the source android-non-updatable modules to be
899// added to the hiddenapi list tool.
Jihoon Kangcc9e2182023-10-16 23:13:33 +0000900func TestBootclasspathFragment_AndroidNonUpdatable_FromSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700901 t.Parallel()
Paul Duffin5cca7c42021-05-26 10:16:01 +0100902 result := android.GroupFixturePreparers(
903 prepareForTestWithBootclasspathFragment,
904 prepareForTestWithArtApex,
905 prepareForTestWithMyapex,
906 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100907 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
908 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +0100909 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
910 // is disabled.
911 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Jihoon Kangcc9e2182023-10-16 23:13:33 +0000912 android.FixtureModifyConfig(func(config android.Config) {
913 config.SetBuildFromTextStub(false)
914 }),
Paul Duffin5cca7c42021-05-26 10:16:01 +0100915
916 java.PrepareForTestWithJavaSdkLibraryFiles,
917 java.FixtureWithLastReleaseApis("foo", "android-non-updatable"),
918 ).RunTestWithBp(t, `
919 java_sdk_library {
920 name: "android-non-updatable",
921 srcs: ["b.java"],
922 compile_dex: true,
923 public: {
924 enabled: true,
925 },
926 system: {
927 enabled: true,
928 },
929 test: {
930 enabled: true,
931 },
932 module_lib: {
933 enabled: true,
934 },
935 }
936
937 apex {
938 name: "com.android.art",
939 key: "com.android.art.key",
940 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +0100941 updatable: false,
942 }
943
944 apex_key {
945 name: "com.android.art.key",
946 public_key: "com.android.art.avbpubkey",
947 private_key: "com.android.art.pem",
948 }
949
950 java_library {
951 name: "baz",
952 apex_available: [
953 "com.android.art",
954 ],
955 srcs: ["b.java"],
956 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +0000957 sdk_version: "core_current",
Paul Duffin5cca7c42021-05-26 10:16:01 +0100958 }
959
960 java_library {
961 name: "quuz",
962 apex_available: [
963 "com.android.art",
964 ],
965 srcs: ["b.java"],
966 compile_dex: true,
967 }
968
969 bootclasspath_fragment {
970 name: "art-bootclasspath-fragment",
971 image_name: "art",
972 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
973 contents: ["baz", "quuz"],
974 apex_available: [
975 "com.android.art",
976 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100977 hidden_api: {
978 split_packages: ["*"],
979 },
Paul Duffin5cca7c42021-05-26 10:16:01 +0100980 }
981
982 apex {
983 name: "myapex",
984 key: "myapex.key",
985 bootclasspath_fragments: [
986 "mybootclasspathfragment",
987 ],
988 updatable: false,
989 }
990
991 apex_key {
992 name: "myapex.key",
993 public_key: "testkey.avbpubkey",
994 private_key: "testkey.pem",
995 }
996
997 java_sdk_library {
998 name: "foo",
999 srcs: ["b.java"],
1000 shared_library: false,
1001 public: {enabled: true},
1002 apex_available: [
1003 "myapex",
1004 ],
1005 }
1006
1007 java_library {
1008 name: "bar",
1009 srcs: ["b.java"],
1010 installable: true,
1011 apex_available: [
1012 "myapex",
1013 ],
1014 }
1015
1016 bootclasspath_fragment {
1017 name: "mybootclasspathfragment",
1018 contents: [
1019 "foo",
1020 "bar",
1021 ],
1022 apex_available: [
1023 "myapex",
1024 ],
1025 additional_stubs: ["android-non-updatable"],
1026 fragments: [
1027 {
1028 apex: "com.android.art",
1029 module: "art-bootclasspath-fragment",
1030 },
1031 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001032 hidden_api: {
1033 split_packages: ["*"],
1034 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001035 }
1036 `)
1037
Colin Crosse5c7d7c2024-12-18 17:08:07 -08001038 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_myapex", []string{
Spandan Das16791922024-09-06 00:49:31 +00001039 "all_apex_contributions",
Paul Duffin5cca7c42021-05-26 10:16:01 +01001040 "android-non-updatable.stubs",
1041 "android-non-updatable.stubs.module_lib",
1042 "android-non-updatable.stubs.system",
1043 "android-non-updatable.stubs.test",
Paul Duffin5cca7c42021-05-26 10:16:01 +01001044 "bar",
Colin Crossd6495802025-01-14 15:50:48 -08001045 "com.android.art",
Paul Duffin5cca7c42021-05-26 10:16:01 +01001046 "dex2oatd",
1047 "foo",
1048 })
1049
1050 nonUpdatablePublicStubs := getDexJarPath(result, "android-non-updatable.stubs")
1051 nonUpdatableSystemStubs := getDexJarPath(result, "android-non-updatable.stubs.system")
1052 nonUpdatableTestStubs := getDexJarPath(result, "android-non-updatable.stubs.test")
1053 nonUpdatableModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.module_lib")
1054
1055 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1056 // API flags.
Colin Crosse5c7d7c2024-12-18 17:08:07 -08001057 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_myapex")
Paul Duffin5cca7c42021-05-26 10:16:01 +01001058
1059 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1060 command := rule.RuleParams.Command
1061 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1062
1063 // Make sure that the module_lib non-updatable stubs are available for resolving references from
1064 // the implementation boot dex jars provided by this module.
1065 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
1066
1067 // Make sure that the appropriate non-updatable stubs are available for resolving references from
1068 // the different API stubs provided by this module.
1069 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
1070 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
1071 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
1072}
1073
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001074func TestBootclasspathFragment_AndroidNonUpdatable_FromText(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001075 t.Parallel()
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001076 result := android.GroupFixturePreparers(
1077 prepareForTestWithBootclasspathFragment,
1078 prepareForTestWithArtApex,
1079 prepareForTestWithMyapex,
1080 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
1081 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
1082 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
1083 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1084 // is disabled.
1085 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1086 android.FixtureModifyConfig(func(config android.Config) {
1087 config.SetBuildFromTextStub(true)
1088 }),
1089
1090 java.PrepareForTestWithJavaSdkLibraryFiles,
1091 java.FixtureWithLastReleaseApis("foo", "android-non-updatable"),
1092 ).RunTestWithBp(t, `
1093 java_sdk_library {
1094 name: "android-non-updatable",
1095 srcs: ["b.java"],
1096 compile_dex: true,
1097 public: {
1098 enabled: true,
1099 },
1100 system: {
1101 enabled: true,
1102 },
1103 test: {
1104 enabled: true,
1105 },
1106 module_lib: {
1107 enabled: true,
1108 },
1109 }
1110
1111 apex {
1112 name: "com.android.art",
1113 key: "com.android.art.key",
1114 bootclasspath_fragments: ["art-bootclasspath-fragment"],
1115 updatable: false,
1116 }
1117
1118 apex_key {
1119 name: "com.android.art.key",
1120 public_key: "com.android.art.avbpubkey",
1121 private_key: "com.android.art.pem",
1122 }
1123
1124 java_library {
1125 name: "baz",
1126 apex_available: [
1127 "com.android.art",
1128 ],
1129 srcs: ["b.java"],
1130 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00001131 sdk_version: "core_current",
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001132 }
1133
1134 java_library {
1135 name: "quuz",
1136 apex_available: [
1137 "com.android.art",
1138 ],
1139 srcs: ["b.java"],
1140 compile_dex: true,
1141 }
1142
1143 bootclasspath_fragment {
1144 name: "art-bootclasspath-fragment",
1145 image_name: "art",
1146 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
1147 contents: ["baz", "quuz"],
1148 apex_available: [
1149 "com.android.art",
1150 ],
1151 hidden_api: {
1152 split_packages: ["*"],
1153 },
1154 }
1155
1156 apex {
1157 name: "myapex",
1158 key: "myapex.key",
1159 bootclasspath_fragments: [
1160 "mybootclasspathfragment",
1161 ],
1162 updatable: false,
1163 }
1164
1165 apex_key {
1166 name: "myapex.key",
1167 public_key: "testkey.avbpubkey",
1168 private_key: "testkey.pem",
1169 }
1170
1171 java_sdk_library {
1172 name: "foo",
1173 srcs: ["b.java"],
1174 shared_library: false,
1175 public: {enabled: true},
1176 apex_available: [
1177 "myapex",
1178 ],
1179 }
1180
1181 java_library {
1182 name: "bar",
1183 srcs: ["b.java"],
1184 installable: true,
1185 apex_available: [
1186 "myapex",
1187 ],
1188 }
1189
1190 bootclasspath_fragment {
1191 name: "mybootclasspathfragment",
1192 contents: [
1193 "foo",
1194 "bar",
1195 ],
1196 apex_available: [
1197 "myapex",
1198 ],
1199 additional_stubs: ["android-non-updatable"],
1200 fragments: [
1201 {
1202 apex: "com.android.art",
1203 module: "art-bootclasspath-fragment",
1204 },
1205 ],
1206 hidden_api: {
1207 split_packages: ["*"],
1208 },
1209 }
1210 `)
1211
Colin Crosse5c7d7c2024-12-18 17:08:07 -08001212 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_myapex", []string{
Spandan Das16791922024-09-06 00:49:31 +00001213 "all_apex_contributions",
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001214 "android-non-updatable.stubs",
1215 "android-non-updatable.stubs.system",
1216 "android-non-updatable.stubs.test",
1217 "android-non-updatable.stubs.test_module_lib",
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001218 "bar",
Colin Crossd6495802025-01-14 15:50:48 -08001219 "com.android.art",
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001220 "dex2oatd",
1221 "foo",
1222 })
1223
1224 nonUpdatableTestModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.test_module_lib")
1225
1226 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1227 // API flags.
Colin Crosse5c7d7c2024-12-18 17:08:07 -08001228 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_myapex")
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001229
1230 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1231 command := rule.RuleParams.Command
1232 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1233
1234 // Make sure that the test_module_lib non-updatable stubs are available for resolving references from
1235 // the implementation boot dex jars provided by this module.
1236 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableTestModuleLibStubs)
1237}
1238
Paul Duffin5cca7c42021-05-26 10:16:01 +01001239// TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks checks to make sure that
1240// setting additional_stubs: ["android-non-updatable"] causes the prebuilt android-non-updatable
1241// modules to be added to the hiddenapi list tool.
1242func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001243 t.Parallel()
Paul Duffin5cca7c42021-05-26 10:16:01 +01001244 result := android.GroupFixturePreparers(
1245 prepareForTestWithBootclasspathFragment,
Jiakai Zhangb95998b2023-05-11 16:39:27 +01001246 java.PrepareForTestWithDexpreopt,
Paul Duffin5cca7c42021-05-26 10:16:01 +01001247 prepareForTestWithArtApex,
1248 prepareForTestWithMyapex,
1249 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +01001250 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
1251 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +01001252 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1253 // is disabled.
1254 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1255
1256 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1257 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
1258 }),
1259
1260 java.PrepareForTestWithJavaSdkLibraryFiles,
1261 java.FixtureWithPrebuiltApis(map[string][]string{
1262 "current": {"android-non-updatable"},
1263 "30": {"foo"},
1264 }),
1265 ).RunTestWithBp(t, `
1266 apex {
1267 name: "com.android.art",
1268 key: "com.android.art.key",
1269 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +01001270 updatable: false,
1271 }
1272
1273 apex_key {
1274 name: "com.android.art.key",
1275 public_key: "com.android.art.avbpubkey",
1276 private_key: "com.android.art.pem",
1277 }
1278
1279 java_library {
1280 name: "baz",
1281 apex_available: [
1282 "com.android.art",
1283 ],
1284 srcs: ["b.java"],
1285 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00001286 sdk_version: "core_current",
Paul Duffin5cca7c42021-05-26 10:16:01 +01001287 }
1288
1289 java_library {
1290 name: "quuz",
1291 apex_available: [
1292 "com.android.art",
1293 ],
1294 srcs: ["b.java"],
1295 compile_dex: true,
1296 }
1297
1298 bootclasspath_fragment {
1299 name: "art-bootclasspath-fragment",
1300 image_name: "art",
1301 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
1302 contents: ["baz", "quuz"],
1303 apex_available: [
1304 "com.android.art",
1305 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001306 hidden_api: {
1307 split_packages: ["*"],
1308 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001309 }
1310
1311 apex {
1312 name: "myapex",
1313 key: "myapex.key",
1314 bootclasspath_fragments: [
1315 "mybootclasspathfragment",
1316 ],
1317 updatable: false,
1318 }
1319
1320 apex_key {
1321 name: "myapex.key",
1322 public_key: "testkey.avbpubkey",
1323 private_key: "testkey.pem",
1324 }
1325
1326 java_sdk_library {
1327 name: "foo",
1328 srcs: ["b.java"],
1329 shared_library: false,
1330 public: {enabled: true},
1331 apex_available: [
1332 "myapex",
1333 ],
1334 }
1335
1336 java_library {
1337 name: "bar",
1338 srcs: ["b.java"],
1339 installable: true,
1340 apex_available: [
1341 "myapex",
1342 ],
1343 }
1344
1345 bootclasspath_fragment {
1346 name: "mybootclasspathfragment",
1347 contents: [
1348 "foo",
1349 "bar",
1350 ],
1351 apex_available: [
1352 "myapex",
1353 ],
1354 additional_stubs: ["android-non-updatable"],
1355 fragments: [
1356 {
1357 apex: "com.android.art",
1358 module: "art-bootclasspath-fragment",
1359 },
1360 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001361 hidden_api: {
1362 split_packages: ["*"],
1363 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001364 }
1365 `)
1366
Colin Crosse5c7d7c2024-12-18 17:08:07 -08001367 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_myapex", []string{
Spandan Das16791922024-09-06 00:49:31 +00001368 "all_apex_contributions",
Paul Duffin5cca7c42021-05-26 10:16:01 +01001369 "bar",
Colin Crossd6495802025-01-14 15:50:48 -08001370 "com.android.art",
Paul Duffin5cca7c42021-05-26 10:16:01 +01001371 "dex2oatd",
1372 "foo",
1373 "prebuilt_sdk_module-lib_current_android-non-updatable",
1374 "prebuilt_sdk_public_current_android-non-updatable",
1375 "prebuilt_sdk_system_current_android-non-updatable",
1376 "prebuilt_sdk_test_current_android-non-updatable",
1377 })
1378
1379 nonUpdatablePublicStubs := getDexJarPath(result, "sdk_public_current_android-non-updatable")
1380 nonUpdatableSystemStubs := getDexJarPath(result, "sdk_system_current_android-non-updatable")
1381 nonUpdatableTestStubs := getDexJarPath(result, "sdk_test_current_android-non-updatable")
1382 nonUpdatableModuleLibStubs := getDexJarPath(result, "sdk_module-lib_current_android-non-updatable")
1383
1384 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1385 // API flags.
Colin Crosse5c7d7c2024-12-18 17:08:07 -08001386 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_myapex")
Paul Duffin5cca7c42021-05-26 10:16:01 +01001387
1388 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1389 command := rule.RuleParams.Command
1390 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1391
1392 // Make sure that the module_lib non-updatable stubs are available for resolving references from
1393 // the implementation boot dex jars provided by this module.
1394 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
1395
1396 // Make sure that the appropriate non-updatable stubs are available for resolving references from
1397 // the different API stubs provided by this module.
1398 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
1399 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
1400 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
1401}
1402
Spandan Dasfcea0a82024-06-12 18:22:46 +00001403func TestBootclasspathFragmentProtoContainsMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001404 t.Parallel()
Spandan Dasfcea0a82024-06-12 18:22:46 +00001405 result := android.GroupFixturePreparers(
1406 prepareForTestWithBootclasspathFragment,
1407 prepareForTestWithMyapex,
1408 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
1409 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
1410 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1411 // is disabled.
1412 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1413
1414 java.PrepareForTestWithJavaSdkLibraryFiles,
1415 java.FixtureWithLastReleaseApis("foo", "bar"),
1416 ).RunTestWithBp(t, `
1417 apex {
1418 name: "myapex",
1419 key: "myapex.key",
1420 bootclasspath_fragments: [
1421 "mybootclasspathfragment",
1422 ],
1423 updatable: false,
1424 }
1425
1426 apex_key {
1427 name: "myapex.key",
1428 public_key: "testkey.avbpubkey",
1429 private_key: "testkey.pem",
1430 }
1431
1432 java_sdk_library {
1433 name: "foo",
1434 srcs: ["b.java"],
1435 shared_library: false,
1436 public: {enabled: true},
1437 apex_available: [
1438 "myapex",
1439 ],
1440 min_sdk_version: "33",
1441 }
1442
1443 java_sdk_library {
1444 name: "bar",
1445 srcs: ["b.java"],
1446 shared_library: false,
1447 public: {enabled: true},
1448 apex_available: [
1449 "myapex",
1450 ],
1451 min_sdk_version: "34",
1452 }
1453
1454 bootclasspath_fragment {
1455 name: "mybootclasspathfragment",
1456 contents: [
1457 "foo",
1458 "bar",
1459 ],
1460 apex_available: [
1461 "myapex",
1462 ],
1463 hidden_api: {
1464 split_packages: ["*"],
1465 },
1466 }
1467 `)
1468
Colin Crosse5c7d7c2024-12-18 17:08:07 -08001469 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_myapex")
Spandan Dasfcea0a82024-06-12 18:22:46 +00001470 classPathProtoContent := android.ContentFromFileRuleForTests(t, result.TestContext, fragment.Output("bootclasspath.pb.textproto"))
1471 // foo
1472 ensureContains(t, classPathProtoContent, `jars {
1473path: "/apex/myapex/javalib/foo.jar"
1474classpath: BOOTCLASSPATH
1475min_sdk_version: "33"
1476max_sdk_version: ""
1477}
1478`)
1479 // bar
1480 ensureContains(t, classPathProtoContent, `jars {
1481path: "/apex/myapex/javalib/bar.jar"
1482classpath: BOOTCLASSPATH
1483min_sdk_version: "34"
1484max_sdk_version: ""
1485}
1486`)
1487}
1488
Paul Duffina1d60252021-01-21 18:13:43 +00001489// TODO(b/177892522) - add test for host apex.