blob: 229b013e18d8fab2afe3db388f323c762bfb0e6d [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Park25fc6a92018-11-18 18:02:45 +090018 "io/ioutil"
19 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Jooyung Han31c470b2019-10-18 16:26:59 +090022 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090023 "strings"
24 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090025
26 "github.com/google/blueprint/proptools"
27
28 "android/soong/android"
29 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000030 "android/soong/dexpreopt"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090031 "android/soong/java"
Jiyong Park25fc6a92018-11-18 18:02:45 +090032)
33
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070034var buildDir string
35
Jooyung Hand3639552019-08-09 12:57:43 +090036// names returns name list from white space separated string
37func names(s string) (ns []string) {
38 for _, n := range strings.Split(s, " ") {
39 if len(n) > 0 {
40 ns = append(ns, n)
41 }
42 }
43 return
44}
45
Jooyung Han344d5432019-08-23 11:17:39 +090046func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
47 t.Helper()
48 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090049 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
50 if len(errs) > 0 {
51 android.FailIfNoMatchingErrors(t, pattern, errs)
52 return
53 }
54 _, errs = ctx.PrepareBuildActions(config)
55 if len(errs) > 0 {
56 android.FailIfNoMatchingErrors(t, pattern, errs)
57 return
58 }
59
60 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
61}
62
Jooyung Han344d5432019-08-23 11:17:39 +090063func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
64 t.Helper()
65 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090066 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
67 android.FailIfErrored(t, errs)
68 _, errs = ctx.PrepareBuildActions(config)
69 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070070 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090071}
72
Jooyung Han344d5432019-08-23 11:17:39 +090073type testCustomizer func(fs map[string][]byte, config android.Config)
74
75func withFiles(files map[string][]byte) testCustomizer {
76 return func(fs map[string][]byte, config android.Config) {
77 for k, v := range files {
78 fs[k] = v
79 }
80 }
81}
82
83func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
84 return func(fs map[string][]byte, config android.Config) {
85 for k, v := range targets {
86 config.Targets[k] = v
87 }
88 }
89}
90
Jooyung Han35155c42020-02-06 17:33:20 +090091// withNativeBridgeTargets sets configuration with targets including:
92// - X86_64 (primary)
93// - X86 (secondary)
94// - Arm64 on X86_64 (native bridge)
95// - Arm on X86 (native bridge)
96func withNativeBridgeEnabled(fs map[string][]byte, config android.Config) {
97 config.Targets[android.Android] = []android.Target{
98 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
99 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
100 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
101 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
106 }
107}
108
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900109func withManifestPackageNameOverrides(specs []string) testCustomizer {
110 return func(fs map[string][]byte, config android.Config) {
111 config.TestProductVariables.ManifestPackageNameOverrides = specs
112 }
113}
114
Jooyung Han31c470b2019-10-18 16:26:59 +0900115func withBinder32bit(fs map[string][]byte, config android.Config) {
116 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
117}
118
Jiyong Park7cd10e32020-01-14 09:22:18 +0900119func withUnbundledBuild(fs map[string][]byte, config android.Config) {
120 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
121}
122
Jooyung Han344d5432019-08-23 11:17:39 +0900123func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jooyung Han671f1ce2019-12-17 12:47:13 +0900124 android.ClearApexDependency()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900125
126 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900127 filegroup {
128 name: "myapex-file_contexts",
129 srcs: [
130 "system/sepolicy/apex/myapex-file_contexts",
131 ],
132 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900133 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800134
Colin Crossf9aabd72020-02-15 11:29:50 -0800135 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
136
Dario Frenicde2a032019-10-27 00:29:22 +0100137 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900138
Jooyung Han344d5432019-08-23 11:17:39 +0900139 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900140 "a.java": nil,
141 "PrebuiltAppFoo.apk": nil,
142 "PrebuiltAppFooPriv.apk": nil,
143 "build/make/target/product/security": nil,
144 "apex_manifest.json": nil,
145 "AndroidManifest.xml": nil,
146 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900147 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900148 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900149 "system/sepolicy/apex/otherapex-file_contexts": nil,
150 "system/sepolicy/apex/commonapex-file_contexts": nil,
151 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800152 "mylib.cpp": nil,
153 "mylib_common.cpp": nil,
154 "mytest.cpp": nil,
155 "mytest1.cpp": nil,
156 "mytest2.cpp": nil,
157 "mytest3.cpp": nil,
158 "myprebuilt": nil,
159 "my_include": nil,
160 "foo/bar/MyClass.java": nil,
161 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100162 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800163 "vendor/foo/devkeys/test.x509.pem": nil,
164 "vendor/foo/devkeys/test.pk8": nil,
165 "testkey.x509.pem": nil,
166 "testkey.pk8": nil,
167 "testkey.override.x509.pem": nil,
168 "testkey.override.pk8": nil,
169 "vendor/foo/devkeys/testkey.avbpubkey": nil,
170 "vendor/foo/devkeys/testkey.pem": nil,
171 "NOTICE": nil,
172 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900173 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800174 "testkey2.avbpubkey": nil,
175 "testkey2.pem": nil,
176 "myapex-arm64.apex": nil,
177 "myapex-arm.apex": nil,
178 "frameworks/base/api/current.txt": nil,
179 "framework/aidl/a.aidl": nil,
180 "build/make/core/proguard.flags": nil,
181 "build/make/core/proguard_basic_keeps.flags": nil,
182 "dummy.txt": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900183 }
184
Colin Crossf9aabd72020-02-15 11:29:50 -0800185 cc.GatherRequiredFilesForTest(fs)
186
Jooyung Han344d5432019-08-23 11:17:39 +0900187 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800188 // The fs now needs to be populated before creating the config, call handlers twice
189 // for now, once to get any fs changes, and later after the config was created to
190 // set product variables or targets.
191 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
192 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900193 }
194
Colin Cross98be1bb2019-12-13 20:41:13 -0800195 config := android.TestArchConfig(buildDir, nil, bp, fs)
196 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
197 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
198 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
199 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
200 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
201 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
202
203 for _, handler := range handlers {
204 // The fs now needs to be populated before creating the config, call handlers twice
205 // for now, earlier to get any fs changes, and now after the config was created to
206 // set product variables or targets.
207 tempFS := map[string][]byte{}
208 handler(tempFS, config)
209 }
210
211 ctx := android.NewTestArchContext()
212 ctx.RegisterModuleType("apex", BundleFactory)
213 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
214 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
215 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
216 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
217 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
218 ctx.RegisterModuleType("override_apex", overrideApexFactory)
219
Jooyung Hana57af4a2020-01-23 05:36:59 +0000220 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
221 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
222
Paul Duffin77980a82019-12-19 16:01:36 +0000223 cc.RegisterRequiredBuildComponentsForTest(ctx)
Colin Cross98be1bb2019-12-13 20:41:13 -0800224 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800225 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
226 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800227 ctx.RegisterModuleType("prebuilt_etc", android.PrebuiltEtcFactory)
atrost6e126252020-01-27 17:01:16 +0000228 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800229 ctx.RegisterModuleType("sh_binary", android.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800230 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000231 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000232 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000233 java.RegisterAppBuildComponents(ctx)
Jooyung Han58f26ab2019-12-18 15:34:32 +0900234 ctx.RegisterModuleType("java_sdk_library", java.SdkLibraryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800235
Colin Cross98be1bb2019-12-13 20:41:13 -0800236 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800237 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800238
239 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900240
Jooyung Han5c998b92019-06-27 11:30:33 +0900241 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242}
243
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700244func setUp() {
245 var err error
246 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900247 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700248 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900249 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900250}
251
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700252func tearDown() {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900253 os.RemoveAll(buildDir)
254}
255
Jooyung Han643adc42020-02-27 13:50:06 +0900256// ensure that 'result' equals 'expected'
257func ensureEquals(t *testing.T, result string, expected string) {
258 t.Helper()
259 if result != expected {
260 t.Errorf("%q != %q", expected, result)
261 }
262}
263
Jiyong Park25fc6a92018-11-18 18:02:45 +0900264// ensure that 'result' contains 'expected'
265func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900266 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267 if !strings.Contains(result, expected) {
268 t.Errorf("%q is not found in %q", expected, result)
269 }
270}
271
272// ensures that 'result' does not contain 'notExpected'
273func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900274 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900275 if strings.Contains(result, notExpected) {
276 t.Errorf("%q is found in %q", notExpected, result)
277 }
278}
279
280func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900281 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282 if !android.InList(expected, result) {
283 t.Errorf("%q is not found in %v", expected, result)
284 }
285}
286
287func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900288 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289 if android.InList(notExpected, result) {
290 t.Errorf("%q is found in %v", notExpected, result)
291 }
292}
293
Jooyung Hane1633032019-08-01 17:41:43 +0900294func ensureListEmpty(t *testing.T, result []string) {
295 t.Helper()
296 if len(result) > 0 {
297 t.Errorf("%q is expected to be empty", result)
298 }
299}
300
Jiyong Park25fc6a92018-11-18 18:02:45 +0900301// Minimal test
302func TestBasicApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700303 ctx, _ := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900304 apex_defaults {
305 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900306 manifest: ":myapex.manifest",
307 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900308 key: "myapex.key",
309 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800310 multilib: {
311 both: {
312 binaries: ["foo",],
313 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900314 },
Jooyung Han5a80d9f2019-12-23 15:38:34 +0900315 java_libs: ["myjar"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900316 }
317
Jiyong Park30ca9372019-02-07 16:27:23 +0900318 apex {
319 name: "myapex",
320 defaults: ["myapex-defaults"],
321 }
322
Jiyong Park25fc6a92018-11-18 18:02:45 +0900323 apex_key {
324 name: "myapex.key",
325 public_key: "testkey.avbpubkey",
326 private_key: "testkey.pem",
327 }
328
Jiyong Park809bb722019-02-13 21:33:49 +0900329 filegroup {
330 name: "myapex.manifest",
331 srcs: ["apex_manifest.json"],
332 }
333
334 filegroup {
335 name: "myapex.androidmanifest",
336 srcs: ["AndroidManifest.xml"],
337 }
338
Jiyong Park25fc6a92018-11-18 18:02:45 +0900339 cc_library {
340 name: "mylib",
341 srcs: ["mylib.cpp"],
342 shared_libs: ["mylib2"],
343 system_shared_libs: [],
344 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000345 // TODO: remove //apex_available:platform
346 apex_available: [
347 "//apex_available:platform",
348 "myapex",
349 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900350 }
351
Alex Light3d673592019-01-18 14:37:31 -0800352 cc_binary {
353 name: "foo",
354 srcs: ["mylib.cpp"],
355 compile_multilib: "both",
356 multilib: {
357 lib32: {
358 suffix: "32",
359 },
360 lib64: {
361 suffix: "64",
362 },
363 },
364 symlinks: ["foo_link_"],
365 symlink_preferred_arch: true,
366 system_shared_libs: [],
367 static_executable: true,
368 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000369 apex_available: [ "myapex" ],
Alex Light3d673592019-01-18 14:37:31 -0800370 }
371
Paul Duffindddd5462020-04-07 15:25:44 +0100372 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900373 name: "mylib2",
374 srcs: ["mylib.cpp"],
375 system_shared_libs: [],
376 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900377 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900378 static_libs: ["libstatic"],
379 // TODO: remove //apex_available:platform
380 apex_available: [
381 "//apex_available:platform",
382 "myapex",
383 ],
384 }
385
Paul Duffindddd5462020-04-07 15:25:44 +0100386 cc_prebuilt_library_shared {
387 name: "mylib2",
388 srcs: ["prebuilt.so"],
389 // TODO: remove //apex_available:platform
390 apex_available: [
391 "//apex_available:platform",
392 "myapex",
393 ],
394 }
395
Jiyong Park9918e1a2020-03-17 19:16:40 +0900396 cc_library_static {
397 name: "libstatic",
398 srcs: ["mylib.cpp"],
399 system_shared_libs: [],
400 stl: "none",
401 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000402 // TODO: remove //apex_available:platform
403 apex_available: [
404 "//apex_available:platform",
405 "myapex",
406 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900407 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900408
409 java_library {
410 name: "myjar",
411 srcs: ["foo/bar/MyClass.java"],
412 sdk_version: "none",
413 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900414 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900415 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000416 // TODO: remove //apex_available:platform
417 apex_available: [
418 "//apex_available:platform",
419 "myapex",
420 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900421 }
422
423 java_library {
424 name: "myotherjar",
425 srcs: ["foo/bar/MyClass.java"],
426 sdk_version: "none",
427 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900428 // TODO: remove //apex_available:platform
429 apex_available: [
430 "//apex_available:platform",
431 "myapex",
432 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900433 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900434
435 java_library {
436 name: "mysharedjar",
437 srcs: ["foo/bar/MyClass.java"],
438 sdk_version: "none",
439 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900440 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900441 `)
442
Sundong Ahnabb64432019-10-22 13:58:29 +0900443 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900444
445 optFlags := apexRule.Args["opt_flags"]
446 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700447 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900448 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900449
Jiyong Park25fc6a92018-11-18 18:02:45 +0900450 copyCmds := apexRule.Args["copy_commands"]
451
452 // Ensure that main rule creates an output
453 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
454
455 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800456 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900457 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900458
459 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800460 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900461 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900462
463 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800464 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
465 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900466 ensureContains(t, copyCmds, "image.apex/javalib/myjar.jar")
467 // .. but not for java libs
468 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900469 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800470
Colin Cross7113d202019-11-20 16:39:12 -0800471 // Ensure that the platform variant ends with _shared or _common
472 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
473 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900474 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
475 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900476 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
477
478 // Ensure that dynamic dependency to java libs are not included
479 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800480
481 // Ensure that all symlinks are present.
482 found_foo_link_64 := false
483 found_foo := false
484 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900485 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800486 if strings.HasSuffix(cmd, "bin/foo") {
487 found_foo = true
488 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
489 found_foo_link_64 = true
490 }
491 }
492 }
493 good := found_foo && found_foo_link_64
494 if !good {
495 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
496 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900497
Sundong Ahnabb64432019-10-22 13:58:29 +0900498 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700499 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900500 if len(noticeInputs) != 3 {
501 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900502 }
503 ensureListContains(t, noticeInputs, "NOTICE")
504 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900505 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900506
507 depsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("myapex-deps-info.txt").Args["content"], "\\n")
Jiyong Park678c8812020-02-07 17:25:49 +0900508 ensureListContains(t, depsInfo, "myjar <- myapex")
509 ensureListContains(t, depsInfo, "mylib <- myapex")
510 ensureListContains(t, depsInfo, "mylib2 <- mylib")
511 ensureListContains(t, depsInfo, "myotherjar <- myjar")
512 ensureListContains(t, depsInfo, "mysharedjar (external) <- myjar")
Alex Light5098a612018-11-29 17:12:15 -0800513}
514
Jooyung Hanf21c7972019-12-16 22:32:06 +0900515func TestDefaults(t *testing.T) {
516 ctx, _ := testApex(t, `
517 apex_defaults {
518 name: "myapex-defaults",
519 key: "myapex.key",
520 prebuilts: ["myetc"],
521 native_shared_libs: ["mylib"],
522 java_libs: ["myjar"],
523 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900524 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900525 }
526
527 prebuilt_etc {
528 name: "myetc",
529 src: "myprebuilt",
530 }
531
532 apex {
533 name: "myapex",
534 defaults: ["myapex-defaults"],
535 }
536
537 apex_key {
538 name: "myapex.key",
539 public_key: "testkey.avbpubkey",
540 private_key: "testkey.pem",
541 }
542
543 cc_library {
544 name: "mylib",
545 system_shared_libs: [],
546 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000547 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900548 }
549
550 java_library {
551 name: "myjar",
552 srcs: ["foo/bar/MyClass.java"],
553 sdk_version: "none",
554 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000555 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900556 }
557
558 android_app {
559 name: "AppFoo",
560 srcs: ["foo/bar/MyClass.java"],
561 sdk_version: "none",
562 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000563 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900564 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900565
566 runtime_resource_overlay {
567 name: "rro",
568 theme: "blue",
569 }
570
Jooyung Hanf21c7972019-12-16 22:32:06 +0900571 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000572 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900573 "etc/myetc",
574 "javalib/myjar.jar",
575 "lib64/mylib.so",
576 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900577 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900578 })
579}
580
Jooyung Han01a3ee22019-11-02 02:52:25 +0900581func TestApexManifest(t *testing.T) {
582 ctx, _ := testApex(t, `
583 apex {
584 name: "myapex",
585 key: "myapex.key",
586 }
587
588 apex_key {
589 name: "myapex.key",
590 public_key: "testkey.avbpubkey",
591 private_key: "testkey.pem",
592 }
593 `)
594
595 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900596 args := module.Rule("apexRule").Args
597 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
598 t.Error("manifest should be apex_manifest.pb, but " + manifest)
599 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900600}
601
Alex Light5098a612018-11-29 17:12:15 -0800602func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700603 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800604 apex {
605 name: "myapex",
606 key: "myapex.key",
607 payload_type: "zip",
608 native_shared_libs: ["mylib"],
609 }
610
611 apex_key {
612 name: "myapex.key",
613 public_key: "testkey.avbpubkey",
614 private_key: "testkey.pem",
615 }
616
617 cc_library {
618 name: "mylib",
619 srcs: ["mylib.cpp"],
620 shared_libs: ["mylib2"],
621 system_shared_libs: [],
622 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000623 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800624 }
625
626 cc_library {
627 name: "mylib2",
628 srcs: ["mylib.cpp"],
629 system_shared_libs: [],
630 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000631 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800632 }
633 `)
634
Sundong Ahnabb64432019-10-22 13:58:29 +0900635 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800636 copyCmds := zipApexRule.Args["copy_commands"]
637
638 // Ensure that main rule creates an output
639 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
640
641 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800642 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800643
644 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800645 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800646
647 // Ensure that both direct and indirect deps are copied into apex
648 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
649 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900650}
651
652func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700653 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900654 apex {
655 name: "myapex",
656 key: "myapex.key",
657 native_shared_libs: ["mylib", "mylib3"],
658 }
659
660 apex_key {
661 name: "myapex.key",
662 public_key: "testkey.avbpubkey",
663 private_key: "testkey.pem",
664 }
665
666 cc_library {
667 name: "mylib",
668 srcs: ["mylib.cpp"],
669 shared_libs: ["mylib2", "mylib3"],
670 system_shared_libs: [],
671 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000672 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900673 }
674
675 cc_library {
676 name: "mylib2",
677 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900678 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900679 system_shared_libs: [],
680 stl: "none",
681 stubs: {
682 versions: ["1", "2", "3"],
683 },
684 }
685
686 cc_library {
687 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900688 srcs: ["mylib.cpp"],
689 shared_libs: ["mylib4"],
690 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900691 stl: "none",
692 stubs: {
693 versions: ["10", "11", "12"],
694 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000695 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900696 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900697
698 cc_library {
699 name: "mylib4",
700 srcs: ["mylib.cpp"],
701 system_shared_libs: [],
702 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000703 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900704 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900705 `)
706
Sundong Ahnabb64432019-10-22 13:58:29 +0900707 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900708 copyCmds := apexRule.Args["copy_commands"]
709
710 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800711 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900712
713 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800714 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900715
716 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800717 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900718
Colin Cross7113d202019-11-20 16:39:12 -0800719 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900720
721 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900722 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900723 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900724 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900725
726 // 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 -0800727 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900728 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800729 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900730
731 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900732 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900733 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900734
735 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900736 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900737
Jooyung Hana57af4a2020-01-23 05:36:59 +0000738 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900739 "lib64/mylib.so",
740 "lib64/mylib3.so",
741 "lib64/mylib4.so",
742 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900743}
744
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900745func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700746 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900747 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900748 name: "myapex2",
749 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900750 native_shared_libs: ["mylib"],
751 }
752
753 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900754 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900755 public_key: "testkey.avbpubkey",
756 private_key: "testkey.pem",
757 }
758
759 cc_library {
760 name: "mylib",
761 srcs: ["mylib.cpp"],
762 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900763 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900764 system_shared_libs: [],
765 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000766 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900767 }
768
769 cc_library {
770 name: "libfoo",
771 srcs: ["mylib.cpp"],
772 shared_libs: ["libbar"],
773 system_shared_libs: [],
774 stl: "none",
775 stubs: {
776 versions: ["10", "20", "30"],
777 },
778 }
779
780 cc_library {
781 name: "libbar",
782 srcs: ["mylib.cpp"],
783 system_shared_libs: [],
784 stl: "none",
785 }
786
Jiyong Park678c8812020-02-07 17:25:49 +0900787 cc_library_static {
788 name: "libbaz",
789 srcs: ["mylib.cpp"],
790 system_shared_libs: [],
791 stl: "none",
792 apex_available: [ "myapex2" ],
793 }
794
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900795 `)
796
Jiyong Park83dc74b2020-01-14 18:38:44 +0900797 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900798 copyCmds := apexRule.Args["copy_commands"]
799
800 // Ensure that direct non-stubs dep is always included
801 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
802
803 // Ensure that indirect stubs dep is not included
804 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
805
806 // Ensure that dependency of stubs is not included
807 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
808
Jiyong Park83dc74b2020-01-14 18:38:44 +0900809 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900810
811 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900812 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900813 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900814 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900815
Jiyong Park3ff16992019-12-27 14:11:47 +0900816 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900817
818 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
819 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900820
821 depsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("myapex2-deps-info.txt").Args["content"], "\\n")
Jiyong Park678c8812020-02-07 17:25:49 +0900822
823 ensureListContains(t, depsInfo, "mylib <- myapex2")
824 ensureListContains(t, depsInfo, "libbaz <- mylib")
825 ensureListContains(t, depsInfo, "libfoo (external) <- mylib")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900826}
827
Jooyung Hand3639552019-08-09 12:57:43 +0900828func TestApexWithRuntimeLibsDependency(t *testing.T) {
829 /*
830 myapex
831 |
832 v (runtime_libs)
833 mylib ------+------> libfoo [provides stub]
834 |
835 `------> libbar
836 */
837 ctx, _ := testApex(t, `
838 apex {
839 name: "myapex",
840 key: "myapex.key",
841 native_shared_libs: ["mylib"],
842 }
843
844 apex_key {
845 name: "myapex.key",
846 public_key: "testkey.avbpubkey",
847 private_key: "testkey.pem",
848 }
849
850 cc_library {
851 name: "mylib",
852 srcs: ["mylib.cpp"],
853 runtime_libs: ["libfoo", "libbar"],
854 system_shared_libs: [],
855 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000856 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900857 }
858
859 cc_library {
860 name: "libfoo",
861 srcs: ["mylib.cpp"],
862 system_shared_libs: [],
863 stl: "none",
864 stubs: {
865 versions: ["10", "20", "30"],
866 },
867 }
868
869 cc_library {
870 name: "libbar",
871 srcs: ["mylib.cpp"],
872 system_shared_libs: [],
873 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000874 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900875 }
876
877 `)
878
Sundong Ahnabb64432019-10-22 13:58:29 +0900879 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900880 copyCmds := apexRule.Args["copy_commands"]
881
882 // Ensure that direct non-stubs dep is always included
883 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
884
885 // Ensure that indirect stubs dep is not included
886 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
887
888 // Ensure that runtime_libs dep in included
889 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
890
Sundong Ahnabb64432019-10-22 13:58:29 +0900891 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900892 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
893 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900894
895}
896
Jooyung Han61b66e92020-03-21 14:21:46 +0000897func TestApexDependsOnLLNDKTransitively(t *testing.T) {
898 testcases := []struct {
899 name string
900 minSdkVersion string
901 shouldLink string
902 shouldNotLink []string
903 }{
904 {
Jooyung Han75568392020-03-20 04:29:24 +0900905 name: "should link to the latest",
Jooyung Han61b66e92020-03-21 14:21:46 +0000906 minSdkVersion: "current",
907 shouldLink: "30",
908 shouldNotLink: []string{"29"},
909 },
910 {
911 name: "should link to llndk#29",
912 minSdkVersion: "29",
913 shouldLink: "29",
914 shouldNotLink: []string{"30"},
915 },
916 }
917 for _, tc := range testcases {
918 t.Run(tc.name, func(t *testing.T) {
919 ctx, _ := testApex(t, `
920 apex {
921 name: "myapex",
922 key: "myapex.key",
923 use_vendor: true,
924 native_shared_libs: ["mylib"],
925 min_sdk_version: "`+tc.minSdkVersion+`",
926 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900927
Jooyung Han61b66e92020-03-21 14:21:46 +0000928 apex_key {
929 name: "myapex.key",
930 public_key: "testkey.avbpubkey",
931 private_key: "testkey.pem",
932 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900933
Jooyung Han61b66e92020-03-21 14:21:46 +0000934 cc_library {
935 name: "mylib",
936 srcs: ["mylib.cpp"],
937 vendor_available: true,
938 shared_libs: ["libbar"],
939 system_shared_libs: [],
940 stl: "none",
941 apex_available: [ "myapex" ],
942 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900943
Jooyung Han61b66e92020-03-21 14:21:46 +0000944 cc_library {
945 name: "libbar",
946 srcs: ["mylib.cpp"],
947 system_shared_libs: [],
948 stl: "none",
949 stubs: { versions: ["29","30"] },
950 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900951
Jooyung Han61b66e92020-03-21 14:21:46 +0000952 llndk_library {
953 name: "libbar",
954 symbol_file: "",
955 }
956 `, func(fs map[string][]byte, config android.Config) {
957 setUseVendorWhitelistForTest(config, []string{"myapex"})
958 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +0900959
Jooyung Han61b66e92020-03-21 14:21:46 +0000960 // Ensure that LLNDK dep is not included
961 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
962 "lib64/mylib.so",
963 })
Jooyung Han9c80bae2019-08-20 17:30:57 +0900964
Jooyung Han61b66e92020-03-21 14:21:46 +0000965 // Ensure that LLNDK dep is required
966 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
967 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
968 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +0900969
Jooyung Han61b66e92020-03-21 14:21:46 +0000970 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
971 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
972 for _, ver := range tc.shouldNotLink {
973 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
974 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900975
Jooyung Han61b66e92020-03-21 14:21:46 +0000976 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
977 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
978 })
979 }
Jooyung Han9c80bae2019-08-20 17:30:57 +0900980}
981
Jiyong Park25fc6a92018-11-18 18:02:45 +0900982func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700983 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900984 apex {
985 name: "myapex",
986 key: "myapex.key",
987 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
988 }
989
990 apex_key {
991 name: "myapex.key",
992 public_key: "testkey.avbpubkey",
993 private_key: "testkey.pem",
994 }
995
996 cc_library {
997 name: "mylib",
998 srcs: ["mylib.cpp"],
999 shared_libs: ["libdl#27"],
1000 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001001 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001002 }
1003
1004 cc_library_shared {
1005 name: "mylib_shared",
1006 srcs: ["mylib.cpp"],
1007 shared_libs: ["libdl#27"],
1008 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001009 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001010 }
1011
1012 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001013 name: "libBootstrap",
1014 srcs: ["mylib.cpp"],
1015 stl: "none",
1016 bootstrap: true,
1017 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001018 `)
1019
Sundong Ahnabb64432019-10-22 13:58:29 +09001020 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001021 copyCmds := apexRule.Args["copy_commands"]
1022
1023 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001024 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001025 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1026 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001027
1028 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001029 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001030
Colin Cross7113d202019-11-20 16:39:12 -08001031 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1032 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1033 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001034
1035 // For dependency to libc
1036 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001037 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001038 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001039 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001040 // ... Cflags from stub is correctly exported to mylib
1041 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1042 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1043
1044 // For dependency to libm
1045 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001046 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001047 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001048 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001049 // ... and is not compiling with the stub
1050 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1051 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1052
1053 // For dependency to libdl
1054 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001055 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001056 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001057 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1058 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001059 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001060 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001061 // ... Cflags from stub is correctly exported to mylib
1062 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1063 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001064
1065 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001066 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1067 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1068 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1069 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001070}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001071
Jooyung Han03b51852020-02-26 22:45:42 +09001072func TestApexUseStubsAccordingToMinSdkVersionInUnbundledBuild(t *testing.T) {
1073 // there are three links between liba --> libz
1074 // 1) myapex -> libx -> liba -> libz : this should be #2 link, but fallback to #1
1075 // 2) otherapex -> liby -> liba -> libz : this should be #3 link
1076 // 3) (platform) -> liba -> libz : this should be non-stub link
1077 ctx, _ := testApex(t, `
1078 apex {
1079 name: "myapex",
1080 key: "myapex.key",
1081 native_shared_libs: ["libx"],
1082 min_sdk_version: "2",
1083 }
1084
1085 apex {
1086 name: "otherapex",
1087 key: "myapex.key",
1088 native_shared_libs: ["liby"],
1089 min_sdk_version: "3",
1090 }
1091
1092 apex_key {
1093 name: "myapex.key",
1094 public_key: "testkey.avbpubkey",
1095 private_key: "testkey.pem",
1096 }
1097
1098 cc_library {
1099 name: "libx",
1100 shared_libs: ["liba"],
1101 system_shared_libs: [],
1102 stl: "none",
1103 apex_available: [ "myapex" ],
1104 }
1105
1106 cc_library {
1107 name: "liby",
1108 shared_libs: ["liba"],
1109 system_shared_libs: [],
1110 stl: "none",
1111 apex_available: [ "otherapex" ],
1112 }
1113
1114 cc_library {
1115 name: "liba",
1116 shared_libs: ["libz"],
1117 system_shared_libs: [],
1118 stl: "none",
1119 apex_available: [
1120 "//apex_available:anyapex",
1121 "//apex_available:platform",
1122 ],
1123 }
1124
1125 cc_library {
1126 name: "libz",
1127 system_shared_libs: [],
1128 stl: "none",
1129 stubs: {
1130 versions: ["1", "3"],
1131 },
1132 }
1133 `, withUnbundledBuild)
1134
1135 expectLink := func(from, from_variant, to, to_variant string) {
1136 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1137 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1138 }
1139 expectNoLink := func(from, from_variant, to, to_variant string) {
1140 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1141 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1142 }
1143 // platform liba is linked to non-stub version
1144 expectLink("liba", "shared", "libz", "shared")
1145 // liba in myapex is linked to #1
1146 expectLink("liba", "shared_myapex", "libz", "shared_1")
1147 expectNoLink("liba", "shared_myapex", "libz", "shared_3")
1148 expectNoLink("liba", "shared_myapex", "libz", "shared")
1149 // liba in otherapex is linked to #3
1150 expectLink("liba", "shared_otherapex", "libz", "shared_3")
1151 expectNoLink("liba", "shared_otherapex", "libz", "shared_1")
1152 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1153}
1154
Jooyung Hanaed150d2020-04-02 01:41:41 +09001155func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1156 ctx, _ := testApex(t, `
1157 apex {
1158 name: "myapex",
1159 key: "myapex.key",
1160 native_shared_libs: ["libx"],
1161 min_sdk_version: "R",
1162 }
1163
1164 apex_key {
1165 name: "myapex.key",
1166 public_key: "testkey.avbpubkey",
1167 private_key: "testkey.pem",
1168 }
1169
1170 cc_library {
1171 name: "libx",
1172 shared_libs: ["libz"],
1173 system_shared_libs: [],
1174 stl: "none",
1175 apex_available: [ "myapex" ],
1176 }
1177
1178 cc_library {
1179 name: "libz",
1180 system_shared_libs: [],
1181 stl: "none",
1182 stubs: {
1183 versions: ["29", "R"],
1184 },
1185 }
1186 `, func(fs map[string][]byte, config android.Config) {
1187 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1188 })
1189
1190 expectLink := func(from, from_variant, to, to_variant string) {
1191 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1192 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1193 }
1194 expectNoLink := func(from, from_variant, to, to_variant string) {
1195 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1196 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1197 }
1198 // 9000 is quite a magic number.
1199 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1200 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1201 // to distinguish them from finalized and future_api(10000)
1202 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1203 // (refer android/api_levels.go)
1204 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1205 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1206 expectNoLink("libx", "shared_myapex", "libz", "shared")
1207}
1208
Jooyung Han03b51852020-02-26 22:45:42 +09001209func TestApexMinSdkVersionDefaultsToLatest(t *testing.T) {
1210 ctx, _ := testApex(t, `
1211 apex {
1212 name: "myapex",
1213 key: "myapex.key",
1214 native_shared_libs: ["libx"],
1215 }
1216
1217 apex_key {
1218 name: "myapex.key",
1219 public_key: "testkey.avbpubkey",
1220 private_key: "testkey.pem",
1221 }
1222
1223 cc_library {
1224 name: "libx",
1225 shared_libs: ["libz"],
1226 system_shared_libs: [],
1227 stl: "none",
1228 apex_available: [ "myapex" ],
1229 }
1230
1231 cc_library {
1232 name: "libz",
1233 system_shared_libs: [],
1234 stl: "none",
1235 stubs: {
1236 versions: ["1", "2"],
1237 },
1238 }
1239 `)
1240
1241 expectLink := func(from, from_variant, to, to_variant string) {
1242 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1243 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1244 }
1245 expectNoLink := func(from, from_variant, to, to_variant string) {
1246 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1247 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1248 }
1249 expectLink("libx", "shared_myapex", "libz", "shared_2")
1250 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1251 expectNoLink("libx", "shared_myapex", "libz", "shared")
1252}
1253
1254func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1255 ctx, _ := testApex(t, `
1256 apex {
1257 name: "myapex",
1258 key: "myapex.key",
1259 native_shared_libs: ["libx"],
1260 }
1261
1262 apex_key {
1263 name: "myapex.key",
1264 public_key: "testkey.avbpubkey",
1265 private_key: "testkey.pem",
1266 }
1267
1268 cc_library {
1269 name: "libx",
1270 system_shared_libs: [],
1271 stl: "none",
1272 apex_available: [ "myapex" ],
1273 stubs: {
1274 versions: ["1", "2"],
1275 },
1276 }
1277
1278 cc_library {
1279 name: "libz",
1280 shared_libs: ["libx"],
1281 system_shared_libs: [],
1282 stl: "none",
1283 }
1284 `)
1285
1286 expectLink := func(from, from_variant, to, to_variant string) {
1287 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1288 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1289 }
1290 expectNoLink := func(from, from_variant, to, to_variant string) {
1291 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1292 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1293 }
1294 expectLink("libz", "shared", "libx", "shared_2")
1295 expectNoLink("libz", "shared", "libz", "shared_1")
1296 expectNoLink("libz", "shared", "libz", "shared")
1297}
1298
Jooyung Han75568392020-03-20 04:29:24 +09001299func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001300 ctx, _ := testApex(t, `
1301 apex {
1302 name: "myapex",
1303 key: "myapex.key",
1304 native_shared_libs: ["libx"],
1305 min_sdk_version: "29",
1306 }
1307
1308 apex_key {
1309 name: "myapex.key",
1310 public_key: "testkey.avbpubkey",
1311 private_key: "testkey.pem",
1312 }
1313
1314 cc_library {
1315 name: "libx",
1316 shared_libs: ["libbar"],
1317 apex_available: [ "myapex" ],
1318 }
1319
1320 cc_library {
1321 name: "libbar",
1322 stubs: {
1323 versions: ["29", "30"],
1324 },
1325 }
Jooyung Han75568392020-03-20 04:29:24 +09001326 `, func(fs map[string][]byte, config android.Config) {
1327 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1328 })
Jooyung Han03b51852020-02-26 22:45:42 +09001329 expectLink := func(from, from_variant, to, to_variant string) {
1330 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1331 libFlags := ld.Args["libFlags"]
1332 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1333 }
Jooyung Han75568392020-03-20 04:29:24 +09001334 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001335}
1336
Jooyung Han75568392020-03-20 04:29:24 +09001337func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001338 ctx, _ := testApex(t, `
1339 apex {
1340 name: "myapex",
1341 key: "myapex.key",
1342 native_shared_libs: ["libx"],
1343 min_sdk_version: "29",
1344 }
1345
1346 apex_key {
1347 name: "myapex.key",
1348 public_key: "testkey.avbpubkey",
1349 private_key: "testkey.pem",
1350 }
1351
1352 cc_library {
1353 name: "libx",
1354 apex_available: [ "myapex" ],
1355 }
Jooyung Han75568392020-03-20 04:29:24 +09001356 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001357
1358 // ensure apex variant of c++ is linked with static unwinder
1359 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1360 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1361 // note that platform variant is not.
1362 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1363 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001364}
1365
1366func TestInvalidMinSdkVersion(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001367 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001368 apex {
1369 name: "myapex",
1370 key: "myapex.key",
1371 native_shared_libs: ["libx"],
1372 min_sdk_version: "29",
1373 }
1374
1375 apex_key {
1376 name: "myapex.key",
1377 public_key: "testkey.avbpubkey",
1378 private_key: "testkey.pem",
1379 }
1380
1381 cc_library {
1382 name: "libx",
1383 shared_libs: ["libz"],
1384 system_shared_libs: [],
1385 stl: "none",
1386 apex_available: [ "myapex" ],
1387 }
1388
1389 cc_library {
1390 name: "libz",
1391 system_shared_libs: [],
1392 stl: "none",
1393 stubs: {
1394 versions: ["30"],
1395 },
1396 }
Jooyung Han75568392020-03-20 04:29:24 +09001397 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001398
Jooyung Hanaed150d2020-04-02 01:41:41 +09001399 testApexError(t, `"myapex" .*: min_sdk_version: SDK version should be .*`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001400 apex {
1401 name: "myapex",
1402 key: "myapex.key",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001403 min_sdk_version: "abc",
Jooyung Han03b51852020-02-26 22:45:42 +09001404 }
1405
1406 apex_key {
1407 name: "myapex.key",
1408 public_key: "testkey.avbpubkey",
1409 private_key: "testkey.pem",
1410 }
1411 `)
1412}
1413
Jiyong Park7c2ee712018-12-07 00:42:25 +09001414func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001415 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001416 apex {
1417 name: "myapex",
1418 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001419 native_shared_libs: ["mylib"],
1420 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001421 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001422 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001423 }
1424
1425 apex_key {
1426 name: "myapex.key",
1427 public_key: "testkey.avbpubkey",
1428 private_key: "testkey.pem",
1429 }
1430
1431 prebuilt_etc {
1432 name: "myetc",
1433 src: "myprebuilt",
1434 sub_dir: "foo/bar",
1435 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001436
1437 cc_library {
1438 name: "mylib",
1439 srcs: ["mylib.cpp"],
1440 relative_install_path: "foo/bar",
1441 system_shared_libs: [],
1442 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001443 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001444 }
1445
1446 cc_binary {
1447 name: "mybin",
1448 srcs: ["mylib.cpp"],
1449 relative_install_path: "foo/bar",
1450 system_shared_libs: [],
1451 static_executable: true,
1452 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001453 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001454 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001455 `)
1456
Sundong Ahnabb64432019-10-22 13:58:29 +09001457 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001458 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1459
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001460 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001461 ensureListContains(t, dirs, "etc")
1462 ensureListContains(t, dirs, "etc/foo")
1463 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001464 ensureListContains(t, dirs, "lib64")
1465 ensureListContains(t, dirs, "lib64/foo")
1466 ensureListContains(t, dirs, "lib64/foo/bar")
1467 ensureListContains(t, dirs, "lib")
1468 ensureListContains(t, dirs, "lib/foo")
1469 ensureListContains(t, dirs, "lib/foo/bar")
1470
Jiyong Parkbd13e442019-03-15 18:10:35 +09001471 ensureListContains(t, dirs, "bin")
1472 ensureListContains(t, dirs, "bin/foo")
1473 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001474}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001475
Jooyung Han35155c42020-02-06 17:33:20 +09001476func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
1477 ctx, _ := testApex(t, `
1478 apex {
1479 name: "myapex",
1480 key: "myapex.key",
1481 multilib: {
1482 both: {
1483 native_shared_libs: ["mylib"],
1484 binaries: ["mybin"],
1485 },
1486 },
1487 compile_multilib: "both",
1488 native_bridge_supported: true,
1489 }
1490
1491 apex_key {
1492 name: "myapex.key",
1493 public_key: "testkey.avbpubkey",
1494 private_key: "testkey.pem",
1495 }
1496
1497 cc_library {
1498 name: "mylib",
1499 relative_install_path: "foo/bar",
1500 system_shared_libs: [],
1501 stl: "none",
1502 apex_available: [ "myapex" ],
1503 native_bridge_supported: true,
1504 }
1505
1506 cc_binary {
1507 name: "mybin",
1508 relative_install_path: "foo/bar",
1509 system_shared_libs: [],
1510 static_executable: true,
1511 stl: "none",
1512 apex_available: [ "myapex" ],
1513 native_bridge_supported: true,
1514 compile_multilib: "both", // default is "first" for binary
1515 multilib: {
1516 lib64: {
1517 suffix: "64",
1518 },
1519 },
1520 }
1521 `, withNativeBridgeEnabled)
1522 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1523 "bin/foo/bar/mybin",
1524 "bin/foo/bar/mybin64",
1525 "bin/arm/foo/bar/mybin",
1526 "bin/arm64/foo/bar/mybin64",
1527 "lib/foo/bar/mylib.so",
1528 "lib/arm/foo/bar/mylib.so",
1529 "lib64/foo/bar/mylib.so",
1530 "lib64/arm64/foo/bar/mylib.so",
1531 })
1532}
1533
Jiyong Parkda6eb592018-12-19 17:12:36 +09001534func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001535 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09001536 apex {
1537 name: "myapex",
1538 key: "myapex.key",
1539 native_shared_libs: ["mylib"],
1540 use_vendor: true,
1541 }
1542
1543 apex_key {
1544 name: "myapex.key",
1545 public_key: "testkey.avbpubkey",
1546 private_key: "testkey.pem",
1547 }
1548
1549 cc_library {
1550 name: "mylib",
1551 srcs: ["mylib.cpp"],
1552 shared_libs: ["mylib2"],
1553 system_shared_libs: [],
1554 vendor_available: true,
1555 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001556 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001557 }
1558
1559 cc_library {
1560 name: "mylib2",
1561 srcs: ["mylib.cpp"],
1562 system_shared_libs: [],
1563 vendor_available: true,
1564 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001565 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001566 }
Jooyung Handc782442019-11-01 03:14:38 +09001567 `, func(fs map[string][]byte, config android.Config) {
1568 setUseVendorWhitelistForTest(config, []string{"myapex"})
1569 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09001570
1571 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09001572 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09001573 for _, implicit := range i.Implicits {
1574 inputsList = append(inputsList, implicit.String())
1575 }
1576 }
1577 inputsString := strings.Join(inputsList, " ")
1578
1579 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08001580 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
1581 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001582
1583 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08001584 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
1585 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001586}
Jiyong Park16e91a02018-12-20 18:18:08 +09001587
Jooyung Handc782442019-11-01 03:14:38 +09001588func TestUseVendorRestriction(t *testing.T) {
1589 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
1590 apex {
1591 name: "myapex",
1592 key: "myapex.key",
1593 use_vendor: true,
1594 }
1595 apex_key {
1596 name: "myapex.key",
1597 public_key: "testkey.avbpubkey",
1598 private_key: "testkey.pem",
1599 }
1600 `, func(fs map[string][]byte, config android.Config) {
1601 setUseVendorWhitelistForTest(config, []string{""})
1602 })
1603 // no error with whitelist
1604 testApex(t, `
1605 apex {
1606 name: "myapex",
1607 key: "myapex.key",
1608 use_vendor: true,
1609 }
1610 apex_key {
1611 name: "myapex.key",
1612 public_key: "testkey.avbpubkey",
1613 private_key: "testkey.pem",
1614 }
1615 `, func(fs map[string][]byte, config android.Config) {
1616 setUseVendorWhitelistForTest(config, []string{"myapex"})
1617 })
1618}
1619
Jooyung Han5c998b92019-06-27 11:30:33 +09001620func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
1621 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
1622 apex {
1623 name: "myapex",
1624 key: "myapex.key",
1625 native_shared_libs: ["mylib"],
1626 use_vendor: true,
1627 }
1628
1629 apex_key {
1630 name: "myapex.key",
1631 public_key: "testkey.avbpubkey",
1632 private_key: "testkey.pem",
1633 }
1634
1635 cc_library {
1636 name: "mylib",
1637 srcs: ["mylib.cpp"],
1638 system_shared_libs: [],
1639 stl: "none",
1640 }
1641 `)
1642}
1643
Jiyong Park16e91a02018-12-20 18:18:08 +09001644func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001645 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09001646 apex {
1647 name: "myapex",
1648 key: "myapex.key",
1649 native_shared_libs: ["mylib"],
1650 }
1651
1652 apex_key {
1653 name: "myapex.key",
1654 public_key: "testkey.avbpubkey",
1655 private_key: "testkey.pem",
1656 }
1657
1658 cc_library {
1659 name: "mylib",
1660 srcs: ["mylib.cpp"],
1661 system_shared_libs: [],
1662 stl: "none",
1663 stubs: {
1664 versions: ["1", "2", "3"],
1665 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001666 apex_available: [
1667 "//apex_available:platform",
1668 "myapex",
1669 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09001670 }
1671
1672 cc_binary {
1673 name: "not_in_apex",
1674 srcs: ["mylib.cpp"],
1675 static_libs: ["mylib"],
1676 static_executable: true,
1677 system_shared_libs: [],
1678 stl: "none",
1679 }
Jiyong Park16e91a02018-12-20 18:18:08 +09001680 `)
1681
Colin Cross7113d202019-11-20 16:39:12 -08001682 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09001683
1684 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08001685 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09001686}
Jiyong Park9335a262018-12-24 11:31:58 +09001687
1688func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001689 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09001690 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001691 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09001692 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001693 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09001694 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09001695 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09001696 }
1697
1698 cc_library {
1699 name: "mylib",
1700 srcs: ["mylib.cpp"],
1701 system_shared_libs: [],
1702 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001703 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09001704 }
1705
1706 apex_key {
1707 name: "myapex.key",
1708 public_key: "testkey.avbpubkey",
1709 private_key: "testkey.pem",
1710 }
1711
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001712 android_app_certificate {
1713 name: "myapex.certificate",
1714 certificate: "testkey",
1715 }
1716
1717 android_app_certificate {
1718 name: "myapex.certificate.override",
1719 certificate: "testkey.override",
1720 }
1721
Jiyong Park9335a262018-12-24 11:31:58 +09001722 `)
1723
1724 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09001725 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09001726
1727 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
1728 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
1729 "vendor/foo/devkeys/testkey.avbpubkey")
1730 }
1731 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
1732 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
1733 "vendor/foo/devkeys/testkey.pem")
1734 }
1735
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001736 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09001737 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001738 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09001739 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001740 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09001741 }
1742}
Jiyong Park58e364a2019-01-19 19:24:06 +09001743
Jooyung Hanf121a652019-12-17 14:30:11 +09001744func TestCertificate(t *testing.T) {
1745 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
1746 ctx, _ := testApex(t, `
1747 apex {
1748 name: "myapex",
1749 key: "myapex.key",
1750 }
1751 apex_key {
1752 name: "myapex.key",
1753 public_key: "testkey.avbpubkey",
1754 private_key: "testkey.pem",
1755 }`)
1756 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
1757 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
1758 if actual := rule.Args["certificates"]; actual != expected {
1759 t.Errorf("certificates should be %q, not %q", expected, actual)
1760 }
1761 })
1762 t.Run("override when unspecified", func(t *testing.T) {
1763 ctx, _ := testApex(t, `
1764 apex {
1765 name: "myapex_keytest",
1766 key: "myapex.key",
1767 file_contexts: ":myapex-file_contexts",
1768 }
1769 apex_key {
1770 name: "myapex.key",
1771 public_key: "testkey.avbpubkey",
1772 private_key: "testkey.pem",
1773 }
1774 android_app_certificate {
1775 name: "myapex.certificate.override",
1776 certificate: "testkey.override",
1777 }`)
1778 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
1779 expected := "testkey.override.x509.pem testkey.override.pk8"
1780 if actual := rule.Args["certificates"]; actual != expected {
1781 t.Errorf("certificates should be %q, not %q", expected, actual)
1782 }
1783 })
1784 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
1785 ctx, _ := testApex(t, `
1786 apex {
1787 name: "myapex",
1788 key: "myapex.key",
1789 certificate: ":myapex.certificate",
1790 }
1791 apex_key {
1792 name: "myapex.key",
1793 public_key: "testkey.avbpubkey",
1794 private_key: "testkey.pem",
1795 }
1796 android_app_certificate {
1797 name: "myapex.certificate",
1798 certificate: "testkey",
1799 }`)
1800 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
1801 expected := "testkey.x509.pem testkey.pk8"
1802 if actual := rule.Args["certificates"]; actual != expected {
1803 t.Errorf("certificates should be %q, not %q", expected, actual)
1804 }
1805 })
1806 t.Run("override when specifiec as <:module>", func(t *testing.T) {
1807 ctx, _ := testApex(t, `
1808 apex {
1809 name: "myapex_keytest",
1810 key: "myapex.key",
1811 file_contexts: ":myapex-file_contexts",
1812 certificate: ":myapex.certificate",
1813 }
1814 apex_key {
1815 name: "myapex.key",
1816 public_key: "testkey.avbpubkey",
1817 private_key: "testkey.pem",
1818 }
1819 android_app_certificate {
1820 name: "myapex.certificate.override",
1821 certificate: "testkey.override",
1822 }`)
1823 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
1824 expected := "testkey.override.x509.pem testkey.override.pk8"
1825 if actual := rule.Args["certificates"]; actual != expected {
1826 t.Errorf("certificates should be %q, not %q", expected, actual)
1827 }
1828 })
1829 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
1830 ctx, _ := testApex(t, `
1831 apex {
1832 name: "myapex",
1833 key: "myapex.key",
1834 certificate: "testkey",
1835 }
1836 apex_key {
1837 name: "myapex.key",
1838 public_key: "testkey.avbpubkey",
1839 private_key: "testkey.pem",
1840 }`)
1841 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
1842 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
1843 if actual := rule.Args["certificates"]; actual != expected {
1844 t.Errorf("certificates should be %q, not %q", expected, actual)
1845 }
1846 })
1847 t.Run("override when specified as <name>", func(t *testing.T) {
1848 ctx, _ := testApex(t, `
1849 apex {
1850 name: "myapex_keytest",
1851 key: "myapex.key",
1852 file_contexts: ":myapex-file_contexts",
1853 certificate: "testkey",
1854 }
1855 apex_key {
1856 name: "myapex.key",
1857 public_key: "testkey.avbpubkey",
1858 private_key: "testkey.pem",
1859 }
1860 android_app_certificate {
1861 name: "myapex.certificate.override",
1862 certificate: "testkey.override",
1863 }`)
1864 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
1865 expected := "testkey.override.x509.pem testkey.override.pk8"
1866 if actual := rule.Args["certificates"]; actual != expected {
1867 t.Errorf("certificates should be %q, not %q", expected, actual)
1868 }
1869 })
1870}
1871
Jiyong Park58e364a2019-01-19 19:24:06 +09001872func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001873 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09001874 apex {
1875 name: "myapex",
1876 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09001877 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09001878 }
1879
1880 apex {
1881 name: "otherapex",
1882 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09001883 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09001884 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09001885 }
1886
1887 apex_key {
1888 name: "myapex.key",
1889 public_key: "testkey.avbpubkey",
1890 private_key: "testkey.pem",
1891 }
1892
1893 cc_library {
1894 name: "mylib",
1895 srcs: ["mylib.cpp"],
1896 system_shared_libs: [],
1897 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001898 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001899 "myapex",
1900 "otherapex",
1901 ],
Jooyung Han24282772020-03-21 23:20:55 +09001902 recovery_available: true,
Jiyong Park58e364a2019-01-19 19:24:06 +09001903 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09001904 cc_library {
1905 name: "mylib2",
1906 srcs: ["mylib.cpp"],
1907 system_shared_libs: [],
1908 stl: "none",
1909 apex_available: [
1910 "myapex",
1911 "otherapex",
1912 ],
1913 use_apex_name_macro: true,
1914 }
Jiyong Park58e364a2019-01-19 19:24:06 +09001915 `)
1916
Jooyung Hanc87a0592020-03-02 17:44:33 +09001917 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08001918 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09001919 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09001920 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09001921
Jooyung Hanccce2f22020-03-07 03:45:53 +09001922 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09001923 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1924 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09001925 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09001926 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09001927
Jooyung Hanccce2f22020-03-07 03:45:53 +09001928 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09001929 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
1930 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09001931 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09001932 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09001933
Jooyung Hanc87a0592020-03-02 17:44:33 +09001934 // When cc_library sets use_apex_name_macro: true
1935 // apex variants define additional macro to distinguish which apex variant it is built for
1936
1937 // non-APEX variant does not have __ANDROID_APEX__ defined
1938 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1939 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
1940
1941 // APEX variant has __ANDROID_APEX__ defined
1942 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09001943 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09001944 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
1945 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09001946
Jooyung Hanc87a0592020-03-02 17:44:33 +09001947 // APEX variant has __ANDROID_APEX__ defined
1948 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09001949 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09001950 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
1951 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09001952
1953 // recovery variant does not set __ANDROID_SDK_VERSION__
1954 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1955 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
1956 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09001957}
Jiyong Park7e636d02019-01-28 16:16:54 +09001958
1959func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001960 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09001961 apex {
1962 name: "myapex",
1963 key: "myapex.key",
1964 native_shared_libs: ["mylib"],
1965 }
1966
1967 apex_key {
1968 name: "myapex.key",
1969 public_key: "testkey.avbpubkey",
1970 private_key: "testkey.pem",
1971 }
1972
1973 cc_library_headers {
1974 name: "mylib_headers",
1975 export_include_dirs: ["my_include"],
1976 system_shared_libs: [],
1977 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09001978 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09001979 }
1980
1981 cc_library {
1982 name: "mylib",
1983 srcs: ["mylib.cpp"],
1984 system_shared_libs: [],
1985 stl: "none",
1986 header_libs: ["mylib_headers"],
1987 export_header_lib_headers: ["mylib_headers"],
1988 stubs: {
1989 versions: ["1", "2", "3"],
1990 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001991 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09001992 }
1993
1994 cc_library {
1995 name: "otherlib",
1996 srcs: ["mylib.cpp"],
1997 system_shared_libs: [],
1998 stl: "none",
1999 shared_libs: ["mylib"],
2000 }
2001 `)
2002
Colin Cross7113d202019-11-20 16:39:12 -08002003 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002004
2005 // Ensure that the include path of the header lib is exported to 'otherlib'
2006 ensureContains(t, cFlags, "-Imy_include")
2007}
Alex Light9670d332019-01-29 18:07:33 -08002008
Jiyong Park7cd10e32020-01-14 09:22:18 +09002009type fileInApex struct {
2010 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002011 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002012 isLink bool
2013}
2014
Jooyung Hana57af4a2020-01-23 05:36:59 +00002015func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002016 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002017 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002018 copyCmds := apexRule.Args["copy_commands"]
2019 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002020 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002021 for _, cmd := range strings.Split(copyCmds, "&&") {
2022 cmd = strings.TrimSpace(cmd)
2023 if cmd == "" {
2024 continue
2025 }
2026 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002027 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002028 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002029 switch terms[0] {
2030 case "mkdir":
2031 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002032 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002033 t.Fatal("copyCmds contains invalid cp command", cmd)
2034 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002035 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002036 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002037 isLink = false
2038 case "ln":
2039 if len(terms) != 3 && len(terms) != 4 {
2040 // ln LINK TARGET or ln -s LINK TARGET
2041 t.Fatal("copyCmds contains invalid ln command", cmd)
2042 }
2043 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002044 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002045 isLink = true
2046 default:
2047 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2048 }
2049 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002050 index := strings.Index(dst, imageApexDir)
2051 if index == -1 {
2052 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2053 }
2054 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002055 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002056 }
2057 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002058 return ret
2059}
2060
Jooyung Hana57af4a2020-01-23 05:36:59 +00002061func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2062 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002063 var failed bool
2064 var surplus []string
2065 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002066 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002067 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002068 for _, expected := range files {
2069 if matched, _ := path.Match(expected, file.path); matched {
2070 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002071 mactchFound = true
2072 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002073 }
2074 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002075 if !mactchFound {
2076 surplus = append(surplus, file.path)
2077 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002078 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002079
Jooyung Han31c470b2019-10-18 16:26:59 +09002080 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002081 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002082 t.Log("surplus files", surplus)
2083 failed = true
2084 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002085
2086 if len(files) > len(filesMatched) {
2087 var missing []string
2088 for _, expected := range files {
2089 if !filesMatched[expected] {
2090 missing = append(missing, expected)
2091 }
2092 }
2093 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002094 t.Log("missing files", missing)
2095 failed = true
2096 }
2097 if failed {
2098 t.Fail()
2099 }
2100}
2101
Jooyung Han344d5432019-08-23 11:17:39 +09002102func TestVndkApexCurrent(t *testing.T) {
2103 ctx, _ := testApex(t, `
2104 apex_vndk {
2105 name: "myapex",
2106 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002107 }
2108
2109 apex_key {
2110 name: "myapex.key",
2111 public_key: "testkey.avbpubkey",
2112 private_key: "testkey.pem",
2113 }
2114
2115 cc_library {
2116 name: "libvndk",
2117 srcs: ["mylib.cpp"],
2118 vendor_available: true,
2119 vndk: {
2120 enabled: true,
2121 },
2122 system_shared_libs: [],
2123 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002124 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002125 }
2126
2127 cc_library {
2128 name: "libvndksp",
2129 srcs: ["mylib.cpp"],
2130 vendor_available: true,
2131 vndk: {
2132 enabled: true,
2133 support_system_process: true,
2134 },
2135 system_shared_libs: [],
2136 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002137 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002138 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002139 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002140
Jooyung Hana57af4a2020-01-23 05:36:59 +00002141 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002142 "lib/libvndk.so",
2143 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002144 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002145 "lib64/libvndk.so",
2146 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002147 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002148 "etc/llndk.libraries.VER.txt",
2149 "etc/vndkcore.libraries.VER.txt",
2150 "etc/vndksp.libraries.VER.txt",
2151 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002152 })
Jooyung Han344d5432019-08-23 11:17:39 +09002153}
2154
2155func TestVndkApexWithPrebuilt(t *testing.T) {
2156 ctx, _ := testApex(t, `
2157 apex_vndk {
2158 name: "myapex",
2159 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002160 }
2161
2162 apex_key {
2163 name: "myapex.key",
2164 public_key: "testkey.avbpubkey",
2165 private_key: "testkey.pem",
2166 }
2167
2168 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002169 name: "libvndk",
2170 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002171 vendor_available: true,
2172 vndk: {
2173 enabled: true,
2174 },
2175 system_shared_libs: [],
2176 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002177 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002178 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002179
2180 cc_prebuilt_library_shared {
2181 name: "libvndk.arm",
2182 srcs: ["libvndk.arm.so"],
2183 vendor_available: true,
2184 vndk: {
2185 enabled: true,
2186 },
2187 enabled: false,
2188 arch: {
2189 arm: {
2190 enabled: true,
2191 },
2192 },
2193 system_shared_libs: [],
2194 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002195 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002196 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002197 `+vndkLibrariesTxtFiles("current"),
2198 withFiles(map[string][]byte{
2199 "libvndk.so": nil,
2200 "libvndk.arm.so": nil,
2201 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002202
Jooyung Hana57af4a2020-01-23 05:36:59 +00002203 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002204 "lib/libvndk.so",
2205 "lib/libvndk.arm.so",
2206 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002207 "lib/libc++.so",
2208 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002209 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002210 })
Jooyung Han344d5432019-08-23 11:17:39 +09002211}
2212
Jooyung Han39edb6c2019-11-06 16:53:07 +09002213func vndkLibrariesTxtFiles(vers ...string) (result string) {
2214 for _, v := range vers {
2215 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002216 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002217 result += `
2218 vndk_libraries_txt {
2219 name: "` + txt + `.libraries.txt",
2220 }
2221 `
2222 }
2223 } else {
2224 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2225 result += `
2226 prebuilt_etc {
2227 name: "` + txt + `.libraries.` + v + `.txt",
2228 src: "dummy.txt",
2229 }
2230 `
2231 }
2232 }
2233 }
2234 return
2235}
2236
Jooyung Han344d5432019-08-23 11:17:39 +09002237func TestVndkApexVersion(t *testing.T) {
2238 ctx, _ := testApex(t, `
2239 apex_vndk {
2240 name: "myapex_v27",
2241 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002242 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002243 vndk_version: "27",
2244 }
2245
2246 apex_key {
2247 name: "myapex.key",
2248 public_key: "testkey.avbpubkey",
2249 private_key: "testkey.pem",
2250 }
2251
Jooyung Han31c470b2019-10-18 16:26:59 +09002252 vndk_prebuilt_shared {
2253 name: "libvndk27",
2254 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002255 vendor_available: true,
2256 vndk: {
2257 enabled: true,
2258 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002259 target_arch: "arm64",
2260 arch: {
2261 arm: {
2262 srcs: ["libvndk27_arm.so"],
2263 },
2264 arm64: {
2265 srcs: ["libvndk27_arm64.so"],
2266 },
2267 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002268 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002269 }
2270
2271 vndk_prebuilt_shared {
2272 name: "libvndk27",
2273 version: "27",
2274 vendor_available: true,
2275 vndk: {
2276 enabled: true,
2277 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002278 target_arch: "x86_64",
2279 arch: {
2280 x86: {
2281 srcs: ["libvndk27_x86.so"],
2282 },
2283 x86_64: {
2284 srcs: ["libvndk27_x86_64.so"],
2285 },
2286 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09002287 }
2288 `+vndkLibrariesTxtFiles("27"),
2289 withFiles(map[string][]byte{
2290 "libvndk27_arm.so": nil,
2291 "libvndk27_arm64.so": nil,
2292 "libvndk27_x86.so": nil,
2293 "libvndk27_x86_64.so": nil,
2294 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002295
Jooyung Hana57af4a2020-01-23 05:36:59 +00002296 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002297 "lib/libvndk27_arm.so",
2298 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002299 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002300 })
Jooyung Han344d5432019-08-23 11:17:39 +09002301}
2302
2303func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
2304 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
2305 apex_vndk {
2306 name: "myapex_v27",
2307 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002308 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002309 vndk_version: "27",
2310 }
2311 apex_vndk {
2312 name: "myapex_v27_other",
2313 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002314 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002315 vndk_version: "27",
2316 }
2317
2318 apex_key {
2319 name: "myapex.key",
2320 public_key: "testkey.avbpubkey",
2321 private_key: "testkey.pem",
2322 }
2323
2324 cc_library {
2325 name: "libvndk",
2326 srcs: ["mylib.cpp"],
2327 vendor_available: true,
2328 vndk: {
2329 enabled: true,
2330 },
2331 system_shared_libs: [],
2332 stl: "none",
2333 }
2334
2335 vndk_prebuilt_shared {
2336 name: "libvndk",
2337 version: "27",
2338 vendor_available: true,
2339 vndk: {
2340 enabled: true,
2341 },
2342 srcs: ["libvndk.so"],
2343 }
2344 `, withFiles(map[string][]byte{
2345 "libvndk.so": nil,
2346 }))
2347}
2348
Jooyung Han90eee022019-10-01 20:02:42 +09002349func TestVndkApexNameRule(t *testing.T) {
2350 ctx, _ := testApex(t, `
2351 apex_vndk {
2352 name: "myapex",
2353 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002354 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002355 }
2356 apex_vndk {
2357 name: "myapex_v28",
2358 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002359 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002360 vndk_version: "28",
2361 }
2362 apex_key {
2363 name: "myapex.key",
2364 public_key: "testkey.avbpubkey",
2365 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002366 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09002367
2368 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00002369 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09002370 actual := proptools.String(bundle.properties.Apex_name)
2371 if !reflect.DeepEqual(actual, expected) {
2372 t.Errorf("Got '%v', expected '%v'", actual, expected)
2373 }
2374 }
2375
2376 assertApexName("com.android.vndk.vVER", "myapex")
2377 assertApexName("com.android.vndk.v28", "myapex_v28")
2378}
2379
Jooyung Han344d5432019-08-23 11:17:39 +09002380func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
2381 ctx, _ := testApex(t, `
2382 apex_vndk {
2383 name: "myapex",
2384 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002385 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002386 }
2387
2388 apex_key {
2389 name: "myapex.key",
2390 public_key: "testkey.avbpubkey",
2391 private_key: "testkey.pem",
2392 }
2393
2394 cc_library {
2395 name: "libvndk",
2396 srcs: ["mylib.cpp"],
2397 vendor_available: true,
2398 native_bridge_supported: true,
2399 host_supported: true,
2400 vndk: {
2401 enabled: true,
2402 },
2403 system_shared_libs: [],
2404 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002405 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002406 }
Jooyung Han35155c42020-02-06 17:33:20 +09002407 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09002408
Jooyung Hana57af4a2020-01-23 05:36:59 +00002409 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002410 "lib/libvndk.so",
2411 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002412 "lib/libc++.so",
2413 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002414 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002415 })
Jooyung Han344d5432019-08-23 11:17:39 +09002416}
2417
2418func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
2419 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
2420 apex_vndk {
2421 name: "myapex",
2422 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002423 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002424 native_bridge_supported: true,
2425 }
2426
2427 apex_key {
2428 name: "myapex.key",
2429 public_key: "testkey.avbpubkey",
2430 private_key: "testkey.pem",
2431 }
2432
2433 cc_library {
2434 name: "libvndk",
2435 srcs: ["mylib.cpp"],
2436 vendor_available: true,
2437 native_bridge_supported: true,
2438 host_supported: true,
2439 vndk: {
2440 enabled: true,
2441 },
2442 system_shared_libs: [],
2443 stl: "none",
2444 }
2445 `)
2446}
2447
Jooyung Han31c470b2019-10-18 16:26:59 +09002448func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002449 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09002450 apex_vndk {
2451 name: "myapex_v27",
2452 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002453 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09002454 vndk_version: "27",
2455 }
2456
2457 apex_key {
2458 name: "myapex.key",
2459 public_key: "testkey.avbpubkey",
2460 private_key: "testkey.pem",
2461 }
2462
2463 vndk_prebuilt_shared {
2464 name: "libvndk27",
2465 version: "27",
2466 target_arch: "arm",
2467 vendor_available: true,
2468 vndk: {
2469 enabled: true,
2470 },
2471 arch: {
2472 arm: {
2473 srcs: ["libvndk27.so"],
2474 }
2475 },
2476 }
2477
2478 vndk_prebuilt_shared {
2479 name: "libvndk27",
2480 version: "27",
2481 target_arch: "arm",
2482 binder32bit: true,
2483 vendor_available: true,
2484 vndk: {
2485 enabled: true,
2486 },
2487 arch: {
2488 arm: {
2489 srcs: ["libvndk27binder32.so"],
2490 }
2491 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002492 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002493 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002494 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09002495 withFiles(map[string][]byte{
2496 "libvndk27.so": nil,
2497 "libvndk27binder32.so": nil,
2498 }),
2499 withBinder32bit,
2500 withTargets(map[android.OsType][]android.Target{
2501 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09002502 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
2503 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09002504 },
2505 }),
2506 )
2507
Jooyung Hana57af4a2020-01-23 05:36:59 +00002508 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002509 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002510 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002511 })
2512}
2513
Jooyung Hane1633032019-08-01 17:41:43 +09002514func TestDependenciesInApexManifest(t *testing.T) {
2515 ctx, _ := testApex(t, `
2516 apex {
2517 name: "myapex_nodep",
2518 key: "myapex.key",
2519 native_shared_libs: ["lib_nodep"],
2520 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002521 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002522 }
2523
2524 apex {
2525 name: "myapex_dep",
2526 key: "myapex.key",
2527 native_shared_libs: ["lib_dep"],
2528 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002529 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002530 }
2531
2532 apex {
2533 name: "myapex_provider",
2534 key: "myapex.key",
2535 native_shared_libs: ["libfoo"],
2536 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002537 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002538 }
2539
2540 apex {
2541 name: "myapex_selfcontained",
2542 key: "myapex.key",
2543 native_shared_libs: ["lib_dep", "libfoo"],
2544 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002545 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002546 }
2547
2548 apex_key {
2549 name: "myapex.key",
2550 public_key: "testkey.avbpubkey",
2551 private_key: "testkey.pem",
2552 }
2553
2554 cc_library {
2555 name: "lib_nodep",
2556 srcs: ["mylib.cpp"],
2557 system_shared_libs: [],
2558 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002559 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09002560 }
2561
2562 cc_library {
2563 name: "lib_dep",
2564 srcs: ["mylib.cpp"],
2565 shared_libs: ["libfoo"],
2566 system_shared_libs: [],
2567 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002568 apex_available: [
2569 "myapex_dep",
2570 "myapex_provider",
2571 "myapex_selfcontained",
2572 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002573 }
2574
2575 cc_library {
2576 name: "libfoo",
2577 srcs: ["mytest.cpp"],
2578 stubs: {
2579 versions: ["1"],
2580 },
2581 system_shared_libs: [],
2582 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002583 apex_available: [
2584 "myapex_provider",
2585 "myapex_selfcontained",
2586 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002587 }
2588 `)
2589
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002590 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09002591 var provideNativeLibs, requireNativeLibs []string
2592
Sundong Ahnabb64432019-10-22 13:58:29 +09002593 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002594 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2595 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002596 ensureListEmpty(t, provideNativeLibs)
2597 ensureListEmpty(t, requireNativeLibs)
2598
Sundong Ahnabb64432019-10-22 13:58:29 +09002599 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002600 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2601 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002602 ensureListEmpty(t, provideNativeLibs)
2603 ensureListContains(t, requireNativeLibs, "libfoo.so")
2604
Sundong Ahnabb64432019-10-22 13:58:29 +09002605 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002606 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2607 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002608 ensureListContains(t, provideNativeLibs, "libfoo.so")
2609 ensureListEmpty(t, requireNativeLibs)
2610
Sundong Ahnabb64432019-10-22 13:58:29 +09002611 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002612 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2613 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002614 ensureListContains(t, provideNativeLibs, "libfoo.so")
2615 ensureListEmpty(t, requireNativeLibs)
2616}
2617
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002618func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09002619 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002620 apex {
2621 name: "myapex",
2622 key: "myapex.key",
2623 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09002624 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002625 }
2626
2627 apex_key {
2628 name: "myapex.key",
2629 public_key: "testkey.avbpubkey",
2630 private_key: "testkey.pem",
2631 }
Jiyong Parkdb334862020-02-05 17:19:28 +09002632
2633 cc_library {
2634 name: "mylib",
2635 srcs: ["mylib.cpp"],
2636 system_shared_libs: [],
2637 stl: "none",
2638 apex_available: [
2639 "//apex_available:platform",
2640 "myapex",
2641 ],
2642 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002643 `)
2644
Sundong Ahnabb64432019-10-22 13:58:29 +09002645 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002646 apexManifestRule := module.Rule("apexManifestRule")
2647 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
2648 apexRule := module.Rule("apexRule")
2649 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09002650
2651 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2652 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2653 name := apexBundle.BaseModuleName()
2654 prefix := "TARGET_"
2655 var builder strings.Builder
2656 data.Custom(&builder, name, prefix, "", data)
2657 androidMk := builder.String()
2658 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
2659 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002660}
2661
Alex Light0851b882019-02-07 13:20:53 -08002662func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002663 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002664 apex {
2665 name: "myapex",
2666 key: "myapex.key",
2667 native_shared_libs: ["mylib_common"],
2668 }
2669
2670 apex_key {
2671 name: "myapex.key",
2672 public_key: "testkey.avbpubkey",
2673 private_key: "testkey.pem",
2674 }
2675
2676 cc_library {
2677 name: "mylib_common",
2678 srcs: ["mylib.cpp"],
2679 system_shared_libs: [],
2680 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002681 apex_available: [
2682 "//apex_available:platform",
2683 "myapex",
2684 ],
Alex Light0851b882019-02-07 13:20:53 -08002685 }
2686 `)
2687
Sundong Ahnabb64432019-10-22 13:58:29 +09002688 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002689 apexRule := module.Rule("apexRule")
2690 copyCmds := apexRule.Args["copy_commands"]
2691
2692 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
2693 t.Log("Apex was a test apex!")
2694 t.Fail()
2695 }
2696 // Ensure that main rule creates an output
2697 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2698
2699 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002700 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08002701
2702 // Ensure that both direct and indirect deps are copied into apex
2703 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2704
Colin Cross7113d202019-11-20 16:39:12 -08002705 // Ensure that the platform variant ends with _shared
2706 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08002707
2708 if !android.InAnyApex("mylib_common") {
2709 t.Log("Found mylib_common not in any apex!")
2710 t.Fail()
2711 }
2712}
2713
2714func TestTestApex(t *testing.T) {
2715 if android.InAnyApex("mylib_common_test") {
2716 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!")
2717 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002718 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002719 apex_test {
2720 name: "myapex",
2721 key: "myapex.key",
2722 native_shared_libs: ["mylib_common_test"],
2723 }
2724
2725 apex_key {
2726 name: "myapex.key",
2727 public_key: "testkey.avbpubkey",
2728 private_key: "testkey.pem",
2729 }
2730
2731 cc_library {
2732 name: "mylib_common_test",
2733 srcs: ["mylib.cpp"],
2734 system_shared_libs: [],
2735 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002736 // TODO: remove //apex_available:platform
2737 apex_available: [
2738 "//apex_available:platform",
2739 "myapex",
2740 ],
Alex Light0851b882019-02-07 13:20:53 -08002741 }
2742 `)
2743
Sundong Ahnabb64432019-10-22 13:58:29 +09002744 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002745 apexRule := module.Rule("apexRule")
2746 copyCmds := apexRule.Args["copy_commands"]
2747
2748 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
2749 t.Log("Apex was not a test apex!")
2750 t.Fail()
2751 }
2752 // Ensure that main rule creates an output
2753 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2754
2755 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002756 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08002757
2758 // Ensure that both direct and indirect deps are copied into apex
2759 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
2760
Colin Cross7113d202019-11-20 16:39:12 -08002761 // Ensure that the platform variant ends with _shared
2762 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08002763}
2764
Alex Light9670d332019-01-29 18:07:33 -08002765func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002766 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08002767 apex {
2768 name: "myapex",
2769 key: "myapex.key",
2770 multilib: {
2771 first: {
2772 native_shared_libs: ["mylib_common"],
2773 }
2774 },
2775 target: {
2776 android: {
2777 multilib: {
2778 first: {
2779 native_shared_libs: ["mylib"],
2780 }
2781 }
2782 },
2783 host: {
2784 multilib: {
2785 first: {
2786 native_shared_libs: ["mylib2"],
2787 }
2788 }
2789 }
2790 }
2791 }
2792
2793 apex_key {
2794 name: "myapex.key",
2795 public_key: "testkey.avbpubkey",
2796 private_key: "testkey.pem",
2797 }
2798
2799 cc_library {
2800 name: "mylib",
2801 srcs: ["mylib.cpp"],
2802 system_shared_libs: [],
2803 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002804 // TODO: remove //apex_available:platform
2805 apex_available: [
2806 "//apex_available:platform",
2807 "myapex",
2808 ],
Alex Light9670d332019-01-29 18:07:33 -08002809 }
2810
2811 cc_library {
2812 name: "mylib_common",
2813 srcs: ["mylib.cpp"],
2814 system_shared_libs: [],
2815 stl: "none",
2816 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002817 // TODO: remove //apex_available:platform
2818 apex_available: [
2819 "//apex_available:platform",
2820 "myapex",
2821 ],
Alex Light9670d332019-01-29 18:07:33 -08002822 }
2823
2824 cc_library {
2825 name: "mylib2",
2826 srcs: ["mylib.cpp"],
2827 system_shared_libs: [],
2828 stl: "none",
2829 compile_multilib: "first",
2830 }
2831 `)
2832
Sundong Ahnabb64432019-10-22 13:58:29 +09002833 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08002834 copyCmds := apexRule.Args["copy_commands"]
2835
2836 // Ensure that main rule creates an output
2837 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2838
2839 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002840 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
2841 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
2842 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08002843
2844 // Ensure that both direct and indirect deps are copied into apex
2845 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
2846 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2847 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
2848
Colin Cross7113d202019-11-20 16:39:12 -08002849 // Ensure that the platform variant ends with _shared
2850 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
2851 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
2852 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08002853}
Jiyong Park04480cf2019-02-06 00:16:29 +09002854
2855func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002856 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09002857 apex {
2858 name: "myapex",
2859 key: "myapex.key",
2860 binaries: ["myscript"],
2861 }
2862
2863 apex_key {
2864 name: "myapex.key",
2865 public_key: "testkey.avbpubkey",
2866 private_key: "testkey.pem",
2867 }
2868
2869 sh_binary {
2870 name: "myscript",
2871 src: "mylib.cpp",
2872 filename: "myscript.sh",
2873 sub_dir: "script",
2874 }
2875 `)
2876
Sundong Ahnabb64432019-10-22 13:58:29 +09002877 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09002878 copyCmds := apexRule.Args["copy_commands"]
2879
2880 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
2881}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002882
Jooyung Han91df2082019-11-20 01:49:42 +09002883func TestApexInVariousPartition(t *testing.T) {
2884 testcases := []struct {
2885 propName, parition, flattenedPartition string
2886 }{
2887 {"", "system", "system_ext"},
2888 {"product_specific: true", "product", "product"},
2889 {"soc_specific: true", "vendor", "vendor"},
2890 {"proprietary: true", "vendor", "vendor"},
2891 {"vendor: true", "vendor", "vendor"},
2892 {"system_ext_specific: true", "system_ext", "system_ext"},
2893 }
2894 for _, tc := range testcases {
2895 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
2896 ctx, _ := testApex(t, `
2897 apex {
2898 name: "myapex",
2899 key: "myapex.key",
2900 `+tc.propName+`
2901 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002902
Jooyung Han91df2082019-11-20 01:49:42 +09002903 apex_key {
2904 name: "myapex.key",
2905 public_key: "testkey.avbpubkey",
2906 private_key: "testkey.pem",
2907 }
2908 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002909
Jooyung Han91df2082019-11-20 01:49:42 +09002910 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2911 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
2912 actual := apex.installDir.String()
2913 if actual != expected {
2914 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
2915 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002916
Jooyung Han91df2082019-11-20 01:49:42 +09002917 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
2918 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
2919 actual = flattened.installDir.String()
2920 if actual != expected {
2921 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
2922 }
2923 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002924 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002925}
Jiyong Park67882562019-03-21 01:11:21 +09002926
Jooyung Han54aca7b2019-11-20 02:26:02 +09002927func TestFileContexts(t *testing.T) {
2928 ctx, _ := testApex(t, `
2929 apex {
2930 name: "myapex",
2931 key: "myapex.key",
2932 }
2933
2934 apex_key {
2935 name: "myapex.key",
2936 public_key: "testkey.avbpubkey",
2937 private_key: "testkey.pem",
2938 }
2939 `)
2940 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
2941 apexRule := module.Rule("apexRule")
2942 actual := apexRule.Args["file_contexts"]
2943 expected := "system/sepolicy/apex/myapex-file_contexts"
2944 if actual != expected {
2945 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
2946 }
2947
2948 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
2949 apex {
2950 name: "myapex",
2951 key: "myapex.key",
2952 file_contexts: "my_own_file_contexts",
2953 }
2954
2955 apex_key {
2956 name: "myapex.key",
2957 public_key: "testkey.avbpubkey",
2958 private_key: "testkey.pem",
2959 }
2960 `, withFiles(map[string][]byte{
2961 "my_own_file_contexts": nil,
2962 }))
2963
2964 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
2965 apex {
2966 name: "myapex",
2967 key: "myapex.key",
2968 product_specific: true,
2969 file_contexts: "product_specific_file_contexts",
2970 }
2971
2972 apex_key {
2973 name: "myapex.key",
2974 public_key: "testkey.avbpubkey",
2975 private_key: "testkey.pem",
2976 }
2977 `)
2978
2979 ctx, _ = testApex(t, `
2980 apex {
2981 name: "myapex",
2982 key: "myapex.key",
2983 product_specific: true,
2984 file_contexts: "product_specific_file_contexts",
2985 }
2986
2987 apex_key {
2988 name: "myapex.key",
2989 public_key: "testkey.avbpubkey",
2990 private_key: "testkey.pem",
2991 }
2992 `, withFiles(map[string][]byte{
2993 "product_specific_file_contexts": nil,
2994 }))
2995 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
2996 apexRule = module.Rule("apexRule")
2997 actual = apexRule.Args["file_contexts"]
2998 expected = "product_specific_file_contexts"
2999 if actual != expected {
3000 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3001 }
3002
3003 ctx, _ = testApex(t, `
3004 apex {
3005 name: "myapex",
3006 key: "myapex.key",
3007 product_specific: true,
3008 file_contexts: ":my-file-contexts",
3009 }
3010
3011 apex_key {
3012 name: "myapex.key",
3013 public_key: "testkey.avbpubkey",
3014 private_key: "testkey.pem",
3015 }
3016
3017 filegroup {
3018 name: "my-file-contexts",
3019 srcs: ["product_specific_file_contexts"],
3020 }
3021 `, withFiles(map[string][]byte{
3022 "product_specific_file_contexts": nil,
3023 }))
3024 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3025 apexRule = module.Rule("apexRule")
3026 actual = apexRule.Args["file_contexts"]
3027 expected = "product_specific_file_contexts"
3028 if actual != expected {
3029 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3030 }
3031}
3032
Jiyong Park67882562019-03-21 01:11:21 +09003033func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003034 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003035 apex_key {
3036 name: "myapex.key",
3037 public_key: ":my.avbpubkey",
3038 private_key: ":my.pem",
3039 product_specific: true,
3040 }
3041
3042 filegroup {
3043 name: "my.avbpubkey",
3044 srcs: ["testkey2.avbpubkey"],
3045 }
3046
3047 filegroup {
3048 name: "my.pem",
3049 srcs: ["testkey2.pem"],
3050 }
3051 `)
3052
3053 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3054 expected_pubkey := "testkey2.avbpubkey"
3055 actual_pubkey := apex_key.public_key_file.String()
3056 if actual_pubkey != expected_pubkey {
3057 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3058 }
3059 expected_privkey := "testkey2.pem"
3060 actual_privkey := apex_key.private_key_file.String()
3061 if actual_privkey != expected_privkey {
3062 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3063 }
3064}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003065
3066func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003067 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003068 prebuilt_apex {
3069 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003070 arch: {
3071 arm64: {
3072 src: "myapex-arm64.apex",
3073 },
3074 arm: {
3075 src: "myapex-arm.apex",
3076 },
3077 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003078 }
3079 `)
3080
3081 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3082
Jiyong Parkc95714e2019-03-29 14:23:10 +09003083 expectedInput := "myapex-arm64.apex"
3084 if prebuilt.inputApex.String() != expectedInput {
3085 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3086 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003087}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003088
3089func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003090 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003091 prebuilt_apex {
3092 name: "myapex",
3093 src: "myapex-arm.apex",
3094 filename: "notmyapex.apex",
3095 }
3096 `)
3097
3098 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3099
3100 expected := "notmyapex.apex"
3101 if p.installFilename != expected {
3102 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3103 }
3104}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003105
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003106func TestPrebuiltOverrides(t *testing.T) {
3107 ctx, config := testApex(t, `
3108 prebuilt_apex {
3109 name: "myapex.prebuilt",
3110 src: "myapex-arm.apex",
3111 overrides: [
3112 "myapex",
3113 ],
3114 }
3115 `)
3116
3117 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3118
3119 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003120 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003121 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003122 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003123 }
3124}
3125
Roland Levillain630846d2019-06-26 12:48:34 +01003126func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003127 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003128 apex_test {
3129 name: "myapex",
3130 key: "myapex.key",
3131 tests: [
3132 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003133 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003134 ],
3135 }
3136
3137 apex_key {
3138 name: "myapex.key",
3139 public_key: "testkey.avbpubkey",
3140 private_key: "testkey.pem",
3141 }
3142
3143 cc_test {
3144 name: "mytest",
3145 gtest: false,
3146 srcs: ["mytest.cpp"],
3147 relative_install_path: "test",
3148 system_shared_libs: [],
3149 static_executable: true,
3150 stl: "none",
3151 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003152
3153 cc_test {
3154 name: "mytests",
3155 gtest: false,
3156 srcs: [
3157 "mytest1.cpp",
3158 "mytest2.cpp",
3159 "mytest3.cpp",
3160 ],
3161 test_per_src: true,
3162 relative_install_path: "test",
3163 system_shared_libs: [],
3164 static_executable: true,
3165 stl: "none",
3166 }
Roland Levillain630846d2019-06-26 12:48:34 +01003167 `)
3168
Sundong Ahnabb64432019-10-22 13:58:29 +09003169 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003170 copyCmds := apexRule.Args["copy_commands"]
3171
3172 // Ensure that test dep is copied into apex.
3173 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003174
3175 // Ensure that test deps built with `test_per_src` are copied into apex.
3176 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3177 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3178 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003179
3180 // Ensure the module is correctly translated.
Sundong Ahnabb64432019-10-22 13:58:29 +09003181 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Roland Levillainf89cd092019-07-29 16:22:59 +01003182 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3183 name := apexBundle.BaseModuleName()
3184 prefix := "TARGET_"
3185 var builder strings.Builder
3186 data.Custom(&builder, name, prefix, "", data)
3187 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003188 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3189 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3190 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3191 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003192 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003193 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003194 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003195}
3196
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003197func TestInstallExtraFlattenedApexes(t *testing.T) {
3198 ctx, config := testApex(t, `
3199 apex {
3200 name: "myapex",
3201 key: "myapex.key",
3202 }
3203 apex_key {
3204 name: "myapex.key",
3205 public_key: "testkey.avbpubkey",
3206 private_key: "testkey.pem",
3207 }
3208 `, func(fs map[string][]byte, config android.Config) {
3209 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3210 })
3211 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003212 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003213 mk := android.AndroidMkDataForTest(t, config, "", ab)
3214 var builder strings.Builder
3215 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3216 androidMk := builder.String()
3217 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3218}
3219
Jooyung Han5c998b92019-06-27 11:30:33 +09003220func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003221 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003222 apex {
3223 name: "myapex",
3224 key: "myapex.key",
3225 native_shared_libs: ["mylib"],
3226 uses: ["commonapex"],
3227 }
3228
3229 apex {
3230 name: "commonapex",
3231 key: "myapex.key",
3232 native_shared_libs: ["libcommon"],
3233 provide_cpp_shared_libs: true,
3234 }
3235
3236 apex_key {
3237 name: "myapex.key",
3238 public_key: "testkey.avbpubkey",
3239 private_key: "testkey.pem",
3240 }
3241
3242 cc_library {
3243 name: "mylib",
3244 srcs: ["mylib.cpp"],
3245 shared_libs: ["libcommon"],
3246 system_shared_libs: [],
3247 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003248 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003249 }
3250
3251 cc_library {
3252 name: "libcommon",
3253 srcs: ["mylib_common.cpp"],
3254 system_shared_libs: [],
3255 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003256 // TODO: remove //apex_available:platform
3257 apex_available: [
3258 "//apex_available:platform",
3259 "commonapex",
3260 "myapex",
3261 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003262 }
3263 `)
3264
Sundong Ahnabb64432019-10-22 13:58:29 +09003265 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003266 apexRule1 := module1.Rule("apexRule")
3267 copyCmds1 := apexRule1.Args["copy_commands"]
3268
Sundong Ahnabb64432019-10-22 13:58:29 +09003269 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003270 apexRule2 := module2.Rule("apexRule")
3271 copyCmds2 := apexRule2.Args["copy_commands"]
3272
Colin Cross7113d202019-11-20 16:39:12 -08003273 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3274 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09003275 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
3276 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
3277 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
3278}
3279
3280func TestApexUsesFailsIfNotProvided(t *testing.T) {
3281 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
3282 apex {
3283 name: "myapex",
3284 key: "myapex.key",
3285 uses: ["commonapex"],
3286 }
3287
3288 apex {
3289 name: "commonapex",
3290 key: "myapex.key",
3291 }
3292
3293 apex_key {
3294 name: "myapex.key",
3295 public_key: "testkey.avbpubkey",
3296 private_key: "testkey.pem",
3297 }
3298 `)
3299 testApexError(t, `uses: "commonapex" is not a provider`, `
3300 apex {
3301 name: "myapex",
3302 key: "myapex.key",
3303 uses: ["commonapex"],
3304 }
3305
3306 cc_library {
3307 name: "commonapex",
3308 system_shared_libs: [],
3309 stl: "none",
3310 }
3311
3312 apex_key {
3313 name: "myapex.key",
3314 public_key: "testkey.avbpubkey",
3315 private_key: "testkey.pem",
3316 }
3317 `)
3318}
3319
3320func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
3321 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
3322 apex {
3323 name: "myapex",
3324 key: "myapex.key",
3325 use_vendor: true,
3326 uses: ["commonapex"],
3327 }
3328
3329 apex {
3330 name: "commonapex",
3331 key: "myapex.key",
3332 provide_cpp_shared_libs: true,
3333 }
3334
3335 apex_key {
3336 name: "myapex.key",
3337 public_key: "testkey.avbpubkey",
3338 private_key: "testkey.pem",
3339 }
Jooyung Handc782442019-11-01 03:14:38 +09003340 `, func(fs map[string][]byte, config android.Config) {
3341 setUseVendorWhitelistForTest(config, []string{"myapex"})
3342 })
Jooyung Han5c998b92019-06-27 11:30:33 +09003343}
3344
Jooyung Hand48f3c32019-08-23 11:18:57 +09003345func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
3346 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
3347 apex {
3348 name: "myapex",
3349 key: "myapex.key",
3350 native_shared_libs: ["libfoo"],
3351 }
3352
3353 apex_key {
3354 name: "myapex.key",
3355 public_key: "testkey.avbpubkey",
3356 private_key: "testkey.pem",
3357 }
3358
3359 cc_library {
3360 name: "libfoo",
3361 stl: "none",
3362 system_shared_libs: [],
3363 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003364 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003365 }
3366 `)
3367 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
3368 apex {
3369 name: "myapex",
3370 key: "myapex.key",
3371 java_libs: ["myjar"],
3372 }
3373
3374 apex_key {
3375 name: "myapex.key",
3376 public_key: "testkey.avbpubkey",
3377 private_key: "testkey.pem",
3378 }
3379
3380 java_library {
3381 name: "myjar",
3382 srcs: ["foo/bar/MyClass.java"],
3383 sdk_version: "none",
3384 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09003385 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003386 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003387 }
3388 `)
3389}
3390
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003391func TestApexWithApps(t *testing.T) {
3392 ctx, _ := testApex(t, `
3393 apex {
3394 name: "myapex",
3395 key: "myapex.key",
3396 apps: [
3397 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09003398 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003399 ],
3400 }
3401
3402 apex_key {
3403 name: "myapex.key",
3404 public_key: "testkey.avbpubkey",
3405 private_key: "testkey.pem",
3406 }
3407
3408 android_app {
3409 name: "AppFoo",
3410 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003411 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003412 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09003413 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08003414 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003415 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003416 }
Jiyong Parkf7487312019-10-17 12:54:30 +09003417
3418 android_app {
3419 name: "AppFooPriv",
3420 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003421 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09003422 system_modules: "none",
3423 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08003424 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003425 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09003426 }
Jiyong Park8be103b2019-11-08 15:53:48 +09003427
3428 cc_library_shared {
3429 name: "libjni",
3430 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003431 shared_libs: ["libfoo"],
3432 stl: "none",
3433 system_shared_libs: [],
3434 apex_available: [ "myapex" ],
3435 sdk_version: "current",
3436 }
3437
3438 cc_library_shared {
3439 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09003440 stl: "none",
3441 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09003442 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08003443 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09003444 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003445 `)
3446
Sundong Ahnabb64432019-10-22 13:58:29 +09003447 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003448 apexRule := module.Rule("apexRule")
3449 copyCmds := apexRule.Args["copy_commands"]
3450
3451 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09003452 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003453
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003454 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
3455 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09003456 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003457 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003458 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003459 // JNI libraries including transitive deps are
3460 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00003461 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003462 // ... embedded inside APK (jnilibs.zip)
3463 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
3464 // ... and not directly inside the APEX
3465 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
3466 }
Dario Frenicde2a032019-10-27 00:29:22 +01003467}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003468
Dario Frenicde2a032019-10-27 00:29:22 +01003469func TestApexWithAppImports(t *testing.T) {
3470 ctx, _ := testApex(t, `
3471 apex {
3472 name: "myapex",
3473 key: "myapex.key",
3474 apps: [
3475 "AppFooPrebuilt",
3476 "AppFooPrivPrebuilt",
3477 ],
3478 }
3479
3480 apex_key {
3481 name: "myapex.key",
3482 public_key: "testkey.avbpubkey",
3483 private_key: "testkey.pem",
3484 }
3485
3486 android_app_import {
3487 name: "AppFooPrebuilt",
3488 apk: "PrebuiltAppFoo.apk",
3489 presigned: true,
3490 dex_preopt: {
3491 enabled: false,
3492 },
Jiyong Park592a6a42020-04-21 22:34:28 +09003493 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003494 }
3495
3496 android_app_import {
3497 name: "AppFooPrivPrebuilt",
3498 apk: "PrebuiltAppFooPriv.apk",
3499 privileged: true,
3500 presigned: true,
3501 dex_preopt: {
3502 enabled: false,
3503 },
Jooyung Han39ee1192020-03-23 20:21:11 +09003504 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09003505 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003506 }
3507 `)
3508
Sundong Ahnabb64432019-10-22 13:58:29 +09003509 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01003510 apexRule := module.Rule("apexRule")
3511 copyCmds := apexRule.Args["copy_commands"]
3512
3513 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09003514 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
3515}
3516
3517func TestApexWithAppImportsPrefer(t *testing.T) {
3518 ctx, _ := testApex(t, `
3519 apex {
3520 name: "myapex",
3521 key: "myapex.key",
3522 apps: [
3523 "AppFoo",
3524 ],
3525 }
3526
3527 apex_key {
3528 name: "myapex.key",
3529 public_key: "testkey.avbpubkey",
3530 private_key: "testkey.pem",
3531 }
3532
3533 android_app {
3534 name: "AppFoo",
3535 srcs: ["foo/bar/MyClass.java"],
3536 sdk_version: "none",
3537 system_modules: "none",
3538 apex_available: [ "myapex" ],
3539 }
3540
3541 android_app_import {
3542 name: "AppFoo",
3543 apk: "AppFooPrebuilt.apk",
3544 filename: "AppFooPrebuilt.apk",
3545 presigned: true,
3546 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09003547 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09003548 }
3549 `, withFiles(map[string][]byte{
3550 "AppFooPrebuilt.apk": nil,
3551 }))
3552
3553 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3554 "app/AppFoo/AppFooPrebuilt.apk",
3555 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003556}
3557
Dario Freni6f3937c2019-12-20 22:58:03 +00003558func TestApexWithTestHelperApp(t *testing.T) {
3559 ctx, _ := testApex(t, `
3560 apex {
3561 name: "myapex",
3562 key: "myapex.key",
3563 apps: [
3564 "TesterHelpAppFoo",
3565 ],
3566 }
3567
3568 apex_key {
3569 name: "myapex.key",
3570 public_key: "testkey.avbpubkey",
3571 private_key: "testkey.pem",
3572 }
3573
3574 android_test_helper_app {
3575 name: "TesterHelpAppFoo",
3576 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003577 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00003578 }
3579
3580 `)
3581
3582 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3583 apexRule := module.Rule("apexRule")
3584 copyCmds := apexRule.Args["copy_commands"]
3585
3586 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
3587}
3588
Jooyung Han18020ea2019-11-13 10:50:48 +09003589func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
3590 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09003591 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09003592 apex {
3593 name: "myapex",
3594 key: "myapex.key",
3595 native_shared_libs: ["libfoo"],
3596 }
3597
3598 apex_key {
3599 name: "myapex.key",
3600 public_key: "testkey.avbpubkey",
3601 private_key: "testkey.pem",
3602 }
3603
3604 apex {
3605 name: "otherapex",
3606 key: "myapex.key",
3607 native_shared_libs: ["libfoo"],
3608 }
3609
3610 cc_defaults {
3611 name: "libfoo-defaults",
3612 apex_available: ["otherapex"],
3613 }
3614
3615 cc_library {
3616 name: "libfoo",
3617 defaults: ["libfoo-defaults"],
3618 stl: "none",
3619 system_shared_libs: [],
3620 }`)
3621}
3622
Paul Duffine52e66f2020-03-30 17:54:29 +01003623func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003624 // libfoo is not available to myapex, but only to otherapex
3625 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
3626 apex {
3627 name: "myapex",
3628 key: "myapex.key",
3629 native_shared_libs: ["libfoo"],
3630 }
3631
3632 apex_key {
3633 name: "myapex.key",
3634 public_key: "testkey.avbpubkey",
3635 private_key: "testkey.pem",
3636 }
3637
3638 apex {
3639 name: "otherapex",
3640 key: "otherapex.key",
3641 native_shared_libs: ["libfoo"],
3642 }
3643
3644 apex_key {
3645 name: "otherapex.key",
3646 public_key: "testkey.avbpubkey",
3647 private_key: "testkey.pem",
3648 }
3649
3650 cc_library {
3651 name: "libfoo",
3652 stl: "none",
3653 system_shared_libs: [],
3654 apex_available: ["otherapex"],
3655 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003656}
Jiyong Park127b40b2019-09-30 16:04:35 +09003657
Paul Duffine52e66f2020-03-30 17:54:29 +01003658func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09003659 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01003660 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01003661.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003662.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003663.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003664.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003665.*via tag cc\.DependencyTag.*"shared".*
3666.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003667 apex {
3668 name: "myapex",
3669 key: "myapex.key",
3670 native_shared_libs: ["libfoo"],
3671 }
3672
3673 apex_key {
3674 name: "myapex.key",
3675 public_key: "testkey.avbpubkey",
3676 private_key: "testkey.pem",
3677 }
3678
Jiyong Park127b40b2019-09-30 16:04:35 +09003679 cc_library {
3680 name: "libfoo",
3681 stl: "none",
3682 shared_libs: ["libbar"],
3683 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09003684 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003685 }
3686
3687 cc_library {
3688 name: "libbar",
3689 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09003690 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003691 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09003692 apex_available: ["myapex"],
3693 }
3694
3695 cc_library {
3696 name: "libbaz",
3697 stl: "none",
3698 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09003699 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003700}
Jiyong Park127b40b2019-09-30 16:04:35 +09003701
Paul Duffine52e66f2020-03-30 17:54:29 +01003702func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003703 testApexError(t, "\"otherapex\" is not a valid module name", `
3704 apex {
3705 name: "myapex",
3706 key: "myapex.key",
3707 native_shared_libs: ["libfoo"],
3708 }
3709
3710 apex_key {
3711 name: "myapex.key",
3712 public_key: "testkey.avbpubkey",
3713 private_key: "testkey.pem",
3714 }
3715
3716 cc_library {
3717 name: "libfoo",
3718 stl: "none",
3719 system_shared_libs: [],
3720 apex_available: ["otherapex"],
3721 }`)
3722
Paul Duffine52e66f2020-03-30 17:54:29 +01003723 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003724 apex {
3725 name: "myapex",
3726 key: "myapex.key",
3727 native_shared_libs: ["libfoo", "libbar"],
3728 }
3729
3730 apex_key {
3731 name: "myapex.key",
3732 public_key: "testkey.avbpubkey",
3733 private_key: "testkey.pem",
3734 }
3735
3736 cc_library {
3737 name: "libfoo",
3738 stl: "none",
3739 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09003740 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003741 apex_available: ["myapex"],
3742 }
3743
3744 cc_library {
3745 name: "libbar",
3746 stl: "none",
3747 system_shared_libs: [],
3748 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09003749 }
3750
3751 cc_library {
3752 name: "libbaz",
3753 stl: "none",
3754 system_shared_libs: [],
3755 stubs: {
3756 versions: ["10", "20", "30"],
3757 },
Jiyong Park127b40b2019-09-30 16:04:35 +09003758 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003759}
Jiyong Park127b40b2019-09-30 16:04:35 +09003760
Jiyong Park89e850a2020-04-07 16:37:39 +09003761func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01003762 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003763 apex {
3764 name: "myapex",
3765 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09003766 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003767 }
3768
3769 apex_key {
3770 name: "myapex.key",
3771 public_key: "testkey.avbpubkey",
3772 private_key: "testkey.pem",
3773 }
3774
3775 cc_library {
3776 name: "libfoo",
3777 stl: "none",
3778 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09003779 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003780 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09003781 }
3782
3783 cc_library {
3784 name: "libfoo2",
3785 stl: "none",
3786 system_shared_libs: [],
3787 shared_libs: ["libbaz"],
3788 apex_available: ["//apex_available:platform"],
3789 }
3790
3791 cc_library {
3792 name: "libbar",
3793 stl: "none",
3794 system_shared_libs: [],
3795 apex_available: ["myapex"],
3796 }
3797
3798 cc_library {
3799 name: "libbaz",
3800 stl: "none",
3801 system_shared_libs: [],
3802 apex_available: ["myapex"],
3803 stubs: {
3804 versions: ["1"],
3805 },
Jiyong Park127b40b2019-09-30 16:04:35 +09003806 }`)
3807
Jiyong Park89e850a2020-04-07 16:37:39 +09003808 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
3809 // because it depends on libbar which isn't available to platform
3810 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3811 if libfoo.NotAvailableForPlatform() != true {
3812 t.Errorf("%q shouldn't be available to platform", libfoo.String())
3813 }
3814
3815 // libfoo2 however can be available to platform because it depends on libbaz which provides
3816 // stubs
3817 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3818 if libfoo2.NotAvailableForPlatform() == true {
3819 t.Errorf("%q should be available to platform", libfoo2.String())
3820 }
Paul Duffine52e66f2020-03-30 17:54:29 +01003821}
Jiyong Parka90ca002019-10-07 15:47:24 +09003822
Paul Duffine52e66f2020-03-30 17:54:29 +01003823func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09003824 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09003825 apex {
3826 name: "myapex",
3827 key: "myapex.key",
3828 native_shared_libs: ["libfoo"],
3829 }
3830
3831 apex_key {
3832 name: "myapex.key",
3833 public_key: "testkey.avbpubkey",
3834 private_key: "testkey.pem",
3835 }
3836
3837 cc_library {
3838 name: "libfoo",
3839 stl: "none",
3840 system_shared_libs: [],
3841 apex_available: ["myapex"],
3842 static: {
3843 apex_available: ["//apex_available:platform"],
3844 },
3845 }`)
3846
Jiyong Park89e850a2020-04-07 16:37:39 +09003847 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3848 if libfooShared.NotAvailableForPlatform() != true {
3849 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
3850 }
3851 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
3852 if libfooStatic.NotAvailableForPlatform() != false {
3853 t.Errorf("%q should be available to platform", libfooStatic.String())
3854 }
Jiyong Park127b40b2019-09-30 16:04:35 +09003855}
3856
Jiyong Park5d790c32019-11-15 18:40:32 +09003857func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003858 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09003859 apex {
3860 name: "myapex",
3861 key: "myapex.key",
3862 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003863 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09003864 }
3865
3866 override_apex {
3867 name: "override_myapex",
3868 base: "myapex",
3869 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003870 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08003871 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07003872 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09003873 }
3874
3875 apex_key {
3876 name: "myapex.key",
3877 public_key: "testkey.avbpubkey",
3878 private_key: "testkey.pem",
3879 }
3880
3881 android_app {
3882 name: "app",
3883 srcs: ["foo/bar/MyClass.java"],
3884 package_name: "foo",
3885 sdk_version: "none",
3886 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003887 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09003888 }
3889
3890 override_android_app {
3891 name: "override_app",
3892 base: "app",
3893 package_name: "bar",
3894 }
Jiyong Park20bacab2020-03-03 11:45:41 +09003895 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09003896
Jiyong Park317645e2019-12-05 13:20:58 +09003897 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
3898 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
3899 if originalVariant.GetOverriddenBy() != "" {
3900 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
3901 }
3902 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
3903 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
3904 }
3905
Jiyong Park5d790c32019-11-15 18:40:32 +09003906 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
3907 apexRule := module.Rule("apexRule")
3908 copyCmds := apexRule.Args["copy_commands"]
3909
3910 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09003911 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003912
3913 apexBundle := module.Module().(*apexBundle)
3914 name := apexBundle.Name()
3915 if name != "override_myapex" {
3916 t.Errorf("name should be \"override_myapex\", but was %q", name)
3917 }
3918
Baligh Uddin004d7172020-02-19 21:29:28 -08003919 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
3920 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
3921 }
3922
Jiyong Park20bacab2020-03-03 11:45:41 +09003923 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07003924 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09003925
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003926 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3927 var builder strings.Builder
3928 data.Custom(&builder, name, "TARGET_", "", data)
3929 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09003930 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003931 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
3932 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003933 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003934 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09003935 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003936 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
3937 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09003938}
3939
Jooyung Han214bf372019-11-12 13:03:50 +09003940func TestLegacyAndroid10Support(t *testing.T) {
3941 ctx, _ := testApex(t, `
3942 apex {
3943 name: "myapex",
3944 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003945 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09003946 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09003947 }
3948
3949 apex_key {
3950 name: "myapex.key",
3951 public_key: "testkey.avbpubkey",
3952 private_key: "testkey.pem",
3953 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003954
3955 cc_library {
3956 name: "mylib",
3957 srcs: ["mylib.cpp"],
3958 stl: "libc++",
3959 system_shared_libs: [],
3960 apex_available: [ "myapex" ],
3961 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003962 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09003963
3964 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3965 args := module.Rule("apexRule").Args
3966 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00003967 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003968
3969 // The copies of the libraries in the apex should have one more dependency than
3970 // the ones outside the apex, namely the unwinder. Ideally we should check
3971 // the dependency names directly here but for some reason the names are blank in
3972 // this test.
3973 for _, lib := range []string{"libc++", "mylib"} {
3974 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
3975 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
3976 if len(apexImplicits) != len(nonApexImplicits)+1 {
3977 t.Errorf("%q missing unwinder dep", lib)
3978 }
3979 }
Jooyung Han214bf372019-11-12 13:03:50 +09003980}
3981
Jooyung Han58f26ab2019-12-18 15:34:32 +09003982func TestJavaSDKLibrary(t *testing.T) {
3983 ctx, _ := testApex(t, `
3984 apex {
3985 name: "myapex",
3986 key: "myapex.key",
3987 java_libs: ["foo"],
3988 }
3989
3990 apex_key {
3991 name: "myapex.key",
3992 public_key: "testkey.avbpubkey",
3993 private_key: "testkey.pem",
3994 }
3995
3996 java_sdk_library {
3997 name: "foo",
3998 srcs: ["a.java"],
3999 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004000 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004001 }
4002 `, withFiles(map[string][]byte{
4003 "api/current.txt": nil,
4004 "api/removed.txt": nil,
4005 "api/system-current.txt": nil,
4006 "api/system-removed.txt": nil,
4007 "api/test-current.txt": nil,
4008 "api/test-removed.txt": nil,
4009 }))
4010
4011 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004012 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004013 "javalib/foo.jar",
4014 "etc/permissions/foo.xml",
4015 })
4016 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004017 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4018 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004019}
4020
atrost6e126252020-01-27 17:01:16 +00004021func TestCompatConfig(t *testing.T) {
4022 ctx, _ := testApex(t, `
4023 apex {
4024 name: "myapex",
4025 key: "myapex.key",
4026 prebuilts: ["myjar-platform-compat-config"],
4027 java_libs: ["myjar"],
4028 }
4029
4030 apex_key {
4031 name: "myapex.key",
4032 public_key: "testkey.avbpubkey",
4033 private_key: "testkey.pem",
4034 }
4035
4036 platform_compat_config {
4037 name: "myjar-platform-compat-config",
4038 src: ":myjar",
4039 }
4040
4041 java_library {
4042 name: "myjar",
4043 srcs: ["foo/bar/MyClass.java"],
4044 sdk_version: "none",
4045 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004046 apex_available: [ "myapex" ],
4047 }
4048 `)
4049 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4050 "etc/compatconfig/myjar-platform-compat-config.xml",
4051 "javalib/myjar.jar",
4052 })
4053}
4054
Jiyong Park479321d2019-12-16 11:47:12 +09004055func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4056 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4057 apex {
4058 name: "myapex",
4059 key: "myapex.key",
4060 java_libs: ["myjar"],
4061 }
4062
4063 apex_key {
4064 name: "myapex.key",
4065 public_key: "testkey.avbpubkey",
4066 private_key: "testkey.pem",
4067 }
4068
4069 java_library {
4070 name: "myjar",
4071 srcs: ["foo/bar/MyClass.java"],
4072 sdk_version: "none",
4073 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09004074 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004075 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09004076 }
4077 `)
4078}
4079
Jiyong Park7afd1072019-12-30 16:56:33 +09004080func TestCarryRequiredModuleNames(t *testing.T) {
4081 ctx, config := testApex(t, `
4082 apex {
4083 name: "myapex",
4084 key: "myapex.key",
4085 native_shared_libs: ["mylib"],
4086 }
4087
4088 apex_key {
4089 name: "myapex.key",
4090 public_key: "testkey.avbpubkey",
4091 private_key: "testkey.pem",
4092 }
4093
4094 cc_library {
4095 name: "mylib",
4096 srcs: ["mylib.cpp"],
4097 system_shared_libs: [],
4098 stl: "none",
4099 required: ["a", "b"],
4100 host_required: ["c", "d"],
4101 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004102 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09004103 }
4104 `)
4105
4106 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4107 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4108 name := apexBundle.BaseModuleName()
4109 prefix := "TARGET_"
4110 var builder strings.Builder
4111 data.Custom(&builder, name, prefix, "", data)
4112 androidMk := builder.String()
4113 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
4114 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
4115 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
4116}
4117
Jiyong Park7cd10e32020-01-14 09:22:18 +09004118func TestSymlinksFromApexToSystem(t *testing.T) {
4119 bp := `
4120 apex {
4121 name: "myapex",
4122 key: "myapex.key",
4123 native_shared_libs: ["mylib"],
4124 java_libs: ["myjar"],
4125 }
4126
Jiyong Park9d677202020-02-19 16:29:35 +09004127 apex {
4128 name: "myapex.updatable",
4129 key: "myapex.key",
4130 native_shared_libs: ["mylib"],
4131 java_libs: ["myjar"],
4132 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004133 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09004134 }
4135
Jiyong Park7cd10e32020-01-14 09:22:18 +09004136 apex_key {
4137 name: "myapex.key",
4138 public_key: "testkey.avbpubkey",
4139 private_key: "testkey.pem",
4140 }
4141
4142 cc_library {
4143 name: "mylib",
4144 srcs: ["mylib.cpp"],
4145 shared_libs: ["myotherlib"],
4146 system_shared_libs: [],
4147 stl: "none",
4148 apex_available: [
4149 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004150 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004151 "//apex_available:platform",
4152 ],
4153 }
4154
4155 cc_library {
4156 name: "myotherlib",
4157 srcs: ["mylib.cpp"],
4158 system_shared_libs: [],
4159 stl: "none",
4160 apex_available: [
4161 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004162 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004163 "//apex_available:platform",
4164 ],
4165 }
4166
4167 java_library {
4168 name: "myjar",
4169 srcs: ["foo/bar/MyClass.java"],
4170 sdk_version: "none",
4171 system_modules: "none",
4172 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09004173 apex_available: [
4174 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004175 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004176 "//apex_available:platform",
4177 ],
4178 }
4179
4180 java_library {
4181 name: "myotherjar",
4182 srcs: ["foo/bar/MyClass.java"],
4183 sdk_version: "none",
4184 system_modules: "none",
4185 apex_available: [
4186 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004187 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004188 "//apex_available:platform",
4189 ],
4190 }
4191 `
4192
4193 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
4194 for _, f := range files {
4195 if f.path == file {
4196 if f.isLink {
4197 t.Errorf("%q is not a real file", file)
4198 }
4199 return
4200 }
4201 }
4202 t.Errorf("%q is not found", file)
4203 }
4204
4205 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
4206 for _, f := range files {
4207 if f.path == file {
4208 if !f.isLink {
4209 t.Errorf("%q is not a symlink", file)
4210 }
4211 return
4212 }
4213 }
4214 t.Errorf("%q is not found", file)
4215 }
4216
Jiyong Park9d677202020-02-19 16:29:35 +09004217 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
4218 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09004219 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004220 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004221 ensureRealfileExists(t, files, "javalib/myjar.jar")
4222 ensureRealfileExists(t, files, "lib64/mylib.so")
4223 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4224
Jiyong Park9d677202020-02-19 16:29:35 +09004225 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4226 ensureRealfileExists(t, files, "javalib/myjar.jar")
4227 ensureRealfileExists(t, files, "lib64/mylib.so")
4228 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4229
4230 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09004231 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004232 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004233 ensureRealfileExists(t, files, "javalib/myjar.jar")
4234 ensureRealfileExists(t, files, "lib64/mylib.so")
4235 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09004236
4237 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4238 ensureRealfileExists(t, files, "javalib/myjar.jar")
4239 ensureRealfileExists(t, files, "lib64/mylib.so")
4240 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09004241}
4242
Jooyung Han643adc42020-02-27 13:50:06 +09004243func TestApexWithJniLibs(t *testing.T) {
4244 ctx, _ := testApex(t, `
4245 apex {
4246 name: "myapex",
4247 key: "myapex.key",
4248 jni_libs: ["mylib"],
4249 }
4250
4251 apex_key {
4252 name: "myapex.key",
4253 public_key: "testkey.avbpubkey",
4254 private_key: "testkey.pem",
4255 }
4256
4257 cc_library {
4258 name: "mylib",
4259 srcs: ["mylib.cpp"],
4260 shared_libs: ["mylib2"],
4261 system_shared_libs: [],
4262 stl: "none",
4263 apex_available: [ "myapex" ],
4264 }
4265
4266 cc_library {
4267 name: "mylib2",
4268 srcs: ["mylib.cpp"],
4269 system_shared_libs: [],
4270 stl: "none",
4271 apex_available: [ "myapex" ],
4272 }
4273 `)
4274
4275 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4276 // Notice mylib2.so (transitive dep) is not added as a jni_lib
4277 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
4278 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4279 "lib64/mylib.so",
4280 "lib64/mylib2.so",
4281 })
4282}
4283
Jooyung Han49f67012020-04-17 13:43:10 +09004284func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
4285 ctx, _ := testApex(t, `
4286 apex {
4287 name: "myapex",
4288 key: "myapex.key",
4289 }
4290 apex_key {
4291 name: "myapex.key",
4292 public_key: "testkey.avbpubkey",
4293 private_key: "testkey.pem",
4294 }
4295 `, func(fs map[string][]byte, config android.Config) {
4296 delete(config.Targets, android.Android)
4297 config.AndroidCommonTarget = android.Target{}
4298 })
4299
4300 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
4301 t.Errorf("Expected variants: %v, but got: %v", expected, got)
4302 }
4303}
4304
Jooyung Han643adc42020-02-27 13:50:06 +09004305func TestApexWithJniLibs_Errors(t *testing.T) {
4306 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
4307 apex {
4308 name: "myapex",
4309 key: "myapex.key",
4310 jni_libs: ["xxx"],
4311 }
4312
4313 apex_key {
4314 name: "myapex.key",
4315 public_key: "testkey.avbpubkey",
4316 private_key: "testkey.pem",
4317 }
4318
4319 prebuilt_etc {
4320 name: "xxx",
4321 src: "xxx",
4322 }
4323 `, withFiles(map[string][]byte{
4324 "xxx": nil,
4325 }))
4326}
4327
Jiyong Parkbd159612020-02-28 15:22:21 +09004328func TestAppBundle(t *testing.T) {
4329 ctx, _ := testApex(t, `
4330 apex {
4331 name: "myapex",
4332 key: "myapex.key",
4333 apps: ["AppFoo"],
4334 }
4335
4336 apex_key {
4337 name: "myapex.key",
4338 public_key: "testkey.avbpubkey",
4339 private_key: "testkey.pem",
4340 }
4341
4342 android_app {
4343 name: "AppFoo",
4344 srcs: ["foo/bar/MyClass.java"],
4345 sdk_version: "none",
4346 system_modules: "none",
4347 apex_available: [ "myapex" ],
4348 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004349 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09004350
4351 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
4352 content := bundleConfigRule.Args["content"]
4353
4354 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004355 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 +09004356}
4357
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004358func testNoUpdatableJarsInBootImage(t *testing.T, errmsg, bp string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
4359 t.Helper()
4360
4361 bp = bp + `
4362 filegroup {
4363 name: "some-updatable-apex-file_contexts",
4364 srcs: [
4365 "system/sepolicy/apex/some-updatable-apex-file_contexts",
4366 ],
4367 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004368
4369 filegroup {
4370 name: "some-non-updatable-apex-file_contexts",
4371 srcs: [
4372 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
4373 ],
4374 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004375 `
4376 bp += cc.GatherRequiredDepsForTest(android.Android)
4377 bp += java.GatherRequiredDepsForTest()
4378 bp += dexpreopt.BpToolModulesForTest()
4379
4380 fs := map[string][]byte{
4381 "a.java": nil,
4382 "a.jar": nil,
4383 "build/make/target/product/security": nil,
4384 "apex_manifest.json": nil,
4385 "AndroidManifest.xml": nil,
4386 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004387 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004388 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
4389 "framework/aidl/a.aidl": nil,
4390 }
4391 cc.GatherRequiredFilesForTest(fs)
4392
4393 ctx := android.NewTestArchContext()
4394 ctx.RegisterModuleType("apex", BundleFactory)
4395 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
4396 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
4397 cc.RegisterRequiredBuildComponentsForTest(ctx)
4398 java.RegisterJavaBuildComponents(ctx)
4399 java.RegisterSystemModulesBuildComponents(ctx)
4400 java.RegisterAppBuildComponents(ctx)
4401 java.RegisterDexpreoptBootJarsComponents(ctx)
4402 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
4403 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
4404 ctx.PreDepsMutators(RegisterPreDepsMutators)
4405 ctx.PostDepsMutators(RegisterPostDepsMutators)
4406
4407 config := android.TestArchConfig(buildDir, nil, bp, fs)
4408 ctx.Register(config)
4409
4410 _ = dexpreopt.GlobalSoongConfigForTests(config)
4411 dexpreopt.RegisterToolModulesForTest(ctx)
4412 pathCtx := android.PathContextForTesting(config)
4413 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
4414 transformDexpreoptConfig(dexpreoptConfig)
4415 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
4416
4417 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
4418 android.FailIfErrored(t, errs)
4419
4420 _, errs = ctx.PrepareBuildActions(config)
4421 if errmsg == "" {
4422 android.FailIfErrored(t, errs)
4423 } else if len(errs) > 0 {
4424 android.FailIfNoMatchingErrors(t, errmsg, errs)
4425 return
4426 } else {
4427 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
4428 }
4429}
4430
Jooyung Han548640b2020-04-27 12:10:30 +09004431func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
4432 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
4433 apex {
4434 name: "myapex",
4435 key: "myapex.key",
4436 updatable: true,
4437 }
4438
4439 apex_key {
4440 name: "myapex.key",
4441 public_key: "testkey.avbpubkey",
4442 private_key: "testkey.pem",
4443 }
4444 `)
4445}
4446
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004447func TestNoUpdatableJarsInBootImage(t *testing.T) {
4448 bp := `
4449 java_library {
4450 name: "some-updatable-apex-lib",
4451 srcs: ["a.java"],
4452 apex_available: [
4453 "some-updatable-apex",
4454 ],
4455 }
4456
4457 java_library {
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004458 name: "some-non-updatable-apex-lib",
4459 srcs: ["a.java"],
4460 apex_available: [
4461 "some-non-updatable-apex",
4462 ],
4463 }
4464
4465 java_library {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004466 name: "some-platform-lib",
4467 srcs: ["a.java"],
4468 installable: true,
4469 }
4470
4471 java_library {
4472 name: "some-art-lib",
4473 srcs: ["a.java"],
4474 apex_available: [
4475 "com.android.art.something",
4476 ],
4477 hostdex: true,
4478 }
4479
4480 apex {
4481 name: "some-updatable-apex",
4482 key: "some-updatable-apex.key",
4483 java_libs: ["some-updatable-apex-lib"],
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004484 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004485 min_sdk_version: "current",
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004486 }
4487
4488 apex {
4489 name: "some-non-updatable-apex",
4490 key: "some-non-updatable-apex.key",
4491 java_libs: ["some-non-updatable-apex-lib"],
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004492 }
4493
4494 apex_key {
4495 name: "some-updatable-apex.key",
4496 }
4497
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004498 apex_key {
4499 name: "some-non-updatable-apex.key",
4500 }
4501
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004502 apex {
4503 name: "com.android.art.something",
4504 key: "com.android.art.something.key",
4505 java_libs: ["some-art-lib"],
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004506 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004507 min_sdk_version: "current",
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004508 }
4509
4510 apex_key {
4511 name: "com.android.art.something.key",
4512 }
4513 `
4514
4515 var error string
4516 var transform func(*dexpreopt.GlobalConfig)
4517
4518 // updatable jar from ART apex in the ART boot image => ok
4519 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004520 config.ArtApexJars = []string{"com.android.art.something:some-art-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004521 }
4522 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4523
4524 // updatable jar from ART apex in the framework boot image => error
4525 error = "module 'some-art-lib' from updatable apex 'com.android.art.something' is not allowed in the framework boot image"
4526 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004527 config.BootJars = []string{"com.android.art.something:some-art-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004528 }
4529 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4530
4531 // updatable jar from some other apex in the ART boot image => error
4532 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the ART boot image"
4533 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004534 config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004535 }
4536 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4537
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004538 // non-updatable jar from some other apex in the ART boot image => error
4539 error = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
4540 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004541 config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004542 }
4543 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4544
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004545 // updatable jar from some other apex in the framework boot image => error
4546 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
4547 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004548 config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004549 }
4550 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4551
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004552 // non-updatable jar from some other apex in the framework boot image => ok
4553 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004554 config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004555 }
4556 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4557
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004558 // nonexistent jar in the ART boot image => error
4559 error = "failed to find a dex jar path for module 'nonexistent'"
4560 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004561 config.ArtApexJars = []string{"platform:nonexistent"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004562 }
4563 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4564
4565 // nonexistent jar in the framework boot image => error
4566 error = "failed to find a dex jar path for module 'nonexistent'"
4567 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004568 config.BootJars = []string{"platform:nonexistent"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004569 }
4570 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4571
4572 // platform jar in the ART boot image => error
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004573 error = "module 'some-platform-lib' is not allowed in the ART boot image"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004574 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004575 config.ArtApexJars = []string{"platform:some-platform-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004576 }
4577 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4578
4579 // platform jar in the framework boot image => ok
4580 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004581 config.BootJars = []string{"platform:some-platform-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004582 }
4583 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4584}
4585
Jiyong Park62304bb2020-04-13 16:19:48 +09004586func TestTestFor(t *testing.T) {
4587 ctx, _ := testApex(t, `
4588 apex {
4589 name: "myapex",
4590 key: "myapex.key",
4591 native_shared_libs: ["mylib", "myprivlib"],
4592 }
4593
4594 apex_key {
4595 name: "myapex.key",
4596 public_key: "testkey.avbpubkey",
4597 private_key: "testkey.pem",
4598 }
4599
4600 cc_library {
4601 name: "mylib",
4602 srcs: ["mylib.cpp"],
4603 system_shared_libs: [],
4604 stl: "none",
4605 stubs: {
4606 versions: ["1"],
4607 },
4608 apex_available: ["myapex"],
4609 }
4610
4611 cc_library {
4612 name: "myprivlib",
4613 srcs: ["mylib.cpp"],
4614 system_shared_libs: [],
4615 stl: "none",
4616 apex_available: ["myapex"],
4617 }
4618
4619
4620 cc_test {
4621 name: "mytest",
4622 gtest: false,
4623 srcs: ["mylib.cpp"],
4624 system_shared_libs: [],
4625 stl: "none",
4626 shared_libs: ["mylib", "myprivlib"],
4627 test_for: ["myapex"]
4628 }
4629 `)
4630
4631 // the test 'mytest' is a test for the apex, therefore is linked to the
4632 // actual implementation of mylib instead of its stub.
4633 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
4634 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
4635 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
4636}
4637
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004638func TestMain(m *testing.M) {
4639 run := func() int {
4640 setUp()
4641 defer tearDown()
4642
4643 return m.Run()
4644 }
4645
4646 os.Exit(run())
4647}