blob: 28097aa9895163f93af8b134e18238dff68dc624 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 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 (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Kiyoung Kim487689e2022-07-26 09:48:22 +090028 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090029 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090036 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090037 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070038 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090039)
40
Jooyung Hand3639552019-08-09 12:57:43 +090041// names returns name list from white space separated string
42func names(s string) (ns []string) {
43 for _, n := range strings.Split(s, " ") {
44 if len(n) > 0 {
45 ns = append(ns, n)
46 }
47 }
48 return
49}
50
Paul Duffin40b62572021-03-20 11:39:01 +000051func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090052 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010053 android.GroupFixturePreparers(
54 prepareForApexTest,
55 android.GroupFixturePreparers(preparers...),
56 ).
Paul Duffine05480a2021-03-08 15:07:14 +000057 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000058 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090059}
60
Paul Duffin40b62572021-03-20 11:39:01 +000061func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090062 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010063
64 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000065 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010066 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000067 }
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 result := android.GroupFixturePreparers(
70 prepareForApexTest,
71 android.GroupFixturePreparers(preparers...),
72 optionalBpPreparer,
73 ).RunTest(t)
74
Paul Duffine05480a2021-03-08 15:07:14 +000075 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090076}
77
Paul Duffin810f33d2021-03-09 14:12:32 +000078func withFiles(files android.MockFS) android.FixturePreparer {
79 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090080}
81
Paul Duffin810f33d2021-03-09 14:12:32 +000082func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
83 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090084 for k, v := range targets {
85 config.Targets[k] = v
86 }
Paul Duffin810f33d2021-03-09 14:12:32 +000087 })
Jooyung Han344d5432019-08-23 11:17:39 +090088}
89
Jooyung Han35155c42020-02-06 17:33:20 +090090// withNativeBridgeTargets sets configuration with targets including:
91// - X86_64 (primary)
92// - X86 (secondary)
93// - Arm64 on X86_64 (native bridge)
94// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000095var withNativeBridgeEnabled = android.FixtureModifyConfig(
96 func(config android.Config) {
97 config.Targets[android.Android] = []android.Target{
98 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
99 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
100 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
101 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
106 }
107 },
108)
109
110func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
111 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
112 variables.ManifestPackageNameOverrides = specs
113 })
Jooyung Han35155c42020-02-06 17:33:20 +0900114}
115
Albert Martineefabcf2022-03-21 20:11:16 +0000116func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
117 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
118 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
119 })
120}
121
Paul Duffin810f33d2021-03-09 14:12:32 +0000122var withBinder32bit = android.FixtureModifyProductVariables(
123 func(variables android.FixtureProductVariables) {
124 variables.Binder32bit = proptools.BoolPtr(true)
125 },
126)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900127
Paul Duffin810f33d2021-03-09 14:12:32 +0000128var withUnbundledBuild = android.FixtureModifyProductVariables(
129 func(variables android.FixtureProductVariables) {
130 variables.Unbundled_build = proptools.BoolPtr(true)
131 },
132)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900133
Paul Duffin284165a2021-03-29 01:50:31 +0100134// Legacy preparer used for running tests within the apex package.
135//
136// This includes everything that was needed to run any test in the apex package prior to the
137// introduction of the test fixtures. Tests that are being converted to use fixtures directly
138// rather than through the testApex...() methods should avoid using this and instead use the
139// various preparers directly, using android.GroupFixturePreparers(...) to group them when
140// necessary.
141//
142// deprecated
143var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000144 // General preparers in alphabetical order as test infrastructure will enforce correct
145 // registration order.
146 android.PrepareForTestWithAndroidBuildComponents,
147 bpf.PrepareForTestWithBpf,
148 cc.PrepareForTestWithCcBuildComponents,
149 java.PrepareForTestWithJavaDefaultModules,
150 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
151 rust.PrepareForTestWithRustDefaultModules,
152 sh.PrepareForTestWithShBuildComponents,
153
154 PrepareForTestWithApexBuildComponents,
155
156 // Additional apex test specific preparers.
157 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
158 filegroup {
159 name: "myapex-file_contexts",
160 srcs: [
161 "apex/myapex-file_contexts",
162 ],
163 }
164 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000165 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000166 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000167 "a.java": nil,
168 "PrebuiltAppFoo.apk": nil,
169 "PrebuiltAppFooPriv.apk": nil,
170 "apex_manifest.json": nil,
171 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000172 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
173 "system/sepolicy/apex/myapex2-file_contexts": nil,
174 "system/sepolicy/apex/otherapex-file_contexts": nil,
175 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700177 "mylib.cpp": nil,
178 "mytest.cpp": nil,
179 "mytest1.cpp": nil,
180 "mytest2.cpp": nil,
181 "mytest3.cpp": nil,
182 "myprebuilt": nil,
183 "my_include": nil,
184 "foo/bar/MyClass.java": nil,
185 "prebuilt.jar": nil,
186 "prebuilt.so": nil,
187 "vendor/foo/devkeys/test.x509.pem": nil,
188 "vendor/foo/devkeys/test.pk8": nil,
189 "testkey.x509.pem": nil,
190 "testkey.pk8": nil,
191 "testkey.override.x509.pem": nil,
192 "testkey.override.pk8": nil,
193 "vendor/foo/devkeys/testkey.avbpubkey": nil,
194 "vendor/foo/devkeys/testkey.pem": nil,
195 "NOTICE": nil,
196 "custom_notice": nil,
197 "custom_notice_for_static_lib": nil,
198 "testkey2.avbpubkey": nil,
199 "testkey2.pem": nil,
200 "myapex-arm64.apex": nil,
201 "myapex-arm.apex": nil,
202 "myapex.apks": nil,
203 "frameworks/base/api/current.txt": nil,
204 "framework/aidl/a.aidl": nil,
205 "dummy.txt": nil,
206 "baz": nil,
207 "bar/baz": nil,
208 "testdata/baz": nil,
209 "AppSet.apks": nil,
210 "foo.rs": nil,
211 "libfoo.jar": nil,
212 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000213 },
214 ),
215
216 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
217 variables.DeviceVndkVersion = proptools.StringPtr("current")
218 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
219 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
220 variables.Platform_sdk_codename = proptools.StringPtr("Q")
221 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000222 // "Tiramisu" needs to be in the next line for compatibility with soong code,
223 // not because of these tests specifically (it's not used by the tests)
224 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900225 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000226 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000227 }),
228)
229
Paul Duffin52bfaa42021-03-23 23:40:12 +0000230var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
231 "system/sepolicy/apex/myapex-file_contexts": nil,
232})
233
Jooyung Han643adc42020-02-27 13:50:06 +0900234// ensure that 'result' equals 'expected'
235func ensureEquals(t *testing.T, result string, expected string) {
236 t.Helper()
237 if result != expected {
238 t.Errorf("%q != %q", expected, result)
239 }
240}
241
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242// ensure that 'result' contains 'expected'
243func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900244 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245 if !strings.Contains(result, expected) {
246 t.Errorf("%q is not found in %q", expected, result)
247 }
248}
249
Liz Kammer5bd365f2020-05-27 15:15:11 -0700250// ensure that 'result' contains 'expected' exactly one time
251func ensureContainsOnce(t *testing.T, result string, expected string) {
252 t.Helper()
253 count := strings.Count(result, expected)
254 if count != 1 {
255 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
256 }
257}
258
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259// ensures that 'result' does not contain 'notExpected'
260func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900261 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262 if strings.Contains(result, notExpected) {
263 t.Errorf("%q is found in %q", notExpected, result)
264 }
265}
266
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700267func ensureMatches(t *testing.T, result string, expectedRex string) {
268 ok, err := regexp.MatchString(expectedRex, result)
269 if err != nil {
270 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
271 return
272 }
273 if !ok {
274 t.Errorf("%s does not match regular expession %s", result, expectedRex)
275 }
276}
277
Jiyong Park25fc6a92018-11-18 18:02:45 +0900278func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900279 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280 if !android.InList(expected, result) {
281 t.Errorf("%q is not found in %v", expected, result)
282 }
283}
284
285func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900286 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287 if android.InList(notExpected, result) {
288 t.Errorf("%q is found in %v", notExpected, result)
289 }
290}
291
Jooyung Hane1633032019-08-01 17:41:43 +0900292func ensureListEmpty(t *testing.T, result []string) {
293 t.Helper()
294 if len(result) > 0 {
295 t.Errorf("%q is expected to be empty", result)
296 }
297}
298
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000299func ensureListNotEmpty(t *testing.T, result []string) {
300 t.Helper()
301 if len(result) == 0 {
302 t.Errorf("%q is expected to be not empty", result)
303 }
304}
305
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306// Minimal test
307func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800308 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900309 apex_defaults {
310 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900311 manifest: ":myapex.manifest",
312 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900313 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900314 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900315 native_shared_libs: [
316 "mylib",
317 "libfoo.ffi",
318 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900319 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800320 multilib: {
321 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900322 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800323 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900324 },
Jiyong Park77acec62020-06-01 21:39:15 +0900325 java_libs: [
326 "myjar",
327 "myjar_dex",
328 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000329 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 }
331
Jiyong Park30ca9372019-02-07 16:27:23 +0900332 apex {
333 name: "myapex",
334 defaults: ["myapex-defaults"],
335 }
336
Jiyong Park25fc6a92018-11-18 18:02:45 +0900337 apex_key {
338 name: "myapex.key",
339 public_key: "testkey.avbpubkey",
340 private_key: "testkey.pem",
341 }
342
Jiyong Park809bb722019-02-13 21:33:49 +0900343 filegroup {
344 name: "myapex.manifest",
345 srcs: ["apex_manifest.json"],
346 }
347
348 filegroup {
349 name: "myapex.androidmanifest",
350 srcs: ["AndroidManifest.xml"],
351 }
352
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353 cc_library {
354 name: "mylib",
355 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900356 shared_libs: [
357 "mylib2",
358 "libbar.ffi",
359 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900360 system_shared_libs: [],
361 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000362 // TODO: remove //apex_available:platform
363 apex_available: [
364 "//apex_available:platform",
365 "myapex",
366 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900367 }
368
Alex Light3d673592019-01-18 14:37:31 -0800369 cc_binary {
370 name: "foo",
371 srcs: ["mylib.cpp"],
372 compile_multilib: "both",
373 multilib: {
374 lib32: {
375 suffix: "32",
376 },
377 lib64: {
378 suffix: "64",
379 },
380 },
381 symlinks: ["foo_link_"],
382 symlink_preferred_arch: true,
383 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800384 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700385 apex_available: [ "myapex", "com.android.gki.*" ],
386 }
387
Jiyong Park99644e92020-11-17 22:21:02 +0900388 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000389 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900390 srcs: ["foo.rs"],
391 rlibs: ["libfoo.rlib.rust"],
392 dylibs: ["libfoo.dylib.rust"],
393 apex_available: ["myapex"],
394 }
395
396 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000397 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900398 srcs: ["foo.rs"],
399 crate_name: "foo",
400 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900401 shared_libs: ["libfoo.shared_from_rust"],
402 }
403
404 cc_library_shared {
405 name: "libfoo.shared_from_rust",
406 srcs: ["mylib.cpp"],
407 system_shared_libs: [],
408 stl: "none",
409 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900410 }
411
412 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000413 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900414 srcs: ["foo.rs"],
415 crate_name: "foo",
416 apex_available: ["myapex"],
417 }
418
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900419 rust_ffi_shared {
420 name: "libfoo.ffi",
421 srcs: ["foo.rs"],
422 crate_name: "foo",
423 apex_available: ["myapex"],
424 }
425
426 rust_ffi_shared {
427 name: "libbar.ffi",
428 srcs: ["foo.rs"],
429 crate_name: "bar",
430 apex_available: ["myapex"],
431 }
432
Yifan Hongd22a84a2020-07-28 17:37:46 -0700433 apex {
434 name: "com.android.gki.fake",
435 binaries: ["foo"],
436 key: "myapex.key",
437 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000438 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800439 }
440
Paul Duffindddd5462020-04-07 15:25:44 +0100441 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900442 name: "mylib2",
443 srcs: ["mylib.cpp"],
444 system_shared_libs: [],
445 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900446 static_libs: ["libstatic"],
447 // TODO: remove //apex_available:platform
448 apex_available: [
449 "//apex_available:platform",
450 "myapex",
451 ],
452 }
453
Paul Duffindddd5462020-04-07 15:25:44 +0100454 cc_prebuilt_library_shared {
455 name: "mylib2",
456 srcs: ["prebuilt.so"],
457 // TODO: remove //apex_available:platform
458 apex_available: [
459 "//apex_available:platform",
460 "myapex",
461 ],
462 }
463
Jiyong Park9918e1a2020-03-17 19:16:40 +0900464 cc_library_static {
465 name: "libstatic",
466 srcs: ["mylib.cpp"],
467 system_shared_libs: [],
468 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000469 // TODO: remove //apex_available:platform
470 apex_available: [
471 "//apex_available:platform",
472 "myapex",
473 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900474 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900475
476 java_library {
477 name: "myjar",
478 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900479 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900480 sdk_version: "none",
481 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900482 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900483 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000484 // TODO: remove //apex_available:platform
485 apex_available: [
486 "//apex_available:platform",
487 "myapex",
488 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900489 }
490
Jiyong Park77acec62020-06-01 21:39:15 +0900491 dex_import {
492 name: "myjar_dex",
493 jars: ["prebuilt.jar"],
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
498 }
499
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 java_library {
501 name: "myotherjar",
502 srcs: ["foo/bar/MyClass.java"],
503 sdk_version: "none",
504 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900505 // TODO: remove //apex_available:platform
506 apex_available: [
507 "//apex_available:platform",
508 "myapex",
509 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900510 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900511
512 java_library {
513 name: "mysharedjar",
514 srcs: ["foo/bar/MyClass.java"],
515 sdk_version: "none",
516 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900517 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900518 `)
519
Paul Duffina71a67a2021-03-29 00:42:57 +0100520 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900521
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900522 // Make sure that Android.mk is created
523 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700524 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900525 var builder strings.Builder
526 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
527
528 androidMk := builder.String()
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900529 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
530
Jiyong Park42cca6c2019-04-01 11:15:50 +0900531 optFlags := apexRule.Args["opt_flags"]
532 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700533 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100534 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900535
Jiyong Park25fc6a92018-11-18 18:02:45 +0900536 copyCmds := apexRule.Args["copy_commands"]
537
538 // Ensure that main rule creates an output
539 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
540
541 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700542 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
543 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
544 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900545 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900547
548 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700549 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
550 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
552 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900554 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900555
556 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800557 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
558 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900559 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900560 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900561 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900562 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
563 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900564 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900565 // .. but not for java libs
566 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900567 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800568
Colin Cross7113d202019-11-20 16:39:12 -0800569 // Ensure that the platform variant ends with _shared or _common
570 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
571 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900572 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
573 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900574 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
575
576 // Ensure that dynamic dependency to java libs are not included
577 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800578
579 // Ensure that all symlinks are present.
580 found_foo_link_64 := false
581 found_foo := false
582 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900583 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800584 if strings.HasSuffix(cmd, "bin/foo") {
585 found_foo = true
586 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
587 found_foo_link_64 = true
588 }
589 }
590 }
591 good := found_foo && found_foo_link_64
592 if !good {
593 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
594 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900595
Artur Satayeva8bd1132020-04-27 18:07:06 +0100596 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100597 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
599 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
600 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100601
602 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100603 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
605 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
606 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800607}
608
Jooyung Hanf21c7972019-12-16 22:32:06 +0900609func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800610 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900611 apex_defaults {
612 name: "myapex-defaults",
613 key: "myapex.key",
614 prebuilts: ["myetc"],
615 native_shared_libs: ["mylib"],
616 java_libs: ["myjar"],
617 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900618 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800619 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000620 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900621 }
622
623 prebuilt_etc {
624 name: "myetc",
625 src: "myprebuilt",
626 }
627
628 apex {
629 name: "myapex",
630 defaults: ["myapex-defaults"],
631 }
632
633 apex_key {
634 name: "myapex.key",
635 public_key: "testkey.avbpubkey",
636 private_key: "testkey.pem",
637 }
638
639 cc_library {
640 name: "mylib",
641 system_shared_libs: [],
642 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000643 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900644 }
645
646 java_library {
647 name: "myjar",
648 srcs: ["foo/bar/MyClass.java"],
649 sdk_version: "none",
650 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000651 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900652 }
653
654 android_app {
655 name: "AppFoo",
656 srcs: ["foo/bar/MyClass.java"],
657 sdk_version: "none",
658 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000659 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900660 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900661
662 runtime_resource_overlay {
663 name: "rro",
664 theme: "blue",
665 }
666
markchien2f59ec92020-09-02 16:23:38 +0800667 bpf {
668 name: "bpf",
669 srcs: ["bpf.c", "bpf2.c"],
670 }
671
Ken Chenfad7f9d2021-11-10 22:02:57 +0800672 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800673 name: "netdTest",
674 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800675 sub_dir: "netd",
676 }
677
Jooyung Hanf21c7972019-12-16 22:32:06 +0900678 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000679 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900680 "etc/myetc",
681 "javalib/myjar.jar",
682 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000683 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900684 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800685 "etc/bpf/bpf.o",
686 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800687 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900688 })
689}
690
Jooyung Han01a3ee22019-11-02 02:52:25 +0900691func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800692 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900693 apex {
694 name: "myapex",
695 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000696 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900697 }
698
699 apex_key {
700 name: "myapex.key",
701 public_key: "testkey.avbpubkey",
702 private_key: "testkey.pem",
703 }
704 `)
705
706 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900707 args := module.Rule("apexRule").Args
708 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
709 t.Error("manifest should be apex_manifest.pb, but " + manifest)
710 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900711}
712
Liz Kammer4854a7d2021-05-27 14:28:27 -0400713func TestApexManifestMinSdkVersion(t *testing.T) {
714 ctx := testApex(t, `
715 apex_defaults {
716 name: "my_defaults",
717 key: "myapex.key",
718 product_specific: true,
719 file_contexts: ":my-file-contexts",
720 updatable: false,
721 }
722 apex {
723 name: "myapex_30",
724 min_sdk_version: "30",
725 defaults: ["my_defaults"],
726 }
727
728 apex {
729 name: "myapex_current",
730 min_sdk_version: "current",
731 defaults: ["my_defaults"],
732 }
733
734 apex {
735 name: "myapex_none",
736 defaults: ["my_defaults"],
737 }
738
739 apex_key {
740 name: "myapex.key",
741 public_key: "testkey.avbpubkey",
742 private_key: "testkey.pem",
743 }
744
745 filegroup {
746 name: "my-file-contexts",
747 srcs: ["product_specific_file_contexts"],
748 }
749 `, withFiles(map[string][]byte{
750 "product_specific_file_contexts": nil,
751 }), android.FixtureModifyProductVariables(
752 func(variables android.FixtureProductVariables) {
753 variables.Unbundled_build = proptools.BoolPtr(true)
754 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
755 }), android.FixtureMergeEnv(map[string]string{
756 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
757 }))
758
759 testCases := []struct {
760 module string
761 minSdkVersion string
762 }{
763 {
764 module: "myapex_30",
765 minSdkVersion: "30",
766 },
767 {
768 module: "myapex_current",
769 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
770 },
771 {
772 module: "myapex_none",
773 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
774 },
775 }
776 for _, tc := range testCases {
777 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
778 args := module.Rule("apexRule").Args
779 optFlags := args["opt_flags"]
780 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
781 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
782 }
783 }
784}
785
Alex Light5098a612018-11-29 17:12:15 -0800786func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800787 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800788 apex {
789 name: "myapex",
790 key: "myapex.key",
791 payload_type: "zip",
792 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000793 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800794 }
795
796 apex_key {
797 name: "myapex.key",
798 public_key: "testkey.avbpubkey",
799 private_key: "testkey.pem",
800 }
801
802 cc_library {
803 name: "mylib",
804 srcs: ["mylib.cpp"],
805 shared_libs: ["mylib2"],
806 system_shared_libs: [],
807 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000808 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800809 }
810
811 cc_library {
812 name: "mylib2",
813 srcs: ["mylib.cpp"],
814 system_shared_libs: [],
815 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000816 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800817 }
818 `)
819
Sundong Ahnabb64432019-10-22 13:58:29 +0900820 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800821 copyCmds := zipApexRule.Args["copy_commands"]
822
823 // Ensure that main rule creates an output
824 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
825
826 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700827 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800828
829 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700830 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800831
832 // Ensure that both direct and indirect deps are copied into apex
833 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
834 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900835}
836
837func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800838 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900839 apex {
840 name: "myapex",
841 key: "myapex.key",
842 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900843 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000844 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900845 }
846
847 apex_key {
848 name: "myapex.key",
849 public_key: "testkey.avbpubkey",
850 private_key: "testkey.pem",
851 }
852
853 cc_library {
854 name: "mylib",
855 srcs: ["mylib.cpp"],
856 shared_libs: ["mylib2", "mylib3"],
857 system_shared_libs: [],
858 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000859 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900860 }
861
862 cc_library {
863 name: "mylib2",
864 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900865 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900866 system_shared_libs: [],
867 stl: "none",
868 stubs: {
869 versions: ["1", "2", "3"],
870 },
871 }
872
873 cc_library {
874 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900875 srcs: ["mylib.cpp"],
876 shared_libs: ["mylib4"],
877 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900878 stl: "none",
879 stubs: {
880 versions: ["10", "11", "12"],
881 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000882 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900883 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900884
885 cc_library {
886 name: "mylib4",
887 srcs: ["mylib.cpp"],
888 system_shared_libs: [],
889 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000890 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900891 }
Jiyong Park105dc322021-06-11 17:22:09 +0900892
893 rust_binary {
894 name: "foo.rust",
895 srcs: ["foo.rs"],
896 shared_libs: ["libfoo.shared_from_rust"],
897 prefer_rlib: true,
898 apex_available: ["myapex"],
899 }
900
901 cc_library_shared {
902 name: "libfoo.shared_from_rust",
903 srcs: ["mylib.cpp"],
904 system_shared_libs: [],
905 stl: "none",
906 stubs: {
907 versions: ["10", "11", "12"],
908 },
909 }
910
Jiyong Park25fc6a92018-11-18 18:02:45 +0900911 `)
912
Sundong Ahnabb64432019-10-22 13:58:29 +0900913 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914 copyCmds := apexRule.Args["copy_commands"]
915
916 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800917 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918
919 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800920 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921
922 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800923 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924
Colin Crossaede88c2020-08-11 12:17:01 -0700925 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900926
927 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900928 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900929 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900930 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900931
932 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700933 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900934 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700935 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900936
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700937 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
938 // is replaced by sharing of "cFlags" in cc/builder.go.
939 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
940 // module variable representing "cflags". So it was not detected by ensureNotContains.
941 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
942 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
943 // including the original cflags's "-include mylib.h".
944 //
Jiyong Park64379952018-12-13 18:37:29 +0900945 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700946 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
947 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900948
Jiyong Park85cc35a2022-07-17 11:30:47 +0900949 // Ensure that genstub for platform-provided lib is invoked with --systemapi
950 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
951 // Ensure that genstub for apex-provided lib is invoked with --apex
952 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900953
Jooyung Hana57af4a2020-01-23 05:36:59 +0000954 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900955 "lib64/mylib.so",
956 "lib64/mylib3.so",
957 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900958 "bin/foo.rust",
959 "lib64/libc++.so", // by the implicit dependency from foo.rust
960 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900961 })
Jiyong Park105dc322021-06-11 17:22:09 +0900962
963 // Ensure that stub dependency from a rust module is not included
964 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
965 // The rust module is linked to the stub cc library
966 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
967 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
968 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900969
970 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
971 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900972}
973
Jiyong Park1bc84122021-06-22 20:23:05 +0900974func TestApexCanUsePrivateApis(t *testing.T) {
975 ctx := testApex(t, `
976 apex {
977 name: "myapex",
978 key: "myapex.key",
979 native_shared_libs: ["mylib"],
980 binaries: ["foo.rust"],
981 updatable: false,
982 platform_apis: true,
983 }
984
985 apex_key {
986 name: "myapex.key",
987 public_key: "testkey.avbpubkey",
988 private_key: "testkey.pem",
989 }
990
991 cc_library {
992 name: "mylib",
993 srcs: ["mylib.cpp"],
994 shared_libs: ["mylib2"],
995 system_shared_libs: [],
996 stl: "none",
997 apex_available: [ "myapex" ],
998 }
999
1000 cc_library {
1001 name: "mylib2",
1002 srcs: ["mylib.cpp"],
1003 cflags: ["-include mylib.h"],
1004 system_shared_libs: [],
1005 stl: "none",
1006 stubs: {
1007 versions: ["1", "2", "3"],
1008 },
1009 }
1010
1011 rust_binary {
1012 name: "foo.rust",
1013 srcs: ["foo.rs"],
1014 shared_libs: ["libfoo.shared_from_rust"],
1015 prefer_rlib: true,
1016 apex_available: ["myapex"],
1017 }
1018
1019 cc_library_shared {
1020 name: "libfoo.shared_from_rust",
1021 srcs: ["mylib.cpp"],
1022 system_shared_libs: [],
1023 stl: "none",
1024 stubs: {
1025 versions: ["10", "11", "12"],
1026 },
1027 }
1028 `)
1029
1030 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1031 copyCmds := apexRule.Args["copy_commands"]
1032
1033 // Ensure that indirect stubs dep is not included
1034 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1035 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1036
1037 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1038 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001039 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001040 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1041 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001042 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001043 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1044 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1045}
1046
Colin Cross7812fd32020-09-25 12:35:10 -07001047func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1048 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001049 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001050 apex {
1051 name: "myapex",
1052 key: "myapex.key",
1053 native_shared_libs: ["mylib", "mylib3"],
1054 min_sdk_version: "29",
1055 }
1056
1057 apex_key {
1058 name: "myapex.key",
1059 public_key: "testkey.avbpubkey",
1060 private_key: "testkey.pem",
1061 }
1062
1063 cc_library {
1064 name: "mylib",
1065 srcs: ["mylib.cpp"],
1066 shared_libs: ["mylib2", "mylib3"],
1067 system_shared_libs: [],
1068 stl: "none",
1069 apex_available: [ "myapex" ],
1070 min_sdk_version: "28",
1071 }
1072
1073 cc_library {
1074 name: "mylib2",
1075 srcs: ["mylib.cpp"],
1076 cflags: ["-include mylib.h"],
1077 system_shared_libs: [],
1078 stl: "none",
1079 stubs: {
1080 versions: ["28", "29", "30", "current"],
1081 },
1082 min_sdk_version: "28",
1083 }
1084
1085 cc_library {
1086 name: "mylib3",
1087 srcs: ["mylib.cpp"],
1088 shared_libs: ["mylib4"],
1089 system_shared_libs: [],
1090 stl: "none",
1091 stubs: {
1092 versions: ["28", "29", "30", "current"],
1093 },
1094 apex_available: [ "myapex" ],
1095 min_sdk_version: "28",
1096 }
1097
1098 cc_library {
1099 name: "mylib4",
1100 srcs: ["mylib.cpp"],
1101 system_shared_libs: [],
1102 stl: "none",
1103 apex_available: [ "myapex" ],
1104 min_sdk_version: "28",
1105 }
1106 `)
1107
1108 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1109 copyCmds := apexRule.Args["copy_commands"]
1110
1111 // Ensure that direct non-stubs dep is always included
1112 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1113
1114 // Ensure that indirect stubs dep is not included
1115 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1116
1117 // Ensure that direct stubs dep is included
1118 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1119
1120 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1121
Jiyong Park55549df2021-02-26 23:57:23 +09001122 // Ensure that mylib is linking with the latest version of stub for mylib2
1123 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001124 // ... and not linking to the non-stub (impl) variant of mylib2
1125 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1126
1127 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1128 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1129 // .. and not linking to the stubs variant of mylib3
1130 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1131
1132 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001133 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001134 ensureNotContains(t, mylib2Cflags, "-include ")
1135
Jiyong Park85cc35a2022-07-17 11:30:47 +09001136 // Ensure that genstub is invoked with --systemapi
1137 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001138
1139 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1140 "lib64/mylib.so",
1141 "lib64/mylib3.so",
1142 "lib64/mylib4.so",
1143 })
1144}
1145
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001146func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1147 t.Parallel()
1148 // myapex (Z)
1149 // mylib -----------------.
1150 // |
1151 // otherapex (29) |
1152 // libstub's versions: 29 Z current
1153 // |
1154 // <platform> |
1155 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001156 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001157 apex {
1158 name: "myapex",
1159 key: "myapex.key",
1160 native_shared_libs: ["mylib"],
1161 min_sdk_version: "Z", // non-final
1162 }
1163
1164 cc_library {
1165 name: "mylib",
1166 srcs: ["mylib.cpp"],
1167 shared_libs: ["libstub"],
1168 apex_available: ["myapex"],
1169 min_sdk_version: "Z",
1170 }
1171
1172 apex_key {
1173 name: "myapex.key",
1174 public_key: "testkey.avbpubkey",
1175 private_key: "testkey.pem",
1176 }
1177
1178 apex {
1179 name: "otherapex",
1180 key: "myapex.key",
1181 native_shared_libs: ["libstub"],
1182 min_sdk_version: "29",
1183 }
1184
1185 cc_library {
1186 name: "libstub",
1187 srcs: ["mylib.cpp"],
1188 stubs: {
1189 versions: ["29", "Z", "current"],
1190 },
1191 apex_available: ["otherapex"],
1192 min_sdk_version: "29",
1193 }
1194
1195 // platform module depending on libstub from otherapex should use the latest stub("current")
1196 cc_library {
1197 name: "libplatform",
1198 srcs: ["mylib.cpp"],
1199 shared_libs: ["libstub"],
1200 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001201 `,
1202 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1203 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1204 variables.Platform_sdk_final = proptools.BoolPtr(false)
1205 variables.Platform_version_active_codenames = []string{"Z"}
1206 }),
1207 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001208
Jiyong Park55549df2021-02-26 23:57:23 +09001209 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001210 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001211 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001212 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001213 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001214
1215 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1216 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1217 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1218 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1219 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1220}
1221
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001222func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001223 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001224 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001225 name: "myapex2",
1226 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001227 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001228 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001229 }
1230
1231 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001232 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001233 public_key: "testkey.avbpubkey",
1234 private_key: "testkey.pem",
1235 }
1236
1237 cc_library {
1238 name: "mylib",
1239 srcs: ["mylib.cpp"],
1240 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001241 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001242 system_shared_libs: [],
1243 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001244 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001245 }
1246
1247 cc_library {
1248 name: "libfoo",
1249 srcs: ["mylib.cpp"],
1250 shared_libs: ["libbar"],
1251 system_shared_libs: [],
1252 stl: "none",
1253 stubs: {
1254 versions: ["10", "20", "30"],
1255 },
1256 }
1257
1258 cc_library {
1259 name: "libbar",
1260 srcs: ["mylib.cpp"],
1261 system_shared_libs: [],
1262 stl: "none",
1263 }
1264
Jiyong Park678c8812020-02-07 17:25:49 +09001265 cc_library_static {
1266 name: "libbaz",
1267 srcs: ["mylib.cpp"],
1268 system_shared_libs: [],
1269 stl: "none",
1270 apex_available: [ "myapex2" ],
1271 }
1272
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001273 `)
1274
Jiyong Park83dc74b2020-01-14 18:38:44 +09001275 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001276 copyCmds := apexRule.Args["copy_commands"]
1277
1278 // Ensure that direct non-stubs dep is always included
1279 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1280
1281 // Ensure that indirect stubs dep is not included
1282 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1283
1284 // Ensure that dependency of stubs is not included
1285 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1286
Colin Crossaede88c2020-08-11 12:17:01 -07001287 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001288
1289 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001290 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001291 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001292 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001293
Jiyong Park3ff16992019-12-27 14:11:47 +09001294 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001295
1296 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1297 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001298
Artur Satayeva8bd1132020-04-27 18:07:06 +01001299 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001300 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001301
Artur Satayeva8bd1132020-04-27 18:07:06 +01001302 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001303 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001304}
1305
Jooyung Hand3639552019-08-09 12:57:43 +09001306func TestApexWithRuntimeLibsDependency(t *testing.T) {
1307 /*
1308 myapex
1309 |
1310 v (runtime_libs)
1311 mylib ------+------> libfoo [provides stub]
1312 |
1313 `------> libbar
1314 */
Colin Cross1c460562021-02-16 17:55:47 -08001315 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001316 apex {
1317 name: "myapex",
1318 key: "myapex.key",
1319 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001320 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001321 }
1322
1323 apex_key {
1324 name: "myapex.key",
1325 public_key: "testkey.avbpubkey",
1326 private_key: "testkey.pem",
1327 }
1328
1329 cc_library {
1330 name: "mylib",
1331 srcs: ["mylib.cpp"],
1332 runtime_libs: ["libfoo", "libbar"],
1333 system_shared_libs: [],
1334 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001335 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001336 }
1337
1338 cc_library {
1339 name: "libfoo",
1340 srcs: ["mylib.cpp"],
1341 system_shared_libs: [],
1342 stl: "none",
1343 stubs: {
1344 versions: ["10", "20", "30"],
1345 },
1346 }
1347
1348 cc_library {
1349 name: "libbar",
1350 srcs: ["mylib.cpp"],
1351 system_shared_libs: [],
1352 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001353 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001354 }
1355
1356 `)
1357
Sundong Ahnabb64432019-10-22 13:58:29 +09001358 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001359 copyCmds := apexRule.Args["copy_commands"]
1360
1361 // Ensure that direct non-stubs dep is always included
1362 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1363
1364 // Ensure that indirect stubs dep is not included
1365 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1366
1367 // Ensure that runtime_libs dep in included
1368 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1369
Sundong Ahnabb64432019-10-22 13:58:29 +09001370 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001371 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1372 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001373
1374}
1375
Paul Duffina02cae32021-03-09 01:44:06 +00001376var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1377 cc.PrepareForTestWithCcBuildComponents,
1378 PrepareForTestWithApexBuildComponents,
1379 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001380 apex {
1381 name: "com.android.runtime",
1382 key: "com.android.runtime.key",
1383 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001384 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001385 }
1386
1387 apex_key {
1388 name: "com.android.runtime.key",
1389 public_key: "testkey.avbpubkey",
1390 private_key: "testkey.pem",
1391 }
Paul Duffina02cae32021-03-09 01:44:06 +00001392 `),
1393 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1394)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001395
Paul Duffina02cae32021-03-09 01:44:06 +00001396func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001397 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001398 cc_library {
1399 name: "libc",
1400 no_libcrt: true,
1401 nocrt: true,
1402 stl: "none",
1403 system_shared_libs: [],
1404 stubs: { versions: ["1"] },
1405 apex_available: ["com.android.runtime"],
1406
1407 sanitize: {
1408 hwaddress: true,
1409 }
1410 }
1411
1412 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001413 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001414 no_libcrt: true,
1415 nocrt: true,
1416 stl: "none",
1417 system_shared_libs: [],
1418 srcs: [""],
1419 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001420 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001421
1422 sanitize: {
1423 never: true,
1424 },
Paul Duffina02cae32021-03-09 01:44:06 +00001425 } `)
1426 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001427
1428 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1429 "lib64/bionic/libc.so",
1430 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1431 })
1432
Colin Cross4c4c1be2022-02-10 11:41:18 -08001433 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001434
1435 installed := hwasan.Description("install libclang_rt.hwasan")
1436 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1437
1438 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1439 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1440 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1441}
1442
1443func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001444 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001445 prepareForTestOfRuntimeApexWithHwasan,
1446 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1447 variables.SanitizeDevice = []string{"hwaddress"}
1448 }),
1449 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001450 cc_library {
1451 name: "libc",
1452 no_libcrt: true,
1453 nocrt: true,
1454 stl: "none",
1455 system_shared_libs: [],
1456 stubs: { versions: ["1"] },
1457 apex_available: ["com.android.runtime"],
1458 }
1459
1460 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001461 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001462 no_libcrt: true,
1463 nocrt: true,
1464 stl: "none",
1465 system_shared_libs: [],
1466 srcs: [""],
1467 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001468 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001469
1470 sanitize: {
1471 never: true,
1472 },
1473 }
Paul Duffina02cae32021-03-09 01:44:06 +00001474 `)
1475 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001476
1477 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1478 "lib64/bionic/libc.so",
1479 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1480 })
1481
Colin Cross4c4c1be2022-02-10 11:41:18 -08001482 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001483
1484 installed := hwasan.Description("install libclang_rt.hwasan")
1485 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1486
1487 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1488 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1489 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1490}
1491
Jooyung Han61b66e92020-03-21 14:21:46 +00001492func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1493 testcases := []struct {
1494 name string
1495 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001496 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001497 shouldLink string
1498 shouldNotLink []string
1499 }{
1500 {
Jiyong Park55549df2021-02-26 23:57:23 +09001501 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001502 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001503 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001504 shouldLink: "current",
1505 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001506 },
1507 {
Jiyong Park55549df2021-02-26 23:57:23 +09001508 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001509 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001510 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001511 shouldLink: "current",
1512 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001513 },
1514 }
1515 for _, tc := range testcases {
1516 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001517 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001518 apex {
1519 name: "myapex",
1520 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001521 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001522 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001523 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001524 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001525
Jooyung Han61b66e92020-03-21 14:21:46 +00001526 apex_key {
1527 name: "myapex.key",
1528 public_key: "testkey.avbpubkey",
1529 private_key: "testkey.pem",
1530 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001531
Jooyung Han61b66e92020-03-21 14:21:46 +00001532 cc_library {
1533 name: "mylib",
1534 srcs: ["mylib.cpp"],
1535 vendor_available: true,
1536 shared_libs: ["libbar"],
1537 system_shared_libs: [],
1538 stl: "none",
1539 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001540 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001541 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001542
Jooyung Han61b66e92020-03-21 14:21:46 +00001543 cc_library {
1544 name: "libbar",
1545 srcs: ["mylib.cpp"],
1546 system_shared_libs: [],
1547 stl: "none",
1548 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001549 llndk: {
1550 symbol_file: "libbar.map.txt",
1551 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001552 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001553 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001554 withUnbundledBuild,
1555 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001556
Jooyung Han61b66e92020-03-21 14:21:46 +00001557 // Ensure that LLNDK dep is not included
1558 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1559 "lib64/mylib.so",
1560 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001561
Jooyung Han61b66e92020-03-21 14:21:46 +00001562 // Ensure that LLNDK dep is required
1563 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1564 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1565 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001566
Steven Moreland2c4000c2021-04-27 02:08:49 +00001567 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1568 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001569 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001570 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001571 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001572
Steven Moreland2c4000c2021-04-27 02:08:49 +00001573 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001574 ver := tc.shouldLink
1575 if tc.shouldLink == "current" {
1576 ver = strconv.Itoa(android.FutureApiLevelInt)
1577 }
1578 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001579 })
1580 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001581}
1582
Jiyong Park25fc6a92018-11-18 18:02:45 +09001583func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001584 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001585 apex {
1586 name: "myapex",
1587 key: "myapex.key",
1588 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001589 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001590 }
1591
1592 apex_key {
1593 name: "myapex.key",
1594 public_key: "testkey.avbpubkey",
1595 private_key: "testkey.pem",
1596 }
1597
1598 cc_library {
1599 name: "mylib",
1600 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001601 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001602 shared_libs: ["libdl#27"],
1603 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001604 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001605 }
1606
1607 cc_library_shared {
1608 name: "mylib_shared",
1609 srcs: ["mylib.cpp"],
1610 shared_libs: ["libdl#27"],
1611 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001612 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001613 }
1614
1615 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001616 name: "libBootstrap",
1617 srcs: ["mylib.cpp"],
1618 stl: "none",
1619 bootstrap: true,
1620 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001621 `)
1622
Sundong Ahnabb64432019-10-22 13:58:29 +09001623 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001624 copyCmds := apexRule.Args["copy_commands"]
1625
1626 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001627 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001628 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1629 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001630
1631 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001632 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001633
Colin Crossaede88c2020-08-11 12:17:01 -07001634 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1635 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1636 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001637
1638 // For dependency to libc
1639 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001640 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001641 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001642 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001643 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001644 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1645 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001646
1647 // For dependency to libm
1648 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001649 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001650 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001651 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001652 // ... and is not compiling with the stub
1653 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1654 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1655
1656 // For dependency to libdl
1657 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001658 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001659 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001660 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1661 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001662 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001663 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001664 // ... Cflags from stub is correctly exported to mylib
1665 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1666 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001667
1668 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001669 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1670 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1671 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1672 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001673}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001674
Jooyung Han749dc692020-04-15 11:03:39 +09001675func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001676 // there are three links between liba --> libz.
1677 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001678 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001679 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001680 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001681 apex {
1682 name: "myapex",
1683 key: "myapex.key",
1684 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001685 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001686 }
1687
1688 apex {
1689 name: "otherapex",
1690 key: "myapex.key",
1691 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001692 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001693 }
1694
1695 apex_key {
1696 name: "myapex.key",
1697 public_key: "testkey.avbpubkey",
1698 private_key: "testkey.pem",
1699 }
1700
1701 cc_library {
1702 name: "libx",
1703 shared_libs: ["liba"],
1704 system_shared_libs: [],
1705 stl: "none",
1706 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001707 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001708 }
1709
1710 cc_library {
1711 name: "liby",
1712 shared_libs: ["liba"],
1713 system_shared_libs: [],
1714 stl: "none",
1715 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001716 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001717 }
1718
1719 cc_library {
1720 name: "liba",
1721 shared_libs: ["libz"],
1722 system_shared_libs: [],
1723 stl: "none",
1724 apex_available: [
1725 "//apex_available:anyapex",
1726 "//apex_available:platform",
1727 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001728 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001729 }
1730
1731 cc_library {
1732 name: "libz",
1733 system_shared_libs: [],
1734 stl: "none",
1735 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001736 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001737 },
1738 }
Jooyung Han749dc692020-04-15 11:03:39 +09001739 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001740
1741 expectLink := func(from, from_variant, to, to_variant string) {
1742 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1743 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1744 }
1745 expectNoLink := func(from, from_variant, to, to_variant string) {
1746 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1747 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1748 }
1749 // platform liba is linked to non-stub version
1750 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001751 // liba in myapex is linked to current
1752 expectLink("liba", "shared_apex29", "libz", "shared_current")
1753 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001754 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001755 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001756 // liba in otherapex is linked to current
1757 expectLink("liba", "shared_apex30", "libz", "shared_current")
1758 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001759 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1760 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001761}
1762
Jooyung Hanaed150d2020-04-02 01:41:41 +09001763func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001764 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001765 apex {
1766 name: "myapex",
1767 key: "myapex.key",
1768 native_shared_libs: ["libx"],
1769 min_sdk_version: "R",
1770 }
1771
1772 apex_key {
1773 name: "myapex.key",
1774 public_key: "testkey.avbpubkey",
1775 private_key: "testkey.pem",
1776 }
1777
1778 cc_library {
1779 name: "libx",
1780 shared_libs: ["libz"],
1781 system_shared_libs: [],
1782 stl: "none",
1783 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001784 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001785 }
1786
1787 cc_library {
1788 name: "libz",
1789 system_shared_libs: [],
1790 stl: "none",
1791 stubs: {
1792 versions: ["29", "R"],
1793 },
1794 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001795 `,
1796 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1797 variables.Platform_version_active_codenames = []string{"R"}
1798 }),
1799 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001800
1801 expectLink := func(from, from_variant, to, to_variant string) {
1802 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1803 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1804 }
1805 expectNoLink := func(from, from_variant, to, to_variant string) {
1806 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1807 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1808 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001809 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1810 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001811 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1812 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001813}
1814
Jooyung Han4c4da062021-06-23 10:23:16 +09001815func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1816 testApex(t, `
1817 apex {
1818 name: "myapex",
1819 key: "myapex.key",
1820 java_libs: ["libx"],
1821 min_sdk_version: "S",
1822 }
1823
1824 apex_key {
1825 name: "myapex.key",
1826 public_key: "testkey.avbpubkey",
1827 private_key: "testkey.pem",
1828 }
1829
1830 java_library {
1831 name: "libx",
1832 srcs: ["a.java"],
1833 apex_available: [ "myapex" ],
1834 sdk_version: "current",
1835 min_sdk_version: "S", // should be okay
1836 }
1837 `,
1838 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1839 variables.Platform_version_active_codenames = []string{"S"}
1840 variables.Platform_sdk_codename = proptools.StringPtr("S")
1841 }),
1842 )
1843}
1844
Jooyung Han749dc692020-04-15 11:03:39 +09001845func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001846 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001847 apex {
1848 name: "myapex",
1849 key: "myapex.key",
1850 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001851 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001852 }
1853
1854 apex_key {
1855 name: "myapex.key",
1856 public_key: "testkey.avbpubkey",
1857 private_key: "testkey.pem",
1858 }
1859
1860 cc_library {
1861 name: "libx",
1862 shared_libs: ["libz"],
1863 system_shared_libs: [],
1864 stl: "none",
1865 apex_available: [ "myapex" ],
1866 }
1867
1868 cc_library {
1869 name: "libz",
1870 system_shared_libs: [],
1871 stl: "none",
1872 stubs: {
1873 versions: ["1", "2"],
1874 },
1875 }
1876 `)
1877
1878 expectLink := func(from, from_variant, to, to_variant string) {
1879 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1880 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1881 }
1882 expectNoLink := func(from, from_variant, to, to_variant string) {
1883 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1884 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1885 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001886 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001887 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001888 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001889 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001890}
1891
Jiyong Park5df7bd32021-08-25 16:18:46 +09001892func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1893 ctx := testApex(t, `
1894 apex {
1895 name: "myapex",
1896 key: "myapex.key",
1897 native_shared_libs: ["mylib"],
1898 updatable: false,
1899 vendor: true,
1900 min_sdk_version: "29",
1901 }
1902
1903 apex_key {
1904 name: "myapex.key",
1905 public_key: "testkey.avbpubkey",
1906 private_key: "testkey.pem",
1907 }
1908
1909 cc_library {
1910 name: "mylib",
1911 vendor_available: true,
1912 system_shared_libs: [],
1913 stl: "none",
1914 apex_available: [ "myapex" ],
1915 min_sdk_version: "29",
1916 }
1917 `)
1918
1919 vendorVariant := "android_vendor.29_arm64_armv8-a"
1920
1921 // First check that the correct variant of crtbegin_so is used.
1922 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1923 crtBegin := names(ldRule.Args["crtBegin"])
1924 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1925
1926 // Ensure that the crtbegin_so used by the APEX is targeting 29
1927 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1928 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1929}
1930
Jooyung Han03b51852020-02-26 22:45:42 +09001931func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001932 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001933 apex {
1934 name: "myapex",
1935 key: "myapex.key",
1936 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001937 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001938 }
1939
1940 apex_key {
1941 name: "myapex.key",
1942 public_key: "testkey.avbpubkey",
1943 private_key: "testkey.pem",
1944 }
1945
1946 cc_library {
1947 name: "libx",
1948 system_shared_libs: [],
1949 stl: "none",
1950 apex_available: [ "myapex" ],
1951 stubs: {
1952 versions: ["1", "2"],
1953 },
1954 }
1955
1956 cc_library {
1957 name: "libz",
1958 shared_libs: ["libx"],
1959 system_shared_libs: [],
1960 stl: "none",
1961 }
1962 `)
1963
1964 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001965 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001966 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1967 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1968 }
1969 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001970 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001971 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1972 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1973 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001974 expectLink("libz", "shared", "libx", "shared_current")
1975 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001976 expectNoLink("libz", "shared", "libz", "shared_1")
1977 expectNoLink("libz", "shared", "libz", "shared")
1978}
1979
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001980var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1981 func(variables android.FixtureProductVariables) {
1982 variables.SanitizeDevice = []string{"hwaddress"}
1983 },
1984)
1985
Jooyung Han75568392020-03-20 04:29:24 +09001986func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001987 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001988 apex {
1989 name: "myapex",
1990 key: "myapex.key",
1991 native_shared_libs: ["libx"],
1992 min_sdk_version: "29",
1993 }
1994
1995 apex_key {
1996 name: "myapex.key",
1997 public_key: "testkey.avbpubkey",
1998 private_key: "testkey.pem",
1999 }
2000
2001 cc_library {
2002 name: "libx",
2003 shared_libs: ["libbar"],
2004 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002005 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002006 }
2007
2008 cc_library {
2009 name: "libbar",
2010 stubs: {
2011 versions: ["29", "30"],
2012 },
2013 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002014 `,
2015 prepareForTestWithSantitizeHwaddress,
2016 )
Jooyung Han03b51852020-02-26 22:45:42 +09002017 expectLink := func(from, from_variant, to, to_variant string) {
2018 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2019 libFlags := ld.Args["libFlags"]
2020 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2021 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002022 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002023}
2024
Jooyung Han75568392020-03-20 04:29:24 +09002025func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002026 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002027 apex {
2028 name: "myapex",
2029 key: "myapex.key",
2030 native_shared_libs: ["libx"],
2031 min_sdk_version: "29",
2032 }
2033
2034 apex_key {
2035 name: "myapex.key",
2036 public_key: "testkey.avbpubkey",
2037 private_key: "testkey.pem",
2038 }
2039
2040 cc_library {
2041 name: "libx",
2042 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002043 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002044 }
Jooyung Han75568392020-03-20 04:29:24 +09002045 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002046
2047 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002048 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002049 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002050 // note that platform variant is not.
2051 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002052 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002053}
2054
Jooyung Han749dc692020-04-15 11:03:39 +09002055func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2056 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002057 apex {
2058 name: "myapex",
2059 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002060 native_shared_libs: ["mylib"],
2061 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002062 }
2063
2064 apex_key {
2065 name: "myapex.key",
2066 public_key: "testkey.avbpubkey",
2067 private_key: "testkey.pem",
2068 }
Jooyung Han749dc692020-04-15 11:03:39 +09002069
2070 cc_library {
2071 name: "mylib",
2072 srcs: ["mylib.cpp"],
2073 system_shared_libs: [],
2074 stl: "none",
2075 apex_available: [
2076 "myapex",
2077 ],
2078 min_sdk_version: "30",
2079 }
2080 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002081
2082 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2083 apex {
2084 name: "myapex",
2085 key: "myapex.key",
2086 native_shared_libs: ["libfoo.ffi"],
2087 min_sdk_version: "29",
2088 }
2089
2090 apex_key {
2091 name: "myapex.key",
2092 public_key: "testkey.avbpubkey",
2093 private_key: "testkey.pem",
2094 }
2095
2096 rust_ffi_shared {
2097 name: "libfoo.ffi",
2098 srcs: ["foo.rs"],
2099 crate_name: "foo",
2100 apex_available: [
2101 "myapex",
2102 ],
2103 min_sdk_version: "30",
2104 }
2105 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002106
2107 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2108 apex {
2109 name: "myapex",
2110 key: "myapex.key",
2111 java_libs: ["libfoo"],
2112 min_sdk_version: "29",
2113 }
2114
2115 apex_key {
2116 name: "myapex.key",
2117 public_key: "testkey.avbpubkey",
2118 private_key: "testkey.pem",
2119 }
2120
2121 java_import {
2122 name: "libfoo",
2123 jars: ["libfoo.jar"],
2124 apex_available: [
2125 "myapex",
2126 ],
2127 min_sdk_version: "30",
2128 }
2129 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002130}
2131
2132func TestApexMinSdkVersion_Okay(t *testing.T) {
2133 testApex(t, `
2134 apex {
2135 name: "myapex",
2136 key: "myapex.key",
2137 native_shared_libs: ["libfoo"],
2138 java_libs: ["libbar"],
2139 min_sdk_version: "29",
2140 }
2141
2142 apex_key {
2143 name: "myapex.key",
2144 public_key: "testkey.avbpubkey",
2145 private_key: "testkey.pem",
2146 }
2147
2148 cc_library {
2149 name: "libfoo",
2150 srcs: ["mylib.cpp"],
2151 shared_libs: ["libfoo_dep"],
2152 apex_available: ["myapex"],
2153 min_sdk_version: "29",
2154 }
2155
2156 cc_library {
2157 name: "libfoo_dep",
2158 srcs: ["mylib.cpp"],
2159 apex_available: ["myapex"],
2160 min_sdk_version: "29",
2161 }
2162
2163 java_library {
2164 name: "libbar",
2165 sdk_version: "current",
2166 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002167 static_libs: [
2168 "libbar_dep",
2169 "libbar_import_dep",
2170 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002171 apex_available: ["myapex"],
2172 min_sdk_version: "29",
2173 }
2174
2175 java_library {
2176 name: "libbar_dep",
2177 sdk_version: "current",
2178 srcs: ["a.java"],
2179 apex_available: ["myapex"],
2180 min_sdk_version: "29",
2181 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002182
2183 java_import {
2184 name: "libbar_import_dep",
2185 jars: ["libbar.jar"],
2186 apex_available: ["myapex"],
2187 min_sdk_version: "29",
2188 }
Jooyung Han03b51852020-02-26 22:45:42 +09002189 `)
2190}
2191
Colin Cross8ca61c12022-10-06 21:00:14 -07002192func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2193 // Tests that an apex dependency with min_sdk_version higher than the
2194 // min_sdk_version of the apex is allowed as long as the dependency's
2195 // min_sdk_version is less than or equal to the api level that the
2196 // architecture was introduced in. In this case, arm64 didn't exist
2197 // until api level 21, so the arm64 code will never need to run on
2198 // an api level 20 device, even if other architectures of the apex
2199 // will.
2200 testApex(t, `
2201 apex {
2202 name: "myapex",
2203 key: "myapex.key",
2204 native_shared_libs: ["libfoo"],
2205 min_sdk_version: "20",
2206 }
2207
2208 apex_key {
2209 name: "myapex.key",
2210 public_key: "testkey.avbpubkey",
2211 private_key: "testkey.pem",
2212 }
2213
2214 cc_library {
2215 name: "libfoo",
2216 srcs: ["mylib.cpp"],
2217 apex_available: ["myapex"],
2218 min_sdk_version: "21",
2219 stl: "none",
2220 }
2221 `)
2222}
2223
Artur Satayev8cf899a2020-04-15 17:29:42 +01002224func TestJavaStableSdkVersion(t *testing.T) {
2225 testCases := []struct {
2226 name string
2227 expectedError string
2228 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002229 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002230 }{
2231 {
2232 name: "Non-updatable apex with non-stable dep",
2233 bp: `
2234 apex {
2235 name: "myapex",
2236 java_libs: ["myjar"],
2237 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002238 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002239 }
2240 apex_key {
2241 name: "myapex.key",
2242 public_key: "testkey.avbpubkey",
2243 private_key: "testkey.pem",
2244 }
2245 java_library {
2246 name: "myjar",
2247 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002248 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002249 apex_available: ["myapex"],
2250 }
2251 `,
2252 },
2253 {
2254 name: "Updatable apex with stable dep",
2255 bp: `
2256 apex {
2257 name: "myapex",
2258 java_libs: ["myjar"],
2259 key: "myapex.key",
2260 updatable: true,
2261 min_sdk_version: "29",
2262 }
2263 apex_key {
2264 name: "myapex.key",
2265 public_key: "testkey.avbpubkey",
2266 private_key: "testkey.pem",
2267 }
2268 java_library {
2269 name: "myjar",
2270 srcs: ["foo/bar/MyClass.java"],
2271 sdk_version: "current",
2272 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002273 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002274 }
2275 `,
2276 },
2277 {
2278 name: "Updatable apex with non-stable dep",
2279 expectedError: "cannot depend on \"myjar\"",
2280 bp: `
2281 apex {
2282 name: "myapex",
2283 java_libs: ["myjar"],
2284 key: "myapex.key",
2285 updatable: true,
2286 }
2287 apex_key {
2288 name: "myapex.key",
2289 public_key: "testkey.avbpubkey",
2290 private_key: "testkey.pem",
2291 }
2292 java_library {
2293 name: "myjar",
2294 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002295 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002296 apex_available: ["myapex"],
2297 }
2298 `,
2299 },
2300 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002301 name: "Updatable apex with non-stable legacy core platform dep",
2302 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2303 bp: `
2304 apex {
2305 name: "myapex",
2306 java_libs: ["myjar-uses-legacy"],
2307 key: "myapex.key",
2308 updatable: true,
2309 }
2310 apex_key {
2311 name: "myapex.key",
2312 public_key: "testkey.avbpubkey",
2313 private_key: "testkey.pem",
2314 }
2315 java_library {
2316 name: "myjar-uses-legacy",
2317 srcs: ["foo/bar/MyClass.java"],
2318 sdk_version: "core_platform",
2319 apex_available: ["myapex"],
2320 }
2321 `,
2322 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2323 },
2324 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002325 name: "Updatable apex with non-stable transitive dep",
2326 // This is not actually detecting that the transitive dependency is unstable, rather it is
2327 // detecting that the transitive dependency is building against a wider API surface than the
2328 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002329 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002330 bp: `
2331 apex {
2332 name: "myapex",
2333 java_libs: ["myjar"],
2334 key: "myapex.key",
2335 updatable: true,
2336 }
2337 apex_key {
2338 name: "myapex.key",
2339 public_key: "testkey.avbpubkey",
2340 private_key: "testkey.pem",
2341 }
2342 java_library {
2343 name: "myjar",
2344 srcs: ["foo/bar/MyClass.java"],
2345 sdk_version: "current",
2346 apex_available: ["myapex"],
2347 static_libs: ["transitive-jar"],
2348 }
2349 java_library {
2350 name: "transitive-jar",
2351 srcs: ["foo/bar/MyClass.java"],
2352 sdk_version: "core_platform",
2353 apex_available: ["myapex"],
2354 }
2355 `,
2356 },
2357 }
2358
2359 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002360 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2361 continue
2362 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002363 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002364 errorHandler := android.FixtureExpectsNoErrors
2365 if test.expectedError != "" {
2366 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002367 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002368 android.GroupFixturePreparers(
2369 java.PrepareForTestWithJavaDefaultModules,
2370 PrepareForTestWithApexBuildComponents,
2371 prepareForTestWithMyapex,
2372 android.OptionalFixturePreparer(test.preparer),
2373 ).
2374 ExtendWithErrorHandler(errorHandler).
2375 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002376 })
2377 }
2378}
2379
Jooyung Han749dc692020-04-15 11:03:39 +09002380func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2381 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2382 apex {
2383 name: "myapex",
2384 key: "myapex.key",
2385 native_shared_libs: ["mylib"],
2386 min_sdk_version: "29",
2387 }
2388
2389 apex_key {
2390 name: "myapex.key",
2391 public_key: "testkey.avbpubkey",
2392 private_key: "testkey.pem",
2393 }
2394
2395 cc_library {
2396 name: "mylib",
2397 srcs: ["mylib.cpp"],
2398 shared_libs: ["mylib2"],
2399 system_shared_libs: [],
2400 stl: "none",
2401 apex_available: [
2402 "myapex",
2403 ],
2404 min_sdk_version: "29",
2405 }
2406
2407 // indirect part of the apex
2408 cc_library {
2409 name: "mylib2",
2410 srcs: ["mylib.cpp"],
2411 system_shared_libs: [],
2412 stl: "none",
2413 apex_available: [
2414 "myapex",
2415 ],
2416 min_sdk_version: "30",
2417 }
2418 `)
2419}
2420
2421func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2422 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2423 apex {
2424 name: "myapex",
2425 key: "myapex.key",
2426 apps: ["AppFoo"],
2427 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002428 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002429 }
2430
2431 apex_key {
2432 name: "myapex.key",
2433 public_key: "testkey.avbpubkey",
2434 private_key: "testkey.pem",
2435 }
2436
2437 android_app {
2438 name: "AppFoo",
2439 srcs: ["foo/bar/MyClass.java"],
2440 sdk_version: "current",
2441 min_sdk_version: "29",
2442 system_modules: "none",
2443 stl: "none",
2444 static_libs: ["bar"],
2445 apex_available: [ "myapex" ],
2446 }
2447
2448 java_library {
2449 name: "bar",
2450 sdk_version: "current",
2451 srcs: ["a.java"],
2452 apex_available: [ "myapex" ],
2453 }
2454 `)
2455}
2456
2457func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002458 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002459 apex {
2460 name: "myapex",
2461 key: "myapex.key",
2462 native_shared_libs: ["mylib"],
2463 min_sdk_version: "29",
2464 }
2465
2466 apex_key {
2467 name: "myapex.key",
2468 public_key: "testkey.avbpubkey",
2469 private_key: "testkey.pem",
2470 }
2471
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002472 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002473 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2474 cc_library {
2475 name: "mylib",
2476 srcs: ["mylib.cpp"],
2477 shared_libs: ["mylib2"],
2478 system_shared_libs: [],
2479 stl: "none",
2480 apex_available: ["myapex", "otherapex"],
2481 min_sdk_version: "29",
2482 }
2483
2484 cc_library {
2485 name: "mylib2",
2486 srcs: ["mylib.cpp"],
2487 system_shared_libs: [],
2488 stl: "none",
2489 apex_available: ["otherapex"],
2490 stubs: { versions: ["29", "30"] },
2491 min_sdk_version: "30",
2492 }
2493
2494 apex {
2495 name: "otherapex",
2496 key: "myapex.key",
2497 native_shared_libs: ["mylib", "mylib2"],
2498 min_sdk_version: "30",
2499 }
2500 `)
2501 expectLink := func(from, from_variant, to, to_variant string) {
2502 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2503 libFlags := ld.Args["libFlags"]
2504 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2505 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002506 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002507 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002508}
2509
Jooyung Haned124c32021-01-26 11:43:46 +09002510func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002511 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2512 func(variables android.FixtureProductVariables) {
2513 variables.Platform_sdk_codename = proptools.StringPtr("S")
2514 variables.Platform_version_active_codenames = []string{"S"}
2515 },
2516 )
Jooyung Haned124c32021-01-26 11:43:46 +09002517 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2518 apex {
2519 name: "myapex",
2520 key: "myapex.key",
2521 native_shared_libs: ["libfoo"],
2522 min_sdk_version: "S",
2523 }
2524 apex_key {
2525 name: "myapex.key",
2526 public_key: "testkey.avbpubkey",
2527 private_key: "testkey.pem",
2528 }
2529 cc_library {
2530 name: "libfoo",
2531 shared_libs: ["libbar"],
2532 apex_available: ["myapex"],
2533 min_sdk_version: "29",
2534 }
2535 cc_library {
2536 name: "libbar",
2537 apex_available: ["myapex"],
2538 }
2539 `, withSAsActiveCodeNames)
2540}
2541
2542func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002543 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2544 variables.Platform_sdk_codename = proptools.StringPtr("S")
2545 variables.Platform_version_active_codenames = []string{"S", "T"}
2546 })
Colin Cross1c460562021-02-16 17:55:47 -08002547 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002548 apex {
2549 name: "myapex",
2550 key: "myapex.key",
2551 native_shared_libs: ["libfoo"],
2552 min_sdk_version: "S",
2553 }
2554 apex_key {
2555 name: "myapex.key",
2556 public_key: "testkey.avbpubkey",
2557 private_key: "testkey.pem",
2558 }
2559 cc_library {
2560 name: "libfoo",
2561 shared_libs: ["libbar"],
2562 apex_available: ["myapex"],
2563 min_sdk_version: "S",
2564 }
2565 cc_library {
2566 name: "libbar",
2567 stubs: {
2568 symbol_file: "libbar.map.txt",
2569 versions: ["30", "S", "T"],
2570 },
2571 }
2572 `, withSAsActiveCodeNames)
2573
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002574 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002575 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2576 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002577 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002578}
2579
Jiyong Park7c2ee712018-12-07 00:42:25 +09002580func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002581 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002582 apex {
2583 name: "myapex",
2584 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002585 native_shared_libs: ["mylib"],
2586 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002587 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002588 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002589 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002590 }
2591
2592 apex_key {
2593 name: "myapex.key",
2594 public_key: "testkey.avbpubkey",
2595 private_key: "testkey.pem",
2596 }
2597
2598 prebuilt_etc {
2599 name: "myetc",
2600 src: "myprebuilt",
2601 sub_dir: "foo/bar",
2602 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002603
2604 cc_library {
2605 name: "mylib",
2606 srcs: ["mylib.cpp"],
2607 relative_install_path: "foo/bar",
2608 system_shared_libs: [],
2609 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002610 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002611 }
2612
2613 cc_binary {
2614 name: "mybin",
2615 srcs: ["mylib.cpp"],
2616 relative_install_path: "foo/bar",
2617 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002618 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002619 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002620 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002621 `)
2622
Sundong Ahnabb64432019-10-22 13:58:29 +09002623 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002624 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002625
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002626 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002627 ensureContains(t, cmd, "/etc ")
2628 ensureContains(t, cmd, "/etc/foo ")
2629 ensureContains(t, cmd, "/etc/foo/bar ")
2630 ensureContains(t, cmd, "/lib64 ")
2631 ensureContains(t, cmd, "/lib64/foo ")
2632 ensureContains(t, cmd, "/lib64/foo/bar ")
2633 ensureContains(t, cmd, "/lib ")
2634 ensureContains(t, cmd, "/lib/foo ")
2635 ensureContains(t, cmd, "/lib/foo/bar ")
2636 ensureContains(t, cmd, "/bin ")
2637 ensureContains(t, cmd, "/bin/foo ")
2638 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002639}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002640
Jooyung Han35155c42020-02-06 17:33:20 +09002641func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002642 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002643 apex {
2644 name: "myapex",
2645 key: "myapex.key",
2646 multilib: {
2647 both: {
2648 native_shared_libs: ["mylib"],
2649 binaries: ["mybin"],
2650 },
2651 },
2652 compile_multilib: "both",
2653 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002654 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002655 }
2656
2657 apex_key {
2658 name: "myapex.key",
2659 public_key: "testkey.avbpubkey",
2660 private_key: "testkey.pem",
2661 }
2662
2663 cc_library {
2664 name: "mylib",
2665 relative_install_path: "foo/bar",
2666 system_shared_libs: [],
2667 stl: "none",
2668 apex_available: [ "myapex" ],
2669 native_bridge_supported: true,
2670 }
2671
2672 cc_binary {
2673 name: "mybin",
2674 relative_install_path: "foo/bar",
2675 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002676 stl: "none",
2677 apex_available: [ "myapex" ],
2678 native_bridge_supported: true,
2679 compile_multilib: "both", // default is "first" for binary
2680 multilib: {
2681 lib64: {
2682 suffix: "64",
2683 },
2684 },
2685 }
2686 `, withNativeBridgeEnabled)
2687 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2688 "bin/foo/bar/mybin",
2689 "bin/foo/bar/mybin64",
2690 "bin/arm/foo/bar/mybin",
2691 "bin/arm64/foo/bar/mybin64",
2692 "lib/foo/bar/mylib.so",
2693 "lib/arm/foo/bar/mylib.so",
2694 "lib64/foo/bar/mylib.so",
2695 "lib64/arm64/foo/bar/mylib.so",
2696 })
2697}
2698
Jooyung Han85d61762020-06-24 23:50:26 +09002699func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002700 result := android.GroupFixturePreparers(
2701 prepareForApexTest,
2702 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2703 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002704 apex {
2705 name: "myapex",
2706 key: "myapex.key",
2707 binaries: ["mybin"],
2708 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002709 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002710 }
2711 apex_key {
2712 name: "myapex.key",
2713 public_key: "testkey.avbpubkey",
2714 private_key: "testkey.pem",
2715 }
2716 cc_binary {
2717 name: "mybin",
2718 vendor: true,
2719 shared_libs: ["libfoo"],
2720 }
2721 cc_library {
2722 name: "libfoo",
2723 proprietary: true,
2724 }
2725 `)
2726
Colin Crossc68db4b2021-11-11 18:59:15 -08002727 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002728 "bin/mybin",
2729 "lib64/libfoo.so",
2730 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2731 "lib64/libc++.so",
2732 })
2733
Colin Crossc68db4b2021-11-11 18:59:15 -08002734 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2735 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002736 name := apexBundle.BaseModuleName()
2737 prefix := "TARGET_"
2738 var builder strings.Builder
2739 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002740 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002741 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002742 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002743
Colin Crossc68db4b2021-11-11 18:59:15 -08002744 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002745 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2746 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002747}
2748
Jooyung Hanc5a96762022-02-04 11:54:50 +09002749func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2750 testApexError(t, `Trying to include a VNDK library`, `
2751 apex {
2752 name: "myapex",
2753 key: "myapex.key",
2754 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2755 vendor: true,
2756 use_vndk_as_stable: true,
2757 updatable: false,
2758 }
2759 apex_key {
2760 name: "myapex.key",
2761 public_key: "testkey.avbpubkey",
2762 private_key: "testkey.pem",
2763 }`)
2764}
2765
Jooyung Handf78e212020-07-22 15:54:47 +09002766func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002767 // myapex myapex2
2768 // | |
2769 // mybin ------. mybin2
2770 // \ \ / |
2771 // (stable) .---\--------` |
2772 // \ / \ |
2773 // \ / \ /
2774 // libvndk libvendor
2775 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002776 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002777 apex {
2778 name: "myapex",
2779 key: "myapex.key",
2780 binaries: ["mybin"],
2781 vendor: true,
2782 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002783 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002784 }
2785 apex_key {
2786 name: "myapex.key",
2787 public_key: "testkey.avbpubkey",
2788 private_key: "testkey.pem",
2789 }
2790 cc_binary {
2791 name: "mybin",
2792 vendor: true,
2793 shared_libs: ["libvndk", "libvendor"],
2794 }
2795 cc_library {
2796 name: "libvndk",
2797 vndk: {
2798 enabled: true,
2799 },
2800 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002801 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002802 }
2803 cc_library {
2804 name: "libvendor",
2805 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002806 stl: "none",
2807 }
2808 apex {
2809 name: "myapex2",
2810 key: "myapex.key",
2811 binaries: ["mybin2"],
2812 vendor: true,
2813 use_vndk_as_stable: false,
2814 updatable: false,
2815 }
2816 cc_binary {
2817 name: "mybin2",
2818 vendor: true,
2819 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002820 }
2821 `)
2822
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002823 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002824
Jooyung Han91f92032022-02-04 12:36:33 +09002825 for _, tc := range []struct {
2826 name string
2827 apexName string
2828 moduleName string
2829 moduleVariant string
2830 libs []string
2831 contents []string
2832 requireVndkNamespace bool
2833 }{
2834 {
2835 name: "use_vndk_as_stable",
2836 apexName: "myapex",
2837 moduleName: "mybin",
2838 moduleVariant: vendorVariant + "_apex10000",
2839 libs: []string{
2840 // should link with vendor variants of VNDK libs(libvndk/libc++)
2841 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2842 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2843 // unstable Vendor libs as APEX variant
2844 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2845 },
2846 contents: []string{
2847 "bin/mybin",
2848 "lib64/libvendor.so",
2849 // VNDK libs (libvndk/libc++) are not included
2850 },
2851 requireVndkNamespace: true,
2852 },
2853 {
2854 name: "!use_vndk_as_stable",
2855 apexName: "myapex2",
2856 moduleName: "mybin2",
2857 moduleVariant: vendorVariant + "_myapex2",
2858 libs: []string{
2859 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2860 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2861 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2862 // unstable vendor libs have "merged" APEX variants
2863 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2864 },
2865 contents: []string{
2866 "bin/mybin2",
2867 "lib64/libvendor.so",
2868 // VNDK libs are included as well
2869 "lib64/libvndk.so",
2870 "lib64/libc++.so",
2871 },
2872 requireVndkNamespace: false,
2873 },
2874 } {
2875 t.Run(tc.name, func(t *testing.T) {
2876 // Check linked libs
2877 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2878 libs := names(ldRule.Args["libFlags"])
2879 for _, lib := range tc.libs {
2880 ensureListContains(t, libs, lib)
2881 }
2882 // Check apex contents
2883 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002884
Jooyung Han91f92032022-02-04 12:36:33 +09002885 // Check "requireNativeLibs"
2886 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2887 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2888 if tc.requireVndkNamespace {
2889 ensureListContains(t, requireNativeLibs, ":vndk")
2890 } else {
2891 ensureListNotContains(t, requireNativeLibs, ":vndk")
2892 }
2893 })
2894 }
Jooyung Handf78e212020-07-22 15:54:47 +09002895}
2896
Justin Yun13decfb2021-03-08 19:25:55 +09002897func TestProductVariant(t *testing.T) {
2898 ctx := testApex(t, `
2899 apex {
2900 name: "myapex",
2901 key: "myapex.key",
2902 updatable: false,
2903 product_specific: true,
2904 binaries: ["foo"],
2905 }
2906
2907 apex_key {
2908 name: "myapex.key",
2909 public_key: "testkey.avbpubkey",
2910 private_key: "testkey.pem",
2911 }
2912
2913 cc_binary {
2914 name: "foo",
2915 product_available: true,
2916 apex_available: ["myapex"],
2917 srcs: ["foo.cpp"],
2918 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002919 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2920 variables.ProductVndkVersion = proptools.StringPtr("current")
2921 }),
2922 )
Justin Yun13decfb2021-03-08 19:25:55 +09002923
2924 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002925 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002926 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2927 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2928 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2929 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2930}
2931
Jooyung Han8e5685d2020-09-21 11:02:57 +09002932func TestApex_withPrebuiltFirmware(t *testing.T) {
2933 testCases := []struct {
2934 name string
2935 additionalProp string
2936 }{
2937 {"system apex with prebuilt_firmware", ""},
2938 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2939 }
2940 for _, tc := range testCases {
2941 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002942 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002943 apex {
2944 name: "myapex",
2945 key: "myapex.key",
2946 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002947 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002948 `+tc.additionalProp+`
2949 }
2950 apex_key {
2951 name: "myapex.key",
2952 public_key: "testkey.avbpubkey",
2953 private_key: "testkey.pem",
2954 }
2955 prebuilt_firmware {
2956 name: "myfirmware",
2957 src: "myfirmware.bin",
2958 filename_from_src: true,
2959 `+tc.additionalProp+`
2960 }
2961 `)
2962 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2963 "etc/firmware/myfirmware.bin",
2964 })
2965 })
2966 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002967}
2968
Jooyung Hanefb184e2020-06-25 17:14:25 +09002969func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002970 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002971 apex {
2972 name: "myapex",
2973 key: "myapex.key",
2974 vendor: true,
2975 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002976 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002977 }
2978
2979 apex_key {
2980 name: "myapex.key",
2981 public_key: "testkey.avbpubkey",
2982 private_key: "testkey.pem",
2983 }
2984
2985 cc_library {
2986 name: "mylib",
2987 vendor_available: true,
2988 }
2989 `)
2990
2991 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002992 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002993 name := apexBundle.BaseModuleName()
2994 prefix := "TARGET_"
2995 var builder strings.Builder
2996 data.Custom(&builder, name, prefix, "", data)
2997 androidMk := builder.String()
Cole Fausteb8cd312022-11-03 16:39:21 -07002998 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09002999}
3000
Jooyung Han2ed99d02020-06-24 23:26:26 +09003001func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003002 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003003 apex {
3004 name: "myapex",
3005 key: "myapex.key",
3006 vintf_fragments: ["fragment.xml"],
3007 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003008 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003009 }
3010 apex_key {
3011 name: "myapex.key",
3012 public_key: "testkey.avbpubkey",
3013 private_key: "testkey.pem",
3014 }
3015 cc_binary {
3016 name: "mybin",
3017 }
3018 `)
3019
3020 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003021 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003022 name := apexBundle.BaseModuleName()
3023 prefix := "TARGET_"
3024 var builder strings.Builder
3025 data.Custom(&builder, name, prefix, "", data)
3026 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003027 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003028 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003029}
3030
Jiyong Park16e91a02018-12-20 18:18:08 +09003031func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003032 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003033 apex {
3034 name: "myapex",
3035 key: "myapex.key",
3036 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003037 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003038 }
3039
3040 apex_key {
3041 name: "myapex.key",
3042 public_key: "testkey.avbpubkey",
3043 private_key: "testkey.pem",
3044 }
3045
3046 cc_library {
3047 name: "mylib",
3048 srcs: ["mylib.cpp"],
3049 system_shared_libs: [],
3050 stl: "none",
3051 stubs: {
3052 versions: ["1", "2", "3"],
3053 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003054 apex_available: [
3055 "//apex_available:platform",
3056 "myapex",
3057 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003058 }
3059
3060 cc_binary {
3061 name: "not_in_apex",
3062 srcs: ["mylib.cpp"],
3063 static_libs: ["mylib"],
3064 static_executable: true,
3065 system_shared_libs: [],
3066 stl: "none",
3067 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003068 `)
3069
Colin Cross7113d202019-11-20 16:39:12 -08003070 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003071
3072 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003073 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003074}
Jiyong Park9335a262018-12-24 11:31:58 +09003075
3076func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003077 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003078 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003079 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003080 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003081 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003082 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003083 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003084 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003085 }
3086
3087 cc_library {
3088 name: "mylib",
3089 srcs: ["mylib.cpp"],
3090 system_shared_libs: [],
3091 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003092 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003093 }
3094
3095 apex_key {
3096 name: "myapex.key",
3097 public_key: "testkey.avbpubkey",
3098 private_key: "testkey.pem",
3099 }
3100
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003101 android_app_certificate {
3102 name: "myapex.certificate",
3103 certificate: "testkey",
3104 }
3105
3106 android_app_certificate {
3107 name: "myapex.certificate.override",
3108 certificate: "testkey.override",
3109 }
3110
Jiyong Park9335a262018-12-24 11:31:58 +09003111 `)
3112
3113 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003114 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003115
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003116 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3117 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003118 "vendor/foo/devkeys/testkey.avbpubkey")
3119 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003120 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3121 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003122 "vendor/foo/devkeys/testkey.pem")
3123 }
3124
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003125 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003126 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003127 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003128 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003129 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003130 }
3131}
Jiyong Park58e364a2019-01-19 19:24:06 +09003132
Jooyung Hanf121a652019-12-17 14:30:11 +09003133func TestCertificate(t *testing.T) {
3134 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003135 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003136 apex {
3137 name: "myapex",
3138 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003139 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003140 }
3141 apex_key {
3142 name: "myapex.key",
3143 public_key: "testkey.avbpubkey",
3144 private_key: "testkey.pem",
3145 }`)
3146 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3147 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3148 if actual := rule.Args["certificates"]; actual != expected {
3149 t.Errorf("certificates should be %q, not %q", expected, actual)
3150 }
3151 })
3152 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003153 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003154 apex {
3155 name: "myapex_keytest",
3156 key: "myapex.key",
3157 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003158 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003159 }
3160 apex_key {
3161 name: "myapex.key",
3162 public_key: "testkey.avbpubkey",
3163 private_key: "testkey.pem",
3164 }
3165 android_app_certificate {
3166 name: "myapex.certificate.override",
3167 certificate: "testkey.override",
3168 }`)
3169 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3170 expected := "testkey.override.x509.pem testkey.override.pk8"
3171 if actual := rule.Args["certificates"]; actual != expected {
3172 t.Errorf("certificates should be %q, not %q", expected, actual)
3173 }
3174 })
3175 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003176 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003177 apex {
3178 name: "myapex",
3179 key: "myapex.key",
3180 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003181 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003182 }
3183 apex_key {
3184 name: "myapex.key",
3185 public_key: "testkey.avbpubkey",
3186 private_key: "testkey.pem",
3187 }
3188 android_app_certificate {
3189 name: "myapex.certificate",
3190 certificate: "testkey",
3191 }`)
3192 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3193 expected := "testkey.x509.pem testkey.pk8"
3194 if actual := rule.Args["certificates"]; actual != expected {
3195 t.Errorf("certificates should be %q, not %q", expected, actual)
3196 }
3197 })
3198 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003199 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003200 apex {
3201 name: "myapex_keytest",
3202 key: "myapex.key",
3203 file_contexts: ":myapex-file_contexts",
3204 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003205 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003206 }
3207 apex_key {
3208 name: "myapex.key",
3209 public_key: "testkey.avbpubkey",
3210 private_key: "testkey.pem",
3211 }
3212 android_app_certificate {
3213 name: "myapex.certificate.override",
3214 certificate: "testkey.override",
3215 }`)
3216 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3217 expected := "testkey.override.x509.pem testkey.override.pk8"
3218 if actual := rule.Args["certificates"]; actual != expected {
3219 t.Errorf("certificates should be %q, not %q", expected, actual)
3220 }
3221 })
3222 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003223 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003224 apex {
3225 name: "myapex",
3226 key: "myapex.key",
3227 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003228 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003229 }
3230 apex_key {
3231 name: "myapex.key",
3232 public_key: "testkey.avbpubkey",
3233 private_key: "testkey.pem",
3234 }`)
3235 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3236 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3237 if actual := rule.Args["certificates"]; actual != expected {
3238 t.Errorf("certificates should be %q, not %q", expected, actual)
3239 }
3240 })
3241 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003242 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003243 apex {
3244 name: "myapex_keytest",
3245 key: "myapex.key",
3246 file_contexts: ":myapex-file_contexts",
3247 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003248 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003249 }
3250 apex_key {
3251 name: "myapex.key",
3252 public_key: "testkey.avbpubkey",
3253 private_key: "testkey.pem",
3254 }
3255 android_app_certificate {
3256 name: "myapex.certificate.override",
3257 certificate: "testkey.override",
3258 }`)
3259 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3260 expected := "testkey.override.x509.pem testkey.override.pk8"
3261 if actual := rule.Args["certificates"]; actual != expected {
3262 t.Errorf("certificates should be %q, not %q", expected, actual)
3263 }
3264 })
3265}
3266
Jiyong Park58e364a2019-01-19 19:24:06 +09003267func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003268 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003269 apex {
3270 name: "myapex",
3271 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003272 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003273 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003274 }
3275
3276 apex {
3277 name: "otherapex",
3278 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003279 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003280 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003281 }
3282
3283 apex_key {
3284 name: "myapex.key",
3285 public_key: "testkey.avbpubkey",
3286 private_key: "testkey.pem",
3287 }
3288
3289 cc_library {
3290 name: "mylib",
3291 srcs: ["mylib.cpp"],
3292 system_shared_libs: [],
3293 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003294 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003295 "myapex",
3296 "otherapex",
3297 ],
Jooyung Han24282772020-03-21 23:20:55 +09003298 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003299 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003300 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003301 cc_library {
3302 name: "mylib2",
3303 srcs: ["mylib.cpp"],
3304 system_shared_libs: [],
3305 stl: "none",
3306 apex_available: [
3307 "myapex",
3308 "otherapex",
3309 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003310 static_libs: ["mylib3"],
3311 recovery_available: true,
3312 min_sdk_version: "29",
3313 }
3314 cc_library {
3315 name: "mylib3",
3316 srcs: ["mylib.cpp"],
3317 system_shared_libs: [],
3318 stl: "none",
3319 apex_available: [
3320 "myapex",
3321 "otherapex",
3322 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003323 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003324 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003325 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003326 `)
3327
Jooyung Hanc87a0592020-03-02 17:44:33 +09003328 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003329 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003330 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003331 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003332
Jooyung Hanccce2f22020-03-07 03:45:53 +09003333 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003334 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003335 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003336 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003337
Jooyung Hanccce2f22020-03-07 03:45:53 +09003338 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003339 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003340 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003341 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003342
Colin Crossaede88c2020-08-11 12:17:01 -07003343 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3344 // each variant defines additional macros to distinguish which apex variant it is built for
3345
3346 // non-APEX variant does not have __ANDROID_APEX__ defined
3347 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3348 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3349
Dan Albertb19953d2020-11-17 15:29:36 -08003350 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003351 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3352 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003353 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003354
Jooyung Hanc87a0592020-03-02 17:44:33 +09003355 // non-APEX variant does not have __ANDROID_APEX__ defined
3356 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3357 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3358
Dan Albertb19953d2020-11-17 15:29:36 -08003359 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003360 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003361 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003362 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003363}
Jiyong Park7e636d02019-01-28 16:16:54 +09003364
3365func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003366 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003367 apex {
3368 name: "myapex",
3369 key: "myapex.key",
3370 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003371 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003372 }
3373
3374 apex_key {
3375 name: "myapex.key",
3376 public_key: "testkey.avbpubkey",
3377 private_key: "testkey.pem",
3378 }
3379
3380 cc_library_headers {
3381 name: "mylib_headers",
3382 export_include_dirs: ["my_include"],
3383 system_shared_libs: [],
3384 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003385 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003386 }
3387
3388 cc_library {
3389 name: "mylib",
3390 srcs: ["mylib.cpp"],
3391 system_shared_libs: [],
3392 stl: "none",
3393 header_libs: ["mylib_headers"],
3394 export_header_lib_headers: ["mylib_headers"],
3395 stubs: {
3396 versions: ["1", "2", "3"],
3397 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003398 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003399 }
3400
3401 cc_library {
3402 name: "otherlib",
3403 srcs: ["mylib.cpp"],
3404 system_shared_libs: [],
3405 stl: "none",
3406 shared_libs: ["mylib"],
3407 }
3408 `)
3409
Colin Cross7113d202019-11-20 16:39:12 -08003410 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003411
3412 // Ensure that the include path of the header lib is exported to 'otherlib'
3413 ensureContains(t, cFlags, "-Imy_include")
3414}
Alex Light9670d332019-01-29 18:07:33 -08003415
Jiyong Park7cd10e32020-01-14 09:22:18 +09003416type fileInApex struct {
3417 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003418 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003419 isLink bool
3420}
3421
Jooyung Han1724d582022-12-21 10:17:44 +09003422func (f fileInApex) String() string {
3423 return f.src + ":" + f.path
3424}
3425
3426func (f fileInApex) match(expectation string) bool {
3427 parts := strings.Split(expectation, ":")
3428 if len(parts) == 1 {
3429 match, _ := path.Match(parts[0], f.path)
3430 return match
3431 }
3432 if len(parts) == 2 {
3433 matchSrc, _ := path.Match(parts[0], f.src)
3434 matchDst, _ := path.Match(parts[1], f.path)
3435 return matchSrc && matchDst
3436 }
3437 panic("invalid expected file specification: " + expectation)
3438}
3439
Jooyung Hana57af4a2020-01-23 05:36:59 +00003440func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003441 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003442 module := ctx.ModuleForTests(moduleName, variant)
3443 apexRule := module.MaybeRule("apexRule")
3444 apexDir := "/image.apex/"
3445 if apexRule.Rule == nil {
3446 apexRule = module.Rule("zipApexRule")
3447 apexDir = "/image.zipapex/"
3448 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003449 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003450 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003451 for _, cmd := range strings.Split(copyCmds, "&&") {
3452 cmd = strings.TrimSpace(cmd)
3453 if cmd == "" {
3454 continue
3455 }
3456 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003457 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003458 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003459 switch terms[0] {
3460 case "mkdir":
3461 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003462 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003463 t.Fatal("copyCmds contains invalid cp command", cmd)
3464 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003465 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003466 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003467 isLink = false
3468 case "ln":
3469 if len(terms) != 3 && len(terms) != 4 {
3470 // ln LINK TARGET or ln -s LINK TARGET
3471 t.Fatal("copyCmds contains invalid ln command", cmd)
3472 }
3473 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003474 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003475 isLink = true
3476 default:
3477 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3478 }
3479 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003480 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003481 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003482 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003483 }
Jooyung Han1724d582022-12-21 10:17:44 +09003484 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003485 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003486 }
3487 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003488 return ret
3489}
3490
Jooyung Hana57af4a2020-01-23 05:36:59 +00003491func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3492 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003493 var failed bool
3494 var surplus []string
3495 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003496 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Han1724d582022-12-21 10:17:44 +09003497 matchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003498 for _, expected := range files {
Jooyung Han1724d582022-12-21 10:17:44 +09003499 if file.match(expected) {
3500 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003501 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003502 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003503 }
3504 }
Jooyung Han1724d582022-12-21 10:17:44 +09003505 if !matchFound {
3506 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003507 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003508 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003509
Jooyung Han31c470b2019-10-18 16:26:59 +09003510 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003511 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003512 t.Log("surplus files", surplus)
3513 failed = true
3514 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003515
3516 if len(files) > len(filesMatched) {
3517 var missing []string
3518 for _, expected := range files {
3519 if !filesMatched[expected] {
3520 missing = append(missing, expected)
3521 }
3522 }
3523 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003524 t.Log("missing files", missing)
3525 failed = true
3526 }
3527 if failed {
3528 t.Fail()
3529 }
3530}
3531
Jooyung Han344d5432019-08-23 11:17:39 +09003532func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003533 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003534 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003535 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003536 "etc/llndk.libraries.29.txt",
3537 "etc/vndkcore.libraries.29.txt",
3538 "etc/vndksp.libraries.29.txt",
3539 "etc/vndkprivate.libraries.29.txt",
3540 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003541 }
3542 testCases := []struct {
3543 vndkVersion string
3544 expectedFiles []string
3545 }{
3546 {
3547 vndkVersion: "current",
3548 expectedFiles: append(commonFiles,
3549 "lib/libvndk.so",
3550 "lib/libvndksp.so",
3551 "lib64/libvndk.so",
3552 "lib64/libvndksp.so"),
3553 },
3554 {
3555 vndkVersion: "",
3556 expectedFiles: append(commonFiles,
3557 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3558 "lib/libvndksp.so",
3559 "lib64/libvndksp.so"),
3560 },
3561 }
3562 for _, tc := range testCases {
3563 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3564 ctx := testApex(t, `
3565 apex_vndk {
3566 name: "com.android.vndk.current",
3567 key: "com.android.vndk.current.key",
3568 updatable: false,
3569 }
3570
3571 apex_key {
3572 name: "com.android.vndk.current.key",
3573 public_key: "testkey.avbpubkey",
3574 private_key: "testkey.pem",
3575 }
3576
3577 cc_library {
3578 name: "libvndk",
3579 srcs: ["mylib.cpp"],
3580 vendor_available: true,
3581 product_available: true,
3582 vndk: {
3583 enabled: true,
3584 },
3585 system_shared_libs: [],
3586 stl: "none",
3587 apex_available: [ "com.android.vndk.current" ],
3588 }
3589
3590 cc_library {
3591 name: "libvndksp",
3592 srcs: ["mylib.cpp"],
3593 vendor_available: true,
3594 product_available: true,
3595 vndk: {
3596 enabled: true,
3597 support_system_process: true,
3598 },
3599 system_shared_libs: [],
3600 stl: "none",
3601 apex_available: [ "com.android.vndk.current" ],
3602 }
3603
3604 // VNDK-Ext should not cause any problems
3605
3606 cc_library {
3607 name: "libvndk.ext",
3608 srcs: ["mylib2.cpp"],
3609 vendor: true,
3610 vndk: {
3611 enabled: true,
3612 extends: "libvndk",
3613 },
3614 system_shared_libs: [],
3615 stl: "none",
3616 }
3617
3618 cc_library {
3619 name: "libvndksp.ext",
3620 srcs: ["mylib2.cpp"],
3621 vendor: true,
3622 vndk: {
3623 enabled: true,
3624 support_system_process: true,
3625 extends: "libvndksp",
3626 },
3627 system_shared_libs: [],
3628 stl: "none",
3629 }
3630 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3631 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3632 }))
3633 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3634 })
3635 }
Jooyung Han344d5432019-08-23 11:17:39 +09003636}
3637
3638func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003639 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003640 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003641 name: "com.android.vndk.current",
3642 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003643 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003644 }
3645
3646 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003647 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003648 public_key: "testkey.avbpubkey",
3649 private_key: "testkey.pem",
3650 }
3651
3652 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003653 name: "libvndk",
3654 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003655 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003656 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003657 vndk: {
3658 enabled: true,
3659 },
3660 system_shared_libs: [],
3661 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003662 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003663 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003664
3665 cc_prebuilt_library_shared {
3666 name: "libvndk.arm",
3667 srcs: ["libvndk.arm.so"],
3668 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003669 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003670 vndk: {
3671 enabled: true,
3672 },
3673 enabled: false,
3674 arch: {
3675 arm: {
3676 enabled: true,
3677 },
3678 },
3679 system_shared_libs: [],
3680 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003681 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003682 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003683 `+vndkLibrariesTxtFiles("current"),
3684 withFiles(map[string][]byte{
3685 "libvndk.so": nil,
3686 "libvndk.arm.so": nil,
3687 }))
Colin Cross2807f002021-03-02 10:15:29 -08003688 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003689 "lib/libvndk.so",
3690 "lib/libvndk.arm.so",
3691 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003692 "lib/libc++.so",
3693 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003694 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003695 })
Jooyung Han344d5432019-08-23 11:17:39 +09003696}
3697
Jooyung Han39edb6c2019-11-06 16:53:07 +09003698func vndkLibrariesTxtFiles(vers ...string) (result string) {
3699 for _, v := range vers {
3700 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003701 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003702 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003703 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003704 name: "` + txt + `.libraries.txt",
3705 }
3706 `
3707 }
3708 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003709 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003710 result += `
3711 prebuilt_etc {
3712 name: "` + txt + `.libraries.` + v + `.txt",
3713 src: "dummy.txt",
3714 }
3715 `
3716 }
3717 }
3718 }
3719 return
3720}
3721
Jooyung Han344d5432019-08-23 11:17:39 +09003722func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003723 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003724 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003725 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003726 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003727 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003728 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003729 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003730 }
3731
3732 apex_key {
3733 name: "myapex.key",
3734 public_key: "testkey.avbpubkey",
3735 private_key: "testkey.pem",
3736 }
3737
Jooyung Han31c470b2019-10-18 16:26:59 +09003738 vndk_prebuilt_shared {
3739 name: "libvndk27",
3740 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003741 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003742 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003743 vndk: {
3744 enabled: true,
3745 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003746 target_arch: "arm64",
3747 arch: {
3748 arm: {
3749 srcs: ["libvndk27_arm.so"],
3750 },
3751 arm64: {
3752 srcs: ["libvndk27_arm64.so"],
3753 },
3754 },
Colin Cross2807f002021-03-02 10:15:29 -08003755 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003756 }
3757
3758 vndk_prebuilt_shared {
3759 name: "libvndk27",
3760 version: "27",
3761 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003762 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003763 vndk: {
3764 enabled: true,
3765 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003766 target_arch: "x86_64",
3767 arch: {
3768 x86: {
3769 srcs: ["libvndk27_x86.so"],
3770 },
3771 x86_64: {
3772 srcs: ["libvndk27_x86_64.so"],
3773 },
3774 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003775 }
3776 `+vndkLibrariesTxtFiles("27"),
3777 withFiles(map[string][]byte{
3778 "libvndk27_arm.so": nil,
3779 "libvndk27_arm64.so": nil,
3780 "libvndk27_x86.so": nil,
3781 "libvndk27_x86_64.so": nil,
3782 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003783
Colin Cross2807f002021-03-02 10:15:29 -08003784 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003785 "lib/libvndk27_arm.so",
3786 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003787 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003788 })
Jooyung Han344d5432019-08-23 11:17:39 +09003789}
3790
Jooyung Han90eee022019-10-01 20:02:42 +09003791func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003792 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003793 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003794 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003795 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003796 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003797 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003798 }
3799 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003800 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003801 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003802 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003803 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003804 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003805 }
3806 apex_key {
3807 name: "myapex.key",
3808 public_key: "testkey.avbpubkey",
3809 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003810 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003811
3812 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003813 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003814 actual := proptools.String(bundle.properties.Apex_name)
3815 if !reflect.DeepEqual(actual, expected) {
3816 t.Errorf("Got '%v', expected '%v'", actual, expected)
3817 }
3818 }
3819
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003820 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003821 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003822}
3823
Jooyung Han344d5432019-08-23 11:17:39 +09003824func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003825 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003826 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003827 name: "com.android.vndk.current",
3828 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003829 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003830 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003831 }
3832
3833 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003834 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003835 public_key: "testkey.avbpubkey",
3836 private_key: "testkey.pem",
3837 }
3838
3839 cc_library {
3840 name: "libvndk",
3841 srcs: ["mylib.cpp"],
3842 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003843 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003844 native_bridge_supported: true,
3845 host_supported: true,
3846 vndk: {
3847 enabled: true,
3848 },
3849 system_shared_libs: [],
3850 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003851 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003852 }
Colin Cross2807f002021-03-02 10:15:29 -08003853 `+vndkLibrariesTxtFiles("current"),
3854 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003855
Colin Cross2807f002021-03-02 10:15:29 -08003856 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003857 "lib/libvndk.so",
3858 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003859 "lib/libc++.so",
3860 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003861 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003862 })
Jooyung Han344d5432019-08-23 11:17:39 +09003863}
3864
3865func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003866 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003867 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003868 name: "com.android.vndk.current",
3869 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003870 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003871 native_bridge_supported: true,
3872 }
3873
3874 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003875 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003876 public_key: "testkey.avbpubkey",
3877 private_key: "testkey.pem",
3878 }
3879
3880 cc_library {
3881 name: "libvndk",
3882 srcs: ["mylib.cpp"],
3883 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003884 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003885 native_bridge_supported: true,
3886 host_supported: true,
3887 vndk: {
3888 enabled: true,
3889 },
3890 system_shared_libs: [],
3891 stl: "none",
3892 }
3893 `)
3894}
3895
Jooyung Han31c470b2019-10-18 16:26:59 +09003896func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003897 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003898 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003899 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003900 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003901 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003902 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003903 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003904 }
3905
3906 apex_key {
3907 name: "myapex.key",
3908 public_key: "testkey.avbpubkey",
3909 private_key: "testkey.pem",
3910 }
3911
3912 vndk_prebuilt_shared {
3913 name: "libvndk27",
3914 version: "27",
3915 target_arch: "arm",
3916 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003917 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003918 vndk: {
3919 enabled: true,
3920 },
3921 arch: {
3922 arm: {
3923 srcs: ["libvndk27.so"],
3924 }
3925 },
3926 }
3927
3928 vndk_prebuilt_shared {
3929 name: "libvndk27",
3930 version: "27",
3931 target_arch: "arm",
3932 binder32bit: true,
3933 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003934 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003935 vndk: {
3936 enabled: true,
3937 },
3938 arch: {
3939 arm: {
3940 srcs: ["libvndk27binder32.so"],
3941 }
3942 },
Colin Cross2807f002021-03-02 10:15:29 -08003943 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003944 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003945 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003946 withFiles(map[string][]byte{
3947 "libvndk27.so": nil,
3948 "libvndk27binder32.so": nil,
3949 }),
3950 withBinder32bit,
3951 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003952 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003953 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3954 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003955 },
3956 }),
3957 )
3958
Colin Cross2807f002021-03-02 10:15:29 -08003959 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003960 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003961 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003962 })
3963}
3964
Jooyung Han45a96772020-06-15 14:59:42 +09003965func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003966 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003967 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003968 name: "com.android.vndk.current",
3969 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003970 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003971 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003972 }
3973
3974 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003975 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003976 public_key: "testkey.avbpubkey",
3977 private_key: "testkey.pem",
3978 }
3979
3980 cc_library {
3981 name: "libz",
3982 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003983 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003984 vndk: {
3985 enabled: true,
3986 },
3987 stubs: {
3988 symbol_file: "libz.map.txt",
3989 versions: ["30"],
3990 }
3991 }
3992 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3993 "libz.map.txt": nil,
3994 }))
3995
Colin Cross2807f002021-03-02 10:15:29 -08003996 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003997 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3998 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09003999 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4000 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4001 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4002 "*/*",
4003 })
Jooyung Han45a96772020-06-15 14:59:42 +09004004}
4005
Jooyung Hane1633032019-08-01 17:41:43 +09004006func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004007 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004008 apex {
4009 name: "myapex_nodep",
4010 key: "myapex.key",
4011 native_shared_libs: ["lib_nodep"],
4012 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004013 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004014 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004015 }
4016
4017 apex {
4018 name: "myapex_dep",
4019 key: "myapex.key",
4020 native_shared_libs: ["lib_dep"],
4021 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004022 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004023 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004024 }
4025
4026 apex {
4027 name: "myapex_provider",
4028 key: "myapex.key",
4029 native_shared_libs: ["libfoo"],
4030 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004031 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004032 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004033 }
4034
4035 apex {
4036 name: "myapex_selfcontained",
4037 key: "myapex.key",
4038 native_shared_libs: ["lib_dep", "libfoo"],
4039 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004040 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004041 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004042 }
4043
4044 apex_key {
4045 name: "myapex.key",
4046 public_key: "testkey.avbpubkey",
4047 private_key: "testkey.pem",
4048 }
4049
4050 cc_library {
4051 name: "lib_nodep",
4052 srcs: ["mylib.cpp"],
4053 system_shared_libs: [],
4054 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004055 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004056 }
4057
4058 cc_library {
4059 name: "lib_dep",
4060 srcs: ["mylib.cpp"],
4061 shared_libs: ["libfoo"],
4062 system_shared_libs: [],
4063 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004064 apex_available: [
4065 "myapex_dep",
4066 "myapex_provider",
4067 "myapex_selfcontained",
4068 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004069 }
4070
4071 cc_library {
4072 name: "libfoo",
4073 srcs: ["mytest.cpp"],
4074 stubs: {
4075 versions: ["1"],
4076 },
4077 system_shared_libs: [],
4078 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004079 apex_available: [
4080 "myapex_provider",
4081 "myapex_selfcontained",
4082 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004083 }
4084 `)
4085
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004086 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004087 var provideNativeLibs, requireNativeLibs []string
4088
Sundong Ahnabb64432019-10-22 13:58:29 +09004089 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004090 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4091 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004092 ensureListEmpty(t, provideNativeLibs)
4093 ensureListEmpty(t, requireNativeLibs)
4094
Sundong Ahnabb64432019-10-22 13:58:29 +09004095 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004096 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4097 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004098 ensureListEmpty(t, provideNativeLibs)
4099 ensureListContains(t, requireNativeLibs, "libfoo.so")
4100
Sundong Ahnabb64432019-10-22 13:58:29 +09004101 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004102 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4103 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004104 ensureListContains(t, provideNativeLibs, "libfoo.so")
4105 ensureListEmpty(t, requireNativeLibs)
4106
Sundong Ahnabb64432019-10-22 13:58:29 +09004107 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004108 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4109 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004110 ensureListContains(t, provideNativeLibs, "libfoo.so")
4111 ensureListEmpty(t, requireNativeLibs)
4112}
4113
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004114func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004115 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004116 apex {
4117 name: "myapex",
4118 key: "myapex.key",
4119 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004120 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004121 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004122 }
4123
4124 apex_key {
4125 name: "myapex.key",
4126 public_key: "testkey.avbpubkey",
4127 private_key: "testkey.pem",
4128 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004129
4130 cc_library {
4131 name: "mylib",
4132 srcs: ["mylib.cpp"],
4133 system_shared_libs: [],
4134 stl: "none",
4135 apex_available: [
4136 "//apex_available:platform",
4137 "myapex",
4138 ],
4139 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004140 `)
4141
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004142 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004143 apexManifestRule := module.Rule("apexManifestRule")
4144 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4145 apexRule := module.Rule("apexRule")
4146 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004147
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004148 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004149 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004150 name := apexBundle.BaseModuleName()
4151 prefix := "TARGET_"
4152 var builder strings.Builder
4153 data.Custom(&builder, name, prefix, "", data)
4154 androidMk := builder.String()
Jiyong Parkdb334862020-02-05 17:19:28 +09004155 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004156}
4157
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004158func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4159 ctx := testApex(t, `
4160 apex {
4161 name: "myapex",
4162 key: "myapex.key",
4163 apex_name: "com.android.myapex",
4164 native_shared_libs: ["mylib"],
4165 updatable: false,
4166 }
4167
4168 apex_key {
4169 name: "myapex.key",
4170 public_key: "testkey.avbpubkey",
4171 private_key: "testkey.pem",
4172 }
4173
4174 cc_library {
4175 name: "mylib",
4176 srcs: ["mylib.cpp"],
4177 system_shared_libs: [],
4178 stl: "none",
4179 apex_available: [
4180 "//apex_available:platform",
4181 "myapex",
4182 ],
4183 }
4184 `, android.FixtureMergeEnv(map[string]string{
4185 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4186 }))
4187
4188 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
4189 apexManifestRule := module.Rule("apexManifestRule")
4190 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4191}
4192
Vinh Tran8f5310f2022-10-07 18:16:47 -04004193func TestCompileMultilibProp(t *testing.T) {
4194 testCases := []struct {
4195 compileMultiLibProp string
4196 containedLibs []string
4197 notContainedLibs []string
4198 }{
4199 {
4200 containedLibs: []string{
4201 "image.apex/lib64/mylib.so",
4202 "image.apex/lib/mylib.so",
4203 },
4204 compileMultiLibProp: `compile_multilib: "both",`,
4205 },
4206 {
4207 containedLibs: []string{"image.apex/lib64/mylib.so"},
4208 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4209 compileMultiLibProp: `compile_multilib: "first",`,
4210 },
4211 {
4212 containedLibs: []string{"image.apex/lib64/mylib.so"},
4213 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4214 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4215 },
4216 {
4217 containedLibs: []string{"image.apex/lib64/mylib.so"},
4218 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4219 compileMultiLibProp: `compile_multilib: "64",`,
4220 },
4221 {
4222 containedLibs: []string{"image.apex/lib/mylib.so"},
4223 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4224 compileMultiLibProp: `compile_multilib: "32",`,
4225 },
4226 }
4227 for _, testCase := range testCases {
4228 ctx := testApex(t, fmt.Sprintf(`
4229 apex {
4230 name: "myapex",
4231 key: "myapex.key",
4232 %s
4233 native_shared_libs: ["mylib"],
4234 updatable: false,
4235 }
4236 apex_key {
4237 name: "myapex.key",
4238 public_key: "testkey.avbpubkey",
4239 private_key: "testkey.pem",
4240 }
4241 cc_library {
4242 name: "mylib",
4243 srcs: ["mylib.cpp"],
4244 apex_available: [
4245 "//apex_available:platform",
4246 "myapex",
4247 ],
4248 }
4249 `, testCase.compileMultiLibProp),
4250 )
4251 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4252 apexRule := module.Rule("apexRule")
4253 copyCmds := apexRule.Args["copy_commands"]
4254 for _, containedLib := range testCase.containedLibs {
4255 ensureContains(t, copyCmds, containedLib)
4256 }
4257 for _, notContainedLib := range testCase.notContainedLibs {
4258 ensureNotContains(t, copyCmds, notContainedLib)
4259 }
4260 }
4261}
4262
Alex Light0851b882019-02-07 13:20:53 -08004263func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004264 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004265 apex {
4266 name: "myapex",
4267 key: "myapex.key",
4268 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004269 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004270 }
4271
4272 apex_key {
4273 name: "myapex.key",
4274 public_key: "testkey.avbpubkey",
4275 private_key: "testkey.pem",
4276 }
4277
4278 cc_library {
4279 name: "mylib_common",
4280 srcs: ["mylib.cpp"],
4281 system_shared_libs: [],
4282 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004283 apex_available: [
4284 "//apex_available:platform",
4285 "myapex",
4286 ],
Alex Light0851b882019-02-07 13:20:53 -08004287 }
4288 `)
4289
Sundong Ahnabb64432019-10-22 13:58:29 +09004290 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004291 apexRule := module.Rule("apexRule")
4292 copyCmds := apexRule.Args["copy_commands"]
4293
4294 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4295 t.Log("Apex was a test apex!")
4296 t.Fail()
4297 }
4298 // Ensure that main rule creates an output
4299 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4300
4301 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004302 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004303
4304 // Ensure that both direct and indirect deps are copied into apex
4305 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4306
Colin Cross7113d202019-11-20 16:39:12 -08004307 // Ensure that the platform variant ends with _shared
4308 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004309
Colin Cross56a83212020-09-15 18:30:11 -07004310 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004311 t.Log("Found mylib_common not in any apex!")
4312 t.Fail()
4313 }
4314}
4315
4316func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004317 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004318 apex_test {
4319 name: "myapex",
4320 key: "myapex.key",
4321 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004322 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004323 }
4324
4325 apex_key {
4326 name: "myapex.key",
4327 public_key: "testkey.avbpubkey",
4328 private_key: "testkey.pem",
4329 }
4330
4331 cc_library {
4332 name: "mylib_common_test",
4333 srcs: ["mylib.cpp"],
4334 system_shared_libs: [],
4335 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004336 // TODO: remove //apex_available:platform
4337 apex_available: [
4338 "//apex_available:platform",
4339 "myapex",
4340 ],
Alex Light0851b882019-02-07 13:20:53 -08004341 }
4342 `)
4343
Sundong Ahnabb64432019-10-22 13:58:29 +09004344 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004345 apexRule := module.Rule("apexRule")
4346 copyCmds := apexRule.Args["copy_commands"]
4347
4348 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4349 t.Log("Apex was not a test apex!")
4350 t.Fail()
4351 }
4352 // Ensure that main rule creates an output
4353 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4354
4355 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004356 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004357
4358 // Ensure that both direct and indirect deps are copied into apex
4359 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4360
Colin Cross7113d202019-11-20 16:39:12 -08004361 // Ensure that the platform variant ends with _shared
4362 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004363}
4364
Alex Light9670d332019-01-29 18:07:33 -08004365func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004366 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004367 apex {
4368 name: "myapex",
4369 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004370 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004371 multilib: {
4372 first: {
4373 native_shared_libs: ["mylib_common"],
4374 }
4375 },
4376 target: {
4377 android: {
4378 multilib: {
4379 first: {
4380 native_shared_libs: ["mylib"],
4381 }
4382 }
4383 },
4384 host: {
4385 multilib: {
4386 first: {
4387 native_shared_libs: ["mylib2"],
4388 }
4389 }
4390 }
4391 }
4392 }
4393
4394 apex_key {
4395 name: "myapex.key",
4396 public_key: "testkey.avbpubkey",
4397 private_key: "testkey.pem",
4398 }
4399
4400 cc_library {
4401 name: "mylib",
4402 srcs: ["mylib.cpp"],
4403 system_shared_libs: [],
4404 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004405 // TODO: remove //apex_available:platform
4406 apex_available: [
4407 "//apex_available:platform",
4408 "myapex",
4409 ],
Alex Light9670d332019-01-29 18:07:33 -08004410 }
4411
4412 cc_library {
4413 name: "mylib_common",
4414 srcs: ["mylib.cpp"],
4415 system_shared_libs: [],
4416 stl: "none",
4417 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004418 // TODO: remove //apex_available:platform
4419 apex_available: [
4420 "//apex_available:platform",
4421 "myapex",
4422 ],
Alex Light9670d332019-01-29 18:07:33 -08004423 }
4424
4425 cc_library {
4426 name: "mylib2",
4427 srcs: ["mylib.cpp"],
4428 system_shared_libs: [],
4429 stl: "none",
4430 compile_multilib: "first",
4431 }
4432 `)
4433
Sundong Ahnabb64432019-10-22 13:58:29 +09004434 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004435 copyCmds := apexRule.Args["copy_commands"]
4436
4437 // Ensure that main rule creates an output
4438 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4439
4440 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004441 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4442 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4443 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004444
4445 // Ensure that both direct and indirect deps are copied into apex
4446 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4447 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4448 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4449
Colin Cross7113d202019-11-20 16:39:12 -08004450 // Ensure that the platform variant ends with _shared
4451 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4452 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4453 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004454}
Jiyong Park04480cf2019-02-06 00:16:29 +09004455
Jiyong Park59140302020-12-14 18:44:04 +09004456func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004457 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004458 apex {
4459 name: "myapex",
4460 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004461 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004462 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004463 arch: {
4464 arm64: {
4465 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004466 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004467 },
4468 x86_64: {
4469 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004470 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004471 },
4472 }
4473 }
4474
4475 apex_key {
4476 name: "myapex.key",
4477 public_key: "testkey.avbpubkey",
4478 private_key: "testkey.pem",
4479 }
4480
4481 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004482 name: "mylib.generic",
4483 srcs: ["mylib.cpp"],
4484 system_shared_libs: [],
4485 stl: "none",
4486 // TODO: remove //apex_available:platform
4487 apex_available: [
4488 "//apex_available:platform",
4489 "myapex",
4490 ],
4491 }
4492
4493 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004494 name: "mylib.arm64",
4495 srcs: ["mylib.cpp"],
4496 system_shared_libs: [],
4497 stl: "none",
4498 // TODO: remove //apex_available:platform
4499 apex_available: [
4500 "//apex_available:platform",
4501 "myapex",
4502 ],
4503 }
4504
4505 cc_library {
4506 name: "mylib.x64",
4507 srcs: ["mylib.cpp"],
4508 system_shared_libs: [],
4509 stl: "none",
4510 // TODO: remove //apex_available:platform
4511 apex_available: [
4512 "//apex_available:platform",
4513 "myapex",
4514 ],
4515 }
4516 `)
4517
4518 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4519 copyCmds := apexRule.Args["copy_commands"]
4520
4521 // Ensure that apex variant is created for the direct dep
4522 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004523 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004524 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4525
4526 // Ensure that both direct and indirect deps are copied into apex
4527 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4528 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4529}
4530
Jiyong Park04480cf2019-02-06 00:16:29 +09004531func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004532 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004533 apex {
4534 name: "myapex",
4535 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004536 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004537 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004538 }
4539
4540 apex_key {
4541 name: "myapex.key",
4542 public_key: "testkey.avbpubkey",
4543 private_key: "testkey.pem",
4544 }
4545
4546 sh_binary {
4547 name: "myscript",
4548 src: "mylib.cpp",
4549 filename: "myscript.sh",
4550 sub_dir: "script",
4551 }
4552 `)
4553
Sundong Ahnabb64432019-10-22 13:58:29 +09004554 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004555 copyCmds := apexRule.Args["copy_commands"]
4556
4557 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4558}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004559
Jooyung Han91df2082019-11-20 01:49:42 +09004560func TestApexInVariousPartition(t *testing.T) {
4561 testcases := []struct {
4562 propName, parition, flattenedPartition string
4563 }{
4564 {"", "system", "system_ext"},
4565 {"product_specific: true", "product", "product"},
4566 {"soc_specific: true", "vendor", "vendor"},
4567 {"proprietary: true", "vendor", "vendor"},
4568 {"vendor: true", "vendor", "vendor"},
4569 {"system_ext_specific: true", "system_ext", "system_ext"},
4570 }
4571 for _, tc := range testcases {
4572 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004573 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004574 apex {
4575 name: "myapex",
4576 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004577 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004578 `+tc.propName+`
4579 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004580
Jooyung Han91df2082019-11-20 01:49:42 +09004581 apex_key {
4582 name: "myapex.key",
4583 public_key: "testkey.avbpubkey",
4584 private_key: "testkey.pem",
4585 }
4586 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004587
Jooyung Han91df2082019-11-20 01:49:42 +09004588 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004589 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4590 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004591 if actual != expected {
4592 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4593 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004594
Jooyung Han91df2082019-11-20 01:49:42 +09004595 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004596 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4597 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004598 if actual != expected {
4599 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4600 }
4601 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004602 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004603}
Jiyong Park67882562019-03-21 01:11:21 +09004604
Jooyung Han580eb4f2020-06-24 19:33:06 +09004605func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004606 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004607 apex {
4608 name: "myapex",
4609 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004610 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004611 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004612
Jooyung Han580eb4f2020-06-24 19:33:06 +09004613 apex_key {
4614 name: "myapex.key",
4615 public_key: "testkey.avbpubkey",
4616 private_key: "testkey.pem",
4617 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004618 `)
4619 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004620 rule := module.Output("file_contexts")
4621 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4622}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004623
Jooyung Han580eb4f2020-06-24 19:33:06 +09004624func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004625 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004626 apex {
4627 name: "myapex",
4628 key: "myapex.key",
4629 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004630 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004631 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004632
Jooyung Han580eb4f2020-06-24 19:33:06 +09004633 apex_key {
4634 name: "myapex.key",
4635 public_key: "testkey.avbpubkey",
4636 private_key: "testkey.pem",
4637 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004638 `, withFiles(map[string][]byte{
4639 "my_own_file_contexts": nil,
4640 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004641}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004642
Jooyung Han580eb4f2020-06-24 19:33:06 +09004643func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004644 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004645 apex {
4646 name: "myapex",
4647 key: "myapex.key",
4648 product_specific: true,
4649 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004650 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004651 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004652
Jooyung Han580eb4f2020-06-24 19:33:06 +09004653 apex_key {
4654 name: "myapex.key",
4655 public_key: "testkey.avbpubkey",
4656 private_key: "testkey.pem",
4657 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004658 `)
4659
Colin Cross1c460562021-02-16 17:55:47 -08004660 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004661 apex {
4662 name: "myapex",
4663 key: "myapex.key",
4664 product_specific: true,
4665 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004666 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004667 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004668
Jooyung Han580eb4f2020-06-24 19:33:06 +09004669 apex_key {
4670 name: "myapex.key",
4671 public_key: "testkey.avbpubkey",
4672 private_key: "testkey.pem",
4673 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004674 `, withFiles(map[string][]byte{
4675 "product_specific_file_contexts": nil,
4676 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004677 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4678 rule := module.Output("file_contexts")
4679 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4680}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004681
Jooyung Han580eb4f2020-06-24 19:33:06 +09004682func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004683 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004684 apex {
4685 name: "myapex",
4686 key: "myapex.key",
4687 product_specific: true,
4688 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004689 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004690 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004691
Jooyung Han580eb4f2020-06-24 19:33:06 +09004692 apex_key {
4693 name: "myapex.key",
4694 public_key: "testkey.avbpubkey",
4695 private_key: "testkey.pem",
4696 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004697
Jooyung Han580eb4f2020-06-24 19:33:06 +09004698 filegroup {
4699 name: "my-file-contexts",
4700 srcs: ["product_specific_file_contexts"],
4701 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004702 `, withFiles(map[string][]byte{
4703 "product_specific_file_contexts": nil,
4704 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004705 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4706 rule := module.Output("file_contexts")
4707 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004708}
4709
Jiyong Park67882562019-03-21 01:11:21 +09004710func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004711 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004712 apex_key {
4713 name: "myapex.key",
4714 public_key: ":my.avbpubkey",
4715 private_key: ":my.pem",
4716 product_specific: true,
4717 }
4718
4719 filegroup {
4720 name: "my.avbpubkey",
4721 srcs: ["testkey2.avbpubkey"],
4722 }
4723
4724 filegroup {
4725 name: "my.pem",
4726 srcs: ["testkey2.pem"],
4727 }
4728 `)
4729
4730 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4731 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004732 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004733 if actual_pubkey != expected_pubkey {
4734 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4735 }
4736 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004737 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004738 if actual_privkey != expected_privkey {
4739 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4740 }
4741}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004742
4743func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004744 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004745 prebuilt_apex {
4746 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004747 arch: {
4748 arm64: {
4749 src: "myapex-arm64.apex",
4750 },
4751 arm: {
4752 src: "myapex-arm.apex",
4753 },
4754 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004755 }
4756 `)
4757
Wei Li340ee8e2022-03-18 17:33:24 -07004758 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4759 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004760
Jiyong Parkc95714e2019-03-29 14:23:10 +09004761 expectedInput := "myapex-arm64.apex"
4762 if prebuilt.inputApex.String() != expectedInput {
4763 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4764 }
Wei Li340ee8e2022-03-18 17:33:24 -07004765 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4766 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4767 rule := testingModule.Rule("genProvenanceMetaData")
4768 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4769 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4770 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4771 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004772}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004773
Paul Duffinc0609c62021-03-01 17:27:16 +00004774func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004775 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004776 prebuilt_apex {
4777 name: "myapex",
4778 }
4779 `)
4780}
4781
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004782func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004783 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004784 prebuilt_apex {
4785 name: "myapex",
4786 src: "myapex-arm.apex",
4787 filename: "notmyapex.apex",
4788 }
4789 `)
4790
Wei Li340ee8e2022-03-18 17:33:24 -07004791 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4792 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004793
4794 expected := "notmyapex.apex"
4795 if p.installFilename != expected {
4796 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4797 }
Wei Li340ee8e2022-03-18 17:33:24 -07004798 rule := testingModule.Rule("genProvenanceMetaData")
4799 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4800 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4801 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4802 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004803}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004804
Samiul Islam7c02e262021-09-08 17:48:28 +01004805func TestApexSetFilenameOverride(t *testing.T) {
4806 testApex(t, `
4807 apex_set {
4808 name: "com.company.android.myapex",
4809 apex_name: "com.android.myapex",
4810 set: "company-myapex.apks",
4811 filename: "com.company.android.myapex.apex"
4812 }
4813 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4814
4815 testApex(t, `
4816 apex_set {
4817 name: "com.company.android.myapex",
4818 apex_name: "com.android.myapex",
4819 set: "company-myapex.apks",
4820 filename: "com.company.android.myapex.capex"
4821 }
4822 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4823
4824 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4825 apex_set {
4826 name: "com.company.android.myapex",
4827 apex_name: "com.android.myapex",
4828 set: "company-myapex.apks",
4829 filename: "some-random-suffix"
4830 }
4831 `)
4832}
4833
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004834func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004835 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004836 prebuilt_apex {
4837 name: "myapex.prebuilt",
4838 src: "myapex-arm.apex",
4839 overrides: [
4840 "myapex",
4841 ],
4842 }
4843 `)
4844
Wei Li340ee8e2022-03-18 17:33:24 -07004845 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4846 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004847
4848 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004849 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004850 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004851 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004852 }
Wei Li340ee8e2022-03-18 17:33:24 -07004853 rule := testingModule.Rule("genProvenanceMetaData")
4854 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4855 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4856 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4857 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004858}
4859
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004860func TestPrebuiltApexName(t *testing.T) {
4861 testApex(t, `
4862 prebuilt_apex {
4863 name: "com.company.android.myapex",
4864 apex_name: "com.android.myapex",
4865 src: "company-myapex-arm.apex",
4866 }
4867 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4868
4869 testApex(t, `
4870 apex_set {
4871 name: "com.company.android.myapex",
4872 apex_name: "com.android.myapex",
4873 set: "company-myapex.apks",
4874 }
4875 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4876}
4877
4878func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4879 _ = android.GroupFixturePreparers(
4880 java.PrepareForTestWithJavaDefaultModules,
4881 PrepareForTestWithApexBuildComponents,
4882 android.FixtureWithRootAndroidBp(`
4883 platform_bootclasspath {
4884 name: "platform-bootclasspath",
4885 fragments: [
4886 {
4887 apex: "com.android.art",
4888 module: "art-bootclasspath-fragment",
4889 },
4890 ],
4891 }
4892
4893 prebuilt_apex {
4894 name: "com.company.android.art",
4895 apex_name: "com.android.art",
4896 src: "com.company.android.art-arm.apex",
4897 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4898 }
4899
4900 prebuilt_bootclasspath_fragment {
4901 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004902 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004903 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004904 hidden_api: {
4905 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4906 metadata: "my-bootclasspath-fragment/metadata.csv",
4907 index: "my-bootclasspath-fragment/index.csv",
4908 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4909 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4910 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004911 }
4912
4913 java_import {
4914 name: "core-oj",
4915 jars: ["prebuilt.jar"],
4916 }
4917 `),
4918 ).RunTest(t)
4919}
4920
Paul Duffin092153d2021-01-26 11:42:39 +00004921// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4922// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004923func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004924 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004925
Paul Duffin89886cb2021-02-05 16:44:03 +00004926 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004927 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004928 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004929 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004930 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004931 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004932 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4933 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4934 android.NormalizePathForTesting(dexJarBuildPath))
4935 }
4936
4937 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004938 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004939 // Make sure the import has been given the correct path to the dex jar.
4940 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4941 dexJarBuildPath := p.DexJarInstallPath()
4942 stem := android.RemoveOptionalPrebuiltPrefix(name)
4943 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4944 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4945 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004946 }
4947
Paul Duffin39853512021-02-26 11:09:39 +00004948 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004949 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004950 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004951 android.AssertArrayString(t, "Check if there is no source variant",
4952 []string{"android_common"},
4953 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004954 }
4955
4956 t.Run("prebuilt only", func(t *testing.T) {
4957 bp := `
4958 prebuilt_apex {
4959 name: "myapex",
4960 arch: {
4961 arm64: {
4962 src: "myapex-arm64.apex",
4963 },
4964 arm: {
4965 src: "myapex-arm.apex",
4966 },
4967 },
Paul Duffin39853512021-02-26 11:09:39 +00004968 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004969 }
4970
4971 java_import {
4972 name: "libfoo",
4973 jars: ["libfoo.jar"],
4974 }
Paul Duffin39853512021-02-26 11:09:39 +00004975
4976 java_sdk_library_import {
4977 name: "libbar",
4978 public: {
4979 jars: ["libbar.jar"],
4980 },
4981 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004982 `
4983
4984 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4985 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4986
Martin Stjernholm44825602021-09-17 01:44:12 +01004987 deapexerName := deapexerModuleName("myapex")
4988 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4989
Paul Duffinf6932af2021-02-26 18:21:56 +00004990 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004991 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004992 rule := deapexer.Rule("deapexer")
4993 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4994 t.Errorf("expected: %q, found: %q", expected, actual)
4995 }
4996
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004997 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004998 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004999 rule = prebuiltApex.Rule("android/soong/android.Cp")
5000 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5001 t.Errorf("expected: %q, found: %q", expected, actual)
5002 }
5003
Paul Duffin89886cb2021-02-05 16:44:03 +00005004 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005005 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005006
5007 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005008 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005009 })
5010
5011 t.Run("prebuilt with source preferred", func(t *testing.T) {
5012
5013 bp := `
5014 prebuilt_apex {
5015 name: "myapex",
5016 arch: {
5017 arm64: {
5018 src: "myapex-arm64.apex",
5019 },
5020 arm: {
5021 src: "myapex-arm.apex",
5022 },
5023 },
Paul Duffin39853512021-02-26 11:09:39 +00005024 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005025 }
5026
5027 java_import {
5028 name: "libfoo",
5029 jars: ["libfoo.jar"],
5030 }
5031
5032 java_library {
5033 name: "libfoo",
5034 }
Paul Duffin39853512021-02-26 11:09:39 +00005035
5036 java_sdk_library_import {
5037 name: "libbar",
5038 public: {
5039 jars: ["libbar.jar"],
5040 },
5041 }
5042
5043 java_sdk_library {
5044 name: "libbar",
5045 srcs: ["foo/bar/MyClass.java"],
5046 unsafe_ignore_missing_latest_api: true,
5047 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005048 `
5049
5050 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5051 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5052
Paul Duffin89886cb2021-02-05 16:44:03 +00005053 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005054 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005055 ensureNoSourceVariant(t, ctx, "libfoo")
5056
5057 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005058 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005059 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005060 })
5061
5062 t.Run("prebuilt preferred with source", func(t *testing.T) {
5063 bp := `
5064 prebuilt_apex {
5065 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005066 arch: {
5067 arm64: {
5068 src: "myapex-arm64.apex",
5069 },
5070 arm: {
5071 src: "myapex-arm.apex",
5072 },
5073 },
Paul Duffin39853512021-02-26 11:09:39 +00005074 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005075 }
5076
5077 java_import {
5078 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005079 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005080 jars: ["libfoo.jar"],
5081 }
5082
5083 java_library {
5084 name: "libfoo",
5085 }
Paul Duffin39853512021-02-26 11:09:39 +00005086
5087 java_sdk_library_import {
5088 name: "libbar",
5089 prefer: true,
5090 public: {
5091 jars: ["libbar.jar"],
5092 },
5093 }
5094
5095 java_sdk_library {
5096 name: "libbar",
5097 srcs: ["foo/bar/MyClass.java"],
5098 unsafe_ignore_missing_latest_api: true,
5099 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005100 `
5101
5102 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5103 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5104
Paul Duffin89886cb2021-02-05 16:44:03 +00005105 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005106 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005107 ensureNoSourceVariant(t, ctx, "libfoo")
5108
5109 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005110 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005111 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005112 })
5113}
5114
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005115func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005116 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005117 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005118 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5119 // is disabled.
5120 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5121 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005122
Paul Duffin37856732021-02-26 14:24:15 +00005123 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5124 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005125 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005126 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005127 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005128 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005129 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005130 foundLibfooJar = true
5131 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005132 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005133 }
5134 }
5135 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005136 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005137 }
5138 }
5139
Paul Duffin40a3f652021-07-19 13:11:24 +01005140 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005141 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005142 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005143 var rule android.TestingBuildParams
5144
5145 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5146 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005147 }
5148
Paul Duffin40a3f652021-07-19 13:11:24 +01005149 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5150 t.Helper()
5151 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5152 var rule android.TestingBuildParams
5153
5154 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5155 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5156 }
5157
Paul Duffin89f570a2021-06-16 01:42:33 +01005158 fragment := java.ApexVariantReference{
5159 Apex: proptools.StringPtr("myapex"),
5160 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5161 }
5162
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005163 t.Run("prebuilt only", func(t *testing.T) {
5164 bp := `
5165 prebuilt_apex {
5166 name: "myapex",
5167 arch: {
5168 arm64: {
5169 src: "myapex-arm64.apex",
5170 },
5171 arm: {
5172 src: "myapex-arm.apex",
5173 },
5174 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005175 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5176 }
5177
5178 prebuilt_bootclasspath_fragment {
5179 name: "my-bootclasspath-fragment",
5180 contents: ["libfoo", "libbar"],
5181 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005182 hidden_api: {
5183 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5184 metadata: "my-bootclasspath-fragment/metadata.csv",
5185 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005186 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5187 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5188 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005189 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005190 }
5191
5192 java_import {
5193 name: "libfoo",
5194 jars: ["libfoo.jar"],
5195 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005196 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005197 }
Paul Duffin37856732021-02-26 14:24:15 +00005198
5199 java_sdk_library_import {
5200 name: "libbar",
5201 public: {
5202 jars: ["libbar.jar"],
5203 },
5204 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005205 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005206 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005207 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005208 `
5209
Paul Duffin89f570a2021-06-16 01:42:33 +01005210 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005211 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5212 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005213
Paul Duffin537ea3d2021-05-14 10:38:00 +01005214 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005215 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005216 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005217 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005218 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5219 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005220 })
5221
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005222 t.Run("apex_set only", func(t *testing.T) {
5223 bp := `
5224 apex_set {
5225 name: "myapex",
5226 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005227 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5228 }
5229
5230 prebuilt_bootclasspath_fragment {
5231 name: "my-bootclasspath-fragment",
5232 contents: ["libfoo", "libbar"],
5233 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005234 hidden_api: {
5235 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5236 metadata: "my-bootclasspath-fragment/metadata.csv",
5237 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005238 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5239 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5240 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005241 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005242 }
5243
5244 java_import {
5245 name: "libfoo",
5246 jars: ["libfoo.jar"],
5247 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005248 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005249 }
5250
5251 java_sdk_library_import {
5252 name: "libbar",
5253 public: {
5254 jars: ["libbar.jar"],
5255 },
5256 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005257 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005258 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005259 }
5260 `
5261
Paul Duffin89f570a2021-06-16 01:42:33 +01005262 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005263 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5264 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5265
Paul Duffin537ea3d2021-05-14 10:38:00 +01005266 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005267 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005268 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005269 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005270 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5271 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005272 })
5273
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005274 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5275 bp := `
5276 prebuilt_apex {
5277 name: "myapex",
5278 arch: {
5279 arm64: {
5280 src: "myapex-arm64.apex",
5281 },
5282 arm: {
5283 src: "myapex-arm.apex",
5284 },
5285 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005286 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5287 }
5288
5289 prebuilt_bootclasspath_fragment {
5290 name: "my-bootclasspath-fragment",
5291 contents: ["libfoo", "libbar"],
5292 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005293 hidden_api: {
5294 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5295 metadata: "my-bootclasspath-fragment/metadata.csv",
5296 index: "my-bootclasspath-fragment/index.csv",
5297 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5298 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5299 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005300 }
5301
5302 java_import {
5303 name: "libfoo",
5304 jars: ["libfoo.jar"],
5305 apex_available: ["myapex"],
5306 }
5307
5308 java_library {
5309 name: "libfoo",
5310 srcs: ["foo/bar/MyClass.java"],
5311 apex_available: ["myapex"],
5312 }
Paul Duffin37856732021-02-26 14:24:15 +00005313
5314 java_sdk_library_import {
5315 name: "libbar",
5316 public: {
5317 jars: ["libbar.jar"],
5318 },
5319 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005320 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005321 }
5322
5323 java_sdk_library {
5324 name: "libbar",
5325 srcs: ["foo/bar/MyClass.java"],
5326 unsafe_ignore_missing_latest_api: true,
5327 apex_available: ["myapex"],
5328 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005329 `
5330
5331 // In this test the source (java_library) libfoo is active since the
5332 // prebuilt (java_import) defaults to prefer:false. However the
5333 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5334 // find the dex boot jar in it. We either need to disable the source libfoo
5335 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005336 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005337 // dexbootjar check is skipped if AllowMissingDependencies is true
5338 preparerAllowMissingDeps := android.GroupFixturePreparers(
5339 preparer,
5340 android.PrepareForTestWithAllowMissingDependencies,
5341 )
5342 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005343 })
5344
5345 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5346 bp := `
5347 prebuilt_apex {
5348 name: "myapex",
5349 arch: {
5350 arm64: {
5351 src: "myapex-arm64.apex",
5352 },
5353 arm: {
5354 src: "myapex-arm.apex",
5355 },
5356 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005357 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5358 }
5359
5360 prebuilt_bootclasspath_fragment {
5361 name: "my-bootclasspath-fragment",
5362 contents: ["libfoo", "libbar"],
5363 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005364 hidden_api: {
5365 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5366 metadata: "my-bootclasspath-fragment/metadata.csv",
5367 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005368 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5369 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5370 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005371 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005372 }
5373
5374 java_import {
5375 name: "libfoo",
5376 prefer: true,
5377 jars: ["libfoo.jar"],
5378 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005379 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005380 }
5381
5382 java_library {
5383 name: "libfoo",
5384 srcs: ["foo/bar/MyClass.java"],
5385 apex_available: ["myapex"],
5386 }
Paul Duffin37856732021-02-26 14:24:15 +00005387
5388 java_sdk_library_import {
5389 name: "libbar",
5390 prefer: true,
5391 public: {
5392 jars: ["libbar.jar"],
5393 },
5394 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005395 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005396 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005397 }
5398
5399 java_sdk_library {
5400 name: "libbar",
5401 srcs: ["foo/bar/MyClass.java"],
5402 unsafe_ignore_missing_latest_api: true,
5403 apex_available: ["myapex"],
5404 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005405 `
5406
Paul Duffin89f570a2021-06-16 01:42:33 +01005407 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005408 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5409 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005410
Paul Duffin537ea3d2021-05-14 10:38:00 +01005411 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005412 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005413 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005414 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005415 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5416 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005417 })
5418
5419 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5420 bp := `
5421 apex {
5422 name: "myapex",
5423 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005424 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005425 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005426 }
5427
5428 apex_key {
5429 name: "myapex.key",
5430 public_key: "testkey.avbpubkey",
5431 private_key: "testkey.pem",
5432 }
5433
5434 prebuilt_apex {
5435 name: "myapex",
5436 arch: {
5437 arm64: {
5438 src: "myapex-arm64.apex",
5439 },
5440 arm: {
5441 src: "myapex-arm.apex",
5442 },
5443 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005444 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5445 }
5446
5447 prebuilt_bootclasspath_fragment {
5448 name: "my-bootclasspath-fragment",
5449 contents: ["libfoo", "libbar"],
5450 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005451 hidden_api: {
5452 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5453 metadata: "my-bootclasspath-fragment/metadata.csv",
5454 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005455 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5456 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5457 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005458 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005459 }
5460
5461 java_import {
5462 name: "libfoo",
5463 jars: ["libfoo.jar"],
5464 apex_available: ["myapex"],
5465 }
5466
5467 java_library {
5468 name: "libfoo",
5469 srcs: ["foo/bar/MyClass.java"],
5470 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005471 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005472 }
Paul Duffin37856732021-02-26 14:24:15 +00005473
5474 java_sdk_library_import {
5475 name: "libbar",
5476 public: {
5477 jars: ["libbar.jar"],
5478 },
5479 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005480 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005481 }
5482
5483 java_sdk_library {
5484 name: "libbar",
5485 srcs: ["foo/bar/MyClass.java"],
5486 unsafe_ignore_missing_latest_api: true,
5487 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005488 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005489 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005490 `
5491
Paul Duffin89f570a2021-06-16 01:42:33 +01005492 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005493 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5494 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005495
Paul Duffin537ea3d2021-05-14 10:38:00 +01005496 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005497 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005498 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005499 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005500 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5501 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005502 })
5503
5504 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5505 bp := `
5506 apex {
5507 name: "myapex",
5508 enabled: false,
5509 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005510 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005511 }
5512
5513 apex_key {
5514 name: "myapex.key",
5515 public_key: "testkey.avbpubkey",
5516 private_key: "testkey.pem",
5517 }
5518
5519 prebuilt_apex {
5520 name: "myapex",
5521 arch: {
5522 arm64: {
5523 src: "myapex-arm64.apex",
5524 },
5525 arm: {
5526 src: "myapex-arm.apex",
5527 },
5528 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005529 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5530 }
5531
5532 prebuilt_bootclasspath_fragment {
5533 name: "my-bootclasspath-fragment",
5534 contents: ["libfoo", "libbar"],
5535 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005536 hidden_api: {
5537 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5538 metadata: "my-bootclasspath-fragment/metadata.csv",
5539 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005540 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5541 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5542 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005543 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005544 }
5545
5546 java_import {
5547 name: "libfoo",
5548 prefer: true,
5549 jars: ["libfoo.jar"],
5550 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005551 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005552 }
5553
5554 java_library {
5555 name: "libfoo",
5556 srcs: ["foo/bar/MyClass.java"],
5557 apex_available: ["myapex"],
5558 }
Paul Duffin37856732021-02-26 14:24:15 +00005559
5560 java_sdk_library_import {
5561 name: "libbar",
5562 prefer: true,
5563 public: {
5564 jars: ["libbar.jar"],
5565 },
5566 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005567 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005568 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005569 }
5570
5571 java_sdk_library {
5572 name: "libbar",
5573 srcs: ["foo/bar/MyClass.java"],
5574 unsafe_ignore_missing_latest_api: true,
5575 apex_available: ["myapex"],
5576 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005577 `
5578
Paul Duffin89f570a2021-06-16 01:42:33 +01005579 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005580 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5581 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005582
Paul Duffin537ea3d2021-05-14 10:38:00 +01005583 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005584 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005585 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005586 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005587 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5588 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005589 })
5590}
5591
Roland Levillain630846d2019-06-26 12:48:34 +01005592func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005593 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005594 apex_test {
5595 name: "myapex",
5596 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005597 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005598 tests: [
5599 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005600 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005601 ],
5602 }
5603
5604 apex_key {
5605 name: "myapex.key",
5606 public_key: "testkey.avbpubkey",
5607 private_key: "testkey.pem",
5608 }
5609
Liz Kammer1c14a212020-05-12 15:26:55 -07005610 filegroup {
5611 name: "fg",
5612 srcs: [
5613 "baz",
5614 "bar/baz"
5615 ],
5616 }
5617
Roland Levillain630846d2019-06-26 12:48:34 +01005618 cc_test {
5619 name: "mytest",
5620 gtest: false,
5621 srcs: ["mytest.cpp"],
5622 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005623 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005624 system_shared_libs: [],
5625 static_executable: true,
5626 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005627 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005628 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005629
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005630 cc_library {
5631 name: "mylib",
5632 srcs: ["mylib.cpp"],
5633 system_shared_libs: [],
5634 stl: "none",
5635 }
5636
Liz Kammer5bd365f2020-05-27 15:15:11 -07005637 filegroup {
5638 name: "fg2",
5639 srcs: [
5640 "testdata/baz"
5641 ],
5642 }
5643
Roland Levillain9b5fde92019-06-28 15:41:19 +01005644 cc_test {
5645 name: "mytests",
5646 gtest: false,
5647 srcs: [
5648 "mytest1.cpp",
5649 "mytest2.cpp",
5650 "mytest3.cpp",
5651 ],
5652 test_per_src: true,
5653 relative_install_path: "test",
5654 system_shared_libs: [],
5655 static_executable: true,
5656 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005657 data: [
5658 ":fg",
5659 ":fg2",
5660 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005661 }
Roland Levillain630846d2019-06-26 12:48:34 +01005662 `)
5663
Sundong Ahnabb64432019-10-22 13:58:29 +09005664 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005665 copyCmds := apexRule.Args["copy_commands"]
5666
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005667 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005668 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005669 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005670
Liz Kammer1c14a212020-05-12 15:26:55 -07005671 //Ensure that test data are copied into apex.
5672 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5673 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5674
Roland Levillain9b5fde92019-06-28 15:41:19 +01005675 // Ensure that test deps built with `test_per_src` are copied into apex.
5676 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5677 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5678 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005679
5680 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005681 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005682 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005683 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005684 prefix := "TARGET_"
5685 var builder strings.Builder
5686 data.Custom(&builder, name, prefix, "", data)
5687 androidMk := builder.String()
Roland Levillainf89cd092019-07-29 16:22:59 +01005688 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005689
5690 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005691 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005692 data.Custom(&builder, name, prefix, "", data)
5693 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005694 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5695 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005696}
5697
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005698func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005699 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005700 apex {
5701 name: "myapex",
5702 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005703 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005704 }
5705 apex_key {
5706 name: "myapex.key",
5707 public_key: "testkey.avbpubkey",
5708 private_key: "testkey.pem",
5709 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005710 `,
5711 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5712 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5713 }),
5714 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005715 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005716 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005717 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005718 var builder strings.Builder
5719 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5720 androidMk := builder.String()
Cole Fausteb8cd312022-11-03 16:39:21 -07005721 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005722}
5723
Jooyung Hand48f3c32019-08-23 11:18:57 +09005724func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5725 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5726 apex {
5727 name: "myapex",
5728 key: "myapex.key",
5729 native_shared_libs: ["libfoo"],
5730 }
5731
5732 apex_key {
5733 name: "myapex.key",
5734 public_key: "testkey.avbpubkey",
5735 private_key: "testkey.pem",
5736 }
5737
5738 cc_library {
5739 name: "libfoo",
5740 stl: "none",
5741 system_shared_libs: [],
5742 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005743 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005744 }
5745 `)
5746 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5747 apex {
5748 name: "myapex",
5749 key: "myapex.key",
5750 java_libs: ["myjar"],
5751 }
5752
5753 apex_key {
5754 name: "myapex.key",
5755 public_key: "testkey.avbpubkey",
5756 private_key: "testkey.pem",
5757 }
5758
5759 java_library {
5760 name: "myjar",
5761 srcs: ["foo/bar/MyClass.java"],
5762 sdk_version: "none",
5763 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005764 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005765 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005766 }
5767 `)
5768}
5769
Bill Peckhama41a6962021-01-11 10:58:54 -08005770func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005771 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005772 apex {
5773 name: "myapex",
5774 key: "myapex.key",
5775 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005776 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005777 }
5778
5779 apex_key {
5780 name: "myapex.key",
5781 public_key: "testkey.avbpubkey",
5782 private_key: "testkey.pem",
5783 }
5784
5785 java_import {
5786 name: "myjavaimport",
5787 apex_available: ["myapex"],
5788 jars: ["my.jar"],
5789 compile_dex: true,
5790 }
5791 `)
5792
5793 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5794 apexRule := module.Rule("apexRule")
5795 copyCmds := apexRule.Args["copy_commands"]
5796 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5797}
5798
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005799func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005800 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005801 apex {
5802 name: "myapex",
5803 key: "myapex.key",
5804 apps: [
5805 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005806 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005807 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005808 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005809 }
5810
5811 apex_key {
5812 name: "myapex.key",
5813 public_key: "testkey.avbpubkey",
5814 private_key: "testkey.pem",
5815 }
5816
5817 android_app {
5818 name: "AppFoo",
5819 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005820 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005821 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005822 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005823 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005824 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005825 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005826
5827 android_app {
5828 name: "AppFooPriv",
5829 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005830 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005831 system_modules: "none",
5832 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005833 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005834 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005835 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005836
5837 cc_library_shared {
5838 name: "libjni",
5839 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005840 shared_libs: ["libfoo"],
5841 stl: "none",
5842 system_shared_libs: [],
5843 apex_available: [ "myapex" ],
5844 sdk_version: "current",
5845 }
5846
5847 cc_library_shared {
5848 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005849 stl: "none",
5850 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005851 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005852 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005853 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005854 `)
5855
Sundong Ahnabb64432019-10-22 13:58:29 +09005856 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005857 apexRule := module.Rule("apexRule")
5858 copyCmds := apexRule.Args["copy_commands"]
5859
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005860 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5861 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005862
Colin Crossaede88c2020-08-11 12:17:01 -07005863 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005864 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005865 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005866 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005867 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005868 // JNI libraries including transitive deps are
5869 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005870 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005871 // ... embedded inside APK (jnilibs.zip)
5872 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5873 // ... and not directly inside the APEX
5874 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5875 }
Dario Frenicde2a032019-10-27 00:29:22 +01005876}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005877
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005878func TestApexWithAppImportBuildId(t *testing.T) {
5879 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5880 for _, id := range invalidBuildIds {
5881 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5882 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5883 variables.BuildId = proptools.StringPtr(id)
5884 })
5885 testApexError(t, message, `apex {
5886 name: "myapex",
5887 key: "myapex.key",
5888 apps: ["AppFooPrebuilt"],
5889 updatable: false,
5890 }
5891
5892 apex_key {
5893 name: "myapex.key",
5894 public_key: "testkey.avbpubkey",
5895 private_key: "testkey.pem",
5896 }
5897
5898 android_app_import {
5899 name: "AppFooPrebuilt",
5900 apk: "PrebuiltAppFoo.apk",
5901 presigned: true,
5902 apex_available: ["myapex"],
5903 }
5904 `, fixture)
5905 }
5906}
5907
Dario Frenicde2a032019-10-27 00:29:22 +01005908func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005909 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005910 apex {
5911 name: "myapex",
5912 key: "myapex.key",
5913 apps: [
5914 "AppFooPrebuilt",
5915 "AppFooPrivPrebuilt",
5916 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005917 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005918 }
5919
5920 apex_key {
5921 name: "myapex.key",
5922 public_key: "testkey.avbpubkey",
5923 private_key: "testkey.pem",
5924 }
5925
5926 android_app_import {
5927 name: "AppFooPrebuilt",
5928 apk: "PrebuiltAppFoo.apk",
5929 presigned: true,
5930 dex_preopt: {
5931 enabled: false,
5932 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005933 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005934 }
5935
5936 android_app_import {
5937 name: "AppFooPrivPrebuilt",
5938 apk: "PrebuiltAppFooPriv.apk",
5939 privileged: true,
5940 presigned: true,
5941 dex_preopt: {
5942 enabled: false,
5943 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005944 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005945 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005946 }
5947 `)
5948
Sundong Ahnabb64432019-10-22 13:58:29 +09005949 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005950 apexRule := module.Rule("apexRule")
5951 copyCmds := apexRule.Args["copy_commands"]
5952
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005953 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5954 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005955}
5956
5957func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005958 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005959 apex {
5960 name: "myapex",
5961 key: "myapex.key",
5962 apps: [
5963 "AppFoo",
5964 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005965 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005966 }
5967
5968 apex_key {
5969 name: "myapex.key",
5970 public_key: "testkey.avbpubkey",
5971 private_key: "testkey.pem",
5972 }
5973
5974 android_app {
5975 name: "AppFoo",
5976 srcs: ["foo/bar/MyClass.java"],
5977 sdk_version: "none",
5978 system_modules: "none",
5979 apex_available: [ "myapex" ],
5980 }
5981
5982 android_app_import {
5983 name: "AppFoo",
5984 apk: "AppFooPrebuilt.apk",
5985 filename: "AppFooPrebuilt.apk",
5986 presigned: true,
5987 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005988 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005989 }
5990 `, withFiles(map[string][]byte{
5991 "AppFooPrebuilt.apk": nil,
5992 }))
5993
5994 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005995 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005996 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005997}
5998
Dario Freni6f3937c2019-12-20 22:58:03 +00005999func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006000 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006001 apex {
6002 name: "myapex",
6003 key: "myapex.key",
6004 apps: [
6005 "TesterHelpAppFoo",
6006 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006007 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006008 }
6009
6010 apex_key {
6011 name: "myapex.key",
6012 public_key: "testkey.avbpubkey",
6013 private_key: "testkey.pem",
6014 }
6015
6016 android_test_helper_app {
6017 name: "TesterHelpAppFoo",
6018 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006019 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006020 }
6021
6022 `)
6023
6024 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6025 apexRule := module.Rule("apexRule")
6026 copyCmds := apexRule.Args["copy_commands"]
6027
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006028 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006029}
6030
Jooyung Han18020ea2019-11-13 10:50:48 +09006031func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6032 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006033 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006034 apex {
6035 name: "myapex",
6036 key: "myapex.key",
6037 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006038 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006039 }
6040
6041 apex_key {
6042 name: "myapex.key",
6043 public_key: "testkey.avbpubkey",
6044 private_key: "testkey.pem",
6045 }
6046
6047 apex {
6048 name: "otherapex",
6049 key: "myapex.key",
6050 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006051 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006052 }
6053
6054 cc_defaults {
6055 name: "libfoo-defaults",
6056 apex_available: ["otherapex"],
6057 }
6058
6059 cc_library {
6060 name: "libfoo",
6061 defaults: ["libfoo-defaults"],
6062 stl: "none",
6063 system_shared_libs: [],
6064 }`)
6065}
6066
Paul Duffine52e66f2020-03-30 17:54:29 +01006067func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006068 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006069 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006070 apex {
6071 name: "myapex",
6072 key: "myapex.key",
6073 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006074 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006075 }
6076
6077 apex_key {
6078 name: "myapex.key",
6079 public_key: "testkey.avbpubkey",
6080 private_key: "testkey.pem",
6081 }
6082
6083 apex {
6084 name: "otherapex",
6085 key: "otherapex.key",
6086 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006087 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006088 }
6089
6090 apex_key {
6091 name: "otherapex.key",
6092 public_key: "testkey.avbpubkey",
6093 private_key: "testkey.pem",
6094 }
6095
6096 cc_library {
6097 name: "libfoo",
6098 stl: "none",
6099 system_shared_libs: [],
6100 apex_available: ["otherapex"],
6101 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006102}
Jiyong Park127b40b2019-09-30 16:04:35 +09006103
Paul Duffine52e66f2020-03-30 17:54:29 +01006104func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006105 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006106 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006107.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006108.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006109.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006110.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006111.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006112.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006113 apex {
6114 name: "myapex",
6115 key: "myapex.key",
6116 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006117 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006118 }
6119
6120 apex_key {
6121 name: "myapex.key",
6122 public_key: "testkey.avbpubkey",
6123 private_key: "testkey.pem",
6124 }
6125
Jiyong Park127b40b2019-09-30 16:04:35 +09006126 cc_library {
6127 name: "libfoo",
6128 stl: "none",
6129 shared_libs: ["libbar"],
6130 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006131 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006132 }
6133
6134 cc_library {
6135 name: "libbar",
6136 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006137 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006138 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006139 apex_available: ["myapex"],
6140 }
6141
6142 cc_library {
6143 name: "libbaz",
6144 stl: "none",
6145 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006146 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006147}
Jiyong Park127b40b2019-09-30 16:04:35 +09006148
Paul Duffine52e66f2020-03-30 17:54:29 +01006149func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006150 testApexError(t, "\"otherapex\" is not a valid module name", `
6151 apex {
6152 name: "myapex",
6153 key: "myapex.key",
6154 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006155 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006156 }
6157
6158 apex_key {
6159 name: "myapex.key",
6160 public_key: "testkey.avbpubkey",
6161 private_key: "testkey.pem",
6162 }
6163
6164 cc_library {
6165 name: "libfoo",
6166 stl: "none",
6167 system_shared_libs: [],
6168 apex_available: ["otherapex"],
6169 }`)
6170
Paul Duffine52e66f2020-03-30 17:54:29 +01006171 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006172 apex {
6173 name: "myapex",
6174 key: "myapex.key",
6175 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006176 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006177 }
6178
6179 apex_key {
6180 name: "myapex.key",
6181 public_key: "testkey.avbpubkey",
6182 private_key: "testkey.pem",
6183 }
6184
6185 cc_library {
6186 name: "libfoo",
6187 stl: "none",
6188 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006189 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006190 apex_available: ["myapex"],
6191 }
6192
6193 cc_library {
6194 name: "libbar",
6195 stl: "none",
6196 system_shared_libs: [],
6197 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006198 }
6199
6200 cc_library {
6201 name: "libbaz",
6202 stl: "none",
6203 system_shared_libs: [],
6204 stubs: {
6205 versions: ["10", "20", "30"],
6206 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006207 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006208}
Jiyong Park127b40b2019-09-30 16:04:35 +09006209
Jiyong Park89e850a2020-04-07 16:37:39 +09006210func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006211 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006212 apex {
6213 name: "myapex",
6214 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006215 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006216 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006217 }
6218
6219 apex_key {
6220 name: "myapex.key",
6221 public_key: "testkey.avbpubkey",
6222 private_key: "testkey.pem",
6223 }
6224
6225 cc_library {
6226 name: "libfoo",
6227 stl: "none",
6228 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006229 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006230 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006231 }
6232
6233 cc_library {
6234 name: "libfoo2",
6235 stl: "none",
6236 system_shared_libs: [],
6237 shared_libs: ["libbaz"],
6238 apex_available: ["//apex_available:platform"],
6239 }
6240
6241 cc_library {
6242 name: "libbar",
6243 stl: "none",
6244 system_shared_libs: [],
6245 apex_available: ["myapex"],
6246 }
6247
6248 cc_library {
6249 name: "libbaz",
6250 stl: "none",
6251 system_shared_libs: [],
6252 apex_available: ["myapex"],
6253 stubs: {
6254 versions: ["1"],
6255 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006256 }`)
6257
Jiyong Park89e850a2020-04-07 16:37:39 +09006258 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6259 // because it depends on libbar which isn't available to platform
6260 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6261 if libfoo.NotAvailableForPlatform() != true {
6262 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6263 }
6264
6265 // libfoo2 however can be available to platform because it depends on libbaz which provides
6266 // stubs
6267 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6268 if libfoo2.NotAvailableForPlatform() == true {
6269 t.Errorf("%q should be available to platform", libfoo2.String())
6270 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006271}
Jiyong Parka90ca002019-10-07 15:47:24 +09006272
Paul Duffine52e66f2020-03-30 17:54:29 +01006273func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006274 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006275 apex {
6276 name: "myapex",
6277 key: "myapex.key",
6278 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006279 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006280 }
6281
6282 apex_key {
6283 name: "myapex.key",
6284 public_key: "testkey.avbpubkey",
6285 private_key: "testkey.pem",
6286 }
6287
6288 cc_library {
6289 name: "libfoo",
6290 stl: "none",
6291 system_shared_libs: [],
6292 apex_available: ["myapex"],
6293 static: {
6294 apex_available: ["//apex_available:platform"],
6295 },
6296 }`)
6297
Jiyong Park89e850a2020-04-07 16:37:39 +09006298 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6299 if libfooShared.NotAvailableForPlatform() != true {
6300 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6301 }
6302 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6303 if libfooStatic.NotAvailableForPlatform() != false {
6304 t.Errorf("%q should be available to platform", libfooStatic.String())
6305 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006306}
6307
Jiyong Park5d790c32019-11-15 18:40:32 +09006308func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006309 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006310 apex {
6311 name: "myapex",
6312 key: "myapex.key",
6313 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006314 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006315 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006316 bootclasspath_fragments: ["mybootclasspath_fragment"],
6317 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6318 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006319 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006320 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006321 }
6322
6323 override_apex {
6324 name: "override_myapex",
6325 base: "myapex",
6326 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006327 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006328 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006329 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6330 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6331 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006332 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006333 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006334 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006335 key: "mynewapex.key",
6336 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006337 }
6338
6339 apex_key {
6340 name: "myapex.key",
6341 public_key: "testkey.avbpubkey",
6342 private_key: "testkey.pem",
6343 }
6344
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006345 apex_key {
6346 name: "mynewapex.key",
6347 public_key: "testkey2.avbpubkey",
6348 private_key: "testkey2.pem",
6349 }
6350
6351 android_app_certificate {
6352 name: "myapex.certificate",
6353 certificate: "testkey",
6354 }
6355
Jiyong Park5d790c32019-11-15 18:40:32 +09006356 android_app {
6357 name: "app",
6358 srcs: ["foo/bar/MyClass.java"],
6359 package_name: "foo",
6360 sdk_version: "none",
6361 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006362 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006363 }
6364
6365 override_android_app {
6366 name: "override_app",
6367 base: "app",
6368 package_name: "bar",
6369 }
markchien7c803b82021-08-26 22:10:06 +08006370
6371 bpf {
6372 name: "bpf",
6373 srcs: ["bpf.c"],
6374 }
6375
6376 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006377 name: "overrideBpf",
6378 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006379 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006380
6381 prebuilt_etc {
6382 name: "myetc",
6383 src: "myprebuilt",
6384 }
6385
6386 prebuilt_etc {
6387 name: "override_myetc",
6388 src: "override_myprebuilt",
6389 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006390
6391 java_library {
6392 name: "bcplib",
6393 srcs: ["a.java"],
6394 compile_dex: true,
6395 apex_available: ["myapex"],
6396 permitted_packages: ["bcp.lib"],
6397 }
6398
6399 bootclasspath_fragment {
6400 name: "mybootclasspath_fragment",
6401 contents: ["bcplib"],
6402 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006403 hidden_api: {
6404 split_packages: ["*"],
6405 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006406 }
6407
6408 java_library {
6409 name: "override_bcplib",
6410 srcs: ["a.java"],
6411 compile_dex: true,
6412 apex_available: ["myapex"],
6413 permitted_packages: ["override.bcp.lib"],
6414 }
6415
6416 bootclasspath_fragment {
6417 name: "override_bootclasspath_fragment",
6418 contents: ["override_bcplib"],
6419 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006420 hidden_api: {
6421 split_packages: ["*"],
6422 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006423 }
6424
6425 java_library {
6426 name: "systemserverlib",
6427 srcs: ["a.java"],
6428 apex_available: ["myapex"],
6429 }
6430
6431 systemserverclasspath_fragment {
6432 name: "mysystemserverclasspath_fragment",
6433 standalone_contents: ["systemserverlib"],
6434 apex_available: ["myapex"],
6435 }
6436
6437 java_library {
6438 name: "override_systemserverlib",
6439 srcs: ["a.java"],
6440 apex_available: ["myapex"],
6441 }
6442
6443 systemserverclasspath_fragment {
6444 name: "override_systemserverclasspath_fragment",
6445 standalone_contents: ["override_systemserverlib"],
6446 apex_available: ["myapex"],
6447 }
6448
6449 java_library {
6450 name: "myjava_library",
6451 srcs: ["a.java"],
6452 compile_dex: true,
6453 apex_available: ["myapex"],
6454 }
6455
6456 java_library {
6457 name: "override_java_library",
6458 srcs: ["a.java"],
6459 compile_dex: true,
6460 apex_available: ["myapex"],
6461 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006462 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006463
Jiyong Park317645e2019-12-05 13:20:58 +09006464 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6465 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6466 if originalVariant.GetOverriddenBy() != "" {
6467 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6468 }
6469 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6470 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6471 }
6472
Jiyong Park5d790c32019-11-15 18:40:32 +09006473 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6474 apexRule := module.Rule("apexRule")
6475 copyCmds := apexRule.Args["copy_commands"]
6476
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006477 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6478 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006479
markchien7c803b82021-08-26 22:10:06 +08006480 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006481 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006482
Daniel Norman5a3ce132021-08-26 15:44:43 -07006483 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6484 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6485
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006486 apexBundle := module.Module().(*apexBundle)
6487 name := apexBundle.Name()
6488 if name != "override_myapex" {
6489 t.Errorf("name should be \"override_myapex\", but was %q", name)
6490 }
6491
Baligh Uddin004d7172020-02-19 21:29:28 -08006492 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6493 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6494 }
6495
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006496 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6497 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6498 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6499 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6500 android.AssertArrayString(t, "Java_libs does not match",
6501 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6502
Jiyong Park20bacab2020-03-03 11:45:41 +09006503 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006504 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006505 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6506
6507 signApkRule := module.Rule("signapk")
6508 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006509
Colin Crossaa255532020-07-03 13:18:24 -07006510 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006511 var builder strings.Builder
6512 data.Custom(&builder, name, "TARGET_", "", data)
6513 androidMk := builder.String()
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006514 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006515 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006516 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006517 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006518 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006519 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006520 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6521 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6522 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006523 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006524}
6525
Albert Martineefabcf2022-03-21 20:11:16 +00006526func TestMinSdkVersionOverride(t *testing.T) {
6527 // Override from 29 to 31
6528 minSdkOverride31 := "31"
6529 ctx := testApex(t, `
6530 apex {
6531 name: "myapex",
6532 key: "myapex.key",
6533 native_shared_libs: ["mylib"],
6534 updatable: true,
6535 min_sdk_version: "29"
6536 }
6537
6538 override_apex {
6539 name: "override_myapex",
6540 base: "myapex",
6541 logging_parent: "com.foo.bar",
6542 package_name: "test.overridden.package"
6543 }
6544
6545 apex_key {
6546 name: "myapex.key",
6547 public_key: "testkey.avbpubkey",
6548 private_key: "testkey.pem",
6549 }
6550
6551 cc_library {
6552 name: "mylib",
6553 srcs: ["mylib.cpp"],
6554 runtime_libs: ["libbar"],
6555 system_shared_libs: [],
6556 stl: "none",
6557 apex_available: [ "myapex" ],
6558 min_sdk_version: "apex_inherit"
6559 }
6560
6561 cc_library {
6562 name: "libbar",
6563 srcs: ["mylib.cpp"],
6564 system_shared_libs: [],
6565 stl: "none",
6566 apex_available: [ "myapex" ],
6567 min_sdk_version: "apex_inherit"
6568 }
6569
6570 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6571
6572 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6573 copyCmds := apexRule.Args["copy_commands"]
6574
6575 // Ensure that direct non-stubs dep is always included
6576 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6577
6578 // Ensure that runtime_libs dep in included
6579 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6580
6581 // Ensure libraries target overridden min_sdk_version value
6582 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6583}
6584
6585func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6586 // Attempt to override from 31 to 29, should be a NOOP
6587 minSdkOverride29 := "29"
6588 ctx := testApex(t, `
6589 apex {
6590 name: "myapex",
6591 key: "myapex.key",
6592 native_shared_libs: ["mylib"],
6593 updatable: true,
6594 min_sdk_version: "31"
6595 }
6596
6597 override_apex {
6598 name: "override_myapex",
6599 base: "myapex",
6600 logging_parent: "com.foo.bar",
6601 package_name: "test.overridden.package"
6602 }
6603
6604 apex_key {
6605 name: "myapex.key",
6606 public_key: "testkey.avbpubkey",
6607 private_key: "testkey.pem",
6608 }
6609
6610 cc_library {
6611 name: "mylib",
6612 srcs: ["mylib.cpp"],
6613 runtime_libs: ["libbar"],
6614 system_shared_libs: [],
6615 stl: "none",
6616 apex_available: [ "myapex" ],
6617 min_sdk_version: "apex_inherit"
6618 }
6619
6620 cc_library {
6621 name: "libbar",
6622 srcs: ["mylib.cpp"],
6623 system_shared_libs: [],
6624 stl: "none",
6625 apex_available: [ "myapex" ],
6626 min_sdk_version: "apex_inherit"
6627 }
6628
6629 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6630
6631 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6632 copyCmds := apexRule.Args["copy_commands"]
6633
6634 // Ensure that direct non-stubs dep is always included
6635 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6636
6637 // Ensure that runtime_libs dep in included
6638 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6639
6640 // Ensure libraries target the original min_sdk_version value rather than the overridden
6641 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6642}
6643
Jooyung Han214bf372019-11-12 13:03:50 +09006644func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006645 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006646 apex {
6647 name: "myapex",
6648 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006649 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006650 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006651 }
6652
6653 apex_key {
6654 name: "myapex.key",
6655 public_key: "testkey.avbpubkey",
6656 private_key: "testkey.pem",
6657 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006658
6659 cc_library {
6660 name: "mylib",
6661 srcs: ["mylib.cpp"],
6662 stl: "libc++",
6663 system_shared_libs: [],
6664 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006665 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006666 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006667 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006668
6669 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6670 args := module.Rule("apexRule").Args
6671 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006672 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006673
6674 // The copies of the libraries in the apex should have one more dependency than
6675 // the ones outside the apex, namely the unwinder. Ideally we should check
6676 // the dependency names directly here but for some reason the names are blank in
6677 // this test.
6678 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006679 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006680 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6681 if len(apexImplicits) != len(nonApexImplicits)+1 {
6682 t.Errorf("%q missing unwinder dep", lib)
6683 }
6684 }
Jooyung Han214bf372019-11-12 13:03:50 +09006685}
6686
Paul Duffine05480a2021-03-08 15:07:14 +00006687var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006688 "api/current.txt": nil,
6689 "api/removed.txt": nil,
6690 "api/system-current.txt": nil,
6691 "api/system-removed.txt": nil,
6692 "api/test-current.txt": nil,
6693 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006694
Anton Hanssondff2c782020-12-21 17:10:01 +00006695 "100/public/api/foo.txt": nil,
6696 "100/public/api/foo-removed.txt": nil,
6697 "100/system/api/foo.txt": nil,
6698 "100/system/api/foo-removed.txt": nil,
6699
Paul Duffineedc5d52020-06-12 17:46:39 +01006700 // For java_sdk_library_import
6701 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006702}
6703
Jooyung Han58f26ab2019-12-18 15:34:32 +09006704func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006705 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006706 apex {
6707 name: "myapex",
6708 key: "myapex.key",
6709 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006710 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006711 }
6712
6713 apex_key {
6714 name: "myapex.key",
6715 public_key: "testkey.avbpubkey",
6716 private_key: "testkey.pem",
6717 }
6718
6719 java_sdk_library {
6720 name: "foo",
6721 srcs: ["a.java"],
6722 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006723 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006724 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006725
6726 prebuilt_apis {
6727 name: "sdk",
6728 api_dirs: ["100"],
6729 }
Paul Duffin9b879592020-05-26 13:21:35 +01006730 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006731
6732 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006733 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006734 "javalib/foo.jar",
6735 "etc/permissions/foo.xml",
6736 })
6737 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006738 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006739 ensureMatches(t, sdkLibrary.RuleParams.Command, `<library\\n\s+name=\\\"foo\\\"\\n\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09006740}
6741
Paul Duffin9b879592020-05-26 13:21:35 +01006742func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006743 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006744 apex {
6745 name: "myapex",
6746 key: "myapex.key",
6747 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006748 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006749 }
6750
6751 apex_key {
6752 name: "myapex.key",
6753 public_key: "testkey.avbpubkey",
6754 private_key: "testkey.pem",
6755 }
6756
6757 java_sdk_library {
6758 name: "foo",
6759 srcs: ["a.java"],
6760 api_packages: ["foo"],
6761 apex_available: ["myapex"],
6762 sdk_version: "none",
6763 system_modules: "none",
6764 }
6765
6766 java_library {
6767 name: "bar",
6768 srcs: ["a.java"],
6769 libs: ["foo"],
6770 apex_available: ["myapex"],
6771 sdk_version: "none",
6772 system_modules: "none",
6773 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006774
6775 prebuilt_apis {
6776 name: "sdk",
6777 api_dirs: ["100"],
6778 }
Paul Duffin9b879592020-05-26 13:21:35 +01006779 `, withFiles(filesForSdkLibrary))
6780
6781 // java_sdk_library installs both impl jar and permission XML
6782 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6783 "javalib/bar.jar",
6784 "javalib/foo.jar",
6785 "etc/permissions/foo.xml",
6786 })
6787
6788 // The bar library should depend on the implementation jar.
6789 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006790 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006791 t.Errorf("expected %q, found %#q", expected, actual)
6792 }
6793}
6794
6795func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006796 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006797 apex {
6798 name: "myapex",
6799 key: "myapex.key",
6800 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006801 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006802 }
6803
6804 apex_key {
6805 name: "myapex.key",
6806 public_key: "testkey.avbpubkey",
6807 private_key: "testkey.pem",
6808 }
6809
6810 java_sdk_library {
6811 name: "foo",
6812 srcs: ["a.java"],
6813 api_packages: ["foo"],
6814 apex_available: ["myapex"],
6815 sdk_version: "none",
6816 system_modules: "none",
6817 }
6818
6819 java_library {
6820 name: "bar",
6821 srcs: ["a.java"],
6822 libs: ["foo"],
6823 sdk_version: "none",
6824 system_modules: "none",
6825 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006826
6827 prebuilt_apis {
6828 name: "sdk",
6829 api_dirs: ["100"],
6830 }
Paul Duffin9b879592020-05-26 13:21:35 +01006831 `, withFiles(filesForSdkLibrary))
6832
6833 // java_sdk_library installs both impl jar and permission XML
6834 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6835 "javalib/foo.jar",
6836 "etc/permissions/foo.xml",
6837 })
6838
6839 // The bar library should depend on the stubs jar.
6840 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006841 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006842 t.Errorf("expected %q, found %#q", expected, actual)
6843 }
6844}
6845
Paul Duffineedc5d52020-06-12 17:46:39 +01006846func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006847 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006848 prebuilt_apis {
6849 name: "sdk",
6850 api_dirs: ["100"],
6851 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006852 withFiles(map[string][]byte{
6853 "apex/a.java": nil,
6854 "apex/apex_manifest.json": nil,
6855 "apex/Android.bp": []byte(`
6856 package {
6857 default_visibility: ["//visibility:private"],
6858 }
6859
6860 apex {
6861 name: "myapex",
6862 key: "myapex.key",
6863 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006864 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006865 }
6866
6867 apex_key {
6868 name: "myapex.key",
6869 public_key: "testkey.avbpubkey",
6870 private_key: "testkey.pem",
6871 }
6872
6873 java_library {
6874 name: "bar",
6875 srcs: ["a.java"],
6876 libs: ["foo"],
6877 apex_available: ["myapex"],
6878 sdk_version: "none",
6879 system_modules: "none",
6880 }
6881`),
6882 "source/a.java": nil,
6883 "source/api/current.txt": nil,
6884 "source/api/removed.txt": nil,
6885 "source/Android.bp": []byte(`
6886 package {
6887 default_visibility: ["//visibility:private"],
6888 }
6889
6890 java_sdk_library {
6891 name: "foo",
6892 visibility: ["//apex"],
6893 srcs: ["a.java"],
6894 api_packages: ["foo"],
6895 apex_available: ["myapex"],
6896 sdk_version: "none",
6897 system_modules: "none",
6898 public: {
6899 enabled: true,
6900 },
6901 }
6902`),
6903 "prebuilt/a.jar": nil,
6904 "prebuilt/Android.bp": []byte(`
6905 package {
6906 default_visibility: ["//visibility:private"],
6907 }
6908
6909 java_sdk_library_import {
6910 name: "foo",
6911 visibility: ["//apex", "//source"],
6912 apex_available: ["myapex"],
6913 prefer: true,
6914 public: {
6915 jars: ["a.jar"],
6916 },
6917 }
6918`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006919 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006920 )
6921
6922 // java_sdk_library installs both impl jar and permission XML
6923 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6924 "javalib/bar.jar",
6925 "javalib/foo.jar",
6926 "etc/permissions/foo.xml",
6927 })
6928
6929 // The bar library should depend on the implementation jar.
6930 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006931 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006932 t.Errorf("expected %q, found %#q", expected, actual)
6933 }
6934}
6935
6936func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6937 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6938 apex {
6939 name: "myapex",
6940 key: "myapex.key",
6941 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006942 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006943 }
6944
6945 apex_key {
6946 name: "myapex.key",
6947 public_key: "testkey.avbpubkey",
6948 private_key: "testkey.pem",
6949 }
6950
6951 java_sdk_library_import {
6952 name: "foo",
6953 apex_available: ["myapex"],
6954 prefer: true,
6955 public: {
6956 jars: ["a.jar"],
6957 },
6958 }
6959
6960 `, withFiles(filesForSdkLibrary))
6961}
6962
atrost6e126252020-01-27 17:01:16 +00006963func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006964 result := android.GroupFixturePreparers(
6965 prepareForApexTest,
6966 java.PrepareForTestWithPlatformCompatConfig,
6967 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006968 apex {
6969 name: "myapex",
6970 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006971 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006972 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006973 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006974 }
6975
6976 apex_key {
6977 name: "myapex.key",
6978 public_key: "testkey.avbpubkey",
6979 private_key: "testkey.pem",
6980 }
6981
6982 platform_compat_config {
6983 name: "myjar-platform-compat-config",
6984 src: ":myjar",
6985 }
6986
6987 java_library {
6988 name: "myjar",
6989 srcs: ["foo/bar/MyClass.java"],
6990 sdk_version: "none",
6991 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006992 apex_available: [ "myapex" ],
6993 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006994
6995 // Make sure that a preferred prebuilt does not affect the apex contents.
6996 prebuilt_platform_compat_config {
6997 name: "myjar-platform-compat-config",
6998 metadata: "compat-config/metadata.xml",
6999 prefer: true,
7000 }
atrost6e126252020-01-27 17:01:16 +00007001 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007002 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007003 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7004 "etc/compatconfig/myjar-platform-compat-config.xml",
7005 "javalib/myjar.jar",
7006 })
7007}
7008
Jooyung Han862c0d62022-12-21 10:15:37 +09007009func TestNoDupeApexFiles(t *testing.T) {
7010 android.GroupFixturePreparers(
7011 android.PrepareForTestWithAndroidBuildComponents,
7012 PrepareForTestWithApexBuildComponents,
7013 prepareForTestWithMyapex,
7014 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7015 ).
7016 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7017 RunTestWithBp(t, `
7018 apex {
7019 name: "myapex",
7020 key: "myapex.key",
7021 prebuilts: ["foo", "bar"],
7022 updatable: false,
7023 }
7024
7025 apex_key {
7026 name: "myapex.key",
7027 public_key: "testkey.avbpubkey",
7028 private_key: "testkey.pem",
7029 }
7030
7031 prebuilt_etc {
7032 name: "foo",
7033 src: "myprebuilt",
7034 filename_from_src: true,
7035 }
7036
7037 prebuilt_etc {
7038 name: "bar",
7039 src: "myprebuilt",
7040 filename_from_src: true,
7041 }
7042 `)
7043}
7044
Jiyong Park479321d2019-12-16 11:47:12 +09007045func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7046 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7047 apex {
7048 name: "myapex",
7049 key: "myapex.key",
7050 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007051 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007052 }
7053
7054 apex_key {
7055 name: "myapex.key",
7056 public_key: "testkey.avbpubkey",
7057 private_key: "testkey.pem",
7058 }
7059
7060 java_library {
7061 name: "myjar",
7062 srcs: ["foo/bar/MyClass.java"],
7063 sdk_version: "none",
7064 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007065 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007066 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007067 }
7068 `)
7069}
7070
Jiyong Park7afd1072019-12-30 16:56:33 +09007071func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007072 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007073 apex {
7074 name: "myapex",
7075 key: "myapex.key",
7076 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007077 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007078 }
7079
7080 apex_key {
7081 name: "myapex.key",
7082 public_key: "testkey.avbpubkey",
7083 private_key: "testkey.pem",
7084 }
7085
7086 cc_library {
7087 name: "mylib",
7088 srcs: ["mylib.cpp"],
7089 system_shared_libs: [],
7090 stl: "none",
7091 required: ["a", "b"],
7092 host_required: ["c", "d"],
7093 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007094 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007095 }
7096 `)
7097
7098 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007099 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007100 name := apexBundle.BaseModuleName()
7101 prefix := "TARGET_"
7102 var builder strings.Builder
7103 data.Custom(&builder, name, prefix, "", data)
7104 androidMk := builder.String()
Cole Fausteb8cd312022-11-03 16:39:21 -07007105 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007106 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7107 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007108}
7109
Jiyong Park7cd10e32020-01-14 09:22:18 +09007110func TestSymlinksFromApexToSystem(t *testing.T) {
7111 bp := `
7112 apex {
7113 name: "myapex",
7114 key: "myapex.key",
7115 native_shared_libs: ["mylib"],
7116 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007117 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007118 }
7119
Jiyong Park9d677202020-02-19 16:29:35 +09007120 apex {
7121 name: "myapex.updatable",
7122 key: "myapex.key",
7123 native_shared_libs: ["mylib"],
7124 java_libs: ["myjar"],
7125 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09007126 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09007127 }
7128
Jiyong Park7cd10e32020-01-14 09:22:18 +09007129 apex_key {
7130 name: "myapex.key",
7131 public_key: "testkey.avbpubkey",
7132 private_key: "testkey.pem",
7133 }
7134
7135 cc_library {
7136 name: "mylib",
7137 srcs: ["mylib.cpp"],
7138 shared_libs: ["myotherlib"],
7139 system_shared_libs: [],
7140 stl: "none",
7141 apex_available: [
7142 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007143 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007144 "//apex_available:platform",
7145 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007146 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007147 }
7148
7149 cc_library {
7150 name: "myotherlib",
7151 srcs: ["mylib.cpp"],
7152 system_shared_libs: [],
7153 stl: "none",
7154 apex_available: [
7155 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007156 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007157 "//apex_available:platform",
7158 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007159 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007160 }
7161
7162 java_library {
7163 name: "myjar",
7164 srcs: ["foo/bar/MyClass.java"],
7165 sdk_version: "none",
7166 system_modules: "none",
7167 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007168 apex_available: [
7169 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007170 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007171 "//apex_available:platform",
7172 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007173 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007174 }
7175
7176 java_library {
7177 name: "myotherjar",
7178 srcs: ["foo/bar/MyClass.java"],
7179 sdk_version: "none",
7180 system_modules: "none",
7181 apex_available: [
7182 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007183 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007184 "//apex_available:platform",
7185 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007186 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007187 }
7188 `
7189
7190 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7191 for _, f := range files {
7192 if f.path == file {
7193 if f.isLink {
7194 t.Errorf("%q is not a real file", file)
7195 }
7196 return
7197 }
7198 }
7199 t.Errorf("%q is not found", file)
7200 }
7201
7202 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7203 for _, f := range files {
7204 if f.path == file {
7205 if !f.isLink {
7206 t.Errorf("%q is not a symlink", file)
7207 }
7208 return
7209 }
7210 }
7211 t.Errorf("%q is not found", file)
7212 }
7213
Jiyong Park9d677202020-02-19 16:29:35 +09007214 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7215 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007216 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007217 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007218 ensureRealfileExists(t, files, "javalib/myjar.jar")
7219 ensureRealfileExists(t, files, "lib64/mylib.so")
7220 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7221
Jiyong Park9d677202020-02-19 16:29:35 +09007222 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7223 ensureRealfileExists(t, files, "javalib/myjar.jar")
7224 ensureRealfileExists(t, files, "lib64/mylib.so")
7225 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7226
7227 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007228 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007229 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007230 ensureRealfileExists(t, files, "javalib/myjar.jar")
7231 ensureRealfileExists(t, files, "lib64/mylib.so")
7232 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007233
7234 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7235 ensureRealfileExists(t, files, "javalib/myjar.jar")
7236 ensureRealfileExists(t, files, "lib64/mylib.so")
7237 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007238}
7239
Yo Chiange8128052020-07-23 20:09:18 +08007240func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007241 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007242 apex {
7243 name: "myapex",
7244 key: "myapex.key",
7245 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007246 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007247 }
7248
7249 apex_key {
7250 name: "myapex.key",
7251 public_key: "testkey.avbpubkey",
7252 private_key: "testkey.pem",
7253 }
7254
7255 cc_library_shared {
7256 name: "mylib",
7257 srcs: ["mylib.cpp"],
7258 shared_libs: ["myotherlib"],
7259 system_shared_libs: [],
7260 stl: "none",
7261 apex_available: [
7262 "myapex",
7263 "//apex_available:platform",
7264 ],
7265 }
7266
7267 cc_prebuilt_library_shared {
7268 name: "myotherlib",
7269 srcs: ["prebuilt.so"],
7270 system_shared_libs: [],
7271 stl: "none",
7272 apex_available: [
7273 "myapex",
7274 "//apex_available:platform",
7275 ],
Cole Fausteb8cd312022-11-03 16:39:21 -07007276 stubs: {
7277 versions: ["current"],
7278 },
Yo Chiange8128052020-07-23 20:09:18 +08007279 }
7280 `)
7281
Prerana Patilb1896c82022-11-09 18:14:34 +00007282 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007283 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007284 var builder strings.Builder
7285 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7286 androidMk := builder.String()
7287 // `myotherlib` is added to `myapex` as symlink
Yo Chiange8128052020-07-23 20:09:18 +08007288 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7289 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7290 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Cole Fausteb8cd312022-11-03 16:39:21 -07007291 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := myotherlib\n")
Yo Chiange8128052020-07-23 20:09:18 +08007292}
7293
Jooyung Han643adc42020-02-27 13:50:06 +09007294func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007295 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007296 apex {
7297 name: "myapex",
7298 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007299 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007300 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007301 }
7302
7303 apex_key {
7304 name: "myapex.key",
7305 public_key: "testkey.avbpubkey",
7306 private_key: "testkey.pem",
7307 }
7308
7309 cc_library {
7310 name: "mylib",
7311 srcs: ["mylib.cpp"],
7312 shared_libs: ["mylib2"],
7313 system_shared_libs: [],
7314 stl: "none",
7315 apex_available: [ "myapex" ],
7316 }
7317
7318 cc_library {
7319 name: "mylib2",
7320 srcs: ["mylib.cpp"],
7321 system_shared_libs: [],
7322 stl: "none",
7323 apex_available: [ "myapex" ],
7324 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007325
7326 rust_ffi_shared {
7327 name: "libfoo.rust",
7328 crate_name: "foo",
7329 srcs: ["foo.rs"],
7330 shared_libs: ["libfoo.shared_from_rust"],
7331 prefer_rlib: true,
7332 apex_available: ["myapex"],
7333 }
7334
7335 cc_library_shared {
7336 name: "libfoo.shared_from_rust",
7337 srcs: ["mylib.cpp"],
7338 system_shared_libs: [],
7339 stl: "none",
7340 stubs: {
7341 versions: ["10", "11", "12"],
7342 },
7343 }
7344
Jooyung Han643adc42020-02-27 13:50:06 +09007345 `)
7346
7347 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7348 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007349 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007350 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7351 "lib64/mylib.so",
7352 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007353 "lib64/libfoo.rust.so",
7354 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7355 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007356 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007357
7358 // b/220397949
7359 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007360}
7361
Jooyung Han49f67012020-04-17 13:43:10 +09007362func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007363 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007364 apex {
7365 name: "myapex",
7366 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007367 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007368 }
7369 apex_key {
7370 name: "myapex.key",
7371 public_key: "testkey.avbpubkey",
7372 private_key: "testkey.pem",
7373 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007374 `,
7375 android.FixtureModifyConfig(func(config android.Config) {
7376 delete(config.Targets, android.Android)
7377 config.AndroidCommonTarget = android.Target{}
7378 }),
7379 )
Jooyung Han49f67012020-04-17 13:43:10 +09007380
7381 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7382 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7383 }
7384}
7385
Jiyong Parkbd159612020-02-28 15:22:21 +09007386func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007387 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007388 apex {
7389 name: "myapex",
7390 key: "myapex.key",
7391 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007392 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007393 }
7394
7395 apex_key {
7396 name: "myapex.key",
7397 public_key: "testkey.avbpubkey",
7398 private_key: "testkey.pem",
7399 }
7400
7401 android_app {
7402 name: "AppFoo",
7403 srcs: ["foo/bar/MyClass.java"],
7404 sdk_version: "none",
7405 system_modules: "none",
7406 apex_available: [ "myapex" ],
7407 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007408 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007409
Colin Crosscf371cc2020-11-13 11:48:42 -08007410 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007411 content := bundleConfigRule.Args["content"]
7412
7413 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007414 ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo@TEST.BUILD_ID/AppFoo.apk"}]}`)
Jiyong Parkbd159612020-02-28 15:22:21 +09007415}
7416
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007417func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007418 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007419 apex {
7420 name: "myapex",
7421 key: "myapex.key",
7422 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007423 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007424 }
7425
7426 apex_key {
7427 name: "myapex.key",
7428 public_key: "testkey.avbpubkey",
7429 private_key: "testkey.pem",
7430 }
7431
7432 android_app_set {
7433 name: "AppSet",
7434 set: "AppSet.apks",
7435 }`)
7436 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007437 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007438 content := bundleConfigRule.Args["content"]
7439 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7440 s := mod.Rule("apexRule").Args["copy_commands"]
7441 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007442 if len(copyCmds) != 4 {
7443 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007444 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007445 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7446 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007447 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7448 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007449
7450 // Ensure that canned_fs_config has an entry for the app set zip file
7451 generateFsRule := mod.Rule("generateFsConfig")
7452 cmd := generateFsRule.RuleParams.Command
7453 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007454}
7455
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007456func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007457 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007458 apex_set {
7459 name: "myapex",
7460 filename: "foo_v2.apex",
7461 sanitized: {
7462 none: { set: "myapex.apks", },
7463 hwaddress: { set: "myapex.hwasan.apks", },
7464 },
Paul Duffin24704672021-04-06 16:09:30 +01007465 }
7466 `
7467 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007468
Paul Duffin24704672021-04-06 16:09:30 +01007469 // Check that the extractor produces the correct output file from the correct input file.
7470 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007471
Paul Duffin24704672021-04-06 16:09:30 +01007472 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7473 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007474
Paul Duffin24704672021-04-06 16:09:30 +01007475 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7476
7477 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007478 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7479 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007480
7481 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007482}
7483
Pranav Guptaeba03b02022-09-27 00:27:08 +00007484func TestApexSetApksModuleAssignment(t *testing.T) {
7485 ctx := testApex(t, `
7486 apex_set {
7487 name: "myapex",
7488 set: ":myapex_apks_file",
7489 }
7490
7491 filegroup {
7492 name: "myapex_apks_file",
7493 srcs: ["myapex.apks"],
7494 }
7495 `)
7496
7497 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7498
7499 // Check that the extractor produces the correct apks file from the input module
7500 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7501 extractedApex := m.Output(extractorOutput)
7502
7503 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7504}
7505
Paul Duffin89f570a2021-06-16 01:42:33 +01007506func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007507 t.Helper()
7508
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007509 bp := `
7510 java_library {
7511 name: "some-updatable-apex-lib",
7512 srcs: ["a.java"],
7513 sdk_version: "current",
7514 apex_available: [
7515 "some-updatable-apex",
7516 ],
satayevabcd5972021-08-06 17:49:46 +01007517 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007518 }
7519
7520 java_library {
7521 name: "some-non-updatable-apex-lib",
7522 srcs: ["a.java"],
7523 apex_available: [
7524 "some-non-updatable-apex",
7525 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007526 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007527 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007528 }
7529
7530 bootclasspath_fragment {
7531 name: "some-non-updatable-fragment",
7532 contents: ["some-non-updatable-apex-lib"],
7533 apex_available: [
7534 "some-non-updatable-apex",
7535 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007536 hidden_api: {
7537 split_packages: ["*"],
7538 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007539 }
7540
7541 java_library {
7542 name: "some-platform-lib",
7543 srcs: ["a.java"],
7544 sdk_version: "current",
7545 installable: true,
7546 }
7547
7548 java_library {
7549 name: "some-art-lib",
7550 srcs: ["a.java"],
7551 sdk_version: "current",
7552 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007553 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007554 ],
7555 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007556 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007557 }
7558
7559 apex {
7560 name: "some-updatable-apex",
7561 key: "some-updatable-apex.key",
7562 java_libs: ["some-updatable-apex-lib"],
7563 updatable: true,
7564 min_sdk_version: "current",
7565 }
7566
7567 apex {
7568 name: "some-non-updatable-apex",
7569 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007570 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007571 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007572 }
7573
7574 apex_key {
7575 name: "some-updatable-apex.key",
7576 }
7577
7578 apex_key {
7579 name: "some-non-updatable-apex.key",
7580 }
7581
7582 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007583 name: "com.android.art.debug",
7584 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007585 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007586 updatable: true,
7587 min_sdk_version: "current",
7588 }
7589
Paul Duffinf23bc472021-04-27 12:42:20 +01007590 bootclasspath_fragment {
7591 name: "art-bootclasspath-fragment",
7592 image_name: "art",
7593 contents: ["some-art-lib"],
7594 apex_available: [
7595 "com.android.art.debug",
7596 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007597 hidden_api: {
7598 split_packages: ["*"],
7599 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007600 }
7601
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007602 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007603 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007604 }
7605
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007606 filegroup {
7607 name: "some-updatable-apex-file_contexts",
7608 srcs: [
7609 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7610 ],
7611 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007612
7613 filegroup {
7614 name: "some-non-updatable-apex-file_contexts",
7615 srcs: [
7616 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7617 ],
7618 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007619 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007620
Paul Duffin89f570a2021-06-16 01:42:33 +01007621 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007622}
7623
Paul Duffin89f570a2021-06-16 01:42:33 +01007624func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007625 t.Helper()
7626
Paul Duffin55607122021-03-30 23:32:51 +01007627 fs := android.MockFS{
7628 "a.java": nil,
7629 "a.jar": nil,
7630 "apex_manifest.json": nil,
7631 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007632 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007633 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7634 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7635 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007636 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007637 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007638
Paul Duffin55607122021-03-30 23:32:51 +01007639 errorHandler := android.FixtureExpectsNoErrors
7640 if errmsg != "" {
7641 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007642 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007643
Paul Duffin55607122021-03-30 23:32:51 +01007644 result := android.GroupFixturePreparers(
7645 cc.PrepareForTestWithCcDefaultModules,
7646 java.PrepareForTestWithHiddenApiBuildComponents,
7647 java.PrepareForTestWithJavaDefaultModules,
7648 java.PrepareForTestWithJavaSdkLibraryFiles,
7649 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007650 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007651 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007652 android.FixtureModifyMockFS(func(fs android.MockFS) {
7653 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7654 insert := ""
7655 for _, fragment := range fragments {
7656 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7657 }
7658 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7659 platform_bootclasspath {
7660 name: "platform-bootclasspath",
7661 fragments: [
7662 %s
7663 ],
7664 }
7665 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007666 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007667 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007668 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007669 ).
7670 ExtendWithErrorHandler(errorHandler).
7671 RunTestWithBp(t, bp)
7672
7673 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007674}
7675
Paul Duffin5556c5f2022-06-09 17:32:21 +00007676func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007677 preparers := android.GroupFixturePreparers(
7678 java.PrepareForTestWithJavaDefaultModules,
7679 PrepareForTestWithApexBuildComponents,
7680 ).
7681 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7682 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7683
7684 bpBase := `
7685 apex_set {
7686 name: "com.android.myapex",
7687 installable: true,
7688 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7689 set: "myapex.apks",
7690 }
7691
7692 apex_set {
7693 name: "com.mycompany.android.myapex",
7694 apex_name: "com.android.myapex",
7695 installable: true,
7696 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7697 set: "company-myapex.apks",
7698 }
7699
7700 prebuilt_bootclasspath_fragment {
7701 name: "my-bootclasspath-fragment",
7702 apex_available: ["com.android.myapex"],
7703 %s
7704 }
7705 `
7706
7707 t.Run("java_import", func(t *testing.T) {
7708 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7709 java_import {
7710 name: "libfoo",
7711 jars: ["libfoo.jar"],
7712 apex_available: ["com.android.myapex"],
7713 }
7714 `)
7715 })
7716
7717 t.Run("java_sdk_library_import", func(t *testing.T) {
7718 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7719 java_sdk_library_import {
7720 name: "libfoo",
7721 public: {
7722 jars: ["libbar.jar"],
7723 },
7724 apex_available: ["com.android.myapex"],
7725 }
7726 `)
7727 })
7728
7729 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7730 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7731 image_name: "art",
7732 contents: ["libfoo"],
7733 `)+`
7734 java_sdk_library_import {
7735 name: "libfoo",
7736 public: {
7737 jars: ["libbar.jar"],
7738 },
7739 apex_available: ["com.android.myapex"],
7740 }
7741 `)
7742 })
7743}
7744
Paul Duffin5556c5f2022-06-09 17:32:21 +00007745func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7746 preparers := android.GroupFixturePreparers(
7747 java.PrepareForTestWithJavaDefaultModules,
7748 PrepareForTestWithApexBuildComponents,
7749 )
7750
7751 bpBase := `
7752 apex_set {
7753 name: "com.android.myapex",
7754 installable: true,
7755 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7756 set: "myapex.apks",
7757 }
7758
7759 apex_set {
7760 name: "com.android.myapex_compressed",
7761 apex_name: "com.android.myapex",
7762 installable: true,
7763 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7764 set: "myapex_compressed.apks",
7765 }
7766
7767 prebuilt_bootclasspath_fragment {
7768 name: "my-bootclasspath-fragment",
7769 apex_available: [
7770 "com.android.myapex",
7771 "com.android.myapex_compressed",
7772 ],
7773 hidden_api: {
7774 annotation_flags: "annotation-flags.csv",
7775 metadata: "metadata.csv",
7776 index: "index.csv",
7777 signature_patterns: "signature_patterns.csv",
7778 },
7779 %s
7780 }
7781 `
7782
7783 t.Run("java_import", func(t *testing.T) {
7784 result := preparers.RunTestWithBp(t,
7785 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7786 java_import {
7787 name: "libfoo",
7788 jars: ["libfoo.jar"],
7789 apex_available: [
7790 "com.android.myapex",
7791 "com.android.myapex_compressed",
7792 ],
7793 }
7794 `)
7795
7796 module := result.Module("libfoo", "android_common_com.android.myapex")
7797 usesLibraryDep := module.(java.UsesLibraryDependency)
7798 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7799 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7800 usesLibraryDep.DexJarBuildPath().Path())
7801 })
7802
7803 t.Run("java_sdk_library_import", func(t *testing.T) {
7804 result := preparers.RunTestWithBp(t,
7805 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7806 java_sdk_library_import {
7807 name: "libfoo",
7808 public: {
7809 jars: ["libbar.jar"],
7810 },
7811 apex_available: [
7812 "com.android.myapex",
7813 "com.android.myapex_compressed",
7814 ],
7815 compile_dex: true,
7816 }
7817 `)
7818
7819 module := result.Module("libfoo", "android_common_com.android.myapex")
7820 usesLibraryDep := module.(java.UsesLibraryDependency)
7821 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7822 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7823 usesLibraryDep.DexJarBuildPath().Path())
7824 })
7825
7826 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7827 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7828 image_name: "art",
7829 contents: ["libfoo"],
7830 `)+`
7831 java_sdk_library_import {
7832 name: "libfoo",
7833 public: {
7834 jars: ["libbar.jar"],
7835 },
7836 apex_available: [
7837 "com.android.myapex",
7838 "com.android.myapex_compressed",
7839 ],
7840 compile_dex: true,
7841 }
7842 `)
7843 })
7844}
7845
Jooyung Han548640b2020-04-27 12:10:30 +09007846func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7847 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7848 apex {
7849 name: "myapex",
7850 key: "myapex.key",
7851 updatable: true,
7852 }
7853
7854 apex_key {
7855 name: "myapex.key",
7856 public_key: "testkey.avbpubkey",
7857 private_key: "testkey.pem",
7858 }
7859 `)
7860}
7861
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007862func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7863 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7864 apex {
7865 name: "myapex",
7866 key: "myapex.key",
7867 }
7868
7869 apex_key {
7870 name: "myapex.key",
7871 public_key: "testkey.avbpubkey",
7872 private_key: "testkey.pem",
7873 }
7874 `)
7875}
7876
Daniel Norman69109112021-12-02 12:52:42 -08007877func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7878 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7879 apex {
7880 name: "myapex",
7881 key: "myapex.key",
7882 updatable: true,
7883 soc_specific: true,
7884 }
7885
7886 apex_key {
7887 name: "myapex.key",
7888 public_key: "testkey.avbpubkey",
7889 private_key: "testkey.pem",
7890 }
7891 `)
7892}
7893
satayevb98371c2021-06-15 16:49:50 +01007894func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7895 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7896 apex {
7897 name: "myapex",
7898 key: "myapex.key",
7899 systemserverclasspath_fragments: [
7900 "mysystemserverclasspathfragment",
7901 ],
7902 min_sdk_version: "29",
7903 updatable: true,
7904 }
7905
7906 apex_key {
7907 name: "myapex.key",
7908 public_key: "testkey.avbpubkey",
7909 private_key: "testkey.pem",
7910 }
7911
7912 java_library {
7913 name: "foo",
7914 srcs: ["b.java"],
7915 min_sdk_version: "29",
7916 installable: true,
7917 apex_available: [
7918 "myapex",
7919 ],
7920 }
7921
7922 systemserverclasspath_fragment {
7923 name: "mysystemserverclasspathfragment",
7924 generate_classpaths_proto: false,
7925 contents: [
7926 "foo",
7927 ],
7928 apex_available: [
7929 "myapex",
7930 ],
7931 }
satayevabcd5972021-08-06 17:49:46 +01007932 `,
7933 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7934 )
satayevb98371c2021-06-15 16:49:50 +01007935}
7936
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007937func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007938 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7939 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7940 // modules to be included in the BootJars.
7941 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7942 return android.GroupFixturePreparers(
7943 dexpreopt.FixtureSetBootJars(bootJars...),
7944 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7945 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7946 }),
7947 )
7948 }
7949
7950 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7951 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7952 // specified in the ArtApexJars configuration.
7953 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7954 return android.GroupFixturePreparers(
7955 dexpreopt.FixtureSetArtBootJars(bootJars...),
7956 dexpreopt.FixtureSetBootJars(bootJars...),
7957 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7958 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7959 }),
7960 )
7961 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007962
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007963 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007964 preparer := android.GroupFixturePreparers(
7965 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7966 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7967 )
7968 fragments := []java.ApexVariantReference{
7969 {
7970 Apex: proptools.StringPtr("com.android.art.debug"),
7971 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7972 },
7973 {
7974 Apex: proptools.StringPtr("some-non-updatable-apex"),
7975 Module: proptools.StringPtr("some-non-updatable-fragment"),
7976 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007977 }
satayevabcd5972021-08-06 17:49:46 +01007978 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007979 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007980
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007981 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007982 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7983 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007984 preparer := android.GroupFixturePreparers(
7985 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7986 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7987 )
Paul Duffin60264a02021-04-12 20:02:36 +01007988 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007989 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007990
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007991 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007992 err := `ArtApexJars expects this to be in apex "some-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01007993 // Update the dexpreopt ArtApexJars directly.
7994 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7995 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007996 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007997
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007998 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007999 err := `ArtApexJars expects this to be in apex "some-non-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01008000 // Update the dexpreopt ArtApexJars directly.
8001 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8002 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008003 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008004
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008005 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008006 err := `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the framework boot image`
satayevabcd5972021-08-06 17:49:46 +01008007 preparer := android.GroupFixturePreparers(
8008 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8009 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8010 )
Paul Duffin60264a02021-04-12 20:02:36 +01008011 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008012 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008013
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008014 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008015 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008016 fragment := java.ApexVariantReference{
8017 Apex: proptools.StringPtr("some-non-updatable-apex"),
8018 Module: proptools.StringPtr("some-non-updatable-fragment"),
8019 }
8020 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008021 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008022
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008023 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008024 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008025 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8026 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008027 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008028
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008029 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008030 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008031 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8032 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008033 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008034
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008035 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008036 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008037 // Update the dexpreopt ArtApexJars directly.
8038 preparer := prepareSetArtJars("platform:some-platform-lib")
8039 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008040 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008041
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008042 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008043 preparer := android.GroupFixturePreparers(
8044 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8045 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8046 )
8047 fragments := []java.ApexVariantReference{
8048 {
8049 Apex: proptools.StringPtr("some-non-updatable-apex"),
8050 Module: proptools.StringPtr("some-non-updatable-fragment"),
8051 },
8052 }
8053 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008054 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008055}
8056
8057func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008058 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008059 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008060 fragment := java.ApexVariantReference{
8061 Apex: proptools.StringPtr("myapex"),
8062 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8063 }
8064
Paul Duffin064b70c2020-11-02 17:32:38 +00008065 testDexpreoptWithApexes(t, `
8066 prebuilt_apex {
8067 name: "myapex" ,
8068 arch: {
8069 arm64: {
8070 src: "myapex-arm64.apex",
8071 },
8072 arm: {
8073 src: "myapex-arm.apex",
8074 },
8075 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008076 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8077 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008078
Paul Duffin89f570a2021-06-16 01:42:33 +01008079 prebuilt_bootclasspath_fragment {
8080 name: "my-bootclasspath-fragment",
8081 contents: ["libfoo"],
8082 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008083 hidden_api: {
8084 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8085 metadata: "my-bootclasspath-fragment/metadata.csv",
8086 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008087 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8088 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8089 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008090 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008091 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008092
Paul Duffin89f570a2021-06-16 01:42:33 +01008093 java_import {
8094 name: "libfoo",
8095 jars: ["libfoo.jar"],
8096 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008097 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008098 }
8099 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008100 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008101}
8102
Spandan Dasf14e2542021-11-12 00:01:37 +00008103func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008104 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008105 bp += `
8106 apex_key {
8107 name: "myapex.key",
8108 public_key: "testkey.avbpubkey",
8109 private_key: "testkey.pem",
8110 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008111 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008112 "lib1/src/A.java": nil,
8113 "lib2/src/B.java": nil,
8114 "system/sepolicy/apex/myapex-file_contexts": nil,
8115 }
8116
Paul Duffin45338f02021-03-30 23:07:52 +01008117 errorHandler := android.FixtureExpectsNoErrors
8118 if errmsg != "" {
8119 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008120 }
Colin Crossae8600b2020-10-29 17:09:13 -07008121
Paul Duffin45338f02021-03-30 23:07:52 +01008122 android.GroupFixturePreparers(
8123 android.PrepareForTestWithAndroidBuildComponents,
8124 java.PrepareForTestWithJavaBuildComponents,
8125 PrepareForTestWithApexBuildComponents,
8126 android.PrepareForTestWithNeverallowRules(rules),
8127 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008128 apexBootJars := make([]string, 0, len(bootJars))
8129 for _, apexBootJar := range bootJars {
8130 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008131 }
satayevd604b212021-07-21 14:23:52 +01008132 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008133 }),
8134 fs.AddToFixture(),
8135 ).
8136 ExtendWithErrorHandler(errorHandler).
8137 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008138}
8139
8140func TestApexPermittedPackagesRules(t *testing.T) {
8141 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008142 name string
8143 expectedError string
8144 bp string
8145 bootJars []string
8146 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008147 }{
8148
8149 {
8150 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8151 expectedError: "",
8152 bp: `
8153 java_library {
8154 name: "bcp_lib1",
8155 srcs: ["lib1/src/*.java"],
8156 permitted_packages: ["foo.bar"],
8157 apex_available: ["myapex"],
8158 sdk_version: "none",
8159 system_modules: "none",
8160 }
8161 java_library {
8162 name: "nonbcp_lib2",
8163 srcs: ["lib2/src/*.java"],
8164 apex_available: ["myapex"],
8165 permitted_packages: ["a.b"],
8166 sdk_version: "none",
8167 system_modules: "none",
8168 }
8169 apex {
8170 name: "myapex",
8171 key: "myapex.key",
8172 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008173 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008174 }`,
8175 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008176 bcpPermittedPackages: map[string][]string{
8177 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008178 "foo.bar",
8179 },
8180 },
8181 },
8182 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008183 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008184 expectedError: `(?s)module "bcp_lib2" .* which is restricted because bcp_lib2 bootjar may only use these package prefixes: foo.bar. Please consider the following alternatives:\n 1. If the offending code is from a statically linked library, consider removing that dependency and using an alternative already in the bootclasspath, or perhaps a shared library. 2. Move the offending code into an allowed package.\n 3. Jarjar the offending code. Please be mindful of the potential system health implications of bundling that code, particularly if the offending jar is part of the bootclasspath.`,
Andrei Onea115e7e72020-06-05 21:14:03 +01008185 bp: `
8186 java_library {
8187 name: "bcp_lib1",
8188 srcs: ["lib1/src/*.java"],
8189 apex_available: ["myapex"],
8190 permitted_packages: ["foo.bar"],
8191 sdk_version: "none",
8192 system_modules: "none",
8193 }
8194 java_library {
8195 name: "bcp_lib2",
8196 srcs: ["lib2/src/*.java"],
8197 apex_available: ["myapex"],
8198 permitted_packages: ["foo.bar", "bar.baz"],
8199 sdk_version: "none",
8200 system_modules: "none",
8201 }
8202 apex {
8203 name: "myapex",
8204 key: "myapex.key",
8205 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008206 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008207 }
8208 `,
8209 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008210 bcpPermittedPackages: map[string][]string{
8211 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008212 "foo.bar",
8213 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008214 "bcp_lib2": []string{
8215 "foo.bar",
8216 },
8217 },
8218 },
8219 {
8220 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8221 expectedError: "",
8222 bp: `
8223 java_library {
8224 name: "bcp_lib_restricted",
8225 srcs: ["lib1/src/*.java"],
8226 apex_available: ["myapex"],
8227 permitted_packages: ["foo.bar"],
8228 sdk_version: "none",
8229 min_sdk_version: "29",
8230 system_modules: "none",
8231 }
8232 java_library {
8233 name: "bcp_lib_unrestricted",
8234 srcs: ["lib2/src/*.java"],
8235 apex_available: ["myapex"],
8236 permitted_packages: ["foo.bar", "bar.baz"],
8237 sdk_version: "none",
8238 min_sdk_version: "29",
8239 system_modules: "none",
8240 }
8241 apex {
8242 name: "myapex",
8243 key: "myapex.key",
8244 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8245 updatable: true,
8246 min_sdk_version: "29",
8247 }
8248 `,
8249 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8250 bcpPermittedPackages: map[string][]string{
8251 "bcp_lib1_non_updateable": []string{
8252 "foo.bar",
8253 },
8254 // bcp_lib2_updateable has no entry here since updateable bcp can contain new packages - tracking via an allowlist is not necessary
Andrei Onea115e7e72020-06-05 21:14:03 +01008255 },
8256 },
8257 }
8258 for _, tc := range testcases {
8259 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008260 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8261 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008262 })
8263 }
8264}
8265
Jiyong Park62304bb2020-04-13 16:19:48 +09008266func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008267 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008268 apex {
8269 name: "myapex",
8270 key: "myapex.key",
8271 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008272 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008273 }
8274
8275 apex_key {
8276 name: "myapex.key",
8277 public_key: "testkey.avbpubkey",
8278 private_key: "testkey.pem",
8279 }
8280
8281 cc_library {
8282 name: "mylib",
8283 srcs: ["mylib.cpp"],
8284 system_shared_libs: [],
8285 stl: "none",
8286 stubs: {
8287 versions: ["1"],
8288 },
8289 apex_available: ["myapex"],
8290 }
8291
8292 cc_library {
8293 name: "myprivlib",
8294 srcs: ["mylib.cpp"],
8295 system_shared_libs: [],
8296 stl: "none",
8297 apex_available: ["myapex"],
8298 }
8299
8300
8301 cc_test {
8302 name: "mytest",
8303 gtest: false,
8304 srcs: ["mylib.cpp"],
8305 system_shared_libs: [],
8306 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008307 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008308 test_for: ["myapex"]
8309 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008310
8311 cc_library {
8312 name: "mytestlib",
8313 srcs: ["mylib.cpp"],
8314 system_shared_libs: [],
8315 shared_libs: ["mylib", "myprivlib"],
8316 stl: "none",
8317 test_for: ["myapex"],
8318 }
8319
8320 cc_benchmark {
8321 name: "mybench",
8322 srcs: ["mylib.cpp"],
8323 system_shared_libs: [],
8324 shared_libs: ["mylib", "myprivlib"],
8325 stl: "none",
8326 test_for: ["myapex"],
8327 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008328 `)
8329
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008330 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008331 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008332 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8333 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8334 }
8335
8336 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008337 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008338 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8339 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8340 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8341}
Jiyong Park46a512f2020-12-04 18:02:13 +09008342
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008343func TestIndirectTestFor(t *testing.T) {
8344 ctx := testApex(t, `
8345 apex {
8346 name: "myapex",
8347 key: "myapex.key",
8348 native_shared_libs: ["mylib", "myprivlib"],
8349 updatable: false,
8350 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008351
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008352 apex_key {
8353 name: "myapex.key",
8354 public_key: "testkey.avbpubkey",
8355 private_key: "testkey.pem",
8356 }
8357
8358 cc_library {
8359 name: "mylib",
8360 srcs: ["mylib.cpp"],
8361 system_shared_libs: [],
8362 stl: "none",
8363 stubs: {
8364 versions: ["1"],
8365 },
8366 apex_available: ["myapex"],
8367 }
8368
8369 cc_library {
8370 name: "myprivlib",
8371 srcs: ["mylib.cpp"],
8372 system_shared_libs: [],
8373 stl: "none",
8374 shared_libs: ["mylib"],
8375 apex_available: ["myapex"],
8376 }
8377
8378 cc_library {
8379 name: "mytestlib",
8380 srcs: ["mylib.cpp"],
8381 system_shared_libs: [],
8382 shared_libs: ["myprivlib"],
8383 stl: "none",
8384 test_for: ["myapex"],
8385 }
8386 `)
8387
8388 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008389 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008390 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8391 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8392 }
8393
8394 // The platform variant of mytestlib links to the platform variant of the
8395 // internal myprivlib.
8396 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8397
8398 // The platform variant of myprivlib links to the platform variant of mylib
8399 // and bypasses its stubs.
8400 ensureLinkedLibIs("myprivlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09008401}
8402
Martin Stjernholmec009002021-03-27 15:18:31 +00008403func TestTestForForLibInOtherApex(t *testing.T) {
8404 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8405 _ = testApex(t, `
8406 apex {
8407 name: "com.android.art",
8408 key: "myapex.key",
8409 native_shared_libs: ["mylib"],
8410 updatable: false,
8411 }
8412
8413 apex {
8414 name: "com.android.art.debug",
8415 key: "myapex.key",
8416 native_shared_libs: ["mylib", "mytestlib"],
8417 updatable: false,
8418 }
8419
8420 apex_key {
8421 name: "myapex.key",
8422 public_key: "testkey.avbpubkey",
8423 private_key: "testkey.pem",
8424 }
8425
8426 cc_library {
8427 name: "mylib",
8428 srcs: ["mylib.cpp"],
8429 system_shared_libs: [],
8430 stl: "none",
8431 stubs: {
8432 versions: ["1"],
8433 },
8434 apex_available: ["com.android.art", "com.android.art.debug"],
8435 }
8436
8437 cc_library {
8438 name: "mytestlib",
8439 srcs: ["mylib.cpp"],
8440 system_shared_libs: [],
8441 shared_libs: ["mylib"],
8442 stl: "none",
8443 apex_available: ["com.android.art.debug"],
8444 test_for: ["com.android.art"],
8445 }
8446 `,
8447 android.MockFS{
8448 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8449 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8450 }.AddToFixture())
8451}
8452
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008453// TODO(jungjw): Move this to proptools
8454func intPtr(i int) *int {
8455 return &i
8456}
8457
8458func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008459 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008460 apex_set {
8461 name: "myapex",
8462 set: "myapex.apks",
8463 filename: "foo_v2.apex",
8464 overrides: ["foo"],
8465 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008466 `,
8467 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8468 variables.Platform_sdk_version = intPtr(30)
8469 }),
8470 android.FixtureModifyConfig(func(config android.Config) {
8471 config.Targets[android.Android] = []android.Target{
8472 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8473 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8474 }
8475 }),
8476 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008477
Paul Duffin24704672021-04-06 16:09:30 +01008478 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008479
8480 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008481 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008482 actual := extractedApex.Args["abis"]
8483 expected := "ARMEABI_V7A,ARM64_V8A"
8484 if actual != expected {
8485 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8486 }
8487 actual = extractedApex.Args["sdk-version"]
8488 expected = "30"
8489 if actual != expected {
8490 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8491 }
8492
Paul Duffin6717d882021-06-15 19:09:41 +01008493 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008494 a := m.Module().(*ApexSet)
8495 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008496 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008497 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8498 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8499 }
8500}
8501
Anton Hansson805e0a52022-11-25 14:06:46 +00008502func TestApexSet_NativeBridge(t *testing.T) {
8503 ctx := testApex(t, `
8504 apex_set {
8505 name: "myapex",
8506 set: "myapex.apks",
8507 filename: "foo_v2.apex",
8508 overrides: ["foo"],
8509 }
8510 `,
8511 android.FixtureModifyConfig(func(config android.Config) {
8512 config.Targets[android.Android] = []android.Target{
8513 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8514 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8515 }
8516 }),
8517 )
8518
8519 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8520
8521 // Check extract_apks tool parameters. No native bridge arch expected
8522 extractedApex := m.Output("extracted/myapex.apks")
8523 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8524}
8525
Jiyong Park7d95a512020-05-10 15:16:24 +09008526func TestNoStaticLinkingToStubsLib(t *testing.T) {
8527 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8528 apex {
8529 name: "myapex",
8530 key: "myapex.key",
8531 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008532 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008533 }
8534
8535 apex_key {
8536 name: "myapex.key",
8537 public_key: "testkey.avbpubkey",
8538 private_key: "testkey.pem",
8539 }
8540
8541 cc_library {
8542 name: "mylib",
8543 srcs: ["mylib.cpp"],
8544 static_libs: ["otherlib"],
8545 system_shared_libs: [],
8546 stl: "none",
8547 apex_available: [ "myapex" ],
8548 }
8549
8550 cc_library {
8551 name: "otherlib",
8552 srcs: ["mylib.cpp"],
8553 system_shared_libs: [],
8554 stl: "none",
8555 stubs: {
8556 versions: ["1", "2", "3"],
8557 },
8558 apex_available: [ "myapex" ],
8559 }
8560 `)
8561}
8562
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008563func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008564 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008565 apex {
8566 name: "myapex",
8567 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008568 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008569 custom_sign_tool: "sign_myapex",
8570 }
8571
8572 apex_key {
8573 name: "myapex.key",
8574 public_key: "testkey.avbpubkey",
8575 private_key: "testkey.pem",
8576 }
8577 `)
8578
8579 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8580 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8581 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system_ext" sign_tool="sign_myapex"`)
8582}
8583
8584func TestApexKeysTxtOverrides(t *testing.T) {
8585 ctx := testApex(t, `
8586 apex {
8587 name: "myapex",
8588 key: "myapex.key",
8589 updatable: false,
8590 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008591 }
8592
8593 apex_key {
8594 name: "myapex.key",
8595 public_key: "testkey.avbpubkey",
8596 private_key: "testkey.pem",
8597 }
8598
8599 prebuilt_apex {
8600 name: "myapex",
8601 prefer: true,
8602 arch: {
8603 arm64: {
8604 src: "myapex-arm64.apex",
8605 },
8606 arm: {
8607 src: "myapex-arm.apex",
8608 },
8609 },
8610 }
8611
8612 apex_set {
8613 name: "myapex_set",
8614 set: "myapex.apks",
8615 filename: "myapex_set.apex",
8616 overrides: ["myapex"],
8617 }
8618 `)
8619
8620 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8621 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8622 ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
Jiyong Park03a7f3e2020-06-18 19:34:42 +09008623 ensureContains(t, content, `name="myapex.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008624}
8625
Jooyung Han938b5932020-06-20 12:47:47 +09008626func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008627 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008628 apex {
8629 name: "myapex",
8630 key: "myapex.key",
8631 apps: ["app"],
8632 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008633 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008634 }
8635
8636 apex_key {
8637 name: "myapex.key",
8638 public_key: "testkey.avbpubkey",
8639 private_key: "testkey.pem",
8640 }
8641
8642 android_app {
8643 name: "app",
8644 srcs: ["foo/bar/MyClass.java"],
8645 package_name: "foo",
8646 sdk_version: "none",
8647 system_modules: "none",
8648 apex_available: [ "myapex" ],
8649 }
8650 `, withFiles(map[string][]byte{
8651 "sub/Android.bp": []byte(`
8652 override_apex {
8653 name: "override_myapex",
8654 base: "myapex",
8655 apps: ["override_app"],
8656 allowed_files: ":allowed",
8657 }
8658 // Overridable "path" property should be referenced indirectly
8659 filegroup {
8660 name: "allowed",
8661 srcs: ["allowed.txt"],
8662 }
8663 override_android_app {
8664 name: "override_app",
8665 base: "app",
8666 package_name: "bar",
8667 }
8668 `),
8669 }))
8670
8671 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8672 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8673 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8674 }
8675
8676 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8677 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8678 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8679 }
8680}
8681
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008682func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008683 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008684 apex {
8685 name: "myapex",
8686 key: "myapex.key",
8687 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008688 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008689 }
8690
8691 apex_key {
8692 name: "myapex.key",
8693 public_key: "testkey.avbpubkey",
8694 private_key: "testkey.pem",
8695 }
8696
8697 cc_library {
8698 name: "mylib",
8699 srcs: ["mylib.cpp"],
8700 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008701 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008702 },
8703 apex_available: ["myapex"],
8704 }
8705
8706 cc_prebuilt_library_shared {
8707 name: "mylib",
8708 prefer: false,
8709 srcs: ["prebuilt.so"],
8710 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008711 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008712 },
8713 apex_available: ["myapex"],
8714 }
8715 `)
8716}
8717
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008718func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008719 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008720 apex {
8721 name: "myapex",
8722 key: "myapex.key",
8723 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008724 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008725 }
8726 apex_key {
8727 name: "myapex.key",
8728 public_key: "testkey.avbpubkey",
8729 private_key: "testkey.pem",
8730 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008731 `,
8732 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8733 variables.CompressedApex = proptools.BoolPtr(true)
8734 }),
8735 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008736
8737 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8738 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8739
8740 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8741 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8742
8743 // Make sure output of bundle is .capex
8744 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8745 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8746
8747 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008748 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008749 var builder strings.Builder
8750 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8751 androidMk := builder.String()
8752 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8753}
8754
Martin Stjernholm2856c662020-12-02 15:03:42 +00008755func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008756 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008757 apex {
8758 name: "myapex",
8759 key: "myapex.key",
8760 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008761 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008762 }
8763
8764 apex_key {
8765 name: "myapex.key",
8766 public_key: "testkey.avbpubkey",
8767 private_key: "testkey.pem",
8768 }
8769
8770 cc_library {
8771 name: "mylib",
8772 srcs: ["mylib.cpp"],
8773 apex_available: ["myapex"],
8774 shared_libs: ["otherlib"],
8775 system_shared_libs: [],
8776 }
8777
8778 cc_library {
8779 name: "otherlib",
8780 srcs: ["mylib.cpp"],
8781 stubs: {
8782 versions: ["current"],
8783 },
8784 }
8785
8786 cc_prebuilt_library_shared {
8787 name: "otherlib",
8788 prefer: true,
8789 srcs: ["prebuilt.so"],
8790 stubs: {
8791 versions: ["current"],
8792 },
8793 }
8794 `)
8795
8796 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008797 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008798 var builder strings.Builder
8799 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8800 androidMk := builder.String()
8801
8802 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8803 // a thing there.
Cole Fausteb8cd312022-11-03 16:39:21 -07008804 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00008805}
8806
Jiyong Parke3867542020-12-03 17:28:25 +09008807func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008808 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008809 apex {
8810 name: "myapex",
8811 key: "myapex.key",
8812 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008813 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008814 }
8815
8816 apex_key {
8817 name: "myapex.key",
8818 public_key: "testkey.avbpubkey",
8819 private_key: "testkey.pem",
8820 }
8821
8822 cc_library {
8823 name: "mylib",
8824 srcs: ["mylib.cpp"],
8825 system_shared_libs: [],
8826 stl: "none",
8827 apex_available: ["myapex"],
8828 shared_libs: ["mylib2"],
8829 target: {
8830 apex: {
8831 exclude_shared_libs: ["mylib2"],
8832 },
8833 },
8834 }
8835
8836 cc_library {
8837 name: "mylib2",
8838 srcs: ["mylib.cpp"],
8839 system_shared_libs: [],
8840 stl: "none",
8841 }
8842 `)
8843
8844 // Check if mylib is linked to mylib2 for the non-apex target
8845 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8846 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8847
8848 // Make sure that the link doesn't occur for the apex target
8849 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8850 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8851
8852 // It shouldn't appear in the copy cmd as well.
8853 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8854 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8855}
8856
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008857func TestPrebuiltStubLibDep(t *testing.T) {
8858 bpBase := `
8859 apex {
8860 name: "myapex",
8861 key: "myapex.key",
8862 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008863 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008864 }
8865 apex_key {
8866 name: "myapex.key",
8867 public_key: "testkey.avbpubkey",
8868 private_key: "testkey.pem",
8869 }
8870 cc_library {
8871 name: "mylib",
8872 srcs: ["mylib.cpp"],
8873 apex_available: ["myapex"],
8874 shared_libs: ["stublib"],
8875 system_shared_libs: [],
8876 }
8877 apex {
8878 name: "otherapex",
8879 enabled: %s,
8880 key: "myapex.key",
8881 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008882 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008883 }
8884 `
8885
8886 stublibSourceBp := `
8887 cc_library {
8888 name: "stublib",
8889 srcs: ["mylib.cpp"],
8890 apex_available: ["otherapex"],
8891 system_shared_libs: [],
8892 stl: "none",
8893 stubs: {
8894 versions: ["1"],
8895 },
8896 }
8897 `
8898
8899 stublibPrebuiltBp := `
8900 cc_prebuilt_library_shared {
8901 name: "stublib",
8902 srcs: ["prebuilt.so"],
8903 apex_available: ["otherapex"],
8904 stubs: {
8905 versions: ["1"],
8906 },
8907 %s
8908 }
8909 `
8910
8911 tests := []struct {
8912 name string
8913 stublibBp string
8914 usePrebuilt bool
8915 modNames []string // Modules to collect AndroidMkEntries for
8916 otherApexEnabled []string
8917 }{
8918 {
8919 name: "only_source",
8920 stublibBp: stublibSourceBp,
8921 usePrebuilt: false,
8922 modNames: []string{"stublib"},
8923 otherApexEnabled: []string{"true", "false"},
8924 },
8925 {
8926 name: "source_preferred",
8927 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8928 usePrebuilt: false,
8929 modNames: []string{"stublib", "prebuilt_stublib"},
8930 otherApexEnabled: []string{"true", "false"},
8931 },
8932 {
8933 name: "prebuilt_preferred",
8934 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8935 usePrebuilt: true,
8936 modNames: []string{"stublib", "prebuilt_stublib"},
8937 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8938 },
8939 {
8940 name: "only_prebuilt",
8941 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8942 usePrebuilt: true,
8943 modNames: []string{"stublib"},
8944 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8945 },
8946 }
8947
8948 for _, test := range tests {
8949 t.Run(test.name, func(t *testing.T) {
8950 for _, otherApexEnabled := range test.otherApexEnabled {
8951 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008952 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008953
8954 type modAndMkEntries struct {
8955 mod *cc.Module
8956 mkEntries android.AndroidMkEntries
8957 }
8958 entries := []*modAndMkEntries{}
8959
8960 // Gather shared lib modules that are installable
8961 for _, modName := range test.modNames {
8962 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8963 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8964 continue
8965 }
8966 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008967 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008968 continue
8969 }
Colin Crossaa255532020-07-03 13:18:24 -07008970 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008971 if ent.Disabled {
8972 continue
8973 }
8974 entries = append(entries, &modAndMkEntries{
8975 mod: mod,
8976 mkEntries: ent,
8977 })
8978 }
8979 }
8980 }
8981
8982 var entry *modAndMkEntries = nil
8983 for _, ent := range entries {
8984 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8985 if entry != nil {
8986 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8987 } else {
8988 entry = ent
8989 }
8990 }
8991 }
8992
8993 if entry == nil {
8994 t.Errorf("AndroidMk entry for \"stublib\" missing")
8995 } else {
8996 isPrebuilt := entry.mod.Prebuilt() != nil
8997 if isPrebuilt != test.usePrebuilt {
8998 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8999 }
9000 if !entry.mod.IsStubs() {
9001 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9002 }
9003 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9004 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9005 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009006 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009007 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009008 if !android.InList(expected, cflags) {
9009 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9010 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009011 }
9012 })
9013 }
9014 })
9015 }
9016}
9017
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009018func TestHostApexInHostOnlyBuild(t *testing.T) {
9019 testApex(t, `
9020 apex {
9021 name: "myapex",
9022 host_supported: true,
9023 key: "myapex.key",
9024 updatable: false,
9025 payload_type: "zip",
9026 }
9027 apex_key {
9028 name: "myapex.key",
9029 public_key: "testkey.avbpubkey",
9030 private_key: "testkey.pem",
9031 }
9032 `,
9033 android.FixtureModifyConfig(func(config android.Config) {
9034 // We may not have device targets in all builds, e.g. in
9035 // prebuilts/build-tools/build-prebuilts.sh
9036 config.Targets[android.Android] = []android.Target{}
9037 }))
9038}
9039
Colin Crossc33e5212021-05-25 18:16:02 -07009040func TestApexJavaCoverage(t *testing.T) {
9041 bp := `
9042 apex {
9043 name: "myapex",
9044 key: "myapex.key",
9045 java_libs: ["mylib"],
9046 bootclasspath_fragments: ["mybootclasspathfragment"],
9047 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9048 updatable: false,
9049 }
9050
9051 apex_key {
9052 name: "myapex.key",
9053 public_key: "testkey.avbpubkey",
9054 private_key: "testkey.pem",
9055 }
9056
9057 java_library {
9058 name: "mylib",
9059 srcs: ["mylib.java"],
9060 apex_available: ["myapex"],
9061 compile_dex: true,
9062 }
9063
9064 bootclasspath_fragment {
9065 name: "mybootclasspathfragment",
9066 contents: ["mybootclasspathlib"],
9067 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009068 hidden_api: {
9069 split_packages: ["*"],
9070 },
Colin Crossc33e5212021-05-25 18:16:02 -07009071 }
9072
9073 java_library {
9074 name: "mybootclasspathlib",
9075 srcs: ["mybootclasspathlib.java"],
9076 apex_available: ["myapex"],
9077 compile_dex: true,
9078 }
9079
9080 systemserverclasspath_fragment {
9081 name: "mysystemserverclasspathfragment",
9082 contents: ["mysystemserverclasspathlib"],
9083 apex_available: ["myapex"],
9084 }
9085
9086 java_library {
9087 name: "mysystemserverclasspathlib",
9088 srcs: ["mysystemserverclasspathlib.java"],
9089 apex_available: ["myapex"],
9090 compile_dex: true,
9091 }
9092 `
9093
9094 result := android.GroupFixturePreparers(
9095 PrepareForTestWithApexBuildComponents,
9096 prepareForTestWithMyapex,
9097 java.PrepareForTestWithJavaDefaultModules,
9098 android.PrepareForTestWithAndroidBuildComponents,
9099 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009100 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9101 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009102 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009103 ).RunTest(t)
9104
9105 // Make sure jacoco ran on both mylib and mybootclasspathlib
9106 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9107 t.Errorf("Failed to find jacoco rule for mylib")
9108 }
9109 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9110 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9111 }
9112 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9113 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9114 }
9115}
9116
Jiyong Park192600a2021-08-03 07:52:17 +00009117func TestProhibitStaticExecutable(t *testing.T) {
9118 testApexError(t, `executable mybin is static`, `
9119 apex {
9120 name: "myapex",
9121 key: "myapex.key",
9122 binaries: ["mybin"],
9123 min_sdk_version: "29",
9124 }
9125
9126 apex_key {
9127 name: "myapex.key",
9128 public_key: "testkey.avbpubkey",
9129 private_key: "testkey.pem",
9130 }
9131
9132 cc_binary {
9133 name: "mybin",
9134 srcs: ["mylib.cpp"],
9135 relative_install_path: "foo/bar",
9136 static_executable: true,
9137 system_shared_libs: [],
9138 stl: "none",
9139 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009140 min_sdk_version: "29",
9141 }
9142 `)
9143
9144 testApexError(t, `executable mybin.rust is static`, `
9145 apex {
9146 name: "myapex",
9147 key: "myapex.key",
9148 binaries: ["mybin.rust"],
9149 min_sdk_version: "29",
9150 }
9151
9152 apex_key {
9153 name: "myapex.key",
9154 public_key: "testkey.avbpubkey",
9155 private_key: "testkey.pem",
9156 }
9157
9158 rust_binary {
9159 name: "mybin.rust",
9160 srcs: ["foo.rs"],
9161 static_executable: true,
9162 apex_available: ["myapex"],
9163 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009164 }
9165 `)
9166}
9167
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009168func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9169 ctx := testApex(t, `
9170 apex {
9171 name: "myapex",
9172 key: "myapex.key",
9173 updatable: false,
9174 java_libs: ["foo"],
9175 }
9176
9177 apex_key {
9178 name: "myapex.key",
9179 public_key: "testkey.avbpubkey",
9180 private_key: "testkey.pem",
9181 }
9182
9183 java_library {
9184 name: "foo",
9185 srcs: ["foo.java"],
9186 apex_available: ["myapex"],
9187 installable: true,
9188 }
9189 `,
9190 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9191 )
9192
9193 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9194 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9195 var builder strings.Builder
9196 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9197 androidMk := builder.String()
Cole Fausteb8cd312022-11-03 16:39:21 -07009198 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex\n")
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009199}
9200
9201func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9202 ctx := testApex(t, `
9203 prebuilt_apex {
9204 name: "myapex",
9205 arch: {
9206 arm64: {
9207 src: "myapex-arm64.apex",
9208 },
9209 arm: {
9210 src: "myapex-arm.apex",
9211 },
9212 },
9213 exported_java_libs: ["foo"],
9214 }
9215
9216 java_import {
9217 name: "foo",
9218 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009219 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009220 }
9221 `,
9222 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9223 )
9224
9225 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9226 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9227 mainModuleEntries := entriesList[0]
9228 android.AssertArrayString(t,
9229 "LOCAL_REQUIRED_MODULES",
9230 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9231 []string{
9232 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9233 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9234 })
9235}
9236
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009237func TestAndroidMk_RequiredModules(t *testing.T) {
9238 ctx := testApex(t, `
9239 apex {
9240 name: "myapex",
9241 key: "myapex.key",
9242 updatable: false,
9243 java_libs: ["foo"],
9244 required: ["otherapex"],
9245 }
9246
9247 apex {
9248 name: "otherapex",
9249 key: "myapex.key",
9250 updatable: false,
9251 java_libs: ["foo"],
9252 required: ["otherapex"],
9253 }
9254
9255 apex_key {
9256 name: "myapex.key",
9257 public_key: "testkey.avbpubkey",
9258 private_key: "testkey.pem",
9259 }
9260
9261 java_library {
9262 name: "foo",
9263 srcs: ["foo.java"],
9264 apex_available: ["myapex", "otherapex"],
9265 installable: true,
9266 }
9267 `)
9268
9269 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9270 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9271 var builder strings.Builder
9272 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9273 androidMk := builder.String()
Cole Fausteb8cd312022-11-03 16:39:21 -07009274 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009275}
9276
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009277func TestAndroidMk_RequiredDeps(t *testing.T) {
9278 ctx := testApex(t, `
9279 apex {
9280 name: "myapex",
9281 key: "myapex.key",
9282 updatable: false,
9283 }
9284
9285 apex_key {
9286 name: "myapex.key",
9287 public_key: "testkey.avbpubkey",
9288 private_key: "testkey.pem",
9289 }
9290 `)
9291
9292 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9293 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
9294 data := android.AndroidMkDataForTest(t, ctx, bundle)
9295 var builder strings.Builder
9296 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9297 androidMk := builder.String()
Cole Fausteb8cd312022-11-03 16:39:21 -07009298 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009299
9300 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
9301 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
9302 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9303 var flattenedBuilder strings.Builder
9304 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9305 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009306 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009307}
9308
Jooyung Hana6d36672022-02-24 13:58:07 +09009309func TestApexOutputFileProducer(t *testing.T) {
9310 for _, tc := range []struct {
9311 name string
9312 ref string
9313 expected_data []string
9314 }{
9315 {
9316 name: "test_using_output",
9317 ref: ":myapex",
9318 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9319 },
9320 {
9321 name: "test_using_apex",
9322 ref: ":myapex{.apex}",
9323 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9324 },
9325 } {
9326 t.Run(tc.name, func(t *testing.T) {
9327 ctx := testApex(t, `
9328 apex {
9329 name: "myapex",
9330 key: "myapex.key",
9331 compressible: true,
9332 updatable: false,
9333 }
9334
9335 apex_key {
9336 name: "myapex.key",
9337 public_key: "testkey.avbpubkey",
9338 private_key: "testkey.pem",
9339 }
9340
9341 java_test {
9342 name: "`+tc.name+`",
9343 srcs: ["a.java"],
9344 data: ["`+tc.ref+`"],
9345 }
9346 `,
9347 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9348 variables.CompressedApex = proptools.BoolPtr(true)
9349 }))
9350 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9351 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9352 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9353 })
9354 }
9355}
9356
satayev758968a2021-12-06 11:42:40 +00009357func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9358 preparer := android.GroupFixturePreparers(
9359 PrepareForTestWithApexBuildComponents,
9360 prepareForTestWithMyapex,
9361 java.PrepareForTestWithJavaSdkLibraryFiles,
9362 java.PrepareForTestWithJavaDefaultModules,
9363 android.PrepareForTestWithAndroidBuildComponents,
9364 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9365 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9366 )
9367
9368 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9369 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9370 preparer.RunTestWithBp(t, `
9371 apex {
9372 name: "myapex",
9373 key: "myapex.key",
9374 bootclasspath_fragments: ["mybootclasspathfragment"],
9375 min_sdk_version: "30",
9376 updatable: false,
9377 }
9378
9379 apex_key {
9380 name: "myapex.key",
9381 public_key: "testkey.avbpubkey",
9382 private_key: "testkey.pem",
9383 }
9384
9385 bootclasspath_fragment {
9386 name: "mybootclasspathfragment",
9387 contents: ["mybootclasspathlib"],
9388 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009389 hidden_api: {
9390 split_packages: ["*"],
9391 },
satayev758968a2021-12-06 11:42:40 +00009392 }
9393
9394 java_sdk_library {
9395 name: "mybootclasspathlib",
9396 srcs: ["mybootclasspathlib.java"],
9397 apex_available: ["myapex"],
9398 compile_dex: true,
9399 unsafe_ignore_missing_latest_api: true,
9400 min_sdk_version: "31",
9401 static_libs: ["util"],
9402 }
9403
9404 java_library {
9405 name: "util",
9406 srcs: ["a.java"],
9407 apex_available: ["myapex"],
9408 min_sdk_version: "31",
9409 static_libs: ["another_util"],
9410 }
9411
9412 java_library {
9413 name: "another_util",
9414 srcs: ["a.java"],
9415 min_sdk_version: "31",
9416 apex_available: ["myapex"],
9417 }
9418 `)
9419 })
9420
9421 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9422 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9423 preparer.RunTestWithBp(t, `
9424 apex {
9425 name: "myapex",
9426 key: "myapex.key",
9427 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9428 min_sdk_version: "30",
9429 updatable: false,
9430 }
9431
9432 apex_key {
9433 name: "myapex.key",
9434 public_key: "testkey.avbpubkey",
9435 private_key: "testkey.pem",
9436 }
9437
9438 systemserverclasspath_fragment {
9439 name: "mysystemserverclasspathfragment",
9440 contents: ["mysystemserverclasspathlib"],
9441 apex_available: ["myapex"],
9442 }
9443
9444 java_sdk_library {
9445 name: "mysystemserverclasspathlib",
9446 srcs: ["mysystemserverclasspathlib.java"],
9447 apex_available: ["myapex"],
9448 compile_dex: true,
9449 min_sdk_version: "32",
9450 unsafe_ignore_missing_latest_api: true,
9451 static_libs: ["util"],
9452 }
9453
9454 java_library {
9455 name: "util",
9456 srcs: ["a.java"],
9457 apex_available: ["myapex"],
9458 min_sdk_version: "31",
9459 static_libs: ["another_util"],
9460 }
9461
9462 java_library {
9463 name: "another_util",
9464 srcs: ["a.java"],
9465 min_sdk_version: "31",
9466 apex_available: ["myapex"],
9467 }
9468 `)
9469 })
9470
9471 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9472 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9473 RunTestWithBp(t, `
9474 apex {
9475 name: "myapex",
9476 key: "myapex.key",
9477 bootclasspath_fragments: ["mybootclasspathfragment"],
9478 min_sdk_version: "30",
9479 updatable: false,
9480 }
9481
9482 apex_key {
9483 name: "myapex.key",
9484 public_key: "testkey.avbpubkey",
9485 private_key: "testkey.pem",
9486 }
9487
9488 bootclasspath_fragment {
9489 name: "mybootclasspathfragment",
9490 contents: ["mybootclasspathlib"],
9491 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009492 hidden_api: {
9493 split_packages: ["*"],
9494 },
satayev758968a2021-12-06 11:42:40 +00009495 }
9496
9497 java_sdk_library {
9498 name: "mybootclasspathlib",
9499 srcs: ["mybootclasspathlib.java"],
9500 apex_available: ["myapex"],
9501 compile_dex: true,
9502 unsafe_ignore_missing_latest_api: true,
9503 }
9504 `)
9505 })
9506
9507 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9508 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9509 RunTestWithBp(t, `
9510 apex {
9511 name: "myapex",
9512 key: "myapex.key",
9513 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9514 min_sdk_version: "30",
9515 updatable: false,
9516 }
9517
9518 apex_key {
9519 name: "myapex.key",
9520 public_key: "testkey.avbpubkey",
9521 private_key: "testkey.pem",
9522 }
9523
9524 systemserverclasspath_fragment {
9525 name: "mysystemserverclasspathfragment",
9526 contents: ["mysystemserverclasspathlib"],
9527 apex_available: ["myapex"],
9528 }
9529
9530 java_sdk_library {
9531 name: "mysystemserverclasspathlib",
9532 srcs: ["mysystemserverclasspathlib.java"],
9533 apex_available: ["myapex"],
9534 compile_dex: true,
9535 unsafe_ignore_missing_latest_api: true,
9536 }
9537 `)
9538 })
9539}
9540
Jiakai Zhang6decef92022-01-12 17:56:19 +00009541// Verifies that the APEX depends on all the Make modules in the list.
9542func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9543 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9544 for _, dep := range deps {
9545 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9546 }
9547}
9548
9549// Verifies that the APEX does not depend on any of the Make modules in the list.
9550func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9551 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9552 for _, dep := range deps {
9553 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9554 }
9555}
9556
Spandan Das66773252022-01-15 00:23:18 +00009557func TestApexStrictUpdtabilityLint(t *testing.T) {
9558 bpTemplate := `
9559 apex {
9560 name: "myapex",
9561 key: "myapex.key",
9562 java_libs: ["myjavalib"],
9563 updatable: %v,
9564 min_sdk_version: "29",
9565 }
9566 apex_key {
9567 name: "myapex.key",
9568 }
9569 java_library {
9570 name: "myjavalib",
9571 srcs: ["MyClass.java"],
9572 apex_available: [ "myapex" ],
9573 lint: {
9574 strict_updatability_linting: %v,
9575 },
9576 sdk_version: "current",
9577 min_sdk_version: "29",
9578 }
9579 `
9580 fs := android.MockFS{
9581 "lint-baseline.xml": nil,
9582 }
9583
9584 testCases := []struct {
9585 testCaseName string
9586 apexUpdatable bool
9587 javaStrictUpdtabilityLint bool
9588 lintFileExists bool
9589 disallowedFlagExpected bool
9590 }{
9591 {
9592 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9593 apexUpdatable: true,
9594 javaStrictUpdtabilityLint: true,
9595 lintFileExists: false,
9596 disallowedFlagExpected: false,
9597 },
9598 {
9599 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9600 apexUpdatable: false,
9601 javaStrictUpdtabilityLint: false,
9602 lintFileExists: true,
9603 disallowedFlagExpected: false,
9604 },
9605 {
9606 testCaseName: "non-updatable apex respects strict updatability of javalib",
9607 apexUpdatable: false,
9608 javaStrictUpdtabilityLint: true,
9609 lintFileExists: true,
9610 disallowedFlagExpected: true,
9611 },
9612 {
9613 testCaseName: "updatable apex sets strict updatability of javalib to true",
9614 apexUpdatable: true,
9615 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9616 lintFileExists: true,
9617 disallowedFlagExpected: true,
9618 },
9619 }
9620
9621 for _, testCase := range testCases {
9622 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9623 fixtures := []android.FixturePreparer{}
9624 if testCase.lintFileExists {
9625 fixtures = append(fixtures, fs.AddToFixture())
9626 }
9627
9628 result := testApex(t, bp, fixtures...)
9629 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9630 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9631 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9632
9633 if disallowedFlagActual != testCase.disallowedFlagExpected {
9634 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9635 }
9636 }
9637}
9638
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009639func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9640 bp := `
9641 apex {
9642 name: "myapex",
9643 key: "myapex.key",
9644 java_libs: ["myjavalib"],
9645 updatable: true,
9646 min_sdk_version: "29",
9647 }
9648 apex_key {
9649 name: "myapex.key",
9650 }
9651 java_library {
9652 name: "myjavalib",
9653 srcs: ["MyClass.java"],
9654 apex_available: [ "myapex" ],
9655 sdk_version: "current",
9656 min_sdk_version: "29",
9657 }
9658 `
9659
9660 testCases := []struct {
9661 testCaseName string
9662 moduleDirectory string
9663 disallowedFlagExpected bool
9664 }{
9665 {
9666 testCaseName: "lintable module defined outside libcore",
9667 moduleDirectory: "",
9668 disallowedFlagExpected: true,
9669 },
9670 {
9671 testCaseName: "lintable module defined in libcore root directory",
9672 moduleDirectory: "libcore/",
9673 disallowedFlagExpected: false,
9674 },
9675 {
9676 testCaseName: "lintable module defined in libcore child directory",
9677 moduleDirectory: "libcore/childdir/",
9678 disallowedFlagExpected: true,
9679 },
9680 }
9681
9682 for _, testCase := range testCases {
9683 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9684 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9685 result := testApex(t, "", lintFileCreator, bpFileCreator)
9686 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9687 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9688 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9689 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9690
9691 if disallowedFlagActual != testCase.disallowedFlagExpected {
9692 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9693 }
9694 }
9695}
9696
Spandan Das66773252022-01-15 00:23:18 +00009697// checks transtive deps of an apex coming from bootclasspath_fragment
9698func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9699 bp := `
9700 apex {
9701 name: "myapex",
9702 key: "myapex.key",
9703 bootclasspath_fragments: ["mybootclasspathfragment"],
9704 updatable: true,
9705 min_sdk_version: "29",
9706 }
9707 apex_key {
9708 name: "myapex.key",
9709 }
9710 bootclasspath_fragment {
9711 name: "mybootclasspathfragment",
9712 contents: ["myjavalib"],
9713 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009714 hidden_api: {
9715 split_packages: ["*"],
9716 },
Spandan Das66773252022-01-15 00:23:18 +00009717 }
9718 java_library {
9719 name: "myjavalib",
9720 srcs: ["MyClass.java"],
9721 apex_available: [ "myapex" ],
9722 sdk_version: "current",
9723 min_sdk_version: "29",
9724 compile_dex: true,
9725 }
9726 `
9727 fs := android.MockFS{
9728 "lint-baseline.xml": nil,
9729 }
9730
9731 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9732 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9733 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9734 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9735 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9736 }
9737}
9738
Spandan Das42e89502022-05-06 22:12:55 +00009739// updatable apexes should propagate updatable=true to its apps
9740func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9741 bp := `
9742 apex {
9743 name: "myapex",
9744 key: "myapex.key",
9745 updatable: %v,
9746 apps: [
9747 "myapp",
9748 ],
9749 min_sdk_version: "30",
9750 }
9751 apex_key {
9752 name: "myapex.key",
9753 }
9754 android_app {
9755 name: "myapp",
9756 updatable: %v,
9757 apex_available: [
9758 "myapex",
9759 ],
9760 sdk_version: "current",
9761 min_sdk_version: "30",
9762 }
9763 `
9764 testCases := []struct {
9765 name string
9766 apex_is_updatable_bp bool
9767 app_is_updatable_bp bool
9768 app_is_updatable_expected bool
9769 }{
9770 {
9771 name: "Non-updatable apex respects updatable property of non-updatable app",
9772 apex_is_updatable_bp: false,
9773 app_is_updatable_bp: false,
9774 app_is_updatable_expected: false,
9775 },
9776 {
9777 name: "Non-updatable apex respects updatable property of updatable app",
9778 apex_is_updatable_bp: false,
9779 app_is_updatable_bp: true,
9780 app_is_updatable_expected: true,
9781 },
9782 {
9783 name: "Updatable apex respects updatable property of updatable app",
9784 apex_is_updatable_bp: true,
9785 app_is_updatable_bp: true,
9786 app_is_updatable_expected: true,
9787 },
9788 {
9789 name: "Updatable apex sets updatable=true on non-updatable app",
9790 apex_is_updatable_bp: true,
9791 app_is_updatable_bp: false,
9792 app_is_updatable_expected: true,
9793 },
9794 }
9795 for _, testCase := range testCases {
9796 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9797 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9798 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9799 }
9800}
9801
Kiyoung Kim487689e2022-07-26 09:48:22 +09009802func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9803 bp := `
9804 apex {
9805 name: "myapex",
9806 key: "myapex.key",
9807 native_shared_libs: ["libfoo"],
9808 min_sdk_version: "29",
9809 }
9810 apex_key {
9811 name: "myapex.key",
9812 }
9813 cc_library {
9814 name: "libfoo",
9815 shared_libs: ["libc"],
9816 apex_available: ["myapex"],
9817 min_sdk_version: "29",
9818 }
9819 cc_api_library {
9820 name: "libc",
9821 src: "libc.so",
9822 min_sdk_version: "29",
9823 recovery_available: true,
9824 }
9825 api_imports {
9826 name: "api_imports",
9827 shared_libs: [
9828 "libc",
9829 ],
9830 header_libs: [],
9831 }
9832 `
9833 result := testApex(t, bp)
9834
9835 hasDep := func(m android.Module, wantDep android.Module) bool {
9836 t.Helper()
9837 var found bool
9838 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9839 if dep == wantDep {
9840 found = true
9841 }
9842 })
9843 return found
9844 }
9845
9846 libfooApexVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex29").Module()
9847 libcApexVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared_apex29").Module()
9848
9849 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(libfooApexVariant, libcApexVariant))
9850
9851 // libfoo core variant should be buildable in the same inner tree since
9852 // certain mcombo files might build system and apexes in the same inner tree
9853 // libfoo core variant should link against source libc
9854 libfooCoreVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
9855 libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
9856 android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
9857}