blob: c13ea2ebf4dcd0714a8517f5f04971ba46afeb6a [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 }
74`,
75 // Configure some libraries in the art and framework boot images.
76 withArtBootImageJars("com.android.art:baz", "com.android.art:quuz"),
77 withFrameworkBootImageJars("platform:foo", "platform:bar"),
78 withFiles(filesForSdkLibrary),
79 // Some additional files needed for the art apex.
80 withFiles(map[string][]byte{
81 "com.android.art.avbpubkey": nil,
82 "com.android.art.pem": nil,
83 "system/sepolicy/apex/com.android.art-file_contexts": nil,
84 }),
85 )
86
87 // Make sure that the framework-boot-image is using the correct configuration.
Paul Duffina1d60252021-01-21 18:13:43 +000088 checkBootImage(t, ctx, "framework-boot-image", "platform:foo,platform:bar", `
89test_device/dex_bootjars/android/system/framework/arm/boot-foo.art
90test_device/dex_bootjars/android/system/framework/arm/boot-foo.oat
91test_device/dex_bootjars/android/system/framework/arm/boot-foo.vdex
92test_device/dex_bootjars/android/system/framework/arm/boot-bar.art
93test_device/dex_bootjars/android/system/framework/arm/boot-bar.oat
94test_device/dex_bootjars/android/system/framework/arm/boot-bar.vdex
95test_device/dex_bootjars/android/system/framework/arm64/boot-foo.art
96test_device/dex_bootjars/android/system/framework/arm64/boot-foo.oat
97test_device/dex_bootjars/android/system/framework/arm64/boot-foo.vdex
98test_device/dex_bootjars/android/system/framework/arm64/boot-bar.art
99test_device/dex_bootjars/android/system/framework/arm64/boot-bar.oat
100test_device/dex_bootjars/android/system/framework/arm64/boot-bar.vdex
101`)
Paul Duffin3451e162021-01-20 15:16:56 +0000102
103 // Make sure that the art-boot-image is using the correct configuration.
Paul Duffina1d60252021-01-21 18:13:43 +0000104 checkBootImage(t, ctx, "art-boot-image", "com.android.art:baz,com.android.art:quuz", `
105test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.art
106test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.oat
107test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.vdex
108test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-quuz.art
109test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-quuz.oat
110test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-quuz.vdex
111test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.art
112test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.oat
113test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.vdex
114test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-quuz.art
115test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-quuz.oat
116test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-quuz.vdex
117`)
Paul Duffin3451e162021-01-20 15:16:56 +0000118}
119
Paul Duffina1d60252021-01-21 18:13:43 +0000120func checkBootImage(t *testing.T, ctx *android.TestContext, moduleName string, expectedConfiguredModules string, expectedBootImageFiles string) {
Paul Duffin3451e162021-01-20 15:16:56 +0000121 t.Helper()
122
123 bootImage := ctx.ModuleForTests(moduleName, "android_common").Module().(*java.BootImageModule)
124
125 bootImageInfo := ctx.ModuleProvider(bootImage, java.BootImageInfoProvider).(java.BootImageInfo)
126 modules := bootImageInfo.Modules()
127 if actual := modules.String(); actual != expectedConfiguredModules {
128 t.Errorf("invalid modules for %s: expected %q, actual %q", moduleName, expectedConfiguredModules, actual)
129 }
Paul Duffina1d60252021-01-21 18:13:43 +0000130
131 // Get a list of all the paths in the boot image sorted by arch type.
132 allPaths := []string{}
133 bootImageFilesByArchType := bootImageInfo.AndroidBootImageFilesByArchType()
134 for _, archType := range android.ArchTypeList() {
135 if paths, ok := bootImageFilesByArchType[archType]; ok {
136 for _, path := range paths {
137 allPaths = append(allPaths, android.NormalizePathForTesting(path))
138 }
139 }
140 }
141 if expected, actual := strings.TrimSpace(expectedBootImageFiles), strings.TrimSpace(strings.Join(allPaths, "\n")); !reflect.DeepEqual(expected, actual) {
142 t.Errorf("invalid paths for %s: expected \n%s, actual \n%s", moduleName, expected, actual)
143 }
Paul Duffin3451e162021-01-20 15:16:56 +0000144}
145
146func modifyDexpreoptConfig(configModifier func(dexpreoptConfig *dexpreopt.GlobalConfig)) func(fs map[string][]byte, config android.Config) {
147 return func(fs map[string][]byte, config android.Config) {
148 // Initialize the dexpreopt GlobalConfig to an empty structure. This has no effect if it has
149 // already been set.
150 pathCtx := android.PathContextForTesting(config)
151 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
152 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
153
154 // Retrieve the existing configuration and modify it.
155 dexpreoptConfig = dexpreopt.GetGlobalConfig(pathCtx)
156 configModifier(dexpreoptConfig)
157 }
158}
159
160func withArtBootImageJars(bootJars ...string) func(fs map[string][]byte, config android.Config) {
161 return modifyDexpreoptConfig(func(dexpreoptConfig *dexpreopt.GlobalConfig) {
162 dexpreoptConfig.ArtApexJars = android.CreateTestConfiguredJarList(bootJars)
163 })
164}
165
166func withFrameworkBootImageJars(bootJars ...string) func(fs map[string][]byte, config android.Config) {
167 return modifyDexpreoptConfig(func(dexpreoptConfig *dexpreopt.GlobalConfig) {
168 dexpreoptConfig.BootJars = android.CreateTestConfiguredJarList(bootJars)
169 })
170}
Paul Duffina1d60252021-01-21 18:13:43 +0000171
172func TestBootImageInApex(t *testing.T) {
173 ctx, _ := testApex(t, `
174 apex {
175 name: "myapex",
176 key: "myapex.key",
177 boot_images: [
178 "mybootimage",
179 ],
180 }
181
182 apex_key {
183 name: "myapex.key",
184 public_key: "testkey.avbpubkey",
185 private_key: "testkey.pem",
186 }
187
188 java_library {
189 name: "foo",
190 srcs: ["b.java"],
191 installable: true,
192 }
193
194 java_library {
195 name: "bar",
196 srcs: ["b.java"],
197 installable: true,
198 }
199
200 boot_image {
201 name: "mybootimage",
202 image_name: "boot",
203 apex_available: [
204 "myapex",
205 ],
206 }
207`,
208 // Configure some libraries in the framework boot image.
209 withFrameworkBootImageJars("platform:foo", "platform:bar"),
210 )
211
212 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
213 "javalib/arm/boot-bar.art",
214 "javalib/arm/boot-bar.oat",
215 "javalib/arm/boot-bar.vdex",
216 "javalib/arm/boot-foo.art",
217 "javalib/arm/boot-foo.oat",
218 "javalib/arm/boot-foo.vdex",
219 "javalib/arm64/boot-bar.art",
220 "javalib/arm64/boot-bar.oat",
221 "javalib/arm64/boot-bar.vdex",
222 "javalib/arm64/boot-foo.art",
223 "javalib/arm64/boot-foo.oat",
224 "javalib/arm64/boot-foo.vdex",
225 })
226}
227
228// TODO(b/177892522) - add test for host apex.