blob: cb98d97bf425bb6aa3787ec94f936923bad40481 [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 Park25fc6a92018-11-18 18:02:45 +090018 "io/ioutil"
19 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Jooyung Han31c470b2019-10-18 16:26:59 +090022 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090023 "strings"
24 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090025
26 "github.com/google/blueprint/proptools"
27
28 "android/soong/android"
29 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000030 "android/soong/dexpreopt"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090031 "android/soong/java"
Jiyong Park25fc6a92018-11-18 18:02:45 +090032)
33
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070034var buildDir string
35
Jooyung Hand3639552019-08-09 12:57:43 +090036// names returns name list from white space separated string
37func names(s string) (ns []string) {
38 for _, n := range strings.Split(s, " ") {
39 if len(n) > 0 {
40 ns = append(ns, n)
41 }
42 }
43 return
44}
45
Jooyung Han344d5432019-08-23 11:17:39 +090046func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
47 t.Helper()
48 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090049 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
50 if len(errs) > 0 {
51 android.FailIfNoMatchingErrors(t, pattern, errs)
52 return
53 }
54 _, errs = ctx.PrepareBuildActions(config)
55 if len(errs) > 0 {
56 android.FailIfNoMatchingErrors(t, pattern, errs)
57 return
58 }
59
60 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
61}
62
Jooyung Han344d5432019-08-23 11:17:39 +090063func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
64 t.Helper()
65 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090066 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
67 android.FailIfErrored(t, errs)
68 _, errs = ctx.PrepareBuildActions(config)
69 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070070 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090071}
72
Jooyung Han344d5432019-08-23 11:17:39 +090073type testCustomizer func(fs map[string][]byte, config android.Config)
74
75func withFiles(files map[string][]byte) testCustomizer {
76 return func(fs map[string][]byte, config android.Config) {
77 for k, v := range files {
78 fs[k] = v
79 }
80 }
81}
82
83func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
84 return func(fs map[string][]byte, config android.Config) {
85 for k, v := range targets {
86 config.Targets[k] = v
87 }
88 }
89}
90
Jooyung Han35155c42020-02-06 17:33:20 +090091// withNativeBridgeTargets sets configuration with targets including:
92// - X86_64 (primary)
93// - X86 (secondary)
94// - Arm64 on X86_64 (native bridge)
95// - Arm on X86 (native bridge)
96func withNativeBridgeEnabled(fs map[string][]byte, 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
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900109func withManifestPackageNameOverrides(specs []string) testCustomizer {
110 return func(fs map[string][]byte, config android.Config) {
111 config.TestProductVariables.ManifestPackageNameOverrides = specs
112 }
113}
114
Jooyung Han31c470b2019-10-18 16:26:59 +0900115func withBinder32bit(fs map[string][]byte, config android.Config) {
116 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
117}
118
Jiyong Park7cd10e32020-01-14 09:22:18 +0900119func withUnbundledBuild(fs map[string][]byte, config android.Config) {
120 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
121}
122
Jooyung Han344d5432019-08-23 11:17:39 +0900123func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jooyung Han671f1ce2019-12-17 12:47:13 +0900124 android.ClearApexDependency()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900125
126 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900127 filegroup {
128 name: "myapex-file_contexts",
129 srcs: [
130 "system/sepolicy/apex/myapex-file_contexts",
131 ],
132 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900133 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800134
Colin Crossf9aabd72020-02-15 11:29:50 -0800135 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
136
Dario Frenicde2a032019-10-27 00:29:22 +0100137 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900138
Jooyung Han344d5432019-08-23 11:17:39 +0900139 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900140 "a.java": nil,
141 "PrebuiltAppFoo.apk": nil,
142 "PrebuiltAppFooPriv.apk": nil,
143 "build/make/target/product/security": nil,
144 "apex_manifest.json": nil,
145 "AndroidManifest.xml": nil,
146 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900147 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900148 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900149 "system/sepolicy/apex/otherapex-file_contexts": nil,
150 "system/sepolicy/apex/commonapex-file_contexts": nil,
151 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800152 "mylib.cpp": nil,
153 "mylib_common.cpp": nil,
154 "mytest.cpp": nil,
155 "mytest1.cpp": nil,
156 "mytest2.cpp": nil,
157 "mytest3.cpp": nil,
158 "myprebuilt": nil,
159 "my_include": nil,
160 "foo/bar/MyClass.java": nil,
161 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100162 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800163 "vendor/foo/devkeys/test.x509.pem": nil,
164 "vendor/foo/devkeys/test.pk8": nil,
165 "testkey.x509.pem": nil,
166 "testkey.pk8": nil,
167 "testkey.override.x509.pem": nil,
168 "testkey.override.pk8": nil,
169 "vendor/foo/devkeys/testkey.avbpubkey": nil,
170 "vendor/foo/devkeys/testkey.pem": nil,
171 "NOTICE": nil,
172 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900173 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800174 "testkey2.avbpubkey": nil,
175 "testkey2.pem": nil,
176 "myapex-arm64.apex": nil,
177 "myapex-arm.apex": nil,
178 "frameworks/base/api/current.txt": nil,
179 "framework/aidl/a.aidl": nil,
180 "build/make/core/proguard.flags": nil,
181 "build/make/core/proguard_basic_keeps.flags": nil,
182 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700183 "baz": nil,
184 "bar/baz": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900185 }
186
Colin Crossf9aabd72020-02-15 11:29:50 -0800187 cc.GatherRequiredFilesForTest(fs)
188
Jooyung Han344d5432019-08-23 11:17:39 +0900189 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800190 // The fs now needs to be populated before creating the config, call handlers twice
191 // for now, once to get any fs changes, and later after the config was created to
192 // set product variables or targets.
193 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
194 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900195 }
196
Colin Cross98be1bb2019-12-13 20:41:13 -0800197 config := android.TestArchConfig(buildDir, nil, bp, fs)
198 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
199 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
200 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
201 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
202 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
203 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
204
205 for _, handler := range handlers {
206 // The fs now needs to be populated before creating the config, call handlers twice
207 // for now, earlier to get any fs changes, and now after the config was created to
208 // set product variables or targets.
209 tempFS := map[string][]byte{}
210 handler(tempFS, config)
211 }
212
213 ctx := android.NewTestArchContext()
214 ctx.RegisterModuleType("apex", BundleFactory)
215 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
216 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
217 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
218 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
219 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
220 ctx.RegisterModuleType("override_apex", overrideApexFactory)
221
Jooyung Hana57af4a2020-01-23 05:36:59 +0000222 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
223 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
224
Paul Duffin77980a82019-12-19 16:01:36 +0000225 cc.RegisterRequiredBuildComponentsForTest(ctx)
Colin Cross98be1bb2019-12-13 20:41:13 -0800226 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800227 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
228 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800229 ctx.RegisterModuleType("prebuilt_etc", android.PrebuiltEtcFactory)
atrost6e126252020-01-27 17:01:16 +0000230 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800231 ctx.RegisterModuleType("sh_binary", android.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800232 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000233 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000234 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000235 java.RegisterAppBuildComponents(ctx)
Jooyung Han58f26ab2019-12-18 15:34:32 +0900236 ctx.RegisterModuleType("java_sdk_library", java.SdkLibraryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800237
Colin Cross98be1bb2019-12-13 20:41:13 -0800238 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800239 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800240
241 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242
Jooyung Han5c998b92019-06-27 11:30:33 +0900243 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900244}
245
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700246func setUp() {
247 var err error
248 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900249 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700250 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900251 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900252}
253
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700254func tearDown() {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900255 os.RemoveAll(buildDir)
256}
257
Jooyung Han643adc42020-02-27 13:50:06 +0900258// ensure that 'result' equals 'expected'
259func ensureEquals(t *testing.T, result string, expected string) {
260 t.Helper()
261 if result != expected {
262 t.Errorf("%q != %q", expected, result)
263 }
264}
265
Jiyong Park25fc6a92018-11-18 18:02:45 +0900266// ensure that 'result' contains 'expected'
267func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900268 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900269 if !strings.Contains(result, expected) {
270 t.Errorf("%q is not found in %q", expected, result)
271 }
272}
273
274// ensures that 'result' does not contain 'notExpected'
275func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900276 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277 if strings.Contains(result, notExpected) {
278 t.Errorf("%q is found in %q", notExpected, result)
279 }
280}
281
282func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900283 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900284 if !android.InList(expected, result) {
285 t.Errorf("%q is not found in %v", expected, result)
286 }
287}
288
289func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900290 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900291 if android.InList(notExpected, result) {
292 t.Errorf("%q is found in %v", notExpected, result)
293 }
294}
295
Jooyung Hane1633032019-08-01 17:41:43 +0900296func ensureListEmpty(t *testing.T, result []string) {
297 t.Helper()
298 if len(result) > 0 {
299 t.Errorf("%q is expected to be empty", result)
300 }
301}
302
Jiyong Park25fc6a92018-11-18 18:02:45 +0900303// Minimal test
304func TestBasicApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700305 ctx, _ := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900306 apex_defaults {
307 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900308 manifest: ":myapex.manifest",
309 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900310 key: "myapex.key",
311 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800312 multilib: {
313 both: {
314 binaries: ["foo",],
315 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900316 },
Jooyung Han5a80d9f2019-12-23 15:38:34 +0900317 java_libs: ["myjar"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900318 }
319
Jiyong Park30ca9372019-02-07 16:27:23 +0900320 apex {
321 name: "myapex",
322 defaults: ["myapex-defaults"],
323 }
324
Jiyong Park25fc6a92018-11-18 18:02:45 +0900325 apex_key {
326 name: "myapex.key",
327 public_key: "testkey.avbpubkey",
328 private_key: "testkey.pem",
329 }
330
Jiyong Park809bb722019-02-13 21:33:49 +0900331 filegroup {
332 name: "myapex.manifest",
333 srcs: ["apex_manifest.json"],
334 }
335
336 filegroup {
337 name: "myapex.androidmanifest",
338 srcs: ["AndroidManifest.xml"],
339 }
340
Jiyong Park25fc6a92018-11-18 18:02:45 +0900341 cc_library {
342 name: "mylib",
343 srcs: ["mylib.cpp"],
344 shared_libs: ["mylib2"],
345 system_shared_libs: [],
346 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000347 // TODO: remove //apex_available:platform
348 apex_available: [
349 "//apex_available:platform",
350 "myapex",
351 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900352 }
353
Alex Light3d673592019-01-18 14:37:31 -0800354 cc_binary {
355 name: "foo",
356 srcs: ["mylib.cpp"],
357 compile_multilib: "both",
358 multilib: {
359 lib32: {
360 suffix: "32",
361 },
362 lib64: {
363 suffix: "64",
364 },
365 },
366 symlinks: ["foo_link_"],
367 symlink_preferred_arch: true,
368 system_shared_libs: [],
369 static_executable: true,
370 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000371 apex_available: [ "myapex" ],
Alex Light3d673592019-01-18 14:37:31 -0800372 }
373
Paul Duffindddd5462020-04-07 15:25:44 +0100374 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900375 name: "mylib2",
376 srcs: ["mylib.cpp"],
377 system_shared_libs: [],
378 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900379 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900380 static_libs: ["libstatic"],
381 // TODO: remove //apex_available:platform
382 apex_available: [
383 "//apex_available:platform",
384 "myapex",
385 ],
386 }
387
Paul Duffindddd5462020-04-07 15:25:44 +0100388 cc_prebuilt_library_shared {
389 name: "mylib2",
390 srcs: ["prebuilt.so"],
391 // TODO: remove //apex_available:platform
392 apex_available: [
393 "//apex_available:platform",
394 "myapex",
395 ],
396 }
397
Jiyong Park9918e1a2020-03-17 19:16:40 +0900398 cc_library_static {
399 name: "libstatic",
400 srcs: ["mylib.cpp"],
401 system_shared_libs: [],
402 stl: "none",
403 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000404 // TODO: remove //apex_available:platform
405 apex_available: [
406 "//apex_available:platform",
407 "myapex",
408 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900409 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900410
411 java_library {
412 name: "myjar",
413 srcs: ["foo/bar/MyClass.java"],
414 sdk_version: "none",
415 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900416 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900417 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000418 // TODO: remove //apex_available:platform
419 apex_available: [
420 "//apex_available:platform",
421 "myapex",
422 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900423 }
424
425 java_library {
426 name: "myotherjar",
427 srcs: ["foo/bar/MyClass.java"],
428 sdk_version: "none",
429 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900430 // TODO: remove //apex_available:platform
431 apex_available: [
432 "//apex_available:platform",
433 "myapex",
434 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900435 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900436
437 java_library {
438 name: "mysharedjar",
439 srcs: ["foo/bar/MyClass.java"],
440 sdk_version: "none",
441 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900442 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900443 `)
444
Sundong Ahnabb64432019-10-22 13:58:29 +0900445 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900446
447 optFlags := apexRule.Args["opt_flags"]
448 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700449 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900450 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900451
Jiyong Park25fc6a92018-11-18 18:02:45 +0900452 copyCmds := apexRule.Args["copy_commands"]
453
454 // Ensure that main rule creates an output
455 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
456
457 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800458 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900459 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900460
461 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800462 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900463 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900464
465 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800466 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
467 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900468 ensureContains(t, copyCmds, "image.apex/javalib/myjar.jar")
469 // .. but not for java libs
470 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900471 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800472
Colin Cross7113d202019-11-20 16:39:12 -0800473 // Ensure that the platform variant ends with _shared or _common
474 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
475 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
477 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900478 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
479
480 // Ensure that dynamic dependency to java libs are not included
481 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800482
483 // Ensure that all symlinks are present.
484 found_foo_link_64 := false
485 found_foo := false
486 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900487 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800488 if strings.HasSuffix(cmd, "bin/foo") {
489 found_foo = true
490 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
491 found_foo_link_64 = true
492 }
493 }
494 }
495 good := found_foo && found_foo_link_64
496 if !good {
497 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
498 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900499
Sundong Ahnabb64432019-10-22 13:58:29 +0900500 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700501 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900502 if len(noticeInputs) != 3 {
503 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900504 }
505 ensureListContains(t, noticeInputs, "NOTICE")
506 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900507 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900508
Artur Satayeva8bd1132020-04-27 18:07:06 +0100509 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100510 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
511 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
512 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
513 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
514 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100515
516 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100517 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
518 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
519 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
520 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
521 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800522}
523
Jooyung Hanf21c7972019-12-16 22:32:06 +0900524func TestDefaults(t *testing.T) {
525 ctx, _ := testApex(t, `
526 apex_defaults {
527 name: "myapex-defaults",
528 key: "myapex.key",
529 prebuilts: ["myetc"],
530 native_shared_libs: ["mylib"],
531 java_libs: ["myjar"],
532 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900533 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900534 }
535
536 prebuilt_etc {
537 name: "myetc",
538 src: "myprebuilt",
539 }
540
541 apex {
542 name: "myapex",
543 defaults: ["myapex-defaults"],
544 }
545
546 apex_key {
547 name: "myapex.key",
548 public_key: "testkey.avbpubkey",
549 private_key: "testkey.pem",
550 }
551
552 cc_library {
553 name: "mylib",
554 system_shared_libs: [],
555 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000556 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900557 }
558
559 java_library {
560 name: "myjar",
561 srcs: ["foo/bar/MyClass.java"],
562 sdk_version: "none",
563 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000564 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900565 }
566
567 android_app {
568 name: "AppFoo",
569 srcs: ["foo/bar/MyClass.java"],
570 sdk_version: "none",
571 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000572 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900573 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900574
575 runtime_resource_overlay {
576 name: "rro",
577 theme: "blue",
578 }
579
Jooyung Hanf21c7972019-12-16 22:32:06 +0900580 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000581 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900582 "etc/myetc",
583 "javalib/myjar.jar",
584 "lib64/mylib.so",
585 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900586 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900587 })
588}
589
Jooyung Han01a3ee22019-11-02 02:52:25 +0900590func TestApexManifest(t *testing.T) {
591 ctx, _ := testApex(t, `
592 apex {
593 name: "myapex",
594 key: "myapex.key",
595 }
596
597 apex_key {
598 name: "myapex.key",
599 public_key: "testkey.avbpubkey",
600 private_key: "testkey.pem",
601 }
602 `)
603
604 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900605 args := module.Rule("apexRule").Args
606 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
607 t.Error("manifest should be apex_manifest.pb, but " + manifest)
608 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900609}
610
Alex Light5098a612018-11-29 17:12:15 -0800611func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700612 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800613 apex {
614 name: "myapex",
615 key: "myapex.key",
616 payload_type: "zip",
617 native_shared_libs: ["mylib"],
618 }
619
620 apex_key {
621 name: "myapex.key",
622 public_key: "testkey.avbpubkey",
623 private_key: "testkey.pem",
624 }
625
626 cc_library {
627 name: "mylib",
628 srcs: ["mylib.cpp"],
629 shared_libs: ["mylib2"],
630 system_shared_libs: [],
631 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000632 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800633 }
634
635 cc_library {
636 name: "mylib2",
637 srcs: ["mylib.cpp"],
638 system_shared_libs: [],
639 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000640 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800641 }
642 `)
643
Sundong Ahnabb64432019-10-22 13:58:29 +0900644 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800645 copyCmds := zipApexRule.Args["copy_commands"]
646
647 // Ensure that main rule creates an output
648 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
649
650 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800651 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800652
653 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800654 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800655
656 // Ensure that both direct and indirect deps are copied into apex
657 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
658 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900659}
660
661func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700662 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900663 apex {
664 name: "myapex",
665 key: "myapex.key",
666 native_shared_libs: ["mylib", "mylib3"],
667 }
668
669 apex_key {
670 name: "myapex.key",
671 public_key: "testkey.avbpubkey",
672 private_key: "testkey.pem",
673 }
674
675 cc_library {
676 name: "mylib",
677 srcs: ["mylib.cpp"],
678 shared_libs: ["mylib2", "mylib3"],
679 system_shared_libs: [],
680 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000681 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900682 }
683
684 cc_library {
685 name: "mylib2",
686 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900687 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900688 system_shared_libs: [],
689 stl: "none",
690 stubs: {
691 versions: ["1", "2", "3"],
692 },
693 }
694
695 cc_library {
696 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900697 srcs: ["mylib.cpp"],
698 shared_libs: ["mylib4"],
699 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900700 stl: "none",
701 stubs: {
702 versions: ["10", "11", "12"],
703 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000704 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900705 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900706
707 cc_library {
708 name: "mylib4",
709 srcs: ["mylib.cpp"],
710 system_shared_libs: [],
711 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000712 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900713 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900714 `)
715
Sundong Ahnabb64432019-10-22 13:58:29 +0900716 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900717 copyCmds := apexRule.Args["copy_commands"]
718
719 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800720 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900721
722 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800723 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900724
725 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800726 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900727
Colin Cross7113d202019-11-20 16:39:12 -0800728 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900729
730 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900731 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900732 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900733 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900734
735 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Cross7113d202019-11-20 16:39:12 -0800736 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900737 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800738 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900739
740 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900741 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900742 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900743
744 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900745 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900746
Jooyung Hana57af4a2020-01-23 05:36:59 +0000747 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900748 "lib64/mylib.so",
749 "lib64/mylib3.so",
750 "lib64/mylib4.so",
751 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900752}
753
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900754func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700755 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900756 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900757 name: "myapex2",
758 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900759 native_shared_libs: ["mylib"],
760 }
761
762 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900763 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900764 public_key: "testkey.avbpubkey",
765 private_key: "testkey.pem",
766 }
767
768 cc_library {
769 name: "mylib",
770 srcs: ["mylib.cpp"],
771 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900772 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900773 system_shared_libs: [],
774 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000775 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900776 }
777
778 cc_library {
779 name: "libfoo",
780 srcs: ["mylib.cpp"],
781 shared_libs: ["libbar"],
782 system_shared_libs: [],
783 stl: "none",
784 stubs: {
785 versions: ["10", "20", "30"],
786 },
787 }
788
789 cc_library {
790 name: "libbar",
791 srcs: ["mylib.cpp"],
792 system_shared_libs: [],
793 stl: "none",
794 }
795
Jiyong Park678c8812020-02-07 17:25:49 +0900796 cc_library_static {
797 name: "libbaz",
798 srcs: ["mylib.cpp"],
799 system_shared_libs: [],
800 stl: "none",
801 apex_available: [ "myapex2" ],
802 }
803
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900804 `)
805
Jiyong Park83dc74b2020-01-14 18:38:44 +0900806 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900807 copyCmds := apexRule.Args["copy_commands"]
808
809 // Ensure that direct non-stubs dep is always included
810 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
811
812 // Ensure that indirect stubs dep is not included
813 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
814
815 // Ensure that dependency of stubs is not included
816 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
817
Jiyong Park83dc74b2020-01-14 18:38:44 +0900818 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900819
820 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900821 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900822 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900823 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900824
Jiyong Park3ff16992019-12-27 14:11:47 +0900825 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900826
827 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
828 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900829
Artur Satayeva8bd1132020-04-27 18:07:06 +0100830 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100831 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
832 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
833 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900834
Artur Satayeva8bd1132020-04-27 18:07:06 +0100835 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100836 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
837 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
838 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900839}
840
Jooyung Hand3639552019-08-09 12:57:43 +0900841func TestApexWithRuntimeLibsDependency(t *testing.T) {
842 /*
843 myapex
844 |
845 v (runtime_libs)
846 mylib ------+------> libfoo [provides stub]
847 |
848 `------> libbar
849 */
850 ctx, _ := testApex(t, `
851 apex {
852 name: "myapex",
853 key: "myapex.key",
854 native_shared_libs: ["mylib"],
855 }
856
857 apex_key {
858 name: "myapex.key",
859 public_key: "testkey.avbpubkey",
860 private_key: "testkey.pem",
861 }
862
863 cc_library {
864 name: "mylib",
865 srcs: ["mylib.cpp"],
866 runtime_libs: ["libfoo", "libbar"],
867 system_shared_libs: [],
868 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000869 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900870 }
871
872 cc_library {
873 name: "libfoo",
874 srcs: ["mylib.cpp"],
875 system_shared_libs: [],
876 stl: "none",
877 stubs: {
878 versions: ["10", "20", "30"],
879 },
880 }
881
882 cc_library {
883 name: "libbar",
884 srcs: ["mylib.cpp"],
885 system_shared_libs: [],
886 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000887 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900888 }
889
890 `)
891
Sundong Ahnabb64432019-10-22 13:58:29 +0900892 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900893 copyCmds := apexRule.Args["copy_commands"]
894
895 // Ensure that direct non-stubs dep is always included
896 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
897
898 // Ensure that indirect stubs dep is not included
899 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
900
901 // Ensure that runtime_libs dep in included
902 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
903
Sundong Ahnabb64432019-10-22 13:58:29 +0900904 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900905 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
906 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900907
908}
909
Jooyung Han8ce8db92020-05-15 19:05:05 +0900910func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
911 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
912 bp := `
913 apex {
914 name: "com.android.runtime",
915 key: "com.android.runtime.key",
916 native_shared_libs: ["libc"],
917 }
918
919 apex_key {
920 name: "com.android.runtime.key",
921 public_key: "testkey.avbpubkey",
922 private_key: "testkey.pem",
923 }
924
925 cc_library {
926 name: "libc",
927 no_libcrt: true,
928 nocrt: true,
929 stl: "none",
930 system_shared_libs: [],
931 stubs: { versions: ["1"] },
932 apex_available: ["com.android.runtime"],
933
934 sanitize: {
935 hwaddress: true,
936 }
937 }
938
939 cc_prebuilt_library_shared {
940 name: "libclang_rt.hwasan-aarch64-android",
941 no_libcrt: true,
942 nocrt: true,
943 stl: "none",
944 system_shared_libs: [],
945 srcs: [""],
946 stubs: { versions: ["1"] },
947
948 sanitize: {
949 never: true,
950 },
951 }
952 `
953 // override bp to use hard-coded names: com.android.runtime and libc
954 fs["Android.bp"] = []byte(bp)
955 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
956 })
957
958 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
959 "lib64/bionic/libc.so",
960 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
961 })
962
963 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
964
965 installed := hwasan.Description("install libclang_rt.hwasan")
966 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
967
968 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
969 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
970 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
971}
972
973func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
974 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
975 bp := `
976 apex {
977 name: "com.android.runtime",
978 key: "com.android.runtime.key",
979 native_shared_libs: ["libc"],
980 }
981
982 apex_key {
983 name: "com.android.runtime.key",
984 public_key: "testkey.avbpubkey",
985 private_key: "testkey.pem",
986 }
987
988 cc_library {
989 name: "libc",
990 no_libcrt: true,
991 nocrt: true,
992 stl: "none",
993 system_shared_libs: [],
994 stubs: { versions: ["1"] },
995 apex_available: ["com.android.runtime"],
996 }
997
998 cc_prebuilt_library_shared {
999 name: "libclang_rt.hwasan-aarch64-android",
1000 no_libcrt: true,
1001 nocrt: true,
1002 stl: "none",
1003 system_shared_libs: [],
1004 srcs: [""],
1005 stubs: { versions: ["1"] },
1006
1007 sanitize: {
1008 never: true,
1009 },
1010 }
1011 `
1012 // override bp to use hard-coded names: com.android.runtime and libc
1013 fs["Android.bp"] = []byte(bp)
1014 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1015
1016 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1017 })
1018
1019 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1020 "lib64/bionic/libc.so",
1021 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1022 })
1023
1024 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1025
1026 installed := hwasan.Description("install libclang_rt.hwasan")
1027 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1028
1029 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1030 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1031 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1032}
1033
Jooyung Han61b66e92020-03-21 14:21:46 +00001034func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1035 testcases := []struct {
1036 name string
1037 minSdkVersion string
1038 shouldLink string
1039 shouldNotLink []string
1040 }{
1041 {
Jooyung Han75568392020-03-20 04:29:24 +09001042 name: "should link to the latest",
Jooyung Han61b66e92020-03-21 14:21:46 +00001043 minSdkVersion: "current",
1044 shouldLink: "30",
1045 shouldNotLink: []string{"29"},
1046 },
1047 {
1048 name: "should link to llndk#29",
1049 minSdkVersion: "29",
1050 shouldLink: "29",
1051 shouldNotLink: []string{"30"},
1052 },
1053 }
1054 for _, tc := range testcases {
1055 t.Run(tc.name, func(t *testing.T) {
1056 ctx, _ := testApex(t, `
1057 apex {
1058 name: "myapex",
1059 key: "myapex.key",
1060 use_vendor: true,
1061 native_shared_libs: ["mylib"],
1062 min_sdk_version: "`+tc.minSdkVersion+`",
1063 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001064
Jooyung Han61b66e92020-03-21 14:21:46 +00001065 apex_key {
1066 name: "myapex.key",
1067 public_key: "testkey.avbpubkey",
1068 private_key: "testkey.pem",
1069 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001070
Jooyung Han61b66e92020-03-21 14:21:46 +00001071 cc_library {
1072 name: "mylib",
1073 srcs: ["mylib.cpp"],
1074 vendor_available: true,
1075 shared_libs: ["libbar"],
1076 system_shared_libs: [],
1077 stl: "none",
1078 apex_available: [ "myapex" ],
1079 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001080
Jooyung Han61b66e92020-03-21 14:21:46 +00001081 cc_library {
1082 name: "libbar",
1083 srcs: ["mylib.cpp"],
1084 system_shared_libs: [],
1085 stl: "none",
1086 stubs: { versions: ["29","30"] },
1087 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001088
Jooyung Han61b66e92020-03-21 14:21:46 +00001089 llndk_library {
1090 name: "libbar",
1091 symbol_file: "",
1092 }
1093 `, func(fs map[string][]byte, config android.Config) {
1094 setUseVendorWhitelistForTest(config, []string{"myapex"})
1095 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001096
Jooyung Han61b66e92020-03-21 14:21:46 +00001097 // Ensure that LLNDK dep is not included
1098 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1099 "lib64/mylib.so",
1100 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001101
Jooyung Han61b66e92020-03-21 14:21:46 +00001102 // Ensure that LLNDK dep is required
1103 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1104 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1105 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001106
Jooyung Han61b66e92020-03-21 14:21:46 +00001107 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1108 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1109 for _, ver := range tc.shouldNotLink {
1110 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1111 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001112
Jooyung Han61b66e92020-03-21 14:21:46 +00001113 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1114 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1115 })
1116 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001117}
1118
Jiyong Park25fc6a92018-11-18 18:02:45 +09001119func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001120 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001121 apex {
1122 name: "myapex",
1123 key: "myapex.key",
1124 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1125 }
1126
1127 apex_key {
1128 name: "myapex.key",
1129 public_key: "testkey.avbpubkey",
1130 private_key: "testkey.pem",
1131 }
1132
1133 cc_library {
1134 name: "mylib",
1135 srcs: ["mylib.cpp"],
1136 shared_libs: ["libdl#27"],
1137 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001138 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001139 }
1140
1141 cc_library_shared {
1142 name: "mylib_shared",
1143 srcs: ["mylib.cpp"],
1144 shared_libs: ["libdl#27"],
1145 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001146 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001147 }
1148
1149 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001150 name: "libBootstrap",
1151 srcs: ["mylib.cpp"],
1152 stl: "none",
1153 bootstrap: true,
1154 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001155 `)
1156
Sundong Ahnabb64432019-10-22 13:58:29 +09001157 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001158 copyCmds := apexRule.Args["copy_commands"]
1159
1160 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001161 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001162 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1163 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001164
1165 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001166 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001167
Colin Cross7113d202019-11-20 16:39:12 -08001168 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1169 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1170 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001171
1172 // For dependency to libc
1173 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001174 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001175 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001176 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001177 // ... Cflags from stub is correctly exported to mylib
1178 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1179 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1180
1181 // For dependency to libm
1182 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001183 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001184 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001185 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001186 // ... and is not compiling with the stub
1187 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1188 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1189
1190 // For dependency to libdl
1191 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001192 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001193 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001194 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1195 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001196 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001197 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001198 // ... Cflags from stub is correctly exported to mylib
1199 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1200 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001201
1202 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001203 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1204 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1205 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1206 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001207}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001208
Jooyung Han03b51852020-02-26 22:45:42 +09001209func TestApexUseStubsAccordingToMinSdkVersionInUnbundledBuild(t *testing.T) {
1210 // there are three links between liba --> libz
1211 // 1) myapex -> libx -> liba -> libz : this should be #2 link, but fallback to #1
1212 // 2) otherapex -> liby -> liba -> libz : this should be #3 link
1213 // 3) (platform) -> liba -> libz : this should be non-stub link
1214 ctx, _ := testApex(t, `
1215 apex {
1216 name: "myapex",
1217 key: "myapex.key",
1218 native_shared_libs: ["libx"],
1219 min_sdk_version: "2",
1220 }
1221
1222 apex {
1223 name: "otherapex",
1224 key: "myapex.key",
1225 native_shared_libs: ["liby"],
1226 min_sdk_version: "3",
1227 }
1228
1229 apex_key {
1230 name: "myapex.key",
1231 public_key: "testkey.avbpubkey",
1232 private_key: "testkey.pem",
1233 }
1234
1235 cc_library {
1236 name: "libx",
1237 shared_libs: ["liba"],
1238 system_shared_libs: [],
1239 stl: "none",
1240 apex_available: [ "myapex" ],
1241 }
1242
1243 cc_library {
1244 name: "liby",
1245 shared_libs: ["liba"],
1246 system_shared_libs: [],
1247 stl: "none",
1248 apex_available: [ "otherapex" ],
1249 }
1250
1251 cc_library {
1252 name: "liba",
1253 shared_libs: ["libz"],
1254 system_shared_libs: [],
1255 stl: "none",
1256 apex_available: [
1257 "//apex_available:anyapex",
1258 "//apex_available:platform",
1259 ],
1260 }
1261
1262 cc_library {
1263 name: "libz",
1264 system_shared_libs: [],
1265 stl: "none",
1266 stubs: {
1267 versions: ["1", "3"],
1268 },
1269 }
1270 `, withUnbundledBuild)
1271
1272 expectLink := func(from, from_variant, to, to_variant string) {
1273 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1274 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1275 }
1276 expectNoLink := func(from, from_variant, to, to_variant string) {
1277 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1278 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1279 }
1280 // platform liba is linked to non-stub version
1281 expectLink("liba", "shared", "libz", "shared")
1282 // liba in myapex is linked to #1
1283 expectLink("liba", "shared_myapex", "libz", "shared_1")
1284 expectNoLink("liba", "shared_myapex", "libz", "shared_3")
1285 expectNoLink("liba", "shared_myapex", "libz", "shared")
1286 // liba in otherapex is linked to #3
1287 expectLink("liba", "shared_otherapex", "libz", "shared_3")
1288 expectNoLink("liba", "shared_otherapex", "libz", "shared_1")
1289 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1290}
1291
Jooyung Hanaed150d2020-04-02 01:41:41 +09001292func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1293 ctx, _ := testApex(t, `
1294 apex {
1295 name: "myapex",
1296 key: "myapex.key",
1297 native_shared_libs: ["libx"],
1298 min_sdk_version: "R",
1299 }
1300
1301 apex_key {
1302 name: "myapex.key",
1303 public_key: "testkey.avbpubkey",
1304 private_key: "testkey.pem",
1305 }
1306
1307 cc_library {
1308 name: "libx",
1309 shared_libs: ["libz"],
1310 system_shared_libs: [],
1311 stl: "none",
1312 apex_available: [ "myapex" ],
1313 }
1314
1315 cc_library {
1316 name: "libz",
1317 system_shared_libs: [],
1318 stl: "none",
1319 stubs: {
1320 versions: ["29", "R"],
1321 },
1322 }
1323 `, func(fs map[string][]byte, config android.Config) {
1324 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1325 })
1326
1327 expectLink := func(from, from_variant, to, to_variant string) {
1328 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1329 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1330 }
1331 expectNoLink := func(from, from_variant, to, to_variant string) {
1332 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1333 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1334 }
1335 // 9000 is quite a magic number.
1336 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1337 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1338 // to distinguish them from finalized and future_api(10000)
1339 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1340 // (refer android/api_levels.go)
1341 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1342 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1343 expectNoLink("libx", "shared_myapex", "libz", "shared")
1344}
1345
Jooyung Han03b51852020-02-26 22:45:42 +09001346func TestApexMinSdkVersionDefaultsToLatest(t *testing.T) {
1347 ctx, _ := testApex(t, `
1348 apex {
1349 name: "myapex",
1350 key: "myapex.key",
1351 native_shared_libs: ["libx"],
1352 }
1353
1354 apex_key {
1355 name: "myapex.key",
1356 public_key: "testkey.avbpubkey",
1357 private_key: "testkey.pem",
1358 }
1359
1360 cc_library {
1361 name: "libx",
1362 shared_libs: ["libz"],
1363 system_shared_libs: [],
1364 stl: "none",
1365 apex_available: [ "myapex" ],
1366 }
1367
1368 cc_library {
1369 name: "libz",
1370 system_shared_libs: [],
1371 stl: "none",
1372 stubs: {
1373 versions: ["1", "2"],
1374 },
1375 }
1376 `)
1377
1378 expectLink := func(from, from_variant, to, to_variant string) {
1379 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1380 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1381 }
1382 expectNoLink := func(from, from_variant, to, to_variant string) {
1383 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1384 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1385 }
1386 expectLink("libx", "shared_myapex", "libz", "shared_2")
1387 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1388 expectNoLink("libx", "shared_myapex", "libz", "shared")
1389}
1390
1391func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1392 ctx, _ := testApex(t, `
1393 apex {
1394 name: "myapex",
1395 key: "myapex.key",
1396 native_shared_libs: ["libx"],
1397 }
1398
1399 apex_key {
1400 name: "myapex.key",
1401 public_key: "testkey.avbpubkey",
1402 private_key: "testkey.pem",
1403 }
1404
1405 cc_library {
1406 name: "libx",
1407 system_shared_libs: [],
1408 stl: "none",
1409 apex_available: [ "myapex" ],
1410 stubs: {
1411 versions: ["1", "2"],
1412 },
1413 }
1414
1415 cc_library {
1416 name: "libz",
1417 shared_libs: ["libx"],
1418 system_shared_libs: [],
1419 stl: "none",
1420 }
1421 `)
1422
1423 expectLink := func(from, from_variant, to, to_variant string) {
1424 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1425 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1426 }
1427 expectNoLink := func(from, from_variant, to, to_variant string) {
1428 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1429 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1430 }
1431 expectLink("libz", "shared", "libx", "shared_2")
1432 expectNoLink("libz", "shared", "libz", "shared_1")
1433 expectNoLink("libz", "shared", "libz", "shared")
1434}
1435
Jooyung Han75568392020-03-20 04:29:24 +09001436func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001437 ctx, _ := testApex(t, `
1438 apex {
1439 name: "myapex",
1440 key: "myapex.key",
1441 native_shared_libs: ["libx"],
1442 min_sdk_version: "29",
1443 }
1444
1445 apex_key {
1446 name: "myapex.key",
1447 public_key: "testkey.avbpubkey",
1448 private_key: "testkey.pem",
1449 }
1450
1451 cc_library {
1452 name: "libx",
1453 shared_libs: ["libbar"],
1454 apex_available: [ "myapex" ],
1455 }
1456
1457 cc_library {
1458 name: "libbar",
1459 stubs: {
1460 versions: ["29", "30"],
1461 },
1462 }
Jooyung Han75568392020-03-20 04:29:24 +09001463 `, func(fs map[string][]byte, config android.Config) {
1464 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1465 })
Jooyung Han03b51852020-02-26 22:45:42 +09001466 expectLink := func(from, from_variant, to, to_variant string) {
1467 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1468 libFlags := ld.Args["libFlags"]
1469 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1470 }
Jooyung Han75568392020-03-20 04:29:24 +09001471 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001472}
1473
Jooyung Han75568392020-03-20 04:29:24 +09001474func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001475 ctx, _ := testApex(t, `
1476 apex {
1477 name: "myapex",
1478 key: "myapex.key",
1479 native_shared_libs: ["libx"],
1480 min_sdk_version: "29",
1481 }
1482
1483 apex_key {
1484 name: "myapex.key",
1485 public_key: "testkey.avbpubkey",
1486 private_key: "testkey.pem",
1487 }
1488
1489 cc_library {
1490 name: "libx",
1491 apex_available: [ "myapex" ],
1492 }
Jooyung Han75568392020-03-20 04:29:24 +09001493 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001494
1495 // ensure apex variant of c++ is linked with static unwinder
1496 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1497 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1498 // note that platform variant is not.
1499 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1500 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001501}
1502
1503func TestInvalidMinSdkVersion(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001504 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001505 apex {
1506 name: "myapex",
1507 key: "myapex.key",
1508 native_shared_libs: ["libx"],
1509 min_sdk_version: "29",
1510 }
1511
1512 apex_key {
1513 name: "myapex.key",
1514 public_key: "testkey.avbpubkey",
1515 private_key: "testkey.pem",
1516 }
1517
1518 cc_library {
1519 name: "libx",
1520 shared_libs: ["libz"],
1521 system_shared_libs: [],
1522 stl: "none",
1523 apex_available: [ "myapex" ],
1524 }
1525
1526 cc_library {
1527 name: "libz",
1528 system_shared_libs: [],
1529 stl: "none",
1530 stubs: {
1531 versions: ["30"],
1532 },
1533 }
Jooyung Han75568392020-03-20 04:29:24 +09001534 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001535
Jooyung Hanaed150d2020-04-02 01:41:41 +09001536 testApexError(t, `"myapex" .*: min_sdk_version: SDK version should be .*`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001537 apex {
1538 name: "myapex",
1539 key: "myapex.key",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001540 min_sdk_version: "abc",
Jooyung Han03b51852020-02-26 22:45:42 +09001541 }
1542
1543 apex_key {
1544 name: "myapex.key",
1545 public_key: "testkey.avbpubkey",
1546 private_key: "testkey.pem",
1547 }
1548 `)
1549}
1550
Artur Satayev8cf899a2020-04-15 17:29:42 +01001551func TestJavaStableSdkVersion(t *testing.T) {
1552 testCases := []struct {
1553 name string
1554 expectedError string
1555 bp string
1556 }{
1557 {
1558 name: "Non-updatable apex with non-stable dep",
1559 bp: `
1560 apex {
1561 name: "myapex",
1562 java_libs: ["myjar"],
1563 key: "myapex.key",
1564 }
1565 apex_key {
1566 name: "myapex.key",
1567 public_key: "testkey.avbpubkey",
1568 private_key: "testkey.pem",
1569 }
1570 java_library {
1571 name: "myjar",
1572 srcs: ["foo/bar/MyClass.java"],
1573 sdk_version: "core_platform",
1574 apex_available: ["myapex"],
1575 }
1576 `,
1577 },
1578 {
1579 name: "Updatable apex with stable dep",
1580 bp: `
1581 apex {
1582 name: "myapex",
1583 java_libs: ["myjar"],
1584 key: "myapex.key",
1585 updatable: true,
1586 min_sdk_version: "29",
1587 }
1588 apex_key {
1589 name: "myapex.key",
1590 public_key: "testkey.avbpubkey",
1591 private_key: "testkey.pem",
1592 }
1593 java_library {
1594 name: "myjar",
1595 srcs: ["foo/bar/MyClass.java"],
1596 sdk_version: "current",
1597 apex_available: ["myapex"],
1598 }
1599 `,
1600 },
1601 {
1602 name: "Updatable apex with non-stable dep",
1603 expectedError: "cannot depend on \"myjar\"",
1604 bp: `
1605 apex {
1606 name: "myapex",
1607 java_libs: ["myjar"],
1608 key: "myapex.key",
1609 updatable: true,
1610 }
1611 apex_key {
1612 name: "myapex.key",
1613 public_key: "testkey.avbpubkey",
1614 private_key: "testkey.pem",
1615 }
1616 java_library {
1617 name: "myjar",
1618 srcs: ["foo/bar/MyClass.java"],
1619 sdk_version: "core_platform",
1620 apex_available: ["myapex"],
1621 }
1622 `,
1623 },
1624 {
1625 name: "Updatable apex with non-stable transitive dep",
1626 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1627 bp: `
1628 apex {
1629 name: "myapex",
1630 java_libs: ["myjar"],
1631 key: "myapex.key",
1632 updatable: true,
1633 }
1634 apex_key {
1635 name: "myapex.key",
1636 public_key: "testkey.avbpubkey",
1637 private_key: "testkey.pem",
1638 }
1639 java_library {
1640 name: "myjar",
1641 srcs: ["foo/bar/MyClass.java"],
1642 sdk_version: "current",
1643 apex_available: ["myapex"],
1644 static_libs: ["transitive-jar"],
1645 }
1646 java_library {
1647 name: "transitive-jar",
1648 srcs: ["foo/bar/MyClass.java"],
1649 sdk_version: "core_platform",
1650 apex_available: ["myapex"],
1651 }
1652 `,
1653 },
1654 }
1655
1656 for _, test := range testCases {
1657 t.Run(test.name, func(t *testing.T) {
1658 if test.expectedError == "" {
1659 testApex(t, test.bp)
1660 } else {
1661 testApexError(t, test.expectedError, test.bp)
1662 }
1663 })
1664 }
1665}
1666
Jiyong Park7c2ee712018-12-07 00:42:25 +09001667func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001668 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001669 apex {
1670 name: "myapex",
1671 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001672 native_shared_libs: ["mylib"],
1673 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001674 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001675 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001676 }
1677
1678 apex_key {
1679 name: "myapex.key",
1680 public_key: "testkey.avbpubkey",
1681 private_key: "testkey.pem",
1682 }
1683
1684 prebuilt_etc {
1685 name: "myetc",
1686 src: "myprebuilt",
1687 sub_dir: "foo/bar",
1688 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001689
1690 cc_library {
1691 name: "mylib",
1692 srcs: ["mylib.cpp"],
1693 relative_install_path: "foo/bar",
1694 system_shared_libs: [],
1695 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001696 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001697 }
1698
1699 cc_binary {
1700 name: "mybin",
1701 srcs: ["mylib.cpp"],
1702 relative_install_path: "foo/bar",
1703 system_shared_libs: [],
1704 static_executable: true,
1705 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001706 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001707 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001708 `)
1709
Sundong Ahnabb64432019-10-22 13:58:29 +09001710 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001711 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1712
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001713 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001714 ensureListContains(t, dirs, "etc")
1715 ensureListContains(t, dirs, "etc/foo")
1716 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001717 ensureListContains(t, dirs, "lib64")
1718 ensureListContains(t, dirs, "lib64/foo")
1719 ensureListContains(t, dirs, "lib64/foo/bar")
1720 ensureListContains(t, dirs, "lib")
1721 ensureListContains(t, dirs, "lib/foo")
1722 ensureListContains(t, dirs, "lib/foo/bar")
1723
Jiyong Parkbd13e442019-03-15 18:10:35 +09001724 ensureListContains(t, dirs, "bin")
1725 ensureListContains(t, dirs, "bin/foo")
1726 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001727}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001728
Jooyung Han35155c42020-02-06 17:33:20 +09001729func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
1730 ctx, _ := testApex(t, `
1731 apex {
1732 name: "myapex",
1733 key: "myapex.key",
1734 multilib: {
1735 both: {
1736 native_shared_libs: ["mylib"],
1737 binaries: ["mybin"],
1738 },
1739 },
1740 compile_multilib: "both",
1741 native_bridge_supported: true,
1742 }
1743
1744 apex_key {
1745 name: "myapex.key",
1746 public_key: "testkey.avbpubkey",
1747 private_key: "testkey.pem",
1748 }
1749
1750 cc_library {
1751 name: "mylib",
1752 relative_install_path: "foo/bar",
1753 system_shared_libs: [],
1754 stl: "none",
1755 apex_available: [ "myapex" ],
1756 native_bridge_supported: true,
1757 }
1758
1759 cc_binary {
1760 name: "mybin",
1761 relative_install_path: "foo/bar",
1762 system_shared_libs: [],
1763 static_executable: true,
1764 stl: "none",
1765 apex_available: [ "myapex" ],
1766 native_bridge_supported: true,
1767 compile_multilib: "both", // default is "first" for binary
1768 multilib: {
1769 lib64: {
1770 suffix: "64",
1771 },
1772 },
1773 }
1774 `, withNativeBridgeEnabled)
1775 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1776 "bin/foo/bar/mybin",
1777 "bin/foo/bar/mybin64",
1778 "bin/arm/foo/bar/mybin",
1779 "bin/arm64/foo/bar/mybin64",
1780 "lib/foo/bar/mylib.so",
1781 "lib/arm/foo/bar/mylib.so",
1782 "lib64/foo/bar/mylib.so",
1783 "lib64/arm64/foo/bar/mylib.so",
1784 })
1785}
1786
Jiyong Parkda6eb592018-12-19 17:12:36 +09001787func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001788 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09001789 apex {
1790 name: "myapex",
1791 key: "myapex.key",
1792 native_shared_libs: ["mylib"],
1793 use_vendor: true,
1794 }
1795
1796 apex_key {
1797 name: "myapex.key",
1798 public_key: "testkey.avbpubkey",
1799 private_key: "testkey.pem",
1800 }
1801
1802 cc_library {
1803 name: "mylib",
1804 srcs: ["mylib.cpp"],
1805 shared_libs: ["mylib2"],
1806 system_shared_libs: [],
1807 vendor_available: true,
1808 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001809 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001810 }
1811
1812 cc_library {
1813 name: "mylib2",
1814 srcs: ["mylib.cpp"],
1815 system_shared_libs: [],
1816 vendor_available: true,
1817 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001818 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001819 }
Jooyung Handc782442019-11-01 03:14:38 +09001820 `, func(fs map[string][]byte, config android.Config) {
1821 setUseVendorWhitelistForTest(config, []string{"myapex"})
1822 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09001823
1824 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09001825 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09001826 for _, implicit := range i.Implicits {
1827 inputsList = append(inputsList, implicit.String())
1828 }
1829 }
1830 inputsString := strings.Join(inputsList, " ")
1831
1832 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08001833 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
1834 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001835
1836 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08001837 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
1838 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001839}
Jiyong Park16e91a02018-12-20 18:18:08 +09001840
Jooyung Handc782442019-11-01 03:14:38 +09001841func TestUseVendorRestriction(t *testing.T) {
1842 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
1843 apex {
1844 name: "myapex",
1845 key: "myapex.key",
1846 use_vendor: true,
1847 }
1848 apex_key {
1849 name: "myapex.key",
1850 public_key: "testkey.avbpubkey",
1851 private_key: "testkey.pem",
1852 }
1853 `, func(fs map[string][]byte, config android.Config) {
1854 setUseVendorWhitelistForTest(config, []string{""})
1855 })
1856 // no error with whitelist
1857 testApex(t, `
1858 apex {
1859 name: "myapex",
1860 key: "myapex.key",
1861 use_vendor: true,
1862 }
1863 apex_key {
1864 name: "myapex.key",
1865 public_key: "testkey.avbpubkey",
1866 private_key: "testkey.pem",
1867 }
1868 `, func(fs map[string][]byte, config android.Config) {
1869 setUseVendorWhitelistForTest(config, []string{"myapex"})
1870 })
1871}
1872
Jooyung Han5c998b92019-06-27 11:30:33 +09001873func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
1874 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
1875 apex {
1876 name: "myapex",
1877 key: "myapex.key",
1878 native_shared_libs: ["mylib"],
1879 use_vendor: true,
1880 }
1881
1882 apex_key {
1883 name: "myapex.key",
1884 public_key: "testkey.avbpubkey",
1885 private_key: "testkey.pem",
1886 }
1887
1888 cc_library {
1889 name: "mylib",
1890 srcs: ["mylib.cpp"],
1891 system_shared_libs: [],
1892 stl: "none",
1893 }
1894 `)
1895}
1896
Jiyong Park16e91a02018-12-20 18:18:08 +09001897func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001898 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09001899 apex {
1900 name: "myapex",
1901 key: "myapex.key",
1902 native_shared_libs: ["mylib"],
1903 }
1904
1905 apex_key {
1906 name: "myapex.key",
1907 public_key: "testkey.avbpubkey",
1908 private_key: "testkey.pem",
1909 }
1910
1911 cc_library {
1912 name: "mylib",
1913 srcs: ["mylib.cpp"],
1914 system_shared_libs: [],
1915 stl: "none",
1916 stubs: {
1917 versions: ["1", "2", "3"],
1918 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001919 apex_available: [
1920 "//apex_available:platform",
1921 "myapex",
1922 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09001923 }
1924
1925 cc_binary {
1926 name: "not_in_apex",
1927 srcs: ["mylib.cpp"],
1928 static_libs: ["mylib"],
1929 static_executable: true,
1930 system_shared_libs: [],
1931 stl: "none",
1932 }
Jiyong Park16e91a02018-12-20 18:18:08 +09001933 `)
1934
Colin Cross7113d202019-11-20 16:39:12 -08001935 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09001936
1937 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08001938 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09001939}
Jiyong Park9335a262018-12-24 11:31:58 +09001940
1941func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001942 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09001943 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001944 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09001945 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001946 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09001947 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09001948 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09001949 }
1950
1951 cc_library {
1952 name: "mylib",
1953 srcs: ["mylib.cpp"],
1954 system_shared_libs: [],
1955 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001956 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09001957 }
1958
1959 apex_key {
1960 name: "myapex.key",
1961 public_key: "testkey.avbpubkey",
1962 private_key: "testkey.pem",
1963 }
1964
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001965 android_app_certificate {
1966 name: "myapex.certificate",
1967 certificate: "testkey",
1968 }
1969
1970 android_app_certificate {
1971 name: "myapex.certificate.override",
1972 certificate: "testkey.override",
1973 }
1974
Jiyong Park9335a262018-12-24 11:31:58 +09001975 `)
1976
1977 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09001978 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09001979
1980 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
1981 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
1982 "vendor/foo/devkeys/testkey.avbpubkey")
1983 }
1984 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
1985 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
1986 "vendor/foo/devkeys/testkey.pem")
1987 }
1988
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001989 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09001990 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001991 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09001992 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001993 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09001994 }
1995}
Jiyong Park58e364a2019-01-19 19:24:06 +09001996
Jooyung Hanf121a652019-12-17 14:30:11 +09001997func TestCertificate(t *testing.T) {
1998 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
1999 ctx, _ := testApex(t, `
2000 apex {
2001 name: "myapex",
2002 key: "myapex.key",
2003 }
2004 apex_key {
2005 name: "myapex.key",
2006 public_key: "testkey.avbpubkey",
2007 private_key: "testkey.pem",
2008 }`)
2009 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2010 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2011 if actual := rule.Args["certificates"]; actual != expected {
2012 t.Errorf("certificates should be %q, not %q", expected, actual)
2013 }
2014 })
2015 t.Run("override when unspecified", func(t *testing.T) {
2016 ctx, _ := testApex(t, `
2017 apex {
2018 name: "myapex_keytest",
2019 key: "myapex.key",
2020 file_contexts: ":myapex-file_contexts",
2021 }
2022 apex_key {
2023 name: "myapex.key",
2024 public_key: "testkey.avbpubkey",
2025 private_key: "testkey.pem",
2026 }
2027 android_app_certificate {
2028 name: "myapex.certificate.override",
2029 certificate: "testkey.override",
2030 }`)
2031 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2032 expected := "testkey.override.x509.pem testkey.override.pk8"
2033 if actual := rule.Args["certificates"]; actual != expected {
2034 t.Errorf("certificates should be %q, not %q", expected, actual)
2035 }
2036 })
2037 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2038 ctx, _ := testApex(t, `
2039 apex {
2040 name: "myapex",
2041 key: "myapex.key",
2042 certificate: ":myapex.certificate",
2043 }
2044 apex_key {
2045 name: "myapex.key",
2046 public_key: "testkey.avbpubkey",
2047 private_key: "testkey.pem",
2048 }
2049 android_app_certificate {
2050 name: "myapex.certificate",
2051 certificate: "testkey",
2052 }`)
2053 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2054 expected := "testkey.x509.pem testkey.pk8"
2055 if actual := rule.Args["certificates"]; actual != expected {
2056 t.Errorf("certificates should be %q, not %q", expected, actual)
2057 }
2058 })
2059 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2060 ctx, _ := testApex(t, `
2061 apex {
2062 name: "myapex_keytest",
2063 key: "myapex.key",
2064 file_contexts: ":myapex-file_contexts",
2065 certificate: ":myapex.certificate",
2066 }
2067 apex_key {
2068 name: "myapex.key",
2069 public_key: "testkey.avbpubkey",
2070 private_key: "testkey.pem",
2071 }
2072 android_app_certificate {
2073 name: "myapex.certificate.override",
2074 certificate: "testkey.override",
2075 }`)
2076 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2077 expected := "testkey.override.x509.pem testkey.override.pk8"
2078 if actual := rule.Args["certificates"]; actual != expected {
2079 t.Errorf("certificates should be %q, not %q", expected, actual)
2080 }
2081 })
2082 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2083 ctx, _ := testApex(t, `
2084 apex {
2085 name: "myapex",
2086 key: "myapex.key",
2087 certificate: "testkey",
2088 }
2089 apex_key {
2090 name: "myapex.key",
2091 public_key: "testkey.avbpubkey",
2092 private_key: "testkey.pem",
2093 }`)
2094 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2095 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2096 if actual := rule.Args["certificates"]; actual != expected {
2097 t.Errorf("certificates should be %q, not %q", expected, actual)
2098 }
2099 })
2100 t.Run("override when specified as <name>", func(t *testing.T) {
2101 ctx, _ := testApex(t, `
2102 apex {
2103 name: "myapex_keytest",
2104 key: "myapex.key",
2105 file_contexts: ":myapex-file_contexts",
2106 certificate: "testkey",
2107 }
2108 apex_key {
2109 name: "myapex.key",
2110 public_key: "testkey.avbpubkey",
2111 private_key: "testkey.pem",
2112 }
2113 android_app_certificate {
2114 name: "myapex.certificate.override",
2115 certificate: "testkey.override",
2116 }`)
2117 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2118 expected := "testkey.override.x509.pem testkey.override.pk8"
2119 if actual := rule.Args["certificates"]; actual != expected {
2120 t.Errorf("certificates should be %q, not %q", expected, actual)
2121 }
2122 })
2123}
2124
Jiyong Park58e364a2019-01-19 19:24:06 +09002125func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002126 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002127 apex {
2128 name: "myapex",
2129 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002130 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002131 }
2132
2133 apex {
2134 name: "otherapex",
2135 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002136 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002137 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002138 }
2139
2140 apex_key {
2141 name: "myapex.key",
2142 public_key: "testkey.avbpubkey",
2143 private_key: "testkey.pem",
2144 }
2145
2146 cc_library {
2147 name: "mylib",
2148 srcs: ["mylib.cpp"],
2149 system_shared_libs: [],
2150 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002151 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002152 "myapex",
2153 "otherapex",
2154 ],
Jooyung Han24282772020-03-21 23:20:55 +09002155 recovery_available: true,
Jiyong Park58e364a2019-01-19 19:24:06 +09002156 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002157 cc_library {
2158 name: "mylib2",
2159 srcs: ["mylib.cpp"],
2160 system_shared_libs: [],
2161 stl: "none",
2162 apex_available: [
2163 "myapex",
2164 "otherapex",
2165 ],
2166 use_apex_name_macro: true,
2167 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002168 `)
2169
Jooyung Hanc87a0592020-03-02 17:44:33 +09002170 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002171 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002172 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002173 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002174
Jooyung Hanccce2f22020-03-07 03:45:53 +09002175 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002176 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2177 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002178 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002179 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002180
Jooyung Hanccce2f22020-03-07 03:45:53 +09002181 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002182 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2183 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002184 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002185 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002186
Jooyung Hanc87a0592020-03-02 17:44:33 +09002187 // When cc_library sets use_apex_name_macro: true
2188 // apex variants define additional macro to distinguish which apex variant it is built for
2189
2190 // non-APEX variant does not have __ANDROID_APEX__ defined
2191 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2192 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2193
2194 // APEX variant has __ANDROID_APEX__ defined
2195 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002196 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002197 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2198 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002199
Jooyung Hanc87a0592020-03-02 17:44:33 +09002200 // APEX variant has __ANDROID_APEX__ defined
2201 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002202 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002203 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2204 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002205
2206 // recovery variant does not set __ANDROID_SDK_VERSION__
2207 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2208 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2209 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002210}
Jiyong Park7e636d02019-01-28 16:16:54 +09002211
2212func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002213 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002214 apex {
2215 name: "myapex",
2216 key: "myapex.key",
2217 native_shared_libs: ["mylib"],
2218 }
2219
2220 apex_key {
2221 name: "myapex.key",
2222 public_key: "testkey.avbpubkey",
2223 private_key: "testkey.pem",
2224 }
2225
2226 cc_library_headers {
2227 name: "mylib_headers",
2228 export_include_dirs: ["my_include"],
2229 system_shared_libs: [],
2230 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002231 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002232 }
2233
2234 cc_library {
2235 name: "mylib",
2236 srcs: ["mylib.cpp"],
2237 system_shared_libs: [],
2238 stl: "none",
2239 header_libs: ["mylib_headers"],
2240 export_header_lib_headers: ["mylib_headers"],
2241 stubs: {
2242 versions: ["1", "2", "3"],
2243 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002244 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002245 }
2246
2247 cc_library {
2248 name: "otherlib",
2249 srcs: ["mylib.cpp"],
2250 system_shared_libs: [],
2251 stl: "none",
2252 shared_libs: ["mylib"],
2253 }
2254 `)
2255
Colin Cross7113d202019-11-20 16:39:12 -08002256 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002257
2258 // Ensure that the include path of the header lib is exported to 'otherlib'
2259 ensureContains(t, cFlags, "-Imy_include")
2260}
Alex Light9670d332019-01-29 18:07:33 -08002261
Jiyong Park7cd10e32020-01-14 09:22:18 +09002262type fileInApex struct {
2263 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002264 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002265 isLink bool
2266}
2267
Jooyung Hana57af4a2020-01-23 05:36:59 +00002268func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002269 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002270 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002271 copyCmds := apexRule.Args["copy_commands"]
2272 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002273 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002274 for _, cmd := range strings.Split(copyCmds, "&&") {
2275 cmd = strings.TrimSpace(cmd)
2276 if cmd == "" {
2277 continue
2278 }
2279 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002280 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002281 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002282 switch terms[0] {
2283 case "mkdir":
2284 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002285 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002286 t.Fatal("copyCmds contains invalid cp command", cmd)
2287 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002288 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002289 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002290 isLink = false
2291 case "ln":
2292 if len(terms) != 3 && len(terms) != 4 {
2293 // ln LINK TARGET or ln -s LINK TARGET
2294 t.Fatal("copyCmds contains invalid ln command", cmd)
2295 }
2296 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002297 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002298 isLink = true
2299 default:
2300 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2301 }
2302 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002303 index := strings.Index(dst, imageApexDir)
2304 if index == -1 {
2305 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2306 }
2307 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002308 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002309 }
2310 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002311 return ret
2312}
2313
Jooyung Hana57af4a2020-01-23 05:36:59 +00002314func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2315 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002316 var failed bool
2317 var surplus []string
2318 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002319 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002320 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002321 for _, expected := range files {
2322 if matched, _ := path.Match(expected, file.path); matched {
2323 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002324 mactchFound = true
2325 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002326 }
2327 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002328 if !mactchFound {
2329 surplus = append(surplus, file.path)
2330 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002331 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002332
Jooyung Han31c470b2019-10-18 16:26:59 +09002333 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002334 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002335 t.Log("surplus files", surplus)
2336 failed = true
2337 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002338
2339 if len(files) > len(filesMatched) {
2340 var missing []string
2341 for _, expected := range files {
2342 if !filesMatched[expected] {
2343 missing = append(missing, expected)
2344 }
2345 }
2346 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002347 t.Log("missing files", missing)
2348 failed = true
2349 }
2350 if failed {
2351 t.Fail()
2352 }
2353}
2354
Jooyung Han344d5432019-08-23 11:17:39 +09002355func TestVndkApexCurrent(t *testing.T) {
2356 ctx, _ := testApex(t, `
2357 apex_vndk {
2358 name: "myapex",
2359 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002360 }
2361
2362 apex_key {
2363 name: "myapex.key",
2364 public_key: "testkey.avbpubkey",
2365 private_key: "testkey.pem",
2366 }
2367
2368 cc_library {
2369 name: "libvndk",
2370 srcs: ["mylib.cpp"],
2371 vendor_available: true,
2372 vndk: {
2373 enabled: true,
2374 },
2375 system_shared_libs: [],
2376 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002377 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002378 }
2379
2380 cc_library {
2381 name: "libvndksp",
2382 srcs: ["mylib.cpp"],
2383 vendor_available: true,
2384 vndk: {
2385 enabled: true,
2386 support_system_process: true,
2387 },
2388 system_shared_libs: [],
2389 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002390 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002391 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002392 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002393
Jooyung Hana57af4a2020-01-23 05:36:59 +00002394 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002395 "lib/libvndk.so",
2396 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002397 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002398 "lib64/libvndk.so",
2399 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002400 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002401 "etc/llndk.libraries.VER.txt",
2402 "etc/vndkcore.libraries.VER.txt",
2403 "etc/vndksp.libraries.VER.txt",
2404 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002405 })
Jooyung Han344d5432019-08-23 11:17:39 +09002406}
2407
2408func TestVndkApexWithPrebuilt(t *testing.T) {
2409 ctx, _ := testApex(t, `
2410 apex_vndk {
2411 name: "myapex",
2412 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002413 }
2414
2415 apex_key {
2416 name: "myapex.key",
2417 public_key: "testkey.avbpubkey",
2418 private_key: "testkey.pem",
2419 }
2420
2421 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002422 name: "libvndk",
2423 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002424 vendor_available: true,
2425 vndk: {
2426 enabled: true,
2427 },
2428 system_shared_libs: [],
2429 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002430 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002431 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002432
2433 cc_prebuilt_library_shared {
2434 name: "libvndk.arm",
2435 srcs: ["libvndk.arm.so"],
2436 vendor_available: true,
2437 vndk: {
2438 enabled: true,
2439 },
2440 enabled: false,
2441 arch: {
2442 arm: {
2443 enabled: true,
2444 },
2445 },
2446 system_shared_libs: [],
2447 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002448 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002449 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002450 `+vndkLibrariesTxtFiles("current"),
2451 withFiles(map[string][]byte{
2452 "libvndk.so": nil,
2453 "libvndk.arm.so": nil,
2454 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002455
Jooyung Hana57af4a2020-01-23 05:36:59 +00002456 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002457 "lib/libvndk.so",
2458 "lib/libvndk.arm.so",
2459 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002460 "lib/libc++.so",
2461 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002462 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002463 })
Jooyung Han344d5432019-08-23 11:17:39 +09002464}
2465
Jooyung Han39edb6c2019-11-06 16:53:07 +09002466func vndkLibrariesTxtFiles(vers ...string) (result string) {
2467 for _, v := range vers {
2468 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002469 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002470 result += `
2471 vndk_libraries_txt {
2472 name: "` + txt + `.libraries.txt",
2473 }
2474 `
2475 }
2476 } else {
2477 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2478 result += `
2479 prebuilt_etc {
2480 name: "` + txt + `.libraries.` + v + `.txt",
2481 src: "dummy.txt",
2482 }
2483 `
2484 }
2485 }
2486 }
2487 return
2488}
2489
Jooyung Han344d5432019-08-23 11:17:39 +09002490func TestVndkApexVersion(t *testing.T) {
2491 ctx, _ := testApex(t, `
2492 apex_vndk {
2493 name: "myapex_v27",
2494 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002495 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002496 vndk_version: "27",
2497 }
2498
2499 apex_key {
2500 name: "myapex.key",
2501 public_key: "testkey.avbpubkey",
2502 private_key: "testkey.pem",
2503 }
2504
Jooyung Han31c470b2019-10-18 16:26:59 +09002505 vndk_prebuilt_shared {
2506 name: "libvndk27",
2507 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002508 vendor_available: true,
2509 vndk: {
2510 enabled: true,
2511 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002512 target_arch: "arm64",
2513 arch: {
2514 arm: {
2515 srcs: ["libvndk27_arm.so"],
2516 },
2517 arm64: {
2518 srcs: ["libvndk27_arm64.so"],
2519 },
2520 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002521 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002522 }
2523
2524 vndk_prebuilt_shared {
2525 name: "libvndk27",
2526 version: "27",
2527 vendor_available: true,
2528 vndk: {
2529 enabled: true,
2530 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002531 target_arch: "x86_64",
2532 arch: {
2533 x86: {
2534 srcs: ["libvndk27_x86.so"],
2535 },
2536 x86_64: {
2537 srcs: ["libvndk27_x86_64.so"],
2538 },
2539 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09002540 }
2541 `+vndkLibrariesTxtFiles("27"),
2542 withFiles(map[string][]byte{
2543 "libvndk27_arm.so": nil,
2544 "libvndk27_arm64.so": nil,
2545 "libvndk27_x86.so": nil,
2546 "libvndk27_x86_64.so": nil,
2547 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002548
Jooyung Hana57af4a2020-01-23 05:36:59 +00002549 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002550 "lib/libvndk27_arm.so",
2551 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002552 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002553 })
Jooyung Han344d5432019-08-23 11:17:39 +09002554}
2555
2556func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
2557 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
2558 apex_vndk {
2559 name: "myapex_v27",
2560 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002561 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002562 vndk_version: "27",
2563 }
2564 apex_vndk {
2565 name: "myapex_v27_other",
2566 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002567 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002568 vndk_version: "27",
2569 }
2570
2571 apex_key {
2572 name: "myapex.key",
2573 public_key: "testkey.avbpubkey",
2574 private_key: "testkey.pem",
2575 }
2576
2577 cc_library {
2578 name: "libvndk",
2579 srcs: ["mylib.cpp"],
2580 vendor_available: true,
2581 vndk: {
2582 enabled: true,
2583 },
2584 system_shared_libs: [],
2585 stl: "none",
2586 }
2587
2588 vndk_prebuilt_shared {
2589 name: "libvndk",
2590 version: "27",
2591 vendor_available: true,
2592 vndk: {
2593 enabled: true,
2594 },
2595 srcs: ["libvndk.so"],
2596 }
2597 `, withFiles(map[string][]byte{
2598 "libvndk.so": nil,
2599 }))
2600}
2601
Jooyung Han90eee022019-10-01 20:02:42 +09002602func TestVndkApexNameRule(t *testing.T) {
2603 ctx, _ := testApex(t, `
2604 apex_vndk {
2605 name: "myapex",
2606 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002607 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002608 }
2609 apex_vndk {
2610 name: "myapex_v28",
2611 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002612 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002613 vndk_version: "28",
2614 }
2615 apex_key {
2616 name: "myapex.key",
2617 public_key: "testkey.avbpubkey",
2618 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002619 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09002620
2621 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00002622 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09002623 actual := proptools.String(bundle.properties.Apex_name)
2624 if !reflect.DeepEqual(actual, expected) {
2625 t.Errorf("Got '%v', expected '%v'", actual, expected)
2626 }
2627 }
2628
2629 assertApexName("com.android.vndk.vVER", "myapex")
2630 assertApexName("com.android.vndk.v28", "myapex_v28")
2631}
2632
Jooyung Han344d5432019-08-23 11:17:39 +09002633func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
2634 ctx, _ := testApex(t, `
2635 apex_vndk {
2636 name: "myapex",
2637 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002638 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002639 }
2640
2641 apex_key {
2642 name: "myapex.key",
2643 public_key: "testkey.avbpubkey",
2644 private_key: "testkey.pem",
2645 }
2646
2647 cc_library {
2648 name: "libvndk",
2649 srcs: ["mylib.cpp"],
2650 vendor_available: true,
2651 native_bridge_supported: true,
2652 host_supported: true,
2653 vndk: {
2654 enabled: true,
2655 },
2656 system_shared_libs: [],
2657 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002658 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002659 }
Jooyung Han35155c42020-02-06 17:33:20 +09002660 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09002661
Jooyung Hana57af4a2020-01-23 05:36:59 +00002662 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002663 "lib/libvndk.so",
2664 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002665 "lib/libc++.so",
2666 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002667 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002668 })
Jooyung Han344d5432019-08-23 11:17:39 +09002669}
2670
2671func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
2672 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
2673 apex_vndk {
2674 name: "myapex",
2675 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002676 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002677 native_bridge_supported: true,
2678 }
2679
2680 apex_key {
2681 name: "myapex.key",
2682 public_key: "testkey.avbpubkey",
2683 private_key: "testkey.pem",
2684 }
2685
2686 cc_library {
2687 name: "libvndk",
2688 srcs: ["mylib.cpp"],
2689 vendor_available: true,
2690 native_bridge_supported: true,
2691 host_supported: true,
2692 vndk: {
2693 enabled: true,
2694 },
2695 system_shared_libs: [],
2696 stl: "none",
2697 }
2698 `)
2699}
2700
Jooyung Han31c470b2019-10-18 16:26:59 +09002701func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002702 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09002703 apex_vndk {
2704 name: "myapex_v27",
2705 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002706 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09002707 vndk_version: "27",
2708 }
2709
2710 apex_key {
2711 name: "myapex.key",
2712 public_key: "testkey.avbpubkey",
2713 private_key: "testkey.pem",
2714 }
2715
2716 vndk_prebuilt_shared {
2717 name: "libvndk27",
2718 version: "27",
2719 target_arch: "arm",
2720 vendor_available: true,
2721 vndk: {
2722 enabled: true,
2723 },
2724 arch: {
2725 arm: {
2726 srcs: ["libvndk27.so"],
2727 }
2728 },
2729 }
2730
2731 vndk_prebuilt_shared {
2732 name: "libvndk27",
2733 version: "27",
2734 target_arch: "arm",
2735 binder32bit: true,
2736 vendor_available: true,
2737 vndk: {
2738 enabled: true,
2739 },
2740 arch: {
2741 arm: {
2742 srcs: ["libvndk27binder32.so"],
2743 }
2744 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002745 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002746 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002747 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09002748 withFiles(map[string][]byte{
2749 "libvndk27.so": nil,
2750 "libvndk27binder32.so": nil,
2751 }),
2752 withBinder32bit,
2753 withTargets(map[android.OsType][]android.Target{
2754 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09002755 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
2756 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09002757 },
2758 }),
2759 )
2760
Jooyung Hana57af4a2020-01-23 05:36:59 +00002761 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002762 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002763 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002764 })
2765}
2766
Jooyung Hane1633032019-08-01 17:41:43 +09002767func TestDependenciesInApexManifest(t *testing.T) {
2768 ctx, _ := testApex(t, `
2769 apex {
2770 name: "myapex_nodep",
2771 key: "myapex.key",
2772 native_shared_libs: ["lib_nodep"],
2773 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002774 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002775 }
2776
2777 apex {
2778 name: "myapex_dep",
2779 key: "myapex.key",
2780 native_shared_libs: ["lib_dep"],
2781 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002782 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002783 }
2784
2785 apex {
2786 name: "myapex_provider",
2787 key: "myapex.key",
2788 native_shared_libs: ["libfoo"],
2789 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002790 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002791 }
2792
2793 apex {
2794 name: "myapex_selfcontained",
2795 key: "myapex.key",
2796 native_shared_libs: ["lib_dep", "libfoo"],
2797 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002798 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002799 }
2800
2801 apex_key {
2802 name: "myapex.key",
2803 public_key: "testkey.avbpubkey",
2804 private_key: "testkey.pem",
2805 }
2806
2807 cc_library {
2808 name: "lib_nodep",
2809 srcs: ["mylib.cpp"],
2810 system_shared_libs: [],
2811 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002812 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09002813 }
2814
2815 cc_library {
2816 name: "lib_dep",
2817 srcs: ["mylib.cpp"],
2818 shared_libs: ["libfoo"],
2819 system_shared_libs: [],
2820 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002821 apex_available: [
2822 "myapex_dep",
2823 "myapex_provider",
2824 "myapex_selfcontained",
2825 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002826 }
2827
2828 cc_library {
2829 name: "libfoo",
2830 srcs: ["mytest.cpp"],
2831 stubs: {
2832 versions: ["1"],
2833 },
2834 system_shared_libs: [],
2835 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002836 apex_available: [
2837 "myapex_provider",
2838 "myapex_selfcontained",
2839 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002840 }
2841 `)
2842
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002843 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09002844 var provideNativeLibs, requireNativeLibs []string
2845
Sundong Ahnabb64432019-10-22 13:58:29 +09002846 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002847 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2848 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002849 ensureListEmpty(t, provideNativeLibs)
2850 ensureListEmpty(t, requireNativeLibs)
2851
Sundong Ahnabb64432019-10-22 13:58:29 +09002852 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002853 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2854 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002855 ensureListEmpty(t, provideNativeLibs)
2856 ensureListContains(t, requireNativeLibs, "libfoo.so")
2857
Sundong Ahnabb64432019-10-22 13:58:29 +09002858 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002859 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2860 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002861 ensureListContains(t, provideNativeLibs, "libfoo.so")
2862 ensureListEmpty(t, requireNativeLibs)
2863
Sundong Ahnabb64432019-10-22 13:58:29 +09002864 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002865 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2866 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002867 ensureListContains(t, provideNativeLibs, "libfoo.so")
2868 ensureListEmpty(t, requireNativeLibs)
2869}
2870
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002871func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09002872 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002873 apex {
2874 name: "myapex",
2875 key: "myapex.key",
2876 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09002877 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002878 }
2879
2880 apex_key {
2881 name: "myapex.key",
2882 public_key: "testkey.avbpubkey",
2883 private_key: "testkey.pem",
2884 }
Jiyong Parkdb334862020-02-05 17:19:28 +09002885
2886 cc_library {
2887 name: "mylib",
2888 srcs: ["mylib.cpp"],
2889 system_shared_libs: [],
2890 stl: "none",
2891 apex_available: [
2892 "//apex_available:platform",
2893 "myapex",
2894 ],
2895 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002896 `)
2897
Sundong Ahnabb64432019-10-22 13:58:29 +09002898 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002899 apexManifestRule := module.Rule("apexManifestRule")
2900 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
2901 apexRule := module.Rule("apexRule")
2902 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09002903
2904 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2905 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2906 name := apexBundle.BaseModuleName()
2907 prefix := "TARGET_"
2908 var builder strings.Builder
2909 data.Custom(&builder, name, prefix, "", data)
2910 androidMk := builder.String()
2911 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
2912 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002913}
2914
Alex Light0851b882019-02-07 13:20:53 -08002915func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002916 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002917 apex {
2918 name: "myapex",
2919 key: "myapex.key",
2920 native_shared_libs: ["mylib_common"],
2921 }
2922
2923 apex_key {
2924 name: "myapex.key",
2925 public_key: "testkey.avbpubkey",
2926 private_key: "testkey.pem",
2927 }
2928
2929 cc_library {
2930 name: "mylib_common",
2931 srcs: ["mylib.cpp"],
2932 system_shared_libs: [],
2933 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002934 apex_available: [
2935 "//apex_available:platform",
2936 "myapex",
2937 ],
Alex Light0851b882019-02-07 13:20:53 -08002938 }
2939 `)
2940
Sundong Ahnabb64432019-10-22 13:58:29 +09002941 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002942 apexRule := module.Rule("apexRule")
2943 copyCmds := apexRule.Args["copy_commands"]
2944
2945 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
2946 t.Log("Apex was a test apex!")
2947 t.Fail()
2948 }
2949 // Ensure that main rule creates an output
2950 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2951
2952 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002953 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08002954
2955 // Ensure that both direct and indirect deps are copied into apex
2956 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2957
Colin Cross7113d202019-11-20 16:39:12 -08002958 // Ensure that the platform variant ends with _shared
2959 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08002960
2961 if !android.InAnyApex("mylib_common") {
2962 t.Log("Found mylib_common not in any apex!")
2963 t.Fail()
2964 }
2965}
2966
2967func TestTestApex(t *testing.T) {
2968 if android.InAnyApex("mylib_common_test") {
2969 t.Fatal("mylib_common_test must not be used in any other tests since this checks that global state is not updated in an illegal way!")
2970 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002971 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002972 apex_test {
2973 name: "myapex",
2974 key: "myapex.key",
2975 native_shared_libs: ["mylib_common_test"],
2976 }
2977
2978 apex_key {
2979 name: "myapex.key",
2980 public_key: "testkey.avbpubkey",
2981 private_key: "testkey.pem",
2982 }
2983
2984 cc_library {
2985 name: "mylib_common_test",
2986 srcs: ["mylib.cpp"],
2987 system_shared_libs: [],
2988 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002989 // TODO: remove //apex_available:platform
2990 apex_available: [
2991 "//apex_available:platform",
2992 "myapex",
2993 ],
Alex Light0851b882019-02-07 13:20:53 -08002994 }
2995 `)
2996
Sundong Ahnabb64432019-10-22 13:58:29 +09002997 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002998 apexRule := module.Rule("apexRule")
2999 copyCmds := apexRule.Args["copy_commands"]
3000
3001 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3002 t.Log("Apex was not a test apex!")
3003 t.Fail()
3004 }
3005 // Ensure that main rule creates an output
3006 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3007
3008 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003009 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003010
3011 // Ensure that both direct and indirect deps are copied into apex
3012 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3013
Colin Cross7113d202019-11-20 16:39:12 -08003014 // Ensure that the platform variant ends with _shared
3015 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003016}
3017
Alex Light9670d332019-01-29 18:07:33 -08003018func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003019 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003020 apex {
3021 name: "myapex",
3022 key: "myapex.key",
3023 multilib: {
3024 first: {
3025 native_shared_libs: ["mylib_common"],
3026 }
3027 },
3028 target: {
3029 android: {
3030 multilib: {
3031 first: {
3032 native_shared_libs: ["mylib"],
3033 }
3034 }
3035 },
3036 host: {
3037 multilib: {
3038 first: {
3039 native_shared_libs: ["mylib2"],
3040 }
3041 }
3042 }
3043 }
3044 }
3045
3046 apex_key {
3047 name: "myapex.key",
3048 public_key: "testkey.avbpubkey",
3049 private_key: "testkey.pem",
3050 }
3051
3052 cc_library {
3053 name: "mylib",
3054 srcs: ["mylib.cpp"],
3055 system_shared_libs: [],
3056 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003057 // TODO: remove //apex_available:platform
3058 apex_available: [
3059 "//apex_available:platform",
3060 "myapex",
3061 ],
Alex Light9670d332019-01-29 18:07:33 -08003062 }
3063
3064 cc_library {
3065 name: "mylib_common",
3066 srcs: ["mylib.cpp"],
3067 system_shared_libs: [],
3068 stl: "none",
3069 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003070 // TODO: remove //apex_available:platform
3071 apex_available: [
3072 "//apex_available:platform",
3073 "myapex",
3074 ],
Alex Light9670d332019-01-29 18:07:33 -08003075 }
3076
3077 cc_library {
3078 name: "mylib2",
3079 srcs: ["mylib.cpp"],
3080 system_shared_libs: [],
3081 stl: "none",
3082 compile_multilib: "first",
3083 }
3084 `)
3085
Sundong Ahnabb64432019-10-22 13:58:29 +09003086 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003087 copyCmds := apexRule.Args["copy_commands"]
3088
3089 // Ensure that main rule creates an output
3090 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3091
3092 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003093 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3094 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
3095 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08003096
3097 // Ensure that both direct and indirect deps are copied into apex
3098 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3099 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3100 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3101
Colin Cross7113d202019-11-20 16:39:12 -08003102 // Ensure that the platform variant ends with _shared
3103 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3104 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3105 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003106}
Jiyong Park04480cf2019-02-06 00:16:29 +09003107
3108func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003109 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003110 apex {
3111 name: "myapex",
3112 key: "myapex.key",
3113 binaries: ["myscript"],
3114 }
3115
3116 apex_key {
3117 name: "myapex.key",
3118 public_key: "testkey.avbpubkey",
3119 private_key: "testkey.pem",
3120 }
3121
3122 sh_binary {
3123 name: "myscript",
3124 src: "mylib.cpp",
3125 filename: "myscript.sh",
3126 sub_dir: "script",
3127 }
3128 `)
3129
Sundong Ahnabb64432019-10-22 13:58:29 +09003130 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003131 copyCmds := apexRule.Args["copy_commands"]
3132
3133 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3134}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003135
Jooyung Han91df2082019-11-20 01:49:42 +09003136func TestApexInVariousPartition(t *testing.T) {
3137 testcases := []struct {
3138 propName, parition, flattenedPartition string
3139 }{
3140 {"", "system", "system_ext"},
3141 {"product_specific: true", "product", "product"},
3142 {"soc_specific: true", "vendor", "vendor"},
3143 {"proprietary: true", "vendor", "vendor"},
3144 {"vendor: true", "vendor", "vendor"},
3145 {"system_ext_specific: true", "system_ext", "system_ext"},
3146 }
3147 for _, tc := range testcases {
3148 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3149 ctx, _ := testApex(t, `
3150 apex {
3151 name: "myapex",
3152 key: "myapex.key",
3153 `+tc.propName+`
3154 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003155
Jooyung Han91df2082019-11-20 01:49:42 +09003156 apex_key {
3157 name: "myapex.key",
3158 public_key: "testkey.avbpubkey",
3159 private_key: "testkey.pem",
3160 }
3161 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003162
Jooyung Han91df2082019-11-20 01:49:42 +09003163 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3164 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3165 actual := apex.installDir.String()
3166 if actual != expected {
3167 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3168 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003169
Jooyung Han91df2082019-11-20 01:49:42 +09003170 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3171 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3172 actual = flattened.installDir.String()
3173 if actual != expected {
3174 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3175 }
3176 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003177 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003178}
Jiyong Park67882562019-03-21 01:11:21 +09003179
Jooyung Han54aca7b2019-11-20 02:26:02 +09003180func TestFileContexts(t *testing.T) {
3181 ctx, _ := testApex(t, `
3182 apex {
3183 name: "myapex",
3184 key: "myapex.key",
3185 }
3186
3187 apex_key {
3188 name: "myapex.key",
3189 public_key: "testkey.avbpubkey",
3190 private_key: "testkey.pem",
3191 }
3192 `)
3193 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3194 apexRule := module.Rule("apexRule")
3195 actual := apexRule.Args["file_contexts"]
3196 expected := "system/sepolicy/apex/myapex-file_contexts"
3197 if actual != expected {
3198 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3199 }
3200
3201 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
3202 apex {
3203 name: "myapex",
3204 key: "myapex.key",
3205 file_contexts: "my_own_file_contexts",
3206 }
3207
3208 apex_key {
3209 name: "myapex.key",
3210 public_key: "testkey.avbpubkey",
3211 private_key: "testkey.pem",
3212 }
3213 `, withFiles(map[string][]byte{
3214 "my_own_file_contexts": nil,
3215 }))
3216
3217 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
3218 apex {
3219 name: "myapex",
3220 key: "myapex.key",
3221 product_specific: true,
3222 file_contexts: "product_specific_file_contexts",
3223 }
3224
3225 apex_key {
3226 name: "myapex.key",
3227 public_key: "testkey.avbpubkey",
3228 private_key: "testkey.pem",
3229 }
3230 `)
3231
3232 ctx, _ = testApex(t, `
3233 apex {
3234 name: "myapex",
3235 key: "myapex.key",
3236 product_specific: true,
3237 file_contexts: "product_specific_file_contexts",
3238 }
3239
3240 apex_key {
3241 name: "myapex.key",
3242 public_key: "testkey.avbpubkey",
3243 private_key: "testkey.pem",
3244 }
3245 `, withFiles(map[string][]byte{
3246 "product_specific_file_contexts": nil,
3247 }))
3248 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3249 apexRule = module.Rule("apexRule")
3250 actual = apexRule.Args["file_contexts"]
3251 expected = "product_specific_file_contexts"
3252 if actual != expected {
3253 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3254 }
3255
3256 ctx, _ = testApex(t, `
3257 apex {
3258 name: "myapex",
3259 key: "myapex.key",
3260 product_specific: true,
3261 file_contexts: ":my-file-contexts",
3262 }
3263
3264 apex_key {
3265 name: "myapex.key",
3266 public_key: "testkey.avbpubkey",
3267 private_key: "testkey.pem",
3268 }
3269
3270 filegroup {
3271 name: "my-file-contexts",
3272 srcs: ["product_specific_file_contexts"],
3273 }
3274 `, withFiles(map[string][]byte{
3275 "product_specific_file_contexts": nil,
3276 }))
3277 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3278 apexRule = module.Rule("apexRule")
3279 actual = apexRule.Args["file_contexts"]
3280 expected = "product_specific_file_contexts"
3281 if actual != expected {
3282 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3283 }
3284}
3285
Jiyong Park67882562019-03-21 01:11:21 +09003286func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003287 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003288 apex_key {
3289 name: "myapex.key",
3290 public_key: ":my.avbpubkey",
3291 private_key: ":my.pem",
3292 product_specific: true,
3293 }
3294
3295 filegroup {
3296 name: "my.avbpubkey",
3297 srcs: ["testkey2.avbpubkey"],
3298 }
3299
3300 filegroup {
3301 name: "my.pem",
3302 srcs: ["testkey2.pem"],
3303 }
3304 `)
3305
3306 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3307 expected_pubkey := "testkey2.avbpubkey"
3308 actual_pubkey := apex_key.public_key_file.String()
3309 if actual_pubkey != expected_pubkey {
3310 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3311 }
3312 expected_privkey := "testkey2.pem"
3313 actual_privkey := apex_key.private_key_file.String()
3314 if actual_privkey != expected_privkey {
3315 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3316 }
3317}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003318
3319func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003320 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003321 prebuilt_apex {
3322 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003323 arch: {
3324 arm64: {
3325 src: "myapex-arm64.apex",
3326 },
3327 arm: {
3328 src: "myapex-arm.apex",
3329 },
3330 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003331 }
3332 `)
3333
3334 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3335
Jiyong Parkc95714e2019-03-29 14:23:10 +09003336 expectedInput := "myapex-arm64.apex"
3337 if prebuilt.inputApex.String() != expectedInput {
3338 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3339 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003340}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003341
3342func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003343 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003344 prebuilt_apex {
3345 name: "myapex",
3346 src: "myapex-arm.apex",
3347 filename: "notmyapex.apex",
3348 }
3349 `)
3350
3351 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3352
3353 expected := "notmyapex.apex"
3354 if p.installFilename != expected {
3355 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3356 }
3357}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003358
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003359func TestPrebuiltOverrides(t *testing.T) {
3360 ctx, config := testApex(t, `
3361 prebuilt_apex {
3362 name: "myapex.prebuilt",
3363 src: "myapex-arm.apex",
3364 overrides: [
3365 "myapex",
3366 ],
3367 }
3368 `)
3369
3370 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3371
3372 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003373 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003374 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003375 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003376 }
3377}
3378
Roland Levillain630846d2019-06-26 12:48:34 +01003379func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003380 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003381 apex_test {
3382 name: "myapex",
3383 key: "myapex.key",
3384 tests: [
3385 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003386 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003387 ],
3388 }
3389
3390 apex_key {
3391 name: "myapex.key",
3392 public_key: "testkey.avbpubkey",
3393 private_key: "testkey.pem",
3394 }
3395
Liz Kammer1c14a212020-05-12 15:26:55 -07003396 filegroup {
3397 name: "fg",
3398 srcs: [
3399 "baz",
3400 "bar/baz"
3401 ],
3402 }
3403
Roland Levillain630846d2019-06-26 12:48:34 +01003404 cc_test {
3405 name: "mytest",
3406 gtest: false,
3407 srcs: ["mytest.cpp"],
3408 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003409 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003410 system_shared_libs: [],
3411 static_executable: true,
3412 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003413 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003414 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003415
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003416 cc_library {
3417 name: "mylib",
3418 srcs: ["mylib.cpp"],
3419 system_shared_libs: [],
3420 stl: "none",
3421 }
3422
Roland Levillain9b5fde92019-06-28 15:41:19 +01003423 cc_test {
3424 name: "mytests",
3425 gtest: false,
3426 srcs: [
3427 "mytest1.cpp",
3428 "mytest2.cpp",
3429 "mytest3.cpp",
3430 ],
3431 test_per_src: true,
3432 relative_install_path: "test",
3433 system_shared_libs: [],
3434 static_executable: true,
3435 stl: "none",
3436 }
Roland Levillain630846d2019-06-26 12:48:34 +01003437 `)
3438
Sundong Ahnabb64432019-10-22 13:58:29 +09003439 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003440 copyCmds := apexRule.Args["copy_commands"]
3441
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003442 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003443 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003444 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003445
Liz Kammer1c14a212020-05-12 15:26:55 -07003446 //Ensure that test data are copied into apex.
3447 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
3448 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
3449
Roland Levillain9b5fde92019-06-28 15:41:19 +01003450 // Ensure that test deps built with `test_per_src` are copied into apex.
3451 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3452 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3453 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003454
3455 // Ensure the module is correctly translated.
Sundong Ahnabb64432019-10-22 13:58:29 +09003456 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Roland Levillainf89cd092019-07-29 16:22:59 +01003457 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3458 name := apexBundle.BaseModuleName()
3459 prefix := "TARGET_"
3460 var builder strings.Builder
3461 data.Custom(&builder, name, prefix, "", data)
3462 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003463 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3464 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3465 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3466 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003467 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003468 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003469 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003470}
3471
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003472func TestInstallExtraFlattenedApexes(t *testing.T) {
3473 ctx, config := testApex(t, `
3474 apex {
3475 name: "myapex",
3476 key: "myapex.key",
3477 }
3478 apex_key {
3479 name: "myapex.key",
3480 public_key: "testkey.avbpubkey",
3481 private_key: "testkey.pem",
3482 }
3483 `, func(fs map[string][]byte, config android.Config) {
3484 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3485 })
3486 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003487 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003488 mk := android.AndroidMkDataForTest(t, config, "", ab)
3489 var builder strings.Builder
3490 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3491 androidMk := builder.String()
3492 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3493}
3494
Jooyung Han5c998b92019-06-27 11:30:33 +09003495func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003496 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003497 apex {
3498 name: "myapex",
3499 key: "myapex.key",
3500 native_shared_libs: ["mylib"],
3501 uses: ["commonapex"],
3502 }
3503
3504 apex {
3505 name: "commonapex",
3506 key: "myapex.key",
3507 native_shared_libs: ["libcommon"],
3508 provide_cpp_shared_libs: true,
3509 }
3510
3511 apex_key {
3512 name: "myapex.key",
3513 public_key: "testkey.avbpubkey",
3514 private_key: "testkey.pem",
3515 }
3516
3517 cc_library {
3518 name: "mylib",
3519 srcs: ["mylib.cpp"],
3520 shared_libs: ["libcommon"],
3521 system_shared_libs: [],
3522 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003523 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003524 }
3525
3526 cc_library {
3527 name: "libcommon",
3528 srcs: ["mylib_common.cpp"],
3529 system_shared_libs: [],
3530 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003531 // TODO: remove //apex_available:platform
3532 apex_available: [
3533 "//apex_available:platform",
3534 "commonapex",
3535 "myapex",
3536 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003537 }
3538 `)
3539
Sundong Ahnabb64432019-10-22 13:58:29 +09003540 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003541 apexRule1 := module1.Rule("apexRule")
3542 copyCmds1 := apexRule1.Args["copy_commands"]
3543
Sundong Ahnabb64432019-10-22 13:58:29 +09003544 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003545 apexRule2 := module2.Rule("apexRule")
3546 copyCmds2 := apexRule2.Args["copy_commands"]
3547
Colin Cross7113d202019-11-20 16:39:12 -08003548 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3549 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09003550 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
3551 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
3552 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
3553}
3554
3555func TestApexUsesFailsIfNotProvided(t *testing.T) {
3556 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
3557 apex {
3558 name: "myapex",
3559 key: "myapex.key",
3560 uses: ["commonapex"],
3561 }
3562
3563 apex {
3564 name: "commonapex",
3565 key: "myapex.key",
3566 }
3567
3568 apex_key {
3569 name: "myapex.key",
3570 public_key: "testkey.avbpubkey",
3571 private_key: "testkey.pem",
3572 }
3573 `)
3574 testApexError(t, `uses: "commonapex" is not a provider`, `
3575 apex {
3576 name: "myapex",
3577 key: "myapex.key",
3578 uses: ["commonapex"],
3579 }
3580
3581 cc_library {
3582 name: "commonapex",
3583 system_shared_libs: [],
3584 stl: "none",
3585 }
3586
3587 apex_key {
3588 name: "myapex.key",
3589 public_key: "testkey.avbpubkey",
3590 private_key: "testkey.pem",
3591 }
3592 `)
3593}
3594
3595func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
3596 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
3597 apex {
3598 name: "myapex",
3599 key: "myapex.key",
3600 use_vendor: true,
3601 uses: ["commonapex"],
3602 }
3603
3604 apex {
3605 name: "commonapex",
3606 key: "myapex.key",
3607 provide_cpp_shared_libs: true,
3608 }
3609
3610 apex_key {
3611 name: "myapex.key",
3612 public_key: "testkey.avbpubkey",
3613 private_key: "testkey.pem",
3614 }
Jooyung Handc782442019-11-01 03:14:38 +09003615 `, func(fs map[string][]byte, config android.Config) {
3616 setUseVendorWhitelistForTest(config, []string{"myapex"})
3617 })
Jooyung Han5c998b92019-06-27 11:30:33 +09003618}
3619
Jooyung Hand48f3c32019-08-23 11:18:57 +09003620func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
3621 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
3622 apex {
3623 name: "myapex",
3624 key: "myapex.key",
3625 native_shared_libs: ["libfoo"],
3626 }
3627
3628 apex_key {
3629 name: "myapex.key",
3630 public_key: "testkey.avbpubkey",
3631 private_key: "testkey.pem",
3632 }
3633
3634 cc_library {
3635 name: "libfoo",
3636 stl: "none",
3637 system_shared_libs: [],
3638 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003639 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003640 }
3641 `)
3642 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
3643 apex {
3644 name: "myapex",
3645 key: "myapex.key",
3646 java_libs: ["myjar"],
3647 }
3648
3649 apex_key {
3650 name: "myapex.key",
3651 public_key: "testkey.avbpubkey",
3652 private_key: "testkey.pem",
3653 }
3654
3655 java_library {
3656 name: "myjar",
3657 srcs: ["foo/bar/MyClass.java"],
3658 sdk_version: "none",
3659 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09003660 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003661 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003662 }
3663 `)
3664}
3665
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003666func TestApexWithApps(t *testing.T) {
3667 ctx, _ := testApex(t, `
3668 apex {
3669 name: "myapex",
3670 key: "myapex.key",
3671 apps: [
3672 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09003673 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003674 ],
3675 }
3676
3677 apex_key {
3678 name: "myapex.key",
3679 public_key: "testkey.avbpubkey",
3680 private_key: "testkey.pem",
3681 }
3682
3683 android_app {
3684 name: "AppFoo",
3685 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003686 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003687 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09003688 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08003689 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003690 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003691 }
Jiyong Parkf7487312019-10-17 12:54:30 +09003692
3693 android_app {
3694 name: "AppFooPriv",
3695 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003696 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09003697 system_modules: "none",
3698 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08003699 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003700 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09003701 }
Jiyong Park8be103b2019-11-08 15:53:48 +09003702
3703 cc_library_shared {
3704 name: "libjni",
3705 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003706 shared_libs: ["libfoo"],
3707 stl: "none",
3708 system_shared_libs: [],
3709 apex_available: [ "myapex" ],
3710 sdk_version: "current",
3711 }
3712
3713 cc_library_shared {
3714 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09003715 stl: "none",
3716 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09003717 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08003718 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09003719 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003720 `)
3721
Sundong Ahnabb64432019-10-22 13:58:29 +09003722 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003723 apexRule := module.Rule("apexRule")
3724 copyCmds := apexRule.Args["copy_commands"]
3725
3726 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09003727 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003728
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003729 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
3730 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09003731 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003732 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003733 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003734 // JNI libraries including transitive deps are
3735 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00003736 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003737 // ... embedded inside APK (jnilibs.zip)
3738 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
3739 // ... and not directly inside the APEX
3740 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
3741 }
Dario Frenicde2a032019-10-27 00:29:22 +01003742}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003743
Dario Frenicde2a032019-10-27 00:29:22 +01003744func TestApexWithAppImports(t *testing.T) {
3745 ctx, _ := testApex(t, `
3746 apex {
3747 name: "myapex",
3748 key: "myapex.key",
3749 apps: [
3750 "AppFooPrebuilt",
3751 "AppFooPrivPrebuilt",
3752 ],
3753 }
3754
3755 apex_key {
3756 name: "myapex.key",
3757 public_key: "testkey.avbpubkey",
3758 private_key: "testkey.pem",
3759 }
3760
3761 android_app_import {
3762 name: "AppFooPrebuilt",
3763 apk: "PrebuiltAppFoo.apk",
3764 presigned: true,
3765 dex_preopt: {
3766 enabled: false,
3767 },
Jiyong Park592a6a42020-04-21 22:34:28 +09003768 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003769 }
3770
3771 android_app_import {
3772 name: "AppFooPrivPrebuilt",
3773 apk: "PrebuiltAppFooPriv.apk",
3774 privileged: true,
3775 presigned: true,
3776 dex_preopt: {
3777 enabled: false,
3778 },
Jooyung Han39ee1192020-03-23 20:21:11 +09003779 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09003780 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003781 }
3782 `)
3783
Sundong Ahnabb64432019-10-22 13:58:29 +09003784 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01003785 apexRule := module.Rule("apexRule")
3786 copyCmds := apexRule.Args["copy_commands"]
3787
3788 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09003789 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
3790}
3791
3792func TestApexWithAppImportsPrefer(t *testing.T) {
3793 ctx, _ := testApex(t, `
3794 apex {
3795 name: "myapex",
3796 key: "myapex.key",
3797 apps: [
3798 "AppFoo",
3799 ],
3800 }
3801
3802 apex_key {
3803 name: "myapex.key",
3804 public_key: "testkey.avbpubkey",
3805 private_key: "testkey.pem",
3806 }
3807
3808 android_app {
3809 name: "AppFoo",
3810 srcs: ["foo/bar/MyClass.java"],
3811 sdk_version: "none",
3812 system_modules: "none",
3813 apex_available: [ "myapex" ],
3814 }
3815
3816 android_app_import {
3817 name: "AppFoo",
3818 apk: "AppFooPrebuilt.apk",
3819 filename: "AppFooPrebuilt.apk",
3820 presigned: true,
3821 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09003822 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09003823 }
3824 `, withFiles(map[string][]byte{
3825 "AppFooPrebuilt.apk": nil,
3826 }))
3827
3828 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3829 "app/AppFoo/AppFooPrebuilt.apk",
3830 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003831}
3832
Dario Freni6f3937c2019-12-20 22:58:03 +00003833func TestApexWithTestHelperApp(t *testing.T) {
3834 ctx, _ := testApex(t, `
3835 apex {
3836 name: "myapex",
3837 key: "myapex.key",
3838 apps: [
3839 "TesterHelpAppFoo",
3840 ],
3841 }
3842
3843 apex_key {
3844 name: "myapex.key",
3845 public_key: "testkey.avbpubkey",
3846 private_key: "testkey.pem",
3847 }
3848
3849 android_test_helper_app {
3850 name: "TesterHelpAppFoo",
3851 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003852 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00003853 }
3854
3855 `)
3856
3857 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3858 apexRule := module.Rule("apexRule")
3859 copyCmds := apexRule.Args["copy_commands"]
3860
3861 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
3862}
3863
Jooyung Han18020ea2019-11-13 10:50:48 +09003864func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
3865 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09003866 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09003867 apex {
3868 name: "myapex",
3869 key: "myapex.key",
3870 native_shared_libs: ["libfoo"],
3871 }
3872
3873 apex_key {
3874 name: "myapex.key",
3875 public_key: "testkey.avbpubkey",
3876 private_key: "testkey.pem",
3877 }
3878
3879 apex {
3880 name: "otherapex",
3881 key: "myapex.key",
3882 native_shared_libs: ["libfoo"],
3883 }
3884
3885 cc_defaults {
3886 name: "libfoo-defaults",
3887 apex_available: ["otherapex"],
3888 }
3889
3890 cc_library {
3891 name: "libfoo",
3892 defaults: ["libfoo-defaults"],
3893 stl: "none",
3894 system_shared_libs: [],
3895 }`)
3896}
3897
Paul Duffine52e66f2020-03-30 17:54:29 +01003898func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003899 // libfoo is not available to myapex, but only to otherapex
3900 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
3901 apex {
3902 name: "myapex",
3903 key: "myapex.key",
3904 native_shared_libs: ["libfoo"],
3905 }
3906
3907 apex_key {
3908 name: "myapex.key",
3909 public_key: "testkey.avbpubkey",
3910 private_key: "testkey.pem",
3911 }
3912
3913 apex {
3914 name: "otherapex",
3915 key: "otherapex.key",
3916 native_shared_libs: ["libfoo"],
3917 }
3918
3919 apex_key {
3920 name: "otherapex.key",
3921 public_key: "testkey.avbpubkey",
3922 private_key: "testkey.pem",
3923 }
3924
3925 cc_library {
3926 name: "libfoo",
3927 stl: "none",
3928 system_shared_libs: [],
3929 apex_available: ["otherapex"],
3930 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003931}
Jiyong Park127b40b2019-09-30 16:04:35 +09003932
Paul Duffine52e66f2020-03-30 17:54:29 +01003933func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09003934 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01003935 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01003936.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003937.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003938.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003939.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003940.*via tag cc\.DependencyTag.*"shared".*
3941.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003942 apex {
3943 name: "myapex",
3944 key: "myapex.key",
3945 native_shared_libs: ["libfoo"],
3946 }
3947
3948 apex_key {
3949 name: "myapex.key",
3950 public_key: "testkey.avbpubkey",
3951 private_key: "testkey.pem",
3952 }
3953
Jiyong Park127b40b2019-09-30 16:04:35 +09003954 cc_library {
3955 name: "libfoo",
3956 stl: "none",
3957 shared_libs: ["libbar"],
3958 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09003959 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003960 }
3961
3962 cc_library {
3963 name: "libbar",
3964 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09003965 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003966 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09003967 apex_available: ["myapex"],
3968 }
3969
3970 cc_library {
3971 name: "libbaz",
3972 stl: "none",
3973 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09003974 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003975}
Jiyong Park127b40b2019-09-30 16:04:35 +09003976
Paul Duffine52e66f2020-03-30 17:54:29 +01003977func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003978 testApexError(t, "\"otherapex\" is not a valid module name", `
3979 apex {
3980 name: "myapex",
3981 key: "myapex.key",
3982 native_shared_libs: ["libfoo"],
3983 }
3984
3985 apex_key {
3986 name: "myapex.key",
3987 public_key: "testkey.avbpubkey",
3988 private_key: "testkey.pem",
3989 }
3990
3991 cc_library {
3992 name: "libfoo",
3993 stl: "none",
3994 system_shared_libs: [],
3995 apex_available: ["otherapex"],
3996 }`)
3997
Paul Duffine52e66f2020-03-30 17:54:29 +01003998 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003999 apex {
4000 name: "myapex",
4001 key: "myapex.key",
4002 native_shared_libs: ["libfoo", "libbar"],
4003 }
4004
4005 apex_key {
4006 name: "myapex.key",
4007 public_key: "testkey.avbpubkey",
4008 private_key: "testkey.pem",
4009 }
4010
4011 cc_library {
4012 name: "libfoo",
4013 stl: "none",
4014 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004015 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004016 apex_available: ["myapex"],
4017 }
4018
4019 cc_library {
4020 name: "libbar",
4021 stl: "none",
4022 system_shared_libs: [],
4023 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004024 }
4025
4026 cc_library {
4027 name: "libbaz",
4028 stl: "none",
4029 system_shared_libs: [],
4030 stubs: {
4031 versions: ["10", "20", "30"],
4032 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004033 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004034}
Jiyong Park127b40b2019-09-30 16:04:35 +09004035
Jiyong Park89e850a2020-04-07 16:37:39 +09004036func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004037 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004038 apex {
4039 name: "myapex",
4040 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004041 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +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: "libfoo",
4052 stl: "none",
4053 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004054 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004055 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004056 }
4057
4058 cc_library {
4059 name: "libfoo2",
4060 stl: "none",
4061 system_shared_libs: [],
4062 shared_libs: ["libbaz"],
4063 apex_available: ["//apex_available:platform"],
4064 }
4065
4066 cc_library {
4067 name: "libbar",
4068 stl: "none",
4069 system_shared_libs: [],
4070 apex_available: ["myapex"],
4071 }
4072
4073 cc_library {
4074 name: "libbaz",
4075 stl: "none",
4076 system_shared_libs: [],
4077 apex_available: ["myapex"],
4078 stubs: {
4079 versions: ["1"],
4080 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004081 }`)
4082
Jiyong Park89e850a2020-04-07 16:37:39 +09004083 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4084 // because it depends on libbar which isn't available to platform
4085 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4086 if libfoo.NotAvailableForPlatform() != true {
4087 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4088 }
4089
4090 // libfoo2 however can be available to platform because it depends on libbaz which provides
4091 // stubs
4092 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4093 if libfoo2.NotAvailableForPlatform() == true {
4094 t.Errorf("%q should be available to platform", libfoo2.String())
4095 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004096}
Jiyong Parka90ca002019-10-07 15:47:24 +09004097
Paul Duffine52e66f2020-03-30 17:54:29 +01004098func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004099 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004100 apex {
4101 name: "myapex",
4102 key: "myapex.key",
4103 native_shared_libs: ["libfoo"],
4104 }
4105
4106 apex_key {
4107 name: "myapex.key",
4108 public_key: "testkey.avbpubkey",
4109 private_key: "testkey.pem",
4110 }
4111
4112 cc_library {
4113 name: "libfoo",
4114 stl: "none",
4115 system_shared_libs: [],
4116 apex_available: ["myapex"],
4117 static: {
4118 apex_available: ["//apex_available:platform"],
4119 },
4120 }`)
4121
Jiyong Park89e850a2020-04-07 16:37:39 +09004122 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4123 if libfooShared.NotAvailableForPlatform() != true {
4124 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4125 }
4126 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4127 if libfooStatic.NotAvailableForPlatform() != false {
4128 t.Errorf("%q should be available to platform", libfooStatic.String())
4129 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004130}
4131
Jiyong Park5d790c32019-11-15 18:40:32 +09004132func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004133 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004134 apex {
4135 name: "myapex",
4136 key: "myapex.key",
4137 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004138 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004139 }
4140
4141 override_apex {
4142 name: "override_myapex",
4143 base: "myapex",
4144 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004145 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004146 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004147 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004148 }
4149
4150 apex_key {
4151 name: "myapex.key",
4152 public_key: "testkey.avbpubkey",
4153 private_key: "testkey.pem",
4154 }
4155
4156 android_app {
4157 name: "app",
4158 srcs: ["foo/bar/MyClass.java"],
4159 package_name: "foo",
4160 sdk_version: "none",
4161 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004162 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004163 }
4164
4165 override_android_app {
4166 name: "override_app",
4167 base: "app",
4168 package_name: "bar",
4169 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004170 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004171
Jiyong Park317645e2019-12-05 13:20:58 +09004172 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4173 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4174 if originalVariant.GetOverriddenBy() != "" {
4175 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4176 }
4177 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4178 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4179 }
4180
Jiyong Park5d790c32019-11-15 18:40:32 +09004181 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4182 apexRule := module.Rule("apexRule")
4183 copyCmds := apexRule.Args["copy_commands"]
4184
4185 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004186 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004187
4188 apexBundle := module.Module().(*apexBundle)
4189 name := apexBundle.Name()
4190 if name != "override_myapex" {
4191 t.Errorf("name should be \"override_myapex\", but was %q", name)
4192 }
4193
Baligh Uddin004d7172020-02-19 21:29:28 -08004194 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4195 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4196 }
4197
Jiyong Park20bacab2020-03-03 11:45:41 +09004198 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004199 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004200
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004201 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4202 var builder strings.Builder
4203 data.Custom(&builder, name, "TARGET_", "", data)
4204 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004205 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004206 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4207 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004208 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004209 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004210 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004211 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4212 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004213}
4214
Jooyung Han214bf372019-11-12 13:03:50 +09004215func TestLegacyAndroid10Support(t *testing.T) {
4216 ctx, _ := testApex(t, `
4217 apex {
4218 name: "myapex",
4219 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004220 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004221 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004222 }
4223
4224 apex_key {
4225 name: "myapex.key",
4226 public_key: "testkey.avbpubkey",
4227 private_key: "testkey.pem",
4228 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004229
4230 cc_library {
4231 name: "mylib",
4232 srcs: ["mylib.cpp"],
4233 stl: "libc++",
4234 system_shared_libs: [],
4235 apex_available: [ "myapex" ],
4236 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004237 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004238
4239 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4240 args := module.Rule("apexRule").Args
4241 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004242 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004243
4244 // The copies of the libraries in the apex should have one more dependency than
4245 // the ones outside the apex, namely the unwinder. Ideally we should check
4246 // the dependency names directly here but for some reason the names are blank in
4247 // this test.
4248 for _, lib := range []string{"libc++", "mylib"} {
4249 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4250 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4251 if len(apexImplicits) != len(nonApexImplicits)+1 {
4252 t.Errorf("%q missing unwinder dep", lib)
4253 }
4254 }
Jooyung Han214bf372019-11-12 13:03:50 +09004255}
4256
Jooyung Han58f26ab2019-12-18 15:34:32 +09004257func TestJavaSDKLibrary(t *testing.T) {
4258 ctx, _ := testApex(t, `
4259 apex {
4260 name: "myapex",
4261 key: "myapex.key",
4262 java_libs: ["foo"],
4263 }
4264
4265 apex_key {
4266 name: "myapex.key",
4267 public_key: "testkey.avbpubkey",
4268 private_key: "testkey.pem",
4269 }
4270
4271 java_sdk_library {
4272 name: "foo",
4273 srcs: ["a.java"],
4274 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004275 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004276 }
4277 `, withFiles(map[string][]byte{
4278 "api/current.txt": nil,
4279 "api/removed.txt": nil,
4280 "api/system-current.txt": nil,
4281 "api/system-removed.txt": nil,
4282 "api/test-current.txt": nil,
4283 "api/test-removed.txt": nil,
4284 }))
4285
4286 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004287 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004288 "javalib/foo.jar",
4289 "etc/permissions/foo.xml",
4290 })
4291 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004292 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4293 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004294}
4295
atrost6e126252020-01-27 17:01:16 +00004296func TestCompatConfig(t *testing.T) {
4297 ctx, _ := testApex(t, `
4298 apex {
4299 name: "myapex",
4300 key: "myapex.key",
4301 prebuilts: ["myjar-platform-compat-config"],
4302 java_libs: ["myjar"],
4303 }
4304
4305 apex_key {
4306 name: "myapex.key",
4307 public_key: "testkey.avbpubkey",
4308 private_key: "testkey.pem",
4309 }
4310
4311 platform_compat_config {
4312 name: "myjar-platform-compat-config",
4313 src: ":myjar",
4314 }
4315
4316 java_library {
4317 name: "myjar",
4318 srcs: ["foo/bar/MyClass.java"],
4319 sdk_version: "none",
4320 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004321 apex_available: [ "myapex" ],
4322 }
4323 `)
4324 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4325 "etc/compatconfig/myjar-platform-compat-config.xml",
4326 "javalib/myjar.jar",
4327 })
4328}
4329
Jiyong Park479321d2019-12-16 11:47:12 +09004330func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4331 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4332 apex {
4333 name: "myapex",
4334 key: "myapex.key",
4335 java_libs: ["myjar"],
4336 }
4337
4338 apex_key {
4339 name: "myapex.key",
4340 public_key: "testkey.avbpubkey",
4341 private_key: "testkey.pem",
4342 }
4343
4344 java_library {
4345 name: "myjar",
4346 srcs: ["foo/bar/MyClass.java"],
4347 sdk_version: "none",
4348 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09004349 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004350 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09004351 }
4352 `)
4353}
4354
Jiyong Park7afd1072019-12-30 16:56:33 +09004355func TestCarryRequiredModuleNames(t *testing.T) {
4356 ctx, config := testApex(t, `
4357 apex {
4358 name: "myapex",
4359 key: "myapex.key",
4360 native_shared_libs: ["mylib"],
4361 }
4362
4363 apex_key {
4364 name: "myapex.key",
4365 public_key: "testkey.avbpubkey",
4366 private_key: "testkey.pem",
4367 }
4368
4369 cc_library {
4370 name: "mylib",
4371 srcs: ["mylib.cpp"],
4372 system_shared_libs: [],
4373 stl: "none",
4374 required: ["a", "b"],
4375 host_required: ["c", "d"],
4376 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004377 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09004378 }
4379 `)
4380
4381 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4382 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4383 name := apexBundle.BaseModuleName()
4384 prefix := "TARGET_"
4385 var builder strings.Builder
4386 data.Custom(&builder, name, prefix, "", data)
4387 androidMk := builder.String()
4388 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
4389 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
4390 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
4391}
4392
Jiyong Park7cd10e32020-01-14 09:22:18 +09004393func TestSymlinksFromApexToSystem(t *testing.T) {
4394 bp := `
4395 apex {
4396 name: "myapex",
4397 key: "myapex.key",
4398 native_shared_libs: ["mylib"],
4399 java_libs: ["myjar"],
4400 }
4401
Jiyong Park9d677202020-02-19 16:29:35 +09004402 apex {
4403 name: "myapex.updatable",
4404 key: "myapex.key",
4405 native_shared_libs: ["mylib"],
4406 java_libs: ["myjar"],
4407 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004408 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09004409 }
4410
Jiyong Park7cd10e32020-01-14 09:22:18 +09004411 apex_key {
4412 name: "myapex.key",
4413 public_key: "testkey.avbpubkey",
4414 private_key: "testkey.pem",
4415 }
4416
4417 cc_library {
4418 name: "mylib",
4419 srcs: ["mylib.cpp"],
4420 shared_libs: ["myotherlib"],
4421 system_shared_libs: [],
4422 stl: "none",
4423 apex_available: [
4424 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004425 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004426 "//apex_available:platform",
4427 ],
4428 }
4429
4430 cc_library {
4431 name: "myotherlib",
4432 srcs: ["mylib.cpp"],
4433 system_shared_libs: [],
4434 stl: "none",
4435 apex_available: [
4436 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004437 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004438 "//apex_available:platform",
4439 ],
4440 }
4441
4442 java_library {
4443 name: "myjar",
4444 srcs: ["foo/bar/MyClass.java"],
4445 sdk_version: "none",
4446 system_modules: "none",
4447 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09004448 apex_available: [
4449 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004450 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004451 "//apex_available:platform",
4452 ],
4453 }
4454
4455 java_library {
4456 name: "myotherjar",
4457 srcs: ["foo/bar/MyClass.java"],
4458 sdk_version: "none",
4459 system_modules: "none",
4460 apex_available: [
4461 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004462 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004463 "//apex_available:platform",
4464 ],
4465 }
4466 `
4467
4468 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
4469 for _, f := range files {
4470 if f.path == file {
4471 if f.isLink {
4472 t.Errorf("%q is not a real file", file)
4473 }
4474 return
4475 }
4476 }
4477 t.Errorf("%q is not found", file)
4478 }
4479
4480 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
4481 for _, f := range files {
4482 if f.path == file {
4483 if !f.isLink {
4484 t.Errorf("%q is not a symlink", file)
4485 }
4486 return
4487 }
4488 }
4489 t.Errorf("%q is not found", file)
4490 }
4491
Jiyong Park9d677202020-02-19 16:29:35 +09004492 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
4493 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09004494 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004495 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004496 ensureRealfileExists(t, files, "javalib/myjar.jar")
4497 ensureRealfileExists(t, files, "lib64/mylib.so")
4498 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4499
Jiyong Park9d677202020-02-19 16:29:35 +09004500 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4501 ensureRealfileExists(t, files, "javalib/myjar.jar")
4502 ensureRealfileExists(t, files, "lib64/mylib.so")
4503 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4504
4505 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09004506 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004507 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004508 ensureRealfileExists(t, files, "javalib/myjar.jar")
4509 ensureRealfileExists(t, files, "lib64/mylib.so")
4510 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09004511
4512 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4513 ensureRealfileExists(t, files, "javalib/myjar.jar")
4514 ensureRealfileExists(t, files, "lib64/mylib.so")
4515 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09004516}
4517
Jooyung Han643adc42020-02-27 13:50:06 +09004518func TestApexWithJniLibs(t *testing.T) {
4519 ctx, _ := testApex(t, `
4520 apex {
4521 name: "myapex",
4522 key: "myapex.key",
4523 jni_libs: ["mylib"],
4524 }
4525
4526 apex_key {
4527 name: "myapex.key",
4528 public_key: "testkey.avbpubkey",
4529 private_key: "testkey.pem",
4530 }
4531
4532 cc_library {
4533 name: "mylib",
4534 srcs: ["mylib.cpp"],
4535 shared_libs: ["mylib2"],
4536 system_shared_libs: [],
4537 stl: "none",
4538 apex_available: [ "myapex" ],
4539 }
4540
4541 cc_library {
4542 name: "mylib2",
4543 srcs: ["mylib.cpp"],
4544 system_shared_libs: [],
4545 stl: "none",
4546 apex_available: [ "myapex" ],
4547 }
4548 `)
4549
4550 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4551 // Notice mylib2.so (transitive dep) is not added as a jni_lib
4552 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
4553 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4554 "lib64/mylib.so",
4555 "lib64/mylib2.so",
4556 })
4557}
4558
Jooyung Han49f67012020-04-17 13:43:10 +09004559func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
4560 ctx, _ := testApex(t, `
4561 apex {
4562 name: "myapex",
4563 key: "myapex.key",
4564 }
4565 apex_key {
4566 name: "myapex.key",
4567 public_key: "testkey.avbpubkey",
4568 private_key: "testkey.pem",
4569 }
4570 `, func(fs map[string][]byte, config android.Config) {
4571 delete(config.Targets, android.Android)
4572 config.AndroidCommonTarget = android.Target{}
4573 })
4574
4575 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
4576 t.Errorf("Expected variants: %v, but got: %v", expected, got)
4577 }
4578}
4579
Jooyung Han643adc42020-02-27 13:50:06 +09004580func TestApexWithJniLibs_Errors(t *testing.T) {
4581 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
4582 apex {
4583 name: "myapex",
4584 key: "myapex.key",
4585 jni_libs: ["xxx"],
4586 }
4587
4588 apex_key {
4589 name: "myapex.key",
4590 public_key: "testkey.avbpubkey",
4591 private_key: "testkey.pem",
4592 }
4593
4594 prebuilt_etc {
4595 name: "xxx",
4596 src: "xxx",
4597 }
4598 `, withFiles(map[string][]byte{
4599 "xxx": nil,
4600 }))
4601}
4602
Jiyong Parkbd159612020-02-28 15:22:21 +09004603func TestAppBundle(t *testing.T) {
4604 ctx, _ := testApex(t, `
4605 apex {
4606 name: "myapex",
4607 key: "myapex.key",
4608 apps: ["AppFoo"],
4609 }
4610
4611 apex_key {
4612 name: "myapex.key",
4613 public_key: "testkey.avbpubkey",
4614 private_key: "testkey.pem",
4615 }
4616
4617 android_app {
4618 name: "AppFoo",
4619 srcs: ["foo/bar/MyClass.java"],
4620 sdk_version: "none",
4621 system_modules: "none",
4622 apex_available: [ "myapex" ],
4623 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004624 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09004625
4626 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
4627 content := bundleConfigRule.Args["content"]
4628
4629 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004630 ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo/AppFoo.apk"}]}`)
Jiyong Parkbd159612020-02-28 15:22:21 +09004631}
4632
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004633func testNoUpdatableJarsInBootImage(t *testing.T, errmsg, bp string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
4634 t.Helper()
4635
4636 bp = bp + `
4637 filegroup {
4638 name: "some-updatable-apex-file_contexts",
4639 srcs: [
4640 "system/sepolicy/apex/some-updatable-apex-file_contexts",
4641 ],
4642 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004643
4644 filegroup {
4645 name: "some-non-updatable-apex-file_contexts",
4646 srcs: [
4647 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
4648 ],
4649 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004650 `
4651 bp += cc.GatherRequiredDepsForTest(android.Android)
4652 bp += java.GatherRequiredDepsForTest()
4653 bp += dexpreopt.BpToolModulesForTest()
4654
4655 fs := map[string][]byte{
4656 "a.java": nil,
4657 "a.jar": nil,
4658 "build/make/target/product/security": nil,
4659 "apex_manifest.json": nil,
4660 "AndroidManifest.xml": nil,
4661 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004662 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004663 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
4664 "framework/aidl/a.aidl": nil,
4665 }
4666 cc.GatherRequiredFilesForTest(fs)
4667
4668 ctx := android.NewTestArchContext()
4669 ctx.RegisterModuleType("apex", BundleFactory)
4670 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
4671 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01004672 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004673 cc.RegisterRequiredBuildComponentsForTest(ctx)
4674 java.RegisterJavaBuildComponents(ctx)
4675 java.RegisterSystemModulesBuildComponents(ctx)
4676 java.RegisterAppBuildComponents(ctx)
4677 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004678 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
4679 ctx.PreDepsMutators(RegisterPreDepsMutators)
4680 ctx.PostDepsMutators(RegisterPostDepsMutators)
4681
4682 config := android.TestArchConfig(buildDir, nil, bp, fs)
4683 ctx.Register(config)
4684
4685 _ = dexpreopt.GlobalSoongConfigForTests(config)
4686 dexpreopt.RegisterToolModulesForTest(ctx)
4687 pathCtx := android.PathContextForTesting(config)
4688 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
4689 transformDexpreoptConfig(dexpreoptConfig)
4690 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
4691
4692 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
4693 android.FailIfErrored(t, errs)
4694
4695 _, errs = ctx.PrepareBuildActions(config)
4696 if errmsg == "" {
4697 android.FailIfErrored(t, errs)
4698 } else if len(errs) > 0 {
4699 android.FailIfNoMatchingErrors(t, errmsg, errs)
4700 return
4701 } else {
4702 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
4703 }
4704}
4705
Jooyung Han548640b2020-04-27 12:10:30 +09004706func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
4707 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
4708 apex {
4709 name: "myapex",
4710 key: "myapex.key",
4711 updatable: true,
4712 }
4713
4714 apex_key {
4715 name: "myapex.key",
4716 public_key: "testkey.avbpubkey",
4717 private_key: "testkey.pem",
4718 }
4719 `)
4720}
4721
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004722func TestNoUpdatableJarsInBootImage(t *testing.T) {
4723 bp := `
4724 java_library {
4725 name: "some-updatable-apex-lib",
4726 srcs: ["a.java"],
Artur Satayev8cf899a2020-04-15 17:29:42 +01004727 sdk_version: "current",
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004728 apex_available: [
4729 "some-updatable-apex",
4730 ],
4731 }
4732
4733 java_library {
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004734 name: "some-non-updatable-apex-lib",
4735 srcs: ["a.java"],
4736 apex_available: [
4737 "some-non-updatable-apex",
4738 ],
4739 }
4740
4741 java_library {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004742 name: "some-platform-lib",
4743 srcs: ["a.java"],
Artur Satayev8cf899a2020-04-15 17:29:42 +01004744 sdk_version: "current",
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004745 installable: true,
4746 }
4747
4748 java_library {
4749 name: "some-art-lib",
4750 srcs: ["a.java"],
Artur Satayev8cf899a2020-04-15 17:29:42 +01004751 sdk_version: "current",
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004752 apex_available: [
4753 "com.android.art.something",
4754 ],
4755 hostdex: true,
4756 }
4757
4758 apex {
4759 name: "some-updatable-apex",
4760 key: "some-updatable-apex.key",
4761 java_libs: ["some-updatable-apex-lib"],
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004762 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004763 min_sdk_version: "current",
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004764 }
4765
4766 apex {
4767 name: "some-non-updatable-apex",
4768 key: "some-non-updatable-apex.key",
4769 java_libs: ["some-non-updatable-apex-lib"],
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004770 }
4771
4772 apex_key {
4773 name: "some-updatable-apex.key",
4774 }
4775
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004776 apex_key {
4777 name: "some-non-updatable-apex.key",
4778 }
4779
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004780 apex {
4781 name: "com.android.art.something",
4782 key: "com.android.art.something.key",
4783 java_libs: ["some-art-lib"],
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004784 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004785 min_sdk_version: "current",
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004786 }
4787
4788 apex_key {
4789 name: "com.android.art.something.key",
4790 }
4791 `
4792
4793 var error string
4794 var transform func(*dexpreopt.GlobalConfig)
4795
4796 // updatable jar from ART apex in the ART boot image => ok
4797 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004798 config.ArtApexJars = []string{"com.android.art.something:some-art-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004799 }
4800 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4801
4802 // updatable jar from ART apex in the framework boot image => error
4803 error = "module 'some-art-lib' from updatable apex 'com.android.art.something' is not allowed in the framework boot image"
4804 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004805 config.BootJars = []string{"com.android.art.something:some-art-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004806 }
4807 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4808
4809 // updatable jar from some other apex in the ART boot image => error
4810 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the ART boot image"
4811 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004812 config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004813 }
4814 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4815
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004816 // non-updatable jar from some other apex in the ART boot image => error
4817 error = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
4818 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004819 config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004820 }
4821 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4822
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004823 // updatable jar from some other apex in the framework boot image => error
4824 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
4825 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004826 config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004827 }
4828 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4829
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004830 // non-updatable jar from some other apex in the framework boot image => ok
4831 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004832 config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004833 }
4834 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4835
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004836 // nonexistent jar in the ART boot image => error
4837 error = "failed to find a dex jar path for module 'nonexistent'"
4838 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004839 config.ArtApexJars = []string{"platform:nonexistent"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004840 }
4841 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4842
4843 // nonexistent jar in the framework boot image => error
4844 error = "failed to find a dex jar path for module 'nonexistent'"
4845 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004846 config.BootJars = []string{"platform:nonexistent"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004847 }
4848 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4849
4850 // platform jar in the ART boot image => error
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004851 error = "module 'some-platform-lib' is not allowed in the ART boot image"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004852 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004853 config.ArtApexJars = []string{"platform:some-platform-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004854 }
4855 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4856
4857 // platform jar in the framework boot image => ok
4858 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004859 config.BootJars = []string{"platform:some-platform-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004860 }
4861 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4862}
4863
Jiyong Park62304bb2020-04-13 16:19:48 +09004864func TestTestFor(t *testing.T) {
4865 ctx, _ := testApex(t, `
4866 apex {
4867 name: "myapex",
4868 key: "myapex.key",
4869 native_shared_libs: ["mylib", "myprivlib"],
4870 }
4871
4872 apex_key {
4873 name: "myapex.key",
4874 public_key: "testkey.avbpubkey",
4875 private_key: "testkey.pem",
4876 }
4877
4878 cc_library {
4879 name: "mylib",
4880 srcs: ["mylib.cpp"],
4881 system_shared_libs: [],
4882 stl: "none",
4883 stubs: {
4884 versions: ["1"],
4885 },
4886 apex_available: ["myapex"],
4887 }
4888
4889 cc_library {
4890 name: "myprivlib",
4891 srcs: ["mylib.cpp"],
4892 system_shared_libs: [],
4893 stl: "none",
4894 apex_available: ["myapex"],
4895 }
4896
4897
4898 cc_test {
4899 name: "mytest",
4900 gtest: false,
4901 srcs: ["mylib.cpp"],
4902 system_shared_libs: [],
4903 stl: "none",
4904 shared_libs: ["mylib", "myprivlib"],
4905 test_for: ["myapex"]
4906 }
4907 `)
4908
4909 // the test 'mytest' is a test for the apex, therefore is linked to the
4910 // actual implementation of mylib instead of its stub.
4911 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
4912 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
4913 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
4914}
4915
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004916func TestMain(m *testing.M) {
4917 run := func() int {
4918 setUp()
4919 defer tearDown()
4920
4921 return m.Run()
4922 }
4923
4924 os.Exit(run())
4925}