blob: d0bff625da79e96396598e20271e3d1360fb697c [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 ],
245 }
246 `, content)
247 }
248
Paul Duffinba6afd02019-11-19 19:44:10 +0000249 return android.FixtureAddTextFile("art/build/boot/Android.bp", text)
250 }
251
252 addPrebuilt := func(prefer bool, contents ...string) android.FixturePreparer {
253 text := fmt.Sprintf(`
Paul Duffince918b02021-06-07 14:33:47 +0100254 prebuilt_apex {
255 name: "com.android.art",
256 arch: {
257 arm64: {
258 src: "com.android.art-arm64.apex",
259 },
260 arm: {
261 src: "com.android.art-arm.apex",
262 },
263 },
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100264 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffince918b02021-06-07 14:33:47 +0100265 }
266
Paul Duffinba6afd02019-11-19 19:44:10 +0000267 prebuilt_bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100268 name: "art-bootclasspath-fragment",
Paul Duffinba6afd02019-11-19 19:44:10 +0000269 image_name: "art",
270 %s
271 prefer: %t,
272 apex_available: [
273 "com.android.art",
274 ],
Paul Duffin54e41972021-07-19 13:23:40 +0100275 hidden_api: {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100276 annotation_flags: "hiddenapi/annotation-flags.csv",
277 metadata: "hiddenapi/metadata.csv",
278 index: "hiddenapi/index.csv",
279 stub_flags: "hiddenapi/stub-flags.csv",
280 all_flags: "hiddenapi/all-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +0100281 },
Paul Duffinba6afd02019-11-19 19:44:10 +0000282 }
283 `, contentsInsert(contents), prefer)
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100284
285 for _, content := range contents {
286 text += fmt.Sprintf(`
287 java_import {
288 name: "%[1]s",
289 prefer: %[2]t,
290 jars: ["%[1]s.jar"],
291 apex_available: [
292 "com.android.art",
293 ],
294 compile_dex: true,
295 }
296 `, content, prefer)
297 }
298
Paul Duffinba6afd02019-11-19 19:44:10 +0000299 return android.FixtureAddTextFile("prebuilts/module_sdk/art/Android.bp", text)
300 }
301
Paul Duffince918b02021-06-07 14:33:47 +0100302 t.Run("boot image files from source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700303 t.Parallel()
Paul Duffince918b02021-06-07 14:33:47 +0100304 result := android.GroupFixturePreparers(
305 commonPreparer,
306
307 // Configure some libraries in the art bootclasspath_fragment that match the source
308 // bootclasspath_fragment's contents property.
309 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100310 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Paul Duffince918b02021-06-07 14:33:47 +0100311 addSource("foo", "bar"),
Jiakai Zhang6decef92022-01-12 17:56:19 +0000312 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Paul Duffince918b02021-06-07 14:33:47 +0100313 ).RunTest(t)
314
Jooyung Hana0503a52023-08-23 13:12:50 +0900315 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhang49b1eb62021-11-26 18:09:27 +0000316 "etc/boot-image.prof",
Paul Duffince918b02021-06-07 14:33:47 +0100317 "etc/classpaths/bootclasspath.pb",
Paul Duffince918b02021-06-07 14:33:47 +0100318 "javalib/bar.jar",
319 "javalib/foo.jar",
320 })
321
Jooyung Hana0503a52023-08-23 13:12:50 +0900322 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Colin Cross388c6612025-01-28 14:00:12 -0800323 `all_apex_contributions`,
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100324 `art-bootclasspath-fragment`,
Paul Duffince918b02021-06-07 14:33:47 +0100325 `com.android.art.key`,
Spandan Dase21a8d42024-01-23 23:56:29 +0000326 `dex2oatd`,
Paul Duffince918b02021-06-07 14:33:47 +0100327 })
328
329 // Make sure that the source bootclasspath_fragment copies its dex files to the predefined
330 // locations for the art image.
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100331 module := result.ModuleForTests("dex_bootjars", "android_common")
Paul Duffince918b02021-06-07 14:33:47 +0100332 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
333 })
334
Spandan Das7fd531f2024-06-05 19:27:18 +0000335 t.Run("boot image files from source of override apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700336 t.Parallel()
Spandan Das7fd531f2024-06-05 19:27:18 +0000337 result := android.GroupFixturePreparers(
338 commonPreparer,
339
340 // Configure some libraries in the art bootclasspath_fragment that match the source
341 // bootclasspath_fragment's contents property.
342 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
343 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
344 addSource("foo", "bar"),
345 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
346 ).RunTest(t)
347
348 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.mycompany.android.art_com.mycompany.android.art", []string{
349 "etc/boot-image.prof",
350 "etc/classpaths/bootclasspath.pb",
351 "javalib/bar.jar",
352 "javalib/foo.jar",
353 })
354 })
355
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000356 t.Run("generate boot image profile even if dexpreopt is disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700357 t.Parallel()
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000358 result := android.GroupFixturePreparers(
359 commonPreparer,
360
361 // Configure some libraries in the art bootclasspath_fragment that match the source
362 // bootclasspath_fragment's contents property.
363 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
364 addSource("foo", "bar"),
365 java.FixtureSetBootImageInstallDirOnDevice("art", "system/framework"),
366 dexpreopt.FixtureDisableDexpreoptBootImages(true),
367 ).RunTest(t)
368
Jooyung Hana0503a52023-08-23 13:12:50 +0900369 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000370 "etc/boot-image.prof",
371 "etc/classpaths/bootclasspath.pb",
372 "javalib/bar.jar",
373 "javalib/foo.jar",
374 })
375 })
376
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000377 t.Run("boot image disable generate profile", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700378 t.Parallel()
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000379 result := android.GroupFixturePreparers(
380 commonPreparer,
381
382 // Configure some libraries in the art bootclasspath_fragment that match the source
383 // bootclasspath_fragment's contents property.
384 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
385 addSource("foo", "bar"),
386 dexpreopt.FixtureDisableGenerateProfile(true),
387 ).RunTest(t)
388
Jooyung Hana0503a52023-08-23 13:12:50 +0900389 files := getFiles(t, result.TestContext, "com.android.art", "android_common_com.android.art")
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000390 for _, file := range files {
391 matched, _ := path.Match("etc/boot-image.prof", file.path)
392 android.AssertBoolEquals(t, "\"etc/boot-image.prof\" should not be in the APEX", matched, false)
393 }
394 })
395
Paul Duffince918b02021-06-07 14:33:47 +0100396 t.Run("boot image files with preferred prebuilt", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700397 t.Parallel()
Paul Duffinba6afd02019-11-19 19:44:10 +0000398 result := android.GroupFixturePreparers(
399 commonPreparer,
400
401 // Configure some libraries in the art bootclasspath_fragment that match the source
402 // bootclasspath_fragment's contents property.
403 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100404 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Paul Duffinba6afd02019-11-19 19:44:10 +0000405 addSource("foo", "bar"),
406
407 // Make sure that a preferred prebuilt with consistent contents doesn't affect the apex.
408 addPrebuilt(true, "foo", "bar"),
Spandan Das52c01a12024-09-20 01:09:48 +0000409 android.FixtureMergeMockFs(android.MockFS{
410 "apex_contributions/Android.bp": []byte(`
411 apex_contributions {
412 name: "prebuilt_art_contributions",
413 contents: ["prebuilt_com.android.art"],
414 api_domain: "com.android.art",
415 }
416 `)}),
417 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ART", "prebuilt_art_contributions"),
Jiakai Zhang6decef92022-01-12 17:56:19 +0000418
419 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Paul Duffinba6afd02019-11-19 19:44:10 +0000420 ).RunTest(t)
421
Spandan Das52c01a12024-09-20 01:09:48 +0000422 ensureExactDeapexedContents(t, result.TestContext, "prebuilt_com.android.art", "android_common_com.android.art", []string{
Jiakai Zhang49b1eb62021-11-26 18:09:27 +0000423 "etc/boot-image.prof",
Paul Duffinba6afd02019-11-19 19:44:10 +0000424 "javalib/bar.jar",
425 "javalib/foo.jar",
426 })
427
Jooyung Hana0503a52023-08-23 13:12:50 +0900428 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Colin Cross388c6612025-01-28 14:00:12 -0800429 `all_apex_contributions`,
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100430 `art-bootclasspath-fragment`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000431 `com.android.art.key`,
Spandan Dase21a8d42024-01-23 23:56:29 +0000432 `dex2oatd`,
Paul Duffince918b02021-06-07 14:33:47 +0100433 `prebuilt_com.android.art`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000434 })
Paul Duffince918b02021-06-07 14:33:47 +0100435
436 // Make sure that the prebuilt bootclasspath_fragment copies its dex files to the predefined
437 // locations for the art image.
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100438 module := result.ModuleForTests("dex_bootjars", "android_common")
Paul Duffince918b02021-06-07 14:33:47 +0100439 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffina1d60252021-01-21 18:13:43 +0000440 })
Paul Duffin396229f2021-03-18 18:30:31 +0000441
Paul Duffinba6afd02019-11-19 19:44:10 +0000442 t.Run("source with inconsistency between config and contents", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700443 t.Parallel()
Paul Duffinba6afd02019-11-19 19:44:10 +0000444 android.GroupFixturePreparers(
445 commonPreparer,
446
447 // Create an inconsistency between the ArtApexJars configuration and the art source
448 // bootclasspath_fragment module's contents property.
449 java.FixtureConfigureBootJars("com.android.art:foo"),
450 addSource("foo", "bar"),
451 ).
452 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
453 RunTest(t)
454 })
455
456 t.Run("prebuilt with inconsistency between config and contents", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700457 t.Parallel()
Paul Duffinba6afd02019-11-19 19:44:10 +0000458 android.GroupFixturePreparers(
459 commonPreparer,
460
461 // Create an inconsistency between the ArtApexJars configuration and the art
462 // prebuilt_bootclasspath_fragment module's contents property.
463 java.FixtureConfigureBootJars("com.android.art:foo"),
464 addPrebuilt(false, "foo", "bar"),
465 ).
466 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
467 RunTest(t)
468 })
469
470 t.Run("preferred prebuilt with inconsistency between config and contents", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700471 t.Parallel()
Paul Duffinba6afd02019-11-19 19:44:10 +0000472 android.GroupFixturePreparers(
473 commonPreparer,
474
475 // Create an inconsistency between the ArtApexJars configuration and the art
476 // prebuilt_bootclasspath_fragment module's contents property.
477 java.FixtureConfigureBootJars("com.android.art:foo"),
478 addPrebuilt(true, "foo", "bar"),
479
480 // Source contents property is consistent with the config.
481 addSource("foo"),
482 ).
483 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
484 RunTest(t)
485 })
486
487 t.Run("source preferred and prebuilt with inconsistency between config and contents", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700488 t.Parallel()
Paul Duffinba6afd02019-11-19 19:44:10 +0000489 android.GroupFixturePreparers(
490 commonPreparer,
491
492 // Create an inconsistency between the ArtApexJars configuration and the art
493 // prebuilt_bootclasspath_fragment module's contents property.
494 java.FixtureConfigureBootJars("com.android.art:foo"),
495 addPrebuilt(false, "foo", "bar"),
496
497 // Source contents property is consistent with the config.
498 addSource("foo"),
499
500 // This should pass because while the prebuilt is inconsistent with the configuration it is
501 // not actually used.
502 ).RunTest(t)
Paul Duffin396229f2021-03-18 18:30:31 +0000503 })
Paul Duffina1d60252021-01-21 18:13:43 +0000504}
505
Paul Duffin94f19632021-04-20 12:40:07 +0100506func TestBootclasspathFragmentInPrebuiltArtApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700507 t.Parallel()
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100508 preparers := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100509 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000510 prepareForTestWithArtApex,
511
512 android.FixtureMergeMockFs(android.MockFS{
513 "com.android.art-arm64.apex": nil,
514 "com.android.art-arm.apex": nil,
515 }),
516
Paul Duffin7771eba2021-04-23 14:25:28 +0100517 // Configure some libraries in the art bootclasspath_fragment.
Paul Duffin60264a02021-04-12 20:02:36 +0100518 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100519 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhange6e90db2022-01-28 14:58:56 +0000520 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Spandan Das52c01a12024-09-20 01:09:48 +0000521 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ART", "prebuilt_art_contributions"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100522 )
523
524 bp := `
Paul Duffin9ea71c02021-03-23 22:53:07 +0000525 prebuilt_apex {
526 name: "com.android.art",
527 arch: {
528 arm64: {
529 src: "com.android.art-arm64.apex",
530 },
531 arm: {
532 src: "com.android.art-arm.apex",
533 },
534 },
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100535 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000536 }
537
538 java_import {
539 name: "foo",
540 jars: ["foo.jar"],
541 apex_available: [
542 "com.android.art",
543 ],
544 }
545
546 java_import {
547 name: "bar",
548 jars: ["bar.jar"],
549 apex_available: [
550 "com.android.art",
551 ],
552 }
553
Paul Duffin7771eba2021-04-23 14:25:28 +0100554 prebuilt_bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100555 name: "art-bootclasspath-fragment",
Paul Duffin9ea71c02021-03-23 22:53:07 +0000556 image_name: "art",
Paul Duffinf23bc472021-04-27 12:42:20 +0100557 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
558 contents: ["foo", "bar"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000559 apex_available: [
560 "com.android.art",
561 ],
Paul Duffin54e41972021-07-19 13:23:40 +0100562 hidden_api: {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100563 annotation_flags: "hiddenapi/annotation-flags.csv",
564 metadata: "hiddenapi/metadata.csv",
565 index: "hiddenapi/index.csv",
566 stub_flags: "hiddenapi/stub-flags.csv",
567 all_flags: "hiddenapi/all-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +0100568 },
Paul Duffin9ea71c02021-03-23 22:53:07 +0000569 }
Paul Duffin9ea71c02021-03-23 22:53:07 +0000570
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100571 // A prebuilt apex with the same apex_name that shouldn't interfere when it isn't enabled.
572 prebuilt_apex {
573 name: "com.mycompany.android.art",
574 apex_name: "com.android.art",
575 %s
576 src: "com.mycompany.android.art.apex",
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100577 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100578 }
Spandan Das52c01a12024-09-20 01:09:48 +0000579
580 apex_contributions {
581 name: "prebuilt_art_contributions",
582 contents: ["prebuilt_com.android.art"],
583 api_domain: "com.android.art",
584 }
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100585 `
586
587 t.Run("disabled alternative APEX", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700588 t.Parallel()
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100589 result := preparers.RunTestWithBp(t, fmt.Sprintf(bp, "enabled: false,"))
590
591 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000592 `all_apex_contributions`,
Spandan Das2069c3f2023-12-06 19:40:24 +0000593 `dex2oatd`,
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100594 `prebuilt_art-bootclasspath-fragment`,
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100595 })
596
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100597 java.CheckModuleDependencies(t, result.TestContext, "art-bootclasspath-fragment", "android_common_com.android.art", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000598 `all_apex_contributions`,
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100599 `dex2oatd`,
600 `prebuilt_bar`,
601 `prebuilt_foo`,
602 })
603
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100604 module := result.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100605 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffin9ea71c02021-03-23 22:53:07 +0000606 })
Paul Duffince918b02021-06-07 14:33:47 +0100607}
608
609// checkCopiesToPredefinedLocationForArt checks that the supplied modules are copied to the
610// predefined locations of boot dex jars used as inputs for the ART boot image.
611func checkCopiesToPredefinedLocationForArt(t *testing.T, config android.Config, module android.TestingModule, modules ...string) {
612 t.Helper()
613 bootJarLocations := []string{}
614 for _, output := range module.AllOutputs() {
615 output = android.StringRelativeToTop(config, output)
Jeongik Cha4753b392023-04-19 23:25:41 +0900616 if strings.HasPrefix(output, "out/soong/dexpreopt_arm64/dex_artjars_input/") {
Paul Duffince918b02021-06-07 14:33:47 +0100617 bootJarLocations = append(bootJarLocations, output)
618 }
619 }
620
621 sort.Strings(bootJarLocations)
622 expected := []string{}
623 for _, m := range modules {
Jeongik Cha4753b392023-04-19 23:25:41 +0900624 expected = append(expected, fmt.Sprintf("out/soong/dexpreopt_arm64/dex_artjars_input/%s.jar", m))
Paul Duffince918b02021-06-07 14:33:47 +0100625 }
626 sort.Strings(expected)
627
628 android.AssertArrayString(t, "copies to predefined locations for art", expected, bootJarLocations)
Paul Duffin9ea71c02021-03-23 22:53:07 +0000629}
630
Paul Duffin94f19632021-04-20 12:40:07 +0100631func TestBootclasspathFragmentContentsNoName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700632 t.Parallel()
Paul Duffin82886d62021-03-24 01:34:57 +0000633 result := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100634 prepareForTestWithBootclasspathFragment,
Paul Duffin82886d62021-03-24 01:34:57 +0000635 prepareForTestWithMyapex,
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100636 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100637 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100638 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
639 // is disabled.
640 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
641
642 java.PrepareForTestWithJavaSdkLibraryFiles,
643 java.FixtureWithLastReleaseApis("foo"),
Paul Duffin82886d62021-03-24 01:34:57 +0000644 ).RunTestWithBp(t, `
645 apex {
646 name: "myapex",
647 key: "myapex.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100648 bootclasspath_fragments: [
649 "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000650 ],
651 updatable: false,
652 }
653
654 apex_key {
655 name: "myapex.key",
656 public_key: "testkey.avbpubkey",
657 private_key: "testkey.pem",
658 }
659
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100660 java_sdk_library {
Paul Duffin82886d62021-03-24 01:34:57 +0000661 name: "foo",
662 srcs: ["b.java"],
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100663 shared_library: false,
664 public: {enabled: true},
Paul Duffin82886d62021-03-24 01:34:57 +0000665 apex_available: [
666 "myapex",
667 ],
668 }
669
670 java_library {
671 name: "bar",
672 srcs: ["b.java"],
673 installable: true,
674 apex_available: [
675 "myapex",
676 ],
677 }
678
Paul Duffin7771eba2021-04-23 14:25:28 +0100679 bootclasspath_fragment {
Paul Duffin94f19632021-04-20 12:40:07 +0100680 name: "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000681 contents: [
682 "foo",
683 "bar",
684 ],
685 apex_available: [
686 "myapex",
687 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100688 hidden_api: {
689 split_packages: ["*"],
690 },
Paul Duffin82886d62021-03-24 01:34:57 +0000691 }
692 `)
693
Jooyung Hana0503a52023-08-23 13:12:50 +0900694 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Paul Duffin4d101b62021-03-24 15:42:20 +0000695 // This does not include art, oat or vdex files as they are only included for the art boot
696 // image.
satayev227e7452021-05-20 21:35:06 +0100697 "etc/classpaths/bootclasspath.pb",
Paul Duffin4d101b62021-03-24 15:42:20 +0000698 "javalib/bar.jar",
699 "javalib/foo.jar",
700 })
Paul Duffin82886d62021-03-24 01:34:57 +0000701
Jooyung Hana0503a52023-08-23 13:12:50 +0900702 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex", []string{
Colin Cross388c6612025-01-28 14:00:12 -0800703 `all_apex_contributions`,
Spandan Dase21a8d42024-01-23 23:56:29 +0000704 `dex2oatd`,
Paul Duffin82886d62021-03-24 01:34:57 +0000705 `myapex.key`,
Paul Duffin94f19632021-04-20 12:40:07 +0100706 `mybootclasspathfragment`,
Paul Duffin82886d62021-03-24 01:34:57 +0000707 })
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100708
Jooyung Hana0503a52023-08-23 13:12:50 +0900709 apex := result.ModuleForTests("myapex", "android_common_myapex")
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100710 apexRule := apex.Rule("apexRule")
711 copyCommands := apexRule.Args["copy_commands"]
712
713 // Make sure that the fragment provides the hidden API encoded dex jars to the APEX.
714 fragment := result.Module("mybootclasspathfragment", "android_common_apex10000")
715
Yu Liu663e4502024-08-12 18:23:59 +0000716 info, _ := android.OtherModuleProvider(result, fragment, java.BootclasspathFragmentApexContentInfoProvider)
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100717
718 checkFragmentExportedDexJar := func(name string, expectedDexJar string) {
719 module := result.Module(name, "android_common_apex10000")
Paul Duffin1a8010a2021-05-15 12:39:23 +0100720 dexJar, err := info.DexBootJarPathForContentModule(module)
721 if err != nil {
722 t.Error(err)
723 }
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100724 android.AssertPathRelativeToTopEquals(t, name+" dex", expectedDexJar, dexJar)
725
Jooyung Hana0503a52023-08-23 13:12:50 +0900726 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 +0100727 android.AssertStringDoesContain(t, name+" apex copy command", copyCommands, expectedCopyCommand)
728 }
729
Paul Duffin54c98f52021-05-15 08:54:30 +0100730 checkFragmentExportedDexJar("foo", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/foo.jar")
731 checkFragmentExportedDexJar("bar", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/bar.jar")
Paul Duffin82886d62021-03-24 01:34:57 +0000732}
733
Paul Duffin48b67412021-06-23 16:13:50 +0100734func getDexJarPath(result *android.TestResult, name string) string {
735 module := result.Module(name, "android_common")
Spandan Das59a4a2b2024-01-09 21:35:56 +0000736 return module.(java.UsesLibraryDependency).DexJarBuildPath(moduleErrorfTestCtx{}).Path().RelativeToTop().String()
Paul Duffin48b67412021-06-23 16:13:50 +0100737}
738
739// TestBootclasspathFragment_HiddenAPIList checks to make sure that the correct parameters are
740// passed to the hiddenapi list tool.
741func TestBootclasspathFragment_HiddenAPIList(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700742 t.Parallel()
Paul Duffin48b67412021-06-23 16:13:50 +0100743 result := android.GroupFixturePreparers(
744 prepareForTestWithBootclasspathFragment,
745 prepareForTestWithArtApex,
746 prepareForTestWithMyapex,
747 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
748 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
satayevd604b212021-07-21 14:23:52 +0100749 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin48b67412021-06-23 16:13:50 +0100750 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
751 // is disabled.
752 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
753
754 java.PrepareForTestWithJavaSdkLibraryFiles,
755 java.FixtureWithLastReleaseApis("foo", "quuz"),
Colin Crossa66b4632024-08-08 15:50:47 -0700756 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Paul Duffin48b67412021-06-23 16:13:50 +0100757 ).RunTestWithBp(t, `
758 apex {
759 name: "com.android.art",
760 key: "com.android.art.key",
761 bootclasspath_fragments: ["art-bootclasspath-fragment"],
762 updatable: false,
763 }
764
765 apex_key {
766 name: "com.android.art.key",
767 public_key: "com.android.art.avbpubkey",
768 private_key: "com.android.art.pem",
769 }
770
771 java_library {
772 name: "baz",
773 apex_available: [
774 "com.android.art",
775 ],
776 srcs: ["b.java"],
777 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +0000778 sdk_version: "core_current",
Paul Duffin48b67412021-06-23 16:13:50 +0100779 }
780
781 java_sdk_library {
782 name: "quuz",
783 apex_available: [
784 "com.android.art",
785 ],
786 srcs: ["b.java"],
787 compile_dex: true,
788 public: {enabled: true},
789 system: {enabled: true},
790 test: {enabled: true},
791 module_lib: {enabled: true},
792 }
793
794 bootclasspath_fragment {
795 name: "art-bootclasspath-fragment",
796 image_name: "art",
797 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
798 contents: ["baz", "quuz"],
799 apex_available: [
800 "com.android.art",
801 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100802 hidden_api: {
803 split_packages: ["*"],
804 },
Paul Duffin48b67412021-06-23 16:13:50 +0100805 }
806
807 apex {
808 name: "myapex",
809 key: "myapex.key",
810 bootclasspath_fragments: [
811 "mybootclasspathfragment",
812 ],
813 updatable: false,
814 }
815
816 apex_key {
817 name: "myapex.key",
818 public_key: "testkey.avbpubkey",
819 private_key: "testkey.pem",
820 }
821
822 java_sdk_library {
823 name: "foo",
824 srcs: ["b.java"],
825 shared_library: false,
826 public: {enabled: true},
827 apex_available: [
828 "myapex",
829 ],
830 }
831
832 java_library {
833 name: "bar",
834 srcs: ["b.java"],
835 installable: true,
836 apex_available: [
837 "myapex",
838 ],
839 }
840
841 bootclasspath_fragment {
842 name: "mybootclasspathfragment",
843 contents: [
844 "foo",
845 "bar",
846 ],
847 apex_available: [
848 "myapex",
849 ],
850 fragments: [
851 {
852 apex: "com.android.art",
853 module: "art-bootclasspath-fragment",
854 },
855 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100856 hidden_api: {
857 split_packages: ["*"],
858 },
Paul Duffin48b67412021-06-23 16:13:50 +0100859 }
860 `)
861
862 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
Spandan Das16791922024-09-06 00:49:31 +0000863 "all_apex_contributions",
Paul Duffin48b67412021-06-23 16:13:50 +0100864 "art-bootclasspath-fragment",
865 "bar",
866 "dex2oatd",
867 "foo",
868 })
869
Jihoon Kangbd093452023-12-26 19:08:01 +0000870 fooStubs := getDexJarPath(result, "foo.stubs.exportable")
871 quuzPublicStubs := getDexJarPath(result, "quuz.stubs.exportable")
872 quuzSystemStubs := getDexJarPath(result, "quuz.stubs.exportable.system")
873 quuzTestStubs := getDexJarPath(result, "quuz.stubs.exportable.test")
874 quuzModuleLibStubs := getDexJarPath(result, "quuz.stubs.exportable.module_lib")
Paul Duffin48b67412021-06-23 16:13:50 +0100875
876 // Make sure that the fragment uses the quuz stub dex jars when generating the hidden API flags.
877 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
878
879 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
880 command := rule.RuleParams.Command
881 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
882
883 // Make sure that the quuz stubs are available for resolving references from the implementation
884 // boot dex jars provided by this module.
Paul Duffinb51db2e2021-06-21 14:08:08 +0100885 android.AssertStringDoesContain(t, "quuz widest", command, "--dependency-stub-dex="+quuzModuleLibStubs)
Paul Duffin48b67412021-06-23 16:13:50 +0100886
887 // Make sure that the quuz stubs are available for resolving references from the different API
888 // stubs provided by this module.
889 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+quuzPublicStubs+":"+fooStubs)
890 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+quuzSystemStubs+":"+fooStubs)
891 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+quuzTestStubs+":"+fooStubs)
892}
893
Paul Duffin5cca7c42021-05-26 10:16:01 +0100894// TestBootclasspathFragment_AndroidNonUpdatable checks to make sure that setting
895// additional_stubs: ["android-non-updatable"] causes the source android-non-updatable modules to be
896// added to the hiddenapi list tool.
Jihoon Kangcc9e2182023-10-16 23:13:33 +0000897func TestBootclasspathFragment_AndroidNonUpdatable_FromSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700898 t.Parallel()
Paul Duffin5cca7c42021-05-26 10:16:01 +0100899 result := android.GroupFixturePreparers(
900 prepareForTestWithBootclasspathFragment,
901 prepareForTestWithArtApex,
902 prepareForTestWithMyapex,
903 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100904 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
905 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +0100906 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
907 // is disabled.
908 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Jihoon Kangcc9e2182023-10-16 23:13:33 +0000909 android.FixtureModifyConfig(func(config android.Config) {
910 config.SetBuildFromTextStub(false)
911 }),
Paul Duffin5cca7c42021-05-26 10:16:01 +0100912
913 java.PrepareForTestWithJavaSdkLibraryFiles,
914 java.FixtureWithLastReleaseApis("foo", "android-non-updatable"),
915 ).RunTestWithBp(t, `
916 java_sdk_library {
917 name: "android-non-updatable",
918 srcs: ["b.java"],
919 compile_dex: true,
920 public: {
921 enabled: true,
922 },
923 system: {
924 enabled: true,
925 },
926 test: {
927 enabled: true,
928 },
929 module_lib: {
930 enabled: true,
931 },
932 }
933
934 apex {
935 name: "com.android.art",
936 key: "com.android.art.key",
937 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +0100938 updatable: false,
939 }
940
941 apex_key {
942 name: "com.android.art.key",
943 public_key: "com.android.art.avbpubkey",
944 private_key: "com.android.art.pem",
945 }
946
947 java_library {
948 name: "baz",
949 apex_available: [
950 "com.android.art",
951 ],
952 srcs: ["b.java"],
953 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +0000954 sdk_version: "core_current",
Paul Duffin5cca7c42021-05-26 10:16:01 +0100955 }
956
957 java_library {
958 name: "quuz",
959 apex_available: [
960 "com.android.art",
961 ],
962 srcs: ["b.java"],
963 compile_dex: true,
964 }
965
966 bootclasspath_fragment {
967 name: "art-bootclasspath-fragment",
968 image_name: "art",
969 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
970 contents: ["baz", "quuz"],
971 apex_available: [
972 "com.android.art",
973 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100974 hidden_api: {
975 split_packages: ["*"],
976 },
Paul Duffin5cca7c42021-05-26 10:16:01 +0100977 }
978
979 apex {
980 name: "myapex",
981 key: "myapex.key",
982 bootclasspath_fragments: [
983 "mybootclasspathfragment",
984 ],
985 updatable: false,
986 }
987
988 apex_key {
989 name: "myapex.key",
990 public_key: "testkey.avbpubkey",
991 private_key: "testkey.pem",
992 }
993
994 java_sdk_library {
995 name: "foo",
996 srcs: ["b.java"],
997 shared_library: false,
998 public: {enabled: true},
999 apex_available: [
1000 "myapex",
1001 ],
1002 }
1003
1004 java_library {
1005 name: "bar",
1006 srcs: ["b.java"],
1007 installable: true,
1008 apex_available: [
1009 "myapex",
1010 ],
1011 }
1012
1013 bootclasspath_fragment {
1014 name: "mybootclasspathfragment",
1015 contents: [
1016 "foo",
1017 "bar",
1018 ],
1019 apex_available: [
1020 "myapex",
1021 ],
1022 additional_stubs: ["android-non-updatable"],
1023 fragments: [
1024 {
1025 apex: "com.android.art",
1026 module: "art-bootclasspath-fragment",
1027 },
1028 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001029 hidden_api: {
1030 split_packages: ["*"],
1031 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001032 }
1033 `)
1034
1035 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
Spandan Das16791922024-09-06 00:49:31 +00001036 "all_apex_contributions",
Paul Duffin5cca7c42021-05-26 10:16:01 +01001037 "android-non-updatable.stubs",
1038 "android-non-updatable.stubs.module_lib",
1039 "android-non-updatable.stubs.system",
1040 "android-non-updatable.stubs.test",
1041 "art-bootclasspath-fragment",
1042 "bar",
1043 "dex2oatd",
1044 "foo",
1045 })
1046
1047 nonUpdatablePublicStubs := getDexJarPath(result, "android-non-updatable.stubs")
1048 nonUpdatableSystemStubs := getDexJarPath(result, "android-non-updatable.stubs.system")
1049 nonUpdatableTestStubs := getDexJarPath(result, "android-non-updatable.stubs.test")
1050 nonUpdatableModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.module_lib")
1051
1052 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1053 // API flags.
1054 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1055
1056 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1057 command := rule.RuleParams.Command
1058 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1059
1060 // Make sure that the module_lib non-updatable stubs are available for resolving references from
1061 // the implementation boot dex jars provided by this module.
1062 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
1063
1064 // Make sure that the appropriate non-updatable stubs are available for resolving references from
1065 // the different API stubs provided by this module.
1066 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
1067 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
1068 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
1069}
1070
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001071func TestBootclasspathFragment_AndroidNonUpdatable_FromText(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001072 t.Parallel()
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001073 result := android.GroupFixturePreparers(
1074 prepareForTestWithBootclasspathFragment,
1075 prepareForTestWithArtApex,
1076 prepareForTestWithMyapex,
1077 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
1078 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
1079 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
1080 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1081 // is disabled.
1082 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1083 android.FixtureModifyConfig(func(config android.Config) {
1084 config.SetBuildFromTextStub(true)
1085 }),
1086
1087 java.PrepareForTestWithJavaSdkLibraryFiles,
1088 java.FixtureWithLastReleaseApis("foo", "android-non-updatable"),
1089 ).RunTestWithBp(t, `
1090 java_sdk_library {
1091 name: "android-non-updatable",
1092 srcs: ["b.java"],
1093 compile_dex: true,
1094 public: {
1095 enabled: true,
1096 },
1097 system: {
1098 enabled: true,
1099 },
1100 test: {
1101 enabled: true,
1102 },
1103 module_lib: {
1104 enabled: true,
1105 },
1106 }
1107
1108 apex {
1109 name: "com.android.art",
1110 key: "com.android.art.key",
1111 bootclasspath_fragments: ["art-bootclasspath-fragment"],
1112 updatable: false,
1113 }
1114
1115 apex_key {
1116 name: "com.android.art.key",
1117 public_key: "com.android.art.avbpubkey",
1118 private_key: "com.android.art.pem",
1119 }
1120
1121 java_library {
1122 name: "baz",
1123 apex_available: [
1124 "com.android.art",
1125 ],
1126 srcs: ["b.java"],
1127 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00001128 sdk_version: "core_current",
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001129 }
1130
1131 java_library {
1132 name: "quuz",
1133 apex_available: [
1134 "com.android.art",
1135 ],
1136 srcs: ["b.java"],
1137 compile_dex: true,
1138 }
1139
1140 bootclasspath_fragment {
1141 name: "art-bootclasspath-fragment",
1142 image_name: "art",
1143 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
1144 contents: ["baz", "quuz"],
1145 apex_available: [
1146 "com.android.art",
1147 ],
1148 hidden_api: {
1149 split_packages: ["*"],
1150 },
1151 }
1152
1153 apex {
1154 name: "myapex",
1155 key: "myapex.key",
1156 bootclasspath_fragments: [
1157 "mybootclasspathfragment",
1158 ],
1159 updatable: false,
1160 }
1161
1162 apex_key {
1163 name: "myapex.key",
1164 public_key: "testkey.avbpubkey",
1165 private_key: "testkey.pem",
1166 }
1167
1168 java_sdk_library {
1169 name: "foo",
1170 srcs: ["b.java"],
1171 shared_library: false,
1172 public: {enabled: true},
1173 apex_available: [
1174 "myapex",
1175 ],
1176 }
1177
1178 java_library {
1179 name: "bar",
1180 srcs: ["b.java"],
1181 installable: true,
1182 apex_available: [
1183 "myapex",
1184 ],
1185 }
1186
1187 bootclasspath_fragment {
1188 name: "mybootclasspathfragment",
1189 contents: [
1190 "foo",
1191 "bar",
1192 ],
1193 apex_available: [
1194 "myapex",
1195 ],
1196 additional_stubs: ["android-non-updatable"],
1197 fragments: [
1198 {
1199 apex: "com.android.art",
1200 module: "art-bootclasspath-fragment",
1201 },
1202 ],
1203 hidden_api: {
1204 split_packages: ["*"],
1205 },
1206 }
1207 `)
1208
1209 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
Spandan Das16791922024-09-06 00:49:31 +00001210 "all_apex_contributions",
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001211 "android-non-updatable.stubs",
1212 "android-non-updatable.stubs.system",
1213 "android-non-updatable.stubs.test",
1214 "android-non-updatable.stubs.test_module_lib",
1215 "art-bootclasspath-fragment",
1216 "bar",
1217 "dex2oatd",
1218 "foo",
1219 })
1220
1221 nonUpdatableTestModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.test_module_lib")
1222
1223 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1224 // API flags.
1225 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1226
1227 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1228 command := rule.RuleParams.Command
1229 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1230
1231 // Make sure that the test_module_lib non-updatable stubs are available for resolving references from
1232 // the implementation boot dex jars provided by this module.
1233 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableTestModuleLibStubs)
1234}
1235
Paul Duffin5cca7c42021-05-26 10:16:01 +01001236// TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks checks to make sure that
1237// setting additional_stubs: ["android-non-updatable"] causes the prebuilt android-non-updatable
1238// modules to be added to the hiddenapi list tool.
1239func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001240 t.Parallel()
Paul Duffin5cca7c42021-05-26 10:16:01 +01001241 result := android.GroupFixturePreparers(
1242 prepareForTestWithBootclasspathFragment,
Jiakai Zhangb95998b2023-05-11 16:39:27 +01001243 java.PrepareForTestWithDexpreopt,
Paul Duffin5cca7c42021-05-26 10:16:01 +01001244 prepareForTestWithArtApex,
1245 prepareForTestWithMyapex,
1246 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +01001247 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
1248 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +01001249 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1250 // is disabled.
1251 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1252
1253 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1254 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
1255 }),
1256
1257 java.PrepareForTestWithJavaSdkLibraryFiles,
1258 java.FixtureWithPrebuiltApis(map[string][]string{
1259 "current": {"android-non-updatable"},
1260 "30": {"foo"},
1261 }),
1262 ).RunTestWithBp(t, `
1263 apex {
1264 name: "com.android.art",
1265 key: "com.android.art.key",
1266 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +01001267 updatable: false,
1268 }
1269
1270 apex_key {
1271 name: "com.android.art.key",
1272 public_key: "com.android.art.avbpubkey",
1273 private_key: "com.android.art.pem",
1274 }
1275
1276 java_library {
1277 name: "baz",
1278 apex_available: [
1279 "com.android.art",
1280 ],
1281 srcs: ["b.java"],
1282 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00001283 sdk_version: "core_current",
Paul Duffin5cca7c42021-05-26 10:16:01 +01001284 }
1285
1286 java_library {
1287 name: "quuz",
1288 apex_available: [
1289 "com.android.art",
1290 ],
1291 srcs: ["b.java"],
1292 compile_dex: true,
1293 }
1294
1295 bootclasspath_fragment {
1296 name: "art-bootclasspath-fragment",
1297 image_name: "art",
1298 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
1299 contents: ["baz", "quuz"],
1300 apex_available: [
1301 "com.android.art",
1302 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001303 hidden_api: {
1304 split_packages: ["*"],
1305 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001306 }
1307
1308 apex {
1309 name: "myapex",
1310 key: "myapex.key",
1311 bootclasspath_fragments: [
1312 "mybootclasspathfragment",
1313 ],
1314 updatable: false,
1315 }
1316
1317 apex_key {
1318 name: "myapex.key",
1319 public_key: "testkey.avbpubkey",
1320 private_key: "testkey.pem",
1321 }
1322
1323 java_sdk_library {
1324 name: "foo",
1325 srcs: ["b.java"],
1326 shared_library: false,
1327 public: {enabled: true},
1328 apex_available: [
1329 "myapex",
1330 ],
1331 }
1332
1333 java_library {
1334 name: "bar",
1335 srcs: ["b.java"],
1336 installable: true,
1337 apex_available: [
1338 "myapex",
1339 ],
1340 }
1341
1342 bootclasspath_fragment {
1343 name: "mybootclasspathfragment",
1344 contents: [
1345 "foo",
1346 "bar",
1347 ],
1348 apex_available: [
1349 "myapex",
1350 ],
1351 additional_stubs: ["android-non-updatable"],
1352 fragments: [
1353 {
1354 apex: "com.android.art",
1355 module: "art-bootclasspath-fragment",
1356 },
1357 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001358 hidden_api: {
1359 split_packages: ["*"],
1360 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001361 }
1362 `)
1363
1364 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
Spandan Das16791922024-09-06 00:49:31 +00001365 "all_apex_contributions",
Paul Duffin5cca7c42021-05-26 10:16:01 +01001366 "art-bootclasspath-fragment",
1367 "bar",
1368 "dex2oatd",
1369 "foo",
1370 "prebuilt_sdk_module-lib_current_android-non-updatable",
1371 "prebuilt_sdk_public_current_android-non-updatable",
1372 "prebuilt_sdk_system_current_android-non-updatable",
1373 "prebuilt_sdk_test_current_android-non-updatable",
1374 })
1375
1376 nonUpdatablePublicStubs := getDexJarPath(result, "sdk_public_current_android-non-updatable")
1377 nonUpdatableSystemStubs := getDexJarPath(result, "sdk_system_current_android-non-updatable")
1378 nonUpdatableTestStubs := getDexJarPath(result, "sdk_test_current_android-non-updatable")
1379 nonUpdatableModuleLibStubs := getDexJarPath(result, "sdk_module-lib_current_android-non-updatable")
1380
1381 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1382 // API flags.
1383 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1384
1385 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1386 command := rule.RuleParams.Command
1387 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1388
1389 // Make sure that the module_lib non-updatable stubs are available for resolving references from
1390 // the implementation boot dex jars provided by this module.
1391 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
1392
1393 // Make sure that the appropriate non-updatable stubs are available for resolving references from
1394 // the different API stubs provided by this module.
1395 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
1396 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
1397 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
1398}
1399
Spandan Dasfcea0a82024-06-12 18:22:46 +00001400func TestBootclasspathFragmentProtoContainsMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001401 t.Parallel()
Spandan Dasfcea0a82024-06-12 18:22:46 +00001402 result := android.GroupFixturePreparers(
1403 prepareForTestWithBootclasspathFragment,
1404 prepareForTestWithMyapex,
1405 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
1406 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
1407 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1408 // is disabled.
1409 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1410
1411 java.PrepareForTestWithJavaSdkLibraryFiles,
1412 java.FixtureWithLastReleaseApis("foo", "bar"),
1413 ).RunTestWithBp(t, `
1414 apex {
1415 name: "myapex",
1416 key: "myapex.key",
1417 bootclasspath_fragments: [
1418 "mybootclasspathfragment",
1419 ],
1420 updatable: false,
1421 }
1422
1423 apex_key {
1424 name: "myapex.key",
1425 public_key: "testkey.avbpubkey",
1426 private_key: "testkey.pem",
1427 }
1428
1429 java_sdk_library {
1430 name: "foo",
1431 srcs: ["b.java"],
1432 shared_library: false,
1433 public: {enabled: true},
1434 apex_available: [
1435 "myapex",
1436 ],
1437 min_sdk_version: "33",
1438 }
1439
1440 java_sdk_library {
1441 name: "bar",
1442 srcs: ["b.java"],
1443 shared_library: false,
1444 public: {enabled: true},
1445 apex_available: [
1446 "myapex",
1447 ],
1448 min_sdk_version: "34",
1449 }
1450
1451 bootclasspath_fragment {
1452 name: "mybootclasspathfragment",
1453 contents: [
1454 "foo",
1455 "bar",
1456 ],
1457 apex_available: [
1458 "myapex",
1459 ],
1460 hidden_api: {
1461 split_packages: ["*"],
1462 },
1463 }
1464 `)
1465
1466 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1467 classPathProtoContent := android.ContentFromFileRuleForTests(t, result.TestContext, fragment.Output("bootclasspath.pb.textproto"))
1468 // foo
1469 ensureContains(t, classPathProtoContent, `jars {
1470path: "/apex/myapex/javalib/foo.jar"
1471classpath: BOOTCLASSPATH
1472min_sdk_version: "33"
1473max_sdk_version: ""
1474}
1475`)
1476 // bar
1477 ensureContains(t, classPathProtoContent, `jars {
1478path: "/apex/myapex/javalib/bar.jar"
1479classpath: BOOTCLASSPATH
1480min_sdk_version: "34"
1481max_sdk_version: ""
1482}
1483`)
1484}
1485
Paul Duffina1d60252021-01-21 18:13:43 +00001486// TODO(b/177892522) - add test for host apex.