blob: b58363e6263e370ba736fca0b52570a28ad053b5 [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",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003148 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003149 system_shared_libs: [],
3150 static_executable: true,
3151 stl: "none",
3152 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003153
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003154 cc_library {
3155 name: "mylib",
3156 srcs: ["mylib.cpp"],
3157 system_shared_libs: [],
3158 stl: "none",
3159 }
3160
Roland Levillain9b5fde92019-06-28 15:41:19 +01003161 cc_test {
3162 name: "mytests",
3163 gtest: false,
3164 srcs: [
3165 "mytest1.cpp",
3166 "mytest2.cpp",
3167 "mytest3.cpp",
3168 ],
3169 test_per_src: true,
3170 relative_install_path: "test",
3171 system_shared_libs: [],
3172 static_executable: true,
3173 stl: "none",
3174 }
Roland Levillain630846d2019-06-26 12:48:34 +01003175 `)
3176
Sundong Ahnabb64432019-10-22 13:58:29 +09003177 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003178 copyCmds := apexRule.Args["copy_commands"]
3179
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003180 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003181 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003182 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003183
3184 // Ensure that test deps built with `test_per_src` are copied into apex.
3185 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3186 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3187 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003188
3189 // Ensure the module is correctly translated.
Sundong Ahnabb64432019-10-22 13:58:29 +09003190 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Roland Levillainf89cd092019-07-29 16:22:59 +01003191 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3192 name := apexBundle.BaseModuleName()
3193 prefix := "TARGET_"
3194 var builder strings.Builder
3195 data.Custom(&builder, name, prefix, "", data)
3196 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003197 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3198 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3199 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3200 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003201 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003202 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003203 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003204}
3205
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003206func TestInstallExtraFlattenedApexes(t *testing.T) {
3207 ctx, config := testApex(t, `
3208 apex {
3209 name: "myapex",
3210 key: "myapex.key",
3211 }
3212 apex_key {
3213 name: "myapex.key",
3214 public_key: "testkey.avbpubkey",
3215 private_key: "testkey.pem",
3216 }
3217 `, func(fs map[string][]byte, config android.Config) {
3218 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3219 })
3220 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003221 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003222 mk := android.AndroidMkDataForTest(t, config, "", ab)
3223 var builder strings.Builder
3224 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3225 androidMk := builder.String()
3226 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3227}
3228
Jooyung Han5c998b92019-06-27 11:30:33 +09003229func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003230 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003231 apex {
3232 name: "myapex",
3233 key: "myapex.key",
3234 native_shared_libs: ["mylib"],
3235 uses: ["commonapex"],
3236 }
3237
3238 apex {
3239 name: "commonapex",
3240 key: "myapex.key",
3241 native_shared_libs: ["libcommon"],
3242 provide_cpp_shared_libs: true,
3243 }
3244
3245 apex_key {
3246 name: "myapex.key",
3247 public_key: "testkey.avbpubkey",
3248 private_key: "testkey.pem",
3249 }
3250
3251 cc_library {
3252 name: "mylib",
3253 srcs: ["mylib.cpp"],
3254 shared_libs: ["libcommon"],
3255 system_shared_libs: [],
3256 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003257 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003258 }
3259
3260 cc_library {
3261 name: "libcommon",
3262 srcs: ["mylib_common.cpp"],
3263 system_shared_libs: [],
3264 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003265 // TODO: remove //apex_available:platform
3266 apex_available: [
3267 "//apex_available:platform",
3268 "commonapex",
3269 "myapex",
3270 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003271 }
3272 `)
3273
Sundong Ahnabb64432019-10-22 13:58:29 +09003274 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003275 apexRule1 := module1.Rule("apexRule")
3276 copyCmds1 := apexRule1.Args["copy_commands"]
3277
Sundong Ahnabb64432019-10-22 13:58:29 +09003278 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003279 apexRule2 := module2.Rule("apexRule")
3280 copyCmds2 := apexRule2.Args["copy_commands"]
3281
Colin Cross7113d202019-11-20 16:39:12 -08003282 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3283 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09003284 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
3285 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
3286 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
3287}
3288
3289func TestApexUsesFailsIfNotProvided(t *testing.T) {
3290 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
3291 apex {
3292 name: "myapex",
3293 key: "myapex.key",
3294 uses: ["commonapex"],
3295 }
3296
3297 apex {
3298 name: "commonapex",
3299 key: "myapex.key",
3300 }
3301
3302 apex_key {
3303 name: "myapex.key",
3304 public_key: "testkey.avbpubkey",
3305 private_key: "testkey.pem",
3306 }
3307 `)
3308 testApexError(t, `uses: "commonapex" is not a provider`, `
3309 apex {
3310 name: "myapex",
3311 key: "myapex.key",
3312 uses: ["commonapex"],
3313 }
3314
3315 cc_library {
3316 name: "commonapex",
3317 system_shared_libs: [],
3318 stl: "none",
3319 }
3320
3321 apex_key {
3322 name: "myapex.key",
3323 public_key: "testkey.avbpubkey",
3324 private_key: "testkey.pem",
3325 }
3326 `)
3327}
3328
3329func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
3330 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
3331 apex {
3332 name: "myapex",
3333 key: "myapex.key",
3334 use_vendor: true,
3335 uses: ["commonapex"],
3336 }
3337
3338 apex {
3339 name: "commonapex",
3340 key: "myapex.key",
3341 provide_cpp_shared_libs: true,
3342 }
3343
3344 apex_key {
3345 name: "myapex.key",
3346 public_key: "testkey.avbpubkey",
3347 private_key: "testkey.pem",
3348 }
Jooyung Handc782442019-11-01 03:14:38 +09003349 `, func(fs map[string][]byte, config android.Config) {
3350 setUseVendorWhitelistForTest(config, []string{"myapex"})
3351 })
Jooyung Han5c998b92019-06-27 11:30:33 +09003352}
3353
Jooyung Hand48f3c32019-08-23 11:18:57 +09003354func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
3355 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
3356 apex {
3357 name: "myapex",
3358 key: "myapex.key",
3359 native_shared_libs: ["libfoo"],
3360 }
3361
3362 apex_key {
3363 name: "myapex.key",
3364 public_key: "testkey.avbpubkey",
3365 private_key: "testkey.pem",
3366 }
3367
3368 cc_library {
3369 name: "libfoo",
3370 stl: "none",
3371 system_shared_libs: [],
3372 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003373 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003374 }
3375 `)
3376 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
3377 apex {
3378 name: "myapex",
3379 key: "myapex.key",
3380 java_libs: ["myjar"],
3381 }
3382
3383 apex_key {
3384 name: "myapex.key",
3385 public_key: "testkey.avbpubkey",
3386 private_key: "testkey.pem",
3387 }
3388
3389 java_library {
3390 name: "myjar",
3391 srcs: ["foo/bar/MyClass.java"],
3392 sdk_version: "none",
3393 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09003394 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003395 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003396 }
3397 `)
3398}
3399
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003400func TestApexWithApps(t *testing.T) {
3401 ctx, _ := testApex(t, `
3402 apex {
3403 name: "myapex",
3404 key: "myapex.key",
3405 apps: [
3406 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09003407 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003408 ],
3409 }
3410
3411 apex_key {
3412 name: "myapex.key",
3413 public_key: "testkey.avbpubkey",
3414 private_key: "testkey.pem",
3415 }
3416
3417 android_app {
3418 name: "AppFoo",
3419 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003420 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003421 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09003422 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08003423 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003424 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003425 }
Jiyong Parkf7487312019-10-17 12:54:30 +09003426
3427 android_app {
3428 name: "AppFooPriv",
3429 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003430 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09003431 system_modules: "none",
3432 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08003433 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003434 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09003435 }
Jiyong Park8be103b2019-11-08 15:53:48 +09003436
3437 cc_library_shared {
3438 name: "libjni",
3439 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003440 shared_libs: ["libfoo"],
3441 stl: "none",
3442 system_shared_libs: [],
3443 apex_available: [ "myapex" ],
3444 sdk_version: "current",
3445 }
3446
3447 cc_library_shared {
3448 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09003449 stl: "none",
3450 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09003451 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08003452 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09003453 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003454 `)
3455
Sundong Ahnabb64432019-10-22 13:58:29 +09003456 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003457 apexRule := module.Rule("apexRule")
3458 copyCmds := apexRule.Args["copy_commands"]
3459
3460 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09003461 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003462
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003463 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
3464 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09003465 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003466 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003467 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003468 // JNI libraries including transitive deps are
3469 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00003470 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003471 // ... embedded inside APK (jnilibs.zip)
3472 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
3473 // ... and not directly inside the APEX
3474 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
3475 }
Dario Frenicde2a032019-10-27 00:29:22 +01003476}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003477
Dario Frenicde2a032019-10-27 00:29:22 +01003478func TestApexWithAppImports(t *testing.T) {
3479 ctx, _ := testApex(t, `
3480 apex {
3481 name: "myapex",
3482 key: "myapex.key",
3483 apps: [
3484 "AppFooPrebuilt",
3485 "AppFooPrivPrebuilt",
3486 ],
3487 }
3488
3489 apex_key {
3490 name: "myapex.key",
3491 public_key: "testkey.avbpubkey",
3492 private_key: "testkey.pem",
3493 }
3494
3495 android_app_import {
3496 name: "AppFooPrebuilt",
3497 apk: "PrebuiltAppFoo.apk",
3498 presigned: true,
3499 dex_preopt: {
3500 enabled: false,
3501 },
Jiyong Park592a6a42020-04-21 22:34:28 +09003502 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003503 }
3504
3505 android_app_import {
3506 name: "AppFooPrivPrebuilt",
3507 apk: "PrebuiltAppFooPriv.apk",
3508 privileged: true,
3509 presigned: true,
3510 dex_preopt: {
3511 enabled: false,
3512 },
Jooyung Han39ee1192020-03-23 20:21:11 +09003513 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09003514 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003515 }
3516 `)
3517
Sundong Ahnabb64432019-10-22 13:58:29 +09003518 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01003519 apexRule := module.Rule("apexRule")
3520 copyCmds := apexRule.Args["copy_commands"]
3521
3522 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09003523 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
3524}
3525
3526func TestApexWithAppImportsPrefer(t *testing.T) {
3527 ctx, _ := testApex(t, `
3528 apex {
3529 name: "myapex",
3530 key: "myapex.key",
3531 apps: [
3532 "AppFoo",
3533 ],
3534 }
3535
3536 apex_key {
3537 name: "myapex.key",
3538 public_key: "testkey.avbpubkey",
3539 private_key: "testkey.pem",
3540 }
3541
3542 android_app {
3543 name: "AppFoo",
3544 srcs: ["foo/bar/MyClass.java"],
3545 sdk_version: "none",
3546 system_modules: "none",
3547 apex_available: [ "myapex" ],
3548 }
3549
3550 android_app_import {
3551 name: "AppFoo",
3552 apk: "AppFooPrebuilt.apk",
3553 filename: "AppFooPrebuilt.apk",
3554 presigned: true,
3555 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09003556 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09003557 }
3558 `, withFiles(map[string][]byte{
3559 "AppFooPrebuilt.apk": nil,
3560 }))
3561
3562 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3563 "app/AppFoo/AppFooPrebuilt.apk",
3564 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003565}
3566
Dario Freni6f3937c2019-12-20 22:58:03 +00003567func TestApexWithTestHelperApp(t *testing.T) {
3568 ctx, _ := testApex(t, `
3569 apex {
3570 name: "myapex",
3571 key: "myapex.key",
3572 apps: [
3573 "TesterHelpAppFoo",
3574 ],
3575 }
3576
3577 apex_key {
3578 name: "myapex.key",
3579 public_key: "testkey.avbpubkey",
3580 private_key: "testkey.pem",
3581 }
3582
3583 android_test_helper_app {
3584 name: "TesterHelpAppFoo",
3585 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003586 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00003587 }
3588
3589 `)
3590
3591 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3592 apexRule := module.Rule("apexRule")
3593 copyCmds := apexRule.Args["copy_commands"]
3594
3595 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
3596}
3597
Jooyung Han18020ea2019-11-13 10:50:48 +09003598func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
3599 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09003600 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09003601 apex {
3602 name: "myapex",
3603 key: "myapex.key",
3604 native_shared_libs: ["libfoo"],
3605 }
3606
3607 apex_key {
3608 name: "myapex.key",
3609 public_key: "testkey.avbpubkey",
3610 private_key: "testkey.pem",
3611 }
3612
3613 apex {
3614 name: "otherapex",
3615 key: "myapex.key",
3616 native_shared_libs: ["libfoo"],
3617 }
3618
3619 cc_defaults {
3620 name: "libfoo-defaults",
3621 apex_available: ["otherapex"],
3622 }
3623
3624 cc_library {
3625 name: "libfoo",
3626 defaults: ["libfoo-defaults"],
3627 stl: "none",
3628 system_shared_libs: [],
3629 }`)
3630}
3631
Paul Duffine52e66f2020-03-30 17:54:29 +01003632func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003633 // libfoo is not available to myapex, but only to otherapex
3634 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
3635 apex {
3636 name: "myapex",
3637 key: "myapex.key",
3638 native_shared_libs: ["libfoo"],
3639 }
3640
3641 apex_key {
3642 name: "myapex.key",
3643 public_key: "testkey.avbpubkey",
3644 private_key: "testkey.pem",
3645 }
3646
3647 apex {
3648 name: "otherapex",
3649 key: "otherapex.key",
3650 native_shared_libs: ["libfoo"],
3651 }
3652
3653 apex_key {
3654 name: "otherapex.key",
3655 public_key: "testkey.avbpubkey",
3656 private_key: "testkey.pem",
3657 }
3658
3659 cc_library {
3660 name: "libfoo",
3661 stl: "none",
3662 system_shared_libs: [],
3663 apex_available: ["otherapex"],
3664 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003665}
Jiyong Park127b40b2019-09-30 16:04:35 +09003666
Paul Duffine52e66f2020-03-30 17:54:29 +01003667func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09003668 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01003669 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01003670.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003671.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003672.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003673.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003674.*via tag cc\.DependencyTag.*"shared".*
3675.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003676 apex {
3677 name: "myapex",
3678 key: "myapex.key",
3679 native_shared_libs: ["libfoo"],
3680 }
3681
3682 apex_key {
3683 name: "myapex.key",
3684 public_key: "testkey.avbpubkey",
3685 private_key: "testkey.pem",
3686 }
3687
Jiyong Park127b40b2019-09-30 16:04:35 +09003688 cc_library {
3689 name: "libfoo",
3690 stl: "none",
3691 shared_libs: ["libbar"],
3692 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09003693 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003694 }
3695
3696 cc_library {
3697 name: "libbar",
3698 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09003699 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003700 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09003701 apex_available: ["myapex"],
3702 }
3703
3704 cc_library {
3705 name: "libbaz",
3706 stl: "none",
3707 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09003708 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003709}
Jiyong Park127b40b2019-09-30 16:04:35 +09003710
Paul Duffine52e66f2020-03-30 17:54:29 +01003711func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003712 testApexError(t, "\"otherapex\" is not a valid module name", `
3713 apex {
3714 name: "myapex",
3715 key: "myapex.key",
3716 native_shared_libs: ["libfoo"],
3717 }
3718
3719 apex_key {
3720 name: "myapex.key",
3721 public_key: "testkey.avbpubkey",
3722 private_key: "testkey.pem",
3723 }
3724
3725 cc_library {
3726 name: "libfoo",
3727 stl: "none",
3728 system_shared_libs: [],
3729 apex_available: ["otherapex"],
3730 }`)
3731
Paul Duffine52e66f2020-03-30 17:54:29 +01003732 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003733 apex {
3734 name: "myapex",
3735 key: "myapex.key",
3736 native_shared_libs: ["libfoo", "libbar"],
3737 }
3738
3739 apex_key {
3740 name: "myapex.key",
3741 public_key: "testkey.avbpubkey",
3742 private_key: "testkey.pem",
3743 }
3744
3745 cc_library {
3746 name: "libfoo",
3747 stl: "none",
3748 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09003749 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003750 apex_available: ["myapex"],
3751 }
3752
3753 cc_library {
3754 name: "libbar",
3755 stl: "none",
3756 system_shared_libs: [],
3757 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09003758 }
3759
3760 cc_library {
3761 name: "libbaz",
3762 stl: "none",
3763 system_shared_libs: [],
3764 stubs: {
3765 versions: ["10", "20", "30"],
3766 },
Jiyong Park127b40b2019-09-30 16:04:35 +09003767 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003768}
Jiyong Park127b40b2019-09-30 16:04:35 +09003769
Jiyong Park89e850a2020-04-07 16:37:39 +09003770func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01003771 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003772 apex {
3773 name: "myapex",
3774 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09003775 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003776 }
3777
3778 apex_key {
3779 name: "myapex.key",
3780 public_key: "testkey.avbpubkey",
3781 private_key: "testkey.pem",
3782 }
3783
3784 cc_library {
3785 name: "libfoo",
3786 stl: "none",
3787 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09003788 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003789 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09003790 }
3791
3792 cc_library {
3793 name: "libfoo2",
3794 stl: "none",
3795 system_shared_libs: [],
3796 shared_libs: ["libbaz"],
3797 apex_available: ["//apex_available:platform"],
3798 }
3799
3800 cc_library {
3801 name: "libbar",
3802 stl: "none",
3803 system_shared_libs: [],
3804 apex_available: ["myapex"],
3805 }
3806
3807 cc_library {
3808 name: "libbaz",
3809 stl: "none",
3810 system_shared_libs: [],
3811 apex_available: ["myapex"],
3812 stubs: {
3813 versions: ["1"],
3814 },
Jiyong Park127b40b2019-09-30 16:04:35 +09003815 }`)
3816
Jiyong Park89e850a2020-04-07 16:37:39 +09003817 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
3818 // because it depends on libbar which isn't available to platform
3819 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3820 if libfoo.NotAvailableForPlatform() != true {
3821 t.Errorf("%q shouldn't be available to platform", libfoo.String())
3822 }
3823
3824 // libfoo2 however can be available to platform because it depends on libbaz which provides
3825 // stubs
3826 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3827 if libfoo2.NotAvailableForPlatform() == true {
3828 t.Errorf("%q should be available to platform", libfoo2.String())
3829 }
Paul Duffine52e66f2020-03-30 17:54:29 +01003830}
Jiyong Parka90ca002019-10-07 15:47:24 +09003831
Paul Duffine52e66f2020-03-30 17:54:29 +01003832func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09003833 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09003834 apex {
3835 name: "myapex",
3836 key: "myapex.key",
3837 native_shared_libs: ["libfoo"],
3838 }
3839
3840 apex_key {
3841 name: "myapex.key",
3842 public_key: "testkey.avbpubkey",
3843 private_key: "testkey.pem",
3844 }
3845
3846 cc_library {
3847 name: "libfoo",
3848 stl: "none",
3849 system_shared_libs: [],
3850 apex_available: ["myapex"],
3851 static: {
3852 apex_available: ["//apex_available:platform"],
3853 },
3854 }`)
3855
Jiyong Park89e850a2020-04-07 16:37:39 +09003856 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3857 if libfooShared.NotAvailableForPlatform() != true {
3858 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
3859 }
3860 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
3861 if libfooStatic.NotAvailableForPlatform() != false {
3862 t.Errorf("%q should be available to platform", libfooStatic.String())
3863 }
Jiyong Park127b40b2019-09-30 16:04:35 +09003864}
3865
Jiyong Park5d790c32019-11-15 18:40:32 +09003866func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003867 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09003868 apex {
3869 name: "myapex",
3870 key: "myapex.key",
3871 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003872 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09003873 }
3874
3875 override_apex {
3876 name: "override_myapex",
3877 base: "myapex",
3878 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003879 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08003880 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07003881 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09003882 }
3883
3884 apex_key {
3885 name: "myapex.key",
3886 public_key: "testkey.avbpubkey",
3887 private_key: "testkey.pem",
3888 }
3889
3890 android_app {
3891 name: "app",
3892 srcs: ["foo/bar/MyClass.java"],
3893 package_name: "foo",
3894 sdk_version: "none",
3895 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003896 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09003897 }
3898
3899 override_android_app {
3900 name: "override_app",
3901 base: "app",
3902 package_name: "bar",
3903 }
Jiyong Park20bacab2020-03-03 11:45:41 +09003904 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09003905
Jiyong Park317645e2019-12-05 13:20:58 +09003906 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
3907 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
3908 if originalVariant.GetOverriddenBy() != "" {
3909 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
3910 }
3911 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
3912 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
3913 }
3914
Jiyong Park5d790c32019-11-15 18:40:32 +09003915 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
3916 apexRule := module.Rule("apexRule")
3917 copyCmds := apexRule.Args["copy_commands"]
3918
3919 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09003920 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003921
3922 apexBundle := module.Module().(*apexBundle)
3923 name := apexBundle.Name()
3924 if name != "override_myapex" {
3925 t.Errorf("name should be \"override_myapex\", but was %q", name)
3926 }
3927
Baligh Uddin004d7172020-02-19 21:29:28 -08003928 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
3929 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
3930 }
3931
Jiyong Park20bacab2020-03-03 11:45:41 +09003932 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07003933 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09003934
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003935 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3936 var builder strings.Builder
3937 data.Custom(&builder, name, "TARGET_", "", data)
3938 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09003939 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003940 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
3941 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003942 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003943 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09003944 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003945 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
3946 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09003947}
3948
Jooyung Han214bf372019-11-12 13:03:50 +09003949func TestLegacyAndroid10Support(t *testing.T) {
3950 ctx, _ := testApex(t, `
3951 apex {
3952 name: "myapex",
3953 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003954 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09003955 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09003956 }
3957
3958 apex_key {
3959 name: "myapex.key",
3960 public_key: "testkey.avbpubkey",
3961 private_key: "testkey.pem",
3962 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003963
3964 cc_library {
3965 name: "mylib",
3966 srcs: ["mylib.cpp"],
3967 stl: "libc++",
3968 system_shared_libs: [],
3969 apex_available: [ "myapex" ],
3970 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003971 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09003972
3973 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3974 args := module.Rule("apexRule").Args
3975 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00003976 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003977
3978 // The copies of the libraries in the apex should have one more dependency than
3979 // the ones outside the apex, namely the unwinder. Ideally we should check
3980 // the dependency names directly here but for some reason the names are blank in
3981 // this test.
3982 for _, lib := range []string{"libc++", "mylib"} {
3983 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
3984 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
3985 if len(apexImplicits) != len(nonApexImplicits)+1 {
3986 t.Errorf("%q missing unwinder dep", lib)
3987 }
3988 }
Jooyung Han214bf372019-11-12 13:03:50 +09003989}
3990
Jooyung Han58f26ab2019-12-18 15:34:32 +09003991func TestJavaSDKLibrary(t *testing.T) {
3992 ctx, _ := testApex(t, `
3993 apex {
3994 name: "myapex",
3995 key: "myapex.key",
3996 java_libs: ["foo"],
3997 }
3998
3999 apex_key {
4000 name: "myapex.key",
4001 public_key: "testkey.avbpubkey",
4002 private_key: "testkey.pem",
4003 }
4004
4005 java_sdk_library {
4006 name: "foo",
4007 srcs: ["a.java"],
4008 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004009 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004010 }
4011 `, withFiles(map[string][]byte{
4012 "api/current.txt": nil,
4013 "api/removed.txt": nil,
4014 "api/system-current.txt": nil,
4015 "api/system-removed.txt": nil,
4016 "api/test-current.txt": nil,
4017 "api/test-removed.txt": nil,
4018 }))
4019
4020 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004021 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004022 "javalib/foo.jar",
4023 "etc/permissions/foo.xml",
4024 })
4025 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004026 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4027 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004028}
4029
atrost6e126252020-01-27 17:01:16 +00004030func TestCompatConfig(t *testing.T) {
4031 ctx, _ := testApex(t, `
4032 apex {
4033 name: "myapex",
4034 key: "myapex.key",
4035 prebuilts: ["myjar-platform-compat-config"],
4036 java_libs: ["myjar"],
4037 }
4038
4039 apex_key {
4040 name: "myapex.key",
4041 public_key: "testkey.avbpubkey",
4042 private_key: "testkey.pem",
4043 }
4044
4045 platform_compat_config {
4046 name: "myjar-platform-compat-config",
4047 src: ":myjar",
4048 }
4049
4050 java_library {
4051 name: "myjar",
4052 srcs: ["foo/bar/MyClass.java"],
4053 sdk_version: "none",
4054 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004055 apex_available: [ "myapex" ],
4056 }
4057 `)
4058 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4059 "etc/compatconfig/myjar-platform-compat-config.xml",
4060 "javalib/myjar.jar",
4061 })
4062}
4063
Jiyong Park479321d2019-12-16 11:47:12 +09004064func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4065 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4066 apex {
4067 name: "myapex",
4068 key: "myapex.key",
4069 java_libs: ["myjar"],
4070 }
4071
4072 apex_key {
4073 name: "myapex.key",
4074 public_key: "testkey.avbpubkey",
4075 private_key: "testkey.pem",
4076 }
4077
4078 java_library {
4079 name: "myjar",
4080 srcs: ["foo/bar/MyClass.java"],
4081 sdk_version: "none",
4082 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09004083 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004084 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09004085 }
4086 `)
4087}
4088
Jiyong Park7afd1072019-12-30 16:56:33 +09004089func TestCarryRequiredModuleNames(t *testing.T) {
4090 ctx, config := testApex(t, `
4091 apex {
4092 name: "myapex",
4093 key: "myapex.key",
4094 native_shared_libs: ["mylib"],
4095 }
4096
4097 apex_key {
4098 name: "myapex.key",
4099 public_key: "testkey.avbpubkey",
4100 private_key: "testkey.pem",
4101 }
4102
4103 cc_library {
4104 name: "mylib",
4105 srcs: ["mylib.cpp"],
4106 system_shared_libs: [],
4107 stl: "none",
4108 required: ["a", "b"],
4109 host_required: ["c", "d"],
4110 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004111 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09004112 }
4113 `)
4114
4115 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4116 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4117 name := apexBundle.BaseModuleName()
4118 prefix := "TARGET_"
4119 var builder strings.Builder
4120 data.Custom(&builder, name, prefix, "", data)
4121 androidMk := builder.String()
4122 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
4123 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
4124 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
4125}
4126
Jiyong Park7cd10e32020-01-14 09:22:18 +09004127func TestSymlinksFromApexToSystem(t *testing.T) {
4128 bp := `
4129 apex {
4130 name: "myapex",
4131 key: "myapex.key",
4132 native_shared_libs: ["mylib"],
4133 java_libs: ["myjar"],
4134 }
4135
Jiyong Park9d677202020-02-19 16:29:35 +09004136 apex {
4137 name: "myapex.updatable",
4138 key: "myapex.key",
4139 native_shared_libs: ["mylib"],
4140 java_libs: ["myjar"],
4141 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004142 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09004143 }
4144
Jiyong Park7cd10e32020-01-14 09:22:18 +09004145 apex_key {
4146 name: "myapex.key",
4147 public_key: "testkey.avbpubkey",
4148 private_key: "testkey.pem",
4149 }
4150
4151 cc_library {
4152 name: "mylib",
4153 srcs: ["mylib.cpp"],
4154 shared_libs: ["myotherlib"],
4155 system_shared_libs: [],
4156 stl: "none",
4157 apex_available: [
4158 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004159 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004160 "//apex_available:platform",
4161 ],
4162 }
4163
4164 cc_library {
4165 name: "myotherlib",
4166 srcs: ["mylib.cpp"],
4167 system_shared_libs: [],
4168 stl: "none",
4169 apex_available: [
4170 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004171 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004172 "//apex_available:platform",
4173 ],
4174 }
4175
4176 java_library {
4177 name: "myjar",
4178 srcs: ["foo/bar/MyClass.java"],
4179 sdk_version: "none",
4180 system_modules: "none",
4181 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09004182 apex_available: [
4183 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004184 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004185 "//apex_available:platform",
4186 ],
4187 }
4188
4189 java_library {
4190 name: "myotherjar",
4191 srcs: ["foo/bar/MyClass.java"],
4192 sdk_version: "none",
4193 system_modules: "none",
4194 apex_available: [
4195 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004196 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004197 "//apex_available:platform",
4198 ],
4199 }
4200 `
4201
4202 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
4203 for _, f := range files {
4204 if f.path == file {
4205 if f.isLink {
4206 t.Errorf("%q is not a real file", file)
4207 }
4208 return
4209 }
4210 }
4211 t.Errorf("%q is not found", file)
4212 }
4213
4214 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
4215 for _, f := range files {
4216 if f.path == file {
4217 if !f.isLink {
4218 t.Errorf("%q is not a symlink", file)
4219 }
4220 return
4221 }
4222 }
4223 t.Errorf("%q is not found", file)
4224 }
4225
Jiyong Park9d677202020-02-19 16:29:35 +09004226 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
4227 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09004228 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004229 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004230 ensureRealfileExists(t, files, "javalib/myjar.jar")
4231 ensureRealfileExists(t, files, "lib64/mylib.so")
4232 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4233
Jiyong Park9d677202020-02-19 16:29:35 +09004234 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4235 ensureRealfileExists(t, files, "javalib/myjar.jar")
4236 ensureRealfileExists(t, files, "lib64/mylib.so")
4237 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4238
4239 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09004240 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004241 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004242 ensureRealfileExists(t, files, "javalib/myjar.jar")
4243 ensureRealfileExists(t, files, "lib64/mylib.so")
4244 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09004245
4246 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4247 ensureRealfileExists(t, files, "javalib/myjar.jar")
4248 ensureRealfileExists(t, files, "lib64/mylib.so")
4249 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09004250}
4251
Jooyung Han643adc42020-02-27 13:50:06 +09004252func TestApexWithJniLibs(t *testing.T) {
4253 ctx, _ := testApex(t, `
4254 apex {
4255 name: "myapex",
4256 key: "myapex.key",
4257 jni_libs: ["mylib"],
4258 }
4259
4260 apex_key {
4261 name: "myapex.key",
4262 public_key: "testkey.avbpubkey",
4263 private_key: "testkey.pem",
4264 }
4265
4266 cc_library {
4267 name: "mylib",
4268 srcs: ["mylib.cpp"],
4269 shared_libs: ["mylib2"],
4270 system_shared_libs: [],
4271 stl: "none",
4272 apex_available: [ "myapex" ],
4273 }
4274
4275 cc_library {
4276 name: "mylib2",
4277 srcs: ["mylib.cpp"],
4278 system_shared_libs: [],
4279 stl: "none",
4280 apex_available: [ "myapex" ],
4281 }
4282 `)
4283
4284 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4285 // Notice mylib2.so (transitive dep) is not added as a jni_lib
4286 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
4287 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4288 "lib64/mylib.so",
4289 "lib64/mylib2.so",
4290 })
4291}
4292
Jooyung Han49f67012020-04-17 13:43:10 +09004293func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
4294 ctx, _ := testApex(t, `
4295 apex {
4296 name: "myapex",
4297 key: "myapex.key",
4298 }
4299 apex_key {
4300 name: "myapex.key",
4301 public_key: "testkey.avbpubkey",
4302 private_key: "testkey.pem",
4303 }
4304 `, func(fs map[string][]byte, config android.Config) {
4305 delete(config.Targets, android.Android)
4306 config.AndroidCommonTarget = android.Target{}
4307 })
4308
4309 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
4310 t.Errorf("Expected variants: %v, but got: %v", expected, got)
4311 }
4312}
4313
Jooyung Han643adc42020-02-27 13:50:06 +09004314func TestApexWithJniLibs_Errors(t *testing.T) {
4315 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
4316 apex {
4317 name: "myapex",
4318 key: "myapex.key",
4319 jni_libs: ["xxx"],
4320 }
4321
4322 apex_key {
4323 name: "myapex.key",
4324 public_key: "testkey.avbpubkey",
4325 private_key: "testkey.pem",
4326 }
4327
4328 prebuilt_etc {
4329 name: "xxx",
4330 src: "xxx",
4331 }
4332 `, withFiles(map[string][]byte{
4333 "xxx": nil,
4334 }))
4335}
4336
Jiyong Parkbd159612020-02-28 15:22:21 +09004337func TestAppBundle(t *testing.T) {
4338 ctx, _ := testApex(t, `
4339 apex {
4340 name: "myapex",
4341 key: "myapex.key",
4342 apps: ["AppFoo"],
4343 }
4344
4345 apex_key {
4346 name: "myapex.key",
4347 public_key: "testkey.avbpubkey",
4348 private_key: "testkey.pem",
4349 }
4350
4351 android_app {
4352 name: "AppFoo",
4353 srcs: ["foo/bar/MyClass.java"],
4354 sdk_version: "none",
4355 system_modules: "none",
4356 apex_available: [ "myapex" ],
4357 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004358 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09004359
4360 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
4361 content := bundleConfigRule.Args["content"]
4362
4363 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004364 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 +09004365}
4366
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004367func testNoUpdatableJarsInBootImage(t *testing.T, errmsg, bp string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
4368 t.Helper()
4369
4370 bp = bp + `
4371 filegroup {
4372 name: "some-updatable-apex-file_contexts",
4373 srcs: [
4374 "system/sepolicy/apex/some-updatable-apex-file_contexts",
4375 ],
4376 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004377
4378 filegroup {
4379 name: "some-non-updatable-apex-file_contexts",
4380 srcs: [
4381 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
4382 ],
4383 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004384 `
4385 bp += cc.GatherRequiredDepsForTest(android.Android)
4386 bp += java.GatherRequiredDepsForTest()
4387 bp += dexpreopt.BpToolModulesForTest()
4388
4389 fs := map[string][]byte{
4390 "a.java": nil,
4391 "a.jar": nil,
4392 "build/make/target/product/security": nil,
4393 "apex_manifest.json": nil,
4394 "AndroidManifest.xml": nil,
4395 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004396 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004397 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
4398 "framework/aidl/a.aidl": nil,
4399 }
4400 cc.GatherRequiredFilesForTest(fs)
4401
4402 ctx := android.NewTestArchContext()
4403 ctx.RegisterModuleType("apex", BundleFactory)
4404 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
4405 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
4406 cc.RegisterRequiredBuildComponentsForTest(ctx)
4407 java.RegisterJavaBuildComponents(ctx)
4408 java.RegisterSystemModulesBuildComponents(ctx)
4409 java.RegisterAppBuildComponents(ctx)
4410 java.RegisterDexpreoptBootJarsComponents(ctx)
4411 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
4412 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
4413 ctx.PreDepsMutators(RegisterPreDepsMutators)
4414 ctx.PostDepsMutators(RegisterPostDepsMutators)
4415
4416 config := android.TestArchConfig(buildDir, nil, bp, fs)
4417 ctx.Register(config)
4418
4419 _ = dexpreopt.GlobalSoongConfigForTests(config)
4420 dexpreopt.RegisterToolModulesForTest(ctx)
4421 pathCtx := android.PathContextForTesting(config)
4422 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
4423 transformDexpreoptConfig(dexpreoptConfig)
4424 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
4425
4426 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
4427 android.FailIfErrored(t, errs)
4428
4429 _, errs = ctx.PrepareBuildActions(config)
4430 if errmsg == "" {
4431 android.FailIfErrored(t, errs)
4432 } else if len(errs) > 0 {
4433 android.FailIfNoMatchingErrors(t, errmsg, errs)
4434 return
4435 } else {
4436 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
4437 }
4438}
4439
Jooyung Han548640b2020-04-27 12:10:30 +09004440func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
4441 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
4442 apex {
4443 name: "myapex",
4444 key: "myapex.key",
4445 updatable: true,
4446 }
4447
4448 apex_key {
4449 name: "myapex.key",
4450 public_key: "testkey.avbpubkey",
4451 private_key: "testkey.pem",
4452 }
4453 `)
4454}
4455
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004456func TestNoUpdatableJarsInBootImage(t *testing.T) {
4457 bp := `
4458 java_library {
4459 name: "some-updatable-apex-lib",
4460 srcs: ["a.java"],
4461 apex_available: [
4462 "some-updatable-apex",
4463 ],
4464 }
4465
4466 java_library {
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004467 name: "some-non-updatable-apex-lib",
4468 srcs: ["a.java"],
4469 apex_available: [
4470 "some-non-updatable-apex",
4471 ],
4472 }
4473
4474 java_library {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004475 name: "some-platform-lib",
4476 srcs: ["a.java"],
4477 installable: true,
4478 }
4479
4480 java_library {
4481 name: "some-art-lib",
4482 srcs: ["a.java"],
4483 apex_available: [
4484 "com.android.art.something",
4485 ],
4486 hostdex: true,
4487 }
4488
4489 apex {
4490 name: "some-updatable-apex",
4491 key: "some-updatable-apex.key",
4492 java_libs: ["some-updatable-apex-lib"],
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004493 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004494 min_sdk_version: "current",
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004495 }
4496
4497 apex {
4498 name: "some-non-updatable-apex",
4499 key: "some-non-updatable-apex.key",
4500 java_libs: ["some-non-updatable-apex-lib"],
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004501 }
4502
4503 apex_key {
4504 name: "some-updatable-apex.key",
4505 }
4506
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004507 apex_key {
4508 name: "some-non-updatable-apex.key",
4509 }
4510
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004511 apex {
4512 name: "com.android.art.something",
4513 key: "com.android.art.something.key",
4514 java_libs: ["some-art-lib"],
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004515 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004516 min_sdk_version: "current",
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004517 }
4518
4519 apex_key {
4520 name: "com.android.art.something.key",
4521 }
4522 `
4523
4524 var error string
4525 var transform func(*dexpreopt.GlobalConfig)
4526
4527 // updatable jar from ART apex in the ART boot image => ok
4528 transform = func(config *dexpreopt.GlobalConfig) {
4529 config.ArtApexJars = []string{"some-art-lib"}
4530 }
4531 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4532
4533 // updatable jar from ART apex in the framework boot image => error
4534 error = "module 'some-art-lib' from updatable apex 'com.android.art.something' is not allowed in the framework boot image"
4535 transform = func(config *dexpreopt.GlobalConfig) {
4536 config.BootJars = []string{"some-art-lib"}
4537 }
4538 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4539
4540 // updatable jar from some other apex in the ART boot image => error
4541 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the ART boot image"
4542 transform = func(config *dexpreopt.GlobalConfig) {
4543 config.ArtApexJars = []string{"some-updatable-apex-lib"}
4544 }
4545 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4546
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004547 // non-updatable jar from some other apex in the ART boot image => error
4548 error = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
4549 transform = func(config *dexpreopt.GlobalConfig) {
4550 config.ArtApexJars = []string{"some-non-updatable-apex-lib"}
4551 }
4552 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4553
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004554 // updatable jar from some other apex in the framework boot image => error
4555 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
4556 transform = func(config *dexpreopt.GlobalConfig) {
4557 config.BootJars = []string{"some-updatable-apex-lib"}
4558 }
4559 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4560
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004561 // non-updatable jar from some other apex in the framework boot image => ok
4562 transform = func(config *dexpreopt.GlobalConfig) {
4563 config.BootJars = []string{"some-non-updatable-apex-lib"}
4564 }
4565 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4566
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004567 // nonexistent jar in the ART boot image => error
4568 error = "failed to find a dex jar path for module 'nonexistent'"
4569 transform = func(config *dexpreopt.GlobalConfig) {
4570 config.ArtApexJars = []string{"nonexistent"}
4571 }
4572 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4573
4574 // nonexistent jar in the framework boot image => error
4575 error = "failed to find a dex jar path for module 'nonexistent'"
4576 transform = func(config *dexpreopt.GlobalConfig) {
4577 config.BootJars = []string{"nonexistent"}
4578 }
4579 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4580
4581 // platform jar in the ART boot image => error
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004582 error = "module 'some-platform-lib' is not allowed in the ART boot image"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004583 transform = func(config *dexpreopt.GlobalConfig) {
4584 config.ArtApexJars = []string{"some-platform-lib"}
4585 }
4586 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4587
4588 // platform jar in the framework boot image => ok
4589 transform = func(config *dexpreopt.GlobalConfig) {
4590 config.BootJars = []string{"some-platform-lib"}
4591 }
4592 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4593}
4594
Jiyong Park62304bb2020-04-13 16:19:48 +09004595func TestTestFor(t *testing.T) {
4596 ctx, _ := testApex(t, `
4597 apex {
4598 name: "myapex",
4599 key: "myapex.key",
4600 native_shared_libs: ["mylib", "myprivlib"],
4601 }
4602
4603 apex_key {
4604 name: "myapex.key",
4605 public_key: "testkey.avbpubkey",
4606 private_key: "testkey.pem",
4607 }
4608
4609 cc_library {
4610 name: "mylib",
4611 srcs: ["mylib.cpp"],
4612 system_shared_libs: [],
4613 stl: "none",
4614 stubs: {
4615 versions: ["1"],
4616 },
4617 apex_available: ["myapex"],
4618 }
4619
4620 cc_library {
4621 name: "myprivlib",
4622 srcs: ["mylib.cpp"],
4623 system_shared_libs: [],
4624 stl: "none",
4625 apex_available: ["myapex"],
4626 }
4627
4628
4629 cc_test {
4630 name: "mytest",
4631 gtest: false,
4632 srcs: ["mylib.cpp"],
4633 system_shared_libs: [],
4634 stl: "none",
4635 shared_libs: ["mylib", "myprivlib"],
4636 test_for: ["myapex"]
4637 }
4638 `)
4639
4640 // the test 'mytest' is a test for the apex, therefore is linked to the
4641 // actual implementation of mylib instead of its stub.
4642 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
4643 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
4644 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
4645}
4646
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004647func TestMain(m *testing.M) {
4648 run := func() int {
4649 setUp()
4650 defer tearDown()
4651
4652 return m.Run()
4653 }
4654
4655 os.Exit(run())
4656}