blob: 84cf9c4996bc14ed12c054a134a78ba34857d9df [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"
Paul Duffina1d60252021-01-21 18:13:43 +000019 "strings"
Paul Duffin3451e162021-01-20 15:16:56 +000020 "testing"
21
22 "android/soong/android"
Paul Duffin3451e162021-01-20 15:16:56 +000023 "android/soong/java"
24)
25
Paul Duffin7771eba2021-04-23 14:25:28 +010026// Contains tests for bootclasspath_fragment logic from java/bootclasspath_fragment.go as the ART
27// bootclasspath_fragment requires modules from the ART apex.
Paul Duffin3451e162021-01-20 15:16:56 +000028
Paul Duffin94f19632021-04-20 12:40:07 +010029var prepareForTestWithBootclasspathFragment = android.GroupFixturePreparers(
Paul Duffin52bfaa42021-03-23 23:40:12 +000030 java.PrepareForTestWithDexpreopt,
31 PrepareForTestWithApexBuildComponents,
32)
33
34// Some additional files needed for the art apex.
35var prepareForTestWithArtApex = android.FixtureMergeMockFs(android.MockFS{
36 "com.android.art.avbpubkey": nil,
37 "com.android.art.pem": nil,
38 "system/sepolicy/apex/com.android.art-file_contexts": nil,
39})
40
Paul Duffin94f19632021-04-20 12:40:07 +010041func TestBootclasspathFragments(t *testing.T) {
Paul Duffin52bfaa42021-03-23 23:40:12 +000042 result := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +010043 prepareForTestWithBootclasspathFragment,
Paul Duffin7771eba2021-04-23 14:25:28 +010044 // Configure some libraries in the art bootclasspath_fragment and platform_bootclasspath.
Paul Duffin60264a02021-04-12 20:02:36 +010045 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz", "platform:foo", "platform:bar"),
Paul Duffin52bfaa42021-03-23 23:40:12 +000046 prepareForTestWithArtApex,
47
48 java.PrepareForTestWithJavaSdkLibraryFiles,
49 java.FixtureWithLastReleaseApis("foo"),
Paul Duffin34d433a2021-03-09 14:13:25 +000050 ).RunTestWithBp(t, `
Paul Duffin3451e162021-01-20 15:16:56 +000051 java_sdk_library {
52 name: "foo",
53 srcs: ["b.java"],
Paul Duffin3451e162021-01-20 15:16:56 +000054 }
55
56 java_library {
57 name: "bar",
58 srcs: ["b.java"],
59 installable: true,
60 }
61
62 apex {
63 name: "com.android.art",
64 key: "com.android.art.key",
Paul Duffin58e0e762021-05-21 19:27:58 +010065 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin3451e162021-01-20 15:16:56 +000066 java_libs: [
67 "baz",
68 "quuz",
69 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +000070 updatable: false,
Paul Duffin3451e162021-01-20 15:16:56 +000071 }
72
73 apex_key {
74 name: "com.android.art.key",
75 public_key: "com.android.art.avbpubkey",
76 private_key: "com.android.art.pem",
77 }
78
79 java_library {
80 name: "baz",
81 apex_available: [
82 "com.android.art",
83 ],
84 srcs: ["b.java"],
85 }
86
87 java_library {
88 name: "quuz",
89 apex_available: [
90 "com.android.art",
91 ],
92 srcs: ["b.java"],
93 }
Paul Duffin5bbfef82021-01-30 12:57:26 +000094
Paul Duffin94f19632021-04-20 12:40:07 +010095 bootclasspath_fragment {
96 name: "art-bootclasspath-fragment",
Paul Duffin5bbfef82021-01-30 12:57:26 +000097 image_name: "art",
Paul Duffinf23bc472021-04-27 12:42:20 +010098 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
99 contents: ["baz", "quuz"],
Paul Duffinc7ef9892021-03-23 23:21:59 +0000100 apex_available: [
101 "com.android.art",
102 ],
Paul Duffin5bbfef82021-01-30 12:57:26 +0000103 }
Paul Duffin3451e162021-01-20 15:16:56 +0000104`,
Paul Duffin3451e162021-01-20 15:16:56 +0000105 )
106
Paul Duffin94f19632021-04-20 12:40:07 +0100107 // Make sure that the art-bootclasspath-fragment is using the correct configuration.
Paul Duffin58e0e762021-05-21 19:27:58 +0100108 checkBootclasspathFragment(t, result, "art-bootclasspath-fragment", "android_common_apex10000",
109 "com.android.art:baz,com.android.art:quuz", `
Paul Duffina1d60252021-01-21 18:13:43 +0000110test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.art
111test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.oat
112test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.vdex
113test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-quuz.art
114test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-quuz.oat
115test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-quuz.vdex
116test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.art
117test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.oat
118test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.vdex
119test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-quuz.art
120test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-quuz.oat
121test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-quuz.vdex
122`)
Paul Duffin3451e162021-01-20 15:16:56 +0000123}
124
Paul Duffinf1b358c2021-05-17 07:38:47 +0100125func TestBootclasspathFragments_FragmentDependency(t *testing.T) {
126 result := android.GroupFixturePreparers(
127 prepareForTestWithBootclasspathFragment,
128 // Configure some libraries in the art bootclasspath_fragment and platform_bootclasspath.
129 java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz", "platform:foo", "platform:bar"),
130 prepareForTestWithArtApex,
131
132 java.PrepareForTestWithJavaSdkLibraryFiles,
133 java.FixtureWithLastReleaseApis("foo", "baz"),
134 ).RunTestWithBp(t, `
135 java_sdk_library {
136 name: "foo",
137 srcs: ["b.java"],
138 shared_library: false,
139 public: {
140 enabled: true,
141 },
142 system: {
143 enabled: true,
144 },
145 }
146
147 java_library {
148 name: "bar",
149 srcs: ["b.java"],
150 installable: true,
151 }
152
153 apex {
154 name: "com.android.art",
155 key: "com.android.art.key",
156 bootclasspath_fragments: ["art-bootclasspath-fragment"],
157 updatable: false,
158 }
159
160 apex_key {
161 name: "com.android.art.key",
162 public_key: "com.android.art.avbpubkey",
163 private_key: "com.android.art.pem",
164 }
165
166 java_sdk_library {
167 name: "baz",
168 apex_available: [
169 "com.android.art",
170 ],
171 srcs: ["b.java"],
172 shared_library: false,
173 public: {
174 enabled: true,
175 },
176 system: {
177 enabled: true,
178 },
179 test: {
180 enabled: true,
181 },
182 }
183
184 java_library {
185 name: "quuz",
186 apex_available: [
187 "com.android.art",
188 ],
189 srcs: ["b.java"],
190 compile_dex: true,
191 }
192
193 bootclasspath_fragment {
194 name: "art-bootclasspath-fragment",
195 image_name: "art",
196 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
197 contents: ["baz", "quuz"],
198 apex_available: [
199 "com.android.art",
200 ],
201 }
202
203 bootclasspath_fragment {
204 name: "other-bootclasspath-fragment",
205 contents: ["foo", "bar"],
206 fragments: [
207 {
208 apex: "com.android.art",
209 module: "art-bootclasspath-fragment",
210 },
211 ],
212 }
213`,
214 )
215
216 checkSdkKindStubs := func(message string, info java.HiddenAPIInfo, kind android.SdkKind, expectedPaths ...string) {
217 t.Helper()
218 android.AssertPathsRelativeToTopEquals(t, fmt.Sprintf("%s %s", message, kind), expectedPaths, info.TransitiveStubDexJarsByKind[kind])
219 }
220
221 // Check stub dex paths exported by art.
222 artFragment := result.Module("art-bootclasspath-fragment", "android_common")
223 artInfo := result.ModuleProvider(artFragment, java.HiddenAPIInfoProvider).(java.HiddenAPIInfo)
224
225 bazPublicStubs := "out/soong/.intermediates/baz.stubs/android_common/dex/baz.stubs.jar"
226 bazSystemStubs := "out/soong/.intermediates/baz.stubs.system/android_common/dex/baz.stubs.system.jar"
227 bazTestStubs := "out/soong/.intermediates/baz.stubs.test/android_common/dex/baz.stubs.test.jar"
228
229 checkSdkKindStubs("art", artInfo, android.SdkPublic, bazPublicStubs)
230 checkSdkKindStubs("art", artInfo, android.SdkSystem, bazSystemStubs)
231 checkSdkKindStubs("art", artInfo, android.SdkTest, bazTestStubs)
232 checkSdkKindStubs("art", artInfo, android.SdkCorePlatform)
233
234 // Check stub dex paths exported by other.
235 otherFragment := result.Module("other-bootclasspath-fragment", "android_common")
236 otherInfo := result.ModuleProvider(otherFragment, java.HiddenAPIInfoProvider).(java.HiddenAPIInfo)
237
238 fooPublicStubs := "out/soong/.intermediates/foo.stubs/android_common/dex/foo.stubs.jar"
239 fooSystemStubs := "out/soong/.intermediates/foo.stubs.system/android_common/dex/foo.stubs.system.jar"
240
241 checkSdkKindStubs("other", otherInfo, android.SdkPublic, bazPublicStubs, fooPublicStubs)
242 checkSdkKindStubs("other", otherInfo, android.SdkSystem, bazSystemStubs, fooSystemStubs)
243 checkSdkKindStubs("other", otherInfo, android.SdkTest, bazTestStubs, fooSystemStubs)
244 checkSdkKindStubs("other", otherInfo, android.SdkCorePlatform)
245}
246
Paul Duffin58e0e762021-05-21 19:27:58 +0100247func checkBootclasspathFragment(t *testing.T, result *android.TestResult, moduleName, variantName string, expectedConfiguredModules string, expectedBootclasspathFragmentFiles string) {
Paul Duffin3451e162021-01-20 15:16:56 +0000248 t.Helper()
249
Paul Duffin58e0e762021-05-21 19:27:58 +0100250 bootclasspathFragment := result.ModuleForTests(moduleName, variantName).Module().(*java.BootclasspathFragmentModule)
Paul Duffin3451e162021-01-20 15:16:56 +0000251
Paul Duffine946b322021-04-25 23:04:00 +0100252 bootclasspathFragmentInfo := result.ModuleProvider(bootclasspathFragment, java.BootclasspathFragmentApexContentInfoProvider).(java.BootclasspathFragmentApexContentInfo)
253 modules := bootclasspathFragmentInfo.Modules()
Paul Duffin34d433a2021-03-09 14:13:25 +0000254 android.AssertStringEquals(t, "invalid modules for "+moduleName, expectedConfiguredModules, modules.String())
Paul Duffina1d60252021-01-21 18:13:43 +0000255
256 // Get a list of all the paths in the boot image sorted by arch type.
257 allPaths := []string{}
Paul Duffine946b322021-04-25 23:04:00 +0100258 bootImageFilesByArchType := bootclasspathFragmentInfo.AndroidBootImageFilesByArchType()
Paul Duffina1d60252021-01-21 18:13:43 +0000259 for _, archType := range android.ArchTypeList() {
260 if paths, ok := bootImageFilesByArchType[archType]; ok {
261 for _, path := range paths {
262 allPaths = append(allPaths, android.NormalizePathForTesting(path))
263 }
264 }
265 }
Paul Duffin3451e162021-01-20 15:16:56 +0000266
Paul Duffin94f19632021-04-20 12:40:07 +0100267 android.AssertTrimmedStringEquals(t, "invalid paths for "+moduleName, expectedBootclasspathFragmentFiles, strings.Join(allPaths, "\n"))
Paul Duffin3451e162021-01-20 15:16:56 +0000268}
Paul Duffina1d60252021-01-21 18:13:43 +0000269
Paul Duffin94f19632021-04-20 12:40:07 +0100270func TestBootclasspathFragmentInArtApex(t *testing.T) {
Paul Duffinba6afd02019-11-19 19:44:10 +0000271 commonPreparer := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100272 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000273 prepareForTestWithArtApex,
274
Paul Duffinba6afd02019-11-19 19:44:10 +0000275 android.FixtureWithRootAndroidBp(`
Paul Duffina1d60252021-01-21 18:13:43 +0000276 apex {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000277 name: "com.android.art",
278 key: "com.android.art.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100279 bootclasspath_fragments: [
280 "mybootclasspathfragment",
Paul Duffina1d60252021-01-21 18:13:43 +0000281 ],
Paul Duffin4d101b62021-03-24 15:42:20 +0000282 // bar (like foo) should be transitively included in this apex because it is part of the
Paul Duffin7771eba2021-04-23 14:25:28 +0100283 // mybootclasspathfragment bootclasspath_fragment. However, it is kept here to ensure that the
284 // apex dedups the files correctly.
Paul Duffin9ea71c02021-03-23 22:53:07 +0000285 java_libs: [
Paul Duffin9ea71c02021-03-23 22:53:07 +0000286 "bar",
287 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000288 updatable: false,
Paul Duffina1d60252021-01-21 18:13:43 +0000289 }
290
291 apex_key {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000292 name: "com.android.art.key",
Paul Duffina1d60252021-01-21 18:13:43 +0000293 public_key: "testkey.avbpubkey",
294 private_key: "testkey.pem",
295 }
296
297 java_library {
298 name: "foo",
299 srcs: ["b.java"],
300 installable: true,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000301 apex_available: [
302 "com.android.art",
303 ],
Paul Duffina1d60252021-01-21 18:13:43 +0000304 }
305
306 java_library {
307 name: "bar",
308 srcs: ["b.java"],
309 installable: true,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000310 apex_available: [
311 "com.android.art",
312 ],
Paul Duffina1d60252021-01-21 18:13:43 +0000313 }
314
Paul Duffin65898052021-04-20 22:47:03 +0100315 java_import {
316 name: "foo",
317 jars: ["foo.jar"],
318 apex_available: [
319 "com.android.art",
320 ],
321 }
322
323 java_import {
324 name: "bar",
325 jars: ["bar.jar"],
326 apex_available: [
327 "com.android.art",
328 ],
329 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000330 `),
331 )
Paul Duffin65898052021-04-20 22:47:03 +0100332
Paul Duffinba6afd02019-11-19 19:44:10 +0000333 contentsInsert := func(contents []string) string {
334 insert := ""
335 if contents != nil {
336 insert = fmt.Sprintf(`contents: ["%s"],`, strings.Join(contents, `", "`))
Paul Duffin396229f2021-03-18 18:30:31 +0000337 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000338 return insert
339 }
Paul Duffina1d60252021-01-21 18:13:43 +0000340
Paul Duffinba6afd02019-11-19 19:44:10 +0000341 addSource := func(contents ...string) android.FixturePreparer {
342 text := fmt.Sprintf(`
343 bootclasspath_fragment {
344 name: "mybootclasspathfragment",
345 image_name: "art",
346 %s
347 apex_available: [
348 "com.android.art",
349 ],
350 }
351 `, contentsInsert(contents))
352
353 return android.FixtureAddTextFile("art/build/boot/Android.bp", text)
354 }
355
356 addPrebuilt := func(prefer bool, contents ...string) android.FixturePreparer {
357 text := fmt.Sprintf(`
358 prebuilt_bootclasspath_fragment {
359 name: "mybootclasspathfragment",
360 image_name: "art",
361 %s
362 prefer: %t,
363 apex_available: [
364 "com.android.art",
365 ],
366 }
367 `, contentsInsert(contents), prefer)
368 return android.FixtureAddTextFile("prebuilts/module_sdk/art/Android.bp", text)
369 }
370
371 t.Run("boot image files", func(t *testing.T) {
372 result := android.GroupFixturePreparers(
373 commonPreparer,
374
375 // Configure some libraries in the art bootclasspath_fragment that match the source
376 // bootclasspath_fragment's contents property.
377 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
378 addSource("foo", "bar"),
379
380 // Make sure that a preferred prebuilt with consistent contents doesn't affect the apex.
381 addPrebuilt(true, "foo", "bar"),
382 ).RunTest(t)
383
384 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art_image", []string{
satayev3db35472021-05-06 23:59:58 +0100385 "etc/classpaths/mybootclasspathfragment.pb",
Paul Duffinba6afd02019-11-19 19:44:10 +0000386 "javalib/arm/boot.art",
387 "javalib/arm/boot.oat",
388 "javalib/arm/boot.vdex",
389 "javalib/arm/boot-bar.art",
390 "javalib/arm/boot-bar.oat",
391 "javalib/arm/boot-bar.vdex",
392 "javalib/arm64/boot.art",
393 "javalib/arm64/boot.oat",
394 "javalib/arm64/boot.vdex",
395 "javalib/arm64/boot-bar.art",
396 "javalib/arm64/boot-bar.oat",
397 "javalib/arm64/boot-bar.vdex",
398 "javalib/bar.jar",
399 "javalib/foo.jar",
400 })
401
402 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art_image", []string{
403 `bar`,
404 `com.android.art.key`,
405 `mybootclasspathfragment`,
406 })
Paul Duffina1d60252021-01-21 18:13:43 +0000407 })
Paul Duffin396229f2021-03-18 18:30:31 +0000408
Paul Duffinba6afd02019-11-19 19:44:10 +0000409 t.Run("source with inconsistency between config and contents", func(t *testing.T) {
410 android.GroupFixturePreparers(
411 commonPreparer,
412
413 // Create an inconsistency between the ArtApexJars configuration and the art source
414 // bootclasspath_fragment module's contents property.
415 java.FixtureConfigureBootJars("com.android.art:foo"),
416 addSource("foo", "bar"),
417 ).
418 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
419 RunTest(t)
420 })
421
422 t.Run("prebuilt with inconsistency between config and contents", func(t *testing.T) {
423 android.GroupFixturePreparers(
424 commonPreparer,
425
426 // Create an inconsistency between the ArtApexJars configuration and the art
427 // prebuilt_bootclasspath_fragment module's contents property.
428 java.FixtureConfigureBootJars("com.android.art:foo"),
429 addPrebuilt(false, "foo", "bar"),
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("preferred 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(true, "foo", "bar"),
443
444 // Source contents property is consistent with the config.
445 addSource("foo"),
446 ).
447 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
448 RunTest(t)
449 })
450
451 t.Run("source preferred and prebuilt with inconsistency between config and contents", func(t *testing.T) {
452 android.GroupFixturePreparers(
453 commonPreparer,
454
455 // Create an inconsistency between the ArtApexJars configuration and the art
456 // prebuilt_bootclasspath_fragment module's contents property.
457 java.FixtureConfigureBootJars("com.android.art:foo"),
458 addPrebuilt(false, "foo", "bar"),
459
460 // Source contents property is consistent with the config.
461 addSource("foo"),
462
463 // This should pass because while the prebuilt is inconsistent with the configuration it is
464 // not actually used.
465 ).RunTest(t)
Paul Duffin396229f2021-03-18 18:30:31 +0000466 })
Paul Duffina1d60252021-01-21 18:13:43 +0000467}
468
Paul Duffin94f19632021-04-20 12:40:07 +0100469func TestBootclasspathFragmentInPrebuiltArtApex(t *testing.T) {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000470 result := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100471 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000472 prepareForTestWithArtApex,
473
474 android.FixtureMergeMockFs(android.MockFS{
475 "com.android.art-arm64.apex": nil,
476 "com.android.art-arm.apex": nil,
477 }),
478
Paul Duffin7771eba2021-04-23 14:25:28 +0100479 // Configure some libraries in the art bootclasspath_fragment.
Paul Duffin60264a02021-04-12 20:02:36 +0100480 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Paul Duffin9ea71c02021-03-23 22:53:07 +0000481 ).RunTestWithBp(t, `
482 prebuilt_apex {
483 name: "com.android.art",
484 arch: {
485 arm64: {
486 src: "com.android.art-arm64.apex",
487 },
488 arm: {
489 src: "com.android.art-arm.apex",
490 },
491 },
492 exported_java_libs: ["foo", "bar"],
493 }
494
495 java_import {
496 name: "foo",
497 jars: ["foo.jar"],
498 apex_available: [
499 "com.android.art",
500 ],
501 }
502
503 java_import {
504 name: "bar",
505 jars: ["bar.jar"],
506 apex_available: [
507 "com.android.art",
508 ],
509 }
510
Paul Duffin7771eba2021-04-23 14:25:28 +0100511 prebuilt_bootclasspath_fragment {
Paul Duffin94f19632021-04-20 12:40:07 +0100512 name: "mybootclasspathfragment",
Paul Duffin9ea71c02021-03-23 22:53:07 +0000513 image_name: "art",
Paul Duffinf23bc472021-04-27 12:42:20 +0100514 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
515 contents: ["foo", "bar"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000516 apex_available: [
517 "com.android.art",
518 ],
519 }
520 `)
521
522 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common", []string{
Paul Duffin11216db2021-03-01 14:14:52 +0000523 `com.android.art.apex.selector`,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000524 `prebuilt_bar`,
525 `prebuilt_foo`,
526 })
527
Paul Duffin94f19632021-04-20 12:40:07 +0100528 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common", []string{
Paul Duffin9ea71c02021-03-23 22:53:07 +0000529 `dex2oatd`,
Paul Duffinc7ef9892021-03-23 23:21:59 +0000530 `prebuilt_bar`,
531 `prebuilt_foo`,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000532 })
533}
534
Paul Duffin94f19632021-04-20 12:40:07 +0100535func TestBootclasspathFragmentContentsNoName(t *testing.T) {
Paul Duffin82886d62021-03-24 01:34:57 +0000536 result := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100537 prepareForTestWithBootclasspathFragment,
Paul Duffin82886d62021-03-24 01:34:57 +0000538 prepareForTestWithMyapex,
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100539 // Configure bootclasspath jars to ensure that hidden API encoding is performed on them.
540 java.FixtureConfigureBootJars("myapex:foo", "myapex:bar"),
541 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
542 // is disabled.
543 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
544
545 java.PrepareForTestWithJavaSdkLibraryFiles,
546 java.FixtureWithLastReleaseApis("foo"),
Paul Duffin82886d62021-03-24 01:34:57 +0000547 ).RunTestWithBp(t, `
548 apex {
549 name: "myapex",
550 key: "myapex.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100551 bootclasspath_fragments: [
552 "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000553 ],
554 updatable: false,
555 }
556
557 apex_key {
558 name: "myapex.key",
559 public_key: "testkey.avbpubkey",
560 private_key: "testkey.pem",
561 }
562
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100563 java_sdk_library {
Paul Duffin82886d62021-03-24 01:34:57 +0000564 name: "foo",
565 srcs: ["b.java"],
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100566 shared_library: false,
567 public: {enabled: true},
Paul Duffin82886d62021-03-24 01:34:57 +0000568 apex_available: [
569 "myapex",
570 ],
571 }
572
573 java_library {
574 name: "bar",
575 srcs: ["b.java"],
576 installable: true,
577 apex_available: [
578 "myapex",
579 ],
580 }
581
Paul Duffin7771eba2021-04-23 14:25:28 +0100582 bootclasspath_fragment {
Paul Duffin94f19632021-04-20 12:40:07 +0100583 name: "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000584 contents: [
585 "foo",
586 "bar",
587 ],
588 apex_available: [
589 "myapex",
590 ],
591 }
592 `)
593
Paul Duffin4d101b62021-03-24 15:42:20 +0000594 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
595 // This does not include art, oat or vdex files as they are only included for the art boot
596 // image.
satayev3db35472021-05-06 23:59:58 +0100597 "etc/classpaths/mybootclasspathfragment.pb",
Paul Duffin4d101b62021-03-24 15:42:20 +0000598 "javalib/bar.jar",
599 "javalib/foo.jar",
600 })
Paul Duffin82886d62021-03-24 01:34:57 +0000601
602 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
603 `myapex.key`,
Paul Duffin94f19632021-04-20 12:40:07 +0100604 `mybootclasspathfragment`,
Paul Duffin82886d62021-03-24 01:34:57 +0000605 })
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100606
607 apex := result.ModuleForTests("myapex", "android_common_myapex_image")
608 apexRule := apex.Rule("apexRule")
609 copyCommands := apexRule.Args["copy_commands"]
610
611 // Make sure that the fragment provides the hidden API encoded dex jars to the APEX.
612 fragment := result.Module("mybootclasspathfragment", "android_common_apex10000")
613
614 info := result.ModuleProvider(fragment, java.BootclasspathFragmentApexContentInfoProvider).(java.BootclasspathFragmentApexContentInfo)
615
616 checkFragmentExportedDexJar := func(name string, expectedDexJar string) {
617 module := result.Module(name, "android_common_apex10000")
Paul Duffin1a8010a2021-05-15 12:39:23 +0100618 dexJar, err := info.DexBootJarPathForContentModule(module)
619 if err != nil {
620 t.Error(err)
621 }
Paul Duffinf2fa0b52021-05-14 18:21:45 +0100622 android.AssertPathRelativeToTopEquals(t, name+" dex", expectedDexJar, dexJar)
623
624 expectedCopyCommand := fmt.Sprintf("&& cp -f %s out/soong/.intermediates/myapex/android_common_myapex_image/image.apex/javalib/%s.jar", expectedDexJar, name)
625 android.AssertStringDoesContain(t, name+" apex copy command", copyCommands, expectedCopyCommand)
626 }
627
Paul Duffin54c98f52021-05-15 08:54:30 +0100628 checkFragmentExportedDexJar("foo", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/foo.jar")
629 checkFragmentExportedDexJar("bar", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/bar.jar")
Paul Duffin82886d62021-03-24 01:34:57 +0000630}
631
Paul Duffina1d60252021-01-21 18:13:43 +0000632// TODO(b/177892522) - add test for host apex.