blob: 43be310bb98ab88ef4d769b14d5cbecdbb7da75c [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"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100300 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Paul Duffince918b02021-06-07 14:33:47 +0100301 addSource("foo", "bar"),
Jiakai Zhang6decef92022-01-12 17:56:19 +0000302 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Paul Duffince918b02021-06-07 14:33:47 +0100303 ).RunTest(t)
304
Jooyung Hana0503a52023-08-23 13:12:50 +0900305 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhang49b1eb62021-11-26 18:09:27 +0000306 "etc/boot-image.prof",
Paul Duffince918b02021-06-07 14:33:47 +0100307 "etc/classpaths/bootclasspath.pb",
Paul Duffince918b02021-06-07 14:33:47 +0100308 "javalib/bar.jar",
309 "javalib/foo.jar",
310 })
311
Jooyung Hana0503a52023-08-23 13:12:50 +0900312 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100313 `art-bootclasspath-fragment`,
Paul Duffince918b02021-06-07 14:33:47 +0100314 `com.android.art.key`,
Paul Duffince918b02021-06-07 14:33:47 +0100315 })
316
317 // Make sure that the source bootclasspath_fragment copies its dex files to the predefined
318 // locations for the art image.
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100319 module := result.ModuleForTests("dex_bootjars", "android_common")
Paul Duffince918b02021-06-07 14:33:47 +0100320 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
321 })
322
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000323 t.Run("generate boot image profile even if dexpreopt is disabled", func(t *testing.T) {
324 result := android.GroupFixturePreparers(
325 commonPreparer,
326
327 // Configure some libraries in the art bootclasspath_fragment that match the source
328 // bootclasspath_fragment's contents property.
329 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
330 addSource("foo", "bar"),
331 java.FixtureSetBootImageInstallDirOnDevice("art", "system/framework"),
332 dexpreopt.FixtureDisableDexpreoptBootImages(true),
333 ).RunTest(t)
334
Jooyung Hana0503a52023-08-23 13:12:50 +0900335 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhangbc698cd2023-05-08 16:28:38 +0000336 "etc/boot-image.prof",
337 "etc/classpaths/bootclasspath.pb",
338 "javalib/bar.jar",
339 "javalib/foo.jar",
340 })
341 })
342
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000343 t.Run("boot image disable generate profile", func(t *testing.T) {
344 result := android.GroupFixturePreparers(
345 commonPreparer,
346
347 // Configure some libraries in the art bootclasspath_fragment that match the source
348 // bootclasspath_fragment's contents property.
349 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
350 addSource("foo", "bar"),
351 dexpreopt.FixtureDisableGenerateProfile(true),
352 ).RunTest(t)
353
Jooyung Hana0503a52023-08-23 13:12:50 +0900354 files := getFiles(t, result.TestContext, "com.android.art", "android_common_com.android.art")
Jiakai Zhang7d3c9e02021-12-13 17:19:05 +0000355 for _, file := range files {
356 matched, _ := path.Match("etc/boot-image.prof", file.path)
357 android.AssertBoolEquals(t, "\"etc/boot-image.prof\" should not be in the APEX", matched, false)
358 }
359 })
360
Paul Duffince918b02021-06-07 14:33:47 +0100361 t.Run("boot image files with preferred prebuilt", func(t *testing.T) {
Paul Duffinba6afd02019-11-19 19:44:10 +0000362 result := android.GroupFixturePreparers(
363 commonPreparer,
364
365 // Configure some libraries in the art bootclasspath_fragment that match the source
366 // bootclasspath_fragment's contents property.
367 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100368 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Paul Duffinba6afd02019-11-19 19:44:10 +0000369 addSource("foo", "bar"),
370
371 // Make sure that a preferred prebuilt with consistent contents doesn't affect the apex.
372 addPrebuilt(true, "foo", "bar"),
Jiakai Zhang6decef92022-01-12 17:56:19 +0000373
374 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Paul Duffinba6afd02019-11-19 19:44:10 +0000375 ).RunTest(t)
376
Jiakai Zhangebf48bf2023-02-10 01:51:53 +0800377 ensureExactDeapexedContents(t, result.TestContext, "com.android.art", "android_common", []string{
Jiakai Zhang49b1eb62021-11-26 18:09:27 +0000378 "etc/boot-image.prof",
Paul Duffinba6afd02019-11-19 19:44:10 +0000379 "javalib/bar.jar",
380 "javalib/foo.jar",
381 })
382
Jooyung Hana0503a52023-08-23 13:12:50 +0900383 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100384 `art-bootclasspath-fragment`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000385 `com.android.art.key`,
Paul Duffince918b02021-06-07 14:33:47 +0100386 `prebuilt_com.android.art`,
Paul Duffinba6afd02019-11-19 19:44:10 +0000387 })
Paul Duffince918b02021-06-07 14:33:47 +0100388
389 // Make sure that the prebuilt bootclasspath_fragment copies its dex files to the predefined
390 // locations for the art image.
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100391 module := result.ModuleForTests("dex_bootjars", "android_common")
Paul Duffince918b02021-06-07 14:33:47 +0100392 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffina1d60252021-01-21 18:13:43 +0000393 })
Paul Duffin396229f2021-03-18 18:30:31 +0000394
Paul Duffinba6afd02019-11-19 19:44:10 +0000395 t.Run("source with inconsistency between config and contents", func(t *testing.T) {
396 android.GroupFixturePreparers(
397 commonPreparer,
398
399 // Create an inconsistency between the ArtApexJars configuration and the art source
400 // bootclasspath_fragment module's contents property.
401 java.FixtureConfigureBootJars("com.android.art:foo"),
402 addSource("foo", "bar"),
403 ).
404 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
405 RunTest(t)
406 })
407
408 t.Run("prebuilt with inconsistency between config and contents", func(t *testing.T) {
409 android.GroupFixturePreparers(
410 commonPreparer,
411
412 // Create an inconsistency between the ArtApexJars configuration and the art
413 // prebuilt_bootclasspath_fragment module's contents property.
414 java.FixtureConfigureBootJars("com.android.art:foo"),
415 addPrebuilt(false, "foo", "bar"),
416 ).
417 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
418 RunTest(t)
419 })
420
421 t.Run("preferred prebuilt with inconsistency between config and contents", func(t *testing.T) {
422 android.GroupFixturePreparers(
423 commonPreparer,
424
425 // Create an inconsistency between the ArtApexJars configuration and the art
426 // prebuilt_bootclasspath_fragment module's contents property.
427 java.FixtureConfigureBootJars("com.android.art:foo"),
428 addPrebuilt(true, "foo", "bar"),
429
430 // Source contents property is consistent with the config.
431 addSource("foo"),
432 ).
433 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
434 RunTest(t)
435 })
436
437 t.Run("source preferred and prebuilt with inconsistency between config and contents", func(t *testing.T) {
438 android.GroupFixturePreparers(
439 commonPreparer,
440
441 // Create an inconsistency between the ArtApexJars configuration and the art
442 // prebuilt_bootclasspath_fragment module's contents property.
443 java.FixtureConfigureBootJars("com.android.art:foo"),
444 addPrebuilt(false, "foo", "bar"),
445
446 // Source contents property is consistent with the config.
447 addSource("foo"),
448
449 // This should pass because while the prebuilt is inconsistent with the configuration it is
450 // not actually used.
451 ).RunTest(t)
Paul Duffin396229f2021-03-18 18:30:31 +0000452 })
Paul Duffina1d60252021-01-21 18:13:43 +0000453}
454
Paul Duffin94f19632021-04-20 12:40:07 +0100455func TestBootclasspathFragmentInPrebuiltArtApex(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100456 preparers := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100457 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000458 prepareForTestWithArtApex,
459
460 android.FixtureMergeMockFs(android.MockFS{
461 "com.android.art-arm64.apex": nil,
462 "com.android.art-arm.apex": nil,
463 }),
464
Paul Duffin7771eba2021-04-23 14:25:28 +0100465 // Configure some libraries in the art bootclasspath_fragment.
Paul Duffin60264a02021-04-12 20:02:36 +0100466 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhang556bdf82023-07-12 16:51:57 +0100467 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"),
Jiakai Zhange6e90db2022-01-28 14:58:56 +0000468 java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100469 )
470
471 bp := `
Paul Duffin9ea71c02021-03-23 22:53:07 +0000472 prebuilt_apex {
473 name: "com.android.art",
474 arch: {
475 arm64: {
476 src: "com.android.art-arm64.apex",
477 },
478 arm: {
479 src: "com.android.art-arm.apex",
480 },
481 },
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100482 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000483 }
484
485 java_import {
486 name: "foo",
487 jars: ["foo.jar"],
488 apex_available: [
489 "com.android.art",
490 ],
491 }
492
493 java_import {
494 name: "bar",
495 jars: ["bar.jar"],
496 apex_available: [
497 "com.android.art",
498 ],
499 }
500
Paul Duffin7771eba2021-04-23 14:25:28 +0100501 prebuilt_bootclasspath_fragment {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100502 name: "art-bootclasspath-fragment",
Paul Duffin9ea71c02021-03-23 22:53:07 +0000503 image_name: "art",
Paul Duffinf23bc472021-04-27 12:42:20 +0100504 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
505 contents: ["foo", "bar"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000506 apex_available: [
507 "com.android.art",
508 ],
Paul Duffin54e41972021-07-19 13:23:40 +0100509 hidden_api: {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100510 annotation_flags: "hiddenapi/annotation-flags.csv",
511 metadata: "hiddenapi/metadata.csv",
512 index: "hiddenapi/index.csv",
513 stub_flags: "hiddenapi/stub-flags.csv",
514 all_flags: "hiddenapi/all-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +0100515 },
Paul Duffin9ea71c02021-03-23 22:53:07 +0000516 }
Paul Duffin9ea71c02021-03-23 22:53:07 +0000517
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100518 // A prebuilt apex with the same apex_name that shouldn't interfere when it isn't enabled.
519 prebuilt_apex {
520 name: "com.mycompany.android.art",
521 apex_name: "com.android.art",
522 %s
523 src: "com.mycompany.android.art.apex",
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100524 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100525 }
526 `
527
528 t.Run("disabled alternative APEX", func(t *testing.T) {
529 result := preparers.RunTestWithBp(t, fmt.Sprintf(bp, "enabled: false,"))
530
531 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{
532 `com.android.art.apex.selector`,
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100533 `prebuilt_art-bootclasspath-fragment`,
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100534 })
535
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100536 java.CheckModuleDependencies(t, result.TestContext, "art-bootclasspath-fragment", "android_common_com.android.art", []string{
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100537 `com.android.art.deapexer`,
538 `dex2oatd`,
539 `prebuilt_bar`,
540 `prebuilt_foo`,
541 })
542
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100543 module := result.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100544 checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo")
Paul Duffin9ea71c02021-03-23 22:53:07 +0000545 })
546
Martin Stjernholm43c44b02021-06-30 16:35:07 +0100547 t.Run("enabled alternative APEX", func(t *testing.T) {
548 preparers.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
549 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.art and com.mycompany.android.art")).
550 RunTestWithBp(t, fmt.Sprintf(bp, ""))
Paul Duffin9ea71c02021-03-23 22:53:07 +0000551 })
Paul Duffince918b02021-06-07 14:33:47 +0100552}
553
554// checkCopiesToPredefinedLocationForArt checks that the supplied modules are copied to the
555// predefined locations of boot dex jars used as inputs for the ART boot image.
556func checkCopiesToPredefinedLocationForArt(t *testing.T, config android.Config, module android.TestingModule, modules ...string) {
557 t.Helper()
558 bootJarLocations := []string{}
559 for _, output := range module.AllOutputs() {
560 output = android.StringRelativeToTop(config, output)
Jeongik Cha4753b392023-04-19 23:25:41 +0900561 if strings.HasPrefix(output, "out/soong/dexpreopt_arm64/dex_artjars_input/") {
Paul Duffince918b02021-06-07 14:33:47 +0100562 bootJarLocations = append(bootJarLocations, output)
563 }
564 }
565
566 sort.Strings(bootJarLocations)
567 expected := []string{}
568 for _, m := range modules {
Jeongik Cha4753b392023-04-19 23:25:41 +0900569 expected = append(expected, fmt.Sprintf("out/soong/dexpreopt_arm64/dex_artjars_input/%s.jar", m))
Paul Duffince918b02021-06-07 14:33:47 +0100570 }
571 sort.Strings(expected)
572
573 android.AssertArrayString(t, "copies to predefined locations for art", expected, bootJarLocations)
Paul Duffin9ea71c02021-03-23 22:53:07 +0000574}
575
Paul Duffin94f19632021-04-20 12:40:07 +0100576func TestBootclasspathFragmentContentsNoName(t *testing.T) {
Paul Duffin82886d62021-03-24 01:34:57 +0000577 result := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100578 prepareForTestWithBootclasspathFragment,
Paul Duffin82886d62021-03-24 01:34:57 +0000579 prepareForTestWithMyapex,
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100580 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100581 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100582 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
583 // is disabled.
584 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
585
586 java.PrepareForTestWithJavaSdkLibraryFiles,
587 java.FixtureWithLastReleaseApis("foo"),
Paul Duffin82886d62021-03-24 01:34:57 +0000588 ).RunTestWithBp(t, `
589 apex {
590 name: "myapex",
591 key: "myapex.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100592 bootclasspath_fragments: [
593 "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000594 ],
595 updatable: false,
596 }
597
598 apex_key {
599 name: "myapex.key",
600 public_key: "testkey.avbpubkey",
601 private_key: "testkey.pem",
602 }
603
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100604 java_sdk_library {
Paul Duffin82886d62021-03-24 01:34:57 +0000605 name: "foo",
606 srcs: ["b.java"],
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100607 shared_library: false,
608 public: {enabled: true},
Paul Duffin82886d62021-03-24 01:34:57 +0000609 apex_available: [
610 "myapex",
611 ],
612 }
613
614 java_library {
615 name: "bar",
616 srcs: ["b.java"],
617 installable: true,
618 apex_available: [
619 "myapex",
620 ],
621 }
622
Paul Duffin7771eba2021-04-23 14:25:28 +0100623 bootclasspath_fragment {
Paul Duffin94f19632021-04-20 12:40:07 +0100624 name: "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000625 contents: [
626 "foo",
627 "bar",
628 ],
629 apex_available: [
630 "myapex",
631 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100632 hidden_api: {
633 split_packages: ["*"],
634 },
Paul Duffin82886d62021-03-24 01:34:57 +0000635 }
636 `)
637
Jooyung Hana0503a52023-08-23 13:12:50 +0900638 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Paul Duffin4d101b62021-03-24 15:42:20 +0000639 // This does not include art, oat or vdex files as they are only included for the art boot
640 // image.
satayev227e7452021-05-20 21:35:06 +0100641 "etc/classpaths/bootclasspath.pb",
Paul Duffin4d101b62021-03-24 15:42:20 +0000642 "javalib/bar.jar",
643 "javalib/foo.jar",
644 })
Paul Duffin82886d62021-03-24 01:34:57 +0000645
Jooyung Hana0503a52023-08-23 13:12:50 +0900646 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex", []string{
Paul Duffin82886d62021-03-24 01:34:57 +0000647 `myapex.key`,
Paul Duffin94f19632021-04-20 12:40:07 +0100648 `mybootclasspathfragment`,
Paul Duffin82886d62021-03-24 01:34:57 +0000649 })
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100650
Jooyung Hana0503a52023-08-23 13:12:50 +0900651 apex := result.ModuleForTests("myapex", "android_common_myapex")
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100652 apexRule := apex.Rule("apexRule")
653 copyCommands := apexRule.Args["copy_commands"]
654
655 // Make sure that the fragment provides the hidden API encoded dex jars to the APEX.
656 fragment := result.Module("mybootclasspathfragment", "android_common_apex10000")
657
658 info := result.ModuleProvider(fragment, java.BootclasspathFragmentApexContentInfoProvider).(java.BootclasspathFragmentApexContentInfo)
659
660 checkFragmentExportedDexJar := func(name string, expectedDexJar string) {
661 module := result.Module(name, "android_common_apex10000")
Paul Duffin1a8010a2021-05-15 12:39:23 +0100662 dexJar, err := info.DexBootJarPathForContentModule(module)
663 if err != nil {
664 t.Error(err)
665 }
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100666 android.AssertPathRelativeToTopEquals(t, name+" dex", expectedDexJar, dexJar)
667
Jooyung Hana0503a52023-08-23 13:12:50 +0900668 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 +0100669 android.AssertStringDoesContain(t, name+" apex copy command", copyCommands, expectedCopyCommand)
670 }
671
Paul Duffin54c98f52021-05-15 08:54:30 +0100672 checkFragmentExportedDexJar("foo", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/foo.jar")
673 checkFragmentExportedDexJar("bar", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/bar.jar")
Paul Duffin82886d62021-03-24 01:34:57 +0000674}
675
Paul Duffin48b67412021-06-23 16:13:50 +0100676func getDexJarPath(result *android.TestResult, name string) string {
677 module := result.Module(name, "android_common")
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +0100678 return module.(java.UsesLibraryDependency).DexJarBuildPath().Path().RelativeToTop().String()
Paul Duffin48b67412021-06-23 16:13:50 +0100679}
680
681// TestBootclasspathFragment_HiddenAPIList checks to make sure that the correct parameters are
682// passed to the hiddenapi list tool.
683func TestBootclasspathFragment_HiddenAPIList(t *testing.T) {
684 result := android.GroupFixturePreparers(
685 prepareForTestWithBootclasspathFragment,
686 prepareForTestWithArtApex,
687 prepareForTestWithMyapex,
688 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
689 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
satayevd604b212021-07-21 14:23:52 +0100690 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin48b67412021-06-23 16:13:50 +0100691 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
692 // is disabled.
693 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
694
695 java.PrepareForTestWithJavaSdkLibraryFiles,
696 java.FixtureWithLastReleaseApis("foo", "quuz"),
697 ).RunTestWithBp(t, `
698 apex {
699 name: "com.android.art",
700 key: "com.android.art.key",
701 bootclasspath_fragments: ["art-bootclasspath-fragment"],
702 updatable: false,
703 }
704
705 apex_key {
706 name: "com.android.art.key",
707 public_key: "com.android.art.avbpubkey",
708 private_key: "com.android.art.pem",
709 }
710
711 java_library {
712 name: "baz",
713 apex_available: [
714 "com.android.art",
715 ],
716 srcs: ["b.java"],
717 compile_dex: true,
718 }
719
720 java_sdk_library {
721 name: "quuz",
722 apex_available: [
723 "com.android.art",
724 ],
725 srcs: ["b.java"],
726 compile_dex: true,
727 public: {enabled: true},
728 system: {enabled: true},
729 test: {enabled: true},
730 module_lib: {enabled: true},
731 }
732
733 bootclasspath_fragment {
734 name: "art-bootclasspath-fragment",
735 image_name: "art",
736 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
737 contents: ["baz", "quuz"],
738 apex_available: [
739 "com.android.art",
740 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100741 hidden_api: {
742 split_packages: ["*"],
743 },
Paul Duffin48b67412021-06-23 16:13:50 +0100744 }
745
746 apex {
747 name: "myapex",
748 key: "myapex.key",
749 bootclasspath_fragments: [
750 "mybootclasspathfragment",
751 ],
752 updatable: false,
753 }
754
755 apex_key {
756 name: "myapex.key",
757 public_key: "testkey.avbpubkey",
758 private_key: "testkey.pem",
759 }
760
761 java_sdk_library {
762 name: "foo",
763 srcs: ["b.java"],
764 shared_library: false,
765 public: {enabled: true},
766 apex_available: [
767 "myapex",
768 ],
769 }
770
771 java_library {
772 name: "bar",
773 srcs: ["b.java"],
774 installable: true,
775 apex_available: [
776 "myapex",
777 ],
778 }
779
780 bootclasspath_fragment {
781 name: "mybootclasspathfragment",
782 contents: [
783 "foo",
784 "bar",
785 ],
786 apex_available: [
787 "myapex",
788 ],
789 fragments: [
790 {
791 apex: "com.android.art",
792 module: "art-bootclasspath-fragment",
793 },
794 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100795 hidden_api: {
796 split_packages: ["*"],
797 },
Paul Duffin48b67412021-06-23 16:13:50 +0100798 }
799 `)
800
801 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
802 "art-bootclasspath-fragment",
803 "bar",
804 "dex2oatd",
805 "foo",
806 })
807
808 fooStubs := getDexJarPath(result, "foo.stubs")
809 quuzPublicStubs := getDexJarPath(result, "quuz.stubs")
810 quuzSystemStubs := getDexJarPath(result, "quuz.stubs.system")
811 quuzTestStubs := getDexJarPath(result, "quuz.stubs.test")
Paul Duffinb51db2e2021-06-21 14:08:08 +0100812 quuzModuleLibStubs := getDexJarPath(result, "quuz.stubs.module_lib")
Paul Duffin48b67412021-06-23 16:13:50 +0100813
814 // Make sure that the fragment uses the quuz stub dex jars when generating the hidden API flags.
815 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
816
817 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
818 command := rule.RuleParams.Command
819 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
820
821 // Make sure that the quuz stubs are available for resolving references from the implementation
822 // boot dex jars provided by this module.
Paul Duffinb51db2e2021-06-21 14:08:08 +0100823 android.AssertStringDoesContain(t, "quuz widest", command, "--dependency-stub-dex="+quuzModuleLibStubs)
Paul Duffin48b67412021-06-23 16:13:50 +0100824
825 // Make sure that the quuz stubs are available for resolving references from the different API
826 // stubs provided by this module.
827 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+quuzPublicStubs+":"+fooStubs)
828 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+quuzSystemStubs+":"+fooStubs)
829 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+quuzTestStubs+":"+fooStubs)
830}
831
Paul Duffin5cca7c42021-05-26 10:16:01 +0100832// TestBootclasspathFragment_AndroidNonUpdatable checks to make sure that setting
833// additional_stubs: ["android-non-updatable"] causes the source android-non-updatable modules to be
834// added to the hiddenapi list tool.
Jihoon Kangcc9e2182023-10-16 23:13:33 +0000835func TestBootclasspathFragment_AndroidNonUpdatable_FromSource(t *testing.T) {
Paul Duffin5cca7c42021-05-26 10:16:01 +0100836 result := android.GroupFixturePreparers(
837 prepareForTestWithBootclasspathFragment,
838 prepareForTestWithArtApex,
839 prepareForTestWithMyapex,
840 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +0100841 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
842 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +0100843 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
844 // is disabled.
845 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Jihoon Kangcc9e2182023-10-16 23:13:33 +0000846 android.FixtureModifyConfig(func(config android.Config) {
847 config.SetBuildFromTextStub(false)
848 }),
Paul Duffin5cca7c42021-05-26 10:16:01 +0100849
850 java.PrepareForTestWithJavaSdkLibraryFiles,
851 java.FixtureWithLastReleaseApis("foo", "android-non-updatable"),
852 ).RunTestWithBp(t, `
853 java_sdk_library {
854 name: "android-non-updatable",
855 srcs: ["b.java"],
856 compile_dex: true,
857 public: {
858 enabled: true,
859 },
860 system: {
861 enabled: true,
862 },
863 test: {
864 enabled: true,
865 },
866 module_lib: {
867 enabled: true,
868 },
869 }
870
871 apex {
872 name: "com.android.art",
873 key: "com.android.art.key",
874 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +0100875 updatable: false,
876 }
877
878 apex_key {
879 name: "com.android.art.key",
880 public_key: "com.android.art.avbpubkey",
881 private_key: "com.android.art.pem",
882 }
883
884 java_library {
885 name: "baz",
886 apex_available: [
887 "com.android.art",
888 ],
889 srcs: ["b.java"],
890 compile_dex: true,
891 }
892
893 java_library {
894 name: "quuz",
895 apex_available: [
896 "com.android.art",
897 ],
898 srcs: ["b.java"],
899 compile_dex: true,
900 }
901
902 bootclasspath_fragment {
903 name: "art-bootclasspath-fragment",
904 image_name: "art",
905 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
906 contents: ["baz", "quuz"],
907 apex_available: [
908 "com.android.art",
909 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100910 hidden_api: {
911 split_packages: ["*"],
912 },
Paul Duffin5cca7c42021-05-26 10:16:01 +0100913 }
914
915 apex {
916 name: "myapex",
917 key: "myapex.key",
918 bootclasspath_fragments: [
919 "mybootclasspathfragment",
920 ],
921 updatable: false,
922 }
923
924 apex_key {
925 name: "myapex.key",
926 public_key: "testkey.avbpubkey",
927 private_key: "testkey.pem",
928 }
929
930 java_sdk_library {
931 name: "foo",
932 srcs: ["b.java"],
933 shared_library: false,
934 public: {enabled: true},
935 apex_available: [
936 "myapex",
937 ],
938 }
939
940 java_library {
941 name: "bar",
942 srcs: ["b.java"],
943 installable: true,
944 apex_available: [
945 "myapex",
946 ],
947 }
948
949 bootclasspath_fragment {
950 name: "mybootclasspathfragment",
951 contents: [
952 "foo",
953 "bar",
954 ],
955 apex_available: [
956 "myapex",
957 ],
958 additional_stubs: ["android-non-updatable"],
959 fragments: [
960 {
961 apex: "com.android.art",
962 module: "art-bootclasspath-fragment",
963 },
964 ],
Paul Duffin9fd56472022-03-31 15:42:30 +0100965 hidden_api: {
966 split_packages: ["*"],
967 },
Paul Duffin5cca7c42021-05-26 10:16:01 +0100968 }
969 `)
970
971 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
972 "android-non-updatable.stubs",
973 "android-non-updatable.stubs.module_lib",
974 "android-non-updatable.stubs.system",
975 "android-non-updatable.stubs.test",
976 "art-bootclasspath-fragment",
977 "bar",
978 "dex2oatd",
979 "foo",
980 })
981
982 nonUpdatablePublicStubs := getDexJarPath(result, "android-non-updatable.stubs")
983 nonUpdatableSystemStubs := getDexJarPath(result, "android-non-updatable.stubs.system")
984 nonUpdatableTestStubs := getDexJarPath(result, "android-non-updatable.stubs.test")
985 nonUpdatableModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.module_lib")
986
987 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
988 // API flags.
989 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
990
991 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
992 command := rule.RuleParams.Command
993 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
994
995 // Make sure that the module_lib non-updatable stubs are available for resolving references from
996 // the implementation boot dex jars provided by this module.
997 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
998
999 // Make sure that the appropriate non-updatable stubs are available for resolving references from
1000 // the different API stubs provided by this module.
1001 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
1002 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
1003 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
1004}
1005
Jihoon Kangcc9e2182023-10-16 23:13:33 +00001006func TestBootclasspathFragment_AndroidNonUpdatable_FromText(t *testing.T) {
1007 result := android.GroupFixturePreparers(
1008 prepareForTestWithBootclasspathFragment,
1009 prepareForTestWithArtApex,
1010 prepareForTestWithMyapex,
1011 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
1012 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
1013 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
1014 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1015 // is disabled.
1016 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1017 android.FixtureModifyConfig(func(config android.Config) {
1018 config.SetBuildFromTextStub(true)
1019 }),
1020
1021 java.PrepareForTestWithJavaSdkLibraryFiles,
1022 java.FixtureWithLastReleaseApis("foo", "android-non-updatable"),
1023 ).RunTestWithBp(t, `
1024 java_sdk_library {
1025 name: "android-non-updatable",
1026 srcs: ["b.java"],
1027 compile_dex: true,
1028 public: {
1029 enabled: true,
1030 },
1031 system: {
1032 enabled: true,
1033 },
1034 test: {
1035 enabled: true,
1036 },
1037 module_lib: {
1038 enabled: true,
1039 },
1040 }
1041
1042 apex {
1043 name: "com.android.art",
1044 key: "com.android.art.key",
1045 bootclasspath_fragments: ["art-bootclasspath-fragment"],
1046 updatable: false,
1047 }
1048
1049 apex_key {
1050 name: "com.android.art.key",
1051 public_key: "com.android.art.avbpubkey",
1052 private_key: "com.android.art.pem",
1053 }
1054
1055 java_library {
1056 name: "baz",
1057 apex_available: [
1058 "com.android.art",
1059 ],
1060 srcs: ["b.java"],
1061 compile_dex: true,
1062 }
1063
1064 java_library {
1065 name: "quuz",
1066 apex_available: [
1067 "com.android.art",
1068 ],
1069 srcs: ["b.java"],
1070 compile_dex: true,
1071 }
1072
1073 bootclasspath_fragment {
1074 name: "art-bootclasspath-fragment",
1075 image_name: "art",
1076 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
1077 contents: ["baz", "quuz"],
1078 apex_available: [
1079 "com.android.art",
1080 ],
1081 hidden_api: {
1082 split_packages: ["*"],
1083 },
1084 }
1085
1086 apex {
1087 name: "myapex",
1088 key: "myapex.key",
1089 bootclasspath_fragments: [
1090 "mybootclasspathfragment",
1091 ],
1092 updatable: false,
1093 }
1094
1095 apex_key {
1096 name: "myapex.key",
1097 public_key: "testkey.avbpubkey",
1098 private_key: "testkey.pem",
1099 }
1100
1101 java_sdk_library {
1102 name: "foo",
1103 srcs: ["b.java"],
1104 shared_library: false,
1105 public: {enabled: true},
1106 apex_available: [
1107 "myapex",
1108 ],
1109 }
1110
1111 java_library {
1112 name: "bar",
1113 srcs: ["b.java"],
1114 installable: true,
1115 apex_available: [
1116 "myapex",
1117 ],
1118 }
1119
1120 bootclasspath_fragment {
1121 name: "mybootclasspathfragment",
1122 contents: [
1123 "foo",
1124 "bar",
1125 ],
1126 apex_available: [
1127 "myapex",
1128 ],
1129 additional_stubs: ["android-non-updatable"],
1130 fragments: [
1131 {
1132 apex: "com.android.art",
1133 module: "art-bootclasspath-fragment",
1134 },
1135 ],
1136 hidden_api: {
1137 split_packages: ["*"],
1138 },
1139 }
1140 `)
1141
1142 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
1143 "android-non-updatable.stubs",
1144 "android-non-updatable.stubs.system",
1145 "android-non-updatable.stubs.test",
1146 "android-non-updatable.stubs.test_module_lib",
1147 "art-bootclasspath-fragment",
1148 "bar",
1149 "dex2oatd",
1150 "foo",
1151 })
1152
1153 nonUpdatableTestModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.test_module_lib")
1154
1155 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1156 // API flags.
1157 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1158
1159 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1160 command := rule.RuleParams.Command
1161 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1162
1163 // Make sure that the test_module_lib non-updatable stubs are available for resolving references from
1164 // the implementation boot dex jars provided by this module.
1165 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableTestModuleLibStubs)
1166}
1167
Paul Duffin5cca7c42021-05-26 10:16:01 +01001168// TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks checks to make sure that
1169// setting additional_stubs: ["android-non-updatable"] causes the prebuilt android-non-updatable
1170// modules to be added to the hiddenapi list tool.
1171func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *testing.T) {
1172 result := android.GroupFixturePreparers(
1173 prepareForTestWithBootclasspathFragment,
Jiakai Zhangb95998b2023-05-11 16:39:27 +01001174 java.PrepareForTestWithDexpreopt,
Paul Duffin5cca7c42021-05-26 10:16:01 +01001175 prepareForTestWithArtApex,
1176 prepareForTestWithMyapex,
1177 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
satayevabcd5972021-08-06 17:49:46 +01001178 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"),
1179 java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
Paul Duffin5cca7c42021-05-26 10:16:01 +01001180 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
1181 // is disabled.
1182 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
1183
1184 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1185 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
1186 }),
1187
1188 java.PrepareForTestWithJavaSdkLibraryFiles,
1189 java.FixtureWithPrebuiltApis(map[string][]string{
1190 "current": {"android-non-updatable"},
1191 "30": {"foo"},
1192 }),
1193 ).RunTestWithBp(t, `
1194 apex {
1195 name: "com.android.art",
1196 key: "com.android.art.key",
1197 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin5cca7c42021-05-26 10:16:01 +01001198 updatable: false,
1199 }
1200
1201 apex_key {
1202 name: "com.android.art.key",
1203 public_key: "com.android.art.avbpubkey",
1204 private_key: "com.android.art.pem",
1205 }
1206
1207 java_library {
1208 name: "baz",
1209 apex_available: [
1210 "com.android.art",
1211 ],
1212 srcs: ["b.java"],
1213 compile_dex: true,
1214 }
1215
1216 java_library {
1217 name: "quuz",
1218 apex_available: [
1219 "com.android.art",
1220 ],
1221 srcs: ["b.java"],
1222 compile_dex: true,
1223 }
1224
1225 bootclasspath_fragment {
1226 name: "art-bootclasspath-fragment",
1227 image_name: "art",
1228 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
1229 contents: ["baz", "quuz"],
1230 apex_available: [
1231 "com.android.art",
1232 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001233 hidden_api: {
1234 split_packages: ["*"],
1235 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001236 }
1237
1238 apex {
1239 name: "myapex",
1240 key: "myapex.key",
1241 bootclasspath_fragments: [
1242 "mybootclasspathfragment",
1243 ],
1244 updatable: false,
1245 }
1246
1247 apex_key {
1248 name: "myapex.key",
1249 public_key: "testkey.avbpubkey",
1250 private_key: "testkey.pem",
1251 }
1252
1253 java_sdk_library {
1254 name: "foo",
1255 srcs: ["b.java"],
1256 shared_library: false,
1257 public: {enabled: true},
1258 apex_available: [
1259 "myapex",
1260 ],
1261 }
1262
1263 java_library {
1264 name: "bar",
1265 srcs: ["b.java"],
1266 installable: true,
1267 apex_available: [
1268 "myapex",
1269 ],
1270 }
1271
1272 bootclasspath_fragment {
1273 name: "mybootclasspathfragment",
1274 contents: [
1275 "foo",
1276 "bar",
1277 ],
1278 apex_available: [
1279 "myapex",
1280 ],
1281 additional_stubs: ["android-non-updatable"],
1282 fragments: [
1283 {
1284 apex: "com.android.art",
1285 module: "art-bootclasspath-fragment",
1286 },
1287 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01001288 hidden_api: {
1289 split_packages: ["*"],
1290 },
Paul Duffin5cca7c42021-05-26 10:16:01 +01001291 }
1292 `)
1293
1294 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
1295 "art-bootclasspath-fragment",
1296 "bar",
1297 "dex2oatd",
1298 "foo",
1299 "prebuilt_sdk_module-lib_current_android-non-updatable",
1300 "prebuilt_sdk_public_current_android-non-updatable",
1301 "prebuilt_sdk_system_current_android-non-updatable",
1302 "prebuilt_sdk_test_current_android-non-updatable",
1303 })
1304
1305 nonUpdatablePublicStubs := getDexJarPath(result, "sdk_public_current_android-non-updatable")
1306 nonUpdatableSystemStubs := getDexJarPath(result, "sdk_system_current_android-non-updatable")
1307 nonUpdatableTestStubs := getDexJarPath(result, "sdk_test_current_android-non-updatable")
1308 nonUpdatableModuleLibStubs := getDexJarPath(result, "sdk_module-lib_current_android-non-updatable")
1309
1310 // Make sure that the fragment uses the android-non-updatable modules when generating the hidden
1311 // API flags.
1312 fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
1313
1314 rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
1315 command := rule.RuleParams.Command
1316 android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list")
1317
1318 // Make sure that the module_lib non-updatable stubs are available for resolving references from
1319 // the implementation boot dex jars provided by this module.
1320 android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs)
1321
1322 // Make sure that the appropriate non-updatable stubs are available for resolving references from
1323 // the different API stubs provided by this module.
1324 android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs)
1325 android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs)
1326 android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs)
1327}
1328
Paul Duffina1d60252021-01-21 18:13:43 +00001329// TODO(b/177892522) - add test for host apex.