blob: dee7ff24636f28253b915ccf1e37382ad031d57d [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Park25fc6a92018-11-18 18:02:45 +090018 "io/ioutil"
19 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090024 "strings"
25 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090026
27 "github.com/google/blueprint/proptools"
28
29 "android/soong/android"
30 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000031 "android/soong/dexpreopt"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090032 "android/soong/java"
Jiyong Park25fc6a92018-11-18 18:02:45 +090033)
34
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070035var buildDir string
36
Jooyung Hand3639552019-08-09 12:57:43 +090037// names returns name list from white space separated string
38func names(s string) (ns []string) {
39 for _, n := range strings.Split(s, " ") {
40 if len(n) > 0 {
41 ns = append(ns, n)
42 }
43 }
44 return
45}
46
Jooyung Han344d5432019-08-23 11:17:39 +090047func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
48 t.Helper()
49 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090050 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
51 if len(errs) > 0 {
52 android.FailIfNoMatchingErrors(t, pattern, errs)
53 return
54 }
55 _, errs = ctx.PrepareBuildActions(config)
56 if len(errs) > 0 {
57 android.FailIfNoMatchingErrors(t, pattern, errs)
58 return
59 }
60
61 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
62}
63
Jooyung Han344d5432019-08-23 11:17:39 +090064func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
65 t.Helper()
66 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090067 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
68 android.FailIfErrored(t, errs)
69 _, errs = ctx.PrepareBuildActions(config)
70 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070071 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090072}
73
Jooyung Han344d5432019-08-23 11:17:39 +090074type testCustomizer func(fs map[string][]byte, config android.Config)
75
76func withFiles(files map[string][]byte) testCustomizer {
77 return func(fs map[string][]byte, config android.Config) {
78 for k, v := range files {
79 fs[k] = v
80 }
81 }
82}
83
84func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
85 return func(fs map[string][]byte, config android.Config) {
86 for k, v := range targets {
87 config.Targets[k] = v
88 }
89 }
90}
91
Jooyung Han35155c42020-02-06 17:33:20 +090092// withNativeBridgeTargets sets configuration with targets including:
93// - X86_64 (primary)
94// - X86 (secondary)
95// - Arm64 on X86_64 (native bridge)
96// - Arm on X86 (native bridge)
97func withNativeBridgeEnabled(fs map[string][]byte, config android.Config) {
98 config.Targets[android.Android] = []android.Target{
99 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
100 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
104 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
107 }
108}
109
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900110func withManifestPackageNameOverrides(specs []string) testCustomizer {
111 return func(fs map[string][]byte, config android.Config) {
112 config.TestProductVariables.ManifestPackageNameOverrides = specs
113 }
114}
115
Jooyung Han31c470b2019-10-18 16:26:59 +0900116func withBinder32bit(fs map[string][]byte, config android.Config) {
117 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
118}
119
Jiyong Park7cd10e32020-01-14 09:22:18 +0900120func withUnbundledBuild(fs map[string][]byte, config android.Config) {
121 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
122}
123
Jooyung Han344d5432019-08-23 11:17:39 +0900124func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jooyung Han671f1ce2019-12-17 12:47:13 +0900125 android.ClearApexDependency()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900126
127 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900128 filegroup {
129 name: "myapex-file_contexts",
130 srcs: [
131 "system/sepolicy/apex/myapex-file_contexts",
132 ],
133 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900134 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800135
Colin Crossf9aabd72020-02-15 11:29:50 -0800136 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
137
Dario Frenicde2a032019-10-27 00:29:22 +0100138 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900139
Jooyung Han344d5432019-08-23 11:17:39 +0900140 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900141 "a.java": nil,
142 "PrebuiltAppFoo.apk": nil,
143 "PrebuiltAppFooPriv.apk": nil,
144 "build/make/target/product/security": nil,
145 "apex_manifest.json": nil,
146 "AndroidManifest.xml": nil,
147 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900148 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900149 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900150 "system/sepolicy/apex/otherapex-file_contexts": nil,
151 "system/sepolicy/apex/commonapex-file_contexts": nil,
152 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800153 "mylib.cpp": nil,
154 "mylib_common.cpp": nil,
155 "mytest.cpp": nil,
156 "mytest1.cpp": nil,
157 "mytest2.cpp": nil,
158 "mytest3.cpp": nil,
159 "myprebuilt": nil,
160 "my_include": nil,
161 "foo/bar/MyClass.java": nil,
162 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100163 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800164 "vendor/foo/devkeys/test.x509.pem": nil,
165 "vendor/foo/devkeys/test.pk8": nil,
166 "testkey.x509.pem": nil,
167 "testkey.pk8": nil,
168 "testkey.override.x509.pem": nil,
169 "testkey.override.pk8": nil,
170 "vendor/foo/devkeys/testkey.avbpubkey": nil,
171 "vendor/foo/devkeys/testkey.pem": nil,
172 "NOTICE": nil,
173 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900174 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800175 "testkey2.avbpubkey": nil,
176 "testkey2.pem": nil,
177 "myapex-arm64.apex": nil,
178 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700179 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800180 "frameworks/base/api/current.txt": nil,
181 "framework/aidl/a.aidl": nil,
182 "build/make/core/proguard.flags": nil,
183 "build/make/core/proguard_basic_keeps.flags": nil,
184 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700185 "baz": nil,
186 "bar/baz": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900187 }
188
Colin Crossf9aabd72020-02-15 11:29:50 -0800189 cc.GatherRequiredFilesForTest(fs)
190
Jooyung Han344d5432019-08-23 11:17:39 +0900191 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800192 // The fs now needs to be populated before creating the config, call handlers twice
193 // for now, once to get any fs changes, and later after the config was created to
194 // set product variables or targets.
195 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
196 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900197 }
198
Colin Cross98be1bb2019-12-13 20:41:13 -0800199 config := android.TestArchConfig(buildDir, nil, bp, fs)
200 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
201 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
202 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
203 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
204 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
205 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
206
207 for _, handler := range handlers {
208 // The fs now needs to be populated before creating the config, call handlers twice
209 // for now, earlier to get any fs changes, and now after the config was created to
210 // set product variables or targets.
211 tempFS := map[string][]byte{}
212 handler(tempFS, config)
213 }
214
215 ctx := android.NewTestArchContext()
216 ctx.RegisterModuleType("apex", BundleFactory)
217 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
218 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
219 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
220 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
221 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
222 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700223 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800224
Jooyung Hana57af4a2020-01-23 05:36:59 +0000225 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
226 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
227
Paul Duffin77980a82019-12-19 16:01:36 +0000228 cc.RegisterRequiredBuildComponentsForTest(ctx)
Colin Cross98be1bb2019-12-13 20:41:13 -0800229 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800230 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
231 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800232 ctx.RegisterModuleType("prebuilt_etc", android.PrebuiltEtcFactory)
atrost6e126252020-01-27 17:01:16 +0000233 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800234 ctx.RegisterModuleType("sh_binary", android.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800235 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000236 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000237 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000238 java.RegisterAppBuildComponents(ctx)
Jooyung Han58f26ab2019-12-18 15:34:32 +0900239 ctx.RegisterModuleType("java_sdk_library", java.SdkLibraryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800240
Colin Cross98be1bb2019-12-13 20:41:13 -0800241 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800242 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800243
244 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245
Jooyung Han5c998b92019-06-27 11:30:33 +0900246 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900247}
248
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700249func setUp() {
250 var err error
251 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900252 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700253 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900254 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900255}
256
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700257func tearDown() {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900258 os.RemoveAll(buildDir)
259}
260
Jooyung Han643adc42020-02-27 13:50:06 +0900261// ensure that 'result' equals 'expected'
262func ensureEquals(t *testing.T, result string, expected string) {
263 t.Helper()
264 if result != expected {
265 t.Errorf("%q != %q", expected, result)
266 }
267}
268
Jiyong Park25fc6a92018-11-18 18:02:45 +0900269// ensure that 'result' contains 'expected'
270func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900271 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900272 if !strings.Contains(result, expected) {
273 t.Errorf("%q is not found in %q", expected, result)
274 }
275}
276
277// ensures that 'result' does not contain 'notExpected'
278func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900279 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280 if strings.Contains(result, notExpected) {
281 t.Errorf("%q is found in %q", notExpected, result)
282 }
283}
284
285func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900286 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287 if !android.InList(expected, result) {
288 t.Errorf("%q is not found in %v", expected, result)
289 }
290}
291
292func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900293 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900294 if android.InList(notExpected, result) {
295 t.Errorf("%q is found in %v", notExpected, result)
296 }
297}
298
Jooyung Hane1633032019-08-01 17:41:43 +0900299func ensureListEmpty(t *testing.T, result []string) {
300 t.Helper()
301 if len(result) > 0 {
302 t.Errorf("%q is expected to be empty", result)
303 }
304}
305
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306// Minimal test
307func TestBasicApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700308 ctx, _ := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900309 apex_defaults {
310 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900311 manifest: ":myapex.manifest",
312 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900313 key: "myapex.key",
314 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800315 multilib: {
316 both: {
317 binaries: ["foo",],
318 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900319 },
Jooyung Han5a80d9f2019-12-23 15:38:34 +0900320 java_libs: ["myjar"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900321 }
322
Jiyong Park30ca9372019-02-07 16:27:23 +0900323 apex {
324 name: "myapex",
325 defaults: ["myapex-defaults"],
326 }
327
Jiyong Park25fc6a92018-11-18 18:02:45 +0900328 apex_key {
329 name: "myapex.key",
330 public_key: "testkey.avbpubkey",
331 private_key: "testkey.pem",
332 }
333
Jiyong Park809bb722019-02-13 21:33:49 +0900334 filegroup {
335 name: "myapex.manifest",
336 srcs: ["apex_manifest.json"],
337 }
338
339 filegroup {
340 name: "myapex.androidmanifest",
341 srcs: ["AndroidManifest.xml"],
342 }
343
Jiyong Park25fc6a92018-11-18 18:02:45 +0900344 cc_library {
345 name: "mylib",
346 srcs: ["mylib.cpp"],
347 shared_libs: ["mylib2"],
348 system_shared_libs: [],
349 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000350 // TODO: remove //apex_available:platform
351 apex_available: [
352 "//apex_available:platform",
353 "myapex",
354 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355 }
356
Alex Light3d673592019-01-18 14:37:31 -0800357 cc_binary {
358 name: "foo",
359 srcs: ["mylib.cpp"],
360 compile_multilib: "both",
361 multilib: {
362 lib32: {
363 suffix: "32",
364 },
365 lib64: {
366 suffix: "64",
367 },
368 },
369 symlinks: ["foo_link_"],
370 symlink_preferred_arch: true,
371 system_shared_libs: [],
372 static_executable: true,
373 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000374 apex_available: [ "myapex" ],
Alex Light3d673592019-01-18 14:37:31 -0800375 }
376
Paul Duffindddd5462020-04-07 15:25:44 +0100377 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900378 name: "mylib2",
379 srcs: ["mylib.cpp"],
380 system_shared_libs: [],
381 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900382 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900383 static_libs: ["libstatic"],
384 // TODO: remove //apex_available:platform
385 apex_available: [
386 "//apex_available:platform",
387 "myapex",
388 ],
389 }
390
Paul Duffindddd5462020-04-07 15:25:44 +0100391 cc_prebuilt_library_shared {
392 name: "mylib2",
393 srcs: ["prebuilt.so"],
394 // TODO: remove //apex_available:platform
395 apex_available: [
396 "//apex_available:platform",
397 "myapex",
398 ],
399 }
400
Jiyong Park9918e1a2020-03-17 19:16:40 +0900401 cc_library_static {
402 name: "libstatic",
403 srcs: ["mylib.cpp"],
404 system_shared_libs: [],
405 stl: "none",
406 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000407 // TODO: remove //apex_available:platform
408 apex_available: [
409 "//apex_available:platform",
410 "myapex",
411 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900412 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900413
414 java_library {
415 name: "myjar",
416 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900417 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900418 sdk_version: "none",
419 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900420 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900421 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000422 // TODO: remove //apex_available:platform
423 apex_available: [
424 "//apex_available:platform",
425 "myapex",
426 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900427 }
428
429 java_library {
430 name: "myotherjar",
431 srcs: ["foo/bar/MyClass.java"],
432 sdk_version: "none",
433 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900434 // TODO: remove //apex_available:platform
435 apex_available: [
436 "//apex_available:platform",
437 "myapex",
438 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900439 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900440
441 java_library {
442 name: "mysharedjar",
443 srcs: ["foo/bar/MyClass.java"],
444 sdk_version: "none",
445 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900446 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900447 `)
448
Sundong Ahnabb64432019-10-22 13:58:29 +0900449 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900450
451 optFlags := apexRule.Args["opt_flags"]
452 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700453 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900454 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900455
Jiyong Park25fc6a92018-11-18 18:02:45 +0900456 copyCmds := apexRule.Args["copy_commands"]
457
458 // Ensure that main rule creates an output
459 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
460
461 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800462 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900463 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900464
465 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800466 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900467 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900468
469 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800470 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
471 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900472 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900473 // .. but not for java libs
474 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900475 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800476
Colin Cross7113d202019-11-20 16:39:12 -0800477 // Ensure that the platform variant ends with _shared or _common
478 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
479 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900480 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
481 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900482 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
483
484 // Ensure that dynamic dependency to java libs are not included
485 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800486
487 // Ensure that all symlinks are present.
488 found_foo_link_64 := false
489 found_foo := false
490 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900491 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800492 if strings.HasSuffix(cmd, "bin/foo") {
493 found_foo = true
494 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
495 found_foo_link_64 = true
496 }
497 }
498 }
499 good := found_foo && found_foo_link_64
500 if !good {
501 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
502 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900503
Sundong Ahnabb64432019-10-22 13:58:29 +0900504 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700505 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900506 if len(noticeInputs) != 3 {
507 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900508 }
509 ensureListContains(t, noticeInputs, "NOTICE")
510 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900511 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900512
Artur Satayeva8bd1132020-04-27 18:07:06 +0100513 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100514 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
515 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
516 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
517 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
518 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100519
520 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100521 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
522 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
523 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
524 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
525 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800526}
527
Jooyung Hanf21c7972019-12-16 22:32:06 +0900528func TestDefaults(t *testing.T) {
529 ctx, _ := testApex(t, `
530 apex_defaults {
531 name: "myapex-defaults",
532 key: "myapex.key",
533 prebuilts: ["myetc"],
534 native_shared_libs: ["mylib"],
535 java_libs: ["myjar"],
536 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900537 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900538 }
539
540 prebuilt_etc {
541 name: "myetc",
542 src: "myprebuilt",
543 }
544
545 apex {
546 name: "myapex",
547 defaults: ["myapex-defaults"],
548 }
549
550 apex_key {
551 name: "myapex.key",
552 public_key: "testkey.avbpubkey",
553 private_key: "testkey.pem",
554 }
555
556 cc_library {
557 name: "mylib",
558 system_shared_libs: [],
559 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000560 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900561 }
562
563 java_library {
564 name: "myjar",
565 srcs: ["foo/bar/MyClass.java"],
566 sdk_version: "none",
567 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000568 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900569 }
570
571 android_app {
572 name: "AppFoo",
573 srcs: ["foo/bar/MyClass.java"],
574 sdk_version: "none",
575 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000576 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900577 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900578
579 runtime_resource_overlay {
580 name: "rro",
581 theme: "blue",
582 }
583
Jooyung Hanf21c7972019-12-16 22:32:06 +0900584 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000585 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900586 "etc/myetc",
587 "javalib/myjar.jar",
588 "lib64/mylib.so",
589 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900590 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900591 })
592}
593
Jooyung Han01a3ee22019-11-02 02:52:25 +0900594func TestApexManifest(t *testing.T) {
595 ctx, _ := testApex(t, `
596 apex {
597 name: "myapex",
598 key: "myapex.key",
599 }
600
601 apex_key {
602 name: "myapex.key",
603 public_key: "testkey.avbpubkey",
604 private_key: "testkey.pem",
605 }
606 `)
607
608 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900609 args := module.Rule("apexRule").Args
610 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
611 t.Error("manifest should be apex_manifest.pb, but " + manifest)
612 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900613}
614
Alex Light5098a612018-11-29 17:12:15 -0800615func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700616 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800617 apex {
618 name: "myapex",
619 key: "myapex.key",
620 payload_type: "zip",
621 native_shared_libs: ["mylib"],
622 }
623
624 apex_key {
625 name: "myapex.key",
626 public_key: "testkey.avbpubkey",
627 private_key: "testkey.pem",
628 }
629
630 cc_library {
631 name: "mylib",
632 srcs: ["mylib.cpp"],
633 shared_libs: ["mylib2"],
634 system_shared_libs: [],
635 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000636 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800637 }
638
639 cc_library {
640 name: "mylib2",
641 srcs: ["mylib.cpp"],
642 system_shared_libs: [],
643 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000644 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800645 }
646 `)
647
Sundong Ahnabb64432019-10-22 13:58:29 +0900648 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800649 copyCmds := zipApexRule.Args["copy_commands"]
650
651 // Ensure that main rule creates an output
652 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
653
654 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800655 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800656
657 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800658 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800659
660 // Ensure that both direct and indirect deps are copied into apex
661 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
662 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900663}
664
665func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700666 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900667 apex {
668 name: "myapex",
669 key: "myapex.key",
670 native_shared_libs: ["mylib", "mylib3"],
671 }
672
673 apex_key {
674 name: "myapex.key",
675 public_key: "testkey.avbpubkey",
676 private_key: "testkey.pem",
677 }
678
679 cc_library {
680 name: "mylib",
681 srcs: ["mylib.cpp"],
682 shared_libs: ["mylib2", "mylib3"],
683 system_shared_libs: [],
684 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000685 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900686 }
687
688 cc_library {
689 name: "mylib2",
690 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900691 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900692 system_shared_libs: [],
693 stl: "none",
694 stubs: {
695 versions: ["1", "2", "3"],
696 },
697 }
698
699 cc_library {
700 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900701 srcs: ["mylib.cpp"],
702 shared_libs: ["mylib4"],
703 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900704 stl: "none",
705 stubs: {
706 versions: ["10", "11", "12"],
707 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000708 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900709 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900710
711 cc_library {
712 name: "mylib4",
713 srcs: ["mylib.cpp"],
714 system_shared_libs: [],
715 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000716 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900717 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900718 `)
719
Sundong Ahnabb64432019-10-22 13:58:29 +0900720 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900721 copyCmds := apexRule.Args["copy_commands"]
722
723 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800724 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900725
726 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800727 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900728
729 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800730 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900731
Colin Cross7113d202019-11-20 16:39:12 -0800732 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900733
734 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900735 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900736 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900737 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900738
739 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Cross7113d202019-11-20 16:39:12 -0800740 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900741 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800742 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900743
744 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900745 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900746 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900747
748 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900749 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900750
Jooyung Hana57af4a2020-01-23 05:36:59 +0000751 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900752 "lib64/mylib.so",
753 "lib64/mylib3.so",
754 "lib64/mylib4.so",
755 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900756}
757
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900758func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700759 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900760 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900761 name: "myapex2",
762 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900763 native_shared_libs: ["mylib"],
764 }
765
766 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900767 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900768 public_key: "testkey.avbpubkey",
769 private_key: "testkey.pem",
770 }
771
772 cc_library {
773 name: "mylib",
774 srcs: ["mylib.cpp"],
775 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900776 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900777 system_shared_libs: [],
778 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000779 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900780 }
781
782 cc_library {
783 name: "libfoo",
784 srcs: ["mylib.cpp"],
785 shared_libs: ["libbar"],
786 system_shared_libs: [],
787 stl: "none",
788 stubs: {
789 versions: ["10", "20", "30"],
790 },
791 }
792
793 cc_library {
794 name: "libbar",
795 srcs: ["mylib.cpp"],
796 system_shared_libs: [],
797 stl: "none",
798 }
799
Jiyong Park678c8812020-02-07 17:25:49 +0900800 cc_library_static {
801 name: "libbaz",
802 srcs: ["mylib.cpp"],
803 system_shared_libs: [],
804 stl: "none",
805 apex_available: [ "myapex2" ],
806 }
807
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900808 `)
809
Jiyong Park83dc74b2020-01-14 18:38:44 +0900810 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900811 copyCmds := apexRule.Args["copy_commands"]
812
813 // Ensure that direct non-stubs dep is always included
814 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
815
816 // Ensure that indirect stubs dep is not included
817 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
818
819 // Ensure that dependency of stubs is not included
820 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
821
Jiyong Park83dc74b2020-01-14 18:38:44 +0900822 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900823
824 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900825 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900826 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900827 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900828
Jiyong Park3ff16992019-12-27 14:11:47 +0900829 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900830
831 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
832 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900833
Artur Satayeva8bd1132020-04-27 18:07:06 +0100834 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100835 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
836 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
837 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900838
Artur Satayeva8bd1132020-04-27 18:07:06 +0100839 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100840 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
841 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
842 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900843}
844
Jooyung Hand3639552019-08-09 12:57:43 +0900845func TestApexWithRuntimeLibsDependency(t *testing.T) {
846 /*
847 myapex
848 |
849 v (runtime_libs)
850 mylib ------+------> libfoo [provides stub]
851 |
852 `------> libbar
853 */
854 ctx, _ := testApex(t, `
855 apex {
856 name: "myapex",
857 key: "myapex.key",
858 native_shared_libs: ["mylib"],
859 }
860
861 apex_key {
862 name: "myapex.key",
863 public_key: "testkey.avbpubkey",
864 private_key: "testkey.pem",
865 }
866
867 cc_library {
868 name: "mylib",
869 srcs: ["mylib.cpp"],
870 runtime_libs: ["libfoo", "libbar"],
871 system_shared_libs: [],
872 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000873 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900874 }
875
876 cc_library {
877 name: "libfoo",
878 srcs: ["mylib.cpp"],
879 system_shared_libs: [],
880 stl: "none",
881 stubs: {
882 versions: ["10", "20", "30"],
883 },
884 }
885
886 cc_library {
887 name: "libbar",
888 srcs: ["mylib.cpp"],
889 system_shared_libs: [],
890 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000891 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900892 }
893
894 `)
895
Sundong Ahnabb64432019-10-22 13:58:29 +0900896 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900897 copyCmds := apexRule.Args["copy_commands"]
898
899 // Ensure that direct non-stubs dep is always included
900 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
901
902 // Ensure that indirect stubs dep is not included
903 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
904
905 // Ensure that runtime_libs dep in included
906 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
907
Sundong Ahnabb64432019-10-22 13:58:29 +0900908 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900909 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
910 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900911
912}
913
Jooyung Han8ce8db92020-05-15 19:05:05 +0900914func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
915 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
916 bp := `
917 apex {
918 name: "com.android.runtime",
919 key: "com.android.runtime.key",
920 native_shared_libs: ["libc"],
921 }
922
923 apex_key {
924 name: "com.android.runtime.key",
925 public_key: "testkey.avbpubkey",
926 private_key: "testkey.pem",
927 }
928
929 cc_library {
930 name: "libc",
931 no_libcrt: true,
932 nocrt: true,
933 stl: "none",
934 system_shared_libs: [],
935 stubs: { versions: ["1"] },
936 apex_available: ["com.android.runtime"],
937
938 sanitize: {
939 hwaddress: true,
940 }
941 }
942
943 cc_prebuilt_library_shared {
944 name: "libclang_rt.hwasan-aarch64-android",
945 no_libcrt: true,
946 nocrt: true,
947 stl: "none",
948 system_shared_libs: [],
949 srcs: [""],
950 stubs: { versions: ["1"] },
951
952 sanitize: {
953 never: true,
954 },
955 }
956 `
957 // override bp to use hard-coded names: com.android.runtime and libc
958 fs["Android.bp"] = []byte(bp)
959 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
960 })
961
962 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
963 "lib64/bionic/libc.so",
964 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
965 })
966
967 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
968
969 installed := hwasan.Description("install libclang_rt.hwasan")
970 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
971
972 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
973 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
974 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
975}
976
977func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
978 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
979 bp := `
980 apex {
981 name: "com.android.runtime",
982 key: "com.android.runtime.key",
983 native_shared_libs: ["libc"],
984 }
985
986 apex_key {
987 name: "com.android.runtime.key",
988 public_key: "testkey.avbpubkey",
989 private_key: "testkey.pem",
990 }
991
992 cc_library {
993 name: "libc",
994 no_libcrt: true,
995 nocrt: true,
996 stl: "none",
997 system_shared_libs: [],
998 stubs: { versions: ["1"] },
999 apex_available: ["com.android.runtime"],
1000 }
1001
1002 cc_prebuilt_library_shared {
1003 name: "libclang_rt.hwasan-aarch64-android",
1004 no_libcrt: true,
1005 nocrt: true,
1006 stl: "none",
1007 system_shared_libs: [],
1008 srcs: [""],
1009 stubs: { versions: ["1"] },
1010
1011 sanitize: {
1012 never: true,
1013 },
1014 }
1015 `
1016 // override bp to use hard-coded names: com.android.runtime and libc
1017 fs["Android.bp"] = []byte(bp)
1018 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1019
1020 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1021 })
1022
1023 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1024 "lib64/bionic/libc.so",
1025 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1026 })
1027
1028 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1029
1030 installed := hwasan.Description("install libclang_rt.hwasan")
1031 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1032
1033 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1034 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1035 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1036}
1037
Jooyung Han61b66e92020-03-21 14:21:46 +00001038func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1039 testcases := []struct {
1040 name string
1041 minSdkVersion string
1042 shouldLink string
1043 shouldNotLink []string
1044 }{
1045 {
Jooyung Han75568392020-03-20 04:29:24 +09001046 name: "should link to the latest",
Jooyung Han61b66e92020-03-21 14:21:46 +00001047 minSdkVersion: "current",
1048 shouldLink: "30",
1049 shouldNotLink: []string{"29"},
1050 },
1051 {
1052 name: "should link to llndk#29",
1053 minSdkVersion: "29",
1054 shouldLink: "29",
1055 shouldNotLink: []string{"30"},
1056 },
1057 }
1058 for _, tc := range testcases {
1059 t.Run(tc.name, func(t *testing.T) {
1060 ctx, _ := testApex(t, `
1061 apex {
1062 name: "myapex",
1063 key: "myapex.key",
1064 use_vendor: true,
1065 native_shared_libs: ["mylib"],
1066 min_sdk_version: "`+tc.minSdkVersion+`",
1067 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001068
Jooyung Han61b66e92020-03-21 14:21:46 +00001069 apex_key {
1070 name: "myapex.key",
1071 public_key: "testkey.avbpubkey",
1072 private_key: "testkey.pem",
1073 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001074
Jooyung Han61b66e92020-03-21 14:21:46 +00001075 cc_library {
1076 name: "mylib",
1077 srcs: ["mylib.cpp"],
1078 vendor_available: true,
1079 shared_libs: ["libbar"],
1080 system_shared_libs: [],
1081 stl: "none",
1082 apex_available: [ "myapex" ],
1083 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001084
Jooyung Han61b66e92020-03-21 14:21:46 +00001085 cc_library {
1086 name: "libbar",
1087 srcs: ["mylib.cpp"],
1088 system_shared_libs: [],
1089 stl: "none",
1090 stubs: { versions: ["29","30"] },
1091 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001092
Jooyung Han61b66e92020-03-21 14:21:46 +00001093 llndk_library {
1094 name: "libbar",
1095 symbol_file: "",
1096 }
1097 `, func(fs map[string][]byte, config android.Config) {
1098 setUseVendorWhitelistForTest(config, []string{"myapex"})
1099 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001100
Jooyung Han61b66e92020-03-21 14:21:46 +00001101 // Ensure that LLNDK dep is not included
1102 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1103 "lib64/mylib.so",
1104 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001105
Jooyung Han61b66e92020-03-21 14:21:46 +00001106 // Ensure that LLNDK dep is required
1107 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1108 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1109 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001110
Jooyung Han61b66e92020-03-21 14:21:46 +00001111 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1112 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1113 for _, ver := range tc.shouldNotLink {
1114 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1115 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001116
Jooyung Han61b66e92020-03-21 14:21:46 +00001117 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1118 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1119 })
1120 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001121}
1122
Jiyong Park25fc6a92018-11-18 18:02:45 +09001123func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001124 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001125 apex {
1126 name: "myapex",
1127 key: "myapex.key",
1128 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1129 }
1130
1131 apex_key {
1132 name: "myapex.key",
1133 public_key: "testkey.avbpubkey",
1134 private_key: "testkey.pem",
1135 }
1136
1137 cc_library {
1138 name: "mylib",
1139 srcs: ["mylib.cpp"],
1140 shared_libs: ["libdl#27"],
1141 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001142 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001143 }
1144
1145 cc_library_shared {
1146 name: "mylib_shared",
1147 srcs: ["mylib.cpp"],
1148 shared_libs: ["libdl#27"],
1149 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001150 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001151 }
1152
1153 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001154 name: "libBootstrap",
1155 srcs: ["mylib.cpp"],
1156 stl: "none",
1157 bootstrap: true,
1158 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001159 `)
1160
Sundong Ahnabb64432019-10-22 13:58:29 +09001161 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001162 copyCmds := apexRule.Args["copy_commands"]
1163
1164 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001165 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001166 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1167 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001168
1169 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001170 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001171
Colin Cross7113d202019-11-20 16:39:12 -08001172 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1173 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1174 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001175
1176 // For dependency to libc
1177 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001178 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001179 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001180 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001181 // ... Cflags from stub is correctly exported to mylib
1182 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1183 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1184
1185 // For dependency to libm
1186 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001187 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001188 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001189 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001190 // ... and is not compiling with the stub
1191 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1192 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1193
1194 // For dependency to libdl
1195 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001196 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001197 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001198 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1199 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001200 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001201 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001202 // ... Cflags from stub is correctly exported to mylib
1203 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1204 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001205
1206 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001207 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1208 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1209 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1210 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001211}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001212
Jooyung Han03b51852020-02-26 22:45:42 +09001213func TestApexUseStubsAccordingToMinSdkVersionInUnbundledBuild(t *testing.T) {
1214 // there are three links between liba --> libz
1215 // 1) myapex -> libx -> liba -> libz : this should be #2 link, but fallback to #1
1216 // 2) otherapex -> liby -> liba -> libz : this should be #3 link
1217 // 3) (platform) -> liba -> libz : this should be non-stub link
1218 ctx, _ := testApex(t, `
1219 apex {
1220 name: "myapex",
1221 key: "myapex.key",
1222 native_shared_libs: ["libx"],
1223 min_sdk_version: "2",
1224 }
1225
1226 apex {
1227 name: "otherapex",
1228 key: "myapex.key",
1229 native_shared_libs: ["liby"],
1230 min_sdk_version: "3",
1231 }
1232
1233 apex_key {
1234 name: "myapex.key",
1235 public_key: "testkey.avbpubkey",
1236 private_key: "testkey.pem",
1237 }
1238
1239 cc_library {
1240 name: "libx",
1241 shared_libs: ["liba"],
1242 system_shared_libs: [],
1243 stl: "none",
1244 apex_available: [ "myapex" ],
1245 }
1246
1247 cc_library {
1248 name: "liby",
1249 shared_libs: ["liba"],
1250 system_shared_libs: [],
1251 stl: "none",
1252 apex_available: [ "otherapex" ],
1253 }
1254
1255 cc_library {
1256 name: "liba",
1257 shared_libs: ["libz"],
1258 system_shared_libs: [],
1259 stl: "none",
1260 apex_available: [
1261 "//apex_available:anyapex",
1262 "//apex_available:platform",
1263 ],
1264 }
1265
1266 cc_library {
1267 name: "libz",
1268 system_shared_libs: [],
1269 stl: "none",
1270 stubs: {
1271 versions: ["1", "3"],
1272 },
1273 }
1274 `, withUnbundledBuild)
1275
1276 expectLink := func(from, from_variant, to, to_variant string) {
1277 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1278 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1279 }
1280 expectNoLink := func(from, from_variant, to, to_variant string) {
1281 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1282 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1283 }
1284 // platform liba is linked to non-stub version
1285 expectLink("liba", "shared", "libz", "shared")
1286 // liba in myapex is linked to #1
1287 expectLink("liba", "shared_myapex", "libz", "shared_1")
1288 expectNoLink("liba", "shared_myapex", "libz", "shared_3")
1289 expectNoLink("liba", "shared_myapex", "libz", "shared")
1290 // liba in otherapex is linked to #3
1291 expectLink("liba", "shared_otherapex", "libz", "shared_3")
1292 expectNoLink("liba", "shared_otherapex", "libz", "shared_1")
1293 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1294}
1295
Jooyung Hanaed150d2020-04-02 01:41:41 +09001296func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1297 ctx, _ := testApex(t, `
1298 apex {
1299 name: "myapex",
1300 key: "myapex.key",
1301 native_shared_libs: ["libx"],
1302 min_sdk_version: "R",
1303 }
1304
1305 apex_key {
1306 name: "myapex.key",
1307 public_key: "testkey.avbpubkey",
1308 private_key: "testkey.pem",
1309 }
1310
1311 cc_library {
1312 name: "libx",
1313 shared_libs: ["libz"],
1314 system_shared_libs: [],
1315 stl: "none",
1316 apex_available: [ "myapex" ],
1317 }
1318
1319 cc_library {
1320 name: "libz",
1321 system_shared_libs: [],
1322 stl: "none",
1323 stubs: {
1324 versions: ["29", "R"],
1325 },
1326 }
1327 `, func(fs map[string][]byte, config android.Config) {
1328 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1329 })
1330
1331 expectLink := func(from, from_variant, to, to_variant string) {
1332 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1333 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1334 }
1335 expectNoLink := func(from, from_variant, to, to_variant string) {
1336 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1337 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1338 }
1339 // 9000 is quite a magic number.
1340 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1341 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1342 // to distinguish them from finalized and future_api(10000)
1343 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1344 // (refer android/api_levels.go)
1345 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1346 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1347 expectNoLink("libx", "shared_myapex", "libz", "shared")
1348}
1349
Jooyung Han03b51852020-02-26 22:45:42 +09001350func TestApexMinSdkVersionDefaultsToLatest(t *testing.T) {
1351 ctx, _ := testApex(t, `
1352 apex {
1353 name: "myapex",
1354 key: "myapex.key",
1355 native_shared_libs: ["libx"],
1356 }
1357
1358 apex_key {
1359 name: "myapex.key",
1360 public_key: "testkey.avbpubkey",
1361 private_key: "testkey.pem",
1362 }
1363
1364 cc_library {
1365 name: "libx",
1366 shared_libs: ["libz"],
1367 system_shared_libs: [],
1368 stl: "none",
1369 apex_available: [ "myapex" ],
1370 }
1371
1372 cc_library {
1373 name: "libz",
1374 system_shared_libs: [],
1375 stl: "none",
1376 stubs: {
1377 versions: ["1", "2"],
1378 },
1379 }
1380 `)
1381
1382 expectLink := func(from, from_variant, to, to_variant string) {
1383 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1384 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1385 }
1386 expectNoLink := func(from, from_variant, to, to_variant string) {
1387 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1388 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1389 }
1390 expectLink("libx", "shared_myapex", "libz", "shared_2")
1391 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1392 expectNoLink("libx", "shared_myapex", "libz", "shared")
1393}
1394
1395func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1396 ctx, _ := testApex(t, `
1397 apex {
1398 name: "myapex",
1399 key: "myapex.key",
1400 native_shared_libs: ["libx"],
1401 }
1402
1403 apex_key {
1404 name: "myapex.key",
1405 public_key: "testkey.avbpubkey",
1406 private_key: "testkey.pem",
1407 }
1408
1409 cc_library {
1410 name: "libx",
1411 system_shared_libs: [],
1412 stl: "none",
1413 apex_available: [ "myapex" ],
1414 stubs: {
1415 versions: ["1", "2"],
1416 },
1417 }
1418
1419 cc_library {
1420 name: "libz",
1421 shared_libs: ["libx"],
1422 system_shared_libs: [],
1423 stl: "none",
1424 }
1425 `)
1426
1427 expectLink := func(from, from_variant, to, to_variant string) {
1428 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1429 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1430 }
1431 expectNoLink := func(from, from_variant, to, to_variant string) {
1432 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1433 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1434 }
1435 expectLink("libz", "shared", "libx", "shared_2")
1436 expectNoLink("libz", "shared", "libz", "shared_1")
1437 expectNoLink("libz", "shared", "libz", "shared")
1438}
1439
Jooyung Han75568392020-03-20 04:29:24 +09001440func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001441 ctx, _ := testApex(t, `
1442 apex {
1443 name: "myapex",
1444 key: "myapex.key",
1445 native_shared_libs: ["libx"],
1446 min_sdk_version: "29",
1447 }
1448
1449 apex_key {
1450 name: "myapex.key",
1451 public_key: "testkey.avbpubkey",
1452 private_key: "testkey.pem",
1453 }
1454
1455 cc_library {
1456 name: "libx",
1457 shared_libs: ["libbar"],
1458 apex_available: [ "myapex" ],
1459 }
1460
1461 cc_library {
1462 name: "libbar",
1463 stubs: {
1464 versions: ["29", "30"],
1465 },
1466 }
Jooyung Han75568392020-03-20 04:29:24 +09001467 `, func(fs map[string][]byte, config android.Config) {
1468 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1469 })
Jooyung Han03b51852020-02-26 22:45:42 +09001470 expectLink := func(from, from_variant, to, to_variant string) {
1471 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1472 libFlags := ld.Args["libFlags"]
1473 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1474 }
Jooyung Han75568392020-03-20 04:29:24 +09001475 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001476}
1477
Jooyung Han75568392020-03-20 04:29:24 +09001478func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001479 ctx, _ := testApex(t, `
1480 apex {
1481 name: "myapex",
1482 key: "myapex.key",
1483 native_shared_libs: ["libx"],
1484 min_sdk_version: "29",
1485 }
1486
1487 apex_key {
1488 name: "myapex.key",
1489 public_key: "testkey.avbpubkey",
1490 private_key: "testkey.pem",
1491 }
1492
1493 cc_library {
1494 name: "libx",
1495 apex_available: [ "myapex" ],
1496 }
Jooyung Han75568392020-03-20 04:29:24 +09001497 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001498
1499 // ensure apex variant of c++ is linked with static unwinder
1500 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1501 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1502 // note that platform variant is not.
1503 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1504 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001505}
1506
1507func TestInvalidMinSdkVersion(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001508 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001509 apex {
1510 name: "myapex",
1511 key: "myapex.key",
1512 native_shared_libs: ["libx"],
1513 min_sdk_version: "29",
1514 }
1515
1516 apex_key {
1517 name: "myapex.key",
1518 public_key: "testkey.avbpubkey",
1519 private_key: "testkey.pem",
1520 }
1521
1522 cc_library {
1523 name: "libx",
1524 shared_libs: ["libz"],
1525 system_shared_libs: [],
1526 stl: "none",
1527 apex_available: [ "myapex" ],
1528 }
1529
1530 cc_library {
1531 name: "libz",
1532 system_shared_libs: [],
1533 stl: "none",
1534 stubs: {
1535 versions: ["30"],
1536 },
1537 }
Jooyung Han75568392020-03-20 04:29:24 +09001538 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001539
Jooyung Hanaed150d2020-04-02 01:41:41 +09001540 testApexError(t, `"myapex" .*: min_sdk_version: SDK version should be .*`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001541 apex {
1542 name: "myapex",
1543 key: "myapex.key",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001544 min_sdk_version: "abc",
Jooyung Han03b51852020-02-26 22:45:42 +09001545 }
1546
1547 apex_key {
1548 name: "myapex.key",
1549 public_key: "testkey.avbpubkey",
1550 private_key: "testkey.pem",
1551 }
1552 `)
1553}
1554
Artur Satayev8cf899a2020-04-15 17:29:42 +01001555func TestJavaStableSdkVersion(t *testing.T) {
1556 testCases := []struct {
1557 name string
1558 expectedError string
1559 bp string
1560 }{
1561 {
1562 name: "Non-updatable apex with non-stable dep",
1563 bp: `
1564 apex {
1565 name: "myapex",
1566 java_libs: ["myjar"],
1567 key: "myapex.key",
1568 }
1569 apex_key {
1570 name: "myapex.key",
1571 public_key: "testkey.avbpubkey",
1572 private_key: "testkey.pem",
1573 }
1574 java_library {
1575 name: "myjar",
1576 srcs: ["foo/bar/MyClass.java"],
1577 sdk_version: "core_platform",
1578 apex_available: ["myapex"],
1579 }
1580 `,
1581 },
1582 {
1583 name: "Updatable apex with stable dep",
1584 bp: `
1585 apex {
1586 name: "myapex",
1587 java_libs: ["myjar"],
1588 key: "myapex.key",
1589 updatable: true,
1590 min_sdk_version: "29",
1591 }
1592 apex_key {
1593 name: "myapex.key",
1594 public_key: "testkey.avbpubkey",
1595 private_key: "testkey.pem",
1596 }
1597 java_library {
1598 name: "myjar",
1599 srcs: ["foo/bar/MyClass.java"],
1600 sdk_version: "current",
1601 apex_available: ["myapex"],
1602 }
1603 `,
1604 },
1605 {
1606 name: "Updatable apex with non-stable dep",
1607 expectedError: "cannot depend on \"myjar\"",
1608 bp: `
1609 apex {
1610 name: "myapex",
1611 java_libs: ["myjar"],
1612 key: "myapex.key",
1613 updatable: true,
1614 }
1615 apex_key {
1616 name: "myapex.key",
1617 public_key: "testkey.avbpubkey",
1618 private_key: "testkey.pem",
1619 }
1620 java_library {
1621 name: "myjar",
1622 srcs: ["foo/bar/MyClass.java"],
1623 sdk_version: "core_platform",
1624 apex_available: ["myapex"],
1625 }
1626 `,
1627 },
1628 {
1629 name: "Updatable apex with non-stable transitive dep",
1630 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1631 bp: `
1632 apex {
1633 name: "myapex",
1634 java_libs: ["myjar"],
1635 key: "myapex.key",
1636 updatable: true,
1637 }
1638 apex_key {
1639 name: "myapex.key",
1640 public_key: "testkey.avbpubkey",
1641 private_key: "testkey.pem",
1642 }
1643 java_library {
1644 name: "myjar",
1645 srcs: ["foo/bar/MyClass.java"],
1646 sdk_version: "current",
1647 apex_available: ["myapex"],
1648 static_libs: ["transitive-jar"],
1649 }
1650 java_library {
1651 name: "transitive-jar",
1652 srcs: ["foo/bar/MyClass.java"],
1653 sdk_version: "core_platform",
1654 apex_available: ["myapex"],
1655 }
1656 `,
1657 },
1658 }
1659
1660 for _, test := range testCases {
1661 t.Run(test.name, func(t *testing.T) {
1662 if test.expectedError == "" {
1663 testApex(t, test.bp)
1664 } else {
1665 testApexError(t, test.expectedError, test.bp)
1666 }
1667 })
1668 }
1669}
1670
Jiyong Park7c2ee712018-12-07 00:42:25 +09001671func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001672 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001673 apex {
1674 name: "myapex",
1675 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001676 native_shared_libs: ["mylib"],
1677 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001678 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001679 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001680 }
1681
1682 apex_key {
1683 name: "myapex.key",
1684 public_key: "testkey.avbpubkey",
1685 private_key: "testkey.pem",
1686 }
1687
1688 prebuilt_etc {
1689 name: "myetc",
1690 src: "myprebuilt",
1691 sub_dir: "foo/bar",
1692 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001693
1694 cc_library {
1695 name: "mylib",
1696 srcs: ["mylib.cpp"],
1697 relative_install_path: "foo/bar",
1698 system_shared_libs: [],
1699 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001700 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001701 }
1702
1703 cc_binary {
1704 name: "mybin",
1705 srcs: ["mylib.cpp"],
1706 relative_install_path: "foo/bar",
1707 system_shared_libs: [],
1708 static_executable: true,
1709 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001710 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001711 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001712 `)
1713
Sundong Ahnabb64432019-10-22 13:58:29 +09001714 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001715 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1716
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001717 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001718 ensureListContains(t, dirs, "etc")
1719 ensureListContains(t, dirs, "etc/foo")
1720 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001721 ensureListContains(t, dirs, "lib64")
1722 ensureListContains(t, dirs, "lib64/foo")
1723 ensureListContains(t, dirs, "lib64/foo/bar")
1724 ensureListContains(t, dirs, "lib")
1725 ensureListContains(t, dirs, "lib/foo")
1726 ensureListContains(t, dirs, "lib/foo/bar")
1727
Jiyong Parkbd13e442019-03-15 18:10:35 +09001728 ensureListContains(t, dirs, "bin")
1729 ensureListContains(t, dirs, "bin/foo")
1730 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001731}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001732
Jooyung Han35155c42020-02-06 17:33:20 +09001733func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
1734 ctx, _ := testApex(t, `
1735 apex {
1736 name: "myapex",
1737 key: "myapex.key",
1738 multilib: {
1739 both: {
1740 native_shared_libs: ["mylib"],
1741 binaries: ["mybin"],
1742 },
1743 },
1744 compile_multilib: "both",
1745 native_bridge_supported: true,
1746 }
1747
1748 apex_key {
1749 name: "myapex.key",
1750 public_key: "testkey.avbpubkey",
1751 private_key: "testkey.pem",
1752 }
1753
1754 cc_library {
1755 name: "mylib",
1756 relative_install_path: "foo/bar",
1757 system_shared_libs: [],
1758 stl: "none",
1759 apex_available: [ "myapex" ],
1760 native_bridge_supported: true,
1761 }
1762
1763 cc_binary {
1764 name: "mybin",
1765 relative_install_path: "foo/bar",
1766 system_shared_libs: [],
1767 static_executable: true,
1768 stl: "none",
1769 apex_available: [ "myapex" ],
1770 native_bridge_supported: true,
1771 compile_multilib: "both", // default is "first" for binary
1772 multilib: {
1773 lib64: {
1774 suffix: "64",
1775 },
1776 },
1777 }
1778 `, withNativeBridgeEnabled)
1779 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1780 "bin/foo/bar/mybin",
1781 "bin/foo/bar/mybin64",
1782 "bin/arm/foo/bar/mybin",
1783 "bin/arm64/foo/bar/mybin64",
1784 "lib/foo/bar/mylib.so",
1785 "lib/arm/foo/bar/mylib.so",
1786 "lib64/foo/bar/mylib.so",
1787 "lib64/arm64/foo/bar/mylib.so",
1788 })
1789}
1790
Jiyong Parkda6eb592018-12-19 17:12:36 +09001791func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001792 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09001793 apex {
1794 name: "myapex",
1795 key: "myapex.key",
1796 native_shared_libs: ["mylib"],
1797 use_vendor: true,
1798 }
1799
1800 apex_key {
1801 name: "myapex.key",
1802 public_key: "testkey.avbpubkey",
1803 private_key: "testkey.pem",
1804 }
1805
1806 cc_library {
1807 name: "mylib",
1808 srcs: ["mylib.cpp"],
1809 shared_libs: ["mylib2"],
1810 system_shared_libs: [],
1811 vendor_available: true,
1812 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001813 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001814 }
1815
1816 cc_library {
1817 name: "mylib2",
1818 srcs: ["mylib.cpp"],
1819 system_shared_libs: [],
1820 vendor_available: true,
1821 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001822 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001823 }
Jooyung Handc782442019-11-01 03:14:38 +09001824 `, func(fs map[string][]byte, config android.Config) {
1825 setUseVendorWhitelistForTest(config, []string{"myapex"})
1826 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09001827
1828 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09001829 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09001830 for _, implicit := range i.Implicits {
1831 inputsList = append(inputsList, implicit.String())
1832 }
1833 }
1834 inputsString := strings.Join(inputsList, " ")
1835
1836 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08001837 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
1838 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001839
1840 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08001841 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
1842 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001843}
Jiyong Park16e91a02018-12-20 18:18:08 +09001844
Jooyung Handc782442019-11-01 03:14:38 +09001845func TestUseVendorRestriction(t *testing.T) {
1846 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
1847 apex {
1848 name: "myapex",
1849 key: "myapex.key",
1850 use_vendor: true,
1851 }
1852 apex_key {
1853 name: "myapex.key",
1854 public_key: "testkey.avbpubkey",
1855 private_key: "testkey.pem",
1856 }
1857 `, func(fs map[string][]byte, config android.Config) {
1858 setUseVendorWhitelistForTest(config, []string{""})
1859 })
1860 // no error with whitelist
1861 testApex(t, `
1862 apex {
1863 name: "myapex",
1864 key: "myapex.key",
1865 use_vendor: true,
1866 }
1867 apex_key {
1868 name: "myapex.key",
1869 public_key: "testkey.avbpubkey",
1870 private_key: "testkey.pem",
1871 }
1872 `, func(fs map[string][]byte, config android.Config) {
1873 setUseVendorWhitelistForTest(config, []string{"myapex"})
1874 })
1875}
1876
Jooyung Han5c998b92019-06-27 11:30:33 +09001877func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
1878 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
1879 apex {
1880 name: "myapex",
1881 key: "myapex.key",
1882 native_shared_libs: ["mylib"],
1883 use_vendor: true,
1884 }
1885
1886 apex_key {
1887 name: "myapex.key",
1888 public_key: "testkey.avbpubkey",
1889 private_key: "testkey.pem",
1890 }
1891
1892 cc_library {
1893 name: "mylib",
1894 srcs: ["mylib.cpp"],
1895 system_shared_libs: [],
1896 stl: "none",
1897 }
1898 `)
1899}
1900
Jiyong Park16e91a02018-12-20 18:18:08 +09001901func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001902 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09001903 apex {
1904 name: "myapex",
1905 key: "myapex.key",
1906 native_shared_libs: ["mylib"],
1907 }
1908
1909 apex_key {
1910 name: "myapex.key",
1911 public_key: "testkey.avbpubkey",
1912 private_key: "testkey.pem",
1913 }
1914
1915 cc_library {
1916 name: "mylib",
1917 srcs: ["mylib.cpp"],
1918 system_shared_libs: [],
1919 stl: "none",
1920 stubs: {
1921 versions: ["1", "2", "3"],
1922 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001923 apex_available: [
1924 "//apex_available:platform",
1925 "myapex",
1926 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09001927 }
1928
1929 cc_binary {
1930 name: "not_in_apex",
1931 srcs: ["mylib.cpp"],
1932 static_libs: ["mylib"],
1933 static_executable: true,
1934 system_shared_libs: [],
1935 stl: "none",
1936 }
Jiyong Park16e91a02018-12-20 18:18:08 +09001937 `)
1938
Colin Cross7113d202019-11-20 16:39:12 -08001939 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09001940
1941 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08001942 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09001943}
Jiyong Park9335a262018-12-24 11:31:58 +09001944
1945func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001946 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09001947 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001948 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09001949 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001950 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09001951 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09001952 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09001953 }
1954
1955 cc_library {
1956 name: "mylib",
1957 srcs: ["mylib.cpp"],
1958 system_shared_libs: [],
1959 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001960 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09001961 }
1962
1963 apex_key {
1964 name: "myapex.key",
1965 public_key: "testkey.avbpubkey",
1966 private_key: "testkey.pem",
1967 }
1968
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001969 android_app_certificate {
1970 name: "myapex.certificate",
1971 certificate: "testkey",
1972 }
1973
1974 android_app_certificate {
1975 name: "myapex.certificate.override",
1976 certificate: "testkey.override",
1977 }
1978
Jiyong Park9335a262018-12-24 11:31:58 +09001979 `)
1980
1981 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09001982 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09001983
1984 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
1985 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
1986 "vendor/foo/devkeys/testkey.avbpubkey")
1987 }
1988 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
1989 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
1990 "vendor/foo/devkeys/testkey.pem")
1991 }
1992
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001993 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09001994 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001995 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09001996 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001997 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09001998 }
1999}
Jiyong Park58e364a2019-01-19 19:24:06 +09002000
Jooyung Hanf121a652019-12-17 14:30:11 +09002001func TestCertificate(t *testing.T) {
2002 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2003 ctx, _ := testApex(t, `
2004 apex {
2005 name: "myapex",
2006 key: "myapex.key",
2007 }
2008 apex_key {
2009 name: "myapex.key",
2010 public_key: "testkey.avbpubkey",
2011 private_key: "testkey.pem",
2012 }`)
2013 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2014 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2015 if actual := rule.Args["certificates"]; actual != expected {
2016 t.Errorf("certificates should be %q, not %q", expected, actual)
2017 }
2018 })
2019 t.Run("override when unspecified", func(t *testing.T) {
2020 ctx, _ := testApex(t, `
2021 apex {
2022 name: "myapex_keytest",
2023 key: "myapex.key",
2024 file_contexts: ":myapex-file_contexts",
2025 }
2026 apex_key {
2027 name: "myapex.key",
2028 public_key: "testkey.avbpubkey",
2029 private_key: "testkey.pem",
2030 }
2031 android_app_certificate {
2032 name: "myapex.certificate.override",
2033 certificate: "testkey.override",
2034 }`)
2035 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2036 expected := "testkey.override.x509.pem testkey.override.pk8"
2037 if actual := rule.Args["certificates"]; actual != expected {
2038 t.Errorf("certificates should be %q, not %q", expected, actual)
2039 }
2040 })
2041 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2042 ctx, _ := testApex(t, `
2043 apex {
2044 name: "myapex",
2045 key: "myapex.key",
2046 certificate: ":myapex.certificate",
2047 }
2048 apex_key {
2049 name: "myapex.key",
2050 public_key: "testkey.avbpubkey",
2051 private_key: "testkey.pem",
2052 }
2053 android_app_certificate {
2054 name: "myapex.certificate",
2055 certificate: "testkey",
2056 }`)
2057 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2058 expected := "testkey.x509.pem testkey.pk8"
2059 if actual := rule.Args["certificates"]; actual != expected {
2060 t.Errorf("certificates should be %q, not %q", expected, actual)
2061 }
2062 })
2063 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2064 ctx, _ := testApex(t, `
2065 apex {
2066 name: "myapex_keytest",
2067 key: "myapex.key",
2068 file_contexts: ":myapex-file_contexts",
2069 certificate: ":myapex.certificate",
2070 }
2071 apex_key {
2072 name: "myapex.key",
2073 public_key: "testkey.avbpubkey",
2074 private_key: "testkey.pem",
2075 }
2076 android_app_certificate {
2077 name: "myapex.certificate.override",
2078 certificate: "testkey.override",
2079 }`)
2080 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2081 expected := "testkey.override.x509.pem testkey.override.pk8"
2082 if actual := rule.Args["certificates"]; actual != expected {
2083 t.Errorf("certificates should be %q, not %q", expected, actual)
2084 }
2085 })
2086 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2087 ctx, _ := testApex(t, `
2088 apex {
2089 name: "myapex",
2090 key: "myapex.key",
2091 certificate: "testkey",
2092 }
2093 apex_key {
2094 name: "myapex.key",
2095 public_key: "testkey.avbpubkey",
2096 private_key: "testkey.pem",
2097 }`)
2098 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2099 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2100 if actual := rule.Args["certificates"]; actual != expected {
2101 t.Errorf("certificates should be %q, not %q", expected, actual)
2102 }
2103 })
2104 t.Run("override when specified as <name>", func(t *testing.T) {
2105 ctx, _ := testApex(t, `
2106 apex {
2107 name: "myapex_keytest",
2108 key: "myapex.key",
2109 file_contexts: ":myapex-file_contexts",
2110 certificate: "testkey",
2111 }
2112 apex_key {
2113 name: "myapex.key",
2114 public_key: "testkey.avbpubkey",
2115 private_key: "testkey.pem",
2116 }
2117 android_app_certificate {
2118 name: "myapex.certificate.override",
2119 certificate: "testkey.override",
2120 }`)
2121 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2122 expected := "testkey.override.x509.pem testkey.override.pk8"
2123 if actual := rule.Args["certificates"]; actual != expected {
2124 t.Errorf("certificates should be %q, not %q", expected, actual)
2125 }
2126 })
2127}
2128
Jiyong Park58e364a2019-01-19 19:24:06 +09002129func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002130 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002131 apex {
2132 name: "myapex",
2133 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002134 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002135 }
2136
2137 apex {
2138 name: "otherapex",
2139 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002140 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002141 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002142 }
2143
2144 apex_key {
2145 name: "myapex.key",
2146 public_key: "testkey.avbpubkey",
2147 private_key: "testkey.pem",
2148 }
2149
2150 cc_library {
2151 name: "mylib",
2152 srcs: ["mylib.cpp"],
2153 system_shared_libs: [],
2154 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002155 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002156 "myapex",
2157 "otherapex",
2158 ],
Jooyung Han24282772020-03-21 23:20:55 +09002159 recovery_available: true,
Jiyong Park58e364a2019-01-19 19:24:06 +09002160 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002161 cc_library {
2162 name: "mylib2",
2163 srcs: ["mylib.cpp"],
2164 system_shared_libs: [],
2165 stl: "none",
2166 apex_available: [
2167 "myapex",
2168 "otherapex",
2169 ],
2170 use_apex_name_macro: true,
2171 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002172 `)
2173
Jooyung Hanc87a0592020-03-02 17:44:33 +09002174 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002175 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002176 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002177 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002178
Jooyung Hanccce2f22020-03-07 03:45:53 +09002179 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002180 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2181 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002182 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002183 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002184
Jooyung Hanccce2f22020-03-07 03:45:53 +09002185 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002186 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2187 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002188 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002189 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002190
Jooyung Hanc87a0592020-03-02 17:44:33 +09002191 // When cc_library sets use_apex_name_macro: true
2192 // apex variants define additional macro to distinguish which apex variant it is built for
2193
2194 // non-APEX variant does not have __ANDROID_APEX__ defined
2195 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2196 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2197
2198 // APEX variant has __ANDROID_APEX__ defined
2199 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002200 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002201 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2202 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002203
Jooyung Hanc87a0592020-03-02 17:44:33 +09002204 // APEX variant has __ANDROID_APEX__ defined
2205 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002206 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002207 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2208 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002209
2210 // recovery variant does not set __ANDROID_SDK_VERSION__
2211 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2212 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2213 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002214}
Jiyong Park7e636d02019-01-28 16:16:54 +09002215
2216func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002217 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002218 apex {
2219 name: "myapex",
2220 key: "myapex.key",
2221 native_shared_libs: ["mylib"],
2222 }
2223
2224 apex_key {
2225 name: "myapex.key",
2226 public_key: "testkey.avbpubkey",
2227 private_key: "testkey.pem",
2228 }
2229
2230 cc_library_headers {
2231 name: "mylib_headers",
2232 export_include_dirs: ["my_include"],
2233 system_shared_libs: [],
2234 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002235 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002236 }
2237
2238 cc_library {
2239 name: "mylib",
2240 srcs: ["mylib.cpp"],
2241 system_shared_libs: [],
2242 stl: "none",
2243 header_libs: ["mylib_headers"],
2244 export_header_lib_headers: ["mylib_headers"],
2245 stubs: {
2246 versions: ["1", "2", "3"],
2247 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002248 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002249 }
2250
2251 cc_library {
2252 name: "otherlib",
2253 srcs: ["mylib.cpp"],
2254 system_shared_libs: [],
2255 stl: "none",
2256 shared_libs: ["mylib"],
2257 }
2258 `)
2259
Colin Cross7113d202019-11-20 16:39:12 -08002260 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002261
2262 // Ensure that the include path of the header lib is exported to 'otherlib'
2263 ensureContains(t, cFlags, "-Imy_include")
2264}
Alex Light9670d332019-01-29 18:07:33 -08002265
Jiyong Park7cd10e32020-01-14 09:22:18 +09002266type fileInApex struct {
2267 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002268 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002269 isLink bool
2270}
2271
Jooyung Hana57af4a2020-01-23 05:36:59 +00002272func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002273 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002274 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002275 copyCmds := apexRule.Args["copy_commands"]
2276 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002277 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002278 for _, cmd := range strings.Split(copyCmds, "&&") {
2279 cmd = strings.TrimSpace(cmd)
2280 if cmd == "" {
2281 continue
2282 }
2283 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002284 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002285 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002286 switch terms[0] {
2287 case "mkdir":
2288 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002289 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002290 t.Fatal("copyCmds contains invalid cp command", cmd)
2291 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002292 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002293 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002294 isLink = false
2295 case "ln":
2296 if len(terms) != 3 && len(terms) != 4 {
2297 // ln LINK TARGET or ln -s LINK TARGET
2298 t.Fatal("copyCmds contains invalid ln command", cmd)
2299 }
2300 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002301 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002302 isLink = true
2303 default:
2304 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2305 }
2306 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002307 index := strings.Index(dst, imageApexDir)
2308 if index == -1 {
2309 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2310 }
2311 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002312 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002313 }
2314 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002315 return ret
2316}
2317
Jooyung Hana57af4a2020-01-23 05:36:59 +00002318func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2319 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002320 var failed bool
2321 var surplus []string
2322 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002323 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002324 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002325 for _, expected := range files {
2326 if matched, _ := path.Match(expected, file.path); matched {
2327 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002328 mactchFound = true
2329 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002330 }
2331 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002332 if !mactchFound {
2333 surplus = append(surplus, file.path)
2334 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002335 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002336
Jooyung Han31c470b2019-10-18 16:26:59 +09002337 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002338 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002339 t.Log("surplus files", surplus)
2340 failed = true
2341 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002342
2343 if len(files) > len(filesMatched) {
2344 var missing []string
2345 for _, expected := range files {
2346 if !filesMatched[expected] {
2347 missing = append(missing, expected)
2348 }
2349 }
2350 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002351 t.Log("missing files", missing)
2352 failed = true
2353 }
2354 if failed {
2355 t.Fail()
2356 }
2357}
2358
Jooyung Han344d5432019-08-23 11:17:39 +09002359func TestVndkApexCurrent(t *testing.T) {
2360 ctx, _ := testApex(t, `
2361 apex_vndk {
2362 name: "myapex",
2363 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002364 }
2365
2366 apex_key {
2367 name: "myapex.key",
2368 public_key: "testkey.avbpubkey",
2369 private_key: "testkey.pem",
2370 }
2371
2372 cc_library {
2373 name: "libvndk",
2374 srcs: ["mylib.cpp"],
2375 vendor_available: true,
2376 vndk: {
2377 enabled: true,
2378 },
2379 system_shared_libs: [],
2380 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002381 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002382 }
2383
2384 cc_library {
2385 name: "libvndksp",
2386 srcs: ["mylib.cpp"],
2387 vendor_available: true,
2388 vndk: {
2389 enabled: true,
2390 support_system_process: true,
2391 },
2392 system_shared_libs: [],
2393 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002394 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002395 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002396 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002397
Jooyung Hana57af4a2020-01-23 05:36:59 +00002398 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002399 "lib/libvndk.so",
2400 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002401 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002402 "lib64/libvndk.so",
2403 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002404 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002405 "etc/llndk.libraries.VER.txt",
2406 "etc/vndkcore.libraries.VER.txt",
2407 "etc/vndksp.libraries.VER.txt",
2408 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002409 })
Jooyung Han344d5432019-08-23 11:17:39 +09002410}
2411
2412func TestVndkApexWithPrebuilt(t *testing.T) {
2413 ctx, _ := testApex(t, `
2414 apex_vndk {
2415 name: "myapex",
2416 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002417 }
2418
2419 apex_key {
2420 name: "myapex.key",
2421 public_key: "testkey.avbpubkey",
2422 private_key: "testkey.pem",
2423 }
2424
2425 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002426 name: "libvndk",
2427 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002428 vendor_available: true,
2429 vndk: {
2430 enabled: true,
2431 },
2432 system_shared_libs: [],
2433 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002434 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002435 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002436
2437 cc_prebuilt_library_shared {
2438 name: "libvndk.arm",
2439 srcs: ["libvndk.arm.so"],
2440 vendor_available: true,
2441 vndk: {
2442 enabled: true,
2443 },
2444 enabled: false,
2445 arch: {
2446 arm: {
2447 enabled: true,
2448 },
2449 },
2450 system_shared_libs: [],
2451 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002452 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002453 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002454 `+vndkLibrariesTxtFiles("current"),
2455 withFiles(map[string][]byte{
2456 "libvndk.so": nil,
2457 "libvndk.arm.so": nil,
2458 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002459
Jooyung Hana57af4a2020-01-23 05:36:59 +00002460 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002461 "lib/libvndk.so",
2462 "lib/libvndk.arm.so",
2463 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002464 "lib/libc++.so",
2465 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002466 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002467 })
Jooyung Han344d5432019-08-23 11:17:39 +09002468}
2469
Jooyung Han39edb6c2019-11-06 16:53:07 +09002470func vndkLibrariesTxtFiles(vers ...string) (result string) {
2471 for _, v := range vers {
2472 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002473 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002474 result += `
2475 vndk_libraries_txt {
2476 name: "` + txt + `.libraries.txt",
2477 }
2478 `
2479 }
2480 } else {
2481 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2482 result += `
2483 prebuilt_etc {
2484 name: "` + txt + `.libraries.` + v + `.txt",
2485 src: "dummy.txt",
2486 }
2487 `
2488 }
2489 }
2490 }
2491 return
2492}
2493
Jooyung Han344d5432019-08-23 11:17:39 +09002494func TestVndkApexVersion(t *testing.T) {
2495 ctx, _ := testApex(t, `
2496 apex_vndk {
2497 name: "myapex_v27",
2498 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002499 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002500 vndk_version: "27",
2501 }
2502
2503 apex_key {
2504 name: "myapex.key",
2505 public_key: "testkey.avbpubkey",
2506 private_key: "testkey.pem",
2507 }
2508
Jooyung Han31c470b2019-10-18 16:26:59 +09002509 vndk_prebuilt_shared {
2510 name: "libvndk27",
2511 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002512 vendor_available: true,
2513 vndk: {
2514 enabled: true,
2515 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002516 target_arch: "arm64",
2517 arch: {
2518 arm: {
2519 srcs: ["libvndk27_arm.so"],
2520 },
2521 arm64: {
2522 srcs: ["libvndk27_arm64.so"],
2523 },
2524 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002525 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002526 }
2527
2528 vndk_prebuilt_shared {
2529 name: "libvndk27",
2530 version: "27",
2531 vendor_available: true,
2532 vndk: {
2533 enabled: true,
2534 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002535 target_arch: "x86_64",
2536 arch: {
2537 x86: {
2538 srcs: ["libvndk27_x86.so"],
2539 },
2540 x86_64: {
2541 srcs: ["libvndk27_x86_64.so"],
2542 },
2543 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09002544 }
2545 `+vndkLibrariesTxtFiles("27"),
2546 withFiles(map[string][]byte{
2547 "libvndk27_arm.so": nil,
2548 "libvndk27_arm64.so": nil,
2549 "libvndk27_x86.so": nil,
2550 "libvndk27_x86_64.so": nil,
2551 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002552
Jooyung Hana57af4a2020-01-23 05:36:59 +00002553 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002554 "lib/libvndk27_arm.so",
2555 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002556 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002557 })
Jooyung Han344d5432019-08-23 11:17:39 +09002558}
2559
2560func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
2561 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
2562 apex_vndk {
2563 name: "myapex_v27",
2564 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002565 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002566 vndk_version: "27",
2567 }
2568 apex_vndk {
2569 name: "myapex_v27_other",
2570 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002571 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002572 vndk_version: "27",
2573 }
2574
2575 apex_key {
2576 name: "myapex.key",
2577 public_key: "testkey.avbpubkey",
2578 private_key: "testkey.pem",
2579 }
2580
2581 cc_library {
2582 name: "libvndk",
2583 srcs: ["mylib.cpp"],
2584 vendor_available: true,
2585 vndk: {
2586 enabled: true,
2587 },
2588 system_shared_libs: [],
2589 stl: "none",
2590 }
2591
2592 vndk_prebuilt_shared {
2593 name: "libvndk",
2594 version: "27",
2595 vendor_available: true,
2596 vndk: {
2597 enabled: true,
2598 },
2599 srcs: ["libvndk.so"],
2600 }
2601 `, withFiles(map[string][]byte{
2602 "libvndk.so": nil,
2603 }))
2604}
2605
Jooyung Han90eee022019-10-01 20:02:42 +09002606func TestVndkApexNameRule(t *testing.T) {
2607 ctx, _ := testApex(t, `
2608 apex_vndk {
2609 name: "myapex",
2610 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002611 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002612 }
2613 apex_vndk {
2614 name: "myapex_v28",
2615 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002616 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002617 vndk_version: "28",
2618 }
2619 apex_key {
2620 name: "myapex.key",
2621 public_key: "testkey.avbpubkey",
2622 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002623 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09002624
2625 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00002626 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09002627 actual := proptools.String(bundle.properties.Apex_name)
2628 if !reflect.DeepEqual(actual, expected) {
2629 t.Errorf("Got '%v', expected '%v'", actual, expected)
2630 }
2631 }
2632
2633 assertApexName("com.android.vndk.vVER", "myapex")
2634 assertApexName("com.android.vndk.v28", "myapex_v28")
2635}
2636
Jooyung Han344d5432019-08-23 11:17:39 +09002637func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
2638 ctx, _ := testApex(t, `
2639 apex_vndk {
2640 name: "myapex",
2641 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002642 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002643 }
2644
2645 apex_key {
2646 name: "myapex.key",
2647 public_key: "testkey.avbpubkey",
2648 private_key: "testkey.pem",
2649 }
2650
2651 cc_library {
2652 name: "libvndk",
2653 srcs: ["mylib.cpp"],
2654 vendor_available: true,
2655 native_bridge_supported: true,
2656 host_supported: true,
2657 vndk: {
2658 enabled: true,
2659 },
2660 system_shared_libs: [],
2661 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002662 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002663 }
Jooyung Han35155c42020-02-06 17:33:20 +09002664 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09002665
Jooyung Hana57af4a2020-01-23 05:36:59 +00002666 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002667 "lib/libvndk.so",
2668 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002669 "lib/libc++.so",
2670 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002671 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002672 })
Jooyung Han344d5432019-08-23 11:17:39 +09002673}
2674
2675func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
2676 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
2677 apex_vndk {
2678 name: "myapex",
2679 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002680 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002681 native_bridge_supported: true,
2682 }
2683
2684 apex_key {
2685 name: "myapex.key",
2686 public_key: "testkey.avbpubkey",
2687 private_key: "testkey.pem",
2688 }
2689
2690 cc_library {
2691 name: "libvndk",
2692 srcs: ["mylib.cpp"],
2693 vendor_available: true,
2694 native_bridge_supported: true,
2695 host_supported: true,
2696 vndk: {
2697 enabled: true,
2698 },
2699 system_shared_libs: [],
2700 stl: "none",
2701 }
2702 `)
2703}
2704
Jooyung Han31c470b2019-10-18 16:26:59 +09002705func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002706 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09002707 apex_vndk {
2708 name: "myapex_v27",
2709 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002710 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09002711 vndk_version: "27",
2712 }
2713
2714 apex_key {
2715 name: "myapex.key",
2716 public_key: "testkey.avbpubkey",
2717 private_key: "testkey.pem",
2718 }
2719
2720 vndk_prebuilt_shared {
2721 name: "libvndk27",
2722 version: "27",
2723 target_arch: "arm",
2724 vendor_available: true,
2725 vndk: {
2726 enabled: true,
2727 },
2728 arch: {
2729 arm: {
2730 srcs: ["libvndk27.so"],
2731 }
2732 },
2733 }
2734
2735 vndk_prebuilt_shared {
2736 name: "libvndk27",
2737 version: "27",
2738 target_arch: "arm",
2739 binder32bit: true,
2740 vendor_available: true,
2741 vndk: {
2742 enabled: true,
2743 },
2744 arch: {
2745 arm: {
2746 srcs: ["libvndk27binder32.so"],
2747 }
2748 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002749 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002750 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002751 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09002752 withFiles(map[string][]byte{
2753 "libvndk27.so": nil,
2754 "libvndk27binder32.so": nil,
2755 }),
2756 withBinder32bit,
2757 withTargets(map[android.OsType][]android.Target{
2758 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09002759 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
2760 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09002761 },
2762 }),
2763 )
2764
Jooyung Hana57af4a2020-01-23 05:36:59 +00002765 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002766 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002767 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002768 })
2769}
2770
Jooyung Hane1633032019-08-01 17:41:43 +09002771func TestDependenciesInApexManifest(t *testing.T) {
2772 ctx, _ := testApex(t, `
2773 apex {
2774 name: "myapex_nodep",
2775 key: "myapex.key",
2776 native_shared_libs: ["lib_nodep"],
2777 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002778 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002779 }
2780
2781 apex {
2782 name: "myapex_dep",
2783 key: "myapex.key",
2784 native_shared_libs: ["lib_dep"],
2785 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002786 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002787 }
2788
2789 apex {
2790 name: "myapex_provider",
2791 key: "myapex.key",
2792 native_shared_libs: ["libfoo"],
2793 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002794 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002795 }
2796
2797 apex {
2798 name: "myapex_selfcontained",
2799 key: "myapex.key",
2800 native_shared_libs: ["lib_dep", "libfoo"],
2801 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002802 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002803 }
2804
2805 apex_key {
2806 name: "myapex.key",
2807 public_key: "testkey.avbpubkey",
2808 private_key: "testkey.pem",
2809 }
2810
2811 cc_library {
2812 name: "lib_nodep",
2813 srcs: ["mylib.cpp"],
2814 system_shared_libs: [],
2815 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002816 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09002817 }
2818
2819 cc_library {
2820 name: "lib_dep",
2821 srcs: ["mylib.cpp"],
2822 shared_libs: ["libfoo"],
2823 system_shared_libs: [],
2824 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002825 apex_available: [
2826 "myapex_dep",
2827 "myapex_provider",
2828 "myapex_selfcontained",
2829 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002830 }
2831
2832 cc_library {
2833 name: "libfoo",
2834 srcs: ["mytest.cpp"],
2835 stubs: {
2836 versions: ["1"],
2837 },
2838 system_shared_libs: [],
2839 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002840 apex_available: [
2841 "myapex_provider",
2842 "myapex_selfcontained",
2843 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002844 }
2845 `)
2846
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002847 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09002848 var provideNativeLibs, requireNativeLibs []string
2849
Sundong Ahnabb64432019-10-22 13:58:29 +09002850 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002851 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2852 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002853 ensureListEmpty(t, provideNativeLibs)
2854 ensureListEmpty(t, requireNativeLibs)
2855
Sundong Ahnabb64432019-10-22 13:58:29 +09002856 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002857 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2858 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002859 ensureListEmpty(t, provideNativeLibs)
2860 ensureListContains(t, requireNativeLibs, "libfoo.so")
2861
Sundong Ahnabb64432019-10-22 13:58:29 +09002862 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002863 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2864 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002865 ensureListContains(t, provideNativeLibs, "libfoo.so")
2866 ensureListEmpty(t, requireNativeLibs)
2867
Sundong Ahnabb64432019-10-22 13:58:29 +09002868 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002869 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2870 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002871 ensureListContains(t, provideNativeLibs, "libfoo.so")
2872 ensureListEmpty(t, requireNativeLibs)
2873}
2874
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002875func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09002876 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002877 apex {
2878 name: "myapex",
2879 key: "myapex.key",
2880 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09002881 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002882 }
2883
2884 apex_key {
2885 name: "myapex.key",
2886 public_key: "testkey.avbpubkey",
2887 private_key: "testkey.pem",
2888 }
Jiyong Parkdb334862020-02-05 17:19:28 +09002889
2890 cc_library {
2891 name: "mylib",
2892 srcs: ["mylib.cpp"],
2893 system_shared_libs: [],
2894 stl: "none",
2895 apex_available: [
2896 "//apex_available:platform",
2897 "myapex",
2898 ],
2899 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002900 `)
2901
Sundong Ahnabb64432019-10-22 13:58:29 +09002902 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002903 apexManifestRule := module.Rule("apexManifestRule")
2904 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
2905 apexRule := module.Rule("apexRule")
2906 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09002907
2908 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2909 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2910 name := apexBundle.BaseModuleName()
2911 prefix := "TARGET_"
2912 var builder strings.Builder
2913 data.Custom(&builder, name, prefix, "", data)
2914 androidMk := builder.String()
2915 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
2916 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002917}
2918
Alex Light0851b882019-02-07 13:20:53 -08002919func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002920 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002921 apex {
2922 name: "myapex",
2923 key: "myapex.key",
2924 native_shared_libs: ["mylib_common"],
2925 }
2926
2927 apex_key {
2928 name: "myapex.key",
2929 public_key: "testkey.avbpubkey",
2930 private_key: "testkey.pem",
2931 }
2932
2933 cc_library {
2934 name: "mylib_common",
2935 srcs: ["mylib.cpp"],
2936 system_shared_libs: [],
2937 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002938 apex_available: [
2939 "//apex_available:platform",
2940 "myapex",
2941 ],
Alex Light0851b882019-02-07 13:20:53 -08002942 }
2943 `)
2944
Sundong Ahnabb64432019-10-22 13:58:29 +09002945 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002946 apexRule := module.Rule("apexRule")
2947 copyCmds := apexRule.Args["copy_commands"]
2948
2949 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
2950 t.Log("Apex was a test apex!")
2951 t.Fail()
2952 }
2953 // Ensure that main rule creates an output
2954 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2955
2956 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002957 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08002958
2959 // Ensure that both direct and indirect deps are copied into apex
2960 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2961
Colin Cross7113d202019-11-20 16:39:12 -08002962 // Ensure that the platform variant ends with _shared
2963 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08002964
2965 if !android.InAnyApex("mylib_common") {
2966 t.Log("Found mylib_common not in any apex!")
2967 t.Fail()
2968 }
2969}
2970
2971func TestTestApex(t *testing.T) {
2972 if android.InAnyApex("mylib_common_test") {
2973 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!")
2974 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002975 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002976 apex_test {
2977 name: "myapex",
2978 key: "myapex.key",
2979 native_shared_libs: ["mylib_common_test"],
2980 }
2981
2982 apex_key {
2983 name: "myapex.key",
2984 public_key: "testkey.avbpubkey",
2985 private_key: "testkey.pem",
2986 }
2987
2988 cc_library {
2989 name: "mylib_common_test",
2990 srcs: ["mylib.cpp"],
2991 system_shared_libs: [],
2992 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002993 // TODO: remove //apex_available:platform
2994 apex_available: [
2995 "//apex_available:platform",
2996 "myapex",
2997 ],
Alex Light0851b882019-02-07 13:20:53 -08002998 }
2999 `)
3000
Sundong Ahnabb64432019-10-22 13:58:29 +09003001 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003002 apexRule := module.Rule("apexRule")
3003 copyCmds := apexRule.Args["copy_commands"]
3004
3005 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3006 t.Log("Apex was not a test apex!")
3007 t.Fail()
3008 }
3009 // Ensure that main rule creates an output
3010 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3011
3012 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003013 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003014
3015 // Ensure that both direct and indirect deps are copied into apex
3016 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3017
Colin Cross7113d202019-11-20 16:39:12 -08003018 // Ensure that the platform variant ends with _shared
3019 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003020}
3021
Alex Light9670d332019-01-29 18:07:33 -08003022func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003023 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003024 apex {
3025 name: "myapex",
3026 key: "myapex.key",
3027 multilib: {
3028 first: {
3029 native_shared_libs: ["mylib_common"],
3030 }
3031 },
3032 target: {
3033 android: {
3034 multilib: {
3035 first: {
3036 native_shared_libs: ["mylib"],
3037 }
3038 }
3039 },
3040 host: {
3041 multilib: {
3042 first: {
3043 native_shared_libs: ["mylib2"],
3044 }
3045 }
3046 }
3047 }
3048 }
3049
3050 apex_key {
3051 name: "myapex.key",
3052 public_key: "testkey.avbpubkey",
3053 private_key: "testkey.pem",
3054 }
3055
3056 cc_library {
3057 name: "mylib",
3058 srcs: ["mylib.cpp"],
3059 system_shared_libs: [],
3060 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003061 // TODO: remove //apex_available:platform
3062 apex_available: [
3063 "//apex_available:platform",
3064 "myapex",
3065 ],
Alex Light9670d332019-01-29 18:07:33 -08003066 }
3067
3068 cc_library {
3069 name: "mylib_common",
3070 srcs: ["mylib.cpp"],
3071 system_shared_libs: [],
3072 stl: "none",
3073 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003074 // TODO: remove //apex_available:platform
3075 apex_available: [
3076 "//apex_available:platform",
3077 "myapex",
3078 ],
Alex Light9670d332019-01-29 18:07:33 -08003079 }
3080
3081 cc_library {
3082 name: "mylib2",
3083 srcs: ["mylib.cpp"],
3084 system_shared_libs: [],
3085 stl: "none",
3086 compile_multilib: "first",
3087 }
3088 `)
3089
Sundong Ahnabb64432019-10-22 13:58:29 +09003090 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003091 copyCmds := apexRule.Args["copy_commands"]
3092
3093 // Ensure that main rule creates an output
3094 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3095
3096 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003097 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3098 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
3099 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08003100
3101 // Ensure that both direct and indirect deps are copied into apex
3102 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3103 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3104 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3105
Colin Cross7113d202019-11-20 16:39:12 -08003106 // Ensure that the platform variant ends with _shared
3107 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3108 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3109 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003110}
Jiyong Park04480cf2019-02-06 00:16:29 +09003111
3112func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003113 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003114 apex {
3115 name: "myapex",
3116 key: "myapex.key",
3117 binaries: ["myscript"],
3118 }
3119
3120 apex_key {
3121 name: "myapex.key",
3122 public_key: "testkey.avbpubkey",
3123 private_key: "testkey.pem",
3124 }
3125
3126 sh_binary {
3127 name: "myscript",
3128 src: "mylib.cpp",
3129 filename: "myscript.sh",
3130 sub_dir: "script",
3131 }
3132 `)
3133
Sundong Ahnabb64432019-10-22 13:58:29 +09003134 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003135 copyCmds := apexRule.Args["copy_commands"]
3136
3137 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3138}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003139
Jooyung Han91df2082019-11-20 01:49:42 +09003140func TestApexInVariousPartition(t *testing.T) {
3141 testcases := []struct {
3142 propName, parition, flattenedPartition string
3143 }{
3144 {"", "system", "system_ext"},
3145 {"product_specific: true", "product", "product"},
3146 {"soc_specific: true", "vendor", "vendor"},
3147 {"proprietary: true", "vendor", "vendor"},
3148 {"vendor: true", "vendor", "vendor"},
3149 {"system_ext_specific: true", "system_ext", "system_ext"},
3150 }
3151 for _, tc := range testcases {
3152 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3153 ctx, _ := testApex(t, `
3154 apex {
3155 name: "myapex",
3156 key: "myapex.key",
3157 `+tc.propName+`
3158 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003159
Jooyung Han91df2082019-11-20 01:49:42 +09003160 apex_key {
3161 name: "myapex.key",
3162 public_key: "testkey.avbpubkey",
3163 private_key: "testkey.pem",
3164 }
3165 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003166
Jooyung Han91df2082019-11-20 01:49:42 +09003167 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3168 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3169 actual := apex.installDir.String()
3170 if actual != expected {
3171 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3172 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003173
Jooyung Han91df2082019-11-20 01:49:42 +09003174 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3175 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3176 actual = flattened.installDir.String()
3177 if actual != expected {
3178 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3179 }
3180 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003181 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003182}
Jiyong Park67882562019-03-21 01:11:21 +09003183
Jooyung Han54aca7b2019-11-20 02:26:02 +09003184func TestFileContexts(t *testing.T) {
3185 ctx, _ := testApex(t, `
3186 apex {
3187 name: "myapex",
3188 key: "myapex.key",
3189 }
3190
3191 apex_key {
3192 name: "myapex.key",
3193 public_key: "testkey.avbpubkey",
3194 private_key: "testkey.pem",
3195 }
3196 `)
3197 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3198 apexRule := module.Rule("apexRule")
3199 actual := apexRule.Args["file_contexts"]
3200 expected := "system/sepolicy/apex/myapex-file_contexts"
3201 if actual != expected {
3202 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3203 }
3204
3205 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
3206 apex {
3207 name: "myapex",
3208 key: "myapex.key",
3209 file_contexts: "my_own_file_contexts",
3210 }
3211
3212 apex_key {
3213 name: "myapex.key",
3214 public_key: "testkey.avbpubkey",
3215 private_key: "testkey.pem",
3216 }
3217 `, withFiles(map[string][]byte{
3218 "my_own_file_contexts": nil,
3219 }))
3220
3221 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
3222 apex {
3223 name: "myapex",
3224 key: "myapex.key",
3225 product_specific: true,
3226 file_contexts: "product_specific_file_contexts",
3227 }
3228
3229 apex_key {
3230 name: "myapex.key",
3231 public_key: "testkey.avbpubkey",
3232 private_key: "testkey.pem",
3233 }
3234 `)
3235
3236 ctx, _ = testApex(t, `
3237 apex {
3238 name: "myapex",
3239 key: "myapex.key",
3240 product_specific: true,
3241 file_contexts: "product_specific_file_contexts",
3242 }
3243
3244 apex_key {
3245 name: "myapex.key",
3246 public_key: "testkey.avbpubkey",
3247 private_key: "testkey.pem",
3248 }
3249 `, withFiles(map[string][]byte{
3250 "product_specific_file_contexts": nil,
3251 }))
3252 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3253 apexRule = module.Rule("apexRule")
3254 actual = apexRule.Args["file_contexts"]
3255 expected = "product_specific_file_contexts"
3256 if actual != expected {
3257 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3258 }
3259
3260 ctx, _ = testApex(t, `
3261 apex {
3262 name: "myapex",
3263 key: "myapex.key",
3264 product_specific: true,
3265 file_contexts: ":my-file-contexts",
3266 }
3267
3268 apex_key {
3269 name: "myapex.key",
3270 public_key: "testkey.avbpubkey",
3271 private_key: "testkey.pem",
3272 }
3273
3274 filegroup {
3275 name: "my-file-contexts",
3276 srcs: ["product_specific_file_contexts"],
3277 }
3278 `, withFiles(map[string][]byte{
3279 "product_specific_file_contexts": nil,
3280 }))
3281 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3282 apexRule = module.Rule("apexRule")
3283 actual = apexRule.Args["file_contexts"]
3284 expected = "product_specific_file_contexts"
3285 if actual != expected {
3286 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3287 }
3288}
3289
Jiyong Park67882562019-03-21 01:11:21 +09003290func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003291 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003292 apex_key {
3293 name: "myapex.key",
3294 public_key: ":my.avbpubkey",
3295 private_key: ":my.pem",
3296 product_specific: true,
3297 }
3298
3299 filegroup {
3300 name: "my.avbpubkey",
3301 srcs: ["testkey2.avbpubkey"],
3302 }
3303
3304 filegroup {
3305 name: "my.pem",
3306 srcs: ["testkey2.pem"],
3307 }
3308 `)
3309
3310 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3311 expected_pubkey := "testkey2.avbpubkey"
3312 actual_pubkey := apex_key.public_key_file.String()
3313 if actual_pubkey != expected_pubkey {
3314 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3315 }
3316 expected_privkey := "testkey2.pem"
3317 actual_privkey := apex_key.private_key_file.String()
3318 if actual_privkey != expected_privkey {
3319 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3320 }
3321}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003322
3323func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003324 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003325 prebuilt_apex {
3326 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003327 arch: {
3328 arm64: {
3329 src: "myapex-arm64.apex",
3330 },
3331 arm: {
3332 src: "myapex-arm.apex",
3333 },
3334 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003335 }
3336 `)
3337
3338 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3339
Jiyong Parkc95714e2019-03-29 14:23:10 +09003340 expectedInput := "myapex-arm64.apex"
3341 if prebuilt.inputApex.String() != expectedInput {
3342 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3343 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003344}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003345
3346func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003347 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003348 prebuilt_apex {
3349 name: "myapex",
3350 src: "myapex-arm.apex",
3351 filename: "notmyapex.apex",
3352 }
3353 `)
3354
3355 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3356
3357 expected := "notmyapex.apex"
3358 if p.installFilename != expected {
3359 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3360 }
3361}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003362
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003363func TestPrebuiltOverrides(t *testing.T) {
3364 ctx, config := testApex(t, `
3365 prebuilt_apex {
3366 name: "myapex.prebuilt",
3367 src: "myapex-arm.apex",
3368 overrides: [
3369 "myapex",
3370 ],
3371 }
3372 `)
3373
3374 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3375
3376 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003377 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003378 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003379 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003380 }
3381}
3382
Roland Levillain630846d2019-06-26 12:48:34 +01003383func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003384 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003385 apex_test {
3386 name: "myapex",
3387 key: "myapex.key",
3388 tests: [
3389 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003390 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003391 ],
3392 }
3393
3394 apex_key {
3395 name: "myapex.key",
3396 public_key: "testkey.avbpubkey",
3397 private_key: "testkey.pem",
3398 }
3399
Liz Kammer1c14a212020-05-12 15:26:55 -07003400 filegroup {
3401 name: "fg",
3402 srcs: [
3403 "baz",
3404 "bar/baz"
3405 ],
3406 }
3407
Roland Levillain630846d2019-06-26 12:48:34 +01003408 cc_test {
3409 name: "mytest",
3410 gtest: false,
3411 srcs: ["mytest.cpp"],
3412 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003413 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003414 system_shared_libs: [],
3415 static_executable: true,
3416 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003417 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003418 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003419
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003420 cc_library {
3421 name: "mylib",
3422 srcs: ["mylib.cpp"],
3423 system_shared_libs: [],
3424 stl: "none",
3425 }
3426
Roland Levillain9b5fde92019-06-28 15:41:19 +01003427 cc_test {
3428 name: "mytests",
3429 gtest: false,
3430 srcs: [
3431 "mytest1.cpp",
3432 "mytest2.cpp",
3433 "mytest3.cpp",
3434 ],
3435 test_per_src: true,
3436 relative_install_path: "test",
3437 system_shared_libs: [],
3438 static_executable: true,
3439 stl: "none",
3440 }
Roland Levillain630846d2019-06-26 12:48:34 +01003441 `)
3442
Sundong Ahnabb64432019-10-22 13:58:29 +09003443 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003444 copyCmds := apexRule.Args["copy_commands"]
3445
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003446 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003447 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003448 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003449
Liz Kammer1c14a212020-05-12 15:26:55 -07003450 //Ensure that test data are copied into apex.
3451 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
3452 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
3453
Roland Levillain9b5fde92019-06-28 15:41:19 +01003454 // Ensure that test deps built with `test_per_src` are copied into apex.
3455 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3456 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3457 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003458
3459 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07003460 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3461 data := android.AndroidMkDataForTest(t, config, "", bundle)
3462 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01003463 prefix := "TARGET_"
3464 var builder strings.Builder
3465 data.Custom(&builder, name, prefix, "", data)
3466 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003467 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3468 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3469 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3470 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003471 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003472 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003473 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07003474
3475 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3476 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
3477 data.Custom(&builder, name, prefix, "", data)
3478 flatAndroidMk := builder.String()
3479 ensureContains(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003480}
3481
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003482func TestInstallExtraFlattenedApexes(t *testing.T) {
3483 ctx, config := testApex(t, `
3484 apex {
3485 name: "myapex",
3486 key: "myapex.key",
3487 }
3488 apex_key {
3489 name: "myapex.key",
3490 public_key: "testkey.avbpubkey",
3491 private_key: "testkey.pem",
3492 }
3493 `, func(fs map[string][]byte, config android.Config) {
3494 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3495 })
3496 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003497 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003498 mk := android.AndroidMkDataForTest(t, config, "", ab)
3499 var builder strings.Builder
3500 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3501 androidMk := builder.String()
3502 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3503}
3504
Jooyung Han5c998b92019-06-27 11:30:33 +09003505func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003506 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003507 apex {
3508 name: "myapex",
3509 key: "myapex.key",
3510 native_shared_libs: ["mylib"],
3511 uses: ["commonapex"],
3512 }
3513
3514 apex {
3515 name: "commonapex",
3516 key: "myapex.key",
3517 native_shared_libs: ["libcommon"],
3518 provide_cpp_shared_libs: true,
3519 }
3520
3521 apex_key {
3522 name: "myapex.key",
3523 public_key: "testkey.avbpubkey",
3524 private_key: "testkey.pem",
3525 }
3526
3527 cc_library {
3528 name: "mylib",
3529 srcs: ["mylib.cpp"],
3530 shared_libs: ["libcommon"],
3531 system_shared_libs: [],
3532 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003533 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003534 }
3535
3536 cc_library {
3537 name: "libcommon",
3538 srcs: ["mylib_common.cpp"],
3539 system_shared_libs: [],
3540 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003541 // TODO: remove //apex_available:platform
3542 apex_available: [
3543 "//apex_available:platform",
3544 "commonapex",
3545 "myapex",
3546 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003547 }
3548 `)
3549
Sundong Ahnabb64432019-10-22 13:58:29 +09003550 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003551 apexRule1 := module1.Rule("apexRule")
3552 copyCmds1 := apexRule1.Args["copy_commands"]
3553
Sundong Ahnabb64432019-10-22 13:58:29 +09003554 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003555 apexRule2 := module2.Rule("apexRule")
3556 copyCmds2 := apexRule2.Args["copy_commands"]
3557
Colin Cross7113d202019-11-20 16:39:12 -08003558 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3559 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09003560 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
3561 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
3562 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
3563}
3564
3565func TestApexUsesFailsIfNotProvided(t *testing.T) {
3566 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
3567 apex {
3568 name: "myapex",
3569 key: "myapex.key",
3570 uses: ["commonapex"],
3571 }
3572
3573 apex {
3574 name: "commonapex",
3575 key: "myapex.key",
3576 }
3577
3578 apex_key {
3579 name: "myapex.key",
3580 public_key: "testkey.avbpubkey",
3581 private_key: "testkey.pem",
3582 }
3583 `)
3584 testApexError(t, `uses: "commonapex" is not a provider`, `
3585 apex {
3586 name: "myapex",
3587 key: "myapex.key",
3588 uses: ["commonapex"],
3589 }
3590
3591 cc_library {
3592 name: "commonapex",
3593 system_shared_libs: [],
3594 stl: "none",
3595 }
3596
3597 apex_key {
3598 name: "myapex.key",
3599 public_key: "testkey.avbpubkey",
3600 private_key: "testkey.pem",
3601 }
3602 `)
3603}
3604
3605func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
3606 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
3607 apex {
3608 name: "myapex",
3609 key: "myapex.key",
3610 use_vendor: true,
3611 uses: ["commonapex"],
3612 }
3613
3614 apex {
3615 name: "commonapex",
3616 key: "myapex.key",
3617 provide_cpp_shared_libs: true,
3618 }
3619
3620 apex_key {
3621 name: "myapex.key",
3622 public_key: "testkey.avbpubkey",
3623 private_key: "testkey.pem",
3624 }
Jooyung Handc782442019-11-01 03:14:38 +09003625 `, func(fs map[string][]byte, config android.Config) {
3626 setUseVendorWhitelistForTest(config, []string{"myapex"})
3627 })
Jooyung Han5c998b92019-06-27 11:30:33 +09003628}
3629
Jooyung Hand48f3c32019-08-23 11:18:57 +09003630func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
3631 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
3632 apex {
3633 name: "myapex",
3634 key: "myapex.key",
3635 native_shared_libs: ["libfoo"],
3636 }
3637
3638 apex_key {
3639 name: "myapex.key",
3640 public_key: "testkey.avbpubkey",
3641 private_key: "testkey.pem",
3642 }
3643
3644 cc_library {
3645 name: "libfoo",
3646 stl: "none",
3647 system_shared_libs: [],
3648 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003649 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003650 }
3651 `)
3652 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
3653 apex {
3654 name: "myapex",
3655 key: "myapex.key",
3656 java_libs: ["myjar"],
3657 }
3658
3659 apex_key {
3660 name: "myapex.key",
3661 public_key: "testkey.avbpubkey",
3662 private_key: "testkey.pem",
3663 }
3664
3665 java_library {
3666 name: "myjar",
3667 srcs: ["foo/bar/MyClass.java"],
3668 sdk_version: "none",
3669 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09003670 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003671 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003672 }
3673 `)
3674}
3675
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003676func TestApexWithApps(t *testing.T) {
3677 ctx, _ := testApex(t, `
3678 apex {
3679 name: "myapex",
3680 key: "myapex.key",
3681 apps: [
3682 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09003683 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003684 ],
3685 }
3686
3687 apex_key {
3688 name: "myapex.key",
3689 public_key: "testkey.avbpubkey",
3690 private_key: "testkey.pem",
3691 }
3692
3693 android_app {
3694 name: "AppFoo",
3695 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003696 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003697 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09003698 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08003699 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003700 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003701 }
Jiyong Parkf7487312019-10-17 12:54:30 +09003702
3703 android_app {
3704 name: "AppFooPriv",
3705 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003706 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09003707 system_modules: "none",
3708 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08003709 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003710 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09003711 }
Jiyong Park8be103b2019-11-08 15:53:48 +09003712
3713 cc_library_shared {
3714 name: "libjni",
3715 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003716 shared_libs: ["libfoo"],
3717 stl: "none",
3718 system_shared_libs: [],
3719 apex_available: [ "myapex" ],
3720 sdk_version: "current",
3721 }
3722
3723 cc_library_shared {
3724 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09003725 stl: "none",
3726 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09003727 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08003728 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09003729 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003730 `)
3731
Sundong Ahnabb64432019-10-22 13:58:29 +09003732 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003733 apexRule := module.Rule("apexRule")
3734 copyCmds := apexRule.Args["copy_commands"]
3735
3736 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09003737 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003738
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003739 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
3740 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09003741 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003742 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003743 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003744 // JNI libraries including transitive deps are
3745 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00003746 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003747 // ... embedded inside APK (jnilibs.zip)
3748 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
3749 // ... and not directly inside the APEX
3750 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
3751 }
Dario Frenicde2a032019-10-27 00:29:22 +01003752}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003753
Dario Frenicde2a032019-10-27 00:29:22 +01003754func TestApexWithAppImports(t *testing.T) {
3755 ctx, _ := testApex(t, `
3756 apex {
3757 name: "myapex",
3758 key: "myapex.key",
3759 apps: [
3760 "AppFooPrebuilt",
3761 "AppFooPrivPrebuilt",
3762 ],
3763 }
3764
3765 apex_key {
3766 name: "myapex.key",
3767 public_key: "testkey.avbpubkey",
3768 private_key: "testkey.pem",
3769 }
3770
3771 android_app_import {
3772 name: "AppFooPrebuilt",
3773 apk: "PrebuiltAppFoo.apk",
3774 presigned: true,
3775 dex_preopt: {
3776 enabled: false,
3777 },
Jiyong Park592a6a42020-04-21 22:34:28 +09003778 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003779 }
3780
3781 android_app_import {
3782 name: "AppFooPrivPrebuilt",
3783 apk: "PrebuiltAppFooPriv.apk",
3784 privileged: true,
3785 presigned: true,
3786 dex_preopt: {
3787 enabled: false,
3788 },
Jooyung Han39ee1192020-03-23 20:21:11 +09003789 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09003790 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003791 }
3792 `)
3793
Sundong Ahnabb64432019-10-22 13:58:29 +09003794 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01003795 apexRule := module.Rule("apexRule")
3796 copyCmds := apexRule.Args["copy_commands"]
3797
3798 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09003799 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
3800}
3801
3802func TestApexWithAppImportsPrefer(t *testing.T) {
3803 ctx, _ := testApex(t, `
3804 apex {
3805 name: "myapex",
3806 key: "myapex.key",
3807 apps: [
3808 "AppFoo",
3809 ],
3810 }
3811
3812 apex_key {
3813 name: "myapex.key",
3814 public_key: "testkey.avbpubkey",
3815 private_key: "testkey.pem",
3816 }
3817
3818 android_app {
3819 name: "AppFoo",
3820 srcs: ["foo/bar/MyClass.java"],
3821 sdk_version: "none",
3822 system_modules: "none",
3823 apex_available: [ "myapex" ],
3824 }
3825
3826 android_app_import {
3827 name: "AppFoo",
3828 apk: "AppFooPrebuilt.apk",
3829 filename: "AppFooPrebuilt.apk",
3830 presigned: true,
3831 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09003832 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09003833 }
3834 `, withFiles(map[string][]byte{
3835 "AppFooPrebuilt.apk": nil,
3836 }))
3837
3838 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3839 "app/AppFoo/AppFooPrebuilt.apk",
3840 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003841}
3842
Dario Freni6f3937c2019-12-20 22:58:03 +00003843func TestApexWithTestHelperApp(t *testing.T) {
3844 ctx, _ := testApex(t, `
3845 apex {
3846 name: "myapex",
3847 key: "myapex.key",
3848 apps: [
3849 "TesterHelpAppFoo",
3850 ],
3851 }
3852
3853 apex_key {
3854 name: "myapex.key",
3855 public_key: "testkey.avbpubkey",
3856 private_key: "testkey.pem",
3857 }
3858
3859 android_test_helper_app {
3860 name: "TesterHelpAppFoo",
3861 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003862 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00003863 }
3864
3865 `)
3866
3867 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3868 apexRule := module.Rule("apexRule")
3869 copyCmds := apexRule.Args["copy_commands"]
3870
3871 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
3872}
3873
Jooyung Han18020ea2019-11-13 10:50:48 +09003874func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
3875 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09003876 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09003877 apex {
3878 name: "myapex",
3879 key: "myapex.key",
3880 native_shared_libs: ["libfoo"],
3881 }
3882
3883 apex_key {
3884 name: "myapex.key",
3885 public_key: "testkey.avbpubkey",
3886 private_key: "testkey.pem",
3887 }
3888
3889 apex {
3890 name: "otherapex",
3891 key: "myapex.key",
3892 native_shared_libs: ["libfoo"],
3893 }
3894
3895 cc_defaults {
3896 name: "libfoo-defaults",
3897 apex_available: ["otherapex"],
3898 }
3899
3900 cc_library {
3901 name: "libfoo",
3902 defaults: ["libfoo-defaults"],
3903 stl: "none",
3904 system_shared_libs: [],
3905 }`)
3906}
3907
Paul Duffine52e66f2020-03-30 17:54:29 +01003908func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003909 // libfoo is not available to myapex, but only to otherapex
3910 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
3911 apex {
3912 name: "myapex",
3913 key: "myapex.key",
3914 native_shared_libs: ["libfoo"],
3915 }
3916
3917 apex_key {
3918 name: "myapex.key",
3919 public_key: "testkey.avbpubkey",
3920 private_key: "testkey.pem",
3921 }
3922
3923 apex {
3924 name: "otherapex",
3925 key: "otherapex.key",
3926 native_shared_libs: ["libfoo"],
3927 }
3928
3929 apex_key {
3930 name: "otherapex.key",
3931 public_key: "testkey.avbpubkey",
3932 private_key: "testkey.pem",
3933 }
3934
3935 cc_library {
3936 name: "libfoo",
3937 stl: "none",
3938 system_shared_libs: [],
3939 apex_available: ["otherapex"],
3940 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003941}
Jiyong Park127b40b2019-09-30 16:04:35 +09003942
Paul Duffine52e66f2020-03-30 17:54:29 +01003943func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09003944 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01003945 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01003946.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003947.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003948.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003949.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003950.*via tag cc\.DependencyTag.*"shared".*
3951.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003952 apex {
3953 name: "myapex",
3954 key: "myapex.key",
3955 native_shared_libs: ["libfoo"],
3956 }
3957
3958 apex_key {
3959 name: "myapex.key",
3960 public_key: "testkey.avbpubkey",
3961 private_key: "testkey.pem",
3962 }
3963
Jiyong Park127b40b2019-09-30 16:04:35 +09003964 cc_library {
3965 name: "libfoo",
3966 stl: "none",
3967 shared_libs: ["libbar"],
3968 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09003969 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003970 }
3971
3972 cc_library {
3973 name: "libbar",
3974 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09003975 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003976 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09003977 apex_available: ["myapex"],
3978 }
3979
3980 cc_library {
3981 name: "libbaz",
3982 stl: "none",
3983 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09003984 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003985}
Jiyong Park127b40b2019-09-30 16:04:35 +09003986
Paul Duffine52e66f2020-03-30 17:54:29 +01003987func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003988 testApexError(t, "\"otherapex\" is not a valid module name", `
3989 apex {
3990 name: "myapex",
3991 key: "myapex.key",
3992 native_shared_libs: ["libfoo"],
3993 }
3994
3995 apex_key {
3996 name: "myapex.key",
3997 public_key: "testkey.avbpubkey",
3998 private_key: "testkey.pem",
3999 }
4000
4001 cc_library {
4002 name: "libfoo",
4003 stl: "none",
4004 system_shared_libs: [],
4005 apex_available: ["otherapex"],
4006 }`)
4007
Paul Duffine52e66f2020-03-30 17:54:29 +01004008 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004009 apex {
4010 name: "myapex",
4011 key: "myapex.key",
4012 native_shared_libs: ["libfoo", "libbar"],
4013 }
4014
4015 apex_key {
4016 name: "myapex.key",
4017 public_key: "testkey.avbpubkey",
4018 private_key: "testkey.pem",
4019 }
4020
4021 cc_library {
4022 name: "libfoo",
4023 stl: "none",
4024 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004025 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004026 apex_available: ["myapex"],
4027 }
4028
4029 cc_library {
4030 name: "libbar",
4031 stl: "none",
4032 system_shared_libs: [],
4033 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004034 }
4035
4036 cc_library {
4037 name: "libbaz",
4038 stl: "none",
4039 system_shared_libs: [],
4040 stubs: {
4041 versions: ["10", "20", "30"],
4042 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004043 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004044}
Jiyong Park127b40b2019-09-30 16:04:35 +09004045
Jiyong Park89e850a2020-04-07 16:37:39 +09004046func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004047 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004048 apex {
4049 name: "myapex",
4050 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004051 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004052 }
4053
4054 apex_key {
4055 name: "myapex.key",
4056 public_key: "testkey.avbpubkey",
4057 private_key: "testkey.pem",
4058 }
4059
4060 cc_library {
4061 name: "libfoo",
4062 stl: "none",
4063 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004064 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004065 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004066 }
4067
4068 cc_library {
4069 name: "libfoo2",
4070 stl: "none",
4071 system_shared_libs: [],
4072 shared_libs: ["libbaz"],
4073 apex_available: ["//apex_available:platform"],
4074 }
4075
4076 cc_library {
4077 name: "libbar",
4078 stl: "none",
4079 system_shared_libs: [],
4080 apex_available: ["myapex"],
4081 }
4082
4083 cc_library {
4084 name: "libbaz",
4085 stl: "none",
4086 system_shared_libs: [],
4087 apex_available: ["myapex"],
4088 stubs: {
4089 versions: ["1"],
4090 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004091 }`)
4092
Jiyong Park89e850a2020-04-07 16:37:39 +09004093 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4094 // because it depends on libbar which isn't available to platform
4095 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4096 if libfoo.NotAvailableForPlatform() != true {
4097 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4098 }
4099
4100 // libfoo2 however can be available to platform because it depends on libbaz which provides
4101 // stubs
4102 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4103 if libfoo2.NotAvailableForPlatform() == true {
4104 t.Errorf("%q should be available to platform", libfoo2.String())
4105 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004106}
Jiyong Parka90ca002019-10-07 15:47:24 +09004107
Paul Duffine52e66f2020-03-30 17:54:29 +01004108func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004109 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004110 apex {
4111 name: "myapex",
4112 key: "myapex.key",
4113 native_shared_libs: ["libfoo"],
4114 }
4115
4116 apex_key {
4117 name: "myapex.key",
4118 public_key: "testkey.avbpubkey",
4119 private_key: "testkey.pem",
4120 }
4121
4122 cc_library {
4123 name: "libfoo",
4124 stl: "none",
4125 system_shared_libs: [],
4126 apex_available: ["myapex"],
4127 static: {
4128 apex_available: ["//apex_available:platform"],
4129 },
4130 }`)
4131
Jiyong Park89e850a2020-04-07 16:37:39 +09004132 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4133 if libfooShared.NotAvailableForPlatform() != true {
4134 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4135 }
4136 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4137 if libfooStatic.NotAvailableForPlatform() != false {
4138 t.Errorf("%q should be available to platform", libfooStatic.String())
4139 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004140}
4141
Jiyong Park5d790c32019-11-15 18:40:32 +09004142func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004143 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004144 apex {
4145 name: "myapex",
4146 key: "myapex.key",
4147 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004148 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004149 }
4150
4151 override_apex {
4152 name: "override_myapex",
4153 base: "myapex",
4154 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004155 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004156 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004157 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004158 }
4159
4160 apex_key {
4161 name: "myapex.key",
4162 public_key: "testkey.avbpubkey",
4163 private_key: "testkey.pem",
4164 }
4165
4166 android_app {
4167 name: "app",
4168 srcs: ["foo/bar/MyClass.java"],
4169 package_name: "foo",
4170 sdk_version: "none",
4171 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004172 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004173 }
4174
4175 override_android_app {
4176 name: "override_app",
4177 base: "app",
4178 package_name: "bar",
4179 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004180 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004181
Jiyong Park317645e2019-12-05 13:20:58 +09004182 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4183 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4184 if originalVariant.GetOverriddenBy() != "" {
4185 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4186 }
4187 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4188 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4189 }
4190
Jiyong Park5d790c32019-11-15 18:40:32 +09004191 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4192 apexRule := module.Rule("apexRule")
4193 copyCmds := apexRule.Args["copy_commands"]
4194
4195 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004196 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004197
4198 apexBundle := module.Module().(*apexBundle)
4199 name := apexBundle.Name()
4200 if name != "override_myapex" {
4201 t.Errorf("name should be \"override_myapex\", but was %q", name)
4202 }
4203
Baligh Uddin004d7172020-02-19 21:29:28 -08004204 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4205 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4206 }
4207
Jiyong Park20bacab2020-03-03 11:45:41 +09004208 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004209 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004210
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004211 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4212 var builder strings.Builder
4213 data.Custom(&builder, name, "TARGET_", "", data)
4214 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004215 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004216 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4217 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004218 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004219 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004220 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004221 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4222 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004223}
4224
Jooyung Han214bf372019-11-12 13:03:50 +09004225func TestLegacyAndroid10Support(t *testing.T) {
4226 ctx, _ := testApex(t, `
4227 apex {
4228 name: "myapex",
4229 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004230 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004231 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004232 }
4233
4234 apex_key {
4235 name: "myapex.key",
4236 public_key: "testkey.avbpubkey",
4237 private_key: "testkey.pem",
4238 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004239
4240 cc_library {
4241 name: "mylib",
4242 srcs: ["mylib.cpp"],
4243 stl: "libc++",
4244 system_shared_libs: [],
4245 apex_available: [ "myapex" ],
4246 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004247 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004248
4249 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4250 args := module.Rule("apexRule").Args
4251 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004252 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004253
4254 // The copies of the libraries in the apex should have one more dependency than
4255 // the ones outside the apex, namely the unwinder. Ideally we should check
4256 // the dependency names directly here but for some reason the names are blank in
4257 // this test.
4258 for _, lib := range []string{"libc++", "mylib"} {
4259 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4260 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4261 if len(apexImplicits) != len(nonApexImplicits)+1 {
4262 t.Errorf("%q missing unwinder dep", lib)
4263 }
4264 }
Jooyung Han214bf372019-11-12 13:03:50 +09004265}
4266
Paul Duffin9b879592020-05-26 13:21:35 +01004267var filesForSdkLibrary = map[string][]byte{
4268 "api/current.txt": nil,
4269 "api/removed.txt": nil,
4270 "api/system-current.txt": nil,
4271 "api/system-removed.txt": nil,
4272 "api/test-current.txt": nil,
4273 "api/test-removed.txt": nil,
4274}
4275
Jooyung Han58f26ab2019-12-18 15:34:32 +09004276func TestJavaSDKLibrary(t *testing.T) {
4277 ctx, _ := testApex(t, `
4278 apex {
4279 name: "myapex",
4280 key: "myapex.key",
4281 java_libs: ["foo"],
4282 }
4283
4284 apex_key {
4285 name: "myapex.key",
4286 public_key: "testkey.avbpubkey",
4287 private_key: "testkey.pem",
4288 }
4289
4290 java_sdk_library {
4291 name: "foo",
4292 srcs: ["a.java"],
4293 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004294 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004295 }
Paul Duffin9b879592020-05-26 13:21:35 +01004296 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004297
4298 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004299 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004300 "javalib/foo.jar",
4301 "etc/permissions/foo.xml",
4302 })
4303 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004304 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4305 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004306}
4307
Paul Duffin9b879592020-05-26 13:21:35 +01004308func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4309 ctx, _ := testApex(t, `
4310 apex {
4311 name: "myapex",
4312 key: "myapex.key",
4313 java_libs: ["foo", "bar"],
4314 }
4315
4316 apex_key {
4317 name: "myapex.key",
4318 public_key: "testkey.avbpubkey",
4319 private_key: "testkey.pem",
4320 }
4321
4322 java_sdk_library {
4323 name: "foo",
4324 srcs: ["a.java"],
4325 api_packages: ["foo"],
4326 apex_available: ["myapex"],
4327 sdk_version: "none",
4328 system_modules: "none",
4329 }
4330
4331 java_library {
4332 name: "bar",
4333 srcs: ["a.java"],
4334 libs: ["foo"],
4335 apex_available: ["myapex"],
4336 sdk_version: "none",
4337 system_modules: "none",
4338 }
4339 `, withFiles(filesForSdkLibrary))
4340
4341 // java_sdk_library installs both impl jar and permission XML
4342 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4343 "javalib/bar.jar",
4344 "javalib/foo.jar",
4345 "etc/permissions/foo.xml",
4346 })
4347
4348 // The bar library should depend on the implementation jar.
4349 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4350 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4351 t.Errorf("expected %q, found %#q", expected, actual)
4352 }
4353}
4354
4355func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4356 ctx, _ := testApex(t, `
4357 apex {
4358 name: "myapex",
4359 key: "myapex.key",
4360 java_libs: ["foo"],
4361 }
4362
4363 apex_key {
4364 name: "myapex.key",
4365 public_key: "testkey.avbpubkey",
4366 private_key: "testkey.pem",
4367 }
4368
4369 java_sdk_library {
4370 name: "foo",
4371 srcs: ["a.java"],
4372 api_packages: ["foo"],
4373 apex_available: ["myapex"],
4374 sdk_version: "none",
4375 system_modules: "none",
4376 }
4377
4378 java_library {
4379 name: "bar",
4380 srcs: ["a.java"],
4381 libs: ["foo"],
4382 sdk_version: "none",
4383 system_modules: "none",
4384 }
4385 `, withFiles(filesForSdkLibrary))
4386
4387 // java_sdk_library installs both impl jar and permission XML
4388 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4389 "javalib/foo.jar",
4390 "etc/permissions/foo.xml",
4391 })
4392
4393 // The bar library should depend on the stubs jar.
4394 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4395 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4396 t.Errorf("expected %q, found %#q", expected, actual)
4397 }
4398}
4399
atrost6e126252020-01-27 17:01:16 +00004400func TestCompatConfig(t *testing.T) {
4401 ctx, _ := testApex(t, `
4402 apex {
4403 name: "myapex",
4404 key: "myapex.key",
4405 prebuilts: ["myjar-platform-compat-config"],
4406 java_libs: ["myjar"],
4407 }
4408
4409 apex_key {
4410 name: "myapex.key",
4411 public_key: "testkey.avbpubkey",
4412 private_key: "testkey.pem",
4413 }
4414
4415 platform_compat_config {
4416 name: "myjar-platform-compat-config",
4417 src: ":myjar",
4418 }
4419
4420 java_library {
4421 name: "myjar",
4422 srcs: ["foo/bar/MyClass.java"],
4423 sdk_version: "none",
4424 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004425 apex_available: [ "myapex" ],
4426 }
4427 `)
4428 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4429 "etc/compatconfig/myjar-platform-compat-config.xml",
4430 "javalib/myjar.jar",
4431 })
4432}
4433
Jiyong Park479321d2019-12-16 11:47:12 +09004434func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4435 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4436 apex {
4437 name: "myapex",
4438 key: "myapex.key",
4439 java_libs: ["myjar"],
4440 }
4441
4442 apex_key {
4443 name: "myapex.key",
4444 public_key: "testkey.avbpubkey",
4445 private_key: "testkey.pem",
4446 }
4447
4448 java_library {
4449 name: "myjar",
4450 srcs: ["foo/bar/MyClass.java"],
4451 sdk_version: "none",
4452 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09004453 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004454 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09004455 }
4456 `)
4457}
4458
Jiyong Park7afd1072019-12-30 16:56:33 +09004459func TestCarryRequiredModuleNames(t *testing.T) {
4460 ctx, config := testApex(t, `
4461 apex {
4462 name: "myapex",
4463 key: "myapex.key",
4464 native_shared_libs: ["mylib"],
4465 }
4466
4467 apex_key {
4468 name: "myapex.key",
4469 public_key: "testkey.avbpubkey",
4470 private_key: "testkey.pem",
4471 }
4472
4473 cc_library {
4474 name: "mylib",
4475 srcs: ["mylib.cpp"],
4476 system_shared_libs: [],
4477 stl: "none",
4478 required: ["a", "b"],
4479 host_required: ["c", "d"],
4480 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004481 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09004482 }
4483 `)
4484
4485 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4486 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4487 name := apexBundle.BaseModuleName()
4488 prefix := "TARGET_"
4489 var builder strings.Builder
4490 data.Custom(&builder, name, prefix, "", data)
4491 androidMk := builder.String()
4492 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
4493 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
4494 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
4495}
4496
Jiyong Park7cd10e32020-01-14 09:22:18 +09004497func TestSymlinksFromApexToSystem(t *testing.T) {
4498 bp := `
4499 apex {
4500 name: "myapex",
4501 key: "myapex.key",
4502 native_shared_libs: ["mylib"],
4503 java_libs: ["myjar"],
4504 }
4505
Jiyong Park9d677202020-02-19 16:29:35 +09004506 apex {
4507 name: "myapex.updatable",
4508 key: "myapex.key",
4509 native_shared_libs: ["mylib"],
4510 java_libs: ["myjar"],
4511 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004512 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09004513 }
4514
Jiyong Park7cd10e32020-01-14 09:22:18 +09004515 apex_key {
4516 name: "myapex.key",
4517 public_key: "testkey.avbpubkey",
4518 private_key: "testkey.pem",
4519 }
4520
4521 cc_library {
4522 name: "mylib",
4523 srcs: ["mylib.cpp"],
4524 shared_libs: ["myotherlib"],
4525 system_shared_libs: [],
4526 stl: "none",
4527 apex_available: [
4528 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004529 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004530 "//apex_available:platform",
4531 ],
4532 }
4533
4534 cc_library {
4535 name: "myotherlib",
4536 srcs: ["mylib.cpp"],
4537 system_shared_libs: [],
4538 stl: "none",
4539 apex_available: [
4540 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004541 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004542 "//apex_available:platform",
4543 ],
4544 }
4545
4546 java_library {
4547 name: "myjar",
4548 srcs: ["foo/bar/MyClass.java"],
4549 sdk_version: "none",
4550 system_modules: "none",
4551 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09004552 apex_available: [
4553 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004554 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004555 "//apex_available:platform",
4556 ],
4557 }
4558
4559 java_library {
4560 name: "myotherjar",
4561 srcs: ["foo/bar/MyClass.java"],
4562 sdk_version: "none",
4563 system_modules: "none",
4564 apex_available: [
4565 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004566 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004567 "//apex_available:platform",
4568 ],
4569 }
4570 `
4571
4572 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
4573 for _, f := range files {
4574 if f.path == file {
4575 if f.isLink {
4576 t.Errorf("%q is not a real file", file)
4577 }
4578 return
4579 }
4580 }
4581 t.Errorf("%q is not found", file)
4582 }
4583
4584 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
4585 for _, f := range files {
4586 if f.path == file {
4587 if !f.isLink {
4588 t.Errorf("%q is not a symlink", file)
4589 }
4590 return
4591 }
4592 }
4593 t.Errorf("%q is not found", file)
4594 }
4595
Jiyong Park9d677202020-02-19 16:29:35 +09004596 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
4597 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09004598 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004599 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004600 ensureRealfileExists(t, files, "javalib/myjar.jar")
4601 ensureRealfileExists(t, files, "lib64/mylib.so")
4602 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4603
Jiyong Park9d677202020-02-19 16:29:35 +09004604 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4605 ensureRealfileExists(t, files, "javalib/myjar.jar")
4606 ensureRealfileExists(t, files, "lib64/mylib.so")
4607 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4608
4609 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09004610 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004611 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004612 ensureRealfileExists(t, files, "javalib/myjar.jar")
4613 ensureRealfileExists(t, files, "lib64/mylib.so")
4614 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09004615
4616 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4617 ensureRealfileExists(t, files, "javalib/myjar.jar")
4618 ensureRealfileExists(t, files, "lib64/mylib.so")
4619 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09004620}
4621
Jooyung Han643adc42020-02-27 13:50:06 +09004622func TestApexWithJniLibs(t *testing.T) {
4623 ctx, _ := testApex(t, `
4624 apex {
4625 name: "myapex",
4626 key: "myapex.key",
4627 jni_libs: ["mylib"],
4628 }
4629
4630 apex_key {
4631 name: "myapex.key",
4632 public_key: "testkey.avbpubkey",
4633 private_key: "testkey.pem",
4634 }
4635
4636 cc_library {
4637 name: "mylib",
4638 srcs: ["mylib.cpp"],
4639 shared_libs: ["mylib2"],
4640 system_shared_libs: [],
4641 stl: "none",
4642 apex_available: [ "myapex" ],
4643 }
4644
4645 cc_library {
4646 name: "mylib2",
4647 srcs: ["mylib.cpp"],
4648 system_shared_libs: [],
4649 stl: "none",
4650 apex_available: [ "myapex" ],
4651 }
4652 `)
4653
4654 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4655 // Notice mylib2.so (transitive dep) is not added as a jni_lib
4656 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
4657 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4658 "lib64/mylib.so",
4659 "lib64/mylib2.so",
4660 })
4661}
4662
Jooyung Han49f67012020-04-17 13:43:10 +09004663func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
4664 ctx, _ := testApex(t, `
4665 apex {
4666 name: "myapex",
4667 key: "myapex.key",
4668 }
4669 apex_key {
4670 name: "myapex.key",
4671 public_key: "testkey.avbpubkey",
4672 private_key: "testkey.pem",
4673 }
4674 `, func(fs map[string][]byte, config android.Config) {
4675 delete(config.Targets, android.Android)
4676 config.AndroidCommonTarget = android.Target{}
4677 })
4678
4679 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
4680 t.Errorf("Expected variants: %v, but got: %v", expected, got)
4681 }
4682}
4683
Jooyung Han643adc42020-02-27 13:50:06 +09004684func TestApexWithJniLibs_Errors(t *testing.T) {
4685 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
4686 apex {
4687 name: "myapex",
4688 key: "myapex.key",
4689 jni_libs: ["xxx"],
4690 }
4691
4692 apex_key {
4693 name: "myapex.key",
4694 public_key: "testkey.avbpubkey",
4695 private_key: "testkey.pem",
4696 }
4697
4698 prebuilt_etc {
4699 name: "xxx",
4700 src: "xxx",
4701 }
4702 `, withFiles(map[string][]byte{
4703 "xxx": nil,
4704 }))
4705}
4706
Jiyong Parkbd159612020-02-28 15:22:21 +09004707func TestAppBundle(t *testing.T) {
4708 ctx, _ := testApex(t, `
4709 apex {
4710 name: "myapex",
4711 key: "myapex.key",
4712 apps: ["AppFoo"],
4713 }
4714
4715 apex_key {
4716 name: "myapex.key",
4717 public_key: "testkey.avbpubkey",
4718 private_key: "testkey.pem",
4719 }
4720
4721 android_app {
4722 name: "AppFoo",
4723 srcs: ["foo/bar/MyClass.java"],
4724 sdk_version: "none",
4725 system_modules: "none",
4726 apex_available: [ "myapex" ],
4727 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004728 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09004729
4730 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
4731 content := bundleConfigRule.Args["content"]
4732
4733 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004734 ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo/AppFoo.apk"}]}`)
Jiyong Parkbd159612020-02-28 15:22:21 +09004735}
4736
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004737func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004738 t.Helper()
4739
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004740 bp := `
4741 java_library {
4742 name: "some-updatable-apex-lib",
4743 srcs: ["a.java"],
4744 sdk_version: "current",
4745 apex_available: [
4746 "some-updatable-apex",
4747 ],
4748 }
4749
4750 java_library {
4751 name: "some-non-updatable-apex-lib",
4752 srcs: ["a.java"],
4753 apex_available: [
4754 "some-non-updatable-apex",
4755 ],
4756 }
4757
4758 java_library {
4759 name: "some-platform-lib",
4760 srcs: ["a.java"],
4761 sdk_version: "current",
4762 installable: true,
4763 }
4764
4765 java_library {
4766 name: "some-art-lib",
4767 srcs: ["a.java"],
4768 sdk_version: "current",
4769 apex_available: [
4770 "com.android.art.something",
4771 ],
4772 hostdex: true,
4773 }
4774
4775 apex {
4776 name: "some-updatable-apex",
4777 key: "some-updatable-apex.key",
4778 java_libs: ["some-updatable-apex-lib"],
4779 updatable: true,
4780 min_sdk_version: "current",
4781 }
4782
4783 apex {
4784 name: "some-non-updatable-apex",
4785 key: "some-non-updatable-apex.key",
4786 java_libs: ["some-non-updatable-apex-lib"],
4787 }
4788
4789 apex_key {
4790 name: "some-updatable-apex.key",
4791 }
4792
4793 apex_key {
4794 name: "some-non-updatable-apex.key",
4795 }
4796
4797 apex {
4798 name: "com.android.art.something",
4799 key: "com.android.art.something.key",
4800 java_libs: ["some-art-lib"],
4801 updatable: true,
4802 min_sdk_version: "current",
4803 }
4804
4805 apex_key {
4806 name: "com.android.art.something.key",
4807 }
4808
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004809 filegroup {
4810 name: "some-updatable-apex-file_contexts",
4811 srcs: [
4812 "system/sepolicy/apex/some-updatable-apex-file_contexts",
4813 ],
4814 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004815
4816 filegroup {
4817 name: "some-non-updatable-apex-file_contexts",
4818 srcs: [
4819 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
4820 ],
4821 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004822 `
4823 bp += cc.GatherRequiredDepsForTest(android.Android)
4824 bp += java.GatherRequiredDepsForTest()
4825 bp += dexpreopt.BpToolModulesForTest()
4826
4827 fs := map[string][]byte{
4828 "a.java": nil,
4829 "a.jar": nil,
4830 "build/make/target/product/security": nil,
4831 "apex_manifest.json": nil,
4832 "AndroidManifest.xml": nil,
4833 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004834 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004835 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
4836 "framework/aidl/a.aidl": nil,
4837 }
4838 cc.GatherRequiredFilesForTest(fs)
4839
4840 ctx := android.NewTestArchContext()
4841 ctx.RegisterModuleType("apex", BundleFactory)
4842 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
4843 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01004844 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004845 cc.RegisterRequiredBuildComponentsForTest(ctx)
4846 java.RegisterJavaBuildComponents(ctx)
4847 java.RegisterSystemModulesBuildComponents(ctx)
4848 java.RegisterAppBuildComponents(ctx)
4849 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004850 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
4851 ctx.PreDepsMutators(RegisterPreDepsMutators)
4852 ctx.PostDepsMutators(RegisterPostDepsMutators)
4853
4854 config := android.TestArchConfig(buildDir, nil, bp, fs)
4855 ctx.Register(config)
4856
4857 _ = dexpreopt.GlobalSoongConfigForTests(config)
4858 dexpreopt.RegisterToolModulesForTest(ctx)
4859 pathCtx := android.PathContextForTesting(config)
4860 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
4861 transformDexpreoptConfig(dexpreoptConfig)
4862 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
4863
4864 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
4865 android.FailIfErrored(t, errs)
4866
4867 _, errs = ctx.PrepareBuildActions(config)
4868 if errmsg == "" {
4869 android.FailIfErrored(t, errs)
4870 } else if len(errs) > 0 {
4871 android.FailIfNoMatchingErrors(t, errmsg, errs)
4872 return
4873 } else {
4874 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
4875 }
4876}
4877
Jooyung Han548640b2020-04-27 12:10:30 +09004878func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
4879 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
4880 apex {
4881 name: "myapex",
4882 key: "myapex.key",
4883 updatable: true,
4884 }
4885
4886 apex_key {
4887 name: "myapex.key",
4888 public_key: "testkey.avbpubkey",
4889 private_key: "testkey.pem",
4890 }
4891 `)
4892}
4893
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004894func TestNoUpdatableJarsInBootImage(t *testing.T) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004895
4896 var error string
4897 var transform func(*dexpreopt.GlobalConfig)
4898
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004899 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
4900 transform = func(config *dexpreopt.GlobalConfig) {
4901 config.ArtApexJars = []string{"com.android.art.something:some-art-lib"}
4902 }
4903 testNoUpdatableJarsInBootImage(t, "", transform)
4904 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004905
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004906 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
4907 error = "module 'some-art-lib' from updatable apex 'com.android.art.something' is not allowed in the framework boot image"
4908 transform = func(config *dexpreopt.GlobalConfig) {
4909 config.BootJars = []string{"com.android.art.something:some-art-lib"}
4910 }
4911 testNoUpdatableJarsInBootImage(t, error, transform)
4912 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004913
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004914 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
4915 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the ART boot image"
4916 transform = func(config *dexpreopt.GlobalConfig) {
4917 config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
4918 }
4919 testNoUpdatableJarsInBootImage(t, error, transform)
4920 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004921
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004922 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
4923 error = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
4924 transform = func(config *dexpreopt.GlobalConfig) {
4925 config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
4926 }
4927 testNoUpdatableJarsInBootImage(t, error, transform)
4928 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004929
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004930 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
4931 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
4932 transform = func(config *dexpreopt.GlobalConfig) {
4933 config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
4934 }
4935 testNoUpdatableJarsInBootImage(t, error, transform)
4936 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004937
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004938 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
4939 transform = func(config *dexpreopt.GlobalConfig) {
4940 config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
4941 }
4942 testNoUpdatableJarsInBootImage(t, "", transform)
4943 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004944
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004945 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
4946 error = "failed to find a dex jar path for module 'nonexistent'"
4947 transform = func(config *dexpreopt.GlobalConfig) {
4948 config.ArtApexJars = []string{"platform:nonexistent"}
4949 }
4950 testNoUpdatableJarsInBootImage(t, error, transform)
4951 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004952
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004953 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
4954 error = "failed to find a dex jar path for module 'nonexistent'"
4955 transform = func(config *dexpreopt.GlobalConfig) {
4956 config.BootJars = []string{"platform:nonexistent"}
4957 }
4958 testNoUpdatableJarsInBootImage(t, error, transform)
4959 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004960
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004961 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
4962 error = "module 'some-platform-lib' is not allowed in the ART boot image"
4963 transform = func(config *dexpreopt.GlobalConfig) {
4964 config.ArtApexJars = []string{"platform:some-platform-lib"}
4965 }
4966 testNoUpdatableJarsInBootImage(t, error, transform)
4967 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004968
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004969 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
4970 transform = func(config *dexpreopt.GlobalConfig) {
4971 config.BootJars = []string{"platform:some-platform-lib"}
4972 }
4973 testNoUpdatableJarsInBootImage(t, "", transform)
4974 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004975}
4976
Jiyong Park62304bb2020-04-13 16:19:48 +09004977func TestTestFor(t *testing.T) {
4978 ctx, _ := testApex(t, `
4979 apex {
4980 name: "myapex",
4981 key: "myapex.key",
4982 native_shared_libs: ["mylib", "myprivlib"],
4983 }
4984
4985 apex_key {
4986 name: "myapex.key",
4987 public_key: "testkey.avbpubkey",
4988 private_key: "testkey.pem",
4989 }
4990
4991 cc_library {
4992 name: "mylib",
4993 srcs: ["mylib.cpp"],
4994 system_shared_libs: [],
4995 stl: "none",
4996 stubs: {
4997 versions: ["1"],
4998 },
4999 apex_available: ["myapex"],
5000 }
5001
5002 cc_library {
5003 name: "myprivlib",
5004 srcs: ["mylib.cpp"],
5005 system_shared_libs: [],
5006 stl: "none",
5007 apex_available: ["myapex"],
5008 }
5009
5010
5011 cc_test {
5012 name: "mytest",
5013 gtest: false,
5014 srcs: ["mylib.cpp"],
5015 system_shared_libs: [],
5016 stl: "none",
5017 shared_libs: ["mylib", "myprivlib"],
5018 test_for: ["myapex"]
5019 }
5020 `)
5021
5022 // the test 'mytest' is a test for the apex, therefore is linked to the
5023 // actual implementation of mylib instead of its stub.
5024 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5025 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5026 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5027}
5028
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005029// TODO(jungjw): Move this to proptools
5030func intPtr(i int) *int {
5031 return &i
5032}
5033
5034func TestApexSet(t *testing.T) {
5035 ctx, config := testApex(t, `
5036 apex_set {
5037 name: "myapex",
5038 set: "myapex.apks",
5039 filename: "foo_v2.apex",
5040 overrides: ["foo"],
5041 }
5042 `, func(fs map[string][]byte, config android.Config) {
5043 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5044 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5045 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5046 })
5047
5048 m := ctx.ModuleForTests("myapex", "android_common")
5049
5050 // Check extract_apks tool parameters.
5051 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5052 actual := extractedApex.Args["abis"]
5053 expected := "ARMEABI_V7A,ARM64_V8A"
5054 if actual != expected {
5055 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5056 }
5057 actual = extractedApex.Args["sdk-version"]
5058 expected = "30"
5059 if actual != expected {
5060 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5061 }
5062
5063 a := m.Module().(*ApexSet)
5064 expectedOverrides := []string{"foo"}
5065 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5066 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5067 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5068 }
5069}
5070
Jiyong Park7d95a512020-05-10 15:16:24 +09005071func TestNoStaticLinkingToStubsLib(t *testing.T) {
5072 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5073 apex {
5074 name: "myapex",
5075 key: "myapex.key",
5076 native_shared_libs: ["mylib"],
5077 }
5078
5079 apex_key {
5080 name: "myapex.key",
5081 public_key: "testkey.avbpubkey",
5082 private_key: "testkey.pem",
5083 }
5084
5085 cc_library {
5086 name: "mylib",
5087 srcs: ["mylib.cpp"],
5088 static_libs: ["otherlib"],
5089 system_shared_libs: [],
5090 stl: "none",
5091 apex_available: [ "myapex" ],
5092 }
5093
5094 cc_library {
5095 name: "otherlib",
5096 srcs: ["mylib.cpp"],
5097 system_shared_libs: [],
5098 stl: "none",
5099 stubs: {
5100 versions: ["1", "2", "3"],
5101 },
5102 apex_available: [ "myapex" ],
5103 }
5104 `)
5105}
5106
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005107func TestMain(m *testing.M) {
5108 run := func() int {
5109 setUp()
5110 defer tearDown()
5111
5112 return m.Run()
5113 }
5114
5115 os.Exit(run())
5116}