blob: e2b320ca034f1efae902dee62ba01c3b9c9831bb [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",
65 java_libs: [
66 "baz",
67 "quuz",
68 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +000069 updatable: false,
Paul Duffin3451e162021-01-20 15:16:56 +000070 }
71
72 apex_key {
73 name: "com.android.art.key",
74 public_key: "com.android.art.avbpubkey",
75 private_key: "com.android.art.pem",
76 }
77
78 java_library {
79 name: "baz",
80 apex_available: [
81 "com.android.art",
82 ],
83 srcs: ["b.java"],
84 }
85
86 java_library {
87 name: "quuz",
88 apex_available: [
89 "com.android.art",
90 ],
91 srcs: ["b.java"],
92 }
Paul Duffin5bbfef82021-01-30 12:57:26 +000093
Paul Duffin94f19632021-04-20 12:40:07 +010094 bootclasspath_fragment {
95 name: "art-bootclasspath-fragment",
Paul Duffin5bbfef82021-01-30 12:57:26 +000096 image_name: "art",
Paul Duffinf23bc472021-04-27 12:42:20 +010097 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
98 contents: ["baz", "quuz"],
Paul Duffinc7ef9892021-03-23 23:21:59 +000099 apex_available: [
100 "com.android.art",
101 ],
Paul Duffin5bbfef82021-01-30 12:57:26 +0000102 }
103
Paul Duffin94f19632021-04-20 12:40:07 +0100104 bootclasspath_fragment {
105 name: "framework-bootclasspath-fragment",
Paul Duffin5bbfef82021-01-30 12:57:26 +0000106 image_name: "boot",
107 }
Paul Duffin3451e162021-01-20 15:16:56 +0000108`,
Paul Duffin3451e162021-01-20 15:16:56 +0000109 )
110
Paul Duffin94f19632021-04-20 12:40:07 +0100111 // Make sure that the framework-bootclasspath-fragment is using the correct configuration.
112 checkBootclasspathFragment(t, result, "framework-bootclasspath-fragment", "platform:foo,platform:bar", `
Paul Duffina1d60252021-01-21 18:13:43 +0000113test_device/dex_bootjars/android/system/framework/arm/boot-foo.art
114test_device/dex_bootjars/android/system/framework/arm/boot-foo.oat
115test_device/dex_bootjars/android/system/framework/arm/boot-foo.vdex
116test_device/dex_bootjars/android/system/framework/arm/boot-bar.art
117test_device/dex_bootjars/android/system/framework/arm/boot-bar.oat
118test_device/dex_bootjars/android/system/framework/arm/boot-bar.vdex
119test_device/dex_bootjars/android/system/framework/arm64/boot-foo.art
120test_device/dex_bootjars/android/system/framework/arm64/boot-foo.oat
121test_device/dex_bootjars/android/system/framework/arm64/boot-foo.vdex
122test_device/dex_bootjars/android/system/framework/arm64/boot-bar.art
123test_device/dex_bootjars/android/system/framework/arm64/boot-bar.oat
124test_device/dex_bootjars/android/system/framework/arm64/boot-bar.vdex
125`)
Paul Duffin3451e162021-01-20 15:16:56 +0000126
Paul Duffin94f19632021-04-20 12:40:07 +0100127 // Make sure that the art-bootclasspath-fragment is using the correct configuration.
128 checkBootclasspathFragment(t, result, "art-bootclasspath-fragment", "com.android.art:baz,com.android.art:quuz", `
Paul Duffina1d60252021-01-21 18:13:43 +0000129test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.art
130test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.oat
131test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.vdex
132test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-quuz.art
133test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-quuz.oat
134test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-quuz.vdex
135test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.art
136test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.oat
137test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.vdex
138test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-quuz.art
139test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-quuz.oat
140test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-quuz.vdex
141`)
Paul Duffin3451e162021-01-20 15:16:56 +0000142}
143
Paul Duffin94f19632021-04-20 12:40:07 +0100144func checkBootclasspathFragment(t *testing.T, result *android.TestResult, moduleName string, expectedConfiguredModules string, expectedBootclasspathFragmentFiles string) {
Paul Duffin3451e162021-01-20 15:16:56 +0000145 t.Helper()
146
Paul Duffin7771eba2021-04-23 14:25:28 +0100147 bootclasspathFragment := result.ModuleForTests(moduleName, "android_common").Module().(*java.BootclasspathFragmentModule)
Paul Duffin3451e162021-01-20 15:16:56 +0000148
Paul Duffine946b322021-04-25 23:04:00 +0100149 bootclasspathFragmentInfo := result.ModuleProvider(bootclasspathFragment, java.BootclasspathFragmentApexContentInfoProvider).(java.BootclasspathFragmentApexContentInfo)
150 modules := bootclasspathFragmentInfo.Modules()
Paul Duffin34d433a2021-03-09 14:13:25 +0000151 android.AssertStringEquals(t, "invalid modules for "+moduleName, expectedConfiguredModules, modules.String())
Paul Duffina1d60252021-01-21 18:13:43 +0000152
153 // Get a list of all the paths in the boot image sorted by arch type.
154 allPaths := []string{}
Paul Duffine946b322021-04-25 23:04:00 +0100155 bootImageFilesByArchType := bootclasspathFragmentInfo.AndroidBootImageFilesByArchType()
Paul Duffina1d60252021-01-21 18:13:43 +0000156 for _, archType := range android.ArchTypeList() {
157 if paths, ok := bootImageFilesByArchType[archType]; ok {
158 for _, path := range paths {
159 allPaths = append(allPaths, android.NormalizePathForTesting(path))
160 }
161 }
162 }
Paul Duffin3451e162021-01-20 15:16:56 +0000163
Paul Duffin94f19632021-04-20 12:40:07 +0100164 android.AssertTrimmedStringEquals(t, "invalid paths for "+moduleName, expectedBootclasspathFragmentFiles, strings.Join(allPaths, "\n"))
Paul Duffin3451e162021-01-20 15:16:56 +0000165}
Paul Duffina1d60252021-01-21 18:13:43 +0000166
Paul Duffin94f19632021-04-20 12:40:07 +0100167func TestBootclasspathFragmentInArtApex(t *testing.T) {
Paul Duffinba6afd02019-11-19 19:44:10 +0000168 commonPreparer := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100169 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000170 prepareForTestWithArtApex,
171
Paul Duffinba6afd02019-11-19 19:44:10 +0000172 android.FixtureWithRootAndroidBp(`
Paul Duffina1d60252021-01-21 18:13:43 +0000173 apex {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000174 name: "com.android.art",
175 key: "com.android.art.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100176 bootclasspath_fragments: [
177 "mybootclasspathfragment",
Paul Duffina1d60252021-01-21 18:13:43 +0000178 ],
Paul Duffin4d101b62021-03-24 15:42:20 +0000179 // bar (like foo) should be transitively included in this apex because it is part of the
Paul Duffin7771eba2021-04-23 14:25:28 +0100180 // mybootclasspathfragment bootclasspath_fragment. However, it is kept here to ensure that the
181 // apex dedups the files correctly.
Paul Duffin9ea71c02021-03-23 22:53:07 +0000182 java_libs: [
Paul Duffin9ea71c02021-03-23 22:53:07 +0000183 "bar",
184 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000185 updatable: false,
Paul Duffina1d60252021-01-21 18:13:43 +0000186 }
187
188 apex_key {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000189 name: "com.android.art.key",
Paul Duffina1d60252021-01-21 18:13:43 +0000190 public_key: "testkey.avbpubkey",
191 private_key: "testkey.pem",
192 }
193
194 java_library {
195 name: "foo",
196 srcs: ["b.java"],
197 installable: true,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000198 apex_available: [
199 "com.android.art",
200 ],
Paul Duffina1d60252021-01-21 18:13:43 +0000201 }
202
203 java_library {
204 name: "bar",
205 srcs: ["b.java"],
206 installable: true,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000207 apex_available: [
208 "com.android.art",
209 ],
Paul Duffina1d60252021-01-21 18:13:43 +0000210 }
211
Paul Duffin65898052021-04-20 22:47:03 +0100212 java_import {
213 name: "foo",
214 jars: ["foo.jar"],
215 apex_available: [
216 "com.android.art",
217 ],
218 }
219
220 java_import {
221 name: "bar",
222 jars: ["bar.jar"],
223 apex_available: [
224 "com.android.art",
225 ],
226 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000227 `),
228 )
Paul Duffin65898052021-04-20 22:47:03 +0100229
Paul Duffinba6afd02019-11-19 19:44:10 +0000230 contentsInsert := func(contents []string) string {
231 insert := ""
232 if contents != nil {
233 insert = fmt.Sprintf(`contents: ["%s"],`, strings.Join(contents, `", "`))
Paul Duffin396229f2021-03-18 18:30:31 +0000234 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000235 return insert
236 }
Paul Duffina1d60252021-01-21 18:13:43 +0000237
Paul Duffinba6afd02019-11-19 19:44:10 +0000238 addSource := func(contents ...string) android.FixturePreparer {
239 text := fmt.Sprintf(`
240 bootclasspath_fragment {
241 name: "mybootclasspathfragment",
242 image_name: "art",
243 %s
244 apex_available: [
245 "com.android.art",
246 ],
247 }
248 `, contentsInsert(contents))
249
250 return android.FixtureAddTextFile("art/build/boot/Android.bp", text)
251 }
252
253 addPrebuilt := func(prefer bool, contents ...string) android.FixturePreparer {
254 text := fmt.Sprintf(`
255 prebuilt_bootclasspath_fragment {
256 name: "mybootclasspathfragment",
257 image_name: "art",
258 %s
259 prefer: %t,
260 apex_available: [
261 "com.android.art",
262 ],
263 }
264 `, contentsInsert(contents), prefer)
265 return android.FixtureAddTextFile("prebuilts/module_sdk/art/Android.bp", text)
266 }
267
268 t.Run("boot image files", func(t *testing.T) {
269 result := android.GroupFixturePreparers(
270 commonPreparer,
271
272 // Configure some libraries in the art bootclasspath_fragment that match the source
273 // bootclasspath_fragment's contents property.
274 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
275 addSource("foo", "bar"),
276
277 // Make sure that a preferred prebuilt with consistent contents doesn't affect the apex.
278 addPrebuilt(true, "foo", "bar"),
279 ).RunTest(t)
280
281 ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.android.art_image", []string{
282 "javalib/arm/boot.art",
283 "javalib/arm/boot.oat",
284 "javalib/arm/boot.vdex",
285 "javalib/arm/boot-bar.art",
286 "javalib/arm/boot-bar.oat",
287 "javalib/arm/boot-bar.vdex",
288 "javalib/arm64/boot.art",
289 "javalib/arm64/boot.oat",
290 "javalib/arm64/boot.vdex",
291 "javalib/arm64/boot-bar.art",
292 "javalib/arm64/boot-bar.oat",
293 "javalib/arm64/boot-bar.vdex",
294 "javalib/bar.jar",
295 "javalib/foo.jar",
296 })
297
298 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art_image", []string{
299 `bar`,
300 `com.android.art.key`,
301 `mybootclasspathfragment`,
302 })
Paul Duffina1d60252021-01-21 18:13:43 +0000303 })
Paul Duffin396229f2021-03-18 18:30:31 +0000304
Paul Duffinba6afd02019-11-19 19:44:10 +0000305 t.Run("source with inconsistency between config and contents", func(t *testing.T) {
306 android.GroupFixturePreparers(
307 commonPreparer,
308
309 // Create an inconsistency between the ArtApexJars configuration and the art source
310 // bootclasspath_fragment module's contents property.
311 java.FixtureConfigureBootJars("com.android.art:foo"),
312 addSource("foo", "bar"),
313 ).
314 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
315 RunTest(t)
316 })
317
318 t.Run("prebuilt with inconsistency between config and contents", func(t *testing.T) {
319 android.GroupFixturePreparers(
320 commonPreparer,
321
322 // Create an inconsistency between the ArtApexJars configuration and the art
323 // prebuilt_bootclasspath_fragment module's contents property.
324 java.FixtureConfigureBootJars("com.android.art:foo"),
325 addPrebuilt(false, "foo", "bar"),
326 ).
327 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
328 RunTest(t)
329 })
330
331 t.Run("preferred prebuilt with inconsistency between config and contents", func(t *testing.T) {
332 android.GroupFixturePreparers(
333 commonPreparer,
334
335 // Create an inconsistency between the ArtApexJars configuration and the art
336 // prebuilt_bootclasspath_fragment module's contents property.
337 java.FixtureConfigureBootJars("com.android.art:foo"),
338 addPrebuilt(true, "foo", "bar"),
339
340 // Source contents property is consistent with the config.
341 addSource("foo"),
342 ).
343 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\QArtApexJars configuration specifies []string{"foo"}, contents property specifies []string{"foo", "bar"}\E`)).
344 RunTest(t)
345 })
346
347 t.Run("source preferred and prebuilt with inconsistency between config and contents", func(t *testing.T) {
348 android.GroupFixturePreparers(
349 commonPreparer,
350
351 // Create an inconsistency between the ArtApexJars configuration and the art
352 // prebuilt_bootclasspath_fragment module's contents property.
353 java.FixtureConfigureBootJars("com.android.art:foo"),
354 addPrebuilt(false, "foo", "bar"),
355
356 // Source contents property is consistent with the config.
357 addSource("foo"),
358
359 // This should pass because while the prebuilt is inconsistent with the configuration it is
360 // not actually used.
361 ).RunTest(t)
Paul Duffin396229f2021-03-18 18:30:31 +0000362 })
Paul Duffina1d60252021-01-21 18:13:43 +0000363}
364
Paul Duffin94f19632021-04-20 12:40:07 +0100365func TestBootclasspathFragmentInPrebuiltArtApex(t *testing.T) {
Paul Duffin9ea71c02021-03-23 22:53:07 +0000366 result := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100367 prepareForTestWithBootclasspathFragment,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000368 prepareForTestWithArtApex,
369
370 android.FixtureMergeMockFs(android.MockFS{
371 "com.android.art-arm64.apex": nil,
372 "com.android.art-arm.apex": nil,
373 }),
374
Paul Duffin7771eba2021-04-23 14:25:28 +0100375 // Configure some libraries in the art bootclasspath_fragment.
Paul Duffin60264a02021-04-12 20:02:36 +0100376 java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"),
Paul Duffin9ea71c02021-03-23 22:53:07 +0000377 ).RunTestWithBp(t, `
378 prebuilt_apex {
379 name: "com.android.art",
380 arch: {
381 arm64: {
382 src: "com.android.art-arm64.apex",
383 },
384 arm: {
385 src: "com.android.art-arm.apex",
386 },
387 },
388 exported_java_libs: ["foo", "bar"],
389 }
390
391 java_import {
392 name: "foo",
393 jars: ["foo.jar"],
394 apex_available: [
395 "com.android.art",
396 ],
397 }
398
399 java_import {
400 name: "bar",
401 jars: ["bar.jar"],
402 apex_available: [
403 "com.android.art",
404 ],
405 }
406
Paul Duffin7771eba2021-04-23 14:25:28 +0100407 prebuilt_bootclasspath_fragment {
Paul Duffin94f19632021-04-20 12:40:07 +0100408 name: "mybootclasspathfragment",
Paul Duffin9ea71c02021-03-23 22:53:07 +0000409 image_name: "art",
Paul Duffinf23bc472021-04-27 12:42:20 +0100410 // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above.
411 contents: ["foo", "bar"],
Paul Duffin9ea71c02021-03-23 22:53:07 +0000412 apex_available: [
413 "com.android.art",
414 ],
415 }
416 `)
417
418 java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common", []string{
Paul Duffin11216db2021-03-01 14:14:52 +0000419 `com.android.art.apex.selector`,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000420 `prebuilt_bar`,
421 `prebuilt_foo`,
422 })
423
Paul Duffin94f19632021-04-20 12:40:07 +0100424 java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common", []string{
Paul Duffin9ea71c02021-03-23 22:53:07 +0000425 `dex2oatd`,
Paul Duffinc7ef9892021-03-23 23:21:59 +0000426 `prebuilt_bar`,
427 `prebuilt_foo`,
Paul Duffin9ea71c02021-03-23 22:53:07 +0000428 })
429}
430
Paul Duffin94f19632021-04-20 12:40:07 +0100431func TestBootclasspathFragmentContentsNoName(t *testing.T) {
Paul Duffin82886d62021-03-24 01:34:57 +0000432 result := android.GroupFixturePreparers(
Paul Duffin94f19632021-04-20 12:40:07 +0100433 prepareForTestWithBootclasspathFragment,
Paul Duffin82886d62021-03-24 01:34:57 +0000434 prepareForTestWithMyapex,
435 ).RunTestWithBp(t, `
436 apex {
437 name: "myapex",
438 key: "myapex.key",
Paul Duffin94f19632021-04-20 12:40:07 +0100439 bootclasspath_fragments: [
440 "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000441 ],
442 updatable: false,
443 }
444
445 apex_key {
446 name: "myapex.key",
447 public_key: "testkey.avbpubkey",
448 private_key: "testkey.pem",
449 }
450
451 java_library {
452 name: "foo",
453 srcs: ["b.java"],
454 installable: true,
455 apex_available: [
456 "myapex",
457 ],
458 }
459
460 java_library {
461 name: "bar",
462 srcs: ["b.java"],
463 installable: true,
464 apex_available: [
465 "myapex",
466 ],
467 }
468
Paul Duffin7771eba2021-04-23 14:25:28 +0100469 bootclasspath_fragment {
Paul Duffin94f19632021-04-20 12:40:07 +0100470 name: "mybootclasspathfragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000471 contents: [
472 "foo",
473 "bar",
474 ],
475 apex_available: [
476 "myapex",
477 ],
478 }
479 `)
480
Paul Duffin4d101b62021-03-24 15:42:20 +0000481 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
482 // This does not include art, oat or vdex files as they are only included for the art boot
483 // image.
484 "javalib/bar.jar",
485 "javalib/foo.jar",
486 })
Paul Duffin82886d62021-03-24 01:34:57 +0000487
488 java.CheckModuleDependencies(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
489 `myapex.key`,
Paul Duffin94f19632021-04-20 12:40:07 +0100490 `mybootclasspathfragment`,
Paul Duffin82886d62021-03-24 01:34:57 +0000491 })
492}
493
Paul Duffina1d60252021-01-21 18:13:43 +0000494// TODO(b/177892522) - add test for host apex.