blob: 7be8477df7d54ad75427559663f077e52ede3ba7 [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,
56
57 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")
155 artInfo := result.ModuleProvider(artFragment, java.HiddenAPIInfoProvider).(java.HiddenAPIInfo)
156
157 bazPublicStubs := "out/soong/.intermediates/baz.stubs/android_common/dex/baz.stubs.jar"
158 bazSystemStubs := "out/soong/.intermediates/baz.stubs.system/android_common/dex/baz.stubs.system.jar"
159 bazTestStubs := "out/soong/.intermediates/baz.stubs.test/android_common/dex/baz.stubs.test.jar"
160
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")
168 otherInfo := result.ModuleProvider(otherFragment, java.HiddenAPIInfoProvider).(java.HiddenAPIInfo)
169
170 fooPublicStubs := "out/soong/.intermediates/foo.stubs/android_common/dex/foo.stubs.jar"
171 fooSystemStubs := "out/soong/.intermediates/foo.stubs.system/android_common/dex/foo.stubs.system.jar"
172
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
196 apex_key {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000197 name: "com.android.art.key",
Paul Duffina1d60252021-01-21 18:13:43 +0000198 public_key: "testkey.avbpubkey",
199 private_key: "testkey.pem",
200 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000201 `),
202 )
Paul Duffin65898052021-04-20 22:47:03 +0100203
Paul Duffinba6afd02019-11-19 19:44:10 +0000204 contentsInsert := func(contents []string) string {
205 insert := ""
206 if contents != nil {
207 insert = fmt.Sprintf(`contents: ["%s"],`, strings.Join(contents, `", "`))
Paul Duffin396229f2021-03-18 18:30:31 +0000208 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000209 return insert
210 }
Paul Duffina1d60252021-01-21 18:13:43 +0000211
Paul Duffinba6afd02019-11-19 19:44:10 +0000212 addSource := func(contents ...string) android.FixturePreparer {
213 text := fmt.Sprintf(`
214 bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100215 name: "art-bootclasspath-fragment",
Paul Duffinba6afd02019-11-19 19:44:10 +0000216 image_name: "art",
217 %s
218 apex_available: [
219 "com.android.art",
220 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100221 hidden_api: {
222 split_packages: ["*"],
223 },
Paul Duffinba6afd02019-11-19 19:44:10 +0000224 }
225 `, contentsInsert(contents))
226
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100227 for _, content := range contents {
228 text += fmt.Sprintf(`
229 java_library {
230 name: "%[1]s",
231 srcs: ["%[1]s.java"],
232 installable: true,
233 apex_available: [
234 "com.android.art",
235 ],
236 }
237 `, content)
238 }
239
Paul Duffinba6afd02019-11-19 19:44:10 +0000240 return android.FixtureAddTextFile("art/build/boot/Android.bp", text)
241 }
242
243 addPrebuilt := func(prefer bool, contents ...string) android.FixturePreparer {
244 text := fmt.Sprintf(`
Paul Duffince918b02021-06-07 14:33:47 +0100245 prebuilt_apex {
246 name: "com.android.art",
247 arch: {
248 arm64: {
249 src: "com.android.art-arm64.apex",
250 },
251 arm: {
252 src: "com.android.art-arm.apex",
253 },
254 },
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100255 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffince918b02021-06-07 14:33:47 +0100256 }
257
Paul Duffinba6afd02019-11-19 19:44:10 +0000258 prebuilt_bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100259 name: "art-bootclasspath-fragment",
Paul Duffinba6afd02019-11-19 19:44:10 +0000260 image_name: "art",
261 %s
262 prefer: %t,
263 apex_available: [
264 "com.android.art",
265 ],
Paul Duffin54e41972021-07-19 13:23:40 +0100266 hidden_api: {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100267 annotation_flags: "hiddenapi/annotation-flags.csv",
268 metadata: "hiddenapi/metadata.csv",
269 index: "hiddenapi/index.csv",
270 stub_flags: "hiddenapi/stub-flags.csv",
271 all_flags: "hiddenapi/all-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +0100272 },
Paul Duffinba6afd02019-11-19 19:44:10 +0000273 }
274 `, contentsInsert(contents), prefer)
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100275
276 for _, content := range contents {
277 text += fmt.Sprintf(`
278 java_import {
279 name: "%[1]s",
280 prefer: %[2]t,
281 jars: ["%[1]s.jar"],
282 apex_available: [
283 "com.android.art",
284 ],
285 compile_dex: true,
286 }
287 `, content, prefer)
288 }
289
Paul Duffinba6afd02019-11-19 19:44:10 +0000290 return android.FixtureAddTextFile("prebuilts/module_sdk/art/Android.bp", text)
291 }
292
Paul Duffince918b02021-06-07 14:33:47 +0100293 t.Run("boot image files from source", func(t *testing.T) {
294 result := android.GroupFixturePreparers(
295 commonPreparer,
296
297 // Configure some libraries in the art bootclasspath_fragment that match the source
298 // bootclasspath_fragment's contents property.
299 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
300 addSource("foo", "bar"),
Jiakai Zhang6decef92022-01-12 17:56:19 +0000301 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Paul Duffince918b02021-06-07 14:33:47 +0100302 ).RunTest(t)
303
304 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art_image", []string{
Jiakai Zhang49b1eb62021-11-26 18:09:27 +0000305 "etc/boot-image.prof",
Paul Duffince918b02021-06-07 14:33:47 +0100306 "etc/classpaths/bootclasspath.pb",
Paul Duffince918b02021-06-07 14:33:47 +0100307 "javalib/bar.jar",
308 "javalib/foo.jar",
309 })
310
311 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art_image", []string{
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100312 `art-bootclasspath-fragment`,
Paul Duffince918b02021-06-07 14:33:47 +0100313 `com.android.art.key`,
Paul Duffince918b02021-06-07 14:33:47 +0100314 })
315
316 // Make sure that the source bootclasspath_fragment copies its dex files to the predefined
317 // locations for the art image.
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100318 module := result.ModuleForTests("art-bootclasspath-fragment", "android_common_apex10000")
Paul Duffince918b02021-06-07 14:33:47 +0100319 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
320 })
321
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000322 t.Run("generate boot image profile even if dexpreopt is disabled", func(t *testing.T) {
323 result := android.GroupFixturePreparers(
324 commonPreparer,
325
326 // Configure some libraries in the art bootclasspath_fragment that match the source
327 // bootclasspath_fragment's contents property.
328 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
329 addSource("foo", "bar"),
330 java.FixtureSetBootImageInstallDirOnDevice("art", "system/framework"),
331 dexpreopt.FixtureDisableDexpreoptBootImages(true),
332 ).RunTest(t)
333
334 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art_image", []string{
335 "etc/boot-image.prof",
336 "etc/classpaths/bootclasspath.pb",
337 "javalib/bar.jar",
338 "javalib/foo.jar",
339 })
340 })
341
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000342 t.Run("boot image disable generate profile", func(t *testing.T) {
343 result := android.GroupFixturePreparers(
344 commonPreparer,
345
346 // Configure some libraries in the art bootclasspath_fragment that match the source
347 // bootclasspath_fragment's contents property.
348 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
349 addSource("foo", "bar"),
350 dexpreopt.FixtureDisableGenerateProfile(true),
351 ).RunTest(t)
352
353 files := getFiles(t, result.TestContext, "com.android.art", "android_common_com.android.art_image")
354 for _, file := range files {
355 matched, _ := path.Match("etc/boot-image.prof", file.path)
356 android.AssertBoolEquals(t, "\"etc/boot-image.prof\" should not be in the APEX", matched, false)
357 }
358 })
359
Paul Duffince918b02021-06-07 14:33:47 +0100360 t.Run("boot image files with preferred prebuilt", func(t *testing.T) {
Paul Duffinba6afd02019-11-19 19:44:10 +0000361 result := android.GroupFixturePreparers(
362 commonPreparer,
363
364 // Configure some libraries in the art bootclasspath_fragment that match the source
365 // bootclasspath_fragment's contents property.
366 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
367 addSource("foo", "bar"),
368
369 // Make sure that a preferred prebuilt with consistent contents doesn't affect the apex.
370 addPrebuilt(true, "foo", "bar"),
Jiakai Zhang6decef92022-01-12 17:56:19 +0000371
372 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Paul Duffinba6afd02019-11-19 19:44:10 +0000373 ).RunTest(t)
374
Jiakai Zhangebf48bf2023-02-10 01:51:53 +0800375 ensureExactDeapexedContents(t, result.TestContext, "com.android.art", "android_common", []string{
Jiakai Zhang49b1eb62021-11-26 18:09:27 +0000376 "etc/boot-image.prof",
Paul Duffinba6afd02019-11-19 19:44:10 +0000377 "javalib/bar.jar",
378 "javalib/foo.jar",
379 })
380
381 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art_image", []string{
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100382 `art-bootclasspath-fragment`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000383 `com.android.art.key`,
Paul Duffince918b02021-06-07 14:33:47 +0100384 `prebuilt_com.android.art`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000385 })
Paul Duffince918b02021-06-07 14:33:47 +0100386
387 // Make sure that the prebuilt bootclasspath_fragment copies its dex files to the predefined
388 // locations for the art image.
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100389 module := result.ModuleForTests("prebuilt_art-bootclasspath-fragment", "android_common_com.android.art")
Paul Duffince918b02021-06-07 14:33:47 +0100390 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffina1d60252021-01-21 18:13:43 +0000391 })
Paul Duffin396229f2021-03-18 18:30:31 +0000392
Paul Duffinba6afd02019-11-19 19:44:10 +0000393 t.Run("source with inconsistency between config and contents", func(t *testing.T) {
394 android.GroupFixturePreparers(
395 commonPreparer,
396
397 // Create an inconsistency between the ArtApexJars configuration and the art source
398 // bootclasspath_fragment module's contents property.
399 java.FixtureConfigureBootJars("com.android.art:foo"),
400 addSource("foo", "bar"),
401 ).
402 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
403 RunTest(t)
404 })
405
406 t.Run("prebuilt with inconsistency between config and contents", func(t *testing.T) {
407 android.GroupFixturePreparers(
408 commonPreparer,
409
410 // Create an inconsistency between the ArtApexJars configuration and the art
411 // prebuilt_bootclasspath_fragment module's contents property.
412 java.FixtureConfigureBootJars("com.android.art:foo"),
413 addPrebuilt(false, "foo", "bar"),
414 ).
415 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
416 RunTest(t)
417 })
418
419 t.Run("preferred prebuilt with inconsistency between config and contents", func(t *testing.T) {
420 android.GroupFixturePreparers(
421 commonPreparer,
422
423 // Create an inconsistency between the ArtApexJars configuration and the art
424 // prebuilt_bootclasspath_fragment module's contents property.
425 java.FixtureConfigureBootJars("com.android.art:foo"),
426 addPrebuilt(true, "foo", "bar"),
427
428 // Source contents property is consistent with the config.
429 addSource("foo"),
430 ).
431 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
432 RunTest(t)
433 })
434
435 t.Run("source preferred and prebuilt with inconsistency between config and contents", func(t *testing.T) {
436 android.GroupFixturePreparers(
437 commonPreparer,
438
439 // Create an inconsistency between the ArtApexJars configuration and the art
440 // prebuilt_bootclasspath_fragment module's contents property.
441 java.FixtureConfigureBootJars("com.android.art:foo"),
442 addPrebuilt(false, "foo", "bar"),
443
444 // Source contents property is consistent with the config.
445 addSource("foo"),
446
447 // This should pass because while the prebuilt is inconsistent with the configuration it is
448 // not actually used.
449 ).RunTest(t)
Paul Duffin396229f2021-03-18 18:30:31 +0000450 })
Paul Duffina1d60252021-01-21 18:13:43 +0000451}
452
Paul Duffin94f19632021-04-20 12:40:07 +0100453func TestBootclasspathFragmentInPrebuiltArtApex(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100454 preparers := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100455 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000456 prepareForTestWithArtApex,
457
458 android.FixtureMergeMockFs(android.MockFS{
459 "com.android.art-arm64.apex": nil,
460 "com.android.art-arm.apex": nil,
461 }),
462
Paul Duffin7771eba2021-04-23 14:25:28 +0100463 // Configure some libraries in the art bootclasspath_fragment.
Paul Duffin60264a02021-04-12 20:02:36 +0100464 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhange6e90db2022-01-28 14:58:56 +0000465 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100466 )
467
468 bp := `
Paul Duffin9ea71c02021-03-23 22:53:07 +0000469 prebuilt_apex {
470 name: "com.android.art",
471 arch: {
472 arm64: {
473 src: "com.android.art-arm64.apex",
474 },
475 arm: {
476 src: "com.android.art-arm.apex",
477 },
478 },
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100479 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000480 }
481
482 java_import {
483 name: "foo",
484 jars: ["foo.jar"],
485 apex_available: [
486 "com.android.art",
487 ],
488 }
489
490 java_import {
491 name: "bar",
492 jars: ["bar.jar"],
493 apex_available: [
494 "com.android.art",
495 ],
496 }
497
Paul Duffin7771eba2021-04-23 14:25:28 +0100498 prebuilt_bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100499 name: "art-bootclasspath-fragment",
Paul Duffin9ea71c02021-03-23 22:53:07 +0000500 image_name: "art",
Paul Duffinf23bc472021-04-27 12:42:20 +0100501 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
502 contents: ["foo", "bar"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000503 apex_available: [
504 "com.android.art",
505 ],
Paul Duffin54e41972021-07-19 13:23:40 +0100506 hidden_api: {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100507 annotation_flags: "hiddenapi/annotation-flags.csv",
508 metadata: "hiddenapi/metadata.csv",
509 index: "hiddenapi/index.csv",
510 stub_flags: "hiddenapi/stub-flags.csv",
511 all_flags: "hiddenapi/all-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +0100512 },
Paul Duffin9ea71c02021-03-23 22:53:07 +0000513 }
Paul Duffin9ea71c02021-03-23 22:53:07 +0000514
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100515 // A prebuilt apex with the same apex_name that shouldn't interfere when it isn't enabled.
516 prebuilt_apex {
517 name: "com.mycompany.android.art",
518 apex_name: "com.android.art",
519 %s
520 src: "com.mycompany.android.art.apex",
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100521 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100522 }
523 `
524
525 t.Run("disabled alternative APEX", func(t *testing.T) {
526 result := preparers.RunTestWithBp(t, fmt.Sprintf(bp, "enabled: false,"))
527
528 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
529 `com.android.art.apex.selector`,
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100530 `prebuilt_art-bootclasspath-fragment`,
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100531 })
532
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100533 java.CheckModuleDependencies(t, result.TestContext, "art-bootclasspath-fragment", "android_common_com.android.art", []string{
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100534 `com.android.art.deapexer`,
535 `dex2oatd`,
536 `prebuilt_bar`,
537 `prebuilt_foo`,
538 })
539
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100540 module := result.ModuleForTests("art-bootclasspath-fragment", "android_common_com.android.art")
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100541 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffin9ea71c02021-03-23 22:53:07 +0000542 })
543
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100544 t.Run("enabled alternative APEX", func(t *testing.T) {
545 preparers.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
546 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.art and com.mycompany.android.art")).
547 RunTestWithBp(t, fmt.Sprintf(bp, ""))
Paul Duffin9ea71c02021-03-23 22:53:07 +0000548 })
Paul Duffince918b02021-06-07 14:33:47 +0100549}
550
551// checkCopiesToPredefinedLocationForArt checks that the supplied modules are copied to the
552// predefined locations of boot dex jars used as inputs for the ART boot image.
553func checkCopiesToPredefinedLocationForArt(t *testing.T, config android.Config, module android.TestingModule, modules ...string) {
554 t.Helper()
555 bootJarLocations := []string{}
556 for _, output := range module.AllOutputs() {
557 output = android.StringRelativeToTop(config, output)
Jeongik Cha4753b392023-04-19 23:25:41 +0900558 if strings.HasPrefix(output, "out/soong/dexpreopt_arm64/dex_artjars_input/") {
Paul Duffince918b02021-06-07 14:33:47 +0100559 bootJarLocations = append(bootJarLocations, output)
560 }
561 }
562
563 sort.Strings(bootJarLocations)
564 expected := []string{}
565 for _, m := range modules {
Jeongik Cha4753b392023-04-19 23:25:41 +0900566 expected = append(expected, fmt.Sprintf("out/soong/dexpreopt_arm64/dex_artjars_input/%s.jar", m))
Paul Duffince918b02021-06-07 14:33:47 +0100567 }
568 sort.Strings(expected)
569
570 android.AssertArrayString(t, "copies to predefined locations for art", expected, bootJarLocations)
Paul Duffin9ea71c02021-03-23 22:53:07 +0000571}
572
Paul Duffin94f19632021-04-20 12:40:07 +0100573func TestBootclasspathFragmentContentsNoName(t *testing.T) {
Paul Duffin82886d62021-03-24 01:34:57 +0000574 result := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100575 prepareForTestWithBootclasspathFragment,
Paul Duffin82886d62021-03-24 01:34:57 +0000576 prepareForTestWithMyapex,
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100577 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100578 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100579 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
580 // is disabled.
581 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
582
583 java.PrepareForTestWithJavaSdkLibraryFiles,
584 java.FixtureWithLastReleaseApis("foo"),
Paul Duffin82886d62021-03-24 01:34:57 +0000585 ).RunTestWithBp(t, `
586 apex {
587 name: "myapex",
588 key: "myapex.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100589 bootclasspath_fragments: [
590 "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000591 ],
592 updatable: false,
593 }
594
595 apex_key {
596 name: "myapex.key",
597 public_key: "testkey.avbpubkey",
598 private_key: "testkey.pem",
599 }
600
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100601 java_sdk_library {
Paul Duffin82886d62021-03-24 01:34:57 +0000602 name: "foo",
603 srcs: ["b.java"],
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100604 shared_library: false,
605 public: {enabled: true},
Paul Duffin82886d62021-03-24 01:34:57 +0000606 apex_available: [
607 "myapex",
608 ],
609 }
610
611 java_library {
612 name: "bar",
613 srcs: ["b.java"],
614 installable: true,
615 apex_available: [
616 "myapex",
617 ],
618 }
619
Paul Duffin7771eba2021-04-23 14:25:28 +0100620 bootclasspath_fragment {
Paul Duffin94f19632021-04-20 12:40:07 +0100621 name: "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000622 contents: [
623 "foo",
624 "bar",
625 ],
626 apex_available: [
627 "myapex",
628 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100629 hidden_api: {
630 split_packages: ["*"],
631 },
Paul Duffin82886d62021-03-24 01:34:57 +0000632 }
633 `)
634
Paul Duffin4d101b62021-03-24 15:42:20 +0000635 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
636 // This does not include art, oat or vdex files as they are only included for the art boot
637 // image.
satayev227e7452021-05-20 21:35:06 +0100638 "etc/classpaths/bootclasspath.pb",
Paul Duffin4d101b62021-03-24 15:42:20 +0000639 "javalib/bar.jar",
640 "javalib/foo.jar",
641 })
Paul Duffin82886d62021-03-24 01:34:57 +0000642
643 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
644 `myapex.key`,
Paul Duffin94f19632021-04-20 12:40:07 +0100645 `mybootclasspathfragment`,
Paul Duffin82886d62021-03-24 01:34:57 +0000646 })
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100647
648 apex := result.ModuleForTests("myapex", "android_common_myapex_image")
649 apexRule := apex.Rule("apexRule")
650 copyCommands := apexRule.Args["copy_commands"]
651
652 // Make sure that the fragment provides the hidden API encoded dex jars to the APEX.
653 fragment := result.Module("mybootclasspathfragment", "android_common_apex10000")
654
655 info := result.ModuleProvider(fragment, java.BootclasspathFragmentApexContentInfoProvider).(java.BootclasspathFragmentApexContentInfo)
656
657 checkFragmentExportedDexJar := func(name string, expectedDexJar string) {
658 module := result.Module(name, "android_common_apex10000")
Paul Duffin1a8010a2021-05-15 12:39:23 +0100659 dexJar, err := info.DexBootJarPathForContentModule(module)
660 if err != nil {
661 t.Error(err)
662 }
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100663 android.AssertPathRelativeToTopEquals(t, name+" dex", expectedDexJar, dexJar)
664
665 expectedCopyCommand := fmt.Sprintf("&& cp -f %s out/soong/.intermediates/myapex/android_common_myapex_image/image.apex/javalib/%s.jar", expectedDexJar, name)
666 android.AssertStringDoesContain(t, name+" apex copy command", copyCommands, expectedCopyCommand)
667 }
668
Paul Duffin54c98f52021-05-15 08:54:30 +0100669 checkFragmentExportedDexJar("foo", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/foo.jar")
670 checkFragmentExportedDexJar("bar", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/bar.jar")
Paul Duffin82886d62021-03-24 01:34:57 +0000671}
672
Paul Duffin48b67412021-06-23 16:13:50 +0100673func getDexJarPath(result *android.TestResult, name string) string {
674 module := result.Module(name, "android_common")
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +0100675 return module.(java.UsesLibraryDependency).DexJarBuildPath().Path().RelativeToTop().String()
Paul Duffin48b67412021-06-23 16:13:50 +0100676}
677
678// TestBootclasspathFragment_HiddenAPIList checks to make sure that the correct parameters are
679// passed to the hiddenapi list tool.
680func TestBootclasspathFragment_HiddenAPIList(t *testing.T) {
681 result := android.GroupFixturePreparers(
682 prepareForTestWithBootclasspathFragment,
683 prepareForTestWithArtApex,
684 prepareForTestWithMyapex,
685 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
686 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
satayevd604b212021-07-21 14:23:52 +0100687 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin48b67412021-06-23 16:13:50 +0100688 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
689 // is disabled.
690 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
691
692 java.PrepareForTestWithJavaSdkLibraryFiles,
693 java.FixtureWithLastReleaseApis("foo", "quuz"),
694 ).RunTestWithBp(t, `
695 apex {
696 name: "com.android.art",
697 key: "com.android.art.key",
698 bootclasspath_fragments: ["art-bootclasspath-fragment"],
699 updatable: false,
700 }
701
702 apex_key {
703 name: "com.android.art.key",
704 public_key: "com.android.art.avbpubkey",
705 private_key: "com.android.art.pem",
706 }
707
708 java_library {
709 name: "baz",
710 apex_available: [
711 "com.android.art",
712 ],
713 srcs: ["b.java"],
714 compile_dex: true,
715 }
716
717 java_sdk_library {
718 name: "quuz",
719 apex_available: [
720 "com.android.art",
721 ],
722 srcs: ["b.java"],
723 compile_dex: true,
724 public: {enabled: true},
725 system: {enabled: true},
726 test: {enabled: true},
727 module_lib: {enabled: true},
728 }
729
730 bootclasspath_fragment {
731 name: "art-bootclasspath-fragment",
732 image_name: "art",
733 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
734 contents: ["baz", "quuz"],
735 apex_available: [
736 "com.android.art",
737 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100738 hidden_api: {
739 split_packages: ["*"],
740 },
Paul Duffin48b67412021-06-23 16:13:50 +0100741 }
742
743 apex {
744 name: "myapex",
745 key: "myapex.key",
746 bootclasspath_fragments: [
747 "mybootclasspathfragment",
748 ],
749 updatable: false,
750 }
751
752 apex_key {
753 name: "myapex.key",
754 public_key: "testkey.avbpubkey",
755 private_key: "testkey.pem",
756 }
757
758 java_sdk_library {
759 name: "foo",
760 srcs: ["b.java"],
761 shared_library: false,
762 public: {enabled: true},
763 apex_available: [
764 "myapex",
765 ],
766 }
767
768 java_library {
769 name: "bar",
770 srcs: ["b.java"],
771 installable: true,
772 apex_available: [
773 "myapex",
774 ],
775 }
776
777 bootclasspath_fragment {
778 name: "mybootclasspathfragment",
779 contents: [
780 "foo",
781 "bar",
782 ],
783 apex_available: [
784 "myapex",
785 ],
786 fragments: [
787 {
788 apex: "com.android.art",
789 module: "art-bootclasspath-fragment",
790 },
791 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100792 hidden_api: {
793 split_packages: ["*"],
794 },
Paul Duffin48b67412021-06-23 16:13:50 +0100795 }
796 `)
797
798 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
799 "art-bootclasspath-fragment",
800 "bar",
801 "dex2oatd",
802 "foo",
803 })
804
805 fooStubs := getDexJarPath(result, "foo.stubs")
806 quuzPublicStubs := getDexJarPath(result, "quuz.stubs")
807 quuzSystemStubs := getDexJarPath(result, "quuz.stubs.system")
808 quuzTestStubs := getDexJarPath(result, "quuz.stubs.test")
Paul Duffinb51db2e2021-06-21 14:08:08 +0100809 quuzModuleLibStubs := getDexJarPath(result, "quuz.stubs.module_lib")
Paul Duffin48b67412021-06-23 16:13:50 +0100810
811 // Make sure that the fragment uses the quuz stub dex jars when generating the hidden API flags.
812 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
813
814 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
815 command := rule.RuleParams.Command
816 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
817
818 // Make sure that the quuz stubs are available for resolving references from the implementation
819 // boot dex jars provided by this module.
Paul Duffinb51db2e2021-06-21 14:08:08 +0100820 android.AssertStringDoesContain(t, "quuz widest", command, "--dependency-stub-dex="+quuzModuleLibStubs)
Paul Duffin48b67412021-06-23 16:13:50 +0100821
822 // Make sure that the quuz stubs are available for resolving references from the different API
823 // stubs provided by this module.
824 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+quuzPublicStubs+":"+fooStubs)
825 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+quuzSystemStubs+":"+fooStubs)
826 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+quuzTestStubs+":"+fooStubs)
827}
828
Paul Duffin5cca7c42021-05-26 10:16:01 +0100829// TestBootclasspathFragment_AndroidNonUpdatable checks to make sure that setting
830// additional_stubs: ["android-non-updatable"] causes the source android-non-updatable modules to be
831// added to the hiddenapi list tool.
832func TestBootclasspathFragment_AndroidNonUpdatable(t *testing.T) {
833 result := android.GroupFixturePreparers(
834 prepareForTestWithBootclasspathFragment,
835 prepareForTestWithArtApex,
836 prepareForTestWithMyapex,
837 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100838 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
839 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +0100840 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
841 // is disabled.
842 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
843
844 java.PrepareForTestWithJavaSdkLibraryFiles,
845 java.FixtureWithLastReleaseApis("foo", "android-non-updatable"),
846 ).RunTestWithBp(t, `
847 java_sdk_library {
848 name: "android-non-updatable",
849 srcs: ["b.java"],
850 compile_dex: true,
851 public: {
852 enabled: true,
853 },
854 system: {
855 enabled: true,
856 },
857 test: {
858 enabled: true,
859 },
860 module_lib: {
861 enabled: true,
862 },
863 }
864
865 apex {
866 name: "com.android.art",
867 key: "com.android.art.key",
868 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +0100869 updatable: false,
870 }
871
872 apex_key {
873 name: "com.android.art.key",
874 public_key: "com.android.art.avbpubkey",
875 private_key: "com.android.art.pem",
876 }
877
878 java_library {
879 name: "baz",
880 apex_available: [
881 "com.android.art",
882 ],
883 srcs: ["b.java"],
884 compile_dex: true,
885 }
886
887 java_library {
888 name: "quuz",
889 apex_available: [
890 "com.android.art",
891 ],
892 srcs: ["b.java"],
893 compile_dex: true,
894 }
895
896 bootclasspath_fragment {
897 name: "art-bootclasspath-fragment",
898 image_name: "art",
899 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
900 contents: ["baz", "quuz"],
901 apex_available: [
902 "com.android.art",
903 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100904 hidden_api: {
905 split_packages: ["*"],
906 },
Paul Duffin5cca7c42021-05-26 10:16:01 +0100907 }
908
909 apex {
910 name: "myapex",
911 key: "myapex.key",
912 bootclasspath_fragments: [
913 "mybootclasspathfragment",
914 ],
915 updatable: false,
916 }
917
918 apex_key {
919 name: "myapex.key",
920 public_key: "testkey.avbpubkey",
921 private_key: "testkey.pem",
922 }
923
924 java_sdk_library {
925 name: "foo",
926 srcs: ["b.java"],
927 shared_library: false,
928 public: {enabled: true},
929 apex_available: [
930 "myapex",
931 ],
932 }
933
934 java_library {
935 name: "bar",
936 srcs: ["b.java"],
937 installable: true,
938 apex_available: [
939 "myapex",
940 ],
941 }
942
943 bootclasspath_fragment {
944 name: "mybootclasspathfragment",
945 contents: [
946 "foo",
947 "bar",
948 ],
949 apex_available: [
950 "myapex",
951 ],
952 additional_stubs: ["android-non-updatable"],
953 fragments: [
954 {
955 apex: "com.android.art",
956 module: "art-bootclasspath-fragment",
957 },
958 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100959 hidden_api: {
960 split_packages: ["*"],
961 },
Paul Duffin5cca7c42021-05-26 10:16:01 +0100962 }
963 `)
964
965 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
966 "android-non-updatable.stubs",
967 "android-non-updatable.stubs.module_lib",
968 "android-non-updatable.stubs.system",
969 "android-non-updatable.stubs.test",
970 "art-bootclasspath-fragment",
971 "bar",
972 "dex2oatd",
973 "foo",
974 })
975
976 nonUpdatablePublicStubs := getDexJarPath(result, "android-non-updatable.stubs")
977 nonUpdatableSystemStubs := getDexJarPath(result, "android-non-updatable.stubs.system")
978 nonUpdatableTestStubs := getDexJarPath(result, "android-non-updatable.stubs.test")
979 nonUpdatableModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.module_lib")
980
981 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
982 // API flags.
983 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
984
985 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
986 command := rule.RuleParams.Command
987 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
988
989 // Make sure that the module_lib non-updatable stubs are available for resolving references from
990 // the implementation boot dex jars provided by this module.
991 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
992
993 // Make sure that the appropriate non-updatable stubs are available for resolving references from
994 // the different API stubs provided by this module.
995 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
996 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
997 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
998}
999
1000// TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks checks to make sure that
1001// setting additional_stubs: ["android-non-updatable"] causes the prebuilt android-non-updatable
1002// modules to be added to the hiddenapi list tool.
1003func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *testing.T) {
1004 result := android.GroupFixturePreparers(
1005 prepareForTestWithBootclasspathFragment,
Jiakai Zhangb95998b2023-05-11 16:39:27 +01001006 java.PrepareForTestWithDexpreopt,
Paul Duffin5cca7c42021-05-26 10:16:01 +01001007 prepareForTestWithArtApex,
1008 prepareForTestWithMyapex,
1009 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +01001010 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
1011 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +01001012 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1013 // is disabled.
1014 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1015
1016 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1017 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
1018 }),
1019
1020 java.PrepareForTestWithJavaSdkLibraryFiles,
1021 java.FixtureWithPrebuiltApis(map[string][]string{
1022 "current": {"android-non-updatable"},
1023 "30": {"foo"},
1024 }),
1025 ).RunTestWithBp(t, `
1026 apex {
1027 name: "com.android.art",
1028 key: "com.android.art.key",
1029 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +01001030 updatable: false,
1031 }
1032
1033 apex_key {
1034 name: "com.android.art.key",
1035 public_key: "com.android.art.avbpubkey",
1036 private_key: "com.android.art.pem",
1037 }
1038
1039 java_library {
1040 name: "baz",
1041 apex_available: [
1042 "com.android.art",
1043 ],
1044 srcs: ["b.java"],
1045 compile_dex: true,
1046 }
1047
1048 java_library {
1049 name: "quuz",
1050 apex_available: [
1051 "com.android.art",
1052 ],
1053 srcs: ["b.java"],
1054 compile_dex: true,
1055 }
1056
1057 bootclasspath_fragment {
1058 name: "art-bootclasspath-fragment",
1059 image_name: "art",
1060 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
1061 contents: ["baz", "quuz"],
1062 apex_available: [
1063 "com.android.art",
1064 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001065 hidden_api: {
1066 split_packages: ["*"],
1067 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001068 }
1069
1070 apex {
1071 name: "myapex",
1072 key: "myapex.key",
1073 bootclasspath_fragments: [
1074 "mybootclasspathfragment",
1075 ],
1076 updatable: false,
1077 }
1078
1079 apex_key {
1080 name: "myapex.key",
1081 public_key: "testkey.avbpubkey",
1082 private_key: "testkey.pem",
1083 }
1084
1085 java_sdk_library {
1086 name: "foo",
1087 srcs: ["b.java"],
1088 shared_library: false,
1089 public: {enabled: true},
1090 apex_available: [
1091 "myapex",
1092 ],
1093 }
1094
1095 java_library {
1096 name: "bar",
1097 srcs: ["b.java"],
1098 installable: true,
1099 apex_available: [
1100 "myapex",
1101 ],
1102 }
1103
1104 bootclasspath_fragment {
1105 name: "mybootclasspathfragment",
1106 contents: [
1107 "foo",
1108 "bar",
1109 ],
1110 apex_available: [
1111 "myapex",
1112 ],
1113 additional_stubs: ["android-non-updatable"],
1114 fragments: [
1115 {
1116 apex: "com.android.art",
1117 module: "art-bootclasspath-fragment",
1118 },
1119 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001120 hidden_api: {
1121 split_packages: ["*"],
1122 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001123 }
1124 `)
1125
1126 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
1127 "art-bootclasspath-fragment",
1128 "bar",
1129 "dex2oatd",
1130 "foo",
1131 "prebuilt_sdk_module-lib_current_android-non-updatable",
1132 "prebuilt_sdk_public_current_android-non-updatable",
1133 "prebuilt_sdk_system_current_android-non-updatable",
1134 "prebuilt_sdk_test_current_android-non-updatable",
1135 })
1136
1137 nonUpdatablePublicStubs := getDexJarPath(result, "sdk_public_current_android-non-updatable")
1138 nonUpdatableSystemStubs := getDexJarPath(result, "sdk_system_current_android-non-updatable")
1139 nonUpdatableTestStubs := getDexJarPath(result, "sdk_test_current_android-non-updatable")
1140 nonUpdatableModuleLibStubs := getDexJarPath(result, "sdk_module-lib_current_android-non-updatable")
1141
1142 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1143 // API flags.
1144 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1145
1146 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1147 command := rule.RuleParams.Command
1148 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1149
1150 // Make sure that the module_lib non-updatable stubs are available for resolving references from
1151 // the implementation boot dex jars provided by this module.
1152 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
1153
1154 // Make sure that the appropriate non-updatable stubs are available for resolving references from
1155 // the different API stubs provided by this module.
1156 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
1157 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
1158 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
1159}
1160
Paul Duffina1d60252021-01-21 18:13:43 +00001161// TODO(b/177892522) - add test for host apex.