blob: a0bac916620c027caedf08afd38b9135d3d6f1d1 [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) {
50 result := android.GroupFixturePreparers(
51 prepareForTestWithBootclasspathFragment,
52 // Configure some libraries in the art bootclasspath_fragment and platform_bootclasspath.
satayevabcd5972021-08-06 17:49:46 +010053 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
54 java.FixtureConfigureApexBootJars("someapex:foo", "someapex:bar"),
Paul Duffinf1b358c2021-05-17 07:38:47 +010055 prepareForTestWithArtApex,
Colin Crossa66b4632024-08-08 15:50:47 -070056 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Paul Duffinf1b358c2021-05-17 07:38:47 +010057 java.PrepareForTestWithJavaSdkLibraryFiles,
58 java.FixtureWithLastReleaseApis("foo", "baz"),
59 ).RunTestWithBp(t, `
60 java_sdk_library {
61 name: "foo",
62 srcs: ["b.java"],
63 shared_library: false,
64 public: {
65 enabled: true,
66 },
67 system: {
68 enabled: true,
69 },
70 }
71
72 java_library {
73 name: "bar",
74 srcs: ["b.java"],
75 installable: true,
76 }
77
78 apex {
79 name: "com.android.art",
80 key: "com.android.art.key",
81 bootclasspath_fragments: ["art-bootclasspath-fragment"],
82 updatable: false,
83 }
84
85 apex_key {
86 name: "com.android.art.key",
87 public_key: "com.android.art.avbpubkey",
88 private_key: "com.android.art.pem",
89 }
90
91 java_sdk_library {
92 name: "baz",
93 apex_available: [
94 "com.android.art",
95 ],
96 srcs: ["b.java"],
97 shared_library: false,
98 public: {
99 enabled: true,
100 },
101 system: {
102 enabled: true,
103 },
104 test: {
105 enabled: true,
106 },
Jihoon Kang85bc1932024-07-01 17:04:46 +0000107 sdk_version: "core_current",
Paul Duffinf1b358c2021-05-17 07:38:47 +0100108 }
109
110 java_library {
111 name: "quuz",
112 apex_available: [
113 "com.android.art",
114 ],
115 srcs: ["b.java"],
116 compile_dex: true,
117 }
118
119 bootclasspath_fragment {
120 name: "art-bootclasspath-fragment",
121 image_name: "art",
122 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
123 contents: ["baz", "quuz"],
124 apex_available: [
125 "com.android.art",
126 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100127 hidden_api: {
128 split_packages: ["*"],
129 },
Paul Duffinf1b358c2021-05-17 07:38:47 +0100130 }
131
132 bootclasspath_fragment {
133 name: "other-bootclasspath-fragment",
134 contents: ["foo", "bar"],
135 fragments: [
136 {
137 apex: "com.android.art",
138 module: "art-bootclasspath-fragment",
139 },
140 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100141 hidden_api: {
142 split_packages: ["*"],
143 },
Paul Duffinf1b358c2021-05-17 07:38:47 +0100144 }
145`,
146 )
147
Paul Duffin31fad802021-06-18 18:14:25 +0100148 checkAPIScopeStubs := func(message string, info java.HiddenAPIInfo, apiScope *java.HiddenAPIScope, expectedPaths ...string) {
Paul Duffinf1b358c2021-05-17 07:38:47 +0100149 t.Helper()
Paul Duffin280a31a2021-06-27 20:28:29 +0100150 paths := info.TransitiveStubDexJarsByScope.StubDexJarsForScope(apiScope)
151 android.AssertPathsRelativeToTopEquals(t, fmt.Sprintf("%s %s", message, apiScope), expectedPaths, paths)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100152 }
153
154 // Check stub dex paths exported by art.
155 artFragment := result.Module("art-bootclasspath-fragment", "android_common")
Yu Liu663e4502024-08-12 18:23:59 +0000156 artInfo, _ := android.OtherModuleProvider(result, artFragment, java.HiddenAPIInfoProvider)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100157
Jihoon Kangbd093452023-12-26 19:08:01 +0000158 bazPublicStubs := "out/soong/.intermediates/baz.stubs.exportable/android_common/dex/baz.stubs.exportable.jar"
159 bazSystemStubs := "out/soong/.intermediates/baz.stubs.exportable.system/android_common/dex/baz.stubs.exportable.system.jar"
160 bazTestStubs := "out/soong/.intermediates/baz.stubs.exportable.test/android_common/dex/baz.stubs.exportable.test.jar"
Paul Duffinf1b358c2021-05-17 07:38:47 +0100161
Paul Duffin31fad802021-06-18 18:14:25 +0100162 checkAPIScopeStubs("art", artInfo, java.PublicHiddenAPIScope, bazPublicStubs)
163 checkAPIScopeStubs("art", artInfo, java.SystemHiddenAPIScope, bazSystemStubs)
164 checkAPIScopeStubs("art", artInfo, java.TestHiddenAPIScope, bazTestStubs)
165 checkAPIScopeStubs("art", artInfo, java.CorePlatformHiddenAPIScope)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100166
167 // Check stub dex paths exported by other.
168 otherFragment := result.Module("other-bootclasspath-fragment", "android_common")
Yu Liu663e4502024-08-12 18:23:59 +0000169 otherInfo, _ := android.OtherModuleProvider(result, otherFragment, java.HiddenAPIInfoProvider)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100170
Jihoon Kangbd093452023-12-26 19:08:01 +0000171 fooPublicStubs := "out/soong/.intermediates/foo.stubs.exportable/android_common/dex/foo.stubs.exportable.jar"
172 fooSystemStubs := "out/soong/.intermediates/foo.stubs.exportable.system/android_common/dex/foo.stubs.exportable.system.jar"
Paul Duffinf1b358c2021-05-17 07:38:47 +0100173
Paul Duffin31fad802021-06-18 18:14:25 +0100174 checkAPIScopeStubs("other", otherInfo, java.PublicHiddenAPIScope, bazPublicStubs, fooPublicStubs)
175 checkAPIScopeStubs("other", otherInfo, java.SystemHiddenAPIScope, bazSystemStubs, fooSystemStubs)
176 checkAPIScopeStubs("other", otherInfo, java.TestHiddenAPIScope, bazTestStubs, fooSystemStubs)
177 checkAPIScopeStubs("other", otherInfo, java.CorePlatformHiddenAPIScope)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100178}
179
Paul Duffin94f19632021-04-20 12:40:07 +0100180func TestBootclasspathFragmentInArtApex(t *testing.T) {
Paul Duffinba6afd02019-11-19 19:44:10 +0000181 commonPreparer := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100182 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000183 prepareForTestWithArtApex,
184
Paul Duffinba6afd02019-11-19 19:44:10 +0000185 android.FixtureWithRootAndroidBp(`
Paul Duffina1d60252021-01-21 18:13:43 +0000186 apex {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000187 name: "com.android.art",
188 key: "com.android.art.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100189 bootclasspath_fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100190 "art-bootclasspath-fragment",
Paul Duffina1d60252021-01-21 18:13:43 +0000191 ],
Paul Duffin4d101b62021-03-24 15:42:20 +0000192 // bar (like foo) should be transitively included in this apex because it is part of the
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100193 // art-bootclasspath-fragment bootclasspath_fragment.
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000194 updatable: false,
Paul Duffina1d60252021-01-21 18:13:43 +0000195 }
196
Spandan Das7fd531f2024-06-05 19:27:18 +0000197 override_apex {
198 name: "com.mycompany.android.art",
199 base: "com.android.art",
200 min_sdk_version: "33", // mycompany overrides the min_sdk_version
201 }
202
Paul Duffina1d60252021-01-21 18:13:43 +0000203 apex_key {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000204 name: "com.android.art.key",
Paul Duffina1d60252021-01-21 18:13:43 +0000205 public_key: "testkey.avbpubkey",
206 private_key: "testkey.pem",
207 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000208 `),
209 )
Paul Duffin65898052021-04-20 22:47:03 +0100210
Paul Duffinba6afd02019-11-19 19:44:10 +0000211 contentsInsert := func(contents []string) string {
212 insert := ""
213 if contents != nil {
214 insert = fmt.Sprintf(`contents: ["%s"],`, strings.Join(contents, `", "`))
Paul Duffin396229f2021-03-18 18:30:31 +0000215 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000216 return insert
217 }
Paul Duffina1d60252021-01-21 18:13:43 +0000218
Paul Duffinba6afd02019-11-19 19:44:10 +0000219 addSource := func(contents ...string) android.FixturePreparer {
220 text := fmt.Sprintf(`
221 bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100222 name: "art-bootclasspath-fragment",
Paul Duffinba6afd02019-11-19 19:44:10 +0000223 image_name: "art",
224 %s
225 apex_available: [
226 "com.android.art",
227 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100228 hidden_api: {
229 split_packages: ["*"],
230 },
Paul Duffinba6afd02019-11-19 19:44:10 +0000231 }
232 `, contentsInsert(contents))
233
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100234 for _, content := range contents {
235 text += fmt.Sprintf(`
236 java_library {
237 name: "%[1]s",
238 srcs: ["%[1]s.java"],
239 installable: true,
240 apex_available: [
241 "com.android.art",
242 ],
243 }
244 `, content)
245 }
246
Paul Duffinba6afd02019-11-19 19:44:10 +0000247 return android.FixtureAddTextFile("art/build/boot/Android.bp", text)
248 }
249
250 addPrebuilt := func(prefer bool, contents ...string) android.FixturePreparer {
251 text := fmt.Sprintf(`
Paul Duffince918b02021-06-07 14:33:47 +0100252 prebuilt_apex {
253 name: "com.android.art",
254 arch: {
255 arm64: {
256 src: "com.android.art-arm64.apex",
257 },
258 arm: {
259 src: "com.android.art-arm.apex",
260 },
261 },
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100262 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffince918b02021-06-07 14:33:47 +0100263 }
264
Paul Duffinba6afd02019-11-19 19:44:10 +0000265 prebuilt_bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100266 name: "art-bootclasspath-fragment",
Paul Duffinba6afd02019-11-19 19:44:10 +0000267 image_name: "art",
268 %s
269 prefer: %t,
270 apex_available: [
271 "com.android.art",
272 ],
Paul Duffin54e41972021-07-19 13:23:40 +0100273 hidden_api: {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100274 annotation_flags: "hiddenapi/annotation-flags.csv",
275 metadata: "hiddenapi/metadata.csv",
276 index: "hiddenapi/index.csv",
277 stub_flags: "hiddenapi/stub-flags.csv",
278 all_flags: "hiddenapi/all-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +0100279 },
Paul Duffinba6afd02019-11-19 19:44:10 +0000280 }
281 `, contentsInsert(contents), prefer)
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100282
283 for _, content := range contents {
284 text += fmt.Sprintf(`
285 java_import {
286 name: "%[1]s",
287 prefer: %[2]t,
288 jars: ["%[1]s.jar"],
289 apex_available: [
290 "com.android.art",
291 ],
292 compile_dex: true,
293 }
294 `, content, prefer)
295 }
296
Paul Duffinba6afd02019-11-19 19:44:10 +0000297 return android.FixtureAddTextFile("prebuilts/module_sdk/art/Android.bp", text)
298 }
299
Paul Duffince918b02021-06-07 14:33:47 +0100300 t.Run("boot image files from source", func(t *testing.T) {
301 result := android.GroupFixturePreparers(
302 commonPreparer,
303
304 // Configure some libraries in the art bootclasspath_fragment that match the source
305 // bootclasspath_fragment's contents property.
306 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100307 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Paul Duffince918b02021-06-07 14:33:47 +0100308 addSource("foo", "bar"),
Jiakai Zhang6decef92022-01-12 17:56:19 +0000309 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Paul Duffince918b02021-06-07 14:33:47 +0100310 ).RunTest(t)
311
Jooyung Hana0503a52023-08-23 13:12:50 +0900312 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhang49b1eb62021-11-26 18:09:27 +0000313 "etc/boot-image.prof",
Paul Duffince918b02021-06-07 14:33:47 +0100314 "etc/classpaths/bootclasspath.pb",
Paul Duffince918b02021-06-07 14:33:47 +0100315 "javalib/bar.jar",
316 "javalib/foo.jar",
317 })
318
Jooyung Hana0503a52023-08-23 13:12:50 +0900319 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100320 `art-bootclasspath-fragment`,
Paul Duffince918b02021-06-07 14:33:47 +0100321 `com.android.art.key`,
Spandan Dase21a8d42024-01-23 23:56:29 +0000322 `dex2oatd`,
Paul Duffince918b02021-06-07 14:33:47 +0100323 })
324
325 // Make sure that the source bootclasspath_fragment copies its dex files to the predefined
326 // locations for the art image.
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100327 module := result.ModuleForTests("dex_bootjars", "android_common")
Paul Duffince918b02021-06-07 14:33:47 +0100328 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
329 })
330
Spandan Das7fd531f2024-06-05 19:27:18 +0000331 t.Run("boot image files from source of override apex", func(t *testing.T) {
332 result := android.GroupFixturePreparers(
333 commonPreparer,
334
335 // Configure some libraries in the art bootclasspath_fragment that match the source
336 // bootclasspath_fragment's contents property.
337 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
338 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
339 addSource("foo", "bar"),
340 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
341 ).RunTest(t)
342
343 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.mycompany.android.art_com.mycompany.android.art", []string{
344 "etc/boot-image.prof",
345 "etc/classpaths/bootclasspath.pb",
346 "javalib/bar.jar",
347 "javalib/foo.jar",
348 })
349 })
350
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000351 t.Run("generate boot image profile even if dexpreopt is disabled", func(t *testing.T) {
352 result := android.GroupFixturePreparers(
353 commonPreparer,
354
355 // Configure some libraries in the art bootclasspath_fragment that match the source
356 // bootclasspath_fragment's contents property.
357 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
358 addSource("foo", "bar"),
359 java.FixtureSetBootImageInstallDirOnDevice("art", "system/framework"),
360 dexpreopt.FixtureDisableDexpreoptBootImages(true),
361 ).RunTest(t)
362
Jooyung Hana0503a52023-08-23 13:12:50 +0900363 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000364 "etc/boot-image.prof",
365 "etc/classpaths/bootclasspath.pb",
366 "javalib/bar.jar",
367 "javalib/foo.jar",
368 })
369 })
370
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000371 t.Run("boot image disable generate profile", func(t *testing.T) {
372 result := android.GroupFixturePreparers(
373 commonPreparer,
374
375 // Configure some libraries in the art bootclasspath_fragment that match the source
376 // bootclasspath_fragment's contents property.
377 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
378 addSource("foo", "bar"),
379 dexpreopt.FixtureDisableGenerateProfile(true),
380 ).RunTest(t)
381
Jooyung Hana0503a52023-08-23 13:12:50 +0900382 files := getFiles(t, result.TestContext, "com.android.art", "android_common_com.android.art")
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000383 for _, file := range files {
384 matched, _ := path.Match("etc/boot-image.prof", file.path)
385 android.AssertBoolEquals(t, "\"etc/boot-image.prof\" should not be in the APEX", matched, false)
386 }
387 })
388
Paul Duffince918b02021-06-07 14:33:47 +0100389 t.Run("boot image files with preferred prebuilt", func(t *testing.T) {
Paul Duffinba6afd02019-11-19 19:44:10 +0000390 result := android.GroupFixturePreparers(
391 commonPreparer,
392
393 // Configure some libraries in the art bootclasspath_fragment that match the source
394 // bootclasspath_fragment's contents property.
395 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100396 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Paul Duffinba6afd02019-11-19 19:44:10 +0000397 addSource("foo", "bar"),
398
399 // Make sure that a preferred prebuilt with consistent contents doesn't affect the apex.
400 addPrebuilt(true, "foo", "bar"),
Spandan Das52c01a12024-09-20 01:09:48 +0000401 android.FixtureMergeMockFs(android.MockFS{
402 "apex_contributions/Android.bp": []byte(`
403 apex_contributions {
404 name: "prebuilt_art_contributions",
405 contents: ["prebuilt_com.android.art"],
406 api_domain: "com.android.art",
407 }
408 `)}),
409 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ART", "prebuilt_art_contributions"),
Jiakai Zhang6decef92022-01-12 17:56:19 +0000410
411 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Paul Duffinba6afd02019-11-19 19:44:10 +0000412 ).RunTest(t)
413
Spandan Das52c01a12024-09-20 01:09:48 +0000414 ensureExactDeapexedContents(t, result.TestContext, "prebuilt_com.android.art", "android_common_com.android.art", []string{
Jiakai Zhang49b1eb62021-11-26 18:09:27 +0000415 "etc/boot-image.prof",
Paul Duffinba6afd02019-11-19 19:44:10 +0000416 "javalib/bar.jar",
417 "javalib/foo.jar",
418 })
419
Jooyung Hana0503a52023-08-23 13:12:50 +0900420 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100421 `art-bootclasspath-fragment`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000422 `com.android.art.key`,
Spandan Dase21a8d42024-01-23 23:56:29 +0000423 `dex2oatd`,
Paul Duffince918b02021-06-07 14:33:47 +0100424 `prebuilt_com.android.art`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000425 })
Paul Duffince918b02021-06-07 14:33:47 +0100426
427 // Make sure that the prebuilt bootclasspath_fragment copies its dex files to the predefined
428 // locations for the art image.
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100429 module := result.ModuleForTests("dex_bootjars", "android_common")
Paul Duffince918b02021-06-07 14:33:47 +0100430 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffina1d60252021-01-21 18:13:43 +0000431 })
Paul Duffin396229f2021-03-18 18:30:31 +0000432
Paul Duffinba6afd02019-11-19 19:44:10 +0000433 t.Run("source with inconsistency between config and contents", func(t *testing.T) {
434 android.GroupFixturePreparers(
435 commonPreparer,
436
437 // Create an inconsistency between the ArtApexJars configuration and the art source
438 // bootclasspath_fragment module's contents property.
439 java.FixtureConfigureBootJars("com.android.art:foo"),
440 addSource("foo", "bar"),
441 ).
442 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
443 RunTest(t)
444 })
445
446 t.Run("prebuilt with inconsistency between config and contents", func(t *testing.T) {
447 android.GroupFixturePreparers(
448 commonPreparer,
449
450 // Create an inconsistency between the ArtApexJars configuration and the art
451 // prebuilt_bootclasspath_fragment module's contents property.
452 java.FixtureConfigureBootJars("com.android.art:foo"),
453 addPrebuilt(false, "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("preferred prebuilt with inconsistency between config and contents", func(t *testing.T) {
460 android.GroupFixturePreparers(
461 commonPreparer,
462
463 // Create an inconsistency between the ArtApexJars configuration and the art
464 // prebuilt_bootclasspath_fragment module's contents property.
465 java.FixtureConfigureBootJars("com.android.art:foo"),
466 addPrebuilt(true, "foo", "bar"),
467
468 // Source contents property is consistent with the config.
469 addSource("foo"),
470 ).
471 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
472 RunTest(t)
473 })
474
475 t.Run("source preferred and prebuilt 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
480 // prebuilt_bootclasspath_fragment module's contents property.
481 java.FixtureConfigureBootJars("com.android.art:foo"),
482 addPrebuilt(false, "foo", "bar"),
483
484 // Source contents property is consistent with the config.
485 addSource("foo"),
486
487 // This should pass because while the prebuilt is inconsistent with the configuration it is
488 // not actually used.
489 ).RunTest(t)
Paul Duffin396229f2021-03-18 18:30:31 +0000490 })
Paul Duffina1d60252021-01-21 18:13:43 +0000491}
492
Paul Duffin94f19632021-04-20 12:40:07 +0100493func TestBootclasspathFragmentInPrebuiltArtApex(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100494 preparers := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100495 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000496 prepareForTestWithArtApex,
497
498 android.FixtureMergeMockFs(android.MockFS{
499 "com.android.art-arm64.apex": nil,
500 "com.android.art-arm.apex": nil,
501 }),
502
Paul Duffin7771eba2021-04-23 14:25:28 +0100503 // Configure some libraries in the art bootclasspath_fragment.
Paul Duffin60264a02021-04-12 20:02:36 +0100504 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100505 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhange6e90db2022-01-28 14:58:56 +0000506 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Spandan Das52c01a12024-09-20 01:09:48 +0000507 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ART", "prebuilt_art_contributions"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100508 )
509
510 bp := `
Paul Duffin9ea71c02021-03-23 22:53:07 +0000511 prebuilt_apex {
512 name: "com.android.art",
513 arch: {
514 arm64: {
515 src: "com.android.art-arm64.apex",
516 },
517 arm: {
518 src: "com.android.art-arm.apex",
519 },
520 },
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100521 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000522 }
523
524 java_import {
525 name: "foo",
526 jars: ["foo.jar"],
527 apex_available: [
528 "com.android.art",
529 ],
530 }
531
532 java_import {
533 name: "bar",
534 jars: ["bar.jar"],
535 apex_available: [
536 "com.android.art",
537 ],
538 }
539
Paul Duffin7771eba2021-04-23 14:25:28 +0100540 prebuilt_bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100541 name: "art-bootclasspath-fragment",
Paul Duffin9ea71c02021-03-23 22:53:07 +0000542 image_name: "art",
Paul Duffinf23bc472021-04-27 12:42:20 +0100543 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
544 contents: ["foo", "bar"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000545 apex_available: [
546 "com.android.art",
547 ],
Paul Duffin54e41972021-07-19 13:23:40 +0100548 hidden_api: {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100549 annotation_flags: "hiddenapi/annotation-flags.csv",
550 metadata: "hiddenapi/metadata.csv",
551 index: "hiddenapi/index.csv",
552 stub_flags: "hiddenapi/stub-flags.csv",
553 all_flags: "hiddenapi/all-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +0100554 },
Paul Duffin9ea71c02021-03-23 22:53:07 +0000555 }
Paul Duffin9ea71c02021-03-23 22:53:07 +0000556
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100557 // A prebuilt apex with the same apex_name that shouldn't interfere when it isn't enabled.
558 prebuilt_apex {
559 name: "com.mycompany.android.art",
560 apex_name: "com.android.art",
561 %s
562 src: "com.mycompany.android.art.apex",
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100563 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100564 }
Spandan Das52c01a12024-09-20 01:09:48 +0000565
566 apex_contributions {
567 name: "prebuilt_art_contributions",
568 contents: ["prebuilt_com.android.art"],
569 api_domain: "com.android.art",
570 }
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100571 `
572
573 t.Run("disabled alternative APEX", func(t *testing.T) {
574 result := preparers.RunTestWithBp(t, fmt.Sprintf(bp, "enabled: false,"))
575
576 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000577 `all_apex_contributions`,
Spandan Das2069c3f2023-12-06 19:40:24 +0000578 `dex2oatd`,
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100579 `prebuilt_art-bootclasspath-fragment`,
Spandan Das3576e762024-01-03 18:57:03 +0000580 `prebuilt_com.android.art.apex.selector`,
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100581 })
582
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100583 java.CheckModuleDependencies(t, result.TestContext, "art-bootclasspath-fragment", "android_common_com.android.art", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000584 `all_apex_contributions`,
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100585 `dex2oatd`,
586 `prebuilt_bar`,
587 `prebuilt_foo`,
588 })
589
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100590 module := result.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100591 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffin9ea71c02021-03-23 22:53:07 +0000592 })
Paul Duffince918b02021-06-07 14:33:47 +0100593}
594
595// checkCopiesToPredefinedLocationForArt checks that the supplied modules are copied to the
596// predefined locations of boot dex jars used as inputs for the ART boot image.
597func checkCopiesToPredefinedLocationForArt(t *testing.T, config android.Config, module android.TestingModule, modules ...string) {
598 t.Helper()
599 bootJarLocations := []string{}
600 for _, output := range module.AllOutputs() {
601 output = android.StringRelativeToTop(config, output)
Jeongik Cha4753b392023-04-19 23:25:41 +0900602 if strings.HasPrefix(output, "out/soong/dexpreopt_arm64/dex_artjars_input/") {
Paul Duffince918b02021-06-07 14:33:47 +0100603 bootJarLocations = append(bootJarLocations, output)
604 }
605 }
606
607 sort.Strings(bootJarLocations)
608 expected := []string{}
609 for _, m := range modules {
Jeongik Cha4753b392023-04-19 23:25:41 +0900610 expected = append(expected, fmt.Sprintf("out/soong/dexpreopt_arm64/dex_artjars_input/%s.jar", m))
Paul Duffince918b02021-06-07 14:33:47 +0100611 }
612 sort.Strings(expected)
613
614 android.AssertArrayString(t, "copies to predefined locations for art", expected, bootJarLocations)
Paul Duffin9ea71c02021-03-23 22:53:07 +0000615}
616
Paul Duffin94f19632021-04-20 12:40:07 +0100617func TestBootclasspathFragmentContentsNoName(t *testing.T) {
Paul Duffin82886d62021-03-24 01:34:57 +0000618 result := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100619 prepareForTestWithBootclasspathFragment,
Paul Duffin82886d62021-03-24 01:34:57 +0000620 prepareForTestWithMyapex,
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100621 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100622 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100623 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
624 // is disabled.
625 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
626
627 java.PrepareForTestWithJavaSdkLibraryFiles,
628 java.FixtureWithLastReleaseApis("foo"),
Paul Duffin82886d62021-03-24 01:34:57 +0000629 ).RunTestWithBp(t, `
630 apex {
631 name: "myapex",
632 key: "myapex.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100633 bootclasspath_fragments: [
634 "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000635 ],
636 updatable: false,
637 }
638
639 apex_key {
640 name: "myapex.key",
641 public_key: "testkey.avbpubkey",
642 private_key: "testkey.pem",
643 }
644
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100645 java_sdk_library {
Paul Duffin82886d62021-03-24 01:34:57 +0000646 name: "foo",
647 srcs: ["b.java"],
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100648 shared_library: false,
649 public: {enabled: true},
Paul Duffin82886d62021-03-24 01:34:57 +0000650 apex_available: [
651 "myapex",
652 ],
653 }
654
655 java_library {
656 name: "bar",
657 srcs: ["b.java"],
658 installable: true,
659 apex_available: [
660 "myapex",
661 ],
662 }
663
Paul Duffin7771eba2021-04-23 14:25:28 +0100664 bootclasspath_fragment {
Paul Duffin94f19632021-04-20 12:40:07 +0100665 name: "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000666 contents: [
667 "foo",
668 "bar",
669 ],
670 apex_available: [
671 "myapex",
672 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100673 hidden_api: {
674 split_packages: ["*"],
675 },
Paul Duffin82886d62021-03-24 01:34:57 +0000676 }
677 `)
678
Jooyung Hana0503a52023-08-23 13:12:50 +0900679 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Paul Duffin4d101b62021-03-24 15:42:20 +0000680 // This does not include art, oat or vdex files as they are only included for the art boot
681 // image.
satayev227e7452021-05-20 21:35:06 +0100682 "etc/classpaths/bootclasspath.pb",
Paul Duffin4d101b62021-03-24 15:42:20 +0000683 "javalib/bar.jar",
684 "javalib/foo.jar",
685 })
Paul Duffin82886d62021-03-24 01:34:57 +0000686
Jooyung Hana0503a52023-08-23 13:12:50 +0900687 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex", []string{
Spandan Dase21a8d42024-01-23 23:56:29 +0000688 `dex2oatd`,
Paul Duffin82886d62021-03-24 01:34:57 +0000689 `myapex.key`,
Paul Duffin94f19632021-04-20 12:40:07 +0100690 `mybootclasspathfragment`,
Paul Duffin82886d62021-03-24 01:34:57 +0000691 })
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100692
Jooyung Hana0503a52023-08-23 13:12:50 +0900693 apex := result.ModuleForTests("myapex", "android_common_myapex")
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100694 apexRule := apex.Rule("apexRule")
695 copyCommands := apexRule.Args["copy_commands"]
696
697 // Make sure that the fragment provides the hidden API encoded dex jars to the APEX.
698 fragment := result.Module("mybootclasspathfragment", "android_common_apex10000")
699
Yu Liu663e4502024-08-12 18:23:59 +0000700 info, _ := android.OtherModuleProvider(result, fragment, java.BootclasspathFragmentApexContentInfoProvider)
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100701
702 checkFragmentExportedDexJar := func(name string, expectedDexJar string) {
703 module := result.Module(name, "android_common_apex10000")
Paul Duffin1a8010a2021-05-15 12:39:23 +0100704 dexJar, err := info.DexBootJarPathForContentModule(module)
705 if err != nil {
706 t.Error(err)
707 }
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100708 android.AssertPathRelativeToTopEquals(t, name+" dex", expectedDexJar, dexJar)
709
Jooyung Hana0503a52023-08-23 13:12:50 +0900710 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 +0100711 android.AssertStringDoesContain(t, name+" apex copy command", copyCommands, expectedCopyCommand)
712 }
713
Paul Duffin54c98f52021-05-15 08:54:30 +0100714 checkFragmentExportedDexJar("foo", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/foo.jar")
715 checkFragmentExportedDexJar("bar", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/bar.jar")
Paul Duffin82886d62021-03-24 01:34:57 +0000716}
717
Paul Duffin48b67412021-06-23 16:13:50 +0100718func getDexJarPath(result *android.TestResult, name string) string {
719 module := result.Module(name, "android_common")
Spandan Das59a4a2b2024-01-09 21:35:56 +0000720 return module.(java.UsesLibraryDependency).DexJarBuildPath(moduleErrorfTestCtx{}).Path().RelativeToTop().String()
Paul Duffin48b67412021-06-23 16:13:50 +0100721}
722
723// TestBootclasspathFragment_HiddenAPIList checks to make sure that the correct parameters are
724// passed to the hiddenapi list tool.
725func TestBootclasspathFragment_HiddenAPIList(t *testing.T) {
726 result := android.GroupFixturePreparers(
727 prepareForTestWithBootclasspathFragment,
728 prepareForTestWithArtApex,
729 prepareForTestWithMyapex,
730 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
731 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
satayevd604b212021-07-21 14:23:52 +0100732 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin48b67412021-06-23 16:13:50 +0100733 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
734 // is disabled.
735 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
736
737 java.PrepareForTestWithJavaSdkLibraryFiles,
738 java.FixtureWithLastReleaseApis("foo", "quuz"),
Colin Crossa66b4632024-08-08 15:50:47 -0700739 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Paul Duffin48b67412021-06-23 16:13:50 +0100740 ).RunTestWithBp(t, `
741 apex {
742 name: "com.android.art",
743 key: "com.android.art.key",
744 bootclasspath_fragments: ["art-bootclasspath-fragment"],
745 updatable: false,
746 }
747
748 apex_key {
749 name: "com.android.art.key",
750 public_key: "com.android.art.avbpubkey",
751 private_key: "com.android.art.pem",
752 }
753
754 java_library {
755 name: "baz",
756 apex_available: [
757 "com.android.art",
758 ],
759 srcs: ["b.java"],
760 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +0000761 sdk_version: "core_current",
Paul Duffin48b67412021-06-23 16:13:50 +0100762 }
763
764 java_sdk_library {
765 name: "quuz",
766 apex_available: [
767 "com.android.art",
768 ],
769 srcs: ["b.java"],
770 compile_dex: true,
771 public: {enabled: true},
772 system: {enabled: true},
773 test: {enabled: true},
774 module_lib: {enabled: true},
775 }
776
777 bootclasspath_fragment {
778 name: "art-bootclasspath-fragment",
779 image_name: "art",
780 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
781 contents: ["baz", "quuz"],
782 apex_available: [
783 "com.android.art",
784 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100785 hidden_api: {
786 split_packages: ["*"],
787 },
Paul Duffin48b67412021-06-23 16:13:50 +0100788 }
789
790 apex {
791 name: "myapex",
792 key: "myapex.key",
793 bootclasspath_fragments: [
794 "mybootclasspathfragment",
795 ],
796 updatable: false,
797 }
798
799 apex_key {
800 name: "myapex.key",
801 public_key: "testkey.avbpubkey",
802 private_key: "testkey.pem",
803 }
804
805 java_sdk_library {
806 name: "foo",
807 srcs: ["b.java"],
808 shared_library: false,
809 public: {enabled: true},
810 apex_available: [
811 "myapex",
812 ],
813 }
814
815 java_library {
816 name: "bar",
817 srcs: ["b.java"],
818 installable: true,
819 apex_available: [
820 "myapex",
821 ],
822 }
823
824 bootclasspath_fragment {
825 name: "mybootclasspathfragment",
826 contents: [
827 "foo",
828 "bar",
829 ],
830 apex_available: [
831 "myapex",
832 ],
833 fragments: [
834 {
835 apex: "com.android.art",
836 module: "art-bootclasspath-fragment",
837 },
838 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100839 hidden_api: {
840 split_packages: ["*"],
841 },
Paul Duffin48b67412021-06-23 16:13:50 +0100842 }
843 `)
844
845 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
Spandan Das16791922024-09-06 00:49:31 +0000846 "all_apex_contributions",
Paul Duffin48b67412021-06-23 16:13:50 +0100847 "art-bootclasspath-fragment",
848 "bar",
849 "dex2oatd",
850 "foo",
851 })
852
Jihoon Kangbd093452023-12-26 19:08:01 +0000853 fooStubs := getDexJarPath(result, "foo.stubs.exportable")
854 quuzPublicStubs := getDexJarPath(result, "quuz.stubs.exportable")
855 quuzSystemStubs := getDexJarPath(result, "quuz.stubs.exportable.system")
856 quuzTestStubs := getDexJarPath(result, "quuz.stubs.exportable.test")
857 quuzModuleLibStubs := getDexJarPath(result, "quuz.stubs.exportable.module_lib")
Paul Duffin48b67412021-06-23 16:13:50 +0100858
859 // Make sure that the fragment uses the quuz stub dex jars when generating the hidden API flags.
860 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
861
862 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
863 command := rule.RuleParams.Command
864 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
865
866 // Make sure that the quuz stubs are available for resolving references from the implementation
867 // boot dex jars provided by this module.
Paul Duffinb51db2e2021-06-21 14:08:08 +0100868 android.AssertStringDoesContain(t, "quuz widest", command, "--dependency-stub-dex="+quuzModuleLibStubs)
Paul Duffin48b67412021-06-23 16:13:50 +0100869
870 // Make sure that the quuz stubs are available for resolving references from the different API
871 // stubs provided by this module.
872 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+quuzPublicStubs+":"+fooStubs)
873 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+quuzSystemStubs+":"+fooStubs)
874 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+quuzTestStubs+":"+fooStubs)
875}
876
Paul Duffin5cca7c42021-05-26 10:16:01 +0100877// TestBootclasspathFragment_AndroidNonUpdatable checks to make sure that setting
878// additional_stubs: ["android-non-updatable"] causes the source android-non-updatable modules to be
879// added to the hiddenapi list tool.
Jihoon Kangcc9e2182023-10-16 23:13:33 +0000880func TestBootclasspathFragment_AndroidNonUpdatable_FromSource(t *testing.T) {
Paul Duffin5cca7c42021-05-26 10:16:01 +0100881 result := android.GroupFixturePreparers(
882 prepareForTestWithBootclasspathFragment,
883 prepareForTestWithArtApex,
884 prepareForTestWithMyapex,
885 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100886 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
887 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +0100888 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
889 // is disabled.
890 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Jihoon Kangcc9e2182023-10-16 23:13:33 +0000891 android.FixtureModifyConfig(func(config android.Config) {
892 config.SetBuildFromTextStub(false)
893 }),
Paul Duffin5cca7c42021-05-26 10:16:01 +0100894
895 java.PrepareForTestWithJavaSdkLibraryFiles,
896 java.FixtureWithLastReleaseApis("foo", "android-non-updatable"),
897 ).RunTestWithBp(t, `
898 java_sdk_library {
899 name: "android-non-updatable",
900 srcs: ["b.java"],
901 compile_dex: true,
902 public: {
903 enabled: true,
904 },
905 system: {
906 enabled: true,
907 },
908 test: {
909 enabled: true,
910 },
911 module_lib: {
912 enabled: true,
913 },
914 }
915
916 apex {
917 name: "com.android.art",
918 key: "com.android.art.key",
919 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +0100920 updatable: false,
921 }
922
923 apex_key {
924 name: "com.android.art.key",
925 public_key: "com.android.art.avbpubkey",
926 private_key: "com.android.art.pem",
927 }
928
929 java_library {
930 name: "baz",
931 apex_available: [
932 "com.android.art",
933 ],
934 srcs: ["b.java"],
935 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +0000936 sdk_version: "core_current",
Paul Duffin5cca7c42021-05-26 10:16:01 +0100937 }
938
939 java_library {
940 name: "quuz",
941 apex_available: [
942 "com.android.art",
943 ],
944 srcs: ["b.java"],
945 compile_dex: true,
946 }
947
948 bootclasspath_fragment {
949 name: "art-bootclasspath-fragment",
950 image_name: "art",
951 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
952 contents: ["baz", "quuz"],
953 apex_available: [
954 "com.android.art",
955 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100956 hidden_api: {
957 split_packages: ["*"],
958 },
Paul Duffin5cca7c42021-05-26 10:16:01 +0100959 }
960
961 apex {
962 name: "myapex",
963 key: "myapex.key",
964 bootclasspath_fragments: [
965 "mybootclasspathfragment",
966 ],
967 updatable: false,
968 }
969
970 apex_key {
971 name: "myapex.key",
972 public_key: "testkey.avbpubkey",
973 private_key: "testkey.pem",
974 }
975
976 java_sdk_library {
977 name: "foo",
978 srcs: ["b.java"],
979 shared_library: false,
980 public: {enabled: true},
981 apex_available: [
982 "myapex",
983 ],
984 }
985
986 java_library {
987 name: "bar",
988 srcs: ["b.java"],
989 installable: true,
990 apex_available: [
991 "myapex",
992 ],
993 }
994
995 bootclasspath_fragment {
996 name: "mybootclasspathfragment",
997 contents: [
998 "foo",
999 "bar",
1000 ],
1001 apex_available: [
1002 "myapex",
1003 ],
1004 additional_stubs: ["android-non-updatable"],
1005 fragments: [
1006 {
1007 apex: "com.android.art",
1008 module: "art-bootclasspath-fragment",
1009 },
1010 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001011 hidden_api: {
1012 split_packages: ["*"],
1013 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001014 }
1015 `)
1016
1017 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
Spandan Das16791922024-09-06 00:49:31 +00001018 "all_apex_contributions",
Paul Duffin5cca7c42021-05-26 10:16:01 +01001019 "android-non-updatable.stubs",
1020 "android-non-updatable.stubs.module_lib",
1021 "android-non-updatable.stubs.system",
1022 "android-non-updatable.stubs.test",
1023 "art-bootclasspath-fragment",
1024 "bar",
1025 "dex2oatd",
1026 "foo",
1027 })
1028
1029 nonUpdatablePublicStubs := getDexJarPath(result, "android-non-updatable.stubs")
1030 nonUpdatableSystemStubs := getDexJarPath(result, "android-non-updatable.stubs.system")
1031 nonUpdatableTestStubs := getDexJarPath(result, "android-non-updatable.stubs.test")
1032 nonUpdatableModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.module_lib")
1033
1034 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1035 // API flags.
1036 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1037
1038 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1039 command := rule.RuleParams.Command
1040 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1041
1042 // Make sure that the module_lib non-updatable stubs are available for resolving references from
1043 // the implementation boot dex jars provided by this module.
1044 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
1045
1046 // Make sure that the appropriate non-updatable stubs are available for resolving references from
1047 // the different API stubs provided by this module.
1048 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
1049 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
1050 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
1051}
1052
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001053func TestBootclasspathFragment_AndroidNonUpdatable_FromText(t *testing.T) {
1054 result := android.GroupFixturePreparers(
1055 prepareForTestWithBootclasspathFragment,
1056 prepareForTestWithArtApex,
1057 prepareForTestWithMyapex,
1058 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
1059 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
1060 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
1061 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1062 // is disabled.
1063 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1064 android.FixtureModifyConfig(func(config android.Config) {
1065 config.SetBuildFromTextStub(true)
1066 }),
1067
1068 java.PrepareForTestWithJavaSdkLibraryFiles,
1069 java.FixtureWithLastReleaseApis("foo", "android-non-updatable"),
1070 ).RunTestWithBp(t, `
1071 java_sdk_library {
1072 name: "android-non-updatable",
1073 srcs: ["b.java"],
1074 compile_dex: true,
1075 public: {
1076 enabled: true,
1077 },
1078 system: {
1079 enabled: true,
1080 },
1081 test: {
1082 enabled: true,
1083 },
1084 module_lib: {
1085 enabled: true,
1086 },
1087 }
1088
1089 apex {
1090 name: "com.android.art",
1091 key: "com.android.art.key",
1092 bootclasspath_fragments: ["art-bootclasspath-fragment"],
1093 updatable: false,
1094 }
1095
1096 apex_key {
1097 name: "com.android.art.key",
1098 public_key: "com.android.art.avbpubkey",
1099 private_key: "com.android.art.pem",
1100 }
1101
1102 java_library {
1103 name: "baz",
1104 apex_available: [
1105 "com.android.art",
1106 ],
1107 srcs: ["b.java"],
1108 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00001109 sdk_version: "core_current",
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001110 }
1111
1112 java_library {
1113 name: "quuz",
1114 apex_available: [
1115 "com.android.art",
1116 ],
1117 srcs: ["b.java"],
1118 compile_dex: true,
1119 }
1120
1121 bootclasspath_fragment {
1122 name: "art-bootclasspath-fragment",
1123 image_name: "art",
1124 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
1125 contents: ["baz", "quuz"],
1126 apex_available: [
1127 "com.android.art",
1128 ],
1129 hidden_api: {
1130 split_packages: ["*"],
1131 },
1132 }
1133
1134 apex {
1135 name: "myapex",
1136 key: "myapex.key",
1137 bootclasspath_fragments: [
1138 "mybootclasspathfragment",
1139 ],
1140 updatable: false,
1141 }
1142
1143 apex_key {
1144 name: "myapex.key",
1145 public_key: "testkey.avbpubkey",
1146 private_key: "testkey.pem",
1147 }
1148
1149 java_sdk_library {
1150 name: "foo",
1151 srcs: ["b.java"],
1152 shared_library: false,
1153 public: {enabled: true},
1154 apex_available: [
1155 "myapex",
1156 ],
1157 }
1158
1159 java_library {
1160 name: "bar",
1161 srcs: ["b.java"],
1162 installable: true,
1163 apex_available: [
1164 "myapex",
1165 ],
1166 }
1167
1168 bootclasspath_fragment {
1169 name: "mybootclasspathfragment",
1170 contents: [
1171 "foo",
1172 "bar",
1173 ],
1174 apex_available: [
1175 "myapex",
1176 ],
1177 additional_stubs: ["android-non-updatable"],
1178 fragments: [
1179 {
1180 apex: "com.android.art",
1181 module: "art-bootclasspath-fragment",
1182 },
1183 ],
1184 hidden_api: {
1185 split_packages: ["*"],
1186 },
1187 }
1188 `)
1189
1190 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
Spandan Das16791922024-09-06 00:49:31 +00001191 "all_apex_contributions",
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001192 "android-non-updatable.stubs",
1193 "android-non-updatable.stubs.system",
1194 "android-non-updatable.stubs.test",
1195 "android-non-updatable.stubs.test_module_lib",
1196 "art-bootclasspath-fragment",
1197 "bar",
1198 "dex2oatd",
1199 "foo",
1200 })
1201
1202 nonUpdatableTestModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.test_module_lib")
1203
1204 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1205 // API flags.
1206 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1207
1208 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1209 command := rule.RuleParams.Command
1210 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1211
1212 // Make sure that the test_module_lib non-updatable stubs are available for resolving references from
1213 // the implementation boot dex jars provided by this module.
1214 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableTestModuleLibStubs)
1215}
1216
Paul Duffin5cca7c42021-05-26 10:16:01 +01001217// TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks checks to make sure that
1218// setting additional_stubs: ["android-non-updatable"] causes the prebuilt android-non-updatable
1219// modules to be added to the hiddenapi list tool.
1220func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *testing.T) {
1221 result := android.GroupFixturePreparers(
1222 prepareForTestWithBootclasspathFragment,
Jiakai Zhangb95998b2023-05-11 16:39:27 +01001223 java.PrepareForTestWithDexpreopt,
Paul Duffin5cca7c42021-05-26 10:16:01 +01001224 prepareForTestWithArtApex,
1225 prepareForTestWithMyapex,
1226 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +01001227 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
1228 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +01001229 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1230 // is disabled.
1231 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1232
1233 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1234 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
1235 }),
1236
1237 java.PrepareForTestWithJavaSdkLibraryFiles,
1238 java.FixtureWithPrebuiltApis(map[string][]string{
1239 "current": {"android-non-updatable"},
1240 "30": {"foo"},
1241 }),
1242 ).RunTestWithBp(t, `
1243 apex {
1244 name: "com.android.art",
1245 key: "com.android.art.key",
1246 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +01001247 updatable: false,
1248 }
1249
1250 apex_key {
1251 name: "com.android.art.key",
1252 public_key: "com.android.art.avbpubkey",
1253 private_key: "com.android.art.pem",
1254 }
1255
1256 java_library {
1257 name: "baz",
1258 apex_available: [
1259 "com.android.art",
1260 ],
1261 srcs: ["b.java"],
1262 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00001263 sdk_version: "core_current",
Paul Duffin5cca7c42021-05-26 10:16:01 +01001264 }
1265
1266 java_library {
1267 name: "quuz",
1268 apex_available: [
1269 "com.android.art",
1270 ],
1271 srcs: ["b.java"],
1272 compile_dex: true,
1273 }
1274
1275 bootclasspath_fragment {
1276 name: "art-bootclasspath-fragment",
1277 image_name: "art",
1278 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
1279 contents: ["baz", "quuz"],
1280 apex_available: [
1281 "com.android.art",
1282 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001283 hidden_api: {
1284 split_packages: ["*"],
1285 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001286 }
1287
1288 apex {
1289 name: "myapex",
1290 key: "myapex.key",
1291 bootclasspath_fragments: [
1292 "mybootclasspathfragment",
1293 ],
1294 updatable: false,
1295 }
1296
1297 apex_key {
1298 name: "myapex.key",
1299 public_key: "testkey.avbpubkey",
1300 private_key: "testkey.pem",
1301 }
1302
1303 java_sdk_library {
1304 name: "foo",
1305 srcs: ["b.java"],
1306 shared_library: false,
1307 public: {enabled: true},
1308 apex_available: [
1309 "myapex",
1310 ],
1311 }
1312
1313 java_library {
1314 name: "bar",
1315 srcs: ["b.java"],
1316 installable: true,
1317 apex_available: [
1318 "myapex",
1319 ],
1320 }
1321
1322 bootclasspath_fragment {
1323 name: "mybootclasspathfragment",
1324 contents: [
1325 "foo",
1326 "bar",
1327 ],
1328 apex_available: [
1329 "myapex",
1330 ],
1331 additional_stubs: ["android-non-updatable"],
1332 fragments: [
1333 {
1334 apex: "com.android.art",
1335 module: "art-bootclasspath-fragment",
1336 },
1337 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001338 hidden_api: {
1339 split_packages: ["*"],
1340 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001341 }
1342 `)
1343
1344 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
Spandan Das16791922024-09-06 00:49:31 +00001345 "all_apex_contributions",
Paul Duffin5cca7c42021-05-26 10:16:01 +01001346 "art-bootclasspath-fragment",
1347 "bar",
1348 "dex2oatd",
1349 "foo",
1350 "prebuilt_sdk_module-lib_current_android-non-updatable",
1351 "prebuilt_sdk_public_current_android-non-updatable",
1352 "prebuilt_sdk_system_current_android-non-updatable",
1353 "prebuilt_sdk_test_current_android-non-updatable",
1354 })
1355
1356 nonUpdatablePublicStubs := getDexJarPath(result, "sdk_public_current_android-non-updatable")
1357 nonUpdatableSystemStubs := getDexJarPath(result, "sdk_system_current_android-non-updatable")
1358 nonUpdatableTestStubs := getDexJarPath(result, "sdk_test_current_android-non-updatable")
1359 nonUpdatableModuleLibStubs := getDexJarPath(result, "sdk_module-lib_current_android-non-updatable")
1360
1361 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1362 // API flags.
1363 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1364
1365 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1366 command := rule.RuleParams.Command
1367 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1368
1369 // Make sure that the module_lib non-updatable stubs are available for resolving references from
1370 // the implementation boot dex jars provided by this module.
1371 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
1372
1373 // Make sure that the appropriate non-updatable stubs are available for resolving references from
1374 // the different API stubs provided by this module.
1375 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
1376 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
1377 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
1378}
1379
Spandan Dasfcea0a82024-06-12 18:22:46 +00001380func TestBootclasspathFragmentProtoContainsMinSdkVersion(t *testing.T) {
1381 result := android.GroupFixturePreparers(
1382 prepareForTestWithBootclasspathFragment,
1383 prepareForTestWithMyapex,
1384 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
1385 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
1386 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1387 // is disabled.
1388 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1389
1390 java.PrepareForTestWithJavaSdkLibraryFiles,
1391 java.FixtureWithLastReleaseApis("foo", "bar"),
1392 ).RunTestWithBp(t, `
1393 apex {
1394 name: "myapex",
1395 key: "myapex.key",
1396 bootclasspath_fragments: [
1397 "mybootclasspathfragment",
1398 ],
1399 updatable: false,
1400 }
1401
1402 apex_key {
1403 name: "myapex.key",
1404 public_key: "testkey.avbpubkey",
1405 private_key: "testkey.pem",
1406 }
1407
1408 java_sdk_library {
1409 name: "foo",
1410 srcs: ["b.java"],
1411 shared_library: false,
1412 public: {enabled: true},
1413 apex_available: [
1414 "myapex",
1415 ],
1416 min_sdk_version: "33",
1417 }
1418
1419 java_sdk_library {
1420 name: "bar",
1421 srcs: ["b.java"],
1422 shared_library: false,
1423 public: {enabled: true},
1424 apex_available: [
1425 "myapex",
1426 ],
1427 min_sdk_version: "34",
1428 }
1429
1430 bootclasspath_fragment {
1431 name: "mybootclasspathfragment",
1432 contents: [
1433 "foo",
1434 "bar",
1435 ],
1436 apex_available: [
1437 "myapex",
1438 ],
1439 hidden_api: {
1440 split_packages: ["*"],
1441 },
1442 }
1443 `)
1444
1445 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1446 classPathProtoContent := android.ContentFromFileRuleForTests(t, result.TestContext, fragment.Output("bootclasspath.pb.textproto"))
1447 // foo
1448 ensureContains(t, classPathProtoContent, `jars {
1449path: "/apex/myapex/javalib/foo.jar"
1450classpath: BOOTCLASSPATH
1451min_sdk_version: "33"
1452max_sdk_version: ""
1453}
1454`)
1455 // bar
1456 ensureContains(t, classPathProtoContent, `jars {
1457path: "/apex/myapex/javalib/bar.jar"
1458classpath: BOOTCLASSPATH
1459min_sdk_version: "34"
1460max_sdk_version: ""
1461}
1462`)
1463}
1464
Paul Duffina1d60252021-01-21 18:13:43 +00001465// TODO(b/177892522) - add test for host apex.