blob: fd2f3c5d1888e9d6bf12fc998f659ebe76fec559 [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 },
107 }
108
109 java_library {
110 name: "quuz",
111 apex_available: [
112 "com.android.art",
113 ],
114 srcs: ["b.java"],
115 compile_dex: true,
116 }
117
118 bootclasspath_fragment {
119 name: "art-bootclasspath-fragment",
120 image_name: "art",
121 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
122 contents: ["baz", "quuz"],
123 apex_available: [
124 "com.android.art",
125 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100126 hidden_api: {
127 split_packages: ["*"],
128 },
Paul Duffinf1b358c2021-05-17 07:38:47 +0100129 }
130
131 bootclasspath_fragment {
132 name: "other-bootclasspath-fragment",
133 contents: ["foo", "bar"],
134 fragments: [
135 {
136 apex: "com.android.art",
137 module: "art-bootclasspath-fragment",
138 },
139 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100140 hidden_api: {
141 split_packages: ["*"],
142 },
Paul Duffinf1b358c2021-05-17 07:38:47 +0100143 }
144`,
145 )
146
Paul Duffin31fad802021-06-18 18:14:25 +0100147 checkAPIScopeStubs := func(message string, info java.HiddenAPIInfo, apiScope *java.HiddenAPIScope, expectedPaths ...string) {
Paul Duffinf1b358c2021-05-17 07:38:47 +0100148 t.Helper()
Paul Duffin280a31a2021-06-27 20:28:29 +0100149 paths := info.TransitiveStubDexJarsByScope.StubDexJarsForScope(apiScope)
150 android.AssertPathsRelativeToTopEquals(t, fmt.Sprintf("%s %s", message, apiScope), expectedPaths, paths)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100151 }
152
153 // Check stub dex paths exported by art.
154 artFragment := result.Module("art-bootclasspath-fragment", "android_common")
Yu Liu663e4502024-08-12 18:23:59 +0000155 artInfo, _ := android.OtherModuleProvider(result, artFragment, java.HiddenAPIInfoProvider)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100156
Jihoon Kangbd093452023-12-26 19:08:01 +0000157 bazPublicStubs := "out/soong/.intermediates/baz.stubs.exportable/android_common/dex/baz.stubs.exportable.jar"
158 bazSystemStubs := "out/soong/.intermediates/baz.stubs.exportable.system/android_common/dex/baz.stubs.exportable.system.jar"
159 bazTestStubs := "out/soong/.intermediates/baz.stubs.exportable.test/android_common/dex/baz.stubs.exportable.test.jar"
Paul Duffinf1b358c2021-05-17 07:38:47 +0100160
Paul Duffin31fad802021-06-18 18:14:25 +0100161 checkAPIScopeStubs("art", artInfo, java.PublicHiddenAPIScope, bazPublicStubs)
162 checkAPIScopeStubs("art", artInfo, java.SystemHiddenAPIScope, bazSystemStubs)
163 checkAPIScopeStubs("art", artInfo, java.TestHiddenAPIScope, bazTestStubs)
164 checkAPIScopeStubs("art", artInfo, java.CorePlatformHiddenAPIScope)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100165
166 // Check stub dex paths exported by other.
167 otherFragment := result.Module("other-bootclasspath-fragment", "android_common")
Yu Liu663e4502024-08-12 18:23:59 +0000168 otherInfo, _ := android.OtherModuleProvider(result, otherFragment, java.HiddenAPIInfoProvider)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100169
Jihoon Kangbd093452023-12-26 19:08:01 +0000170 fooPublicStubs := "out/soong/.intermediates/foo.stubs.exportable/android_common/dex/foo.stubs.exportable.jar"
171 fooSystemStubs := "out/soong/.intermediates/foo.stubs.exportable.system/android_common/dex/foo.stubs.exportable.system.jar"
Paul Duffinf1b358c2021-05-17 07:38:47 +0100172
Paul Duffin31fad802021-06-18 18:14:25 +0100173 checkAPIScopeStubs("other", otherInfo, java.PublicHiddenAPIScope, bazPublicStubs, fooPublicStubs)
174 checkAPIScopeStubs("other", otherInfo, java.SystemHiddenAPIScope, bazSystemStubs, fooSystemStubs)
175 checkAPIScopeStubs("other", otherInfo, java.TestHiddenAPIScope, bazTestStubs, fooSystemStubs)
176 checkAPIScopeStubs("other", otherInfo, java.CorePlatformHiddenAPIScope)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100177}
178
Paul Duffin94f19632021-04-20 12:40:07 +0100179func TestBootclasspathFragmentInArtApex(t *testing.T) {
Paul Duffinba6afd02019-11-19 19:44:10 +0000180 commonPreparer := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100181 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000182 prepareForTestWithArtApex,
183
Paul Duffinba6afd02019-11-19 19:44:10 +0000184 android.FixtureWithRootAndroidBp(`
Paul Duffina1d60252021-01-21 18:13:43 +0000185 apex {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000186 name: "com.android.art",
187 key: "com.android.art.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100188 bootclasspath_fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100189 "art-bootclasspath-fragment",
Paul Duffina1d60252021-01-21 18:13:43 +0000190 ],
Paul Duffin4d101b62021-03-24 15:42:20 +0000191 // bar (like foo) should be transitively included in this apex because it is part of the
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100192 // art-bootclasspath-fragment bootclasspath_fragment.
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000193 updatable: false,
Paul Duffina1d60252021-01-21 18:13:43 +0000194 }
195
Spandan Das7fd531f2024-06-05 19:27:18 +0000196 override_apex {
197 name: "com.mycompany.android.art",
198 base: "com.android.art",
199 min_sdk_version: "33", // mycompany overrides the min_sdk_version
200 }
201
Paul Duffina1d60252021-01-21 18:13:43 +0000202 apex_key {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000203 name: "com.android.art.key",
Paul Duffina1d60252021-01-21 18:13:43 +0000204 public_key: "testkey.avbpubkey",
205 private_key: "testkey.pem",
206 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000207 `),
208 )
Paul Duffin65898052021-04-20 22:47:03 +0100209
Paul Duffinba6afd02019-11-19 19:44:10 +0000210 contentsInsert := func(contents []string) string {
211 insert := ""
212 if contents != nil {
213 insert = fmt.Sprintf(`contents: ["%s"],`, strings.Join(contents, `", "`))
Paul Duffin396229f2021-03-18 18:30:31 +0000214 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000215 return insert
216 }
Paul Duffina1d60252021-01-21 18:13:43 +0000217
Paul Duffinba6afd02019-11-19 19:44:10 +0000218 addSource := func(contents ...string) android.FixturePreparer {
219 text := fmt.Sprintf(`
220 bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100221 name: "art-bootclasspath-fragment",
Paul Duffinba6afd02019-11-19 19:44:10 +0000222 image_name: "art",
223 %s
224 apex_available: [
225 "com.android.art",
226 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100227 hidden_api: {
228 split_packages: ["*"],
229 },
Paul Duffinba6afd02019-11-19 19:44:10 +0000230 }
231 `, contentsInsert(contents))
232
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100233 for _, content := range contents {
234 text += fmt.Sprintf(`
235 java_library {
236 name: "%[1]s",
237 srcs: ["%[1]s.java"],
238 installable: true,
239 apex_available: [
240 "com.android.art",
241 ],
242 }
243 `, content)
244 }
245
Paul Duffinba6afd02019-11-19 19:44:10 +0000246 return android.FixtureAddTextFile("art/build/boot/Android.bp", text)
247 }
248
249 addPrebuilt := func(prefer bool, contents ...string) android.FixturePreparer {
250 text := fmt.Sprintf(`
Paul Duffince918b02021-06-07 14:33:47 +0100251 prebuilt_apex {
252 name: "com.android.art",
253 arch: {
254 arm64: {
255 src: "com.android.art-arm64.apex",
256 },
257 arm: {
258 src: "com.android.art-arm.apex",
259 },
260 },
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100261 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffince918b02021-06-07 14:33:47 +0100262 }
263
Paul Duffinba6afd02019-11-19 19:44:10 +0000264 prebuilt_bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100265 name: "art-bootclasspath-fragment",
Paul Duffinba6afd02019-11-19 19:44:10 +0000266 image_name: "art",
267 %s
268 prefer: %t,
269 apex_available: [
270 "com.android.art",
271 ],
Paul Duffin54e41972021-07-19 13:23:40 +0100272 hidden_api: {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100273 annotation_flags: "hiddenapi/annotation-flags.csv",
274 metadata: "hiddenapi/metadata.csv",
275 index: "hiddenapi/index.csv",
276 stub_flags: "hiddenapi/stub-flags.csv",
277 all_flags: "hiddenapi/all-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +0100278 },
Paul Duffinba6afd02019-11-19 19:44:10 +0000279 }
280 `, contentsInsert(contents), prefer)
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100281
282 for _, content := range contents {
283 text += fmt.Sprintf(`
284 java_import {
285 name: "%[1]s",
286 prefer: %[2]t,
287 jars: ["%[1]s.jar"],
288 apex_available: [
289 "com.android.art",
290 ],
291 compile_dex: true,
292 }
293 `, content, prefer)
294 }
295
Paul Duffinba6afd02019-11-19 19:44:10 +0000296 return android.FixtureAddTextFile("prebuilts/module_sdk/art/Android.bp", text)
297 }
298
Paul Duffince918b02021-06-07 14:33:47 +0100299 t.Run("boot image files from source", func(t *testing.T) {
300 result := android.GroupFixturePreparers(
301 commonPreparer,
302
303 // Configure some libraries in the art bootclasspath_fragment that match the source
304 // bootclasspath_fragment's contents property.
305 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100306 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Paul Duffince918b02021-06-07 14:33:47 +0100307 addSource("foo", "bar"),
Jiakai Zhang6decef92022-01-12 17:56:19 +0000308 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Paul Duffince918b02021-06-07 14:33:47 +0100309 ).RunTest(t)
310
Jooyung Hana0503a52023-08-23 13:12:50 +0900311 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhang49b1eb62021-11-26 18:09:27 +0000312 "etc/boot-image.prof",
Paul Duffince918b02021-06-07 14:33:47 +0100313 "etc/classpaths/bootclasspath.pb",
Paul Duffince918b02021-06-07 14:33:47 +0100314 "javalib/bar.jar",
315 "javalib/foo.jar",
316 })
317
Jooyung Hana0503a52023-08-23 13:12:50 +0900318 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100319 `art-bootclasspath-fragment`,
Paul Duffince918b02021-06-07 14:33:47 +0100320 `com.android.art.key`,
Spandan Dase21a8d42024-01-23 23:56:29 +0000321 `dex2oatd`,
Paul Duffince918b02021-06-07 14:33:47 +0100322 })
323
324 // Make sure that the source bootclasspath_fragment copies its dex files to the predefined
325 // locations for the art image.
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100326 module := result.ModuleForTests("dex_bootjars", "android_common")
Paul Duffince918b02021-06-07 14:33:47 +0100327 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
328 })
329
Spandan Das7fd531f2024-06-05 19:27:18 +0000330 t.Run("boot image files from source of override apex", func(t *testing.T) {
331 result := android.GroupFixturePreparers(
332 commonPreparer,
333
334 // Configure some libraries in the art bootclasspath_fragment that match the source
335 // bootclasspath_fragment's contents property.
336 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
337 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
338 addSource("foo", "bar"),
339 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
340 ).RunTest(t)
341
342 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.mycompany.android.art_com.mycompany.android.art", []string{
343 "etc/boot-image.prof",
344 "etc/classpaths/bootclasspath.pb",
345 "javalib/bar.jar",
346 "javalib/foo.jar",
347 })
348 })
349
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000350 t.Run("generate boot image profile even if dexpreopt is disabled", func(t *testing.T) {
351 result := android.GroupFixturePreparers(
352 commonPreparer,
353
354 // Configure some libraries in the art bootclasspath_fragment that match the source
355 // bootclasspath_fragment's contents property.
356 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
357 addSource("foo", "bar"),
358 java.FixtureSetBootImageInstallDirOnDevice("art", "system/framework"),
359 dexpreopt.FixtureDisableDexpreoptBootImages(true),
360 ).RunTest(t)
361
Jooyung Hana0503a52023-08-23 13:12:50 +0900362 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000363 "etc/boot-image.prof",
364 "etc/classpaths/bootclasspath.pb",
365 "javalib/bar.jar",
366 "javalib/foo.jar",
367 })
368 })
369
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000370 t.Run("boot image disable generate profile", func(t *testing.T) {
371 result := android.GroupFixturePreparers(
372 commonPreparer,
373
374 // Configure some libraries in the art bootclasspath_fragment that match the source
375 // bootclasspath_fragment's contents property.
376 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
377 addSource("foo", "bar"),
378 dexpreopt.FixtureDisableGenerateProfile(true),
379 ).RunTest(t)
380
Jooyung Hana0503a52023-08-23 13:12:50 +0900381 files := getFiles(t, result.TestContext, "com.android.art", "android_common_com.android.art")
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000382 for _, file := range files {
383 matched, _ := path.Match("etc/boot-image.prof", file.path)
384 android.AssertBoolEquals(t, "\"etc/boot-image.prof\" should not be in the APEX", matched, false)
385 }
386 })
387
Paul Duffince918b02021-06-07 14:33:47 +0100388 t.Run("boot image files with preferred prebuilt", func(t *testing.T) {
Paul Duffinba6afd02019-11-19 19:44:10 +0000389 result := android.GroupFixturePreparers(
390 commonPreparer,
391
392 // Configure some libraries in the art bootclasspath_fragment that match the source
393 // bootclasspath_fragment's contents property.
394 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100395 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Paul Duffinba6afd02019-11-19 19:44:10 +0000396 addSource("foo", "bar"),
397
398 // Make sure that a preferred prebuilt with consistent contents doesn't affect the apex.
399 addPrebuilt(true, "foo", "bar"),
Jiakai Zhang6decef92022-01-12 17:56:19 +0000400
401 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Paul Duffinba6afd02019-11-19 19:44:10 +0000402 ).RunTest(t)
403
Spandan Das3576e762024-01-03 18:57:03 +0000404 ensureExactDeapexedContents(t, result.TestContext, "prebuilt_com.android.art", "android_common", []string{
Jiakai Zhang49b1eb62021-11-26 18:09:27 +0000405 "etc/boot-image.prof",
Paul Duffinba6afd02019-11-19 19:44:10 +0000406 "javalib/bar.jar",
407 "javalib/foo.jar",
408 })
409
Jooyung Hana0503a52023-08-23 13:12:50 +0900410 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100411 `art-bootclasspath-fragment`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000412 `com.android.art.key`,
Spandan Dase21a8d42024-01-23 23:56:29 +0000413 `dex2oatd`,
Paul Duffince918b02021-06-07 14:33:47 +0100414 `prebuilt_com.android.art`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000415 })
Paul Duffince918b02021-06-07 14:33:47 +0100416
417 // Make sure that the prebuilt bootclasspath_fragment copies its dex files to the predefined
418 // locations for the art image.
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100419 module := result.ModuleForTests("dex_bootjars", "android_common")
Paul Duffince918b02021-06-07 14:33:47 +0100420 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffina1d60252021-01-21 18:13:43 +0000421 })
Paul Duffin396229f2021-03-18 18:30:31 +0000422
Paul Duffinba6afd02019-11-19 19:44:10 +0000423 t.Run("source with inconsistency between config and contents", func(t *testing.T) {
424 android.GroupFixturePreparers(
425 commonPreparer,
426
427 // Create an inconsistency between the ArtApexJars configuration and the art source
428 // bootclasspath_fragment module's contents property.
429 java.FixtureConfigureBootJars("com.android.art:foo"),
430 addSource("foo", "bar"),
431 ).
432 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
433 RunTest(t)
434 })
435
436 t.Run("prebuilt with inconsistency between config and contents", func(t *testing.T) {
437 android.GroupFixturePreparers(
438 commonPreparer,
439
440 // Create an inconsistency between the ArtApexJars configuration and the art
441 // prebuilt_bootclasspath_fragment module's contents property.
442 java.FixtureConfigureBootJars("com.android.art:foo"),
443 addPrebuilt(false, "foo", "bar"),
444 ).
445 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
446 RunTest(t)
447 })
448
449 t.Run("preferred prebuilt with inconsistency between config and contents", func(t *testing.T) {
450 android.GroupFixturePreparers(
451 commonPreparer,
452
453 // Create an inconsistency between the ArtApexJars configuration and the art
454 // prebuilt_bootclasspath_fragment module's contents property.
455 java.FixtureConfigureBootJars("com.android.art:foo"),
456 addPrebuilt(true, "foo", "bar"),
457
458 // Source contents property is consistent with the config.
459 addSource("foo"),
460 ).
461 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
462 RunTest(t)
463 })
464
465 t.Run("source preferred and prebuilt with inconsistency between config and contents", func(t *testing.T) {
466 android.GroupFixturePreparers(
467 commonPreparer,
468
469 // Create an inconsistency between the ArtApexJars configuration and the art
470 // prebuilt_bootclasspath_fragment module's contents property.
471 java.FixtureConfigureBootJars("com.android.art:foo"),
472 addPrebuilt(false, "foo", "bar"),
473
474 // Source contents property is consistent with the config.
475 addSource("foo"),
476
477 // This should pass because while the prebuilt is inconsistent with the configuration it is
478 // not actually used.
479 ).RunTest(t)
Paul Duffin396229f2021-03-18 18:30:31 +0000480 })
Paul Duffina1d60252021-01-21 18:13:43 +0000481}
482
Paul Duffin94f19632021-04-20 12:40:07 +0100483func TestBootclasspathFragmentInPrebuiltArtApex(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100484 preparers := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100485 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000486 prepareForTestWithArtApex,
487
488 android.FixtureMergeMockFs(android.MockFS{
489 "com.android.art-arm64.apex": nil,
490 "com.android.art-arm.apex": nil,
491 }),
492
Paul Duffin7771eba2021-04-23 14:25:28 +0100493 // Configure some libraries in the art bootclasspath_fragment.
Paul Duffin60264a02021-04-12 20:02:36 +0100494 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100495 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhange6e90db2022-01-28 14:58:56 +0000496 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100497 )
498
499 bp := `
Paul Duffin9ea71c02021-03-23 22:53:07 +0000500 prebuilt_apex {
501 name: "com.android.art",
502 arch: {
503 arm64: {
504 src: "com.android.art-arm64.apex",
505 },
506 arm: {
507 src: "com.android.art-arm.apex",
508 },
509 },
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100510 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000511 }
512
513 java_import {
514 name: "foo",
515 jars: ["foo.jar"],
516 apex_available: [
517 "com.android.art",
518 ],
519 }
520
521 java_import {
522 name: "bar",
523 jars: ["bar.jar"],
524 apex_available: [
525 "com.android.art",
526 ],
527 }
528
Paul Duffin7771eba2021-04-23 14:25:28 +0100529 prebuilt_bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100530 name: "art-bootclasspath-fragment",
Paul Duffin9ea71c02021-03-23 22:53:07 +0000531 image_name: "art",
Paul Duffinf23bc472021-04-27 12:42:20 +0100532 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
533 contents: ["foo", "bar"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000534 apex_available: [
535 "com.android.art",
536 ],
Paul Duffin54e41972021-07-19 13:23:40 +0100537 hidden_api: {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100538 annotation_flags: "hiddenapi/annotation-flags.csv",
539 metadata: "hiddenapi/metadata.csv",
540 index: "hiddenapi/index.csv",
541 stub_flags: "hiddenapi/stub-flags.csv",
542 all_flags: "hiddenapi/all-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +0100543 },
Paul Duffin9ea71c02021-03-23 22:53:07 +0000544 }
Paul Duffin9ea71c02021-03-23 22:53:07 +0000545
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100546 // A prebuilt apex with the same apex_name that shouldn't interfere when it isn't enabled.
547 prebuilt_apex {
548 name: "com.mycompany.android.art",
549 apex_name: "com.android.art",
550 %s
551 src: "com.mycompany.android.art.apex",
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100552 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100553 }
554 `
555
556 t.Run("disabled alternative APEX", func(t *testing.T) {
557 result := preparers.RunTestWithBp(t, fmt.Sprintf(bp, "enabled: false,"))
558
559 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000560 `all_apex_contributions`,
Spandan Das2069c3f2023-12-06 19:40:24 +0000561 `dex2oatd`,
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100562 `prebuilt_art-bootclasspath-fragment`,
Spandan Das3576e762024-01-03 18:57:03 +0000563 `prebuilt_com.android.art.apex.selector`,
564 `prebuilt_com.android.art.deapexer`,
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100565 })
566
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100567 java.CheckModuleDependencies(t, result.TestContext, "art-bootclasspath-fragment", "android_common_com.android.art", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000568 `all_apex_contributions`,
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100569 `dex2oatd`,
570 `prebuilt_bar`,
Spandan Das3576e762024-01-03 18:57:03 +0000571 `prebuilt_com.android.art.deapexer`,
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100572 `prebuilt_foo`,
573 })
574
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100575 module := result.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100576 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffin9ea71c02021-03-23 22:53:07 +0000577 })
578
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100579 t.Run("enabled alternative APEX", func(t *testing.T) {
580 preparers.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +0000581 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art")).
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100582 RunTestWithBp(t, fmt.Sprintf(bp, ""))
Paul Duffin9ea71c02021-03-23 22:53:07 +0000583 })
Paul Duffince918b02021-06-07 14:33:47 +0100584}
585
586// checkCopiesToPredefinedLocationForArt checks that the supplied modules are copied to the
587// predefined locations of boot dex jars used as inputs for the ART boot image.
588func checkCopiesToPredefinedLocationForArt(t *testing.T, config android.Config, module android.TestingModule, modules ...string) {
589 t.Helper()
590 bootJarLocations := []string{}
591 for _, output := range module.AllOutputs() {
592 output = android.StringRelativeToTop(config, output)
Jeongik Cha4753b392023-04-19 23:25:41 +0900593 if strings.HasPrefix(output, "out/soong/dexpreopt_arm64/dex_artjars_input/") {
Paul Duffince918b02021-06-07 14:33:47 +0100594 bootJarLocations = append(bootJarLocations, output)
595 }
596 }
597
598 sort.Strings(bootJarLocations)
599 expected := []string{}
600 for _, m := range modules {
Jeongik Cha4753b392023-04-19 23:25:41 +0900601 expected = append(expected, fmt.Sprintf("out/soong/dexpreopt_arm64/dex_artjars_input/%s.jar", m))
Paul Duffince918b02021-06-07 14:33:47 +0100602 }
603 sort.Strings(expected)
604
605 android.AssertArrayString(t, "copies to predefined locations for art", expected, bootJarLocations)
Paul Duffin9ea71c02021-03-23 22:53:07 +0000606}
607
Paul Duffin94f19632021-04-20 12:40:07 +0100608func TestBootclasspathFragmentContentsNoName(t *testing.T) {
Paul Duffin82886d62021-03-24 01:34:57 +0000609 result := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100610 prepareForTestWithBootclasspathFragment,
Paul Duffin82886d62021-03-24 01:34:57 +0000611 prepareForTestWithMyapex,
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100612 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100613 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100614 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
615 // is disabled.
616 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
617
618 java.PrepareForTestWithJavaSdkLibraryFiles,
619 java.FixtureWithLastReleaseApis("foo"),
Paul Duffin82886d62021-03-24 01:34:57 +0000620 ).RunTestWithBp(t, `
621 apex {
622 name: "myapex",
623 key: "myapex.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100624 bootclasspath_fragments: [
625 "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000626 ],
627 updatable: false,
628 }
629
630 apex_key {
631 name: "myapex.key",
632 public_key: "testkey.avbpubkey",
633 private_key: "testkey.pem",
634 }
635
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100636 java_sdk_library {
Paul Duffin82886d62021-03-24 01:34:57 +0000637 name: "foo",
638 srcs: ["b.java"],
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100639 shared_library: false,
640 public: {enabled: true},
Paul Duffin82886d62021-03-24 01:34:57 +0000641 apex_available: [
642 "myapex",
643 ],
644 }
645
646 java_library {
647 name: "bar",
648 srcs: ["b.java"],
649 installable: true,
650 apex_available: [
651 "myapex",
652 ],
653 }
654
Paul Duffin7771eba2021-04-23 14:25:28 +0100655 bootclasspath_fragment {
Paul Duffin94f19632021-04-20 12:40:07 +0100656 name: "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000657 contents: [
658 "foo",
659 "bar",
660 ],
661 apex_available: [
662 "myapex",
663 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100664 hidden_api: {
665 split_packages: ["*"],
666 },
Paul Duffin82886d62021-03-24 01:34:57 +0000667 }
668 `)
669
Jooyung Hana0503a52023-08-23 13:12:50 +0900670 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Paul Duffin4d101b62021-03-24 15:42:20 +0000671 // This does not include art, oat or vdex files as they are only included for the art boot
672 // image.
satayev227e7452021-05-20 21:35:06 +0100673 "etc/classpaths/bootclasspath.pb",
Paul Duffin4d101b62021-03-24 15:42:20 +0000674 "javalib/bar.jar",
675 "javalib/foo.jar",
676 })
Paul Duffin82886d62021-03-24 01:34:57 +0000677
Jooyung Hana0503a52023-08-23 13:12:50 +0900678 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex", []string{
Spandan Dase21a8d42024-01-23 23:56:29 +0000679 `dex2oatd`,
Paul Duffin82886d62021-03-24 01:34:57 +0000680 `myapex.key`,
Paul Duffin94f19632021-04-20 12:40:07 +0100681 `mybootclasspathfragment`,
Paul Duffin82886d62021-03-24 01:34:57 +0000682 })
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100683
Jooyung Hana0503a52023-08-23 13:12:50 +0900684 apex := result.ModuleForTests("myapex", "android_common_myapex")
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100685 apexRule := apex.Rule("apexRule")
686 copyCommands := apexRule.Args["copy_commands"]
687
688 // Make sure that the fragment provides the hidden API encoded dex jars to the APEX.
689 fragment := result.Module("mybootclasspathfragment", "android_common_apex10000")
690
Yu Liu663e4502024-08-12 18:23:59 +0000691 info, _ := android.OtherModuleProvider(result, fragment, java.BootclasspathFragmentApexContentInfoProvider)
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100692
693 checkFragmentExportedDexJar := func(name string, expectedDexJar string) {
694 module := result.Module(name, "android_common_apex10000")
Paul Duffin1a8010a2021-05-15 12:39:23 +0100695 dexJar, err := info.DexBootJarPathForContentModule(module)
696 if err != nil {
697 t.Error(err)
698 }
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100699 android.AssertPathRelativeToTopEquals(t, name+" dex", expectedDexJar, dexJar)
700
Jooyung Hana0503a52023-08-23 13:12:50 +0900701 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 +0100702 android.AssertStringDoesContain(t, name+" apex copy command", copyCommands, expectedCopyCommand)
703 }
704
Paul Duffin54c98f52021-05-15 08:54:30 +0100705 checkFragmentExportedDexJar("foo", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/foo.jar")
706 checkFragmentExportedDexJar("bar", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/bar.jar")
Paul Duffin82886d62021-03-24 01:34:57 +0000707}
708
Paul Duffin48b67412021-06-23 16:13:50 +0100709func getDexJarPath(result *android.TestResult, name string) string {
710 module := result.Module(name, "android_common")
Spandan Das59a4a2b2024-01-09 21:35:56 +0000711 return module.(java.UsesLibraryDependency).DexJarBuildPath(moduleErrorfTestCtx{}).Path().RelativeToTop().String()
Paul Duffin48b67412021-06-23 16:13:50 +0100712}
713
714// TestBootclasspathFragment_HiddenAPIList checks to make sure that the correct parameters are
715// passed to the hiddenapi list tool.
716func TestBootclasspathFragment_HiddenAPIList(t *testing.T) {
717 result := android.GroupFixturePreparers(
718 prepareForTestWithBootclasspathFragment,
719 prepareForTestWithArtApex,
720 prepareForTestWithMyapex,
721 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
722 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
satayevd604b212021-07-21 14:23:52 +0100723 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin48b67412021-06-23 16:13:50 +0100724 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
725 // is disabled.
726 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
727
728 java.PrepareForTestWithJavaSdkLibraryFiles,
729 java.FixtureWithLastReleaseApis("foo", "quuz"),
Colin Crossa66b4632024-08-08 15:50:47 -0700730 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Paul Duffin48b67412021-06-23 16:13:50 +0100731 ).RunTestWithBp(t, `
732 apex {
733 name: "com.android.art",
734 key: "com.android.art.key",
735 bootclasspath_fragments: ["art-bootclasspath-fragment"],
736 updatable: false,
737 }
738
739 apex_key {
740 name: "com.android.art.key",
741 public_key: "com.android.art.avbpubkey",
742 private_key: "com.android.art.pem",
743 }
744
745 java_library {
746 name: "baz",
747 apex_available: [
748 "com.android.art",
749 ],
750 srcs: ["b.java"],
751 compile_dex: true,
752 }
753
754 java_sdk_library {
755 name: "quuz",
756 apex_available: [
757 "com.android.art",
758 ],
759 srcs: ["b.java"],
760 compile_dex: true,
761 public: {enabled: true},
762 system: {enabled: true},
763 test: {enabled: true},
764 module_lib: {enabled: true},
765 }
766
767 bootclasspath_fragment {
768 name: "art-bootclasspath-fragment",
769 image_name: "art",
770 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
771 contents: ["baz", "quuz"],
772 apex_available: [
773 "com.android.art",
774 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100775 hidden_api: {
776 split_packages: ["*"],
777 },
Paul Duffin48b67412021-06-23 16:13:50 +0100778 }
779
780 apex {
781 name: "myapex",
782 key: "myapex.key",
783 bootclasspath_fragments: [
784 "mybootclasspathfragment",
785 ],
786 updatable: false,
787 }
788
789 apex_key {
790 name: "myapex.key",
791 public_key: "testkey.avbpubkey",
792 private_key: "testkey.pem",
793 }
794
795 java_sdk_library {
796 name: "foo",
797 srcs: ["b.java"],
798 shared_library: false,
799 public: {enabled: true},
800 apex_available: [
801 "myapex",
802 ],
803 }
804
805 java_library {
806 name: "bar",
807 srcs: ["b.java"],
808 installable: true,
809 apex_available: [
810 "myapex",
811 ],
812 }
813
814 bootclasspath_fragment {
815 name: "mybootclasspathfragment",
816 contents: [
817 "foo",
818 "bar",
819 ],
820 apex_available: [
821 "myapex",
822 ],
823 fragments: [
824 {
825 apex: "com.android.art",
826 module: "art-bootclasspath-fragment",
827 },
828 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100829 hidden_api: {
830 split_packages: ["*"],
831 },
Paul Duffin48b67412021-06-23 16:13:50 +0100832 }
833 `)
834
835 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
Spandan Das16791922024-09-06 00:49:31 +0000836 "all_apex_contributions",
Paul Duffin48b67412021-06-23 16:13:50 +0100837 "art-bootclasspath-fragment",
838 "bar",
839 "dex2oatd",
840 "foo",
841 })
842
Jihoon Kangbd093452023-12-26 19:08:01 +0000843 fooStubs := getDexJarPath(result, "foo.stubs.exportable")
844 quuzPublicStubs := getDexJarPath(result, "quuz.stubs.exportable")
845 quuzSystemStubs := getDexJarPath(result, "quuz.stubs.exportable.system")
846 quuzTestStubs := getDexJarPath(result, "quuz.stubs.exportable.test")
847 quuzModuleLibStubs := getDexJarPath(result, "quuz.stubs.exportable.module_lib")
Paul Duffin48b67412021-06-23 16:13:50 +0100848
849 // Make sure that the fragment uses the quuz stub dex jars when generating the hidden API flags.
850 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
851
852 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
853 command := rule.RuleParams.Command
854 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
855
856 // Make sure that the quuz stubs are available for resolving references from the implementation
857 // boot dex jars provided by this module.
Paul Duffinb51db2e2021-06-21 14:08:08 +0100858 android.AssertStringDoesContain(t, "quuz widest", command, "--dependency-stub-dex="+quuzModuleLibStubs)
Paul Duffin48b67412021-06-23 16:13:50 +0100859
860 // Make sure that the quuz stubs are available for resolving references from the different API
861 // stubs provided by this module.
862 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+quuzPublicStubs+":"+fooStubs)
863 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+quuzSystemStubs+":"+fooStubs)
864 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+quuzTestStubs+":"+fooStubs)
865}
866
Paul Duffin5cca7c42021-05-26 10:16:01 +0100867// TestBootclasspathFragment_AndroidNonUpdatable checks to make sure that setting
868// additional_stubs: ["android-non-updatable"] causes the source android-non-updatable modules to be
869// added to the hiddenapi list tool.
Jihoon Kangcc9e2182023-10-16 23:13:33 +0000870func TestBootclasspathFragment_AndroidNonUpdatable_FromSource(t *testing.T) {
Paul Duffin5cca7c42021-05-26 10:16:01 +0100871 result := android.GroupFixturePreparers(
872 prepareForTestWithBootclasspathFragment,
873 prepareForTestWithArtApex,
874 prepareForTestWithMyapex,
875 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100876 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
877 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +0100878 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
879 // is disabled.
880 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Jihoon Kangcc9e2182023-10-16 23:13:33 +0000881 android.FixtureModifyConfig(func(config android.Config) {
882 config.SetBuildFromTextStub(false)
883 }),
Paul Duffin5cca7c42021-05-26 10:16:01 +0100884
885 java.PrepareForTestWithJavaSdkLibraryFiles,
886 java.FixtureWithLastReleaseApis("foo", "android-non-updatable"),
887 ).RunTestWithBp(t, `
888 java_sdk_library {
889 name: "android-non-updatable",
890 srcs: ["b.java"],
891 compile_dex: true,
892 public: {
893 enabled: true,
894 },
895 system: {
896 enabled: true,
897 },
898 test: {
899 enabled: true,
900 },
901 module_lib: {
902 enabled: true,
903 },
904 }
905
906 apex {
907 name: "com.android.art",
908 key: "com.android.art.key",
909 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +0100910 updatable: false,
911 }
912
913 apex_key {
914 name: "com.android.art.key",
915 public_key: "com.android.art.avbpubkey",
916 private_key: "com.android.art.pem",
917 }
918
919 java_library {
920 name: "baz",
921 apex_available: [
922 "com.android.art",
923 ],
924 srcs: ["b.java"],
925 compile_dex: true,
926 }
927
928 java_library {
929 name: "quuz",
930 apex_available: [
931 "com.android.art",
932 ],
933 srcs: ["b.java"],
934 compile_dex: true,
935 }
936
937 bootclasspath_fragment {
938 name: "art-bootclasspath-fragment",
939 image_name: "art",
940 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
941 contents: ["baz", "quuz"],
942 apex_available: [
943 "com.android.art",
944 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100945 hidden_api: {
946 split_packages: ["*"],
947 },
Paul Duffin5cca7c42021-05-26 10:16:01 +0100948 }
949
950 apex {
951 name: "myapex",
952 key: "myapex.key",
953 bootclasspath_fragments: [
954 "mybootclasspathfragment",
955 ],
956 updatable: false,
957 }
958
959 apex_key {
960 name: "myapex.key",
961 public_key: "testkey.avbpubkey",
962 private_key: "testkey.pem",
963 }
964
965 java_sdk_library {
966 name: "foo",
967 srcs: ["b.java"],
968 shared_library: false,
969 public: {enabled: true},
970 apex_available: [
971 "myapex",
972 ],
973 }
974
975 java_library {
976 name: "bar",
977 srcs: ["b.java"],
978 installable: true,
979 apex_available: [
980 "myapex",
981 ],
982 }
983
984 bootclasspath_fragment {
985 name: "mybootclasspathfragment",
986 contents: [
987 "foo",
988 "bar",
989 ],
990 apex_available: [
991 "myapex",
992 ],
993 additional_stubs: ["android-non-updatable"],
994 fragments: [
995 {
996 apex: "com.android.art",
997 module: "art-bootclasspath-fragment",
998 },
999 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001000 hidden_api: {
1001 split_packages: ["*"],
1002 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001003 }
1004 `)
1005
1006 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
Spandan Das16791922024-09-06 00:49:31 +00001007 "all_apex_contributions",
Paul Duffin5cca7c42021-05-26 10:16:01 +01001008 "android-non-updatable.stubs",
1009 "android-non-updatable.stubs.module_lib",
1010 "android-non-updatable.stubs.system",
1011 "android-non-updatable.stubs.test",
1012 "art-bootclasspath-fragment",
1013 "bar",
1014 "dex2oatd",
1015 "foo",
1016 })
1017
1018 nonUpdatablePublicStubs := getDexJarPath(result, "android-non-updatable.stubs")
1019 nonUpdatableSystemStubs := getDexJarPath(result, "android-non-updatable.stubs.system")
1020 nonUpdatableTestStubs := getDexJarPath(result, "android-non-updatable.stubs.test")
1021 nonUpdatableModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.module_lib")
1022
1023 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1024 // API flags.
1025 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1026
1027 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1028 command := rule.RuleParams.Command
1029 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1030
1031 // Make sure that the module_lib non-updatable stubs are available for resolving references from
1032 // the implementation boot dex jars provided by this module.
1033 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
1034
1035 // Make sure that the appropriate non-updatable stubs are available for resolving references from
1036 // the different API stubs provided by this module.
1037 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
1038 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
1039 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
1040}
1041
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001042func TestBootclasspathFragment_AndroidNonUpdatable_FromText(t *testing.T) {
1043 result := android.GroupFixturePreparers(
1044 prepareForTestWithBootclasspathFragment,
1045 prepareForTestWithArtApex,
1046 prepareForTestWithMyapex,
1047 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
1048 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
1049 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
1050 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1051 // is disabled.
1052 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1053 android.FixtureModifyConfig(func(config android.Config) {
1054 config.SetBuildFromTextStub(true)
1055 }),
1056
1057 java.PrepareForTestWithJavaSdkLibraryFiles,
1058 java.FixtureWithLastReleaseApis("foo", "android-non-updatable"),
1059 ).RunTestWithBp(t, `
1060 java_sdk_library {
1061 name: "android-non-updatable",
1062 srcs: ["b.java"],
1063 compile_dex: true,
1064 public: {
1065 enabled: true,
1066 },
1067 system: {
1068 enabled: true,
1069 },
1070 test: {
1071 enabled: true,
1072 },
1073 module_lib: {
1074 enabled: true,
1075 },
1076 }
1077
1078 apex {
1079 name: "com.android.art",
1080 key: "com.android.art.key",
1081 bootclasspath_fragments: ["art-bootclasspath-fragment"],
1082 updatable: false,
1083 }
1084
1085 apex_key {
1086 name: "com.android.art.key",
1087 public_key: "com.android.art.avbpubkey",
1088 private_key: "com.android.art.pem",
1089 }
1090
1091 java_library {
1092 name: "baz",
1093 apex_available: [
1094 "com.android.art",
1095 ],
1096 srcs: ["b.java"],
1097 compile_dex: true,
1098 }
1099
1100 java_library {
1101 name: "quuz",
1102 apex_available: [
1103 "com.android.art",
1104 ],
1105 srcs: ["b.java"],
1106 compile_dex: true,
1107 }
1108
1109 bootclasspath_fragment {
1110 name: "art-bootclasspath-fragment",
1111 image_name: "art",
1112 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
1113 contents: ["baz", "quuz"],
1114 apex_available: [
1115 "com.android.art",
1116 ],
1117 hidden_api: {
1118 split_packages: ["*"],
1119 },
1120 }
1121
1122 apex {
1123 name: "myapex",
1124 key: "myapex.key",
1125 bootclasspath_fragments: [
1126 "mybootclasspathfragment",
1127 ],
1128 updatable: false,
1129 }
1130
1131 apex_key {
1132 name: "myapex.key",
1133 public_key: "testkey.avbpubkey",
1134 private_key: "testkey.pem",
1135 }
1136
1137 java_sdk_library {
1138 name: "foo",
1139 srcs: ["b.java"],
1140 shared_library: false,
1141 public: {enabled: true},
1142 apex_available: [
1143 "myapex",
1144 ],
1145 }
1146
1147 java_library {
1148 name: "bar",
1149 srcs: ["b.java"],
1150 installable: true,
1151 apex_available: [
1152 "myapex",
1153 ],
1154 }
1155
1156 bootclasspath_fragment {
1157 name: "mybootclasspathfragment",
1158 contents: [
1159 "foo",
1160 "bar",
1161 ],
1162 apex_available: [
1163 "myapex",
1164 ],
1165 additional_stubs: ["android-non-updatable"],
1166 fragments: [
1167 {
1168 apex: "com.android.art",
1169 module: "art-bootclasspath-fragment",
1170 },
1171 ],
1172 hidden_api: {
1173 split_packages: ["*"],
1174 },
1175 }
1176 `)
1177
1178 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
Spandan Das16791922024-09-06 00:49:31 +00001179 "all_apex_contributions",
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001180 "android-non-updatable.stubs",
1181 "android-non-updatable.stubs.system",
1182 "android-non-updatable.stubs.test",
1183 "android-non-updatable.stubs.test_module_lib",
1184 "art-bootclasspath-fragment",
1185 "bar",
1186 "dex2oatd",
1187 "foo",
1188 })
1189
1190 nonUpdatableTestModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.test_module_lib")
1191
1192 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1193 // API flags.
1194 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1195
1196 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1197 command := rule.RuleParams.Command
1198 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1199
1200 // Make sure that the test_module_lib non-updatable stubs are available for resolving references from
1201 // the implementation boot dex jars provided by this module.
1202 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableTestModuleLibStubs)
1203}
1204
Paul Duffin5cca7c42021-05-26 10:16:01 +01001205// TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks checks to make sure that
1206// setting additional_stubs: ["android-non-updatable"] causes the prebuilt android-non-updatable
1207// modules to be added to the hiddenapi list tool.
1208func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *testing.T) {
1209 result := android.GroupFixturePreparers(
1210 prepareForTestWithBootclasspathFragment,
Jiakai Zhangb95998b2023-05-11 16:39:27 +01001211 java.PrepareForTestWithDexpreopt,
Paul Duffin5cca7c42021-05-26 10:16:01 +01001212 prepareForTestWithArtApex,
1213 prepareForTestWithMyapex,
1214 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +01001215 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
1216 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +01001217 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1218 // is disabled.
1219 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1220
1221 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1222 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
1223 }),
1224
1225 java.PrepareForTestWithJavaSdkLibraryFiles,
1226 java.FixtureWithPrebuiltApis(map[string][]string{
1227 "current": {"android-non-updatable"},
1228 "30": {"foo"},
1229 }),
1230 ).RunTestWithBp(t, `
1231 apex {
1232 name: "com.android.art",
1233 key: "com.android.art.key",
1234 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +01001235 updatable: false,
1236 }
1237
1238 apex_key {
1239 name: "com.android.art.key",
1240 public_key: "com.android.art.avbpubkey",
1241 private_key: "com.android.art.pem",
1242 }
1243
1244 java_library {
1245 name: "baz",
1246 apex_available: [
1247 "com.android.art",
1248 ],
1249 srcs: ["b.java"],
1250 compile_dex: true,
1251 }
1252
1253 java_library {
1254 name: "quuz",
1255 apex_available: [
1256 "com.android.art",
1257 ],
1258 srcs: ["b.java"],
1259 compile_dex: true,
1260 }
1261
1262 bootclasspath_fragment {
1263 name: "art-bootclasspath-fragment",
1264 image_name: "art",
1265 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
1266 contents: ["baz", "quuz"],
1267 apex_available: [
1268 "com.android.art",
1269 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001270 hidden_api: {
1271 split_packages: ["*"],
1272 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001273 }
1274
1275 apex {
1276 name: "myapex",
1277 key: "myapex.key",
1278 bootclasspath_fragments: [
1279 "mybootclasspathfragment",
1280 ],
1281 updatable: false,
1282 }
1283
1284 apex_key {
1285 name: "myapex.key",
1286 public_key: "testkey.avbpubkey",
1287 private_key: "testkey.pem",
1288 }
1289
1290 java_sdk_library {
1291 name: "foo",
1292 srcs: ["b.java"],
1293 shared_library: false,
1294 public: {enabled: true},
1295 apex_available: [
1296 "myapex",
1297 ],
1298 }
1299
1300 java_library {
1301 name: "bar",
1302 srcs: ["b.java"],
1303 installable: true,
1304 apex_available: [
1305 "myapex",
1306 ],
1307 }
1308
1309 bootclasspath_fragment {
1310 name: "mybootclasspathfragment",
1311 contents: [
1312 "foo",
1313 "bar",
1314 ],
1315 apex_available: [
1316 "myapex",
1317 ],
1318 additional_stubs: ["android-non-updatable"],
1319 fragments: [
1320 {
1321 apex: "com.android.art",
1322 module: "art-bootclasspath-fragment",
1323 },
1324 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001325 hidden_api: {
1326 split_packages: ["*"],
1327 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001328 }
1329 `)
1330
1331 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
Spandan Das16791922024-09-06 00:49:31 +00001332 "all_apex_contributions",
Paul Duffin5cca7c42021-05-26 10:16:01 +01001333 "art-bootclasspath-fragment",
1334 "bar",
1335 "dex2oatd",
1336 "foo",
1337 "prebuilt_sdk_module-lib_current_android-non-updatable",
1338 "prebuilt_sdk_public_current_android-non-updatable",
1339 "prebuilt_sdk_system_current_android-non-updatable",
1340 "prebuilt_sdk_test_current_android-non-updatable",
1341 })
1342
1343 nonUpdatablePublicStubs := getDexJarPath(result, "sdk_public_current_android-non-updatable")
1344 nonUpdatableSystemStubs := getDexJarPath(result, "sdk_system_current_android-non-updatable")
1345 nonUpdatableTestStubs := getDexJarPath(result, "sdk_test_current_android-non-updatable")
1346 nonUpdatableModuleLibStubs := getDexJarPath(result, "sdk_module-lib_current_android-non-updatable")
1347
1348 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1349 // API flags.
1350 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1351
1352 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1353 command := rule.RuleParams.Command
1354 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1355
1356 // Make sure that the module_lib non-updatable stubs are available for resolving references from
1357 // the implementation boot dex jars provided by this module.
1358 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
1359
1360 // Make sure that the appropriate non-updatable stubs are available for resolving references from
1361 // the different API stubs provided by this module.
1362 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
1363 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
1364 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
1365}
1366
Spandan Dasfcea0a82024-06-12 18:22:46 +00001367func TestBootclasspathFragmentProtoContainsMinSdkVersion(t *testing.T) {
1368 result := android.GroupFixturePreparers(
1369 prepareForTestWithBootclasspathFragment,
1370 prepareForTestWithMyapex,
1371 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
1372 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
1373 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1374 // is disabled.
1375 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1376
1377 java.PrepareForTestWithJavaSdkLibraryFiles,
1378 java.FixtureWithLastReleaseApis("foo", "bar"),
1379 ).RunTestWithBp(t, `
1380 apex {
1381 name: "myapex",
1382 key: "myapex.key",
1383 bootclasspath_fragments: [
1384 "mybootclasspathfragment",
1385 ],
1386 updatable: false,
1387 }
1388
1389 apex_key {
1390 name: "myapex.key",
1391 public_key: "testkey.avbpubkey",
1392 private_key: "testkey.pem",
1393 }
1394
1395 java_sdk_library {
1396 name: "foo",
1397 srcs: ["b.java"],
1398 shared_library: false,
1399 public: {enabled: true},
1400 apex_available: [
1401 "myapex",
1402 ],
1403 min_sdk_version: "33",
1404 }
1405
1406 java_sdk_library {
1407 name: "bar",
1408 srcs: ["b.java"],
1409 shared_library: false,
1410 public: {enabled: true},
1411 apex_available: [
1412 "myapex",
1413 ],
1414 min_sdk_version: "34",
1415 }
1416
1417 bootclasspath_fragment {
1418 name: "mybootclasspathfragment",
1419 contents: [
1420 "foo",
1421 "bar",
1422 ],
1423 apex_available: [
1424 "myapex",
1425 ],
1426 hidden_api: {
1427 split_packages: ["*"],
1428 },
1429 }
1430 `)
1431
1432 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1433 classPathProtoContent := android.ContentFromFileRuleForTests(t, result.TestContext, fragment.Output("bootclasspath.pb.textproto"))
1434 // foo
1435 ensureContains(t, classPathProtoContent, `jars {
1436path: "/apex/myapex/javalib/foo.jar"
1437classpath: BOOTCLASSPATH
1438min_sdk_version: "33"
1439max_sdk_version: ""
1440}
1441`)
1442 // bar
1443 ensureContains(t, classPathProtoContent, `jars {
1444path: "/apex/myapex/javalib/bar.jar"
1445classpath: BOOTCLASSPATH
1446min_sdk_version: "34"
1447max_sdk_version: ""
1448}
1449`)
1450}
1451
Paul Duffina1d60252021-01-21 18:13:43 +00001452// TODO(b/177892522) - add test for host apex.