blob: 533f937af58478a854e355bb51adee10ca7b7f8e [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,
Jihoon Kangbd093452023-12-26 19:08:01 +000056 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
57 variables.BuildFlags = map[string]string{
58 "RELEASE_HIDDEN_API_EXPORTABLE_STUBS": "true",
59 }
60 }),
Paul Duffinf1b358c2021-05-17 07:38:47 +010061 java.PrepareForTestWithJavaSdkLibraryFiles,
62 java.FixtureWithLastReleaseApis("foo", "baz"),
63 ).RunTestWithBp(t, `
64 java_sdk_library {
65 name: "foo",
66 srcs: ["b.java"],
67 shared_library: false,
68 public: {
69 enabled: true,
70 },
71 system: {
72 enabled: true,
73 },
74 }
75
76 java_library {
77 name: "bar",
78 srcs: ["b.java"],
79 installable: true,
80 }
81
82 apex {
83 name: "com.android.art",
84 key: "com.android.art.key",
85 bootclasspath_fragments: ["art-bootclasspath-fragment"],
86 updatable: false,
87 }
88
89 apex_key {
90 name: "com.android.art.key",
91 public_key: "com.android.art.avbpubkey",
92 private_key: "com.android.art.pem",
93 }
94
95 java_sdk_library {
96 name: "baz",
97 apex_available: [
98 "com.android.art",
99 ],
100 srcs: ["b.java"],
101 shared_library: false,
102 public: {
103 enabled: true,
104 },
105 system: {
106 enabled: true,
107 },
108 test: {
109 enabled: true,
110 },
111 }
112
113 java_library {
114 name: "quuz",
115 apex_available: [
116 "com.android.art",
117 ],
118 srcs: ["b.java"],
119 compile_dex: true,
120 }
121
122 bootclasspath_fragment {
123 name: "art-bootclasspath-fragment",
124 image_name: "art",
125 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
126 contents: ["baz", "quuz"],
127 apex_available: [
128 "com.android.art",
129 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100130 hidden_api: {
131 split_packages: ["*"],
132 },
Paul Duffinf1b358c2021-05-17 07:38:47 +0100133 }
134
135 bootclasspath_fragment {
136 name: "other-bootclasspath-fragment",
137 contents: ["foo", "bar"],
138 fragments: [
139 {
140 apex: "com.android.art",
141 module: "art-bootclasspath-fragment",
142 },
143 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100144 hidden_api: {
145 split_packages: ["*"],
146 },
Paul Duffinf1b358c2021-05-17 07:38:47 +0100147 }
148`,
149 )
150
Paul Duffin31fad802021-06-18 18:14:25 +0100151 checkAPIScopeStubs := func(message string, info java.HiddenAPIInfo, apiScope *java.HiddenAPIScope, expectedPaths ...string) {
Paul Duffinf1b358c2021-05-17 07:38:47 +0100152 t.Helper()
Paul Duffin280a31a2021-06-27 20:28:29 +0100153 paths := info.TransitiveStubDexJarsByScope.StubDexJarsForScope(apiScope)
154 android.AssertPathsRelativeToTopEquals(t, fmt.Sprintf("%s %s", message, apiScope), expectedPaths, paths)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100155 }
156
157 // Check stub dex paths exported by art.
158 artFragment := result.Module("art-bootclasspath-fragment", "android_common")
Colin Cross5a377182023-12-14 14:46:23 -0800159 artInfo, _ := android.SingletonModuleProvider(result, artFragment, java.HiddenAPIInfoProvider)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100160
Jihoon Kangbd093452023-12-26 19:08:01 +0000161 bazPublicStubs := "out/soong/.intermediates/baz.stubs.exportable/android_common/dex/baz.stubs.exportable.jar"
162 bazSystemStubs := "out/soong/.intermediates/baz.stubs.exportable.system/android_common/dex/baz.stubs.exportable.system.jar"
163 bazTestStubs := "out/soong/.intermediates/baz.stubs.exportable.test/android_common/dex/baz.stubs.exportable.test.jar"
Paul Duffinf1b358c2021-05-17 07:38:47 +0100164
Paul Duffin31fad802021-06-18 18:14:25 +0100165 checkAPIScopeStubs("art", artInfo, java.PublicHiddenAPIScope, bazPublicStubs)
166 checkAPIScopeStubs("art", artInfo, java.SystemHiddenAPIScope, bazSystemStubs)
167 checkAPIScopeStubs("art", artInfo, java.TestHiddenAPIScope, bazTestStubs)
168 checkAPIScopeStubs("art", artInfo, java.CorePlatformHiddenAPIScope)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100169
170 // Check stub dex paths exported by other.
171 otherFragment := result.Module("other-bootclasspath-fragment", "android_common")
Colin Cross5a377182023-12-14 14:46:23 -0800172 otherInfo, _ := android.SingletonModuleProvider(result, otherFragment, java.HiddenAPIInfoProvider)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100173
Jihoon Kangbd093452023-12-26 19:08:01 +0000174 fooPublicStubs := "out/soong/.intermediates/foo.stubs.exportable/android_common/dex/foo.stubs.exportable.jar"
175 fooSystemStubs := "out/soong/.intermediates/foo.stubs.exportable.system/android_common/dex/foo.stubs.exportable.system.jar"
Paul Duffinf1b358c2021-05-17 07:38:47 +0100176
Paul Duffin31fad802021-06-18 18:14:25 +0100177 checkAPIScopeStubs("other", otherInfo, java.PublicHiddenAPIScope, bazPublicStubs, fooPublicStubs)
178 checkAPIScopeStubs("other", otherInfo, java.SystemHiddenAPIScope, bazSystemStubs, fooSystemStubs)
179 checkAPIScopeStubs("other", otherInfo, java.TestHiddenAPIScope, bazTestStubs, fooSystemStubs)
180 checkAPIScopeStubs("other", otherInfo, java.CorePlatformHiddenAPIScope)
Paul Duffinf1b358c2021-05-17 07:38:47 +0100181}
182
Paul Duffin94f19632021-04-20 12:40:07 +0100183func TestBootclasspathFragmentInArtApex(t *testing.T) {
Paul Duffinba6afd02019-11-19 19:44:10 +0000184 commonPreparer := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100185 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000186 prepareForTestWithArtApex,
187
Paul Duffinba6afd02019-11-19 19:44:10 +0000188 android.FixtureWithRootAndroidBp(`
Paul Duffina1d60252021-01-21 18:13:43 +0000189 apex {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000190 name: "com.android.art",
191 key: "com.android.art.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100192 bootclasspath_fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100193 "art-bootclasspath-fragment",
Paul Duffina1d60252021-01-21 18:13:43 +0000194 ],
Paul Duffin4d101b62021-03-24 15:42:20 +0000195 // bar (like foo) should be transitively included in this apex because it is part of the
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100196 // art-bootclasspath-fragment bootclasspath_fragment.
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000197 updatable: false,
Paul Duffina1d60252021-01-21 18:13:43 +0000198 }
199
Spandan Das7fd531f2024-06-05 19:27:18 +0000200 override_apex {
201 name: "com.mycompany.android.art",
202 base: "com.android.art",
203 min_sdk_version: "33", // mycompany overrides the min_sdk_version
204 }
205
Paul Duffina1d60252021-01-21 18:13:43 +0000206 apex_key {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000207 name: "com.android.art.key",
Paul Duffina1d60252021-01-21 18:13:43 +0000208 public_key: "testkey.avbpubkey",
209 private_key: "testkey.pem",
210 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000211 `),
212 )
Paul Duffin65898052021-04-20 22:47:03 +0100213
Paul Duffinba6afd02019-11-19 19:44:10 +0000214 contentsInsert := func(contents []string) string {
215 insert := ""
216 if contents != nil {
217 insert = fmt.Sprintf(`contents: ["%s"],`, strings.Join(contents, `", "`))
Paul Duffin396229f2021-03-18 18:30:31 +0000218 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000219 return insert
220 }
Paul Duffina1d60252021-01-21 18:13:43 +0000221
Paul Duffinba6afd02019-11-19 19:44:10 +0000222 addSource := func(contents ...string) android.FixturePreparer {
223 text := fmt.Sprintf(`
224 bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100225 name: "art-bootclasspath-fragment",
Paul Duffinba6afd02019-11-19 19:44:10 +0000226 image_name: "art",
227 %s
228 apex_available: [
229 "com.android.art",
230 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100231 hidden_api: {
232 split_packages: ["*"],
233 },
Paul Duffinba6afd02019-11-19 19:44:10 +0000234 }
235 `, contentsInsert(contents))
236
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100237 for _, content := range contents {
238 text += fmt.Sprintf(`
239 java_library {
240 name: "%[1]s",
241 srcs: ["%[1]s.java"],
242 installable: true,
243 apex_available: [
244 "com.android.art",
245 ],
246 }
247 `, content)
248 }
249
Paul Duffinba6afd02019-11-19 19:44:10 +0000250 return android.FixtureAddTextFile("art/build/boot/Android.bp", text)
251 }
252
253 addPrebuilt := func(prefer bool, contents ...string) android.FixturePreparer {
254 text := fmt.Sprintf(`
Paul Duffince918b02021-06-07 14:33:47 +0100255 prebuilt_apex {
256 name: "com.android.art",
257 arch: {
258 arm64: {
259 src: "com.android.art-arm64.apex",
260 },
261 arm: {
262 src: "com.android.art-arm.apex",
263 },
264 },
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100265 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffince918b02021-06-07 14:33:47 +0100266 }
267
Paul Duffinba6afd02019-11-19 19:44:10 +0000268 prebuilt_bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100269 name: "art-bootclasspath-fragment",
Paul Duffinba6afd02019-11-19 19:44:10 +0000270 image_name: "art",
271 %s
272 prefer: %t,
273 apex_available: [
274 "com.android.art",
275 ],
Paul Duffin54e41972021-07-19 13:23:40 +0100276 hidden_api: {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100277 annotation_flags: "hiddenapi/annotation-flags.csv",
278 metadata: "hiddenapi/metadata.csv",
279 index: "hiddenapi/index.csv",
280 stub_flags: "hiddenapi/stub-flags.csv",
281 all_flags: "hiddenapi/all-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +0100282 },
Paul Duffinba6afd02019-11-19 19:44:10 +0000283 }
284 `, contentsInsert(contents), prefer)
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100285
286 for _, content := range contents {
287 text += fmt.Sprintf(`
288 java_import {
289 name: "%[1]s",
290 prefer: %[2]t,
291 jars: ["%[1]s.jar"],
292 apex_available: [
293 "com.android.art",
294 ],
295 compile_dex: true,
296 }
297 `, content, prefer)
298 }
299
Paul Duffinba6afd02019-11-19 19:44:10 +0000300 return android.FixtureAddTextFile("prebuilts/module_sdk/art/Android.bp", text)
301 }
302
Paul Duffince918b02021-06-07 14:33:47 +0100303 t.Run("boot image files from source", func(t *testing.T) {
304 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{
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100323 `art-bootclasspath-fragment`,
Paul Duffince918b02021-06-07 14:33:47 +0100324 `com.android.art.key`,
Spandan Dase21a8d42024-01-23 23:56:29 +0000325 `dex2oatd`,
Paul Duffince918b02021-06-07 14:33:47 +0100326 })
327
328 // Make sure that the source bootclasspath_fragment copies its dex files to the predefined
329 // locations for the art image.
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100330 module := result.ModuleForTests("dex_bootjars", "android_common")
Paul Duffince918b02021-06-07 14:33:47 +0100331 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
332 })
333
Spandan Das7fd531f2024-06-05 19:27:18 +0000334 t.Run("boot image files from source of override apex", func(t *testing.T) {
335 result := android.GroupFixturePreparers(
336 commonPreparer,
337
338 // Configure some libraries in the art bootclasspath_fragment that match the source
339 // bootclasspath_fragment's contents property.
340 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
341 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
342 addSource("foo", "bar"),
343 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
344 ).RunTest(t)
345
346 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.mycompany.android.art_com.mycompany.android.art", []string{
347 "etc/boot-image.prof",
348 "etc/classpaths/bootclasspath.pb",
349 "javalib/bar.jar",
350 "javalib/foo.jar",
351 })
352 })
353
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000354 t.Run("generate boot image profile even if dexpreopt is disabled", func(t *testing.T) {
355 result := android.GroupFixturePreparers(
356 commonPreparer,
357
358 // Configure some libraries in the art bootclasspath_fragment that match the source
359 // bootclasspath_fragment's contents property.
360 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
361 addSource("foo", "bar"),
362 java.FixtureSetBootImageInstallDirOnDevice("art", "system/framework"),
363 dexpreopt.FixtureDisableDexpreoptBootImages(true),
364 ).RunTest(t)
365
Jooyung Hana0503a52023-08-23 13:12:50 +0900366 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000367 "etc/boot-image.prof",
368 "etc/classpaths/bootclasspath.pb",
369 "javalib/bar.jar",
370 "javalib/foo.jar",
371 })
372 })
373
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000374 t.Run("boot image disable generate profile", func(t *testing.T) {
375 result := android.GroupFixturePreparers(
376 commonPreparer,
377
378 // Configure some libraries in the art bootclasspath_fragment that match the source
379 // bootclasspath_fragment's contents property.
380 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
381 addSource("foo", "bar"),
382 dexpreopt.FixtureDisableGenerateProfile(true),
383 ).RunTest(t)
384
Jooyung Hana0503a52023-08-23 13:12:50 +0900385 files := getFiles(t, result.TestContext, "com.android.art", "android_common_com.android.art")
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000386 for _, file := range files {
387 matched, _ := path.Match("etc/boot-image.prof", file.path)
388 android.AssertBoolEquals(t, "\"etc/boot-image.prof\" should not be in the APEX", matched, false)
389 }
390 })
391
Paul Duffince918b02021-06-07 14:33:47 +0100392 t.Run("boot image files with preferred prebuilt", func(t *testing.T) {
Paul Duffinba6afd02019-11-19 19:44:10 +0000393 result := android.GroupFixturePreparers(
394 commonPreparer,
395
396 // Configure some libraries in the art bootclasspath_fragment that match the source
397 // bootclasspath_fragment's contents property.
398 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100399 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Paul Duffinba6afd02019-11-19 19:44:10 +0000400 addSource("foo", "bar"),
401
402 // Make sure that a preferred prebuilt with consistent contents doesn't affect the apex.
403 addPrebuilt(true, "foo", "bar"),
Jiakai Zhang6decef92022-01-12 17:56:19 +0000404
405 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Paul Duffinba6afd02019-11-19 19:44:10 +0000406 ).RunTest(t)
407
Spandan Das3576e762024-01-03 18:57:03 +0000408 ensureExactDeapexedContents(t, result.TestContext, "prebuilt_com.android.art", "android_common", []string{
Jiakai Zhang49b1eb62021-11-26 18:09:27 +0000409 "etc/boot-image.prof",
Paul Duffinba6afd02019-11-19 19:44:10 +0000410 "javalib/bar.jar",
411 "javalib/foo.jar",
412 })
413
Jooyung Hana0503a52023-08-23 13:12:50 +0900414 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100415 `art-bootclasspath-fragment`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000416 `com.android.art.key`,
Spandan Dase21a8d42024-01-23 23:56:29 +0000417 `dex2oatd`,
Paul Duffince918b02021-06-07 14:33:47 +0100418 `prebuilt_com.android.art`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000419 })
Paul Duffince918b02021-06-07 14:33:47 +0100420
421 // Make sure that the prebuilt bootclasspath_fragment copies its dex files to the predefined
422 // locations for the art image.
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100423 module := result.ModuleForTests("dex_bootjars", "android_common")
Paul Duffince918b02021-06-07 14:33:47 +0100424 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffina1d60252021-01-21 18:13:43 +0000425 })
Paul Duffin396229f2021-03-18 18:30:31 +0000426
Paul Duffinba6afd02019-11-19 19:44:10 +0000427 t.Run("source with inconsistency between config and contents", func(t *testing.T) {
428 android.GroupFixturePreparers(
429 commonPreparer,
430
431 // Create an inconsistency between the ArtApexJars configuration and the art source
432 // bootclasspath_fragment module's contents property.
433 java.FixtureConfigureBootJars("com.android.art:foo"),
434 addSource("foo", "bar"),
435 ).
436 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
437 RunTest(t)
438 })
439
440 t.Run("prebuilt with inconsistency between config and contents", func(t *testing.T) {
441 android.GroupFixturePreparers(
442 commonPreparer,
443
444 // Create an inconsistency between the ArtApexJars configuration and the art
445 // prebuilt_bootclasspath_fragment module's contents property.
446 java.FixtureConfigureBootJars("com.android.art:foo"),
447 addPrebuilt(false, "foo", "bar"),
448 ).
449 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
450 RunTest(t)
451 })
452
453 t.Run("preferred prebuilt with inconsistency between config and contents", func(t *testing.T) {
454 android.GroupFixturePreparers(
455 commonPreparer,
456
457 // Create an inconsistency between the ArtApexJars configuration and the art
458 // prebuilt_bootclasspath_fragment module's contents property.
459 java.FixtureConfigureBootJars("com.android.art:foo"),
460 addPrebuilt(true, "foo", "bar"),
461
462 // Source contents property is consistent with the config.
463 addSource("foo"),
464 ).
465 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
466 RunTest(t)
467 })
468
469 t.Run("source preferred and prebuilt with inconsistency between config and contents", func(t *testing.T) {
470 android.GroupFixturePreparers(
471 commonPreparer,
472
473 // Create an inconsistency between the ArtApexJars configuration and the art
474 // prebuilt_bootclasspath_fragment module's contents property.
475 java.FixtureConfigureBootJars("com.android.art:foo"),
476 addPrebuilt(false, "foo", "bar"),
477
478 // Source contents property is consistent with the config.
479 addSource("foo"),
480
481 // This should pass because while the prebuilt is inconsistent with the configuration it is
482 // not actually used.
483 ).RunTest(t)
Paul Duffin396229f2021-03-18 18:30:31 +0000484 })
Paul Duffina1d60252021-01-21 18:13:43 +0000485}
486
Paul Duffin94f19632021-04-20 12:40:07 +0100487func TestBootclasspathFragmentInPrebuiltArtApex(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100488 preparers := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100489 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000490 prepareForTestWithArtApex,
491
492 android.FixtureMergeMockFs(android.MockFS{
493 "com.android.art-arm64.apex": nil,
494 "com.android.art-arm.apex": nil,
495 }),
496
Paul Duffin7771eba2021-04-23 14:25:28 +0100497 // Configure some libraries in the art bootclasspath_fragment.
Paul Duffin60264a02021-04-12 20:02:36 +0100498 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100499 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhange6e90db2022-01-28 14:58:56 +0000500 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100501 )
502
503 bp := `
Paul Duffin9ea71c02021-03-23 22:53:07 +0000504 prebuilt_apex {
505 name: "com.android.art",
506 arch: {
507 arm64: {
508 src: "com.android.art-arm64.apex",
509 },
510 arm: {
511 src: "com.android.art-arm.apex",
512 },
513 },
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100514 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000515 }
516
517 java_import {
518 name: "foo",
519 jars: ["foo.jar"],
520 apex_available: [
521 "com.android.art",
522 ],
523 }
524
525 java_import {
526 name: "bar",
527 jars: ["bar.jar"],
528 apex_available: [
529 "com.android.art",
530 ],
531 }
532
Paul Duffin7771eba2021-04-23 14:25:28 +0100533 prebuilt_bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100534 name: "art-bootclasspath-fragment",
Paul Duffin9ea71c02021-03-23 22:53:07 +0000535 image_name: "art",
Paul Duffinf23bc472021-04-27 12:42:20 +0100536 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
537 contents: ["foo", "bar"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000538 apex_available: [
539 "com.android.art",
540 ],
Paul Duffin54e41972021-07-19 13:23:40 +0100541 hidden_api: {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100542 annotation_flags: "hiddenapi/annotation-flags.csv",
543 metadata: "hiddenapi/metadata.csv",
544 index: "hiddenapi/index.csv",
545 stub_flags: "hiddenapi/stub-flags.csv",
546 all_flags: "hiddenapi/all-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +0100547 },
Paul Duffin9ea71c02021-03-23 22:53:07 +0000548 }
Paul Duffin9ea71c02021-03-23 22:53:07 +0000549
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100550 // A prebuilt apex with the same apex_name that shouldn't interfere when it isn't enabled.
551 prebuilt_apex {
552 name: "com.mycompany.android.art",
553 apex_name: "com.android.art",
554 %s
555 src: "com.mycompany.android.art.apex",
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100556 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100557 }
558 `
559
560 t.Run("disabled alternative APEX", func(t *testing.T) {
561 result := preparers.RunTestWithBp(t, fmt.Sprintf(bp, "enabled: false,"))
562
563 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000564 `all_apex_contributions`,
Spandan Das2069c3f2023-12-06 19:40:24 +0000565 `dex2oatd`,
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100566 `prebuilt_art-bootclasspath-fragment`,
Spandan Das3576e762024-01-03 18:57:03 +0000567 `prebuilt_com.android.art.apex.selector`,
568 `prebuilt_com.android.art.deapexer`,
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100569 })
570
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100571 java.CheckModuleDependencies(t, result.TestContext, "art-bootclasspath-fragment", "android_common_com.android.art", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000572 `all_apex_contributions`,
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100573 `dex2oatd`,
574 `prebuilt_bar`,
Spandan Das3576e762024-01-03 18:57:03 +0000575 `prebuilt_com.android.art.deapexer`,
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100576 `prebuilt_foo`,
577 })
578
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100579 module := result.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100580 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffin9ea71c02021-03-23 22:53:07 +0000581 })
582
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100583 t.Run("enabled alternative APEX", func(t *testing.T) {
584 preparers.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +0000585 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art")).
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100586 RunTestWithBp(t, fmt.Sprintf(bp, ""))
Paul Duffin9ea71c02021-03-23 22:53:07 +0000587 })
Paul Duffince918b02021-06-07 14:33:47 +0100588}
589
590// checkCopiesToPredefinedLocationForArt checks that the supplied modules are copied to the
591// predefined locations of boot dex jars used as inputs for the ART boot image.
592func checkCopiesToPredefinedLocationForArt(t *testing.T, config android.Config, module android.TestingModule, modules ...string) {
593 t.Helper()
594 bootJarLocations := []string{}
595 for _, output := range module.AllOutputs() {
596 output = android.StringRelativeToTop(config, output)
Jeongik Cha4753b392023-04-19 23:25:41 +0900597 if strings.HasPrefix(output, "out/soong/dexpreopt_arm64/dex_artjars_input/") {
Paul Duffince918b02021-06-07 14:33:47 +0100598 bootJarLocations = append(bootJarLocations, output)
599 }
600 }
601
602 sort.Strings(bootJarLocations)
603 expected := []string{}
604 for _, m := range modules {
Jeongik Cha4753b392023-04-19 23:25:41 +0900605 expected = append(expected, fmt.Sprintf("out/soong/dexpreopt_arm64/dex_artjars_input/%s.jar", m))
Paul Duffince918b02021-06-07 14:33:47 +0100606 }
607 sort.Strings(expected)
608
609 android.AssertArrayString(t, "copies to predefined locations for art", expected, bootJarLocations)
Paul Duffin9ea71c02021-03-23 22:53:07 +0000610}
611
Paul Duffin94f19632021-04-20 12:40:07 +0100612func TestBootclasspathFragmentContentsNoName(t *testing.T) {
Paul Duffin82886d62021-03-24 01:34:57 +0000613 result := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100614 prepareForTestWithBootclasspathFragment,
Paul Duffin82886d62021-03-24 01:34:57 +0000615 prepareForTestWithMyapex,
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100616 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100617 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100618 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
619 // is disabled.
620 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
621
622 java.PrepareForTestWithJavaSdkLibraryFiles,
623 java.FixtureWithLastReleaseApis("foo"),
Paul Duffin82886d62021-03-24 01:34:57 +0000624 ).RunTestWithBp(t, `
625 apex {
626 name: "myapex",
627 key: "myapex.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100628 bootclasspath_fragments: [
629 "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000630 ],
631 updatable: false,
632 }
633
634 apex_key {
635 name: "myapex.key",
636 public_key: "testkey.avbpubkey",
637 private_key: "testkey.pem",
638 }
639
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100640 java_sdk_library {
Paul Duffin82886d62021-03-24 01:34:57 +0000641 name: "foo",
642 srcs: ["b.java"],
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100643 shared_library: false,
644 public: {enabled: true},
Paul Duffin82886d62021-03-24 01:34:57 +0000645 apex_available: [
646 "myapex",
647 ],
648 }
649
650 java_library {
651 name: "bar",
652 srcs: ["b.java"],
653 installable: true,
654 apex_available: [
655 "myapex",
656 ],
657 }
658
Paul Duffin7771eba2021-04-23 14:25:28 +0100659 bootclasspath_fragment {
Paul Duffin94f19632021-04-20 12:40:07 +0100660 name: "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000661 contents: [
662 "foo",
663 "bar",
664 ],
665 apex_available: [
666 "myapex",
667 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100668 hidden_api: {
669 split_packages: ["*"],
670 },
Paul Duffin82886d62021-03-24 01:34:57 +0000671 }
672 `)
673
Jooyung Hana0503a52023-08-23 13:12:50 +0900674 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Paul Duffin4d101b62021-03-24 15:42:20 +0000675 // This does not include art, oat or vdex files as they are only included for the art boot
676 // image.
satayev227e7452021-05-20 21:35:06 +0100677 "etc/classpaths/bootclasspath.pb",
Paul Duffin4d101b62021-03-24 15:42:20 +0000678 "javalib/bar.jar",
679 "javalib/foo.jar",
680 })
Paul Duffin82886d62021-03-24 01:34:57 +0000681
Jooyung Hana0503a52023-08-23 13:12:50 +0900682 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex", []string{
Spandan Dase21a8d42024-01-23 23:56:29 +0000683 `dex2oatd`,
Paul Duffin82886d62021-03-24 01:34:57 +0000684 `myapex.key`,
Paul Duffin94f19632021-04-20 12:40:07 +0100685 `mybootclasspathfragment`,
Paul Duffin82886d62021-03-24 01:34:57 +0000686 })
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100687
Jooyung Hana0503a52023-08-23 13:12:50 +0900688 apex := result.ModuleForTests("myapex", "android_common_myapex")
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100689 apexRule := apex.Rule("apexRule")
690 copyCommands := apexRule.Args["copy_commands"]
691
692 // Make sure that the fragment provides the hidden API encoded dex jars to the APEX.
693 fragment := result.Module("mybootclasspathfragment", "android_common_apex10000")
694
Colin Cross5a377182023-12-14 14:46:23 -0800695 info, _ := android.SingletonModuleProvider(result, fragment, java.BootclasspathFragmentApexContentInfoProvider)
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100696
697 checkFragmentExportedDexJar := func(name string, expectedDexJar string) {
698 module := result.Module(name, "android_common_apex10000")
Paul Duffin1a8010a2021-05-15 12:39:23 +0100699 dexJar, err := info.DexBootJarPathForContentModule(module)
700 if err != nil {
701 t.Error(err)
702 }
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100703 android.AssertPathRelativeToTopEquals(t, name+" dex", expectedDexJar, dexJar)
704
Jooyung Hana0503a52023-08-23 13:12:50 +0900705 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 +0100706 android.AssertStringDoesContain(t, name+" apex copy command", copyCommands, expectedCopyCommand)
707 }
708
Paul Duffin54c98f52021-05-15 08:54:30 +0100709 checkFragmentExportedDexJar("foo", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/foo.jar")
710 checkFragmentExportedDexJar("bar", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/bar.jar")
Paul Duffin82886d62021-03-24 01:34:57 +0000711}
712
Paul Duffin48b67412021-06-23 16:13:50 +0100713func getDexJarPath(result *android.TestResult, name string) string {
714 module := result.Module(name, "android_common")
Spandan Das59a4a2b2024-01-09 21:35:56 +0000715 return module.(java.UsesLibraryDependency).DexJarBuildPath(moduleErrorfTestCtx{}).Path().RelativeToTop().String()
Paul Duffin48b67412021-06-23 16:13:50 +0100716}
717
718// TestBootclasspathFragment_HiddenAPIList checks to make sure that the correct parameters are
719// passed to the hiddenapi list tool.
720func TestBootclasspathFragment_HiddenAPIList(t *testing.T) {
721 result := android.GroupFixturePreparers(
722 prepareForTestWithBootclasspathFragment,
723 prepareForTestWithArtApex,
724 prepareForTestWithMyapex,
725 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
726 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
satayevd604b212021-07-21 14:23:52 +0100727 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin48b67412021-06-23 16:13:50 +0100728 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
729 // is disabled.
730 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
731
732 java.PrepareForTestWithJavaSdkLibraryFiles,
733 java.FixtureWithLastReleaseApis("foo", "quuz"),
Jihoon Kangbd093452023-12-26 19:08:01 +0000734 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
735 variables.BuildFlags = map[string]string{
736 "RELEASE_HIDDEN_API_EXPORTABLE_STUBS": "true",
737 }
738 }),
Paul Duffin48b67412021-06-23 16:13:50 +0100739 ).RunTestWithBp(t, `
740 apex {
741 name: "com.android.art",
742 key: "com.android.art.key",
743 bootclasspath_fragments: ["art-bootclasspath-fragment"],
744 updatable: false,
745 }
746
747 apex_key {
748 name: "com.android.art.key",
749 public_key: "com.android.art.avbpubkey",
750 private_key: "com.android.art.pem",
751 }
752
753 java_library {
754 name: "baz",
755 apex_available: [
756 "com.android.art",
757 ],
758 srcs: ["b.java"],
759 compile_dex: true,
760 }
761
762 java_sdk_library {
763 name: "quuz",
764 apex_available: [
765 "com.android.art",
766 ],
767 srcs: ["b.java"],
768 compile_dex: true,
769 public: {enabled: true},
770 system: {enabled: true},
771 test: {enabled: true},
772 module_lib: {enabled: true},
773 }
774
775 bootclasspath_fragment {
776 name: "art-bootclasspath-fragment",
777 image_name: "art",
778 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
779 contents: ["baz", "quuz"],
780 apex_available: [
781 "com.android.art",
782 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100783 hidden_api: {
784 split_packages: ["*"],
785 },
Paul Duffin48b67412021-06-23 16:13:50 +0100786 }
787
788 apex {
789 name: "myapex",
790 key: "myapex.key",
791 bootclasspath_fragments: [
792 "mybootclasspathfragment",
793 ],
794 updatable: false,
795 }
796
797 apex_key {
798 name: "myapex.key",
799 public_key: "testkey.avbpubkey",
800 private_key: "testkey.pem",
801 }
802
803 java_sdk_library {
804 name: "foo",
805 srcs: ["b.java"],
806 shared_library: false,
807 public: {enabled: true},
808 apex_available: [
809 "myapex",
810 ],
811 }
812
813 java_library {
814 name: "bar",
815 srcs: ["b.java"],
816 installable: true,
817 apex_available: [
818 "myapex",
819 ],
820 }
821
822 bootclasspath_fragment {
823 name: "mybootclasspathfragment",
824 contents: [
825 "foo",
826 "bar",
827 ],
828 apex_available: [
829 "myapex",
830 ],
831 fragments: [
832 {
833 apex: "com.android.art",
834 module: "art-bootclasspath-fragment",
835 },
836 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100837 hidden_api: {
838 split_packages: ["*"],
839 },
Paul Duffin48b67412021-06-23 16:13:50 +0100840 }
841 `)
842
843 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
844 "art-bootclasspath-fragment",
845 "bar",
846 "dex2oatd",
847 "foo",
848 })
849
Jihoon Kangbd093452023-12-26 19:08:01 +0000850 fooStubs := getDexJarPath(result, "foo.stubs.exportable")
851 quuzPublicStubs := getDexJarPath(result, "quuz.stubs.exportable")
852 quuzSystemStubs := getDexJarPath(result, "quuz.stubs.exportable.system")
853 quuzTestStubs := getDexJarPath(result, "quuz.stubs.exportable.test")
854 quuzModuleLibStubs := getDexJarPath(result, "quuz.stubs.exportable.module_lib")
Paul Duffin48b67412021-06-23 16:13:50 +0100855
856 // Make sure that the fragment uses the quuz stub dex jars when generating the hidden API flags.
857 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
858
859 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
860 command := rule.RuleParams.Command
861 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
862
863 // Make sure that the quuz stubs are available for resolving references from the implementation
864 // boot dex jars provided by this module.
Paul Duffinb51db2e2021-06-21 14:08:08 +0100865 android.AssertStringDoesContain(t, "quuz widest", command, "--dependency-stub-dex="+quuzModuleLibStubs)
Paul Duffin48b67412021-06-23 16:13:50 +0100866
867 // Make sure that the quuz stubs are available for resolving references from the different API
868 // stubs provided by this module.
869 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+quuzPublicStubs+":"+fooStubs)
870 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+quuzSystemStubs+":"+fooStubs)
871 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+quuzTestStubs+":"+fooStubs)
872}
873
Paul Duffin5cca7c42021-05-26 10:16:01 +0100874// TestBootclasspathFragment_AndroidNonUpdatable checks to make sure that setting
875// additional_stubs: ["android-non-updatable"] causes the source android-non-updatable modules to be
876// added to the hiddenapi list tool.
Jihoon Kangcc9e2182023-10-16 23:13:33 +0000877func TestBootclasspathFragment_AndroidNonUpdatable_FromSource(t *testing.T) {
Paul Duffin5cca7c42021-05-26 10:16:01 +0100878 result := android.GroupFixturePreparers(
879 prepareForTestWithBootclasspathFragment,
880 prepareForTestWithArtApex,
881 prepareForTestWithMyapex,
882 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100883 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
884 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +0100885 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
886 // is disabled.
887 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Jihoon Kangcc9e2182023-10-16 23:13:33 +0000888 android.FixtureModifyConfig(func(config android.Config) {
889 config.SetBuildFromTextStub(false)
890 }),
Paul Duffin5cca7c42021-05-26 10:16:01 +0100891
892 java.PrepareForTestWithJavaSdkLibraryFiles,
893 java.FixtureWithLastReleaseApis("foo", "android-non-updatable"),
894 ).RunTestWithBp(t, `
895 java_sdk_library {
896 name: "android-non-updatable",
897 srcs: ["b.java"],
898 compile_dex: true,
899 public: {
900 enabled: true,
901 },
902 system: {
903 enabled: true,
904 },
905 test: {
906 enabled: true,
907 },
908 module_lib: {
909 enabled: true,
910 },
911 }
912
913 apex {
914 name: "com.android.art",
915 key: "com.android.art.key",
916 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +0100917 updatable: false,
918 }
919
920 apex_key {
921 name: "com.android.art.key",
922 public_key: "com.android.art.avbpubkey",
923 private_key: "com.android.art.pem",
924 }
925
926 java_library {
927 name: "baz",
928 apex_available: [
929 "com.android.art",
930 ],
931 srcs: ["b.java"],
932 compile_dex: true,
933 }
934
935 java_library {
936 name: "quuz",
937 apex_available: [
938 "com.android.art",
939 ],
940 srcs: ["b.java"],
941 compile_dex: true,
942 }
943
944 bootclasspath_fragment {
945 name: "art-bootclasspath-fragment",
946 image_name: "art",
947 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
948 contents: ["baz", "quuz"],
949 apex_available: [
950 "com.android.art",
951 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100952 hidden_api: {
953 split_packages: ["*"],
954 },
Paul Duffin5cca7c42021-05-26 10:16:01 +0100955 }
956
957 apex {
958 name: "myapex",
959 key: "myapex.key",
960 bootclasspath_fragments: [
961 "mybootclasspathfragment",
962 ],
963 updatable: false,
964 }
965
966 apex_key {
967 name: "myapex.key",
968 public_key: "testkey.avbpubkey",
969 private_key: "testkey.pem",
970 }
971
972 java_sdk_library {
973 name: "foo",
974 srcs: ["b.java"],
975 shared_library: false,
976 public: {enabled: true},
977 apex_available: [
978 "myapex",
979 ],
980 }
981
982 java_library {
983 name: "bar",
984 srcs: ["b.java"],
985 installable: true,
986 apex_available: [
987 "myapex",
988 ],
989 }
990
991 bootclasspath_fragment {
992 name: "mybootclasspathfragment",
993 contents: [
994 "foo",
995 "bar",
996 ],
997 apex_available: [
998 "myapex",
999 ],
1000 additional_stubs: ["android-non-updatable"],
1001 fragments: [
1002 {
1003 apex: "com.android.art",
1004 module: "art-bootclasspath-fragment",
1005 },
1006 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001007 hidden_api: {
1008 split_packages: ["*"],
1009 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001010 }
1011 `)
1012
1013 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
1014 "android-non-updatable.stubs",
1015 "android-non-updatable.stubs.module_lib",
1016 "android-non-updatable.stubs.system",
1017 "android-non-updatable.stubs.test",
1018 "art-bootclasspath-fragment",
1019 "bar",
1020 "dex2oatd",
1021 "foo",
1022 })
1023
1024 nonUpdatablePublicStubs := getDexJarPath(result, "android-non-updatable.stubs")
1025 nonUpdatableSystemStubs := getDexJarPath(result, "android-non-updatable.stubs.system")
1026 nonUpdatableTestStubs := getDexJarPath(result, "android-non-updatable.stubs.test")
1027 nonUpdatableModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.module_lib")
1028
1029 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1030 // API flags.
1031 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1032
1033 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1034 command := rule.RuleParams.Command
1035 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1036
1037 // Make sure that the module_lib non-updatable stubs are available for resolving references from
1038 // the implementation boot dex jars provided by this module.
1039 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
1040
1041 // Make sure that the appropriate non-updatable stubs are available for resolving references from
1042 // the different API stubs provided by this module.
1043 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
1044 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
1045 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
1046}
1047
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001048func TestBootclasspathFragment_AndroidNonUpdatable_FromText(t *testing.T) {
1049 result := android.GroupFixturePreparers(
1050 prepareForTestWithBootclasspathFragment,
1051 prepareForTestWithArtApex,
1052 prepareForTestWithMyapex,
1053 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
1054 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
1055 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
1056 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1057 // is disabled.
1058 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1059 android.FixtureModifyConfig(func(config android.Config) {
1060 config.SetBuildFromTextStub(true)
1061 }),
1062
1063 java.PrepareForTestWithJavaSdkLibraryFiles,
1064 java.FixtureWithLastReleaseApis("foo", "android-non-updatable"),
1065 ).RunTestWithBp(t, `
1066 java_sdk_library {
1067 name: "android-non-updatable",
1068 srcs: ["b.java"],
1069 compile_dex: true,
1070 public: {
1071 enabled: true,
1072 },
1073 system: {
1074 enabled: true,
1075 },
1076 test: {
1077 enabled: true,
1078 },
1079 module_lib: {
1080 enabled: true,
1081 },
1082 }
1083
1084 apex {
1085 name: "com.android.art",
1086 key: "com.android.art.key",
1087 bootclasspath_fragments: ["art-bootclasspath-fragment"],
1088 updatable: false,
1089 }
1090
1091 apex_key {
1092 name: "com.android.art.key",
1093 public_key: "com.android.art.avbpubkey",
1094 private_key: "com.android.art.pem",
1095 }
1096
1097 java_library {
1098 name: "baz",
1099 apex_available: [
1100 "com.android.art",
1101 ],
1102 srcs: ["b.java"],
1103 compile_dex: true,
1104 }
1105
1106 java_library {
1107 name: "quuz",
1108 apex_available: [
1109 "com.android.art",
1110 ],
1111 srcs: ["b.java"],
1112 compile_dex: true,
1113 }
1114
1115 bootclasspath_fragment {
1116 name: "art-bootclasspath-fragment",
1117 image_name: "art",
1118 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
1119 contents: ["baz", "quuz"],
1120 apex_available: [
1121 "com.android.art",
1122 ],
1123 hidden_api: {
1124 split_packages: ["*"],
1125 },
1126 }
1127
1128 apex {
1129 name: "myapex",
1130 key: "myapex.key",
1131 bootclasspath_fragments: [
1132 "mybootclasspathfragment",
1133 ],
1134 updatable: false,
1135 }
1136
1137 apex_key {
1138 name: "myapex.key",
1139 public_key: "testkey.avbpubkey",
1140 private_key: "testkey.pem",
1141 }
1142
1143 java_sdk_library {
1144 name: "foo",
1145 srcs: ["b.java"],
1146 shared_library: false,
1147 public: {enabled: true},
1148 apex_available: [
1149 "myapex",
1150 ],
1151 }
1152
1153 java_library {
1154 name: "bar",
1155 srcs: ["b.java"],
1156 installable: true,
1157 apex_available: [
1158 "myapex",
1159 ],
1160 }
1161
1162 bootclasspath_fragment {
1163 name: "mybootclasspathfragment",
1164 contents: [
1165 "foo",
1166 "bar",
1167 ],
1168 apex_available: [
1169 "myapex",
1170 ],
1171 additional_stubs: ["android-non-updatable"],
1172 fragments: [
1173 {
1174 apex: "com.android.art",
1175 module: "art-bootclasspath-fragment",
1176 },
1177 ],
1178 hidden_api: {
1179 split_packages: ["*"],
1180 },
1181 }
1182 `)
1183
1184 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
1185 "android-non-updatable.stubs",
1186 "android-non-updatable.stubs.system",
1187 "android-non-updatable.stubs.test",
1188 "android-non-updatable.stubs.test_module_lib",
1189 "art-bootclasspath-fragment",
1190 "bar",
1191 "dex2oatd",
1192 "foo",
1193 })
1194
1195 nonUpdatableTestModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.test_module_lib")
1196
1197 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1198 // API flags.
1199 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1200
1201 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1202 command := rule.RuleParams.Command
1203 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1204
1205 // Make sure that the test_module_lib non-updatable stubs are available for resolving references from
1206 // the implementation boot dex jars provided by this module.
1207 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableTestModuleLibStubs)
1208}
1209
Paul Duffin5cca7c42021-05-26 10:16:01 +01001210// TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks checks to make sure that
1211// setting additional_stubs: ["android-non-updatable"] causes the prebuilt android-non-updatable
1212// modules to be added to the hiddenapi list tool.
1213func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *testing.T) {
1214 result := android.GroupFixturePreparers(
1215 prepareForTestWithBootclasspathFragment,
Jiakai Zhangb95998b2023-05-11 16:39:27 +01001216 java.PrepareForTestWithDexpreopt,
Paul Duffin5cca7c42021-05-26 10:16:01 +01001217 prepareForTestWithArtApex,
1218 prepareForTestWithMyapex,
1219 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +01001220 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
1221 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +01001222 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1223 // is disabled.
1224 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1225
1226 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1227 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
1228 }),
1229
1230 java.PrepareForTestWithJavaSdkLibraryFiles,
1231 java.FixtureWithPrebuiltApis(map[string][]string{
1232 "current": {"android-non-updatable"},
1233 "30": {"foo"},
1234 }),
1235 ).RunTestWithBp(t, `
1236 apex {
1237 name: "com.android.art",
1238 key: "com.android.art.key",
1239 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +01001240 updatable: false,
1241 }
1242
1243 apex_key {
1244 name: "com.android.art.key",
1245 public_key: "com.android.art.avbpubkey",
1246 private_key: "com.android.art.pem",
1247 }
1248
1249 java_library {
1250 name: "baz",
1251 apex_available: [
1252 "com.android.art",
1253 ],
1254 srcs: ["b.java"],
1255 compile_dex: true,
1256 }
1257
1258 java_library {
1259 name: "quuz",
1260 apex_available: [
1261 "com.android.art",
1262 ],
1263 srcs: ["b.java"],
1264 compile_dex: true,
1265 }
1266
1267 bootclasspath_fragment {
1268 name: "art-bootclasspath-fragment",
1269 image_name: "art",
1270 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
1271 contents: ["baz", "quuz"],
1272 apex_available: [
1273 "com.android.art",
1274 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001275 hidden_api: {
1276 split_packages: ["*"],
1277 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001278 }
1279
1280 apex {
1281 name: "myapex",
1282 key: "myapex.key",
1283 bootclasspath_fragments: [
1284 "mybootclasspathfragment",
1285 ],
1286 updatable: false,
1287 }
1288
1289 apex_key {
1290 name: "myapex.key",
1291 public_key: "testkey.avbpubkey",
1292 private_key: "testkey.pem",
1293 }
1294
1295 java_sdk_library {
1296 name: "foo",
1297 srcs: ["b.java"],
1298 shared_library: false,
1299 public: {enabled: true},
1300 apex_available: [
1301 "myapex",
1302 ],
1303 }
1304
1305 java_library {
1306 name: "bar",
1307 srcs: ["b.java"],
1308 installable: true,
1309 apex_available: [
1310 "myapex",
1311 ],
1312 }
1313
1314 bootclasspath_fragment {
1315 name: "mybootclasspathfragment",
1316 contents: [
1317 "foo",
1318 "bar",
1319 ],
1320 apex_available: [
1321 "myapex",
1322 ],
1323 additional_stubs: ["android-non-updatable"],
1324 fragments: [
1325 {
1326 apex: "com.android.art",
1327 module: "art-bootclasspath-fragment",
1328 },
1329 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001330 hidden_api: {
1331 split_packages: ["*"],
1332 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001333 }
1334 `)
1335
1336 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
1337 "art-bootclasspath-fragment",
1338 "bar",
1339 "dex2oatd",
1340 "foo",
1341 "prebuilt_sdk_module-lib_current_android-non-updatable",
1342 "prebuilt_sdk_public_current_android-non-updatable",
1343 "prebuilt_sdk_system_current_android-non-updatable",
1344 "prebuilt_sdk_test_current_android-non-updatable",
1345 })
1346
1347 nonUpdatablePublicStubs := getDexJarPath(result, "sdk_public_current_android-non-updatable")
1348 nonUpdatableSystemStubs := getDexJarPath(result, "sdk_system_current_android-non-updatable")
1349 nonUpdatableTestStubs := getDexJarPath(result, "sdk_test_current_android-non-updatable")
1350 nonUpdatableModuleLibStubs := getDexJarPath(result, "sdk_module-lib_current_android-non-updatable")
1351
1352 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1353 // API flags.
1354 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1355
1356 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1357 command := rule.RuleParams.Command
1358 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1359
1360 // Make sure that the module_lib non-updatable stubs are available for resolving references from
1361 // the implementation boot dex jars provided by this module.
1362 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
1363
1364 // Make sure that the appropriate non-updatable stubs are available for resolving references from
1365 // the different API stubs provided by this module.
1366 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
1367 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
1368 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
1369}
1370
Spandan Dasfcea0a82024-06-12 18:22:46 +00001371func TestBootclasspathFragmentProtoContainsMinSdkVersion(t *testing.T) {
1372 result := android.GroupFixturePreparers(
1373 prepareForTestWithBootclasspathFragment,
1374 prepareForTestWithMyapex,
1375 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
1376 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
1377 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1378 // is disabled.
1379 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1380
1381 java.PrepareForTestWithJavaSdkLibraryFiles,
1382 java.FixtureWithLastReleaseApis("foo", "bar"),
1383 ).RunTestWithBp(t, `
1384 apex {
1385 name: "myapex",
1386 key: "myapex.key",
1387 bootclasspath_fragments: [
1388 "mybootclasspathfragment",
1389 ],
1390 updatable: false,
1391 }
1392
1393 apex_key {
1394 name: "myapex.key",
1395 public_key: "testkey.avbpubkey",
1396 private_key: "testkey.pem",
1397 }
1398
1399 java_sdk_library {
1400 name: "foo",
1401 srcs: ["b.java"],
1402 shared_library: false,
1403 public: {enabled: true},
1404 apex_available: [
1405 "myapex",
1406 ],
1407 min_sdk_version: "33",
1408 }
1409
1410 java_sdk_library {
1411 name: "bar",
1412 srcs: ["b.java"],
1413 shared_library: false,
1414 public: {enabled: true},
1415 apex_available: [
1416 "myapex",
1417 ],
1418 min_sdk_version: "34",
1419 }
1420
1421 bootclasspath_fragment {
1422 name: "mybootclasspathfragment",
1423 contents: [
1424 "foo",
1425 "bar",
1426 ],
1427 apex_available: [
1428 "myapex",
1429 ],
1430 hidden_api: {
1431 split_packages: ["*"],
1432 },
1433 }
1434 `)
1435
1436 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1437 classPathProtoContent := android.ContentFromFileRuleForTests(t, result.TestContext, fragment.Output("bootclasspath.pb.textproto"))
1438 // foo
1439 ensureContains(t, classPathProtoContent, `jars {
1440path: "/apex/myapex/javalib/foo.jar"
1441classpath: BOOTCLASSPATH
1442min_sdk_version: "33"
1443max_sdk_version: ""
1444}
1445`)
1446 // bar
1447 ensureContains(t, classPathProtoContent, `jars {
1448path: "/apex/myapex/javalib/bar.jar"
1449classpath: BOOTCLASSPATH
1450min_sdk_version: "34"
1451max_sdk_version: ""
1452}
1453`)
1454}
1455
Paul Duffina1d60252021-01-21 18:13:43 +00001456// TODO(b/177892522) - add test for host apex.