blob: d6b5a043cc54e58509ef429d0fa9599ae7c7f5db [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"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090030 "android/soong/java"
Jiyong Park25fc6a92018-11-18 18:02:45 +090031)
32
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070033var buildDir string
34
Jooyung Hand3639552019-08-09 12:57:43 +090035// names returns name list from white space separated string
36func names(s string) (ns []string) {
37 for _, n := range strings.Split(s, " ") {
38 if len(n) > 0 {
39 ns = append(ns, n)
40 }
41 }
42 return
43}
44
Jooyung Han344d5432019-08-23 11:17:39 +090045func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
46 t.Helper()
47 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090048 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
49 if len(errs) > 0 {
50 android.FailIfNoMatchingErrors(t, pattern, errs)
51 return
52 }
53 _, errs = ctx.PrepareBuildActions(config)
54 if len(errs) > 0 {
55 android.FailIfNoMatchingErrors(t, pattern, errs)
56 return
57 }
58
59 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
60}
61
Jooyung Han344d5432019-08-23 11:17:39 +090062func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
63 t.Helper()
64 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090065 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
66 android.FailIfErrored(t, errs)
67 _, errs = ctx.PrepareBuildActions(config)
68 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070069 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090070}
71
Jooyung Han344d5432019-08-23 11:17:39 +090072type testCustomizer func(fs map[string][]byte, config android.Config)
73
74func withFiles(files map[string][]byte) testCustomizer {
75 return func(fs map[string][]byte, config android.Config) {
76 for k, v := range files {
77 fs[k] = v
78 }
79 }
80}
81
82func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
83 return func(fs map[string][]byte, config android.Config) {
84 for k, v := range targets {
85 config.Targets[k] = v
86 }
87 }
88}
89
Jooyung Han31c470b2019-10-18 16:26:59 +090090func withBinder32bit(fs map[string][]byte, config android.Config) {
91 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
92}
93
Jooyung Han344d5432019-08-23 11:17:39 +090094func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -070095 config := android.TestArchConfig(buildDir, nil)
96 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
97 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
98 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
99 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
100 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Jooyung Han344d5432019-08-23 11:17:39 +0900101 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900102
103 ctx := android.NewTestArchContext()
Jiyong Parkd1063c12019-07-17 20:08:41 +0900104 ctx.RegisterModuleType("apex", android.ModuleFactoryAdaptor(BundleFactory))
Alex Light0851b882019-02-07 13:20:53 -0800105 ctx.RegisterModuleType("apex_test", android.ModuleFactoryAdaptor(testApexBundleFactory))
Jooyung Han344d5432019-08-23 11:17:39 +0900106 ctx.RegisterModuleType("apex_vndk", android.ModuleFactoryAdaptor(vndkApexBundleFactory))
Jiyong Parkd1063c12019-07-17 20:08:41 +0900107 ctx.RegisterModuleType("apex_key", android.ModuleFactoryAdaptor(ApexKeyFactory))
Jiyong Park30ca9372019-02-07 16:27:23 +0900108 ctx.RegisterModuleType("apex_defaults", android.ModuleFactoryAdaptor(defaultsFactory))
Jaewoong Jung939ebd52019-03-26 15:07:36 -0700109 ctx.RegisterModuleType("prebuilt_apex", android.ModuleFactoryAdaptor(PrebuiltFactory))
Jiyong Park25fc6a92018-11-18 18:02:45 +0900110
111 ctx.RegisterModuleType("cc_library", android.ModuleFactoryAdaptor(cc.LibraryFactory))
112 ctx.RegisterModuleType("cc_library_shared", android.ModuleFactoryAdaptor(cc.LibrarySharedFactory))
Jiyong Park7e636d02019-01-28 16:16:54 +0900113 ctx.RegisterModuleType("cc_library_headers", android.ModuleFactoryAdaptor(cc.LibraryHeaderFactory))
Jooyung Han344d5432019-08-23 11:17:39 +0900114 ctx.RegisterModuleType("cc_prebuilt_library_shared", android.ModuleFactoryAdaptor(cc.PrebuiltSharedLibraryFactory))
115 ctx.RegisterModuleType("cc_prebuilt_library_static", android.ModuleFactoryAdaptor(cc.PrebuiltStaticLibraryFactory))
Jiyong Park16e91a02018-12-20 18:18:08 +0900116 ctx.RegisterModuleType("cc_binary", android.ModuleFactoryAdaptor(cc.BinaryFactory))
Jiyong Park25fc6a92018-11-18 18:02:45 +0900117 ctx.RegisterModuleType("cc_object", android.ModuleFactoryAdaptor(cc.ObjectFactory))
Roland Levillain630846d2019-06-26 12:48:34 +0100118 ctx.RegisterModuleType("cc_test", android.ModuleFactoryAdaptor(cc.TestFactory))
Jiyong Parkda6eb592018-12-19 17:12:36 +0900119 ctx.RegisterModuleType("llndk_library", android.ModuleFactoryAdaptor(cc.LlndkLibraryFactory))
Jooyung Han344d5432019-08-23 11:17:39 +0900120 ctx.RegisterModuleType("vndk_prebuilt_shared", android.ModuleFactoryAdaptor(cc.VndkPrebuiltSharedFactory))
Jooyung Han39edb6c2019-11-06 16:53:07 +0900121 ctx.RegisterModuleType("vndk_libraries_txt", android.ModuleFactoryAdaptor(cc.VndkLibrariesTxtFactory))
Jiyong Park25fc6a92018-11-18 18:02:45 +0900122 ctx.RegisterModuleType("toolchain_library", android.ModuleFactoryAdaptor(cc.ToolchainLibraryFactory))
Jiyong Park7c2ee712018-12-07 00:42:25 +0900123 ctx.RegisterModuleType("prebuilt_etc", android.ModuleFactoryAdaptor(android.PrebuiltEtcFactory))
Jiyong Park04480cf2019-02-06 00:16:29 +0900124 ctx.RegisterModuleType("sh_binary", android.ModuleFactoryAdaptor(android.ShBinaryFactory))
Jiyong Parkb2742fd2019-02-11 11:38:15 +0900125 ctx.RegisterModuleType("android_app_certificate", android.ModuleFactoryAdaptor(java.AndroidAppCertificateFactory))
Jiyong Park809bb722019-02-13 21:33:49 +0900126 ctx.RegisterModuleType("filegroup", android.ModuleFactoryAdaptor(android.FileGroupFactory))
Jiyong Park7f7766d2019-07-25 22:02:35 +0900127 ctx.RegisterModuleType("java_library", android.ModuleFactoryAdaptor(java.LibraryFactory))
Jiyong Park9e6c2422019-08-09 20:39:45 +0900128 ctx.RegisterModuleType("java_import", android.ModuleFactoryAdaptor(java.ImportFactory))
Dario Frenicde2a032019-10-27 00:29:22 +0100129 ctx.RegisterModuleType("java_system_modules", android.ModuleFactoryAdaptor(java.SystemModulesFactory))
Sundong Ahne1f05aa2019-08-27 13:55:42 +0900130 ctx.RegisterModuleType("android_app", android.ModuleFactoryAdaptor(java.AndroidAppFactory))
Dario Frenicde2a032019-10-27 00:29:22 +0100131 ctx.RegisterModuleType("android_app_import", android.ModuleFactoryAdaptor(java.AndroidAppImportFactory))
Jiyong Park7f7766d2019-07-25 22:02:35 +0900132
Jooyung Han344d5432019-08-23 11:17:39 +0900133 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Jaewoong Jung939ebd52019-03-26 15:07:36 -0700134 ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) {
135 ctx.BottomUp("prebuilts", android.PrebuiltMutator).Parallel()
136 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900137 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Jiyong Parkda6eb592018-12-19 17:12:36 +0900138 ctx.BottomUp("image", cc.ImageMutator).Parallel()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900139 ctx.BottomUp("link", cc.LinkageMutator).Parallel()
Jiyong Parkda6eb592018-12-19 17:12:36 +0900140 ctx.BottomUp("vndk", cc.VndkMutator).Parallel()
Roland Levillain9b5fde92019-06-28 15:41:19 +0100141 ctx.BottomUp("test_per_src", cc.TestPerSrcMutator).Parallel()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900142 ctx.BottomUp("version", cc.VersionMutator).Parallel()
143 ctx.BottomUp("begin", cc.BeginMutator).Parallel()
Jooyung Han344d5432019-08-23 11:17:39 +0900144 })
Jooyung Han31c470b2019-10-18 16:26:59 +0900145 ctx.PreDepsMutators(RegisterPreDepsMutators)
146 ctx.PostDepsMutators(RegisterPostDepsMutators)
Jooyung Han344d5432019-08-23 11:17:39 +0900147 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Jooyung Han344d5432019-08-23 11:17:39 +0900148 ctx.TopDown("prebuilt_select", android.PrebuiltSelectModuleMutator).Parallel()
149 ctx.BottomUp("prebuilt_postdeps", android.PrebuiltPostDepsMutator).Parallel()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900150 })
151
152 ctx.Register()
153
154 bp = bp + `
155 toolchain_library {
156 name: "libcompiler_rt-extras",
157 src: "",
Jiyong Parkda6eb592018-12-19 17:12:36 +0900158 vendor_available: true,
159 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900160 }
161
162 toolchain_library {
163 name: "libatomic",
164 src: "",
Jiyong Parkda6eb592018-12-19 17:12:36 +0900165 vendor_available: true,
166 recovery_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +0900167 native_bridge_supported: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900168 }
169
170 toolchain_library {
171 name: "libgcc",
172 src: "",
Jiyong Parkda6eb592018-12-19 17:12:36 +0900173 vendor_available: true,
174 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900175 }
176
177 toolchain_library {
Yi Kongacee27c2019-03-29 20:05:14 -0700178 name: "libgcc_stripped",
179 src: "",
180 vendor_available: true,
181 recovery_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +0900182 native_bridge_supported: true,
Yi Kongacee27c2019-03-29 20:05:14 -0700183 }
184
185 toolchain_library {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900186 name: "libclang_rt.builtins-aarch64-android",
187 src: "",
Jiyong Parkda6eb592018-12-19 17:12:36 +0900188 vendor_available: true,
189 recovery_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +0900190 native_bridge_supported: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900191 }
192
193 toolchain_library {
194 name: "libclang_rt.builtins-arm-android",
195 src: "",
Jiyong Parkda6eb592018-12-19 17:12:36 +0900196 vendor_available: true,
197 recovery_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +0900198 native_bridge_supported: true,
199 }
200
201 toolchain_library {
202 name: "libclang_rt.builtins-x86_64-android",
203 src: "",
204 vendor_available: true,
205 recovery_available: true,
206 native_bridge_supported: true,
207 }
208
209 toolchain_library {
210 name: "libclang_rt.builtins-i686-android",
211 src: "",
212 vendor_available: true,
213 recovery_available: true,
214 native_bridge_supported: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900215 }
216
217 cc_object {
218 name: "crtbegin_so",
219 stl: "none",
Jiyong Parkda6eb592018-12-19 17:12:36 +0900220 vendor_available: true,
221 recovery_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +0900222 native_bridge_supported: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900223 }
224
225 cc_object {
226 name: "crtend_so",
227 stl: "none",
Jiyong Parkda6eb592018-12-19 17:12:36 +0900228 vendor_available: true,
229 recovery_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +0900230 native_bridge_supported: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900231 }
232
Alex Light3d673592019-01-18 14:37:31 -0800233 cc_object {
234 name: "crtbegin_static",
235 stl: "none",
236 }
237
238 cc_object {
239 name: "crtend_android",
240 stl: "none",
241 }
242
Jiyong Parkda6eb592018-12-19 17:12:36 +0900243 llndk_library {
244 name: "libc",
245 symbol_file: "",
Jooyung Han344d5432019-08-23 11:17:39 +0900246 native_bridge_supported: true,
Jiyong Parkda6eb592018-12-19 17:12:36 +0900247 }
248
249 llndk_library {
250 name: "libm",
251 symbol_file: "",
Jooyung Han344d5432019-08-23 11:17:39 +0900252 native_bridge_supported: true,
Jiyong Parkda6eb592018-12-19 17:12:36 +0900253 }
254
255 llndk_library {
256 name: "libdl",
257 symbol_file: "",
Jooyung Han344d5432019-08-23 11:17:39 +0900258 native_bridge_supported: true,
Jiyong Parkda6eb592018-12-19 17:12:36 +0900259 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900260 `
Dario Frenicde2a032019-10-27 00:29:22 +0100261 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262
Jooyung Han344d5432019-08-23 11:17:39 +0900263 fs := map[string][]byte{
Dario Frenicde2a032019-10-27 00:29:22 +0100264 "Android.bp": []byte(bp),
265 "a.java": nil,
266 "PrebuiltAppFoo.apk": nil,
267 "PrebuiltAppFooPriv.apk": nil,
268 "build/make/target/product/security": nil,
269 "apex_manifest.json": nil,
270 "AndroidManifest.xml": nil,
271 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Parkb2742fd2019-02-11 11:38:15 +0900272 "system/sepolicy/apex/myapex_keytest-file_contexts": nil,
273 "system/sepolicy/apex/otherapex-file_contexts": nil,
Jooyung Han5c998b92019-06-27 11:30:33 +0900274 "system/sepolicy/apex/commonapex-file_contexts": nil,
Sundong Ahne1f05aa2019-08-27 13:55:42 +0900275 "mylib.cpp": nil,
276 "mylib_common.cpp": nil,
277 "mytest.cpp": nil,
278 "mytest1.cpp": nil,
279 "mytest2.cpp": nil,
280 "mytest3.cpp": nil,
281 "myprebuilt": nil,
282 "my_include": nil,
283 "foo/bar/MyClass.java": nil,
284 "prebuilt.jar": nil,
285 "vendor/foo/devkeys/test.x509.pem": nil,
286 "vendor/foo/devkeys/test.pk8": nil,
287 "testkey.x509.pem": nil,
288 "testkey.pk8": nil,
289 "testkey.override.x509.pem": nil,
290 "testkey.override.pk8": nil,
291 "vendor/foo/devkeys/testkey.avbpubkey": nil,
292 "vendor/foo/devkeys/testkey.pem": nil,
293 "NOTICE": nil,
294 "custom_notice": nil,
295 "testkey2.avbpubkey": nil,
296 "testkey2.pem": nil,
297 "myapex-arm64.apex": nil,
298 "myapex-arm.apex": nil,
299 "frameworks/base/api/current.txt": nil,
Dario Frenicde2a032019-10-27 00:29:22 +0100300 "framework/aidl/a.aidl": nil,
Sundong Ahne1f05aa2019-08-27 13:55:42 +0900301 "build/make/core/proguard.flags": nil,
302 "build/make/core/proguard_basic_keeps.flags": nil,
Jooyung Han39edb6c2019-11-06 16:53:07 +0900303 "dummy.txt": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900304 }
305
306 for _, handler := range handlers {
307 handler(fs, config)
308 }
309
310 ctx.MockFileSystem(fs)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900311
Jooyung Han5c998b92019-06-27 11:30:33 +0900312 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900313}
314
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700315func setUp() {
316 var err error
317 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900318 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700319 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900320 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900321}
322
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700323func tearDown() {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900324 os.RemoveAll(buildDir)
325}
326
327// ensure that 'result' contains 'expected'
328func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900329 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 if !strings.Contains(result, expected) {
331 t.Errorf("%q is not found in %q", expected, result)
332 }
333}
334
335// ensures that 'result' does not contain 'notExpected'
336func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900337 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900338 if strings.Contains(result, notExpected) {
339 t.Errorf("%q is found in %q", notExpected, result)
340 }
341}
342
343func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900344 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900345 if !android.InList(expected, result) {
346 t.Errorf("%q is not found in %v", expected, result)
347 }
348}
349
350func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900351 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900352 if android.InList(notExpected, result) {
353 t.Errorf("%q is found in %v", notExpected, result)
354 }
355}
356
Jooyung Hane1633032019-08-01 17:41:43 +0900357func ensureListEmpty(t *testing.T, result []string) {
358 t.Helper()
359 if len(result) > 0 {
360 t.Errorf("%q is expected to be empty", result)
361 }
362}
363
Jiyong Park25fc6a92018-11-18 18:02:45 +0900364// Minimal test
365func TestBasicApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700366 ctx, _ := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900367 apex_defaults {
368 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900369 manifest: ":myapex.manifest",
370 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900371 key: "myapex.key",
372 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800373 multilib: {
374 both: {
375 binaries: ["foo",],
376 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900377 },
Jiyong Park9e6c2422019-08-09 20:39:45 +0900378 java_libs: ["myjar", "myprebuiltjar"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900379 }
380
Jiyong Park30ca9372019-02-07 16:27:23 +0900381 apex {
382 name: "myapex",
383 defaults: ["myapex-defaults"],
384 }
385
Jiyong Park25fc6a92018-11-18 18:02:45 +0900386 apex_key {
387 name: "myapex.key",
388 public_key: "testkey.avbpubkey",
389 private_key: "testkey.pem",
390 }
391
Jiyong Park809bb722019-02-13 21:33:49 +0900392 filegroup {
393 name: "myapex.manifest",
394 srcs: ["apex_manifest.json"],
395 }
396
397 filegroup {
398 name: "myapex.androidmanifest",
399 srcs: ["AndroidManifest.xml"],
400 }
401
Jiyong Park25fc6a92018-11-18 18:02:45 +0900402 cc_library {
403 name: "mylib",
404 srcs: ["mylib.cpp"],
405 shared_libs: ["mylib2"],
406 system_shared_libs: [],
407 stl: "none",
408 }
409
Alex Light3d673592019-01-18 14:37:31 -0800410 cc_binary {
411 name: "foo",
412 srcs: ["mylib.cpp"],
413 compile_multilib: "both",
414 multilib: {
415 lib32: {
416 suffix: "32",
417 },
418 lib64: {
419 suffix: "64",
420 },
421 },
422 symlinks: ["foo_link_"],
423 symlink_preferred_arch: true,
424 system_shared_libs: [],
425 static_executable: true,
426 stl: "none",
427 }
428
Jiyong Park25fc6a92018-11-18 18:02:45 +0900429 cc_library {
430 name: "mylib2",
431 srcs: ["mylib.cpp"],
432 system_shared_libs: [],
433 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900434 notice: "custom_notice",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900435 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900436
437 java_library {
438 name: "myjar",
439 srcs: ["foo/bar/MyClass.java"],
440 sdk_version: "none",
441 system_modules: "none",
442 compile_dex: true,
443 static_libs: ["myotherjar"],
444 }
445
446 java_library {
447 name: "myotherjar",
448 srcs: ["foo/bar/MyClass.java"],
449 sdk_version: "none",
450 system_modules: "none",
451 compile_dex: true,
452 }
Jiyong Park9e6c2422019-08-09 20:39:45 +0900453
454 java_import {
455 name: "myprebuiltjar",
456 jars: ["prebuilt.jar"],
457 installable: true,
458 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900459 `)
460
Sundong Ahnabb64432019-10-22 13:58:29 +0900461 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900462
463 optFlags := apexRule.Args["opt_flags"]
464 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700465 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900466 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900467
Jiyong Park25fc6a92018-11-18 18:02:45 +0900468 copyCmds := apexRule.Args["copy_commands"]
469
470 // Ensure that main rule creates an output
471 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
472
473 // Ensure that apex variant is created for the direct dep
Jiyong Parkda6eb592018-12-19 17:12:36 +0900474 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900475 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park9e6c2422019-08-09 20:39:45 +0900476 ensureListContains(t, ctx.ModuleVariantsForTests("myprebuiltjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900477
478 // Ensure that apex variant is created for the indirect dep
Jiyong Parkda6eb592018-12-19 17:12:36 +0900479 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900480 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900481
482 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800483 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
484 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900485 ensureContains(t, copyCmds, "image.apex/javalib/myjar.jar")
Jiyong Park9e6c2422019-08-09 20:39:45 +0900486 ensureContains(t, copyCmds, "image.apex/javalib/myprebuiltjar.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900487 // .. but not for java libs
488 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800489
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 // Ensure that the platform variant ends with _core_shared or _common
Logan Chien3aeedc92018-12-26 15:32:21 +0800491 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared")
492 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900493 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
494 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park9e6c2422019-08-09 20:39:45 +0900495 ensureListContains(t, ctx.ModuleVariantsForTests("myprebuiltjar"), "android_common")
Alex Light3d673592019-01-18 14:37:31 -0800496
497 // Ensure that all symlinks are present.
498 found_foo_link_64 := false
499 found_foo := false
500 for _, cmd := range strings.Split(copyCmds, " && ") {
501 if strings.HasPrefix(cmd, "ln -s foo64") {
502 if strings.HasSuffix(cmd, "bin/foo") {
503 found_foo = true
504 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
505 found_foo_link_64 = true
506 }
507 }
508 }
509 good := found_foo && found_foo_link_64
510 if !good {
511 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
512 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900513
Sundong Ahnabb64432019-10-22 13:58:29 +0900514 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700515 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700516 if len(noticeInputs) != 2 {
517 t.Errorf("number of input notice files: expected = 2, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900518 }
519 ensureListContains(t, noticeInputs, "NOTICE")
520 ensureListContains(t, noticeInputs, "custom_notice")
Alex Light5098a612018-11-29 17:12:15 -0800521}
522
523func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700524 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800525 apex {
526 name: "myapex",
527 key: "myapex.key",
528 payload_type: "zip",
529 native_shared_libs: ["mylib"],
530 }
531
532 apex_key {
533 name: "myapex.key",
534 public_key: "testkey.avbpubkey",
535 private_key: "testkey.pem",
536 }
537
538 cc_library {
539 name: "mylib",
540 srcs: ["mylib.cpp"],
541 shared_libs: ["mylib2"],
542 system_shared_libs: [],
543 stl: "none",
544 }
545
546 cc_library {
547 name: "mylib2",
548 srcs: ["mylib.cpp"],
549 system_shared_libs: [],
550 stl: "none",
551 }
552 `)
553
Sundong Ahnabb64432019-10-22 13:58:29 +0900554 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800555 copyCmds := zipApexRule.Args["copy_commands"]
556
557 // Ensure that main rule creates an output
558 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
559
560 // Ensure that APEX variant is created for the direct dep
Jiyong Parkda6eb592018-12-19 17:12:36 +0900561 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800562
563 // Ensure that APEX variant is created for the indirect dep
Jiyong Parkda6eb592018-12-19 17:12:36 +0900564 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800565
566 // Ensure that both direct and indirect deps are copied into apex
567 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
568 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900569}
570
571func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700572 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900573 apex {
574 name: "myapex",
575 key: "myapex.key",
576 native_shared_libs: ["mylib", "mylib3"],
577 }
578
579 apex_key {
580 name: "myapex.key",
581 public_key: "testkey.avbpubkey",
582 private_key: "testkey.pem",
583 }
584
585 cc_library {
586 name: "mylib",
587 srcs: ["mylib.cpp"],
588 shared_libs: ["mylib2", "mylib3"],
589 system_shared_libs: [],
590 stl: "none",
591 }
592
593 cc_library {
594 name: "mylib2",
595 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900596 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900597 system_shared_libs: [],
598 stl: "none",
599 stubs: {
600 versions: ["1", "2", "3"],
601 },
602 }
603
604 cc_library {
605 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900606 srcs: ["mylib.cpp"],
607 shared_libs: ["mylib4"],
608 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900609 stl: "none",
610 stubs: {
611 versions: ["10", "11", "12"],
612 },
613 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900614
615 cc_library {
616 name: "mylib4",
617 srcs: ["mylib.cpp"],
618 system_shared_libs: [],
619 stl: "none",
620 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900621 `)
622
Sundong Ahnabb64432019-10-22 13:58:29 +0900623 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900624 copyCmds := apexRule.Args["copy_commands"]
625
626 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800627 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900628
629 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800630 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900631
632 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800633 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900634
Jiyong Parkda6eb592018-12-19 17:12:36 +0900635 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900636
637 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkda6eb592018-12-19 17:12:36 +0900638 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_core_shared_3_myapex/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900639 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Parkda6eb592018-12-19 17:12:36 +0900640 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_core_shared_myapex/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900641
642 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Jiyong Parkda6eb592018-12-19 17:12:36 +0900643 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_core_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900644 // .. and not linking to the stubs variant of mylib3
Jiyong Parkda6eb592018-12-19 17:12:36 +0900645 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_core_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900646
647 // Ensure that stubs libs are built without -include flags
Jiyong Parkda6eb592018-12-19 17:12:36 +0900648 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_core_static_myapex").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900649 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900650
651 // Ensure that genstub is invoked with --apex
Jiyong Parkda6eb592018-12-19 17:12:36 +0900652 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_core_static_3_myapex").Rule("genStubSrc").Args["flags"])
Jiyong Park25fc6a92018-11-18 18:02:45 +0900653}
654
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900655func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700656 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900657 apex {
658 name: "myapex",
659 key: "myapex.key",
660 native_shared_libs: ["mylib"],
661 }
662
663 apex_key {
664 name: "myapex.key",
665 public_key: "testkey.avbpubkey",
666 private_key: "testkey.pem",
667 }
668
669 cc_library {
670 name: "mylib",
671 srcs: ["mylib.cpp"],
672 shared_libs: ["libfoo#10"],
673 system_shared_libs: [],
674 stl: "none",
675 }
676
677 cc_library {
678 name: "libfoo",
679 srcs: ["mylib.cpp"],
680 shared_libs: ["libbar"],
681 system_shared_libs: [],
682 stl: "none",
683 stubs: {
684 versions: ["10", "20", "30"],
685 },
686 }
687
688 cc_library {
689 name: "libbar",
690 srcs: ["mylib.cpp"],
691 system_shared_libs: [],
692 stl: "none",
693 }
694
695 `)
696
Sundong Ahnabb64432019-10-22 13:58:29 +0900697 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900698 copyCmds := apexRule.Args["copy_commands"]
699
700 // Ensure that direct non-stubs dep is always included
701 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
702
703 // Ensure that indirect stubs dep is not included
704 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
705
706 // Ensure that dependency of stubs is not included
707 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
708
Jiyong Parkda6eb592018-12-19 17:12:36 +0900709 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900710
711 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Parkda6eb592018-12-19 17:12:36 +0900712 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_core_shared_10_myapex/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900713 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Parkda6eb592018-12-19 17:12:36 +0900714 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_core_shared_myapex/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900715
Jiyong Parkda6eb592018-12-19 17:12:36 +0900716 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_core_shared_10_myapex").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900717
718 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
719 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
720}
721
Jooyung Hand3639552019-08-09 12:57:43 +0900722func TestApexWithRuntimeLibsDependency(t *testing.T) {
723 /*
724 myapex
725 |
726 v (runtime_libs)
727 mylib ------+------> libfoo [provides stub]
728 |
729 `------> libbar
730 */
731 ctx, _ := testApex(t, `
732 apex {
733 name: "myapex",
734 key: "myapex.key",
735 native_shared_libs: ["mylib"],
736 }
737
738 apex_key {
739 name: "myapex.key",
740 public_key: "testkey.avbpubkey",
741 private_key: "testkey.pem",
742 }
743
744 cc_library {
745 name: "mylib",
746 srcs: ["mylib.cpp"],
747 runtime_libs: ["libfoo", "libbar"],
748 system_shared_libs: [],
749 stl: "none",
750 }
751
752 cc_library {
753 name: "libfoo",
754 srcs: ["mylib.cpp"],
755 system_shared_libs: [],
756 stl: "none",
757 stubs: {
758 versions: ["10", "20", "30"],
759 },
760 }
761
762 cc_library {
763 name: "libbar",
764 srcs: ["mylib.cpp"],
765 system_shared_libs: [],
766 stl: "none",
767 }
768
769 `)
770
Sundong Ahnabb64432019-10-22 13:58:29 +0900771 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900772 copyCmds := apexRule.Args["copy_commands"]
773
774 // Ensure that direct non-stubs dep is always included
775 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
776
777 // Ensure that indirect stubs dep is not included
778 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
779
780 // Ensure that runtime_libs dep in included
781 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
782
Sundong Ahnabb64432019-10-22 13:58:29 +0900783 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900784 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
785 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900786
787}
788
Jooyung Han9c80bae2019-08-20 17:30:57 +0900789func TestApexDependencyToLLNDK(t *testing.T) {
790 ctx, _ := testApex(t, `
791 apex {
792 name: "myapex",
793 key: "myapex.key",
794 use_vendor: true,
795 native_shared_libs: ["mylib"],
796 }
797
798 apex_key {
799 name: "myapex.key",
800 public_key: "testkey.avbpubkey",
801 private_key: "testkey.pem",
802 }
803
804 cc_library {
805 name: "mylib",
806 srcs: ["mylib.cpp"],
807 vendor_available: true,
808 shared_libs: ["libbar"],
809 system_shared_libs: [],
810 stl: "none",
811 }
812
813 cc_library {
814 name: "libbar",
815 srcs: ["mylib.cpp"],
816 system_shared_libs: [],
817 stl: "none",
818 }
819
820 llndk_library {
821 name: "libbar",
822 symbol_file: "",
823 }
Jooyung Handc782442019-11-01 03:14:38 +0900824 `, func(fs map[string][]byte, config android.Config) {
825 setUseVendorWhitelistForTest(config, []string{"myapex"})
826 })
Jooyung Han9c80bae2019-08-20 17:30:57 +0900827
Sundong Ahnabb64432019-10-22 13:58:29 +0900828 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Han9c80bae2019-08-20 17:30:57 +0900829 copyCmds := apexRule.Args["copy_commands"]
830
831 // Ensure that LLNDK dep is not included
832 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
833
Sundong Ahnabb64432019-10-22 13:58:29 +0900834 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900835 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
Jooyung Han9c80bae2019-08-20 17:30:57 +0900836
837 // Ensure that LLNDK dep is required
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900838 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +0900839
840}
841
Jiyong Park25fc6a92018-11-18 18:02:45 +0900842func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700843 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900844 apex {
845 name: "myapex",
846 key: "myapex.key",
847 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
848 }
849
850 apex_key {
851 name: "myapex.key",
852 public_key: "testkey.avbpubkey",
853 private_key: "testkey.pem",
854 }
855
856 cc_library {
857 name: "mylib",
858 srcs: ["mylib.cpp"],
859 shared_libs: ["libdl#27"],
860 stl: "none",
861 }
862
863 cc_library_shared {
864 name: "mylib_shared",
865 srcs: ["mylib.cpp"],
866 shared_libs: ["libdl#27"],
867 stl: "none",
868 }
869
870 cc_library {
871 name: "libc",
Yi Konge7fe9912019-06-02 00:53:50 -0700872 no_libcrt: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900873 nocrt: true,
874 system_shared_libs: [],
875 stl: "none",
876 stubs: {
877 versions: ["27", "28", "29"],
878 },
879 }
880
881 cc_library {
882 name: "libm",
Yi Konge7fe9912019-06-02 00:53:50 -0700883 no_libcrt: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900884 nocrt: true,
885 system_shared_libs: [],
886 stl: "none",
887 stubs: {
888 versions: ["27", "28", "29"],
889 },
890 }
891
892 cc_library {
893 name: "libdl",
Yi Konge7fe9912019-06-02 00:53:50 -0700894 no_libcrt: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900895 nocrt: true,
896 system_shared_libs: [],
897 stl: "none",
898 stubs: {
899 versions: ["27", "28", "29"],
900 },
901 }
Jiyong Parkb0788572018-12-20 22:10:17 +0900902
903 cc_library {
904 name: "libBootstrap",
905 srcs: ["mylib.cpp"],
906 stl: "none",
907 bootstrap: true,
908 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900909 `)
910
Sundong Ahnabb64432019-10-22 13:58:29 +0900911 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900912 copyCmds := apexRule.Args["copy_commands"]
913
914 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -0800915 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +0900916 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
917 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918
919 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +0900920 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921
Jiyong Parkda6eb592018-12-19 17:12:36 +0900922 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_shared_myapex").Rule("ld").Args["libFlags"]
923 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_static_myapex").Rule("cc").Args["cFlags"]
924 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_core_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900925
926 // For dependency to libc
927 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkda6eb592018-12-19 17:12:36 +0900928 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_core_shared_29_myapex/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900929 // ... and not linking to the non-stub (impl) variant
Jiyong Parkda6eb592018-12-19 17:12:36 +0900930 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_core_shared_myapex/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900931 // ... Cflags from stub is correctly exported to mylib
932 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
933 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
934
935 // For dependency to libm
936 // Ensure that mylib is linking with the non-stub (impl) variant
Jiyong Parkda6eb592018-12-19 17:12:36 +0900937 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_core_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900938 // ... and not linking to the stub variant
Jiyong Parkda6eb592018-12-19 17:12:36 +0900939 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_core_shared_29_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900940 // ... and is not compiling with the stub
941 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
942 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
943
944 // For dependency to libdl
945 // Ensure that mylib is linking with the specified version of stubs
Jiyong Parkda6eb592018-12-19 17:12:36 +0900946 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_core_shared_27_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900947 // ... and not linking to the other versions of stubs
Jiyong Parkda6eb592018-12-19 17:12:36 +0900948 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_core_shared_28_myapex/libdl.so")
949 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_core_shared_29_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900950 // ... and not linking to the non-stub (impl) variant
Jiyong Parkda6eb592018-12-19 17:12:36 +0900951 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_core_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900952 // ... Cflags from stub is correctly exported to mylib
953 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
954 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +0900955
956 // Ensure that libBootstrap is depending on the platform variant of bionic libs
957 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_core_shared").Rule("ld").Args["libFlags"]
958 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_core_shared/libc.so")
959 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_core_shared/libm.so")
960 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_core_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900961}
Jiyong Park7c2ee712018-12-07 00:42:25 +0900962
963func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700964 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +0900965 apex {
966 name: "myapex",
967 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900968 native_shared_libs: ["mylib"],
969 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +0900970 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900971 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +0900972 }
973
974 apex_key {
975 name: "myapex.key",
976 public_key: "testkey.avbpubkey",
977 private_key: "testkey.pem",
978 }
979
980 prebuilt_etc {
981 name: "myetc",
982 src: "myprebuilt",
983 sub_dir: "foo/bar",
984 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900985
986 cc_library {
987 name: "mylib",
988 srcs: ["mylib.cpp"],
989 relative_install_path: "foo/bar",
990 system_shared_libs: [],
991 stl: "none",
992 }
993
994 cc_binary {
995 name: "mybin",
996 srcs: ["mylib.cpp"],
997 relative_install_path: "foo/bar",
998 system_shared_libs: [],
999 static_executable: true,
1000 stl: "none",
1001 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001002 `)
1003
Sundong Ahnabb64432019-10-22 13:58:29 +09001004 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001005 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1006
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001007 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001008 ensureListContains(t, dirs, "etc")
1009 ensureListContains(t, dirs, "etc/foo")
1010 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001011 ensureListContains(t, dirs, "lib64")
1012 ensureListContains(t, dirs, "lib64/foo")
1013 ensureListContains(t, dirs, "lib64/foo/bar")
1014 ensureListContains(t, dirs, "lib")
1015 ensureListContains(t, dirs, "lib/foo")
1016 ensureListContains(t, dirs, "lib/foo/bar")
1017
Jiyong Parkbd13e442019-03-15 18:10:35 +09001018 ensureListContains(t, dirs, "bin")
1019 ensureListContains(t, dirs, "bin/foo")
1020 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001021}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001022
1023func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001024 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09001025 apex {
1026 name: "myapex",
1027 key: "myapex.key",
1028 native_shared_libs: ["mylib"],
1029 use_vendor: true,
1030 }
1031
1032 apex_key {
1033 name: "myapex.key",
1034 public_key: "testkey.avbpubkey",
1035 private_key: "testkey.pem",
1036 }
1037
1038 cc_library {
1039 name: "mylib",
1040 srcs: ["mylib.cpp"],
1041 shared_libs: ["mylib2"],
1042 system_shared_libs: [],
1043 vendor_available: true,
1044 stl: "none",
1045 }
1046
1047 cc_library {
1048 name: "mylib2",
1049 srcs: ["mylib.cpp"],
1050 system_shared_libs: [],
1051 vendor_available: true,
1052 stl: "none",
1053 }
Jooyung Handc782442019-11-01 03:14:38 +09001054 `, func(fs map[string][]byte, config android.Config) {
1055 setUseVendorWhitelistForTest(config, []string{"myapex"})
1056 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09001057
1058 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09001059 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09001060 for _, implicit := range i.Implicits {
1061 inputsList = append(inputsList, implicit.String())
1062 }
1063 }
1064 inputsString := strings.Join(inputsList, " ")
1065
1066 // ensure that the apex includes vendor variants of the direct and indirect deps
Inseob Kim64c43952019-08-26 16:52:35 +09001067 ensureContains(t, inputsString, "android_arm64_armv8-a_vendor.VER_shared_myapex/mylib.so")
1068 ensureContains(t, inputsString, "android_arm64_armv8-a_vendor.VER_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001069
1070 // ensure that the apex does not include core variants
1071 ensureNotContains(t, inputsString, "android_arm64_armv8-a_core_shared_myapex/mylib.so")
1072 ensureNotContains(t, inputsString, "android_arm64_armv8-a_core_shared_myapex/mylib2.so")
1073}
Jiyong Park16e91a02018-12-20 18:18:08 +09001074
Jooyung Handc782442019-11-01 03:14:38 +09001075func TestUseVendorRestriction(t *testing.T) {
1076 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
1077 apex {
1078 name: "myapex",
1079 key: "myapex.key",
1080 use_vendor: true,
1081 }
1082 apex_key {
1083 name: "myapex.key",
1084 public_key: "testkey.avbpubkey",
1085 private_key: "testkey.pem",
1086 }
1087 `, func(fs map[string][]byte, config android.Config) {
1088 setUseVendorWhitelistForTest(config, []string{""})
1089 })
1090 // no error with whitelist
1091 testApex(t, `
1092 apex {
1093 name: "myapex",
1094 key: "myapex.key",
1095 use_vendor: true,
1096 }
1097 apex_key {
1098 name: "myapex.key",
1099 public_key: "testkey.avbpubkey",
1100 private_key: "testkey.pem",
1101 }
1102 `, func(fs map[string][]byte, config android.Config) {
1103 setUseVendorWhitelistForTest(config, []string{"myapex"})
1104 })
1105}
1106
Jooyung Han5c998b92019-06-27 11:30:33 +09001107func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
1108 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
1109 apex {
1110 name: "myapex",
1111 key: "myapex.key",
1112 native_shared_libs: ["mylib"],
1113 use_vendor: true,
1114 }
1115
1116 apex_key {
1117 name: "myapex.key",
1118 public_key: "testkey.avbpubkey",
1119 private_key: "testkey.pem",
1120 }
1121
1122 cc_library {
1123 name: "mylib",
1124 srcs: ["mylib.cpp"],
1125 system_shared_libs: [],
1126 stl: "none",
1127 }
1128 `)
1129}
1130
Jiyong Park16e91a02018-12-20 18:18:08 +09001131func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001132 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09001133 apex {
1134 name: "myapex",
1135 key: "myapex.key",
1136 native_shared_libs: ["mylib"],
1137 }
1138
1139 apex_key {
1140 name: "myapex.key",
1141 public_key: "testkey.avbpubkey",
1142 private_key: "testkey.pem",
1143 }
1144
1145 cc_library {
1146 name: "mylib",
1147 srcs: ["mylib.cpp"],
1148 system_shared_libs: [],
1149 stl: "none",
1150 stubs: {
1151 versions: ["1", "2", "3"],
1152 },
1153 }
1154
1155 cc_binary {
1156 name: "not_in_apex",
1157 srcs: ["mylib.cpp"],
1158 static_libs: ["mylib"],
1159 static_executable: true,
1160 system_shared_libs: [],
1161 stl: "none",
1162 }
Jiyong Park16e91a02018-12-20 18:18:08 +09001163 `)
1164
1165 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a_core").Rule("ld").Args["libFlags"]
1166
1167 // Ensure that not_in_apex is linking with the static variant of mylib
Logan Chien3aeedc92018-12-26 15:32:21 +08001168 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_core_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09001169}
Jiyong Park9335a262018-12-24 11:31:58 +09001170
1171func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001172 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09001173 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001174 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09001175 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001176 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09001177 native_shared_libs: ["mylib"],
1178 }
1179
1180 cc_library {
1181 name: "mylib",
1182 srcs: ["mylib.cpp"],
1183 system_shared_libs: [],
1184 stl: "none",
1185 }
1186
1187 apex_key {
1188 name: "myapex.key",
1189 public_key: "testkey.avbpubkey",
1190 private_key: "testkey.pem",
1191 }
1192
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001193 android_app_certificate {
1194 name: "myapex.certificate",
1195 certificate: "testkey",
1196 }
1197
1198 android_app_certificate {
1199 name: "myapex.certificate.override",
1200 certificate: "testkey.override",
1201 }
1202
Jiyong Park9335a262018-12-24 11:31:58 +09001203 `)
1204
1205 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09001206 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09001207
1208 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
1209 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
1210 "vendor/foo/devkeys/testkey.avbpubkey")
1211 }
1212 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
1213 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
1214 "vendor/foo/devkeys/testkey.pem")
1215 }
1216
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001217 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09001218 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001219 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09001220 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001221 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09001222 }
1223}
Jiyong Park58e364a2019-01-19 19:24:06 +09001224
1225func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001226 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09001227 apex {
1228 name: "myapex",
1229 key: "myapex.key",
1230 native_shared_libs: ["mylib"],
1231 }
1232
1233 apex {
1234 name: "otherapex",
1235 key: "myapex.key",
1236 native_shared_libs: ["mylib"],
1237 }
1238
1239 apex_key {
1240 name: "myapex.key",
1241 public_key: "testkey.avbpubkey",
1242 private_key: "testkey.pem",
1243 }
1244
1245 cc_library {
1246 name: "mylib",
1247 srcs: ["mylib.cpp"],
1248 system_shared_libs: [],
1249 stl: "none",
1250 }
1251 `)
1252
Jooyung Han6b8459b2019-10-30 08:29:25 +09001253 // non-APEX variant does not have __ANDROID_APEX(_NAME)__ defined
Jiyong Park58e364a2019-01-19 19:24:06 +09001254 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09001255 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09001256 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
1257 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09001258
Jooyung Han6b8459b2019-10-30 08:29:25 +09001259 // APEX variant has __ANDROID_APEX(_NAME)__ defined
Jiyong Park58e364a2019-01-19 19:24:06 +09001260 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09001261 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09001262 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
1263 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09001264
Jooyung Han6b8459b2019-10-30 08:29:25 +09001265 // APEX variant has __ANDROID_APEX(_NAME)__ defined
Jiyong Park58e364a2019-01-19 19:24:06 +09001266 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09001267 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09001268 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
1269 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09001270}
Jiyong Park7e636d02019-01-28 16:16:54 +09001271
1272func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001273 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09001274 apex {
1275 name: "myapex",
1276 key: "myapex.key",
1277 native_shared_libs: ["mylib"],
1278 }
1279
1280 apex_key {
1281 name: "myapex.key",
1282 public_key: "testkey.avbpubkey",
1283 private_key: "testkey.pem",
1284 }
1285
1286 cc_library_headers {
1287 name: "mylib_headers",
1288 export_include_dirs: ["my_include"],
1289 system_shared_libs: [],
1290 stl: "none",
1291 }
1292
1293 cc_library {
1294 name: "mylib",
1295 srcs: ["mylib.cpp"],
1296 system_shared_libs: [],
1297 stl: "none",
1298 header_libs: ["mylib_headers"],
1299 export_header_lib_headers: ["mylib_headers"],
1300 stubs: {
1301 versions: ["1", "2", "3"],
1302 },
1303 }
1304
1305 cc_library {
1306 name: "otherlib",
1307 srcs: ["mylib.cpp"],
1308 system_shared_libs: [],
1309 stl: "none",
1310 shared_libs: ["mylib"],
1311 }
1312 `)
1313
1314 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_core_static").Rule("cc").Args["cFlags"]
1315
1316 // Ensure that the include path of the header lib is exported to 'otherlib'
1317 ensureContains(t, cFlags, "-Imy_include")
1318}
Alex Light9670d332019-01-29 18:07:33 -08001319
Jooyung Han31c470b2019-10-18 16:26:59 +09001320func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName string, files []string) {
1321 t.Helper()
Sundong Ahnabb64432019-10-22 13:58:29 +09001322 apexRule := ctx.ModuleForTests(moduleName, "android_common_"+moduleName+"_image").Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09001323 copyCmds := apexRule.Args["copy_commands"]
1324 imageApexDir := "/image.apex/"
Jooyung Han39edb6c2019-11-06 16:53:07 +09001325 var failed bool
1326 var surplus []string
1327 filesMatched := make(map[string]bool)
1328 addContent := func(content string) {
1329 for _, expected := range files {
1330 if matched, _ := path.Match(expected, content); matched {
1331 filesMatched[expected] = true
1332 return
1333 }
1334 }
1335 surplus = append(surplus, content)
1336 }
Jooyung Han31c470b2019-10-18 16:26:59 +09001337 for _, cmd := range strings.Split(copyCmds, "&&") {
1338 cmd = strings.TrimSpace(cmd)
1339 if cmd == "" {
1340 continue
1341 }
1342 terms := strings.Split(cmd, " ")
1343 switch terms[0] {
1344 case "mkdir":
1345 case "cp":
1346 if len(terms) != 3 {
1347 t.Fatal("copyCmds contains invalid cp command", cmd)
1348 }
1349 dst := terms[2]
1350 index := strings.Index(dst, imageApexDir)
1351 if index == -1 {
1352 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
1353 }
1354 dstFile := dst[index+len(imageApexDir):]
Jooyung Han39edb6c2019-11-06 16:53:07 +09001355 addContent(dstFile)
Jooyung Han31c470b2019-10-18 16:26:59 +09001356 default:
1357 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
1358 }
1359 }
Jooyung Han31c470b2019-10-18 16:26:59 +09001360
Jooyung Han31c470b2019-10-18 16:26:59 +09001361 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09001362 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09001363 t.Log("surplus files", surplus)
1364 failed = true
1365 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09001366
1367 if len(files) > len(filesMatched) {
1368 var missing []string
1369 for _, expected := range files {
1370 if !filesMatched[expected] {
1371 missing = append(missing, expected)
1372 }
1373 }
1374 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09001375 t.Log("missing files", missing)
1376 failed = true
1377 }
1378 if failed {
1379 t.Fail()
1380 }
1381}
1382
Jooyung Han344d5432019-08-23 11:17:39 +09001383func TestVndkApexCurrent(t *testing.T) {
1384 ctx, _ := testApex(t, `
1385 apex_vndk {
1386 name: "myapex",
1387 key: "myapex.key",
1388 file_contexts: "myapex",
1389 }
1390
1391 apex_key {
1392 name: "myapex.key",
1393 public_key: "testkey.avbpubkey",
1394 private_key: "testkey.pem",
1395 }
1396
1397 cc_library {
1398 name: "libvndk",
1399 srcs: ["mylib.cpp"],
1400 vendor_available: true,
1401 vndk: {
1402 enabled: true,
1403 },
1404 system_shared_libs: [],
1405 stl: "none",
1406 }
1407
1408 cc_library {
1409 name: "libvndksp",
1410 srcs: ["mylib.cpp"],
1411 vendor_available: true,
1412 vndk: {
1413 enabled: true,
1414 support_system_process: true,
1415 },
1416 system_shared_libs: [],
1417 stl: "none",
1418 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09001419 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09001420
Jooyung Han31c470b2019-10-18 16:26:59 +09001421 ensureExactContents(t, ctx, "myapex", []string{
1422 "lib/libvndk.so",
1423 "lib/libvndksp.so",
1424 "lib64/libvndk.so",
1425 "lib64/libvndksp.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09001426 "etc/llndk.libraries.VER.txt",
1427 "etc/vndkcore.libraries.VER.txt",
1428 "etc/vndksp.libraries.VER.txt",
1429 "etc/vndkprivate.libraries.VER.txt",
1430 "etc/vndkcorevariant.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09001431 })
Jooyung Han344d5432019-08-23 11:17:39 +09001432}
1433
1434func TestVndkApexWithPrebuilt(t *testing.T) {
1435 ctx, _ := testApex(t, `
1436 apex_vndk {
1437 name: "myapex",
1438 key: "myapex.key",
1439 file_contexts: "myapex",
1440 }
1441
1442 apex_key {
1443 name: "myapex.key",
1444 public_key: "testkey.avbpubkey",
1445 private_key: "testkey.pem",
1446 }
1447
1448 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09001449 name: "libvndk",
1450 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09001451 vendor_available: true,
1452 vndk: {
1453 enabled: true,
1454 },
1455 system_shared_libs: [],
1456 stl: "none",
1457 }
Jooyung Han31c470b2019-10-18 16:26:59 +09001458
1459 cc_prebuilt_library_shared {
1460 name: "libvndk.arm",
1461 srcs: ["libvndk.arm.so"],
1462 vendor_available: true,
1463 vndk: {
1464 enabled: true,
1465 },
1466 enabled: false,
1467 arch: {
1468 arm: {
1469 enabled: true,
1470 },
1471 },
1472 system_shared_libs: [],
1473 stl: "none",
1474 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09001475 `+vndkLibrariesTxtFiles("current"),
1476 withFiles(map[string][]byte{
1477 "libvndk.so": nil,
1478 "libvndk.arm.so": nil,
1479 }))
Jooyung Han344d5432019-08-23 11:17:39 +09001480
Jooyung Han31c470b2019-10-18 16:26:59 +09001481 ensureExactContents(t, ctx, "myapex", []string{
1482 "lib/libvndk.so",
1483 "lib/libvndk.arm.so",
1484 "lib64/libvndk.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09001485 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09001486 })
Jooyung Han344d5432019-08-23 11:17:39 +09001487}
1488
Jooyung Han39edb6c2019-11-06 16:53:07 +09001489func vndkLibrariesTxtFiles(vers ...string) (result string) {
1490 for _, v := range vers {
1491 if v == "current" {
1492 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkcorevariant"} {
1493 result += `
1494 vndk_libraries_txt {
1495 name: "` + txt + `.libraries.txt",
1496 }
1497 `
1498 }
1499 } else {
1500 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
1501 result += `
1502 prebuilt_etc {
1503 name: "` + txt + `.libraries.` + v + `.txt",
1504 src: "dummy.txt",
1505 }
1506 `
1507 }
1508 }
1509 }
1510 return
1511}
1512
Jooyung Han344d5432019-08-23 11:17:39 +09001513func TestVndkApexVersion(t *testing.T) {
1514 ctx, _ := testApex(t, `
1515 apex_vndk {
1516 name: "myapex_v27",
1517 key: "myapex.key",
1518 file_contexts: "myapex",
1519 vndk_version: "27",
1520 }
1521
1522 apex_key {
1523 name: "myapex.key",
1524 public_key: "testkey.avbpubkey",
1525 private_key: "testkey.pem",
1526 }
1527
Jooyung Han31c470b2019-10-18 16:26:59 +09001528 vndk_prebuilt_shared {
1529 name: "libvndk27",
1530 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09001531 vendor_available: true,
1532 vndk: {
1533 enabled: true,
1534 },
Jooyung Han31c470b2019-10-18 16:26:59 +09001535 target_arch: "arm64",
1536 arch: {
1537 arm: {
1538 srcs: ["libvndk27_arm.so"],
1539 },
1540 arm64: {
1541 srcs: ["libvndk27_arm64.so"],
1542 },
1543 },
Jooyung Han344d5432019-08-23 11:17:39 +09001544 }
1545
1546 vndk_prebuilt_shared {
1547 name: "libvndk27",
1548 version: "27",
1549 vendor_available: true,
1550 vndk: {
1551 enabled: true,
1552 },
Jooyung Han31c470b2019-10-18 16:26:59 +09001553 target_arch: "x86_64",
1554 arch: {
1555 x86: {
1556 srcs: ["libvndk27_x86.so"],
1557 },
1558 x86_64: {
1559 srcs: ["libvndk27_x86_64.so"],
1560 },
1561 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09001562 }
1563 `+vndkLibrariesTxtFiles("27"),
1564 withFiles(map[string][]byte{
1565 "libvndk27_arm.so": nil,
1566 "libvndk27_arm64.so": nil,
1567 "libvndk27_x86.so": nil,
1568 "libvndk27_x86_64.so": nil,
1569 }))
Jooyung Han344d5432019-08-23 11:17:39 +09001570
Jooyung Han31c470b2019-10-18 16:26:59 +09001571 ensureExactContents(t, ctx, "myapex_v27", []string{
1572 "lib/libvndk27_arm.so",
1573 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09001574 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09001575 })
Jooyung Han344d5432019-08-23 11:17:39 +09001576}
1577
1578func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
1579 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
1580 apex_vndk {
1581 name: "myapex_v27",
1582 key: "myapex.key",
1583 file_contexts: "myapex",
1584 vndk_version: "27",
1585 }
1586 apex_vndk {
1587 name: "myapex_v27_other",
1588 key: "myapex.key",
1589 file_contexts: "myapex",
1590 vndk_version: "27",
1591 }
1592
1593 apex_key {
1594 name: "myapex.key",
1595 public_key: "testkey.avbpubkey",
1596 private_key: "testkey.pem",
1597 }
1598
1599 cc_library {
1600 name: "libvndk",
1601 srcs: ["mylib.cpp"],
1602 vendor_available: true,
1603 vndk: {
1604 enabled: true,
1605 },
1606 system_shared_libs: [],
1607 stl: "none",
1608 }
1609
1610 vndk_prebuilt_shared {
1611 name: "libvndk",
1612 version: "27",
1613 vendor_available: true,
1614 vndk: {
1615 enabled: true,
1616 },
1617 srcs: ["libvndk.so"],
1618 }
1619 `, withFiles(map[string][]byte{
1620 "libvndk.so": nil,
1621 }))
1622}
1623
Jooyung Han90eee022019-10-01 20:02:42 +09001624func TestVndkApexNameRule(t *testing.T) {
1625 ctx, _ := testApex(t, `
1626 apex_vndk {
1627 name: "myapex",
1628 key: "myapex.key",
1629 file_contexts: "myapex",
1630 }
1631 apex_vndk {
1632 name: "myapex_v28",
1633 key: "myapex.key",
1634 file_contexts: "myapex",
1635 vndk_version: "28",
1636 }
1637 apex_key {
1638 name: "myapex.key",
1639 public_key: "testkey.avbpubkey",
1640 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09001641 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09001642
1643 assertApexName := func(expected, moduleName string) {
Sundong Ahnabb64432019-10-22 13:58:29 +09001644 bundle := ctx.ModuleForTests(moduleName, "android_common_"+moduleName+"_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09001645 actual := proptools.String(bundle.properties.Apex_name)
1646 if !reflect.DeepEqual(actual, expected) {
1647 t.Errorf("Got '%v', expected '%v'", actual, expected)
1648 }
1649 }
1650
1651 assertApexName("com.android.vndk.vVER", "myapex")
1652 assertApexName("com.android.vndk.v28", "myapex_v28")
1653}
1654
Jooyung Han344d5432019-08-23 11:17:39 +09001655func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
1656 ctx, _ := testApex(t, `
1657 apex_vndk {
1658 name: "myapex",
1659 key: "myapex.key",
1660 file_contexts: "myapex",
1661 }
1662
1663 apex_key {
1664 name: "myapex.key",
1665 public_key: "testkey.avbpubkey",
1666 private_key: "testkey.pem",
1667 }
1668
1669 cc_library {
1670 name: "libvndk",
1671 srcs: ["mylib.cpp"],
1672 vendor_available: true,
1673 native_bridge_supported: true,
1674 host_supported: true,
1675 vndk: {
1676 enabled: true,
1677 },
1678 system_shared_libs: [],
1679 stl: "none",
1680 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09001681 `+vndkLibrariesTxtFiles("current"),
1682 withTargets(map[android.OsType][]android.Target{
1683 android.Android: []android.Target{
1684 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
1685 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
1686 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "arm64", NativeBridgeRelativePath: "x86_64"},
1687 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "arm", NativeBridgeRelativePath: "x86"},
1688 },
1689 }))
Jooyung Han344d5432019-08-23 11:17:39 +09001690
Jooyung Han31c470b2019-10-18 16:26:59 +09001691 ensureExactContents(t, ctx, "myapex", []string{
1692 "lib/libvndk.so",
1693 "lib64/libvndk.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09001694 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09001695 })
Jooyung Han344d5432019-08-23 11:17:39 +09001696}
1697
1698func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
1699 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
1700 apex_vndk {
1701 name: "myapex",
1702 key: "myapex.key",
1703 file_contexts: "myapex",
1704 native_bridge_supported: true,
1705 }
1706
1707 apex_key {
1708 name: "myapex.key",
1709 public_key: "testkey.avbpubkey",
1710 private_key: "testkey.pem",
1711 }
1712
1713 cc_library {
1714 name: "libvndk",
1715 srcs: ["mylib.cpp"],
1716 vendor_available: true,
1717 native_bridge_supported: true,
1718 host_supported: true,
1719 vndk: {
1720 enabled: true,
1721 },
1722 system_shared_libs: [],
1723 stl: "none",
1724 }
1725 `)
1726}
1727
Jooyung Han31c470b2019-10-18 16:26:59 +09001728func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09001729 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09001730 apex_vndk {
1731 name: "myapex_v27",
1732 key: "myapex.key",
1733 file_contexts: "myapex",
1734 vndk_version: "27",
1735 }
1736
1737 apex_key {
1738 name: "myapex.key",
1739 public_key: "testkey.avbpubkey",
1740 private_key: "testkey.pem",
1741 }
1742
1743 vndk_prebuilt_shared {
1744 name: "libvndk27",
1745 version: "27",
1746 target_arch: "arm",
1747 vendor_available: true,
1748 vndk: {
1749 enabled: true,
1750 },
1751 arch: {
1752 arm: {
1753 srcs: ["libvndk27.so"],
1754 }
1755 },
1756 }
1757
1758 vndk_prebuilt_shared {
1759 name: "libvndk27",
1760 version: "27",
1761 target_arch: "arm",
1762 binder32bit: true,
1763 vendor_available: true,
1764 vndk: {
1765 enabled: true,
1766 },
1767 arch: {
1768 arm: {
1769 srcs: ["libvndk27binder32.so"],
1770 }
1771 },
1772 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09001773 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09001774 withFiles(map[string][]byte{
1775 "libvndk27.so": nil,
1776 "libvndk27binder32.so": nil,
1777 }),
1778 withBinder32bit,
1779 withTargets(map[android.OsType][]android.Target{
1780 android.Android: []android.Target{
1781 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
1782 },
1783 }),
1784 )
1785
1786 ensureExactContents(t, ctx, "myapex_v27", []string{
1787 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09001788 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09001789 })
1790}
1791
Jooyung Hane1633032019-08-01 17:41:43 +09001792func TestDependenciesInApexManifest(t *testing.T) {
1793 ctx, _ := testApex(t, `
1794 apex {
1795 name: "myapex_nodep",
1796 key: "myapex.key",
1797 native_shared_libs: ["lib_nodep"],
1798 compile_multilib: "both",
1799 file_contexts: "myapex",
1800 }
1801
1802 apex {
1803 name: "myapex_dep",
1804 key: "myapex.key",
1805 native_shared_libs: ["lib_dep"],
1806 compile_multilib: "both",
1807 file_contexts: "myapex",
1808 }
1809
1810 apex {
1811 name: "myapex_provider",
1812 key: "myapex.key",
1813 native_shared_libs: ["libfoo"],
1814 compile_multilib: "both",
1815 file_contexts: "myapex",
1816 }
1817
1818 apex {
1819 name: "myapex_selfcontained",
1820 key: "myapex.key",
1821 native_shared_libs: ["lib_dep", "libfoo"],
1822 compile_multilib: "both",
1823 file_contexts: "myapex",
1824 }
1825
1826 apex_key {
1827 name: "myapex.key",
1828 public_key: "testkey.avbpubkey",
1829 private_key: "testkey.pem",
1830 }
1831
1832 cc_library {
1833 name: "lib_nodep",
1834 srcs: ["mylib.cpp"],
1835 system_shared_libs: [],
1836 stl: "none",
1837 }
1838
1839 cc_library {
1840 name: "lib_dep",
1841 srcs: ["mylib.cpp"],
1842 shared_libs: ["libfoo"],
1843 system_shared_libs: [],
1844 stl: "none",
1845 }
1846
1847 cc_library {
1848 name: "libfoo",
1849 srcs: ["mytest.cpp"],
1850 stubs: {
1851 versions: ["1"],
1852 },
1853 system_shared_libs: [],
1854 stl: "none",
1855 }
1856 `)
1857
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001858 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09001859 var provideNativeLibs, requireNativeLibs []string
1860
Sundong Ahnabb64432019-10-22 13:58:29 +09001861 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001862 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
1863 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09001864 ensureListEmpty(t, provideNativeLibs)
1865 ensureListEmpty(t, requireNativeLibs)
1866
Sundong Ahnabb64432019-10-22 13:58:29 +09001867 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001868 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
1869 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09001870 ensureListEmpty(t, provideNativeLibs)
1871 ensureListContains(t, requireNativeLibs, "libfoo.so")
1872
Sundong Ahnabb64432019-10-22 13:58:29 +09001873 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001874 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
1875 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09001876 ensureListContains(t, provideNativeLibs, "libfoo.so")
1877 ensureListEmpty(t, requireNativeLibs)
1878
Sundong Ahnabb64432019-10-22 13:58:29 +09001879 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001880 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
1881 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09001882 ensureListContains(t, provideNativeLibs, "libfoo.so")
1883 ensureListEmpty(t, requireNativeLibs)
1884}
1885
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001886func TestApexName(t *testing.T) {
1887 ctx, _ := testApex(t, `
1888 apex {
1889 name: "myapex",
1890 key: "myapex.key",
1891 apex_name: "com.android.myapex",
1892 }
1893
1894 apex_key {
1895 name: "myapex.key",
1896 public_key: "testkey.avbpubkey",
1897 private_key: "testkey.pem",
1898 }
1899 `)
1900
Sundong Ahnabb64432019-10-22 13:58:29 +09001901 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001902 apexManifestRule := module.Rule("apexManifestRule")
1903 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
1904 apexRule := module.Rule("apexRule")
1905 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
1906}
1907
Alex Light0851b882019-02-07 13:20:53 -08001908func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001909 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08001910 apex {
1911 name: "myapex",
1912 key: "myapex.key",
1913 native_shared_libs: ["mylib_common"],
1914 }
1915
1916 apex_key {
1917 name: "myapex.key",
1918 public_key: "testkey.avbpubkey",
1919 private_key: "testkey.pem",
1920 }
1921
1922 cc_library {
1923 name: "mylib_common",
1924 srcs: ["mylib.cpp"],
1925 system_shared_libs: [],
1926 stl: "none",
1927 }
1928 `)
1929
Sundong Ahnabb64432019-10-22 13:58:29 +09001930 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08001931 apexRule := module.Rule("apexRule")
1932 copyCmds := apexRule.Args["copy_commands"]
1933
1934 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
1935 t.Log("Apex was a test apex!")
1936 t.Fail()
1937 }
1938 // Ensure that main rule creates an output
1939 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
1940
1941 // Ensure that apex variant is created for the direct dep
1942 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_core_shared_myapex")
1943
1944 // Ensure that both direct and indirect deps are copied into apex
1945 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
1946
1947 // Ensure that the platform variant ends with _core_shared
1948 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_core_shared")
1949
1950 if !android.InAnyApex("mylib_common") {
1951 t.Log("Found mylib_common not in any apex!")
1952 t.Fail()
1953 }
1954}
1955
1956func TestTestApex(t *testing.T) {
1957 if android.InAnyApex("mylib_common_test") {
1958 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!")
1959 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001960 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08001961 apex_test {
1962 name: "myapex",
1963 key: "myapex.key",
1964 native_shared_libs: ["mylib_common_test"],
1965 }
1966
1967 apex_key {
1968 name: "myapex.key",
1969 public_key: "testkey.avbpubkey",
1970 private_key: "testkey.pem",
1971 }
1972
1973 cc_library {
1974 name: "mylib_common_test",
1975 srcs: ["mylib.cpp"],
1976 system_shared_libs: [],
1977 stl: "none",
1978 }
1979 `)
1980
Sundong Ahnabb64432019-10-22 13:58:29 +09001981 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08001982 apexRule := module.Rule("apexRule")
1983 copyCmds := apexRule.Args["copy_commands"]
1984
1985 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
1986 t.Log("Apex was not a test apex!")
1987 t.Fail()
1988 }
1989 // Ensure that main rule creates an output
1990 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
1991
1992 // Ensure that apex variant is created for the direct dep
1993 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_core_shared_myapex")
1994
1995 // Ensure that both direct and indirect deps are copied into apex
1996 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
1997
1998 // Ensure that the platform variant ends with _core_shared
1999 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_core_shared")
2000
2001 if android.InAnyApex("mylib_common_test") {
2002 t.Log("Found mylib_common_test in some apex!")
2003 t.Fail()
2004 }
2005}
2006
Alex Light9670d332019-01-29 18:07:33 -08002007func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002008 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08002009 apex {
2010 name: "myapex",
2011 key: "myapex.key",
2012 multilib: {
2013 first: {
2014 native_shared_libs: ["mylib_common"],
2015 }
2016 },
2017 target: {
2018 android: {
2019 multilib: {
2020 first: {
2021 native_shared_libs: ["mylib"],
2022 }
2023 }
2024 },
2025 host: {
2026 multilib: {
2027 first: {
2028 native_shared_libs: ["mylib2"],
2029 }
2030 }
2031 }
2032 }
2033 }
2034
2035 apex_key {
2036 name: "myapex.key",
2037 public_key: "testkey.avbpubkey",
2038 private_key: "testkey.pem",
2039 }
2040
2041 cc_library {
2042 name: "mylib",
2043 srcs: ["mylib.cpp"],
2044 system_shared_libs: [],
2045 stl: "none",
2046 }
2047
2048 cc_library {
2049 name: "mylib_common",
2050 srcs: ["mylib.cpp"],
2051 system_shared_libs: [],
2052 stl: "none",
2053 compile_multilib: "first",
2054 }
2055
2056 cc_library {
2057 name: "mylib2",
2058 srcs: ["mylib.cpp"],
2059 system_shared_libs: [],
2060 stl: "none",
2061 compile_multilib: "first",
2062 }
2063 `)
2064
Sundong Ahnabb64432019-10-22 13:58:29 +09002065 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08002066 copyCmds := apexRule.Args["copy_commands"]
2067
2068 // Ensure that main rule creates an output
2069 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2070
2071 // Ensure that apex variant is created for the direct dep
2072 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared_myapex")
2073 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_core_shared_myapex")
2074 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared_myapex")
2075
2076 // Ensure that both direct and indirect deps are copied into apex
2077 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
2078 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2079 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
2080
2081 // Ensure that the platform variant ends with _core_shared
2082 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared")
2083 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_core_shared")
2084 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared")
2085}
Jiyong Park04480cf2019-02-06 00:16:29 +09002086
2087func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002088 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09002089 apex {
2090 name: "myapex",
2091 key: "myapex.key",
2092 binaries: ["myscript"],
2093 }
2094
2095 apex_key {
2096 name: "myapex.key",
2097 public_key: "testkey.avbpubkey",
2098 private_key: "testkey.pem",
2099 }
2100
2101 sh_binary {
2102 name: "myscript",
2103 src: "mylib.cpp",
2104 filename: "myscript.sh",
2105 sub_dir: "script",
2106 }
2107 `)
2108
Sundong Ahnabb64432019-10-22 13:58:29 +09002109 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09002110 copyCmds := apexRule.Args["copy_commands"]
2111
2112 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
2113}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002114
2115func TestApexInProductPartition(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002116 ctx, _ := testApex(t, `
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002117 apex {
2118 name: "myapex",
2119 key: "myapex.key",
2120 native_shared_libs: ["mylib"],
2121 product_specific: true,
2122 }
2123
2124 apex_key {
2125 name: "myapex.key",
2126 public_key: "testkey.avbpubkey",
2127 private_key: "testkey.pem",
2128 product_specific: true,
2129 }
2130
2131 cc_library {
2132 name: "mylib",
2133 srcs: ["mylib.cpp"],
2134 system_shared_libs: [],
2135 stl: "none",
2136 }
2137 `)
2138
Sundong Ahnabb64432019-10-22 13:58:29 +09002139 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossff6c33d2019-10-02 16:01:35 -07002140 expected := buildDir + "/target/product/test_device/product/apex"
2141 actual := apex.installDir.String()
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002142 if actual != expected {
2143 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
2144 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002145}
Jiyong Park67882562019-03-21 01:11:21 +09002146
2147func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002148 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09002149 apex_key {
2150 name: "myapex.key",
2151 public_key: ":my.avbpubkey",
2152 private_key: ":my.pem",
2153 product_specific: true,
2154 }
2155
2156 filegroup {
2157 name: "my.avbpubkey",
2158 srcs: ["testkey2.avbpubkey"],
2159 }
2160
2161 filegroup {
2162 name: "my.pem",
2163 srcs: ["testkey2.pem"],
2164 }
2165 `)
2166
2167 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
2168 expected_pubkey := "testkey2.avbpubkey"
2169 actual_pubkey := apex_key.public_key_file.String()
2170 if actual_pubkey != expected_pubkey {
2171 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
2172 }
2173 expected_privkey := "testkey2.pem"
2174 actual_privkey := apex_key.private_key_file.String()
2175 if actual_privkey != expected_privkey {
2176 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
2177 }
2178}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07002179
2180func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002181 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07002182 prebuilt_apex {
2183 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09002184 arch: {
2185 arm64: {
2186 src: "myapex-arm64.apex",
2187 },
2188 arm: {
2189 src: "myapex-arm.apex",
2190 },
2191 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07002192 }
2193 `)
2194
2195 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
2196
Jiyong Parkc95714e2019-03-29 14:23:10 +09002197 expectedInput := "myapex-arm64.apex"
2198 if prebuilt.inputApex.String() != expectedInput {
2199 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
2200 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07002201}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01002202
2203func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002204 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01002205 prebuilt_apex {
2206 name: "myapex",
2207 src: "myapex-arm.apex",
2208 filename: "notmyapex.apex",
2209 }
2210 `)
2211
2212 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
2213
2214 expected := "notmyapex.apex"
2215 if p.installFilename != expected {
2216 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
2217 }
2218}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07002219
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002220func TestPrebuiltOverrides(t *testing.T) {
2221 ctx, config := testApex(t, `
2222 prebuilt_apex {
2223 name: "myapex.prebuilt",
2224 src: "myapex-arm.apex",
2225 overrides: [
2226 "myapex",
2227 ],
2228 }
2229 `)
2230
2231 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
2232
2233 expected := []string{"myapex"}
2234 actual := android.AndroidMkEntriesForTest(t, config, "", p).EntryMap["LOCAL_OVERRIDES_PACKAGES"]
2235 if !reflect.DeepEqual(actual, expected) {
2236 t.Errorf("Incorrect LOCAL_OVERRIDES_PACKAGES value '%s', expected '%s'", actual, expected)
2237 }
2238}
2239
Roland Levillain630846d2019-06-26 12:48:34 +01002240func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01002241 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01002242 apex_test {
2243 name: "myapex",
2244 key: "myapex.key",
2245 tests: [
2246 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01002247 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01002248 ],
2249 }
2250
2251 apex_key {
2252 name: "myapex.key",
2253 public_key: "testkey.avbpubkey",
2254 private_key: "testkey.pem",
2255 }
2256
2257 cc_test {
2258 name: "mytest",
2259 gtest: false,
2260 srcs: ["mytest.cpp"],
2261 relative_install_path: "test",
2262 system_shared_libs: [],
2263 static_executable: true,
2264 stl: "none",
2265 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01002266
2267 cc_test {
2268 name: "mytests",
2269 gtest: false,
2270 srcs: [
2271 "mytest1.cpp",
2272 "mytest2.cpp",
2273 "mytest3.cpp",
2274 ],
2275 test_per_src: true,
2276 relative_install_path: "test",
2277 system_shared_libs: [],
2278 static_executable: true,
2279 stl: "none",
2280 }
Roland Levillain630846d2019-06-26 12:48:34 +01002281 `)
2282
Sundong Ahnabb64432019-10-22 13:58:29 +09002283 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01002284 copyCmds := apexRule.Args["copy_commands"]
2285
2286 // Ensure that test dep is copied into apex.
2287 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Roland Levillain9b5fde92019-06-28 15:41:19 +01002288
2289 // Ensure that test deps built with `test_per_src` are copied into apex.
2290 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
2291 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
2292 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01002293
2294 // Ensure the module is correctly translated.
Sundong Ahnabb64432019-10-22 13:58:29 +09002295 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Roland Levillainf89cd092019-07-29 16:22:59 +01002296 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2297 name := apexBundle.BaseModuleName()
2298 prefix := "TARGET_"
2299 var builder strings.Builder
2300 data.Custom(&builder, name, prefix, "", data)
2301 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09002302 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
2303 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
2304 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
2305 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
2306 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.json.myapex\n")
2307 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01002308 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01002309}
2310
Jooyung Han5c998b92019-06-27 11:30:33 +09002311func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002312 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09002313 apex {
2314 name: "myapex",
2315 key: "myapex.key",
2316 native_shared_libs: ["mylib"],
2317 uses: ["commonapex"],
2318 }
2319
2320 apex {
2321 name: "commonapex",
2322 key: "myapex.key",
2323 native_shared_libs: ["libcommon"],
2324 provide_cpp_shared_libs: true,
2325 }
2326
2327 apex_key {
2328 name: "myapex.key",
2329 public_key: "testkey.avbpubkey",
2330 private_key: "testkey.pem",
2331 }
2332
2333 cc_library {
2334 name: "mylib",
2335 srcs: ["mylib.cpp"],
2336 shared_libs: ["libcommon"],
2337 system_shared_libs: [],
2338 stl: "none",
2339 }
2340
2341 cc_library {
2342 name: "libcommon",
2343 srcs: ["mylib_common.cpp"],
2344 system_shared_libs: [],
2345 stl: "none",
2346 }
2347 `)
2348
Sundong Ahnabb64432019-10-22 13:58:29 +09002349 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09002350 apexRule1 := module1.Rule("apexRule")
2351 copyCmds1 := apexRule1.Args["copy_commands"]
2352
Sundong Ahnabb64432019-10-22 13:58:29 +09002353 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09002354 apexRule2 := module2.Rule("apexRule")
2355 copyCmds2 := apexRule2.Args["copy_commands"]
2356
2357 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared_myapex")
2358 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_core_shared_commonapex")
2359 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
2360 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
2361 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
2362}
2363
2364func TestApexUsesFailsIfNotProvided(t *testing.T) {
2365 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
2366 apex {
2367 name: "myapex",
2368 key: "myapex.key",
2369 uses: ["commonapex"],
2370 }
2371
2372 apex {
2373 name: "commonapex",
2374 key: "myapex.key",
2375 }
2376
2377 apex_key {
2378 name: "myapex.key",
2379 public_key: "testkey.avbpubkey",
2380 private_key: "testkey.pem",
2381 }
2382 `)
2383 testApexError(t, `uses: "commonapex" is not a provider`, `
2384 apex {
2385 name: "myapex",
2386 key: "myapex.key",
2387 uses: ["commonapex"],
2388 }
2389
2390 cc_library {
2391 name: "commonapex",
2392 system_shared_libs: [],
2393 stl: "none",
2394 }
2395
2396 apex_key {
2397 name: "myapex.key",
2398 public_key: "testkey.avbpubkey",
2399 private_key: "testkey.pem",
2400 }
2401 `)
2402}
2403
2404func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
2405 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
2406 apex {
2407 name: "myapex",
2408 key: "myapex.key",
2409 use_vendor: true,
2410 uses: ["commonapex"],
2411 }
2412
2413 apex {
2414 name: "commonapex",
2415 key: "myapex.key",
2416 provide_cpp_shared_libs: true,
2417 }
2418
2419 apex_key {
2420 name: "myapex.key",
2421 public_key: "testkey.avbpubkey",
2422 private_key: "testkey.pem",
2423 }
Jooyung Handc782442019-11-01 03:14:38 +09002424 `, func(fs map[string][]byte, config android.Config) {
2425 setUseVendorWhitelistForTest(config, []string{"myapex"})
2426 })
Jooyung Han5c998b92019-06-27 11:30:33 +09002427}
2428
Jooyung Hand48f3c32019-08-23 11:18:57 +09002429func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
2430 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
2431 apex {
2432 name: "myapex",
2433 key: "myapex.key",
2434 native_shared_libs: ["libfoo"],
2435 }
2436
2437 apex_key {
2438 name: "myapex.key",
2439 public_key: "testkey.avbpubkey",
2440 private_key: "testkey.pem",
2441 }
2442
2443 cc_library {
2444 name: "libfoo",
2445 stl: "none",
2446 system_shared_libs: [],
2447 enabled: false,
2448 }
2449 `)
2450 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
2451 apex {
2452 name: "myapex",
2453 key: "myapex.key",
2454 java_libs: ["myjar"],
2455 }
2456
2457 apex_key {
2458 name: "myapex.key",
2459 public_key: "testkey.avbpubkey",
2460 private_key: "testkey.pem",
2461 }
2462
2463 java_library {
2464 name: "myjar",
2465 srcs: ["foo/bar/MyClass.java"],
2466 sdk_version: "none",
2467 system_modules: "none",
2468 compile_dex: true,
2469 enabled: false,
2470 }
2471 `)
2472}
2473
Sundong Ahne1f05aa2019-08-27 13:55:42 +09002474func TestApexWithApps(t *testing.T) {
2475 ctx, _ := testApex(t, `
2476 apex {
2477 name: "myapex",
2478 key: "myapex.key",
2479 apps: [
2480 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09002481 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09002482 ],
2483 }
2484
2485 apex_key {
2486 name: "myapex.key",
2487 public_key: "testkey.avbpubkey",
2488 private_key: "testkey.pem",
2489 }
2490
2491 android_app {
2492 name: "AppFoo",
2493 srcs: ["foo/bar/MyClass.java"],
2494 sdk_version: "none",
2495 system_modules: "none",
2496 }
Jiyong Parkf7487312019-10-17 12:54:30 +09002497
2498 android_app {
2499 name: "AppFooPriv",
2500 srcs: ["foo/bar/MyClass.java"],
2501 sdk_version: "none",
2502 system_modules: "none",
2503 privileged: true,
2504 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09002505 `)
2506
Sundong Ahnabb64432019-10-22 13:58:29 +09002507 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09002508 apexRule := module.Rule("apexRule")
2509 copyCmds := apexRule.Args["copy_commands"]
2510
2511 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09002512 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Dario Frenicde2a032019-10-27 00:29:22 +01002513}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09002514
Dario Frenicde2a032019-10-27 00:29:22 +01002515func TestApexWithAppImports(t *testing.T) {
2516 ctx, _ := testApex(t, `
2517 apex {
2518 name: "myapex",
2519 key: "myapex.key",
2520 apps: [
2521 "AppFooPrebuilt",
2522 "AppFooPrivPrebuilt",
2523 ],
2524 }
2525
2526 apex_key {
2527 name: "myapex.key",
2528 public_key: "testkey.avbpubkey",
2529 private_key: "testkey.pem",
2530 }
2531
2532 android_app_import {
2533 name: "AppFooPrebuilt",
2534 apk: "PrebuiltAppFoo.apk",
2535 presigned: true,
2536 dex_preopt: {
2537 enabled: false,
2538 },
2539 }
2540
2541 android_app_import {
2542 name: "AppFooPrivPrebuilt",
2543 apk: "PrebuiltAppFooPriv.apk",
2544 privileged: true,
2545 presigned: true,
2546 dex_preopt: {
2547 enabled: false,
2548 },
2549 }
2550 `)
2551
Sundong Ahnabb64432019-10-22 13:58:29 +09002552 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01002553 apexRule := module.Rule("apexRule")
2554 copyCmds := apexRule.Args["copy_commands"]
2555
2556 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
2557 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AppFooPrivPrebuilt.apk")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09002558}
2559
Jiyong Park127b40b2019-09-30 16:04:35 +09002560func TestApexAvailable(t *testing.T) {
2561 // libfoo is not available to myapex, but only to otherapex
2562 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
2563 apex {
2564 name: "myapex",
2565 key: "myapex.key",
2566 native_shared_libs: ["libfoo"],
2567 }
2568
2569 apex_key {
2570 name: "myapex.key",
2571 public_key: "testkey.avbpubkey",
2572 private_key: "testkey.pem",
2573 }
2574
2575 apex {
2576 name: "otherapex",
2577 key: "otherapex.key",
2578 native_shared_libs: ["libfoo"],
2579 }
2580
2581 apex_key {
2582 name: "otherapex.key",
2583 public_key: "testkey.avbpubkey",
2584 private_key: "testkey.pem",
2585 }
2586
2587 cc_library {
2588 name: "libfoo",
2589 stl: "none",
2590 system_shared_libs: [],
2591 apex_available: ["otherapex"],
2592 }`)
2593
2594 // libbar is an indirect dep
2595 testApexError(t, "requires \"libbar\" that is not available for the APEX", `
2596 apex {
2597 name: "myapex",
2598 key: "myapex.key",
2599 native_shared_libs: ["libfoo"],
2600 }
2601
2602 apex_key {
2603 name: "myapex.key",
2604 public_key: "testkey.avbpubkey",
2605 private_key: "testkey.pem",
2606 }
2607
2608 apex {
2609 name: "otherapex",
2610 key: "otherapex.key",
2611 native_shared_libs: ["libfoo"],
2612 }
2613
2614 apex_key {
2615 name: "otherapex.key",
2616 public_key: "testkey.avbpubkey",
2617 private_key: "testkey.pem",
2618 }
2619
2620 cc_library {
2621 name: "libfoo",
2622 stl: "none",
2623 shared_libs: ["libbar"],
2624 system_shared_libs: [],
2625 apex_available: ["myapex", "otherapex"],
2626 }
2627
2628 cc_library {
2629 name: "libbar",
2630 stl: "none",
2631 system_shared_libs: [],
2632 apex_available: ["otherapex"],
2633 }`)
2634
2635 testApexError(t, "\"otherapex\" is not a valid module name", `
2636 apex {
2637 name: "myapex",
2638 key: "myapex.key",
2639 native_shared_libs: ["libfoo"],
2640 }
2641
2642 apex_key {
2643 name: "myapex.key",
2644 public_key: "testkey.avbpubkey",
2645 private_key: "testkey.pem",
2646 }
2647
2648 cc_library {
2649 name: "libfoo",
2650 stl: "none",
2651 system_shared_libs: [],
2652 apex_available: ["otherapex"],
2653 }`)
2654
2655 ctx, _ := testApex(t, `
2656 apex {
2657 name: "myapex",
2658 key: "myapex.key",
2659 native_shared_libs: ["libfoo", "libbar"],
2660 }
2661
2662 apex_key {
2663 name: "myapex.key",
2664 public_key: "testkey.avbpubkey",
2665 private_key: "testkey.pem",
2666 }
2667
2668 cc_library {
2669 name: "libfoo",
2670 stl: "none",
2671 system_shared_libs: [],
2672 apex_available: ["myapex"],
2673 }
2674
2675 cc_library {
2676 name: "libbar",
2677 stl: "none",
2678 system_shared_libs: [],
2679 apex_available: ["//apex_available:anyapex"],
2680 }`)
2681
2682 // check that libfoo and libbar are created only for myapex, but not for the platform
2683 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_core_shared_myapex")
2684 ensureListNotContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_core_shared")
2685 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_core_shared_myapex")
2686 ensureListNotContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_core_shared")
2687
2688 ctx, _ = testApex(t, `
2689 apex {
2690 name: "myapex",
2691 key: "myapex.key",
2692 }
2693
2694 apex_key {
2695 name: "myapex.key",
2696 public_key: "testkey.avbpubkey",
2697 private_key: "testkey.pem",
2698 }
2699
2700 cc_library {
2701 name: "libfoo",
2702 stl: "none",
2703 system_shared_libs: [],
2704 apex_available: ["//apex_available:platform"],
2705 }`)
2706
2707 // check that libfoo is created only for the platform
2708 ensureListNotContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_core_shared_myapex")
2709 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_core_shared")
Jiyong Parka90ca002019-10-07 15:47:24 +09002710
2711 ctx, _ = testApex(t, `
2712 apex {
2713 name: "myapex",
2714 key: "myapex.key",
2715 native_shared_libs: ["libfoo"],
2716 }
2717
2718 apex_key {
2719 name: "myapex.key",
2720 public_key: "testkey.avbpubkey",
2721 private_key: "testkey.pem",
2722 }
2723
2724 cc_library {
2725 name: "libfoo",
2726 stl: "none",
2727 system_shared_libs: [],
2728 apex_available: ["myapex"],
2729 static: {
2730 apex_available: ["//apex_available:platform"],
2731 },
2732 }`)
2733
2734 // shared variant of libfoo is only available to myapex
2735 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_core_shared_myapex")
2736 ensureListNotContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_core_shared")
2737 // but the static variant is available to both myapex and the platform
2738 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_core_static_myapex")
2739 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_core_static")
Jiyong Park127b40b2019-09-30 16:04:35 +09002740}
2741
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07002742func TestMain(m *testing.M) {
2743 run := func() int {
2744 setUp()
2745 defer tearDown()
2746
2747 return m.Run()
2748 }
2749
2750 os.Exit(run())
2751}