blob: f034f2a697884416ac487cbe129b3e16c887258e [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"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070020 "reflect"
Jiyong Park25fc6a92018-11-18 18:02:45 +090021 "strings"
22 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090023
24 "github.com/google/blueprint/proptools"
25
26 "android/soong/android"
27 "android/soong/cc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090028 "android/soong/java"
Jiyong Park25fc6a92018-11-18 18:02:45 +090029)
30
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070031var buildDir string
32
Jooyung Hand3639552019-08-09 12:57:43 +090033// names returns name list from white space separated string
34func names(s string) (ns []string) {
35 for _, n := range strings.Split(s, " ") {
36 if len(n) > 0 {
37 ns = append(ns, n)
38 }
39 }
40 return
41}
42
Jooyung Han5c998b92019-06-27 11:30:33 +090043func testApexError(t *testing.T, pattern, bp string) {
44 ctx, config := testApexContext(t, bp)
45 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
46 if len(errs) > 0 {
47 android.FailIfNoMatchingErrors(t, pattern, errs)
48 return
49 }
50 _, errs = ctx.PrepareBuildActions(config)
51 if len(errs) > 0 {
52 android.FailIfNoMatchingErrors(t, pattern, errs)
53 return
54 }
55
56 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
57}
58
Jaewoong Jung22f7d182019-07-16 18:25:41 -070059func testApex(t *testing.T, bp string) (*android.TestContext, android.Config) {
Jooyung Han5c998b92019-06-27 11:30:33 +090060 ctx, config := testApexContext(t, bp)
61 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
62 android.FailIfErrored(t, errs)
63 _, errs = ctx.PrepareBuildActions(config)
64 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070065 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090066}
67
68func testApexContext(t *testing.T, bp string) (*android.TestContext, android.Config) {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -070069 config := android.TestArchConfig(buildDir, nil)
70 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
71 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
72 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
73 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
74 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Jiyong Park25fc6a92018-11-18 18:02:45 +090075
76 ctx := android.NewTestArchContext()
Alex Light0851b882019-02-07 13:20:53 -080077 ctx.RegisterModuleType("apex", android.ModuleFactoryAdaptor(apexBundleFactory))
78 ctx.RegisterModuleType("apex_test", android.ModuleFactoryAdaptor(testApexBundleFactory))
Jiyong Park25fc6a92018-11-18 18:02:45 +090079 ctx.RegisterModuleType("apex_key", android.ModuleFactoryAdaptor(apexKeyFactory))
Jiyong Park30ca9372019-02-07 16:27:23 +090080 ctx.RegisterModuleType("apex_defaults", android.ModuleFactoryAdaptor(defaultsFactory))
Jaewoong Jung939ebd52019-03-26 15:07:36 -070081 ctx.RegisterModuleType("prebuilt_apex", android.ModuleFactoryAdaptor(PrebuiltFactory))
Jiyong Park30ca9372019-02-07 16:27:23 +090082 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Jiyong Park25fc6a92018-11-18 18:02:45 +090083
84 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
85 ctx.TopDown("apex_deps", apexDepsMutator)
86 ctx.BottomUp("apex", apexMutator)
Jooyung Han5c998b92019-06-27 11:30:33 +090087 ctx.BottomUp("apex_uses", apexUsesMutator)
Jaewoong Jung939ebd52019-03-26 15:07:36 -070088 ctx.TopDown("prebuilt_select", android.PrebuiltSelectModuleMutator).Parallel()
89 ctx.BottomUp("prebuilt_postdeps", android.PrebuiltPostDepsMutator).Parallel()
Jiyong Park25fc6a92018-11-18 18:02:45 +090090 })
91
92 ctx.RegisterModuleType("cc_library", android.ModuleFactoryAdaptor(cc.LibraryFactory))
93 ctx.RegisterModuleType("cc_library_shared", android.ModuleFactoryAdaptor(cc.LibrarySharedFactory))
Jiyong Park7e636d02019-01-28 16:16:54 +090094 ctx.RegisterModuleType("cc_library_headers", android.ModuleFactoryAdaptor(cc.LibraryHeaderFactory))
Jiyong Park16e91a02018-12-20 18:18:08 +090095 ctx.RegisterModuleType("cc_binary", android.ModuleFactoryAdaptor(cc.BinaryFactory))
Jiyong Park25fc6a92018-11-18 18:02:45 +090096 ctx.RegisterModuleType("cc_object", android.ModuleFactoryAdaptor(cc.ObjectFactory))
Roland Levillain630846d2019-06-26 12:48:34 +010097 ctx.RegisterModuleType("cc_test", android.ModuleFactoryAdaptor(cc.TestFactory))
Jiyong Parkda6eb592018-12-19 17:12:36 +090098 ctx.RegisterModuleType("llndk_library", android.ModuleFactoryAdaptor(cc.LlndkLibraryFactory))
Jiyong Park25fc6a92018-11-18 18:02:45 +090099 ctx.RegisterModuleType("toolchain_library", android.ModuleFactoryAdaptor(cc.ToolchainLibraryFactory))
Jiyong Park7c2ee712018-12-07 00:42:25 +0900100 ctx.RegisterModuleType("prebuilt_etc", android.ModuleFactoryAdaptor(android.PrebuiltEtcFactory))
Jiyong Park04480cf2019-02-06 00:16:29 +0900101 ctx.RegisterModuleType("sh_binary", android.ModuleFactoryAdaptor(android.ShBinaryFactory))
Jiyong Parkb2742fd2019-02-11 11:38:15 +0900102 ctx.RegisterModuleType("android_app_certificate", android.ModuleFactoryAdaptor(java.AndroidAppCertificateFactory))
Jiyong Park809bb722019-02-13 21:33:49 +0900103 ctx.RegisterModuleType("filegroup", android.ModuleFactoryAdaptor(android.FileGroupFactory))
Jiyong Park7f7766d2019-07-25 22:02:35 +0900104 ctx.RegisterModuleType("java_library", android.ModuleFactoryAdaptor(java.LibraryFactory))
105
Jaewoong Jung939ebd52019-03-26 15:07:36 -0700106 ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) {
107 ctx.BottomUp("prebuilts", android.PrebuiltMutator).Parallel()
108 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900109 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Jiyong Parkda6eb592018-12-19 17:12:36 +0900110 ctx.BottomUp("image", cc.ImageMutator).Parallel()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900111 ctx.BottomUp("link", cc.LinkageMutator).Parallel()
Jiyong Parkda6eb592018-12-19 17:12:36 +0900112 ctx.BottomUp("vndk", cc.VndkMutator).Parallel()
Roland Levillain9b5fde92019-06-28 15:41:19 +0100113 ctx.BottomUp("test_per_src", cc.TestPerSrcMutator).Parallel()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900114 ctx.BottomUp("version", cc.VersionMutator).Parallel()
115 ctx.BottomUp("begin", cc.BeginMutator).Parallel()
116 })
117
118 ctx.Register()
119
120 bp = bp + `
121 toolchain_library {
122 name: "libcompiler_rt-extras",
123 src: "",
Jiyong Parkda6eb592018-12-19 17:12:36 +0900124 vendor_available: true,
125 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900126 }
127
128 toolchain_library {
129 name: "libatomic",
130 src: "",
Jiyong Parkda6eb592018-12-19 17:12:36 +0900131 vendor_available: true,
132 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900133 }
134
135 toolchain_library {
136 name: "libgcc",
137 src: "",
Jiyong Parkda6eb592018-12-19 17:12:36 +0900138 vendor_available: true,
139 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900140 }
141
142 toolchain_library {
Yi Kongacee27c2019-03-29 20:05:14 -0700143 name: "libgcc_stripped",
144 src: "",
145 vendor_available: true,
146 recovery_available: true,
147 }
148
149 toolchain_library {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900150 name: "libclang_rt.builtins-aarch64-android",
151 src: "",
Jiyong Parkda6eb592018-12-19 17:12:36 +0900152 vendor_available: true,
153 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900154 }
155
156 toolchain_library {
157 name: "libclang_rt.builtins-arm-android",
158 src: "",
Jiyong Parkda6eb592018-12-19 17:12:36 +0900159 vendor_available: true,
160 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900161 }
162
163 cc_object {
164 name: "crtbegin_so",
165 stl: "none",
Jiyong Parkda6eb592018-12-19 17:12:36 +0900166 vendor_available: true,
167 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900168 }
169
170 cc_object {
171 name: "crtend_so",
172 stl: "none",
Jiyong Parkda6eb592018-12-19 17:12:36 +0900173 vendor_available: true,
174 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900175 }
176
Alex Light3d673592019-01-18 14:37:31 -0800177 cc_object {
178 name: "crtbegin_static",
179 stl: "none",
180 }
181
182 cc_object {
183 name: "crtend_android",
184 stl: "none",
185 }
186
Jiyong Parkda6eb592018-12-19 17:12:36 +0900187 llndk_library {
188 name: "libc",
189 symbol_file: "",
190 }
191
192 llndk_library {
193 name: "libm",
194 symbol_file: "",
195 }
196
197 llndk_library {
198 name: "libdl",
199 symbol_file: "",
200 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900201 `
202
203 ctx.MockFileSystem(map[string][]byte{
Jiyong Parkb2742fd2019-02-11 11:38:15 +0900204 "Android.bp": []byte(bp),
Dan Willemsen412160e2019-04-09 21:36:26 -0700205 "build/make/target/product/security": nil,
Jiyong Parkb2742fd2019-02-11 11:38:15 +0900206 "apex_manifest.json": nil,
Jiyong Park809bb722019-02-13 21:33:49 +0900207 "AndroidManifest.xml": nil,
Jiyong Parkb2742fd2019-02-11 11:38:15 +0900208 "system/sepolicy/apex/myapex-file_contexts": nil,
209 "system/sepolicy/apex/myapex_keytest-file_contexts": nil,
210 "system/sepolicy/apex/otherapex-file_contexts": nil,
Jooyung Han5c998b92019-06-27 11:30:33 +0900211 "system/sepolicy/apex/commonapex-file_contexts": nil,
Jiyong Parkb2742fd2019-02-11 11:38:15 +0900212 "mylib.cpp": nil,
Jooyung Han5c998b92019-06-27 11:30:33 +0900213 "mylib_common.cpp": nil,
Roland Levillain9b5fde92019-06-28 15:41:19 +0100214 "mytest.cpp": nil,
215 "mytest1.cpp": nil,
216 "mytest2.cpp": nil,
217 "mytest3.cpp": nil,
Jiyong Parkb2742fd2019-02-11 11:38:15 +0900218 "myprebuilt": nil,
219 "my_include": nil,
Jiyong Park7f7766d2019-07-25 22:02:35 +0900220 "foo/bar/MyClass.java": nil,
Jiyong Parkb2742fd2019-02-11 11:38:15 +0900221 "vendor/foo/devkeys/test.x509.pem": nil,
222 "vendor/foo/devkeys/test.pk8": nil,
223 "testkey.x509.pem": nil,
224 "testkey.pk8": nil,
225 "testkey.override.x509.pem": nil,
226 "testkey.override.pk8": nil,
227 "vendor/foo/devkeys/testkey.avbpubkey": nil,
228 "vendor/foo/devkeys/testkey.pem": nil,
Jiyong Park52818fc2019-03-18 12:01:38 +0900229 "NOTICE": nil,
230 "custom_notice": nil,
Jiyong Park67882562019-03-21 01:11:21 +0900231 "testkey2.avbpubkey": nil,
232 "testkey2.pem": nil,
Jiyong Parkc95714e2019-03-29 14:23:10 +0900233 "myapex-arm64.apex": nil,
234 "myapex-arm.apex": nil,
Jiyong Park71b519d2019-04-18 17:25:49 +0900235 "frameworks/base/api/current.txt": nil,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900236 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900237
Jooyung Han5c998b92019-06-27 11:30:33 +0900238 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900239}
240
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700241func setUp() {
242 var err error
243 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900244 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700245 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900247}
248
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700249func tearDown() {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900250 os.RemoveAll(buildDir)
251}
252
253// ensure that 'result' contains 'expected'
254func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900255 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900256 if !strings.Contains(result, expected) {
257 t.Errorf("%q is not found in %q", expected, result)
258 }
259}
260
261// ensures that 'result' does not contain 'notExpected'
262func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900263 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900264 if strings.Contains(result, notExpected) {
265 t.Errorf("%q is found in %q", notExpected, result)
266 }
267}
268
269func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900270 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900271 if !android.InList(expected, result) {
272 t.Errorf("%q is not found in %v", expected, result)
273 }
274}
275
276func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900277 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900278 if android.InList(notExpected, result) {
279 t.Errorf("%q is found in %v", notExpected, result)
280 }
281}
282
Jooyung Hane1633032019-08-01 17:41:43 +0900283func ensureListEmpty(t *testing.T, result []string) {
284 t.Helper()
285 if len(result) > 0 {
286 t.Errorf("%q is expected to be empty", result)
287 }
288}
289
Jiyong Park25fc6a92018-11-18 18:02:45 +0900290// Minimal test
291func TestBasicApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700292 ctx, _ := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900293 apex_defaults {
294 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900295 manifest: ":myapex.manifest",
296 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900297 key: "myapex.key",
298 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800299 multilib: {
300 both: {
301 binaries: ["foo",],
302 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900303 },
304 java_libs: ["myjar"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900305 }
306
Jiyong Park30ca9372019-02-07 16:27:23 +0900307 apex {
308 name: "myapex",
309 defaults: ["myapex-defaults"],
310 }
311
Jiyong Park25fc6a92018-11-18 18:02:45 +0900312 apex_key {
313 name: "myapex.key",
314 public_key: "testkey.avbpubkey",
315 private_key: "testkey.pem",
316 }
317
Jiyong Park809bb722019-02-13 21:33:49 +0900318 filegroup {
319 name: "myapex.manifest",
320 srcs: ["apex_manifest.json"],
321 }
322
323 filegroup {
324 name: "myapex.androidmanifest",
325 srcs: ["AndroidManifest.xml"],
326 }
327
Jiyong Park25fc6a92018-11-18 18:02:45 +0900328 cc_library {
329 name: "mylib",
330 srcs: ["mylib.cpp"],
331 shared_libs: ["mylib2"],
332 system_shared_libs: [],
333 stl: "none",
334 }
335
Alex Light3d673592019-01-18 14:37:31 -0800336 cc_binary {
337 name: "foo",
338 srcs: ["mylib.cpp"],
339 compile_multilib: "both",
340 multilib: {
341 lib32: {
342 suffix: "32",
343 },
344 lib64: {
345 suffix: "64",
346 },
347 },
348 symlinks: ["foo_link_"],
349 symlink_preferred_arch: true,
350 system_shared_libs: [],
351 static_executable: true,
352 stl: "none",
353 }
354
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355 cc_library {
356 name: "mylib2",
357 srcs: ["mylib.cpp"],
358 system_shared_libs: [],
359 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900360 notice: "custom_notice",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900361 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900362
363 java_library {
364 name: "myjar",
365 srcs: ["foo/bar/MyClass.java"],
366 sdk_version: "none",
367 system_modules: "none",
368 compile_dex: true,
369 static_libs: ["myotherjar"],
370 }
371
372 java_library {
373 name: "myotherjar",
374 srcs: ["foo/bar/MyClass.java"],
375 sdk_version: "none",
376 system_modules: "none",
377 compile_dex: true,
378 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900379 `)
380
381 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900382
383 optFlags := apexRule.Args["opt_flags"]
384 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700385 // Ensure that the NOTICE output is being packaged as an asset.
386 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900387
Jiyong Park25fc6a92018-11-18 18:02:45 +0900388 copyCmds := apexRule.Args["copy_commands"]
389
390 // Ensure that main rule creates an output
391 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
392
393 // Ensure that apex variant is created for the direct dep
Jiyong Parkda6eb592018-12-19 17:12:36 +0900394 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900395 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900396
397 // Ensure that apex variant is created for the indirect dep
Jiyong Parkda6eb592018-12-19 17:12:36 +0900398 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900399 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900400
401 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800402 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
403 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900404 ensureContains(t, copyCmds, "image.apex/javalib/myjar.jar")
405 // .. but not for java libs
406 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800407
Jiyong Park7f7766d2019-07-25 22:02:35 +0900408 // Ensure that the platform variant ends with _core_shared or _common
Logan Chien3aeedc92018-12-26 15:32:21 +0800409 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared")
410 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900411 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
412 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Alex Light3d673592019-01-18 14:37:31 -0800413
414 // Ensure that all symlinks are present.
415 found_foo_link_64 := false
416 found_foo := false
417 for _, cmd := range strings.Split(copyCmds, " && ") {
418 if strings.HasPrefix(cmd, "ln -s foo64") {
419 if strings.HasSuffix(cmd, "bin/foo") {
420 found_foo = true
421 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
422 found_foo_link_64 = true
423 }
424 }
425 }
426 good := found_foo && found_foo_link_64
427 if !good {
428 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
429 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900430
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700431 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("mergeNoticesRule")
432 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700433 if len(noticeInputs) != 2 {
434 t.Errorf("number of input notice files: expected = 2, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900435 }
436 ensureListContains(t, noticeInputs, "NOTICE")
437 ensureListContains(t, noticeInputs, "custom_notice")
Alex Light5098a612018-11-29 17:12:15 -0800438}
439
440func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700441 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800442 apex {
443 name: "myapex",
444 key: "myapex.key",
445 payload_type: "zip",
446 native_shared_libs: ["mylib"],
447 }
448
449 apex_key {
450 name: "myapex.key",
451 public_key: "testkey.avbpubkey",
452 private_key: "testkey.pem",
453 }
454
455 cc_library {
456 name: "mylib",
457 srcs: ["mylib.cpp"],
458 shared_libs: ["mylib2"],
459 system_shared_libs: [],
460 stl: "none",
461 }
462
463 cc_library {
464 name: "mylib2",
465 srcs: ["mylib.cpp"],
466 system_shared_libs: [],
467 stl: "none",
468 }
469 `)
470
471 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("zipApexRule")
472 copyCmds := zipApexRule.Args["copy_commands"]
473
474 // Ensure that main rule creates an output
475 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
476
477 // Ensure that APEX variant is created for the direct dep
Jiyong Parkda6eb592018-12-19 17:12:36 +0900478 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800479
480 // Ensure that APEX variant is created for the indirect dep
Jiyong Parkda6eb592018-12-19 17:12:36 +0900481 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800482
483 // Ensure that both direct and indirect deps are copied into apex
484 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
485 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900486}
487
488func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700489 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900490 apex {
491 name: "myapex",
492 key: "myapex.key",
493 native_shared_libs: ["mylib", "mylib3"],
494 }
495
496 apex_key {
497 name: "myapex.key",
498 public_key: "testkey.avbpubkey",
499 private_key: "testkey.pem",
500 }
501
502 cc_library {
503 name: "mylib",
504 srcs: ["mylib.cpp"],
505 shared_libs: ["mylib2", "mylib3"],
506 system_shared_libs: [],
507 stl: "none",
508 }
509
510 cc_library {
511 name: "mylib2",
512 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900513 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900514 system_shared_libs: [],
515 stl: "none",
516 stubs: {
517 versions: ["1", "2", "3"],
518 },
519 }
520
521 cc_library {
522 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900523 srcs: ["mylib.cpp"],
524 shared_libs: ["mylib4"],
525 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900526 stl: "none",
527 stubs: {
528 versions: ["10", "11", "12"],
529 },
530 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900531
532 cc_library {
533 name: "mylib4",
534 srcs: ["mylib.cpp"],
535 system_shared_libs: [],
536 stl: "none",
537 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538 `)
539
540 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
541 copyCmds := apexRule.Args["copy_commands"]
542
543 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800544 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900545
546 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800547 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900548
549 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800550 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900551
Jiyong Parkda6eb592018-12-19 17:12:36 +0900552 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900553
554 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkda6eb592018-12-19 17:12:36 +0900555 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_core_shared_3_myapex/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900556 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Parkda6eb592018-12-19 17:12:36 +0900557 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_core_shared_myapex/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900558
559 // 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 +0900560 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_core_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900561 // .. and not linking to the stubs variant of mylib3
Jiyong Parkda6eb592018-12-19 17:12:36 +0900562 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_core_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900563
564 // Ensure that stubs libs are built without -include flags
Jiyong Parkda6eb592018-12-19 17:12:36 +0900565 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_core_static_myapex").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900566 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900567
568 // Ensure that genstub is invoked with --apex
Jiyong Parkda6eb592018-12-19 17:12:36 +0900569 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 +0900570}
571
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900572func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700573 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900574 apex {
575 name: "myapex",
576 key: "myapex.key",
577 native_shared_libs: ["mylib"],
578 }
579
580 apex_key {
581 name: "myapex.key",
582 public_key: "testkey.avbpubkey",
583 private_key: "testkey.pem",
584 }
585
586 cc_library {
587 name: "mylib",
588 srcs: ["mylib.cpp"],
589 shared_libs: ["libfoo#10"],
590 system_shared_libs: [],
591 stl: "none",
592 }
593
594 cc_library {
595 name: "libfoo",
596 srcs: ["mylib.cpp"],
597 shared_libs: ["libbar"],
598 system_shared_libs: [],
599 stl: "none",
600 stubs: {
601 versions: ["10", "20", "30"],
602 },
603 }
604
605 cc_library {
606 name: "libbar",
607 srcs: ["mylib.cpp"],
608 system_shared_libs: [],
609 stl: "none",
610 }
611
612 `)
613
614 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
615 copyCmds := apexRule.Args["copy_commands"]
616
617 // Ensure that direct non-stubs dep is always included
618 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
619
620 // Ensure that indirect stubs dep is not included
621 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
622
623 // Ensure that dependency of stubs is not included
624 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
625
Jiyong Parkda6eb592018-12-19 17:12:36 +0900626 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900627
628 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Parkda6eb592018-12-19 17:12:36 +0900629 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_core_shared_10_myapex/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900630 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Parkda6eb592018-12-19 17:12:36 +0900631 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_core_shared_myapex/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900632
Jiyong Parkda6eb592018-12-19 17:12:36 +0900633 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_core_shared_10_myapex").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900634
635 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
636 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
637}
638
Jooyung Hand3639552019-08-09 12:57:43 +0900639func TestApexWithRuntimeLibsDependency(t *testing.T) {
640 /*
641 myapex
642 |
643 v (runtime_libs)
644 mylib ------+------> libfoo [provides stub]
645 |
646 `------> libbar
647 */
648 ctx, _ := testApex(t, `
649 apex {
650 name: "myapex",
651 key: "myapex.key",
652 native_shared_libs: ["mylib"],
653 }
654
655 apex_key {
656 name: "myapex.key",
657 public_key: "testkey.avbpubkey",
658 private_key: "testkey.pem",
659 }
660
661 cc_library {
662 name: "mylib",
663 srcs: ["mylib.cpp"],
664 runtime_libs: ["libfoo", "libbar"],
665 system_shared_libs: [],
666 stl: "none",
667 }
668
669 cc_library {
670 name: "libfoo",
671 srcs: ["mylib.cpp"],
672 system_shared_libs: [],
673 stl: "none",
674 stubs: {
675 versions: ["10", "20", "30"],
676 },
677 }
678
679 cc_library {
680 name: "libbar",
681 srcs: ["mylib.cpp"],
682 system_shared_libs: [],
683 stl: "none",
684 }
685
686 `)
687
688 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
689 copyCmds := apexRule.Args["copy_commands"]
690
691 // Ensure that direct non-stubs dep is always included
692 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
693
694 // Ensure that indirect stubs dep is not included
695 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
696
697 // Ensure that runtime_libs dep in included
698 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
699
700 injectRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("injectApexDependency")
701 ensureListEmpty(t, names(injectRule.Args["provideNativeLibs"]))
702 ensureListContains(t, names(injectRule.Args["requireNativeLibs"]), "libfoo.so")
703
704}
705
Jiyong Park25fc6a92018-11-18 18:02:45 +0900706func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700707 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900708 apex {
709 name: "myapex",
710 key: "myapex.key",
711 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
712 }
713
714 apex_key {
715 name: "myapex.key",
716 public_key: "testkey.avbpubkey",
717 private_key: "testkey.pem",
718 }
719
720 cc_library {
721 name: "mylib",
722 srcs: ["mylib.cpp"],
723 shared_libs: ["libdl#27"],
724 stl: "none",
725 }
726
727 cc_library_shared {
728 name: "mylib_shared",
729 srcs: ["mylib.cpp"],
730 shared_libs: ["libdl#27"],
731 stl: "none",
732 }
733
734 cc_library {
735 name: "libc",
Yi Konge7fe9912019-06-02 00:53:50 -0700736 no_libcrt: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900737 nocrt: true,
738 system_shared_libs: [],
739 stl: "none",
740 stubs: {
741 versions: ["27", "28", "29"],
742 },
743 }
744
745 cc_library {
746 name: "libm",
Yi Konge7fe9912019-06-02 00:53:50 -0700747 no_libcrt: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900748 nocrt: true,
749 system_shared_libs: [],
750 stl: "none",
751 stubs: {
752 versions: ["27", "28", "29"],
753 },
754 }
755
756 cc_library {
757 name: "libdl",
Yi Konge7fe9912019-06-02 00:53:50 -0700758 no_libcrt: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900759 nocrt: true,
760 system_shared_libs: [],
761 stl: "none",
762 stubs: {
763 versions: ["27", "28", "29"],
764 },
765 }
Jiyong Parkb0788572018-12-20 22:10:17 +0900766
767 cc_library {
768 name: "libBootstrap",
769 srcs: ["mylib.cpp"],
770 stl: "none",
771 bootstrap: true,
772 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900773 `)
774
775 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
776 copyCmds := apexRule.Args["copy_commands"]
777
778 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -0800779 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +0900780 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
781 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900782
783 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +0900784 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900785
Jiyong Parkda6eb592018-12-19 17:12:36 +0900786 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_shared_myapex").Rule("ld").Args["libFlags"]
787 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_static_myapex").Rule("cc").Args["cFlags"]
788 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_core_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900789
790 // For dependency to libc
791 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkda6eb592018-12-19 17:12:36 +0900792 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_core_shared_29_myapex/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900793 // ... and not linking to the non-stub (impl) variant
Jiyong Parkda6eb592018-12-19 17:12:36 +0900794 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_core_shared_myapex/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900795 // ... Cflags from stub is correctly exported to mylib
796 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
797 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
798
799 // For dependency to libm
800 // Ensure that mylib is linking with the non-stub (impl) variant
Jiyong Parkda6eb592018-12-19 17:12:36 +0900801 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_core_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900802 // ... and not linking to the stub variant
Jiyong Parkda6eb592018-12-19 17:12:36 +0900803 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_core_shared_29_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900804 // ... and is not compiling with the stub
805 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
806 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
807
808 // For dependency to libdl
809 // Ensure that mylib is linking with the specified version of stubs
Jiyong Parkda6eb592018-12-19 17:12:36 +0900810 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_core_shared_27_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900811 // ... and not linking to the other versions of stubs
Jiyong Parkda6eb592018-12-19 17:12:36 +0900812 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_core_shared_28_myapex/libdl.so")
813 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_core_shared_29_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900814 // ... and not linking to the non-stub (impl) variant
Jiyong Parkda6eb592018-12-19 17:12:36 +0900815 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_core_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900816 // ... Cflags from stub is correctly exported to mylib
817 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
818 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +0900819
820 // Ensure that libBootstrap is depending on the platform variant of bionic libs
821 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_core_shared").Rule("ld").Args["libFlags"]
822 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_core_shared/libc.so")
823 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_core_shared/libm.so")
824 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_core_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900825}
Jiyong Park7c2ee712018-12-07 00:42:25 +0900826
827func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700828 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +0900829 apex {
830 name: "myapex",
831 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900832 native_shared_libs: ["mylib"],
833 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +0900834 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900835 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +0900836 }
837
838 apex_key {
839 name: "myapex.key",
840 public_key: "testkey.avbpubkey",
841 private_key: "testkey.pem",
842 }
843
844 prebuilt_etc {
845 name: "myetc",
846 src: "myprebuilt",
847 sub_dir: "foo/bar",
848 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900849
850 cc_library {
851 name: "mylib",
852 srcs: ["mylib.cpp"],
853 relative_install_path: "foo/bar",
854 system_shared_libs: [],
855 stl: "none",
856 }
857
858 cc_binary {
859 name: "mybin",
860 srcs: ["mylib.cpp"],
861 relative_install_path: "foo/bar",
862 system_shared_libs: [],
863 static_executable: true,
864 stl: "none",
865 }
Jiyong Park7c2ee712018-12-07 00:42:25 +0900866 `)
867
868 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
869 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
870
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900871 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +0900872 ensureListContains(t, dirs, "etc")
873 ensureListContains(t, dirs, "etc/foo")
874 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900875 ensureListContains(t, dirs, "lib64")
876 ensureListContains(t, dirs, "lib64/foo")
877 ensureListContains(t, dirs, "lib64/foo/bar")
878 ensureListContains(t, dirs, "lib")
879 ensureListContains(t, dirs, "lib/foo")
880 ensureListContains(t, dirs, "lib/foo/bar")
881
Jiyong Parkbd13e442019-03-15 18:10:35 +0900882 ensureListContains(t, dirs, "bin")
883 ensureListContains(t, dirs, "bin/foo")
884 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +0900885}
Jiyong Parkda6eb592018-12-19 17:12:36 +0900886
887func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700888 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +0900889 apex {
890 name: "myapex",
891 key: "myapex.key",
892 native_shared_libs: ["mylib"],
893 use_vendor: true,
894 }
895
896 apex_key {
897 name: "myapex.key",
898 public_key: "testkey.avbpubkey",
899 private_key: "testkey.pem",
900 }
901
902 cc_library {
903 name: "mylib",
904 srcs: ["mylib.cpp"],
905 shared_libs: ["mylib2"],
906 system_shared_libs: [],
907 vendor_available: true,
908 stl: "none",
909 }
910
911 cc_library {
912 name: "mylib2",
913 srcs: ["mylib.cpp"],
914 system_shared_libs: [],
915 vendor_available: true,
916 stl: "none",
917 }
918 `)
919
920 inputsList := []string{}
921 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex").Module().BuildParamsForTests() {
922 for _, implicit := range i.Implicits {
923 inputsList = append(inputsList, implicit.String())
924 }
925 }
926 inputsString := strings.Join(inputsList, " ")
927
928 // ensure that the apex includes vendor variants of the direct and indirect deps
929 ensureContains(t, inputsString, "android_arm64_armv8-a_vendor_shared_myapex/mylib.so")
930 ensureContains(t, inputsString, "android_arm64_armv8-a_vendor_shared_myapex/mylib2.so")
931
932 // ensure that the apex does not include core variants
933 ensureNotContains(t, inputsString, "android_arm64_armv8-a_core_shared_myapex/mylib.so")
934 ensureNotContains(t, inputsString, "android_arm64_armv8-a_core_shared_myapex/mylib2.so")
935}
Jiyong Park16e91a02018-12-20 18:18:08 +0900936
Jooyung Han5c998b92019-06-27 11:30:33 +0900937func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
938 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
939 apex {
940 name: "myapex",
941 key: "myapex.key",
942 native_shared_libs: ["mylib"],
943 use_vendor: true,
944 }
945
946 apex_key {
947 name: "myapex.key",
948 public_key: "testkey.avbpubkey",
949 private_key: "testkey.pem",
950 }
951
952 cc_library {
953 name: "mylib",
954 srcs: ["mylib.cpp"],
955 system_shared_libs: [],
956 stl: "none",
957 }
958 `)
959}
960
Jiyong Park16e91a02018-12-20 18:18:08 +0900961func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700962 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +0900963 apex {
964 name: "myapex",
965 key: "myapex.key",
966 native_shared_libs: ["mylib"],
967 }
968
969 apex_key {
970 name: "myapex.key",
971 public_key: "testkey.avbpubkey",
972 private_key: "testkey.pem",
973 }
974
975 cc_library {
976 name: "mylib",
977 srcs: ["mylib.cpp"],
978 system_shared_libs: [],
979 stl: "none",
980 stubs: {
981 versions: ["1", "2", "3"],
982 },
983 }
984
985 cc_binary {
986 name: "not_in_apex",
987 srcs: ["mylib.cpp"],
988 static_libs: ["mylib"],
989 static_executable: true,
990 system_shared_libs: [],
991 stl: "none",
992 }
Jiyong Park16e91a02018-12-20 18:18:08 +0900993 `)
994
995 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a_core").Rule("ld").Args["libFlags"]
996
997 // Ensure that not_in_apex is linking with the static variant of mylib
Logan Chien3aeedc92018-12-26 15:32:21 +0800998 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_core_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +0900999}
Jiyong Park9335a262018-12-24 11:31:58 +09001000
1001func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001002 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09001003 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001004 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09001005 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001006 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09001007 native_shared_libs: ["mylib"],
1008 }
1009
1010 cc_library {
1011 name: "mylib",
1012 srcs: ["mylib.cpp"],
1013 system_shared_libs: [],
1014 stl: "none",
1015 }
1016
1017 apex_key {
1018 name: "myapex.key",
1019 public_key: "testkey.avbpubkey",
1020 private_key: "testkey.pem",
1021 }
1022
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001023 android_app_certificate {
1024 name: "myapex.certificate",
1025 certificate: "testkey",
1026 }
1027
1028 android_app_certificate {
1029 name: "myapex.certificate.override",
1030 certificate: "testkey.override",
1031 }
1032
Jiyong Park9335a262018-12-24 11:31:58 +09001033 `)
1034
1035 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09001036 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09001037
1038 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
1039 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
1040 "vendor/foo/devkeys/testkey.avbpubkey")
1041 }
1042 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
1043 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
1044 "vendor/foo/devkeys/testkey.pem")
1045 }
1046
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001047 // check the APK certs. It should be overridden to myapex.certificate.override
1048 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
1049 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09001050 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001051 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09001052 }
1053}
Jiyong Park58e364a2019-01-19 19:24:06 +09001054
1055func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001056 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09001057 apex {
1058 name: "myapex",
1059 key: "myapex.key",
1060 native_shared_libs: ["mylib"],
1061 }
1062
1063 apex {
1064 name: "otherapex",
1065 key: "myapex.key",
1066 native_shared_libs: ["mylib"],
1067 }
1068
1069 apex_key {
1070 name: "myapex.key",
1071 public_key: "testkey.avbpubkey",
1072 private_key: "testkey.pem",
1073 }
1074
1075 cc_library {
1076 name: "mylib",
1077 srcs: ["mylib.cpp"],
1078 system_shared_libs: [],
1079 stl: "none",
1080 }
1081 `)
1082
1083 // non-APEX variant does not have __ANDROID__APEX__ defined
1084 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_static").Rule("cc").Args["cFlags"]
1085 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__=myapex")
1086 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__=otherapex")
1087
1088 // APEX variant has __ANDROID_APEX__=<apexname> defined
1089 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_static_myapex").Rule("cc").Args["cFlags"]
1090 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__=myapex")
1091 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__=otherapex")
1092
1093 // APEX variant has __ANDROID_APEX__=<apexname> defined
1094 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_static_otherapex").Rule("cc").Args["cFlags"]
1095 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__=myapex")
1096 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__=otherapex")
1097}
Jiyong Park7e636d02019-01-28 16:16:54 +09001098
1099func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001100 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09001101 apex {
1102 name: "myapex",
1103 key: "myapex.key",
1104 native_shared_libs: ["mylib"],
1105 }
1106
1107 apex_key {
1108 name: "myapex.key",
1109 public_key: "testkey.avbpubkey",
1110 private_key: "testkey.pem",
1111 }
1112
1113 cc_library_headers {
1114 name: "mylib_headers",
1115 export_include_dirs: ["my_include"],
1116 system_shared_libs: [],
1117 stl: "none",
1118 }
1119
1120 cc_library {
1121 name: "mylib",
1122 srcs: ["mylib.cpp"],
1123 system_shared_libs: [],
1124 stl: "none",
1125 header_libs: ["mylib_headers"],
1126 export_header_lib_headers: ["mylib_headers"],
1127 stubs: {
1128 versions: ["1", "2", "3"],
1129 },
1130 }
1131
1132 cc_library {
1133 name: "otherlib",
1134 srcs: ["mylib.cpp"],
1135 system_shared_libs: [],
1136 stl: "none",
1137 shared_libs: ["mylib"],
1138 }
1139 `)
1140
1141 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_core_static").Rule("cc").Args["cFlags"]
1142
1143 // Ensure that the include path of the header lib is exported to 'otherlib'
1144 ensureContains(t, cFlags, "-Imy_include")
1145}
Alex Light9670d332019-01-29 18:07:33 -08001146
Jooyung Hane1633032019-08-01 17:41:43 +09001147func TestDependenciesInApexManifest(t *testing.T) {
1148 ctx, _ := testApex(t, `
1149 apex {
1150 name: "myapex_nodep",
1151 key: "myapex.key",
1152 native_shared_libs: ["lib_nodep"],
1153 compile_multilib: "both",
1154 file_contexts: "myapex",
1155 }
1156
1157 apex {
1158 name: "myapex_dep",
1159 key: "myapex.key",
1160 native_shared_libs: ["lib_dep"],
1161 compile_multilib: "both",
1162 file_contexts: "myapex",
1163 }
1164
1165 apex {
1166 name: "myapex_provider",
1167 key: "myapex.key",
1168 native_shared_libs: ["libfoo"],
1169 compile_multilib: "both",
1170 file_contexts: "myapex",
1171 }
1172
1173 apex {
1174 name: "myapex_selfcontained",
1175 key: "myapex.key",
1176 native_shared_libs: ["lib_dep", "libfoo"],
1177 compile_multilib: "both",
1178 file_contexts: "myapex",
1179 }
1180
1181 apex_key {
1182 name: "myapex.key",
1183 public_key: "testkey.avbpubkey",
1184 private_key: "testkey.pem",
1185 }
1186
1187 cc_library {
1188 name: "lib_nodep",
1189 srcs: ["mylib.cpp"],
1190 system_shared_libs: [],
1191 stl: "none",
1192 }
1193
1194 cc_library {
1195 name: "lib_dep",
1196 srcs: ["mylib.cpp"],
1197 shared_libs: ["libfoo"],
1198 system_shared_libs: [],
1199 stl: "none",
1200 }
1201
1202 cc_library {
1203 name: "libfoo",
1204 srcs: ["mytest.cpp"],
1205 stubs: {
1206 versions: ["1"],
1207 },
1208 system_shared_libs: [],
1209 stl: "none",
1210 }
1211 `)
1212
Jooyung Hane1633032019-08-01 17:41:43 +09001213 var injectRule android.TestingBuildParams
1214 var provideNativeLibs, requireNativeLibs []string
1215
1216 injectRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("injectApexDependency")
1217 provideNativeLibs = names(injectRule.Args["provideNativeLibs"])
1218 requireNativeLibs = names(injectRule.Args["requireNativeLibs"])
1219 ensureListEmpty(t, provideNativeLibs)
1220 ensureListEmpty(t, requireNativeLibs)
1221
1222 injectRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("injectApexDependency")
1223 provideNativeLibs = names(injectRule.Args["provideNativeLibs"])
1224 requireNativeLibs = names(injectRule.Args["requireNativeLibs"])
1225 ensureListEmpty(t, provideNativeLibs)
1226 ensureListContains(t, requireNativeLibs, "libfoo.so")
1227
1228 injectRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("injectApexDependency")
1229 provideNativeLibs = names(injectRule.Args["provideNativeLibs"])
1230 requireNativeLibs = names(injectRule.Args["requireNativeLibs"])
1231 ensureListContains(t, provideNativeLibs, "libfoo.so")
1232 ensureListEmpty(t, requireNativeLibs)
1233
1234 injectRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("injectApexDependency")
1235 provideNativeLibs = names(injectRule.Args["provideNativeLibs"])
1236 requireNativeLibs = names(injectRule.Args["requireNativeLibs"])
1237 ensureListContains(t, provideNativeLibs, "libfoo.so")
1238 ensureListEmpty(t, requireNativeLibs)
1239}
1240
Alex Light0851b882019-02-07 13:20:53 -08001241func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001242 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08001243 apex {
1244 name: "myapex",
1245 key: "myapex.key",
1246 native_shared_libs: ["mylib_common"],
1247 }
1248
1249 apex_key {
1250 name: "myapex.key",
1251 public_key: "testkey.avbpubkey",
1252 private_key: "testkey.pem",
1253 }
1254
1255 cc_library {
1256 name: "mylib_common",
1257 srcs: ["mylib.cpp"],
1258 system_shared_libs: [],
1259 stl: "none",
1260 }
1261 `)
1262
1263 module := ctx.ModuleForTests("myapex", "android_common_myapex")
1264 apexRule := module.Rule("apexRule")
1265 copyCmds := apexRule.Args["copy_commands"]
1266
1267 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
1268 t.Log("Apex was a test apex!")
1269 t.Fail()
1270 }
1271 // Ensure that main rule creates an output
1272 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
1273
1274 // Ensure that apex variant is created for the direct dep
1275 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_core_shared_myapex")
1276
1277 // Ensure that both direct and indirect deps are copied into apex
1278 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
1279
1280 // Ensure that the platform variant ends with _core_shared
1281 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_core_shared")
1282
1283 if !android.InAnyApex("mylib_common") {
1284 t.Log("Found mylib_common not in any apex!")
1285 t.Fail()
1286 }
1287}
1288
1289func TestTestApex(t *testing.T) {
1290 if android.InAnyApex("mylib_common_test") {
1291 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!")
1292 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001293 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08001294 apex_test {
1295 name: "myapex",
1296 key: "myapex.key",
1297 native_shared_libs: ["mylib_common_test"],
1298 }
1299
1300 apex_key {
1301 name: "myapex.key",
1302 public_key: "testkey.avbpubkey",
1303 private_key: "testkey.pem",
1304 }
1305
1306 cc_library {
1307 name: "mylib_common_test",
1308 srcs: ["mylib.cpp"],
1309 system_shared_libs: [],
1310 stl: "none",
1311 }
1312 `)
1313
1314 module := ctx.ModuleForTests("myapex", "android_common_myapex")
1315 apexRule := module.Rule("apexRule")
1316 copyCmds := apexRule.Args["copy_commands"]
1317
1318 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
1319 t.Log("Apex was not a test apex!")
1320 t.Fail()
1321 }
1322 // Ensure that main rule creates an output
1323 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
1324
1325 // Ensure that apex variant is created for the direct dep
1326 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_core_shared_myapex")
1327
1328 // Ensure that both direct and indirect deps are copied into apex
1329 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
1330
1331 // Ensure that the platform variant ends with _core_shared
1332 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_core_shared")
1333
1334 if android.InAnyApex("mylib_common_test") {
1335 t.Log("Found mylib_common_test in some apex!")
1336 t.Fail()
1337 }
1338}
1339
Alex Light9670d332019-01-29 18:07:33 -08001340func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001341 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08001342 apex {
1343 name: "myapex",
1344 key: "myapex.key",
1345 multilib: {
1346 first: {
1347 native_shared_libs: ["mylib_common"],
1348 }
1349 },
1350 target: {
1351 android: {
1352 multilib: {
1353 first: {
1354 native_shared_libs: ["mylib"],
1355 }
1356 }
1357 },
1358 host: {
1359 multilib: {
1360 first: {
1361 native_shared_libs: ["mylib2"],
1362 }
1363 }
1364 }
1365 }
1366 }
1367
1368 apex_key {
1369 name: "myapex.key",
1370 public_key: "testkey.avbpubkey",
1371 private_key: "testkey.pem",
1372 }
1373
1374 cc_library {
1375 name: "mylib",
1376 srcs: ["mylib.cpp"],
1377 system_shared_libs: [],
1378 stl: "none",
1379 }
1380
1381 cc_library {
1382 name: "mylib_common",
1383 srcs: ["mylib.cpp"],
1384 system_shared_libs: [],
1385 stl: "none",
1386 compile_multilib: "first",
1387 }
1388
1389 cc_library {
1390 name: "mylib2",
1391 srcs: ["mylib.cpp"],
1392 system_shared_libs: [],
1393 stl: "none",
1394 compile_multilib: "first",
1395 }
1396 `)
1397
1398 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
1399 copyCmds := apexRule.Args["copy_commands"]
1400
1401 // Ensure that main rule creates an output
1402 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
1403
1404 // Ensure that apex variant is created for the direct dep
1405 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared_myapex")
1406 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_core_shared_myapex")
1407 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared_myapex")
1408
1409 // Ensure that both direct and indirect deps are copied into apex
1410 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1411 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
1412 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1413
1414 // Ensure that the platform variant ends with _core_shared
1415 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared")
1416 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_core_shared")
1417 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared")
1418}
Jiyong Park04480cf2019-02-06 00:16:29 +09001419
1420func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001421 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09001422 apex {
1423 name: "myapex",
1424 key: "myapex.key",
1425 binaries: ["myscript"],
1426 }
1427
1428 apex_key {
1429 name: "myapex.key",
1430 public_key: "testkey.avbpubkey",
1431 private_key: "testkey.pem",
1432 }
1433
1434 sh_binary {
1435 name: "myscript",
1436 src: "mylib.cpp",
1437 filename: "myscript.sh",
1438 sub_dir: "script",
1439 }
1440 `)
1441
1442 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
1443 copyCmds := apexRule.Args["copy_commands"]
1444
1445 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
1446}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09001447
1448func TestApexInProductPartition(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001449 ctx, _ := testApex(t, `
Jiyong Parkd1e293d2019-03-15 02:13:21 +09001450 apex {
1451 name: "myapex",
1452 key: "myapex.key",
1453 native_shared_libs: ["mylib"],
1454 product_specific: true,
1455 }
1456
1457 apex_key {
1458 name: "myapex.key",
1459 public_key: "testkey.avbpubkey",
1460 private_key: "testkey.pem",
1461 product_specific: true,
1462 }
1463
1464 cc_library {
1465 name: "mylib",
1466 srcs: ["mylib.cpp"],
1467 system_shared_libs: [],
1468 stl: "none",
1469 }
1470 `)
1471
1472 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
1473 expected := "target/product/test_device/product/apex"
1474 actual := apex.installDir.RelPathString()
1475 if actual != expected {
1476 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
1477 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09001478}
Jiyong Park67882562019-03-21 01:11:21 +09001479
1480func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001481 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09001482 apex_key {
1483 name: "myapex.key",
1484 public_key: ":my.avbpubkey",
1485 private_key: ":my.pem",
1486 product_specific: true,
1487 }
1488
1489 filegroup {
1490 name: "my.avbpubkey",
1491 srcs: ["testkey2.avbpubkey"],
1492 }
1493
1494 filegroup {
1495 name: "my.pem",
1496 srcs: ["testkey2.pem"],
1497 }
1498 `)
1499
1500 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
1501 expected_pubkey := "testkey2.avbpubkey"
1502 actual_pubkey := apex_key.public_key_file.String()
1503 if actual_pubkey != expected_pubkey {
1504 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
1505 }
1506 expected_privkey := "testkey2.pem"
1507 actual_privkey := apex_key.private_key_file.String()
1508 if actual_privkey != expected_privkey {
1509 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
1510 }
1511}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07001512
1513func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001514 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07001515 prebuilt_apex {
1516 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09001517 arch: {
1518 arm64: {
1519 src: "myapex-arm64.apex",
1520 },
1521 arm: {
1522 src: "myapex-arm.apex",
1523 },
1524 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07001525 }
1526 `)
1527
1528 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
1529
Jiyong Parkc95714e2019-03-29 14:23:10 +09001530 expectedInput := "myapex-arm64.apex"
1531 if prebuilt.inputApex.String() != expectedInput {
1532 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
1533 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07001534}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01001535
1536func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001537 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01001538 prebuilt_apex {
1539 name: "myapex",
1540 src: "myapex-arm.apex",
1541 filename: "notmyapex.apex",
1542 }
1543 `)
1544
1545 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
1546
1547 expected := "notmyapex.apex"
1548 if p.installFilename != expected {
1549 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
1550 }
1551}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07001552
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001553func TestPrebuiltOverrides(t *testing.T) {
1554 ctx, config := testApex(t, `
1555 prebuilt_apex {
1556 name: "myapex.prebuilt",
1557 src: "myapex-arm.apex",
1558 overrides: [
1559 "myapex",
1560 ],
1561 }
1562 `)
1563
1564 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
1565
1566 expected := []string{"myapex"}
1567 actual := android.AndroidMkEntriesForTest(t, config, "", p).EntryMap["LOCAL_OVERRIDES_PACKAGES"]
1568 if !reflect.DeepEqual(actual, expected) {
1569 t.Errorf("Incorrect LOCAL_OVERRIDES_PACKAGES value '%s', expected '%s'", actual, expected)
1570 }
1571}
1572
Roland Levillain630846d2019-06-26 12:48:34 +01001573func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01001574 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01001575 apex_test {
1576 name: "myapex",
1577 key: "myapex.key",
1578 tests: [
1579 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01001580 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01001581 ],
1582 }
1583
1584 apex_key {
1585 name: "myapex.key",
1586 public_key: "testkey.avbpubkey",
1587 private_key: "testkey.pem",
1588 }
1589
1590 cc_test {
1591 name: "mytest",
1592 gtest: false,
1593 srcs: ["mytest.cpp"],
1594 relative_install_path: "test",
1595 system_shared_libs: [],
1596 static_executable: true,
1597 stl: "none",
1598 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01001599
1600 cc_test {
1601 name: "mytests",
1602 gtest: false,
1603 srcs: [
1604 "mytest1.cpp",
1605 "mytest2.cpp",
1606 "mytest3.cpp",
1607 ],
1608 test_per_src: true,
1609 relative_install_path: "test",
1610 system_shared_libs: [],
1611 static_executable: true,
1612 stl: "none",
1613 }
Roland Levillain630846d2019-06-26 12:48:34 +01001614 `)
1615
1616 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
1617 copyCmds := apexRule.Args["copy_commands"]
1618
1619 // Ensure that test dep is copied into apex.
1620 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Roland Levillain9b5fde92019-06-28 15:41:19 +01001621
1622 // Ensure that test deps built with `test_per_src` are copied into apex.
1623 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
1624 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
1625 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01001626
1627 // Ensure the module is correctly translated.
1628 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
1629 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
1630 name := apexBundle.BaseModuleName()
1631 prefix := "TARGET_"
1632 var builder strings.Builder
1633 data.Custom(&builder, name, prefix, "", data)
1634 androidMk := builder.String()
1635 ensureContains(t, androidMk, "LOCAL_MODULE := myapex.mytest\n")
1636 ensureContains(t, androidMk, "LOCAL_MODULE := myapex.mytest1\n")
1637 ensureContains(t, androidMk, "LOCAL_MODULE := myapex.mytest2\n")
1638 ensureContains(t, androidMk, "LOCAL_MODULE := myapex.mytest3\n")
1639 ensureContains(t, androidMk, "LOCAL_MODULE := myapex.apex_manifest.json\n")
1640 ensureContains(t, androidMk, "LOCAL_MODULE := myapex.apex_pubkey\n")
1641 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01001642}
1643
Jooyung Han5c998b92019-06-27 11:30:33 +09001644func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001645 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09001646 apex {
1647 name: "myapex",
1648 key: "myapex.key",
1649 native_shared_libs: ["mylib"],
1650 uses: ["commonapex"],
1651 }
1652
1653 apex {
1654 name: "commonapex",
1655 key: "myapex.key",
1656 native_shared_libs: ["libcommon"],
1657 provide_cpp_shared_libs: true,
1658 }
1659
1660 apex_key {
1661 name: "myapex.key",
1662 public_key: "testkey.avbpubkey",
1663 private_key: "testkey.pem",
1664 }
1665
1666 cc_library {
1667 name: "mylib",
1668 srcs: ["mylib.cpp"],
1669 shared_libs: ["libcommon"],
1670 system_shared_libs: [],
1671 stl: "none",
1672 }
1673
1674 cc_library {
1675 name: "libcommon",
1676 srcs: ["mylib_common.cpp"],
1677 system_shared_libs: [],
1678 stl: "none",
1679 }
1680 `)
1681
1682 module1 := ctx.ModuleForTests("myapex", "android_common_myapex")
1683 apexRule1 := module1.Rule("apexRule")
1684 copyCmds1 := apexRule1.Args["copy_commands"]
1685
1686 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex")
1687 apexRule2 := module2.Rule("apexRule")
1688 copyCmds2 := apexRule2.Args["copy_commands"]
1689
1690 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared_myapex")
1691 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_core_shared_commonapex")
1692 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
1693 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
1694 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
1695}
1696
1697func TestApexUsesFailsIfNotProvided(t *testing.T) {
1698 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
1699 apex {
1700 name: "myapex",
1701 key: "myapex.key",
1702 uses: ["commonapex"],
1703 }
1704
1705 apex {
1706 name: "commonapex",
1707 key: "myapex.key",
1708 }
1709
1710 apex_key {
1711 name: "myapex.key",
1712 public_key: "testkey.avbpubkey",
1713 private_key: "testkey.pem",
1714 }
1715 `)
1716 testApexError(t, `uses: "commonapex" is not a provider`, `
1717 apex {
1718 name: "myapex",
1719 key: "myapex.key",
1720 uses: ["commonapex"],
1721 }
1722
1723 cc_library {
1724 name: "commonapex",
1725 system_shared_libs: [],
1726 stl: "none",
1727 }
1728
1729 apex_key {
1730 name: "myapex.key",
1731 public_key: "testkey.avbpubkey",
1732 private_key: "testkey.pem",
1733 }
1734 `)
1735}
1736
1737func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
1738 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
1739 apex {
1740 name: "myapex",
1741 key: "myapex.key",
1742 use_vendor: true,
1743 uses: ["commonapex"],
1744 }
1745
1746 apex {
1747 name: "commonapex",
1748 key: "myapex.key",
1749 provide_cpp_shared_libs: true,
1750 }
1751
1752 apex_key {
1753 name: "myapex.key",
1754 public_key: "testkey.avbpubkey",
1755 private_key: "testkey.pem",
1756 }
1757 `)
1758}
1759
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07001760func TestMain(m *testing.M) {
1761 run := func() int {
1762 setUp()
1763 defer tearDown()
1764
1765 return m.Run()
1766 }
1767
1768 os.Exit(run())
1769}