blob: 27a15624d678c39bc5e69503d07e758890807dc4 [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 Duffina1d60252021-01-21 18:13:43 +000018 "reflect"
19 "strings"
Paul Duffin3451e162021-01-20 15:16:56 +000020 "testing"
21
22 "android/soong/android"
23 "android/soong/dexpreopt"
24 "android/soong/java"
25)
26
27// Contains tests for boot_image logic from java/boot_image.go as the ART boot image requires
28// modules from the ART apex.
29
30func TestBootImages(t *testing.T) {
31 ctx, _ := testApex(t, `
32 java_sdk_library {
33 name: "foo",
34 srcs: ["b.java"],
35 unsafe_ignore_missing_latest_api: true,
36 }
37
38 java_library {
39 name: "bar",
40 srcs: ["b.java"],
41 installable: true,
42 }
43
44 apex {
45 name: "com.android.art",
46 key: "com.android.art.key",
47 java_libs: [
48 "baz",
49 "quuz",
50 ],
51 }
52
53 apex_key {
54 name: "com.android.art.key",
55 public_key: "com.android.art.avbpubkey",
56 private_key: "com.android.art.pem",
57 }
58
59 java_library {
60 name: "baz",
61 apex_available: [
62 "com.android.art",
63 ],
64 srcs: ["b.java"],
65 }
66
67 java_library {
68 name: "quuz",
69 apex_available: [
70 "com.android.art",
71 ],
72 srcs: ["b.java"],
73 }
Paul Duffin5bbfef82021-01-30 12:57:26 +000074
75 boot_image {
76 name: "art-boot-image",
77 image_name: "art",
78 }
79
80 boot_image {
81 name: "framework-boot-image",
82 image_name: "boot",
83 }
Paul Duffin3451e162021-01-20 15:16:56 +000084`,
85 // Configure some libraries in the art and framework boot images.
86 withArtBootImageJars("com.android.art:baz", "com.android.art:quuz"),
87 withFrameworkBootImageJars("platform:foo", "platform:bar"),
88 withFiles(filesForSdkLibrary),
89 // Some additional files needed for the art apex.
90 withFiles(map[string][]byte{
91 "com.android.art.avbpubkey": nil,
92 "com.android.art.pem": nil,
93 "system/sepolicy/apex/com.android.art-file_contexts": nil,
94 }),
95 )
96
97 // Make sure that the framework-boot-image is using the correct configuration.
Paul Duffina1d60252021-01-21 18:13:43 +000098 checkBootImage(t, ctx, "framework-boot-image", "platform:foo,platform:bar", `
99test_device/dex_bootjars/android/system/framework/arm/boot-foo.art
100test_device/dex_bootjars/android/system/framework/arm/boot-foo.oat
101test_device/dex_bootjars/android/system/framework/arm/boot-foo.vdex
102test_device/dex_bootjars/android/system/framework/arm/boot-bar.art
103test_device/dex_bootjars/android/system/framework/arm/boot-bar.oat
104test_device/dex_bootjars/android/system/framework/arm/boot-bar.vdex
105test_device/dex_bootjars/android/system/framework/arm64/boot-foo.art
106test_device/dex_bootjars/android/system/framework/arm64/boot-foo.oat
107test_device/dex_bootjars/android/system/framework/arm64/boot-foo.vdex
108test_device/dex_bootjars/android/system/framework/arm64/boot-bar.art
109test_device/dex_bootjars/android/system/framework/arm64/boot-bar.oat
110test_device/dex_bootjars/android/system/framework/arm64/boot-bar.vdex
111`)
Paul Duffin3451e162021-01-20 15:16:56 +0000112
113 // Make sure that the art-boot-image is using the correct configuration.
Paul Duffina1d60252021-01-21 18:13:43 +0000114 checkBootImage(t, ctx, "art-boot-image", "com.android.art:baz,com.android.art:quuz", `
115test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.art
116test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.oat
117test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.vdex
118test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-quuz.art
119test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-quuz.oat
120test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-quuz.vdex
121test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.art
122test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.oat
123test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.vdex
124test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-quuz.art
125test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-quuz.oat
126test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-quuz.vdex
127`)
Paul Duffin3451e162021-01-20 15:16:56 +0000128}
129
Paul Duffina1d60252021-01-21 18:13:43 +0000130func checkBootImage(t *testing.T, ctx *android.TestContext, moduleName string, expectedConfiguredModules string, expectedBootImageFiles string) {
Paul Duffin3451e162021-01-20 15:16:56 +0000131 t.Helper()
132
133 bootImage := ctx.ModuleForTests(moduleName, "android_common").Module().(*java.BootImageModule)
134
135 bootImageInfo := ctx.ModuleProvider(bootImage, java.BootImageInfoProvider).(java.BootImageInfo)
136 modules := bootImageInfo.Modules()
137 if actual := modules.String(); actual != expectedConfiguredModules {
138 t.Errorf("invalid modules for %s: expected %q, actual %q", moduleName, expectedConfiguredModules, actual)
139 }
Paul Duffina1d60252021-01-21 18:13:43 +0000140
141 // Get a list of all the paths in the boot image sorted by arch type.
142 allPaths := []string{}
143 bootImageFilesByArchType := bootImageInfo.AndroidBootImageFilesByArchType()
144 for _, archType := range android.ArchTypeList() {
145 if paths, ok := bootImageFilesByArchType[archType]; ok {
146 for _, path := range paths {
147 allPaths = append(allPaths, android.NormalizePathForTesting(path))
148 }
149 }
150 }
151 if expected, actual := strings.TrimSpace(expectedBootImageFiles), strings.TrimSpace(strings.Join(allPaths, "\n")); !reflect.DeepEqual(expected, actual) {
152 t.Errorf("invalid paths for %s: expected \n%s, actual \n%s", moduleName, expected, actual)
153 }
Paul Duffin3451e162021-01-20 15:16:56 +0000154}
155
156func modifyDexpreoptConfig(configModifier func(dexpreoptConfig *dexpreopt.GlobalConfig)) func(fs map[string][]byte, config android.Config) {
157 return func(fs map[string][]byte, config android.Config) {
158 // Initialize the dexpreopt GlobalConfig to an empty structure. This has no effect if it has
159 // already been set.
160 pathCtx := android.PathContextForTesting(config)
161 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
162 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
163
164 // Retrieve the existing configuration and modify it.
165 dexpreoptConfig = dexpreopt.GetGlobalConfig(pathCtx)
166 configModifier(dexpreoptConfig)
167 }
168}
169
170func withArtBootImageJars(bootJars ...string) func(fs map[string][]byte, config android.Config) {
171 return modifyDexpreoptConfig(func(dexpreoptConfig *dexpreopt.GlobalConfig) {
172 dexpreoptConfig.ArtApexJars = android.CreateTestConfiguredJarList(bootJars)
173 })
174}
175
176func withFrameworkBootImageJars(bootJars ...string) func(fs map[string][]byte, config android.Config) {
177 return modifyDexpreoptConfig(func(dexpreoptConfig *dexpreopt.GlobalConfig) {
178 dexpreoptConfig.BootJars = android.CreateTestConfiguredJarList(bootJars)
179 })
180}
Paul Duffina1d60252021-01-21 18:13:43 +0000181
182func TestBootImageInApex(t *testing.T) {
183 ctx, _ := testApex(t, `
184 apex {
185 name: "myapex",
186 key: "myapex.key",
187 boot_images: [
188 "mybootimage",
189 ],
190 }
191
192 apex_key {
193 name: "myapex.key",
194 public_key: "testkey.avbpubkey",
195 private_key: "testkey.pem",
196 }
197
198 java_library {
199 name: "foo",
200 srcs: ["b.java"],
201 installable: true,
202 }
203
204 java_library {
205 name: "bar",
206 srcs: ["b.java"],
207 installable: true,
208 }
209
210 boot_image {
211 name: "mybootimage",
212 image_name: "boot",
213 apex_available: [
214 "myapex",
215 ],
216 }
217`,
218 // Configure some libraries in the framework boot image.
219 withFrameworkBootImageJars("platform:foo", "platform:bar"),
220 )
221
222 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
223 "javalib/arm/boot-bar.art",
224 "javalib/arm/boot-bar.oat",
225 "javalib/arm/boot-bar.vdex",
226 "javalib/arm/boot-foo.art",
227 "javalib/arm/boot-foo.oat",
228 "javalib/arm/boot-foo.vdex",
229 "javalib/arm64/boot-bar.art",
230 "javalib/arm64/boot-bar.oat",
231 "javalib/arm64/boot-bar.vdex",
232 "javalib/arm64/boot-foo.art",
233 "javalib/arm64/boot-foo.oat",
234 "javalib/arm64/boot-foo.vdex",
235 })
236}
237
238// TODO(b/177892522) - add test for host apex.