blob: d1dfb9cab09f162b7de8d62fb4dc3bc33259f413 [file] [log] [blame]
Jihoon Kangf86fe9a2024-06-26 22:18:10 +00001// Copyright 2024 Google Inc. All rights reserved.
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 (
18 "android/soong/android"
19 "android/soong/java"
20 "fmt"
21 "testing"
22)
23
24var checkContainerMatch = func(t *testing.T, name string, container string, expected bool, actual bool) {
25 errorMessage := fmt.Sprintf("module %s container %s value differ", name, container)
26 android.AssertBoolEquals(t, errorMessage, expected, actual)
27}
28
29func TestApexDepsContainers(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070030 t.Parallel()
Jihoon Kangf86fe9a2024-06-26 22:18:10 +000031 result := android.GroupFixturePreparers(
32 prepareForApexTest,
33 java.PrepareForTestWithJavaSdkLibraryFiles,
Jihoon Kang85bc1932024-07-01 17:04:46 +000034 java.FixtureWithLastReleaseApis("mybootclasspathlib", "bar"),
Jihoon Kangf86fe9a2024-06-26 22:18:10 +000035 ).RunTestWithBp(t, `
36 apex {
37 name: "myapex",
38 key: "myapex.key",
39 bootclasspath_fragments: [
40 "mybootclasspathfragment",
41 ],
42 updatable: true,
43 min_sdk_version: "30",
44 }
45 apex_key {
46 name: "myapex.key",
47 public_key: "testkey.avbpubkey",
48 private_key: "testkey.pem",
49 }
50 bootclasspath_fragment {
51 name: "mybootclasspathfragment",
52 contents: [
53 "mybootclasspathlib",
54 ],
55 apex_available: [
56 "myapex",
57 ],
58 hidden_api: {
59 split_packages: ["*"],
60 },
61 }
62 java_sdk_library {
63 name: "mybootclasspathlib",
64 srcs: [
65 "mybootclasspathlib.java",
66 ],
67 apex_available: [
68 "myapex",
69 ],
70 compile_dex: true,
71 static_libs: [
Jihoon Kang85bc1932024-07-01 17:04:46 +000072 "food",
Jihoon Kangf86fe9a2024-06-26 22:18:10 +000073 "baz",
74 ],
75 libs: [
Jihoon Kang85bc1932024-07-01 17:04:46 +000076 "bar.stubs",
Jihoon Kangf86fe9a2024-06-26 22:18:10 +000077 ],
78 min_sdk_version: "30",
Jihoon Kang85bc1932024-07-01 17:04:46 +000079 sdk_version: "current",
Jihoon Kangf86fe9a2024-06-26 22:18:10 +000080 }
81 java_library {
Jihoon Kang85bc1932024-07-01 17:04:46 +000082 name: "food",
Jihoon Kangf86fe9a2024-06-26 22:18:10 +000083 srcs:[
84 "A.java",
85 ],
86 apex_available: [
87 "myapex",
88 ],
89 min_sdk_version: "30",
Jihoon Kang85bc1932024-07-01 17:04:46 +000090 sdk_version: "core_current",
Jihoon Kangf86fe9a2024-06-26 22:18:10 +000091 }
Jihoon Kang85bc1932024-07-01 17:04:46 +000092 java_sdk_library {
Jihoon Kangf86fe9a2024-06-26 22:18:10 +000093 name: "bar",
94 srcs:[
95 "A.java",
96 ],
97 min_sdk_version: "30",
Jihoon Kang85bc1932024-07-01 17:04:46 +000098 sdk_version: "core_current",
Jihoon Kangf86fe9a2024-06-26 22:18:10 +000099 }
100 java_library {
101 name: "baz",
102 srcs:[
103 "A.java",
104 ],
105 apex_available: [
106 "//apex_available:platform",
107 "myapex",
108 ],
109 min_sdk_version: "30",
Jihoon Kang85bc1932024-07-01 17:04:46 +0000110 sdk_version: "core_current",
Jihoon Kangf86fe9a2024-06-26 22:18:10 +0000111 }
112 `)
113 testcases := []struct {
114 moduleName string
115 variant string
116 isSystemContainer bool
117 isApexContainer bool
118 }{
119 {
120 moduleName: "mybootclasspathlib",
121 variant: "android_common_myapex",
122 isSystemContainer: true,
123 isApexContainer: true,
124 },
125 {
126 moduleName: "mybootclasspathlib.impl",
127 variant: "android_common_apex30",
128 isSystemContainer: true,
129 isApexContainer: true,
130 },
131 {
132 moduleName: "mybootclasspathlib.stubs",
133 variant: "android_common",
134 isSystemContainer: true,
135 isApexContainer: false,
136 },
137 {
Jihoon Kang85bc1932024-07-01 17:04:46 +0000138 moduleName: "food",
Jihoon Kangf86fe9a2024-06-26 22:18:10 +0000139 variant: "android_common_apex30",
140 isSystemContainer: true,
141 isApexContainer: true,
142 },
143 {
144 moduleName: "bar",
145 variant: "android_common",
146 isSystemContainer: true,
147 isApexContainer: false,
148 },
149 {
150 moduleName: "baz",
151 variant: "android_common_apex30",
152 isSystemContainer: true,
153 isApexContainer: true,
154 },
155 }
156
157 for _, c := range testcases {
158 m := result.ModuleForTests(c.moduleName, c.variant)
159 containers, _ := android.OtherModuleProvider(result.TestContext.OtherModuleProviderAdaptor(), m.Module(), android.ContainersInfoProvider)
160 belongingContainers := containers.BelongingContainers()
161 checkContainerMatch(t, c.moduleName, "system", c.isSystemContainer, android.InList(android.SystemContainer, belongingContainers))
162 checkContainerMatch(t, c.moduleName, "apex", c.isApexContainer, android.InList(android.ApexContainer, belongingContainers))
163 }
164}
165
166func TestNonUpdatableApexDepsContainers(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700167 t.Parallel()
Jihoon Kangf86fe9a2024-06-26 22:18:10 +0000168 result := android.GroupFixturePreparers(
169 prepareForApexTest,
170 java.PrepareForTestWithJavaSdkLibraryFiles,
Jihoon Kang85bc1932024-07-01 17:04:46 +0000171 java.FixtureWithLastReleaseApis("mybootclasspathlib", "bar"),
Jihoon Kangf86fe9a2024-06-26 22:18:10 +0000172 ).RunTestWithBp(t, `
173 apex {
174 name: "myapex",
175 key: "myapex.key",
176 bootclasspath_fragments: [
177 "mybootclasspathfragment",
178 ],
179 updatable: false,
180 }
181 apex_key {
182 name: "myapex.key",
183 public_key: "testkey.avbpubkey",
184 private_key: "testkey.pem",
185 }
186 bootclasspath_fragment {
187 name: "mybootclasspathfragment",
188 contents: [
189 "mybootclasspathlib",
190 ],
191 apex_available: [
192 "myapex",
193 ],
194 hidden_api: {
195 split_packages: ["*"],
196 },
197 }
198 java_sdk_library {
199 name: "mybootclasspathlib",
200 srcs: [
201 "mybootclasspathlib.java",
202 ],
203 apex_available: [
204 "myapex",
205 ],
206 compile_dex: true,
207 static_libs: [
Jihoon Kang85bc1932024-07-01 17:04:46 +0000208 "food",
Jihoon Kangf86fe9a2024-06-26 22:18:10 +0000209 ],
210 libs: [
Jihoon Kang85bc1932024-07-01 17:04:46 +0000211 "bar.stubs",
Jihoon Kangf86fe9a2024-06-26 22:18:10 +0000212 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000213 sdk_version: "current",
Jihoon Kangf86fe9a2024-06-26 22:18:10 +0000214 }
215 java_library {
Jihoon Kang85bc1932024-07-01 17:04:46 +0000216 name: "food",
Jihoon Kangf86fe9a2024-06-26 22:18:10 +0000217 srcs:[
218 "A.java",
219 ],
220 apex_available: [
221 "myapex",
222 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000223 sdk_version: "core_current",
Jihoon Kangf86fe9a2024-06-26 22:18:10 +0000224 }
Jihoon Kang85bc1932024-07-01 17:04:46 +0000225 java_sdk_library {
Jihoon Kangf86fe9a2024-06-26 22:18:10 +0000226 name: "bar",
227 srcs:[
228 "A.java",
229 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +0000230 sdk_version: "none",
231 system_modules: "none",
Jihoon Kangf86fe9a2024-06-26 22:18:10 +0000232 }
233 `)
234 testcases := []struct {
235 moduleName string
236 variant string
237 isSystemContainer bool
238 isApexContainer bool
239 }{
240 {
241 moduleName: "mybootclasspathlib",
242 variant: "android_common_myapex",
243 isSystemContainer: true,
244 isApexContainer: true,
245 },
246 {
247 moduleName: "mybootclasspathlib.impl",
248 variant: "android_common_apex10000",
249 isSystemContainer: true,
250 isApexContainer: true,
251 },
252 {
253 moduleName: "mybootclasspathlib.stubs",
254 variant: "android_common",
255 isSystemContainer: true,
256 isApexContainer: false,
257 },
258 {
Jihoon Kang85bc1932024-07-01 17:04:46 +0000259 moduleName: "food",
Jihoon Kangf86fe9a2024-06-26 22:18:10 +0000260 variant: "android_common_apex10000",
261 isSystemContainer: true,
262 isApexContainer: true,
263 },
264 {
265 moduleName: "bar",
266 variant: "android_common",
267 isSystemContainer: true,
268 isApexContainer: false,
269 },
270 }
271
272 for _, c := range testcases {
273 m := result.ModuleForTests(c.moduleName, c.variant)
274 containers, _ := android.OtherModuleProvider(result.TestContext.OtherModuleProviderAdaptor(), m.Module(), android.ContainersInfoProvider)
275 belongingContainers := containers.BelongingContainers()
276 checkContainerMatch(t, c.moduleName, "system", c.isSystemContainer, android.InList(android.SystemContainer, belongingContainers))
277 checkContainerMatch(t, c.moduleName, "apex", c.isApexContainer, android.InList(android.ApexContainer, belongingContainers))
278 }
279}
280
281func TestUpdatableAndNonUpdatableApexesIdenticalMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700282 t.Parallel()
Jihoon Kangf86fe9a2024-06-26 22:18:10 +0000283 result := android.GroupFixturePreparers(
284 prepareForApexTest,
285 java.PrepareForTestWithJavaSdkLibraryFiles,
286 android.FixtureMergeMockFs(android.MockFS{
287 "system/sepolicy/apex/myapex_non_updatable-file_contexts": nil,
288 "system/sepolicy/apex/myapex_updatable-file_contexts": nil,
289 }),
290 ).RunTestWithBp(t, `
291 apex {
292 name: "myapex_non_updatable",
293 key: "myapex_non_updatable.key",
294 java_libs: [
295 "foo",
296 ],
297 updatable: false,
298 min_sdk_version: "30",
299 }
300 apex_key {
301 name: "myapex_non_updatable.key",
302 public_key: "testkey.avbpubkey",
303 private_key: "testkey.pem",
304 }
305
306 apex {
307 name: "myapex_updatable",
308 key: "myapex_updatable.key",
309 java_libs: [
310 "foo",
311 ],
312 updatable: true,
313 min_sdk_version: "30",
314 }
315 apex_key {
316 name: "myapex_updatable.key",
317 public_key: "testkey.avbpubkey",
318 private_key: "testkey.pem",
319 }
320
321 java_library {
322 name: "foo",
323 srcs:[
324 "A.java",
325 ],
326 apex_available: [
327 "myapex_non_updatable",
328 "myapex_updatable",
329 ],
330 min_sdk_version: "30",
331 sdk_version: "current",
332 }
333 `)
334
335 fooApexVariant := result.ModuleForTests("foo", "android_common_apex30")
336 containers, _ := android.OtherModuleProvider(result.TestContext.OtherModuleProviderAdaptor(), fooApexVariant.Module(), android.ContainersInfoProvider)
337 belongingContainers := containers.BelongingContainers()
338 checkContainerMatch(t, "foo", "system", true, android.InList(android.SystemContainer, belongingContainers))
339 checkContainerMatch(t, "foo", "apex", true, android.InList(android.ApexContainer, belongingContainers))
340}