blob: dbc85d92f2c90451ea258a83bb54998f084f42b1 [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"
20 "strings"
21 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090022
23 "github.com/google/blueprint/proptools"
24
25 "android/soong/android"
26 "android/soong/cc"
Jiyong Park25fc6a92018-11-18 18:02:45 +090027)
28
29func testApex(t *testing.T, bp string) *android.TestContext {
30 config, buildDir := setup(t)
31 defer teardown(buildDir)
32
33 ctx := android.NewTestArchContext()
Alex Lightee250722018-12-06 14:00:02 -080034 ctx.RegisterModuleType("apex", android.ModuleFactoryAdaptor(ApexBundleFactory))
Jiyong Park25fc6a92018-11-18 18:02:45 +090035 ctx.RegisterModuleType("apex_key", android.ModuleFactoryAdaptor(apexKeyFactory))
36
37 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
38 ctx.TopDown("apex_deps", apexDepsMutator)
39 ctx.BottomUp("apex", apexMutator)
40 })
41
42 ctx.RegisterModuleType("cc_library", android.ModuleFactoryAdaptor(cc.LibraryFactory))
43 ctx.RegisterModuleType("cc_library_shared", android.ModuleFactoryAdaptor(cc.LibrarySharedFactory))
Jiyong Park16e91a02018-12-20 18:18:08 +090044 ctx.RegisterModuleType("cc_binary", android.ModuleFactoryAdaptor(cc.BinaryFactory))
Jiyong Park25fc6a92018-11-18 18:02:45 +090045 ctx.RegisterModuleType("cc_object", android.ModuleFactoryAdaptor(cc.ObjectFactory))
Jiyong Parkda6eb592018-12-19 17:12:36 +090046 ctx.RegisterModuleType("llndk_library", android.ModuleFactoryAdaptor(cc.LlndkLibraryFactory))
Jiyong Park25fc6a92018-11-18 18:02:45 +090047 ctx.RegisterModuleType("toolchain_library", android.ModuleFactoryAdaptor(cc.ToolchainLibraryFactory))
Jiyong Park7c2ee712018-12-07 00:42:25 +090048 ctx.RegisterModuleType("prebuilt_etc", android.ModuleFactoryAdaptor(android.PrebuiltEtcFactory))
Jiyong Park25fc6a92018-11-18 18:02:45 +090049 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Jiyong Parkda6eb592018-12-19 17:12:36 +090050 ctx.BottomUp("image", cc.ImageMutator).Parallel()
Jiyong Park25fc6a92018-11-18 18:02:45 +090051 ctx.BottomUp("link", cc.LinkageMutator).Parallel()
Jiyong Parkda6eb592018-12-19 17:12:36 +090052 ctx.BottomUp("vndk", cc.VndkMutator).Parallel()
Jiyong Park25fc6a92018-11-18 18:02:45 +090053 ctx.BottomUp("version", cc.VersionMutator).Parallel()
54 ctx.BottomUp("begin", cc.BeginMutator).Parallel()
55 })
56
57 ctx.Register()
58
59 bp = bp + `
60 toolchain_library {
61 name: "libcompiler_rt-extras",
62 src: "",
Jiyong Parkda6eb592018-12-19 17:12:36 +090063 vendor_available: true,
64 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +090065 }
66
67 toolchain_library {
68 name: "libatomic",
69 src: "",
Jiyong Parkda6eb592018-12-19 17:12:36 +090070 vendor_available: true,
71 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +090072 }
73
74 toolchain_library {
75 name: "libgcc",
76 src: "",
Jiyong Parkda6eb592018-12-19 17:12:36 +090077 vendor_available: true,
78 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +090079 }
80
81 toolchain_library {
82 name: "libclang_rt.builtins-aarch64-android",
83 src: "",
Jiyong Parkda6eb592018-12-19 17:12:36 +090084 vendor_available: true,
85 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +090086 }
87
88 toolchain_library {
89 name: "libclang_rt.builtins-arm-android",
90 src: "",
Jiyong Parkda6eb592018-12-19 17:12:36 +090091 vendor_available: true,
92 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +090093 }
94
95 cc_object {
96 name: "crtbegin_so",
97 stl: "none",
Jiyong Parkda6eb592018-12-19 17:12:36 +090098 vendor_available: true,
99 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900100 }
101
102 cc_object {
103 name: "crtend_so",
104 stl: "none",
Jiyong Parkda6eb592018-12-19 17:12:36 +0900105 vendor_available: true,
106 recovery_available: true,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900107 }
108
Jiyong Parkda6eb592018-12-19 17:12:36 +0900109 llndk_library {
110 name: "libc",
111 symbol_file: "",
112 }
113
114 llndk_library {
115 name: "libm",
116 symbol_file: "",
117 }
118
119 llndk_library {
120 name: "libdl",
121 symbol_file: "",
122 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900123 `
124
125 ctx.MockFileSystem(map[string][]byte{
126 "Android.bp": []byte(bp),
Jiyong Park25fc6a92018-11-18 18:02:45 +0900127 "build/target/product/security": nil,
128 "apex_manifest.json": nil,
129 "system/sepolicy/apex/myapex-file_contexts": nil,
130 "mylib.cpp": nil,
Jiyong Park7c2ee712018-12-07 00:42:25 +0900131 "myprebuilt": nil,
Jiyong Park9335a262018-12-24 11:31:58 +0900132 "vendor/foo/devkeys/test.x509.pem": nil,
133 "vendor/foo/devkeys/test.pk8": nil,
134 "vendor/foo/devkeys/testkey.avbpubkey": nil,
135 "vendor/foo/devkeys/testkey.pem": nil,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900136 })
137 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
138 android.FailIfErrored(t, errs)
139 _, errs = ctx.PrepareBuildActions(config)
140 android.FailIfErrored(t, errs)
141
142 return ctx
143}
144
145func setup(t *testing.T) (config android.Config, buildDir string) {
146 buildDir, err := ioutil.TempDir("", "soong_apex_test")
147 if err != nil {
148 t.Fatal(err)
149 }
150
151 config = android.TestArchConfig(buildDir, nil)
Jiyong Parkda6eb592018-12-19 17:12:36 +0900152 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
Jiyong Park9335a262018-12-24 11:31:58 +0900153 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900154 return
155}
156
157func teardown(buildDir string) {
158 os.RemoveAll(buildDir)
159}
160
161// ensure that 'result' contains 'expected'
162func ensureContains(t *testing.T, result string, expected string) {
163 if !strings.Contains(result, expected) {
164 t.Errorf("%q is not found in %q", expected, result)
165 }
166}
167
168// ensures that 'result' does not contain 'notExpected'
169func ensureNotContains(t *testing.T, result string, notExpected string) {
170 if strings.Contains(result, notExpected) {
171 t.Errorf("%q is found in %q", notExpected, result)
172 }
173}
174
175func ensureListContains(t *testing.T, result []string, expected string) {
176 if !android.InList(expected, result) {
177 t.Errorf("%q is not found in %v", expected, result)
178 }
179}
180
181func ensureListNotContains(t *testing.T, result []string, notExpected string) {
182 if android.InList(notExpected, result) {
183 t.Errorf("%q is found in %v", notExpected, result)
184 }
185}
186
187// Minimal test
188func TestBasicApex(t *testing.T) {
189 ctx := testApex(t, `
190 apex {
191 name: "myapex",
192 key: "myapex.key",
193 native_shared_libs: ["mylib"],
194 }
195
196 apex_key {
197 name: "myapex.key",
198 public_key: "testkey.avbpubkey",
199 private_key: "testkey.pem",
200 }
201
202 cc_library {
203 name: "mylib",
204 srcs: ["mylib.cpp"],
205 shared_libs: ["mylib2"],
206 system_shared_libs: [],
207 stl: "none",
208 }
209
210 cc_library {
211 name: "mylib2",
212 srcs: ["mylib.cpp"],
213 system_shared_libs: [],
214 stl: "none",
215 }
216 `)
217
218 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
219 copyCmds := apexRule.Args["copy_commands"]
220
221 // Ensure that main rule creates an output
222 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
223
224 // Ensure that apex variant is created for the direct dep
Jiyong Parkda6eb592018-12-19 17:12:36 +0900225 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900226
227 // Ensure that apex variant is created for the indirect dep
Jiyong Parkda6eb592018-12-19 17:12:36 +0900228 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900229
230 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800231 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
232 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Logan Chien3aeedc92018-12-26 15:32:21 +0800233
234 // Ensure that the platform variant ends with _core_shared
235 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared")
236 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared")
Alex Light5098a612018-11-29 17:12:15 -0800237}
238
239func TestBasicZipApex(t *testing.T) {
240 ctx := testApex(t, `
241 apex {
242 name: "myapex",
243 key: "myapex.key",
244 payload_type: "zip",
245 native_shared_libs: ["mylib"],
246 }
247
248 apex_key {
249 name: "myapex.key",
250 public_key: "testkey.avbpubkey",
251 private_key: "testkey.pem",
252 }
253
254 cc_library {
255 name: "mylib",
256 srcs: ["mylib.cpp"],
257 shared_libs: ["mylib2"],
258 system_shared_libs: [],
259 stl: "none",
260 }
261
262 cc_library {
263 name: "mylib2",
264 srcs: ["mylib.cpp"],
265 system_shared_libs: [],
266 stl: "none",
267 }
268 `)
269
270 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("zipApexRule")
271 copyCmds := zipApexRule.Args["copy_commands"]
272
273 // Ensure that main rule creates an output
274 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
275
276 // Ensure that APEX variant is created for the direct dep
Jiyong Parkda6eb592018-12-19 17:12:36 +0900277 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800278
279 // Ensure that APEX variant is created for the indirect dep
Jiyong Parkda6eb592018-12-19 17:12:36 +0900280 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800281
282 // Ensure that both direct and indirect deps are copied into apex
283 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
284 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900285}
286
287func TestApexWithStubs(t *testing.T) {
288 ctx := testApex(t, `
289 apex {
290 name: "myapex",
291 key: "myapex.key",
292 native_shared_libs: ["mylib", "mylib3"],
293 }
294
295 apex_key {
296 name: "myapex.key",
297 public_key: "testkey.avbpubkey",
298 private_key: "testkey.pem",
299 }
300
301 cc_library {
302 name: "mylib",
303 srcs: ["mylib.cpp"],
304 shared_libs: ["mylib2", "mylib3"],
305 system_shared_libs: [],
306 stl: "none",
307 }
308
309 cc_library {
310 name: "mylib2",
311 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900312 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900313 system_shared_libs: [],
314 stl: "none",
315 stubs: {
316 versions: ["1", "2", "3"],
317 },
318 }
319
320 cc_library {
321 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900322 srcs: ["mylib.cpp"],
323 shared_libs: ["mylib4"],
324 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900325 stl: "none",
326 stubs: {
327 versions: ["10", "11", "12"],
328 },
329 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900330
331 cc_library {
332 name: "mylib4",
333 srcs: ["mylib.cpp"],
334 system_shared_libs: [],
335 stl: "none",
336 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900337 `)
338
339 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
340 copyCmds := apexRule.Args["copy_commands"]
341
342 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800343 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900344
345 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800346 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900347
348 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800349 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900350
Jiyong Parkda6eb592018-12-19 17:12:36 +0900351 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900352
353 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkda6eb592018-12-19 17:12:36 +0900354 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_core_shared_3_myapex/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Parkda6eb592018-12-19 17:12:36 +0900356 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_core_shared_myapex/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900357
358 // 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 +0900359 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_core_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900360 // .. and not linking to the stubs variant of mylib3
Jiyong Parkda6eb592018-12-19 17:12:36 +0900361 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_core_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900362
363 // Ensure that stubs libs are built without -include flags
Jiyong Parkda6eb592018-12-19 17:12:36 +0900364 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_core_static_myapex").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900365 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900366
367 // Ensure that genstub is invoked with --apex
Jiyong Parkda6eb592018-12-19 17:12:36 +0900368 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 +0900369}
370
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900371func TestApexWithExplicitStubsDependency(t *testing.T) {
372 ctx := testApex(t, `
373 apex {
374 name: "myapex",
375 key: "myapex.key",
376 native_shared_libs: ["mylib"],
377 }
378
379 apex_key {
380 name: "myapex.key",
381 public_key: "testkey.avbpubkey",
382 private_key: "testkey.pem",
383 }
384
385 cc_library {
386 name: "mylib",
387 srcs: ["mylib.cpp"],
388 shared_libs: ["libfoo#10"],
389 system_shared_libs: [],
390 stl: "none",
391 }
392
393 cc_library {
394 name: "libfoo",
395 srcs: ["mylib.cpp"],
396 shared_libs: ["libbar"],
397 system_shared_libs: [],
398 stl: "none",
399 stubs: {
400 versions: ["10", "20", "30"],
401 },
402 }
403
404 cc_library {
405 name: "libbar",
406 srcs: ["mylib.cpp"],
407 system_shared_libs: [],
408 stl: "none",
409 }
410
411 `)
412
413 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
414 copyCmds := apexRule.Args["copy_commands"]
415
416 // Ensure that direct non-stubs dep is always included
417 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
418
419 // Ensure that indirect stubs dep is not included
420 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
421
422 // Ensure that dependency of stubs is not included
423 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
424
Jiyong Parkda6eb592018-12-19 17:12:36 +0900425 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900426
427 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Parkda6eb592018-12-19 17:12:36 +0900428 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_core_shared_10_myapex/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900429 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Parkda6eb592018-12-19 17:12:36 +0900430 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_core_shared_myapex/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900431
Jiyong Parkda6eb592018-12-19 17:12:36 +0900432 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_core_shared_10_myapex").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900433
434 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
435 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
436}
437
Jiyong Park25fc6a92018-11-18 18:02:45 +0900438func TestApexWithSystemLibsStubs(t *testing.T) {
439 ctx := testApex(t, `
440 apex {
441 name: "myapex",
442 key: "myapex.key",
443 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
444 }
445
446 apex_key {
447 name: "myapex.key",
448 public_key: "testkey.avbpubkey",
449 private_key: "testkey.pem",
450 }
451
452 cc_library {
453 name: "mylib",
454 srcs: ["mylib.cpp"],
455 shared_libs: ["libdl#27"],
456 stl: "none",
457 }
458
459 cc_library_shared {
460 name: "mylib_shared",
461 srcs: ["mylib.cpp"],
462 shared_libs: ["libdl#27"],
463 stl: "none",
464 }
465
466 cc_library {
467 name: "libc",
468 no_libgcc: true,
469 nocrt: true,
470 system_shared_libs: [],
471 stl: "none",
472 stubs: {
473 versions: ["27", "28", "29"],
474 },
475 }
476
477 cc_library {
478 name: "libm",
479 no_libgcc: true,
480 nocrt: true,
481 system_shared_libs: [],
482 stl: "none",
483 stubs: {
484 versions: ["27", "28", "29"],
485 },
486 }
487
488 cc_library {
489 name: "libdl",
490 no_libgcc: true,
491 nocrt: true,
492 system_shared_libs: [],
493 stl: "none",
494 stubs: {
495 versions: ["27", "28", "29"],
496 },
497 }
Jiyong Parkb0788572018-12-20 22:10:17 +0900498
499 cc_library {
500 name: "libBootstrap",
501 srcs: ["mylib.cpp"],
502 stl: "none",
503 bootstrap: true,
504 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900505 `)
506
507 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
508 copyCmds := apexRule.Args["copy_commands"]
509
510 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -0800511 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +0900512 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
513 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900514
515 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +0900516 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900517
Jiyong Parkda6eb592018-12-19 17:12:36 +0900518 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_shared_myapex").Rule("ld").Args["libFlags"]
519 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_core_static_myapex").Rule("cc").Args["cFlags"]
520 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_core_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900521
522 // For dependency to libc
523 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkda6eb592018-12-19 17:12:36 +0900524 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_core_shared_29_myapex/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900525 // ... and not linking to the non-stub (impl) variant
Jiyong Parkda6eb592018-12-19 17:12:36 +0900526 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_core_shared_myapex/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900527 // ... Cflags from stub is correctly exported to mylib
528 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
529 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
530
531 // For dependency to libm
532 // Ensure that mylib is linking with the non-stub (impl) variant
Jiyong Parkda6eb592018-12-19 17:12:36 +0900533 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_core_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900534 // ... and not linking to the stub variant
Jiyong Parkda6eb592018-12-19 17:12:36 +0900535 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_core_shared_29_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900536 // ... and is not compiling with the stub
537 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
538 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
539
540 // For dependency to libdl
541 // Ensure that mylib is linking with the specified version of stubs
Jiyong Parkda6eb592018-12-19 17:12:36 +0900542 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_core_shared_27_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900543 // ... and not linking to the other versions of stubs
Jiyong Parkda6eb592018-12-19 17:12:36 +0900544 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_core_shared_28_myapex/libdl.so")
545 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_core_shared_29_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900546 // ... and not linking to the non-stub (impl) variant
Jiyong Parkda6eb592018-12-19 17:12:36 +0900547 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_core_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900548 // ... Cflags from stub is correctly exported to mylib
549 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
550 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +0900551
552 // Ensure that libBootstrap is depending on the platform variant of bionic libs
553 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_core_shared").Rule("ld").Args["libFlags"]
554 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_core_shared/libc.so")
555 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_core_shared/libm.so")
556 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_core_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900557}
Jiyong Park7c2ee712018-12-07 00:42:25 +0900558
559func TestFilesInSubDir(t *testing.T) {
560 ctx := testApex(t, `
561 apex {
562 name: "myapex",
563 key: "myapex.key",
564 prebuilts: ["myetc"],
565 }
566
567 apex_key {
568 name: "myapex.key",
569 public_key: "testkey.avbpubkey",
570 private_key: "testkey.pem",
571 }
572
573 prebuilt_etc {
574 name: "myetc",
575 src: "myprebuilt",
576 sub_dir: "foo/bar",
577 }
578 `)
579
580 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
581 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
582
583 // Ensure that etc, etc/foo, and etc/foo/bar are all listed
584 ensureListContains(t, dirs, "etc")
585 ensureListContains(t, dirs, "etc/foo")
586 ensureListContains(t, dirs, "etc/foo/bar")
587}
Jiyong Parkda6eb592018-12-19 17:12:36 +0900588
589func TestUseVendor(t *testing.T) {
590 ctx := testApex(t, `
591 apex {
592 name: "myapex",
593 key: "myapex.key",
594 native_shared_libs: ["mylib"],
595 use_vendor: true,
596 }
597
598 apex_key {
599 name: "myapex.key",
600 public_key: "testkey.avbpubkey",
601 private_key: "testkey.pem",
602 }
603
604 cc_library {
605 name: "mylib",
606 srcs: ["mylib.cpp"],
607 shared_libs: ["mylib2"],
608 system_shared_libs: [],
609 vendor_available: true,
610 stl: "none",
611 }
612
613 cc_library {
614 name: "mylib2",
615 srcs: ["mylib.cpp"],
616 system_shared_libs: [],
617 vendor_available: true,
618 stl: "none",
619 }
620 `)
621
622 inputsList := []string{}
623 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex").Module().BuildParamsForTests() {
624 for _, implicit := range i.Implicits {
625 inputsList = append(inputsList, implicit.String())
626 }
627 }
628 inputsString := strings.Join(inputsList, " ")
629
630 // ensure that the apex includes vendor variants of the direct and indirect deps
631 ensureContains(t, inputsString, "android_arm64_armv8-a_vendor_shared_myapex/mylib.so")
632 ensureContains(t, inputsString, "android_arm64_armv8-a_vendor_shared_myapex/mylib2.so")
633
634 // ensure that the apex does not include core variants
635 ensureNotContains(t, inputsString, "android_arm64_armv8-a_core_shared_myapex/mylib.so")
636 ensureNotContains(t, inputsString, "android_arm64_armv8-a_core_shared_myapex/mylib2.so")
637}
Jiyong Park16e91a02018-12-20 18:18:08 +0900638
639func TestStaticLinking(t *testing.T) {
640 ctx := testApex(t, `
641 apex {
642 name: "myapex",
643 key: "myapex.key",
644 native_shared_libs: ["mylib"],
645 }
646
647 apex_key {
648 name: "myapex.key",
649 public_key: "testkey.avbpubkey",
650 private_key: "testkey.pem",
651 }
652
653 cc_library {
654 name: "mylib",
655 srcs: ["mylib.cpp"],
656 system_shared_libs: [],
657 stl: "none",
658 stubs: {
659 versions: ["1", "2", "3"],
660 },
661 }
662
663 cc_binary {
664 name: "not_in_apex",
665 srcs: ["mylib.cpp"],
666 static_libs: ["mylib"],
667 static_executable: true,
668 system_shared_libs: [],
669 stl: "none",
670 }
671
672 cc_object {
673 name: "crtbegin_static",
674 stl: "none",
675 }
676
677 cc_object {
678 name: "crtend_android",
679 stl: "none",
680 }
681
682 `)
683
684 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a_core").Rule("ld").Args["libFlags"]
685
686 // Ensure that not_in_apex is linking with the static variant of mylib
Logan Chien3aeedc92018-12-26 15:32:21 +0800687 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_core_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +0900688}
Jiyong Park9335a262018-12-24 11:31:58 +0900689
690func TestKeys(t *testing.T) {
691 ctx := testApex(t, `
692 apex {
693 name: "myapex",
694 key: "myapex.key",
695 native_shared_libs: ["mylib"],
696 }
697
698 cc_library {
699 name: "mylib",
700 srcs: ["mylib.cpp"],
701 system_shared_libs: [],
702 stl: "none",
703 }
704
705 apex_key {
706 name: "myapex.key",
707 public_key: "testkey.avbpubkey",
708 private_key: "testkey.pem",
709 }
710
711 `)
712
713 // check the APEX keys
714 keys := ctx.ModuleForTests("myapex.key", "").Module().(*apexKey)
715
716 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
717 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
718 "vendor/foo/devkeys/testkey.avbpubkey")
719 }
720 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
721 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
722 "vendor/foo/devkeys/testkey.pem")
723 }
724
725 // check the APK certs
726 certs := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Args["certificates"]
727 if certs != "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8" {
728 t.Errorf("cert and private key %q are not %q", certs,
729 "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8")
730 }
731}