blob: d52054479878043a58d991b1658aefeb46209688 [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
Artur Satayev872a1442020-04-27 17:08:37 +0100507 depsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.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
Artur Satayev872a1442020-04-27 17:08:37 +0100821 depsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.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
Artur Satayev8cf899a2020-04-15 17:29:42 +01001414func TestJavaStableSdkVersion(t *testing.T) {
1415 testCases := []struct {
1416 name string
1417 expectedError string
1418 bp string
1419 }{
1420 {
1421 name: "Non-updatable apex with non-stable dep",
1422 bp: `
1423 apex {
1424 name: "myapex",
1425 java_libs: ["myjar"],
1426 key: "myapex.key",
1427 }
1428 apex_key {
1429 name: "myapex.key",
1430 public_key: "testkey.avbpubkey",
1431 private_key: "testkey.pem",
1432 }
1433 java_library {
1434 name: "myjar",
1435 srcs: ["foo/bar/MyClass.java"],
1436 sdk_version: "core_platform",
1437 apex_available: ["myapex"],
1438 }
1439 `,
1440 },
1441 {
1442 name: "Updatable apex with stable dep",
1443 bp: `
1444 apex {
1445 name: "myapex",
1446 java_libs: ["myjar"],
1447 key: "myapex.key",
1448 updatable: true,
1449 min_sdk_version: "29",
1450 }
1451 apex_key {
1452 name: "myapex.key",
1453 public_key: "testkey.avbpubkey",
1454 private_key: "testkey.pem",
1455 }
1456 java_library {
1457 name: "myjar",
1458 srcs: ["foo/bar/MyClass.java"],
1459 sdk_version: "current",
1460 apex_available: ["myapex"],
1461 }
1462 `,
1463 },
1464 {
1465 name: "Updatable apex with non-stable dep",
1466 expectedError: "cannot depend on \"myjar\"",
1467 bp: `
1468 apex {
1469 name: "myapex",
1470 java_libs: ["myjar"],
1471 key: "myapex.key",
1472 updatable: true,
1473 }
1474 apex_key {
1475 name: "myapex.key",
1476 public_key: "testkey.avbpubkey",
1477 private_key: "testkey.pem",
1478 }
1479 java_library {
1480 name: "myjar",
1481 srcs: ["foo/bar/MyClass.java"],
1482 sdk_version: "core_platform",
1483 apex_available: ["myapex"],
1484 }
1485 `,
1486 },
1487 {
1488 name: "Updatable apex with non-stable transitive dep",
1489 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1490 bp: `
1491 apex {
1492 name: "myapex",
1493 java_libs: ["myjar"],
1494 key: "myapex.key",
1495 updatable: true,
1496 }
1497 apex_key {
1498 name: "myapex.key",
1499 public_key: "testkey.avbpubkey",
1500 private_key: "testkey.pem",
1501 }
1502 java_library {
1503 name: "myjar",
1504 srcs: ["foo/bar/MyClass.java"],
1505 sdk_version: "current",
1506 apex_available: ["myapex"],
1507 static_libs: ["transitive-jar"],
1508 }
1509 java_library {
1510 name: "transitive-jar",
1511 srcs: ["foo/bar/MyClass.java"],
1512 sdk_version: "core_platform",
1513 apex_available: ["myapex"],
1514 }
1515 `,
1516 },
1517 }
1518
1519 for _, test := range testCases {
1520 t.Run(test.name, func(t *testing.T) {
1521 if test.expectedError == "" {
1522 testApex(t, test.bp)
1523 } else {
1524 testApexError(t, test.expectedError, test.bp)
1525 }
1526 })
1527 }
1528}
1529
Jiyong Park7c2ee712018-12-07 00:42:25 +09001530func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001531 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001532 apex {
1533 name: "myapex",
1534 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001535 native_shared_libs: ["mylib"],
1536 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001537 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001538 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001539 }
1540
1541 apex_key {
1542 name: "myapex.key",
1543 public_key: "testkey.avbpubkey",
1544 private_key: "testkey.pem",
1545 }
1546
1547 prebuilt_etc {
1548 name: "myetc",
1549 src: "myprebuilt",
1550 sub_dir: "foo/bar",
1551 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001552
1553 cc_library {
1554 name: "mylib",
1555 srcs: ["mylib.cpp"],
1556 relative_install_path: "foo/bar",
1557 system_shared_libs: [],
1558 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001559 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001560 }
1561
1562 cc_binary {
1563 name: "mybin",
1564 srcs: ["mylib.cpp"],
1565 relative_install_path: "foo/bar",
1566 system_shared_libs: [],
1567 static_executable: true,
1568 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001569 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001570 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001571 `)
1572
Sundong Ahnabb64432019-10-22 13:58:29 +09001573 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001574 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1575
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001576 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001577 ensureListContains(t, dirs, "etc")
1578 ensureListContains(t, dirs, "etc/foo")
1579 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001580 ensureListContains(t, dirs, "lib64")
1581 ensureListContains(t, dirs, "lib64/foo")
1582 ensureListContains(t, dirs, "lib64/foo/bar")
1583 ensureListContains(t, dirs, "lib")
1584 ensureListContains(t, dirs, "lib/foo")
1585 ensureListContains(t, dirs, "lib/foo/bar")
1586
Jiyong Parkbd13e442019-03-15 18:10:35 +09001587 ensureListContains(t, dirs, "bin")
1588 ensureListContains(t, dirs, "bin/foo")
1589 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001590}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001591
Jooyung Han35155c42020-02-06 17:33:20 +09001592func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
1593 ctx, _ := testApex(t, `
1594 apex {
1595 name: "myapex",
1596 key: "myapex.key",
1597 multilib: {
1598 both: {
1599 native_shared_libs: ["mylib"],
1600 binaries: ["mybin"],
1601 },
1602 },
1603 compile_multilib: "both",
1604 native_bridge_supported: true,
1605 }
1606
1607 apex_key {
1608 name: "myapex.key",
1609 public_key: "testkey.avbpubkey",
1610 private_key: "testkey.pem",
1611 }
1612
1613 cc_library {
1614 name: "mylib",
1615 relative_install_path: "foo/bar",
1616 system_shared_libs: [],
1617 stl: "none",
1618 apex_available: [ "myapex" ],
1619 native_bridge_supported: true,
1620 }
1621
1622 cc_binary {
1623 name: "mybin",
1624 relative_install_path: "foo/bar",
1625 system_shared_libs: [],
1626 static_executable: true,
1627 stl: "none",
1628 apex_available: [ "myapex" ],
1629 native_bridge_supported: true,
1630 compile_multilib: "both", // default is "first" for binary
1631 multilib: {
1632 lib64: {
1633 suffix: "64",
1634 },
1635 },
1636 }
1637 `, withNativeBridgeEnabled)
1638 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1639 "bin/foo/bar/mybin",
1640 "bin/foo/bar/mybin64",
1641 "bin/arm/foo/bar/mybin",
1642 "bin/arm64/foo/bar/mybin64",
1643 "lib/foo/bar/mylib.so",
1644 "lib/arm/foo/bar/mylib.so",
1645 "lib64/foo/bar/mylib.so",
1646 "lib64/arm64/foo/bar/mylib.so",
1647 })
1648}
1649
Jiyong Parkda6eb592018-12-19 17:12:36 +09001650func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001651 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09001652 apex {
1653 name: "myapex",
1654 key: "myapex.key",
1655 native_shared_libs: ["mylib"],
1656 use_vendor: true,
1657 }
1658
1659 apex_key {
1660 name: "myapex.key",
1661 public_key: "testkey.avbpubkey",
1662 private_key: "testkey.pem",
1663 }
1664
1665 cc_library {
1666 name: "mylib",
1667 srcs: ["mylib.cpp"],
1668 shared_libs: ["mylib2"],
1669 system_shared_libs: [],
1670 vendor_available: true,
1671 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001672 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001673 }
1674
1675 cc_library {
1676 name: "mylib2",
1677 srcs: ["mylib.cpp"],
1678 system_shared_libs: [],
1679 vendor_available: true,
1680 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001681 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001682 }
Jooyung Handc782442019-11-01 03:14:38 +09001683 `, func(fs map[string][]byte, config android.Config) {
1684 setUseVendorWhitelistForTest(config, []string{"myapex"})
1685 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09001686
1687 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09001688 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09001689 for _, implicit := range i.Implicits {
1690 inputsList = append(inputsList, implicit.String())
1691 }
1692 }
1693 inputsString := strings.Join(inputsList, " ")
1694
1695 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08001696 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
1697 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001698
1699 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08001700 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
1701 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001702}
Jiyong Park16e91a02018-12-20 18:18:08 +09001703
Jooyung Handc782442019-11-01 03:14:38 +09001704func TestUseVendorRestriction(t *testing.T) {
1705 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
1706 apex {
1707 name: "myapex",
1708 key: "myapex.key",
1709 use_vendor: true,
1710 }
1711 apex_key {
1712 name: "myapex.key",
1713 public_key: "testkey.avbpubkey",
1714 private_key: "testkey.pem",
1715 }
1716 `, func(fs map[string][]byte, config android.Config) {
1717 setUseVendorWhitelistForTest(config, []string{""})
1718 })
1719 // no error with whitelist
1720 testApex(t, `
1721 apex {
1722 name: "myapex",
1723 key: "myapex.key",
1724 use_vendor: true,
1725 }
1726 apex_key {
1727 name: "myapex.key",
1728 public_key: "testkey.avbpubkey",
1729 private_key: "testkey.pem",
1730 }
1731 `, func(fs map[string][]byte, config android.Config) {
1732 setUseVendorWhitelistForTest(config, []string{"myapex"})
1733 })
1734}
1735
Jooyung Han5c998b92019-06-27 11:30:33 +09001736func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
1737 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
1738 apex {
1739 name: "myapex",
1740 key: "myapex.key",
1741 native_shared_libs: ["mylib"],
1742 use_vendor: true,
1743 }
1744
1745 apex_key {
1746 name: "myapex.key",
1747 public_key: "testkey.avbpubkey",
1748 private_key: "testkey.pem",
1749 }
1750
1751 cc_library {
1752 name: "mylib",
1753 srcs: ["mylib.cpp"],
1754 system_shared_libs: [],
1755 stl: "none",
1756 }
1757 `)
1758}
1759
Jiyong Park16e91a02018-12-20 18:18:08 +09001760func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001761 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09001762 apex {
1763 name: "myapex",
1764 key: "myapex.key",
1765 native_shared_libs: ["mylib"],
1766 }
1767
1768 apex_key {
1769 name: "myapex.key",
1770 public_key: "testkey.avbpubkey",
1771 private_key: "testkey.pem",
1772 }
1773
1774 cc_library {
1775 name: "mylib",
1776 srcs: ["mylib.cpp"],
1777 system_shared_libs: [],
1778 stl: "none",
1779 stubs: {
1780 versions: ["1", "2", "3"],
1781 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001782 apex_available: [
1783 "//apex_available:platform",
1784 "myapex",
1785 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09001786 }
1787
1788 cc_binary {
1789 name: "not_in_apex",
1790 srcs: ["mylib.cpp"],
1791 static_libs: ["mylib"],
1792 static_executable: true,
1793 system_shared_libs: [],
1794 stl: "none",
1795 }
Jiyong Park16e91a02018-12-20 18:18:08 +09001796 `)
1797
Colin Cross7113d202019-11-20 16:39:12 -08001798 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09001799
1800 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08001801 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09001802}
Jiyong Park9335a262018-12-24 11:31:58 +09001803
1804func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001805 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09001806 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001807 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09001808 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001809 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09001810 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09001811 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09001812 }
1813
1814 cc_library {
1815 name: "mylib",
1816 srcs: ["mylib.cpp"],
1817 system_shared_libs: [],
1818 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001819 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09001820 }
1821
1822 apex_key {
1823 name: "myapex.key",
1824 public_key: "testkey.avbpubkey",
1825 private_key: "testkey.pem",
1826 }
1827
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001828 android_app_certificate {
1829 name: "myapex.certificate",
1830 certificate: "testkey",
1831 }
1832
1833 android_app_certificate {
1834 name: "myapex.certificate.override",
1835 certificate: "testkey.override",
1836 }
1837
Jiyong Park9335a262018-12-24 11:31:58 +09001838 `)
1839
1840 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09001841 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09001842
1843 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
1844 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
1845 "vendor/foo/devkeys/testkey.avbpubkey")
1846 }
1847 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
1848 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
1849 "vendor/foo/devkeys/testkey.pem")
1850 }
1851
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001852 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09001853 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001854 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09001855 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001856 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09001857 }
1858}
Jiyong Park58e364a2019-01-19 19:24:06 +09001859
Jooyung Hanf121a652019-12-17 14:30:11 +09001860func TestCertificate(t *testing.T) {
1861 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
1862 ctx, _ := testApex(t, `
1863 apex {
1864 name: "myapex",
1865 key: "myapex.key",
1866 }
1867 apex_key {
1868 name: "myapex.key",
1869 public_key: "testkey.avbpubkey",
1870 private_key: "testkey.pem",
1871 }`)
1872 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
1873 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
1874 if actual := rule.Args["certificates"]; actual != expected {
1875 t.Errorf("certificates should be %q, not %q", expected, actual)
1876 }
1877 })
1878 t.Run("override when unspecified", func(t *testing.T) {
1879 ctx, _ := testApex(t, `
1880 apex {
1881 name: "myapex_keytest",
1882 key: "myapex.key",
1883 file_contexts: ":myapex-file_contexts",
1884 }
1885 apex_key {
1886 name: "myapex.key",
1887 public_key: "testkey.avbpubkey",
1888 private_key: "testkey.pem",
1889 }
1890 android_app_certificate {
1891 name: "myapex.certificate.override",
1892 certificate: "testkey.override",
1893 }`)
1894 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
1895 expected := "testkey.override.x509.pem testkey.override.pk8"
1896 if actual := rule.Args["certificates"]; actual != expected {
1897 t.Errorf("certificates should be %q, not %q", expected, actual)
1898 }
1899 })
1900 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
1901 ctx, _ := testApex(t, `
1902 apex {
1903 name: "myapex",
1904 key: "myapex.key",
1905 certificate: ":myapex.certificate",
1906 }
1907 apex_key {
1908 name: "myapex.key",
1909 public_key: "testkey.avbpubkey",
1910 private_key: "testkey.pem",
1911 }
1912 android_app_certificate {
1913 name: "myapex.certificate",
1914 certificate: "testkey",
1915 }`)
1916 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
1917 expected := "testkey.x509.pem testkey.pk8"
1918 if actual := rule.Args["certificates"]; actual != expected {
1919 t.Errorf("certificates should be %q, not %q", expected, actual)
1920 }
1921 })
1922 t.Run("override when specifiec as <:module>", func(t *testing.T) {
1923 ctx, _ := testApex(t, `
1924 apex {
1925 name: "myapex_keytest",
1926 key: "myapex.key",
1927 file_contexts: ":myapex-file_contexts",
1928 certificate: ":myapex.certificate",
1929 }
1930 apex_key {
1931 name: "myapex.key",
1932 public_key: "testkey.avbpubkey",
1933 private_key: "testkey.pem",
1934 }
1935 android_app_certificate {
1936 name: "myapex.certificate.override",
1937 certificate: "testkey.override",
1938 }`)
1939 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
1940 expected := "testkey.override.x509.pem testkey.override.pk8"
1941 if actual := rule.Args["certificates"]; actual != expected {
1942 t.Errorf("certificates should be %q, not %q", expected, actual)
1943 }
1944 })
1945 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
1946 ctx, _ := testApex(t, `
1947 apex {
1948 name: "myapex",
1949 key: "myapex.key",
1950 certificate: "testkey",
1951 }
1952 apex_key {
1953 name: "myapex.key",
1954 public_key: "testkey.avbpubkey",
1955 private_key: "testkey.pem",
1956 }`)
1957 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
1958 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
1959 if actual := rule.Args["certificates"]; actual != expected {
1960 t.Errorf("certificates should be %q, not %q", expected, actual)
1961 }
1962 })
1963 t.Run("override when specified as <name>", func(t *testing.T) {
1964 ctx, _ := testApex(t, `
1965 apex {
1966 name: "myapex_keytest",
1967 key: "myapex.key",
1968 file_contexts: ":myapex-file_contexts",
1969 certificate: "testkey",
1970 }
1971 apex_key {
1972 name: "myapex.key",
1973 public_key: "testkey.avbpubkey",
1974 private_key: "testkey.pem",
1975 }
1976 android_app_certificate {
1977 name: "myapex.certificate.override",
1978 certificate: "testkey.override",
1979 }`)
1980 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
1981 expected := "testkey.override.x509.pem testkey.override.pk8"
1982 if actual := rule.Args["certificates"]; actual != expected {
1983 t.Errorf("certificates should be %q, not %q", expected, actual)
1984 }
1985 })
1986}
1987
Jiyong Park58e364a2019-01-19 19:24:06 +09001988func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001989 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09001990 apex {
1991 name: "myapex",
1992 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09001993 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09001994 }
1995
1996 apex {
1997 name: "otherapex",
1998 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09001999 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002000 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002001 }
2002
2003 apex_key {
2004 name: "myapex.key",
2005 public_key: "testkey.avbpubkey",
2006 private_key: "testkey.pem",
2007 }
2008
2009 cc_library {
2010 name: "mylib",
2011 srcs: ["mylib.cpp"],
2012 system_shared_libs: [],
2013 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002014 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002015 "myapex",
2016 "otherapex",
2017 ],
Jooyung Han24282772020-03-21 23:20:55 +09002018 recovery_available: true,
Jiyong Park58e364a2019-01-19 19:24:06 +09002019 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002020 cc_library {
2021 name: "mylib2",
2022 srcs: ["mylib.cpp"],
2023 system_shared_libs: [],
2024 stl: "none",
2025 apex_available: [
2026 "myapex",
2027 "otherapex",
2028 ],
2029 use_apex_name_macro: true,
2030 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002031 `)
2032
Jooyung Hanc87a0592020-03-02 17:44:33 +09002033 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002034 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002035 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002036 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002037
Jooyung Hanccce2f22020-03-07 03:45:53 +09002038 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002039 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2040 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002041 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002042 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002043
Jooyung Hanccce2f22020-03-07 03:45:53 +09002044 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002045 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2046 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002047 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002048 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002049
Jooyung Hanc87a0592020-03-02 17:44:33 +09002050 // When cc_library sets use_apex_name_macro: true
2051 // apex variants define additional macro to distinguish which apex variant it is built for
2052
2053 // non-APEX variant does not have __ANDROID_APEX__ defined
2054 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2055 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2056
2057 // APEX variant has __ANDROID_APEX__ defined
2058 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002059 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002060 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2061 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002062
Jooyung Hanc87a0592020-03-02 17:44:33 +09002063 // APEX variant has __ANDROID_APEX__ defined
2064 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002065 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002066 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2067 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002068
2069 // recovery variant does not set __ANDROID_SDK_VERSION__
2070 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2071 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2072 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002073}
Jiyong Park7e636d02019-01-28 16:16:54 +09002074
2075func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002076 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002077 apex {
2078 name: "myapex",
2079 key: "myapex.key",
2080 native_shared_libs: ["mylib"],
2081 }
2082
2083 apex_key {
2084 name: "myapex.key",
2085 public_key: "testkey.avbpubkey",
2086 private_key: "testkey.pem",
2087 }
2088
2089 cc_library_headers {
2090 name: "mylib_headers",
2091 export_include_dirs: ["my_include"],
2092 system_shared_libs: [],
2093 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002094 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002095 }
2096
2097 cc_library {
2098 name: "mylib",
2099 srcs: ["mylib.cpp"],
2100 system_shared_libs: [],
2101 stl: "none",
2102 header_libs: ["mylib_headers"],
2103 export_header_lib_headers: ["mylib_headers"],
2104 stubs: {
2105 versions: ["1", "2", "3"],
2106 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002107 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002108 }
2109
2110 cc_library {
2111 name: "otherlib",
2112 srcs: ["mylib.cpp"],
2113 system_shared_libs: [],
2114 stl: "none",
2115 shared_libs: ["mylib"],
2116 }
2117 `)
2118
Colin Cross7113d202019-11-20 16:39:12 -08002119 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002120
2121 // Ensure that the include path of the header lib is exported to 'otherlib'
2122 ensureContains(t, cFlags, "-Imy_include")
2123}
Alex Light9670d332019-01-29 18:07:33 -08002124
Jiyong Park7cd10e32020-01-14 09:22:18 +09002125type fileInApex struct {
2126 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002127 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002128 isLink bool
2129}
2130
Jooyung Hana57af4a2020-01-23 05:36:59 +00002131func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002132 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002133 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002134 copyCmds := apexRule.Args["copy_commands"]
2135 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002136 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002137 for _, cmd := range strings.Split(copyCmds, "&&") {
2138 cmd = strings.TrimSpace(cmd)
2139 if cmd == "" {
2140 continue
2141 }
2142 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002143 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002144 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002145 switch terms[0] {
2146 case "mkdir":
2147 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002148 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002149 t.Fatal("copyCmds contains invalid cp command", cmd)
2150 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002151 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002152 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002153 isLink = false
2154 case "ln":
2155 if len(terms) != 3 && len(terms) != 4 {
2156 // ln LINK TARGET or ln -s LINK TARGET
2157 t.Fatal("copyCmds contains invalid ln command", cmd)
2158 }
2159 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002160 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002161 isLink = true
2162 default:
2163 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2164 }
2165 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002166 index := strings.Index(dst, imageApexDir)
2167 if index == -1 {
2168 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2169 }
2170 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002171 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002172 }
2173 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002174 return ret
2175}
2176
Jooyung Hana57af4a2020-01-23 05:36:59 +00002177func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2178 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002179 var failed bool
2180 var surplus []string
2181 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002182 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002183 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002184 for _, expected := range files {
2185 if matched, _ := path.Match(expected, file.path); matched {
2186 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002187 mactchFound = true
2188 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002189 }
2190 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002191 if !mactchFound {
2192 surplus = append(surplus, file.path)
2193 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002194 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002195
Jooyung Han31c470b2019-10-18 16:26:59 +09002196 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002197 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002198 t.Log("surplus files", surplus)
2199 failed = true
2200 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002201
2202 if len(files) > len(filesMatched) {
2203 var missing []string
2204 for _, expected := range files {
2205 if !filesMatched[expected] {
2206 missing = append(missing, expected)
2207 }
2208 }
2209 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002210 t.Log("missing files", missing)
2211 failed = true
2212 }
2213 if failed {
2214 t.Fail()
2215 }
2216}
2217
Jooyung Han344d5432019-08-23 11:17:39 +09002218func TestVndkApexCurrent(t *testing.T) {
2219 ctx, _ := testApex(t, `
2220 apex_vndk {
2221 name: "myapex",
2222 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002223 }
2224
2225 apex_key {
2226 name: "myapex.key",
2227 public_key: "testkey.avbpubkey",
2228 private_key: "testkey.pem",
2229 }
2230
2231 cc_library {
2232 name: "libvndk",
2233 srcs: ["mylib.cpp"],
2234 vendor_available: true,
2235 vndk: {
2236 enabled: true,
2237 },
2238 system_shared_libs: [],
2239 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002240 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002241 }
2242
2243 cc_library {
2244 name: "libvndksp",
2245 srcs: ["mylib.cpp"],
2246 vendor_available: true,
2247 vndk: {
2248 enabled: true,
2249 support_system_process: true,
2250 },
2251 system_shared_libs: [],
2252 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002253 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002254 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002255 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002256
Jooyung Hana57af4a2020-01-23 05:36:59 +00002257 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002258 "lib/libvndk.so",
2259 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002260 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002261 "lib64/libvndk.so",
2262 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002263 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002264 "etc/llndk.libraries.VER.txt",
2265 "etc/vndkcore.libraries.VER.txt",
2266 "etc/vndksp.libraries.VER.txt",
2267 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002268 })
Jooyung Han344d5432019-08-23 11:17:39 +09002269}
2270
2271func TestVndkApexWithPrebuilt(t *testing.T) {
2272 ctx, _ := testApex(t, `
2273 apex_vndk {
2274 name: "myapex",
2275 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002276 }
2277
2278 apex_key {
2279 name: "myapex.key",
2280 public_key: "testkey.avbpubkey",
2281 private_key: "testkey.pem",
2282 }
2283
2284 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002285 name: "libvndk",
2286 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002287 vendor_available: true,
2288 vndk: {
2289 enabled: true,
2290 },
2291 system_shared_libs: [],
2292 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002293 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002294 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002295
2296 cc_prebuilt_library_shared {
2297 name: "libvndk.arm",
2298 srcs: ["libvndk.arm.so"],
2299 vendor_available: true,
2300 vndk: {
2301 enabled: true,
2302 },
2303 enabled: false,
2304 arch: {
2305 arm: {
2306 enabled: true,
2307 },
2308 },
2309 system_shared_libs: [],
2310 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002311 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002312 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002313 `+vndkLibrariesTxtFiles("current"),
2314 withFiles(map[string][]byte{
2315 "libvndk.so": nil,
2316 "libvndk.arm.so": nil,
2317 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002318
Jooyung Hana57af4a2020-01-23 05:36:59 +00002319 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002320 "lib/libvndk.so",
2321 "lib/libvndk.arm.so",
2322 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002323 "lib/libc++.so",
2324 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002325 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002326 })
Jooyung Han344d5432019-08-23 11:17:39 +09002327}
2328
Jooyung Han39edb6c2019-11-06 16:53:07 +09002329func vndkLibrariesTxtFiles(vers ...string) (result string) {
2330 for _, v := range vers {
2331 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002332 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002333 result += `
2334 vndk_libraries_txt {
2335 name: "` + txt + `.libraries.txt",
2336 }
2337 `
2338 }
2339 } else {
2340 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2341 result += `
2342 prebuilt_etc {
2343 name: "` + txt + `.libraries.` + v + `.txt",
2344 src: "dummy.txt",
2345 }
2346 `
2347 }
2348 }
2349 }
2350 return
2351}
2352
Jooyung Han344d5432019-08-23 11:17:39 +09002353func TestVndkApexVersion(t *testing.T) {
2354 ctx, _ := testApex(t, `
2355 apex_vndk {
2356 name: "myapex_v27",
2357 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002358 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002359 vndk_version: "27",
2360 }
2361
2362 apex_key {
2363 name: "myapex.key",
2364 public_key: "testkey.avbpubkey",
2365 private_key: "testkey.pem",
2366 }
2367
Jooyung Han31c470b2019-10-18 16:26:59 +09002368 vndk_prebuilt_shared {
2369 name: "libvndk27",
2370 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002371 vendor_available: true,
2372 vndk: {
2373 enabled: true,
2374 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002375 target_arch: "arm64",
2376 arch: {
2377 arm: {
2378 srcs: ["libvndk27_arm.so"],
2379 },
2380 arm64: {
2381 srcs: ["libvndk27_arm64.so"],
2382 },
2383 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002384 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002385 }
2386
2387 vndk_prebuilt_shared {
2388 name: "libvndk27",
2389 version: "27",
2390 vendor_available: true,
2391 vndk: {
2392 enabled: true,
2393 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002394 target_arch: "x86_64",
2395 arch: {
2396 x86: {
2397 srcs: ["libvndk27_x86.so"],
2398 },
2399 x86_64: {
2400 srcs: ["libvndk27_x86_64.so"],
2401 },
2402 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09002403 }
2404 `+vndkLibrariesTxtFiles("27"),
2405 withFiles(map[string][]byte{
2406 "libvndk27_arm.so": nil,
2407 "libvndk27_arm64.so": nil,
2408 "libvndk27_x86.so": nil,
2409 "libvndk27_x86_64.so": nil,
2410 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002411
Jooyung Hana57af4a2020-01-23 05:36:59 +00002412 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002413 "lib/libvndk27_arm.so",
2414 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002415 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002416 })
Jooyung Han344d5432019-08-23 11:17:39 +09002417}
2418
2419func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
2420 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
2421 apex_vndk {
2422 name: "myapex_v27",
2423 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002424 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002425 vndk_version: "27",
2426 }
2427 apex_vndk {
2428 name: "myapex_v27_other",
2429 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002430 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002431 vndk_version: "27",
2432 }
2433
2434 apex_key {
2435 name: "myapex.key",
2436 public_key: "testkey.avbpubkey",
2437 private_key: "testkey.pem",
2438 }
2439
2440 cc_library {
2441 name: "libvndk",
2442 srcs: ["mylib.cpp"],
2443 vendor_available: true,
2444 vndk: {
2445 enabled: true,
2446 },
2447 system_shared_libs: [],
2448 stl: "none",
2449 }
2450
2451 vndk_prebuilt_shared {
2452 name: "libvndk",
2453 version: "27",
2454 vendor_available: true,
2455 vndk: {
2456 enabled: true,
2457 },
2458 srcs: ["libvndk.so"],
2459 }
2460 `, withFiles(map[string][]byte{
2461 "libvndk.so": nil,
2462 }))
2463}
2464
Jooyung Han90eee022019-10-01 20:02:42 +09002465func TestVndkApexNameRule(t *testing.T) {
2466 ctx, _ := testApex(t, `
2467 apex_vndk {
2468 name: "myapex",
2469 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002470 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002471 }
2472 apex_vndk {
2473 name: "myapex_v28",
2474 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002475 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002476 vndk_version: "28",
2477 }
2478 apex_key {
2479 name: "myapex.key",
2480 public_key: "testkey.avbpubkey",
2481 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002482 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09002483
2484 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00002485 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09002486 actual := proptools.String(bundle.properties.Apex_name)
2487 if !reflect.DeepEqual(actual, expected) {
2488 t.Errorf("Got '%v', expected '%v'", actual, expected)
2489 }
2490 }
2491
2492 assertApexName("com.android.vndk.vVER", "myapex")
2493 assertApexName("com.android.vndk.v28", "myapex_v28")
2494}
2495
Jooyung Han344d5432019-08-23 11:17:39 +09002496func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
2497 ctx, _ := testApex(t, `
2498 apex_vndk {
2499 name: "myapex",
2500 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002501 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002502 }
2503
2504 apex_key {
2505 name: "myapex.key",
2506 public_key: "testkey.avbpubkey",
2507 private_key: "testkey.pem",
2508 }
2509
2510 cc_library {
2511 name: "libvndk",
2512 srcs: ["mylib.cpp"],
2513 vendor_available: true,
2514 native_bridge_supported: true,
2515 host_supported: true,
2516 vndk: {
2517 enabled: true,
2518 },
2519 system_shared_libs: [],
2520 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002521 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002522 }
Jooyung Han35155c42020-02-06 17:33:20 +09002523 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09002524
Jooyung Hana57af4a2020-01-23 05:36:59 +00002525 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002526 "lib/libvndk.so",
2527 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002528 "lib/libc++.so",
2529 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002530 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002531 })
Jooyung Han344d5432019-08-23 11:17:39 +09002532}
2533
2534func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
2535 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
2536 apex_vndk {
2537 name: "myapex",
2538 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002539 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002540 native_bridge_supported: true,
2541 }
2542
2543 apex_key {
2544 name: "myapex.key",
2545 public_key: "testkey.avbpubkey",
2546 private_key: "testkey.pem",
2547 }
2548
2549 cc_library {
2550 name: "libvndk",
2551 srcs: ["mylib.cpp"],
2552 vendor_available: true,
2553 native_bridge_supported: true,
2554 host_supported: true,
2555 vndk: {
2556 enabled: true,
2557 },
2558 system_shared_libs: [],
2559 stl: "none",
2560 }
2561 `)
2562}
2563
Jooyung Han31c470b2019-10-18 16:26:59 +09002564func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002565 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09002566 apex_vndk {
2567 name: "myapex_v27",
2568 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002569 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09002570 vndk_version: "27",
2571 }
2572
2573 apex_key {
2574 name: "myapex.key",
2575 public_key: "testkey.avbpubkey",
2576 private_key: "testkey.pem",
2577 }
2578
2579 vndk_prebuilt_shared {
2580 name: "libvndk27",
2581 version: "27",
2582 target_arch: "arm",
2583 vendor_available: true,
2584 vndk: {
2585 enabled: true,
2586 },
2587 arch: {
2588 arm: {
2589 srcs: ["libvndk27.so"],
2590 }
2591 },
2592 }
2593
2594 vndk_prebuilt_shared {
2595 name: "libvndk27",
2596 version: "27",
2597 target_arch: "arm",
2598 binder32bit: true,
2599 vendor_available: true,
2600 vndk: {
2601 enabled: true,
2602 },
2603 arch: {
2604 arm: {
2605 srcs: ["libvndk27binder32.so"],
2606 }
2607 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002608 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002609 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002610 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09002611 withFiles(map[string][]byte{
2612 "libvndk27.so": nil,
2613 "libvndk27binder32.so": nil,
2614 }),
2615 withBinder32bit,
2616 withTargets(map[android.OsType][]android.Target{
2617 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09002618 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
2619 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09002620 },
2621 }),
2622 )
2623
Jooyung Hana57af4a2020-01-23 05:36:59 +00002624 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002625 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002626 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002627 })
2628}
2629
Jooyung Hane1633032019-08-01 17:41:43 +09002630func TestDependenciesInApexManifest(t *testing.T) {
2631 ctx, _ := testApex(t, `
2632 apex {
2633 name: "myapex_nodep",
2634 key: "myapex.key",
2635 native_shared_libs: ["lib_nodep"],
2636 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002637 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002638 }
2639
2640 apex {
2641 name: "myapex_dep",
2642 key: "myapex.key",
2643 native_shared_libs: ["lib_dep"],
2644 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002645 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002646 }
2647
2648 apex {
2649 name: "myapex_provider",
2650 key: "myapex.key",
2651 native_shared_libs: ["libfoo"],
2652 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002653 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002654 }
2655
2656 apex {
2657 name: "myapex_selfcontained",
2658 key: "myapex.key",
2659 native_shared_libs: ["lib_dep", "libfoo"],
2660 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002661 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002662 }
2663
2664 apex_key {
2665 name: "myapex.key",
2666 public_key: "testkey.avbpubkey",
2667 private_key: "testkey.pem",
2668 }
2669
2670 cc_library {
2671 name: "lib_nodep",
2672 srcs: ["mylib.cpp"],
2673 system_shared_libs: [],
2674 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002675 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09002676 }
2677
2678 cc_library {
2679 name: "lib_dep",
2680 srcs: ["mylib.cpp"],
2681 shared_libs: ["libfoo"],
2682 system_shared_libs: [],
2683 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002684 apex_available: [
2685 "myapex_dep",
2686 "myapex_provider",
2687 "myapex_selfcontained",
2688 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002689 }
2690
2691 cc_library {
2692 name: "libfoo",
2693 srcs: ["mytest.cpp"],
2694 stubs: {
2695 versions: ["1"],
2696 },
2697 system_shared_libs: [],
2698 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002699 apex_available: [
2700 "myapex_provider",
2701 "myapex_selfcontained",
2702 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002703 }
2704 `)
2705
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002706 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09002707 var provideNativeLibs, requireNativeLibs []string
2708
Sundong Ahnabb64432019-10-22 13:58:29 +09002709 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002710 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2711 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002712 ensureListEmpty(t, provideNativeLibs)
2713 ensureListEmpty(t, requireNativeLibs)
2714
Sundong Ahnabb64432019-10-22 13:58:29 +09002715 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002716 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2717 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002718 ensureListEmpty(t, provideNativeLibs)
2719 ensureListContains(t, requireNativeLibs, "libfoo.so")
2720
Sundong Ahnabb64432019-10-22 13:58:29 +09002721 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002722 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2723 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002724 ensureListContains(t, provideNativeLibs, "libfoo.so")
2725 ensureListEmpty(t, requireNativeLibs)
2726
Sundong Ahnabb64432019-10-22 13:58:29 +09002727 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002728 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2729 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002730 ensureListContains(t, provideNativeLibs, "libfoo.so")
2731 ensureListEmpty(t, requireNativeLibs)
2732}
2733
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002734func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09002735 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002736 apex {
2737 name: "myapex",
2738 key: "myapex.key",
2739 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09002740 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002741 }
2742
2743 apex_key {
2744 name: "myapex.key",
2745 public_key: "testkey.avbpubkey",
2746 private_key: "testkey.pem",
2747 }
Jiyong Parkdb334862020-02-05 17:19:28 +09002748
2749 cc_library {
2750 name: "mylib",
2751 srcs: ["mylib.cpp"],
2752 system_shared_libs: [],
2753 stl: "none",
2754 apex_available: [
2755 "//apex_available:platform",
2756 "myapex",
2757 ],
2758 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002759 `)
2760
Sundong Ahnabb64432019-10-22 13:58:29 +09002761 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002762 apexManifestRule := module.Rule("apexManifestRule")
2763 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
2764 apexRule := module.Rule("apexRule")
2765 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09002766
2767 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2768 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2769 name := apexBundle.BaseModuleName()
2770 prefix := "TARGET_"
2771 var builder strings.Builder
2772 data.Custom(&builder, name, prefix, "", data)
2773 androidMk := builder.String()
2774 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
2775 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002776}
2777
Alex Light0851b882019-02-07 13:20:53 -08002778func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002779 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002780 apex {
2781 name: "myapex",
2782 key: "myapex.key",
2783 native_shared_libs: ["mylib_common"],
2784 }
2785
2786 apex_key {
2787 name: "myapex.key",
2788 public_key: "testkey.avbpubkey",
2789 private_key: "testkey.pem",
2790 }
2791
2792 cc_library {
2793 name: "mylib_common",
2794 srcs: ["mylib.cpp"],
2795 system_shared_libs: [],
2796 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002797 apex_available: [
2798 "//apex_available:platform",
2799 "myapex",
2800 ],
Alex Light0851b882019-02-07 13:20:53 -08002801 }
2802 `)
2803
Sundong Ahnabb64432019-10-22 13:58:29 +09002804 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002805 apexRule := module.Rule("apexRule")
2806 copyCmds := apexRule.Args["copy_commands"]
2807
2808 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
2809 t.Log("Apex was a test apex!")
2810 t.Fail()
2811 }
2812 // Ensure that main rule creates an output
2813 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2814
2815 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002816 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08002817
2818 // Ensure that both direct and indirect deps are copied into apex
2819 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2820
Colin Cross7113d202019-11-20 16:39:12 -08002821 // Ensure that the platform variant ends with _shared
2822 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08002823
2824 if !android.InAnyApex("mylib_common") {
2825 t.Log("Found mylib_common not in any apex!")
2826 t.Fail()
2827 }
2828}
2829
2830func TestTestApex(t *testing.T) {
2831 if android.InAnyApex("mylib_common_test") {
2832 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!")
2833 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002834 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002835 apex_test {
2836 name: "myapex",
2837 key: "myapex.key",
2838 native_shared_libs: ["mylib_common_test"],
2839 }
2840
2841 apex_key {
2842 name: "myapex.key",
2843 public_key: "testkey.avbpubkey",
2844 private_key: "testkey.pem",
2845 }
2846
2847 cc_library {
2848 name: "mylib_common_test",
2849 srcs: ["mylib.cpp"],
2850 system_shared_libs: [],
2851 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002852 // TODO: remove //apex_available:platform
2853 apex_available: [
2854 "//apex_available:platform",
2855 "myapex",
2856 ],
Alex Light0851b882019-02-07 13:20:53 -08002857 }
2858 `)
2859
Sundong Ahnabb64432019-10-22 13:58:29 +09002860 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002861 apexRule := module.Rule("apexRule")
2862 copyCmds := apexRule.Args["copy_commands"]
2863
2864 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
2865 t.Log("Apex was not a test apex!")
2866 t.Fail()
2867 }
2868 // Ensure that main rule creates an output
2869 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2870
2871 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002872 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08002873
2874 // Ensure that both direct and indirect deps are copied into apex
2875 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
2876
Colin Cross7113d202019-11-20 16:39:12 -08002877 // Ensure that the platform variant ends with _shared
2878 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08002879}
2880
Alex Light9670d332019-01-29 18:07:33 -08002881func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002882 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08002883 apex {
2884 name: "myapex",
2885 key: "myapex.key",
2886 multilib: {
2887 first: {
2888 native_shared_libs: ["mylib_common"],
2889 }
2890 },
2891 target: {
2892 android: {
2893 multilib: {
2894 first: {
2895 native_shared_libs: ["mylib"],
2896 }
2897 }
2898 },
2899 host: {
2900 multilib: {
2901 first: {
2902 native_shared_libs: ["mylib2"],
2903 }
2904 }
2905 }
2906 }
2907 }
2908
2909 apex_key {
2910 name: "myapex.key",
2911 public_key: "testkey.avbpubkey",
2912 private_key: "testkey.pem",
2913 }
2914
2915 cc_library {
2916 name: "mylib",
2917 srcs: ["mylib.cpp"],
2918 system_shared_libs: [],
2919 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002920 // TODO: remove //apex_available:platform
2921 apex_available: [
2922 "//apex_available:platform",
2923 "myapex",
2924 ],
Alex Light9670d332019-01-29 18:07:33 -08002925 }
2926
2927 cc_library {
2928 name: "mylib_common",
2929 srcs: ["mylib.cpp"],
2930 system_shared_libs: [],
2931 stl: "none",
2932 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002933 // TODO: remove //apex_available:platform
2934 apex_available: [
2935 "//apex_available:platform",
2936 "myapex",
2937 ],
Alex Light9670d332019-01-29 18:07:33 -08002938 }
2939
2940 cc_library {
2941 name: "mylib2",
2942 srcs: ["mylib.cpp"],
2943 system_shared_libs: [],
2944 stl: "none",
2945 compile_multilib: "first",
2946 }
2947 `)
2948
Sundong Ahnabb64432019-10-22 13:58:29 +09002949 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08002950 copyCmds := apexRule.Args["copy_commands"]
2951
2952 // Ensure that main rule creates an output
2953 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
2954
2955 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08002956 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
2957 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
2958 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08002959
2960 // Ensure that both direct and indirect deps are copied into apex
2961 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
2962 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
2963 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
2964
Colin Cross7113d202019-11-20 16:39:12 -08002965 // Ensure that the platform variant ends with _shared
2966 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
2967 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
2968 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08002969}
Jiyong Park04480cf2019-02-06 00:16:29 +09002970
2971func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002972 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09002973 apex {
2974 name: "myapex",
2975 key: "myapex.key",
2976 binaries: ["myscript"],
2977 }
2978
2979 apex_key {
2980 name: "myapex.key",
2981 public_key: "testkey.avbpubkey",
2982 private_key: "testkey.pem",
2983 }
2984
2985 sh_binary {
2986 name: "myscript",
2987 src: "mylib.cpp",
2988 filename: "myscript.sh",
2989 sub_dir: "script",
2990 }
2991 `)
2992
Sundong Ahnabb64432019-10-22 13:58:29 +09002993 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09002994 copyCmds := apexRule.Args["copy_commands"]
2995
2996 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
2997}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002998
Jooyung Han91df2082019-11-20 01:49:42 +09002999func TestApexInVariousPartition(t *testing.T) {
3000 testcases := []struct {
3001 propName, parition, flattenedPartition string
3002 }{
3003 {"", "system", "system_ext"},
3004 {"product_specific: true", "product", "product"},
3005 {"soc_specific: true", "vendor", "vendor"},
3006 {"proprietary: true", "vendor", "vendor"},
3007 {"vendor: true", "vendor", "vendor"},
3008 {"system_ext_specific: true", "system_ext", "system_ext"},
3009 }
3010 for _, tc := range testcases {
3011 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3012 ctx, _ := testApex(t, `
3013 apex {
3014 name: "myapex",
3015 key: "myapex.key",
3016 `+tc.propName+`
3017 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003018
Jooyung Han91df2082019-11-20 01:49:42 +09003019 apex_key {
3020 name: "myapex.key",
3021 public_key: "testkey.avbpubkey",
3022 private_key: "testkey.pem",
3023 }
3024 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003025
Jooyung Han91df2082019-11-20 01:49:42 +09003026 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3027 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3028 actual := apex.installDir.String()
3029 if actual != expected {
3030 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3031 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003032
Jooyung Han91df2082019-11-20 01:49:42 +09003033 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3034 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3035 actual = flattened.installDir.String()
3036 if actual != expected {
3037 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3038 }
3039 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003040 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003041}
Jiyong Park67882562019-03-21 01:11:21 +09003042
Jooyung Han54aca7b2019-11-20 02:26:02 +09003043func TestFileContexts(t *testing.T) {
3044 ctx, _ := testApex(t, `
3045 apex {
3046 name: "myapex",
3047 key: "myapex.key",
3048 }
3049
3050 apex_key {
3051 name: "myapex.key",
3052 public_key: "testkey.avbpubkey",
3053 private_key: "testkey.pem",
3054 }
3055 `)
3056 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3057 apexRule := module.Rule("apexRule")
3058 actual := apexRule.Args["file_contexts"]
3059 expected := "system/sepolicy/apex/myapex-file_contexts"
3060 if actual != expected {
3061 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3062 }
3063
3064 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
3065 apex {
3066 name: "myapex",
3067 key: "myapex.key",
3068 file_contexts: "my_own_file_contexts",
3069 }
3070
3071 apex_key {
3072 name: "myapex.key",
3073 public_key: "testkey.avbpubkey",
3074 private_key: "testkey.pem",
3075 }
3076 `, withFiles(map[string][]byte{
3077 "my_own_file_contexts": nil,
3078 }))
3079
3080 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
3081 apex {
3082 name: "myapex",
3083 key: "myapex.key",
3084 product_specific: true,
3085 file_contexts: "product_specific_file_contexts",
3086 }
3087
3088 apex_key {
3089 name: "myapex.key",
3090 public_key: "testkey.avbpubkey",
3091 private_key: "testkey.pem",
3092 }
3093 `)
3094
3095 ctx, _ = testApex(t, `
3096 apex {
3097 name: "myapex",
3098 key: "myapex.key",
3099 product_specific: true,
3100 file_contexts: "product_specific_file_contexts",
3101 }
3102
3103 apex_key {
3104 name: "myapex.key",
3105 public_key: "testkey.avbpubkey",
3106 private_key: "testkey.pem",
3107 }
3108 `, withFiles(map[string][]byte{
3109 "product_specific_file_contexts": nil,
3110 }))
3111 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3112 apexRule = module.Rule("apexRule")
3113 actual = apexRule.Args["file_contexts"]
3114 expected = "product_specific_file_contexts"
3115 if actual != expected {
3116 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3117 }
3118
3119 ctx, _ = testApex(t, `
3120 apex {
3121 name: "myapex",
3122 key: "myapex.key",
3123 product_specific: true,
3124 file_contexts: ":my-file-contexts",
3125 }
3126
3127 apex_key {
3128 name: "myapex.key",
3129 public_key: "testkey.avbpubkey",
3130 private_key: "testkey.pem",
3131 }
3132
3133 filegroup {
3134 name: "my-file-contexts",
3135 srcs: ["product_specific_file_contexts"],
3136 }
3137 `, withFiles(map[string][]byte{
3138 "product_specific_file_contexts": nil,
3139 }))
3140 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3141 apexRule = module.Rule("apexRule")
3142 actual = apexRule.Args["file_contexts"]
3143 expected = "product_specific_file_contexts"
3144 if actual != expected {
3145 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3146 }
3147}
3148
Jiyong Park67882562019-03-21 01:11:21 +09003149func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003150 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003151 apex_key {
3152 name: "myapex.key",
3153 public_key: ":my.avbpubkey",
3154 private_key: ":my.pem",
3155 product_specific: true,
3156 }
3157
3158 filegroup {
3159 name: "my.avbpubkey",
3160 srcs: ["testkey2.avbpubkey"],
3161 }
3162
3163 filegroup {
3164 name: "my.pem",
3165 srcs: ["testkey2.pem"],
3166 }
3167 `)
3168
3169 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3170 expected_pubkey := "testkey2.avbpubkey"
3171 actual_pubkey := apex_key.public_key_file.String()
3172 if actual_pubkey != expected_pubkey {
3173 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3174 }
3175 expected_privkey := "testkey2.pem"
3176 actual_privkey := apex_key.private_key_file.String()
3177 if actual_privkey != expected_privkey {
3178 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3179 }
3180}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003181
3182func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003183 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003184 prebuilt_apex {
3185 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003186 arch: {
3187 arm64: {
3188 src: "myapex-arm64.apex",
3189 },
3190 arm: {
3191 src: "myapex-arm.apex",
3192 },
3193 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003194 }
3195 `)
3196
3197 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3198
Jiyong Parkc95714e2019-03-29 14:23:10 +09003199 expectedInput := "myapex-arm64.apex"
3200 if prebuilt.inputApex.String() != expectedInput {
3201 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3202 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003203}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003204
3205func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003206 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003207 prebuilt_apex {
3208 name: "myapex",
3209 src: "myapex-arm.apex",
3210 filename: "notmyapex.apex",
3211 }
3212 `)
3213
3214 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3215
3216 expected := "notmyapex.apex"
3217 if p.installFilename != expected {
3218 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3219 }
3220}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003221
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003222func TestPrebuiltOverrides(t *testing.T) {
3223 ctx, config := testApex(t, `
3224 prebuilt_apex {
3225 name: "myapex.prebuilt",
3226 src: "myapex-arm.apex",
3227 overrides: [
3228 "myapex",
3229 ],
3230 }
3231 `)
3232
3233 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3234
3235 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003236 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003237 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003238 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003239 }
3240}
3241
Roland Levillain630846d2019-06-26 12:48:34 +01003242func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003243 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003244 apex_test {
3245 name: "myapex",
3246 key: "myapex.key",
3247 tests: [
3248 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003249 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003250 ],
3251 }
3252
3253 apex_key {
3254 name: "myapex.key",
3255 public_key: "testkey.avbpubkey",
3256 private_key: "testkey.pem",
3257 }
3258
3259 cc_test {
3260 name: "mytest",
3261 gtest: false,
3262 srcs: ["mytest.cpp"],
3263 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003264 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003265 system_shared_libs: [],
3266 static_executable: true,
3267 stl: "none",
3268 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003269
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003270 cc_library {
3271 name: "mylib",
3272 srcs: ["mylib.cpp"],
3273 system_shared_libs: [],
3274 stl: "none",
3275 }
3276
Roland Levillain9b5fde92019-06-28 15:41:19 +01003277 cc_test {
3278 name: "mytests",
3279 gtest: false,
3280 srcs: [
3281 "mytest1.cpp",
3282 "mytest2.cpp",
3283 "mytest3.cpp",
3284 ],
3285 test_per_src: true,
3286 relative_install_path: "test",
3287 system_shared_libs: [],
3288 static_executable: true,
3289 stl: "none",
3290 }
Roland Levillain630846d2019-06-26 12:48:34 +01003291 `)
3292
Sundong Ahnabb64432019-10-22 13:58:29 +09003293 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003294 copyCmds := apexRule.Args["copy_commands"]
3295
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003296 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003297 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003298 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003299
3300 // Ensure that test deps built with `test_per_src` are copied into apex.
3301 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3302 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3303 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003304
3305 // Ensure the module is correctly translated.
Sundong Ahnabb64432019-10-22 13:58:29 +09003306 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Roland Levillainf89cd092019-07-29 16:22:59 +01003307 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3308 name := apexBundle.BaseModuleName()
3309 prefix := "TARGET_"
3310 var builder strings.Builder
3311 data.Custom(&builder, name, prefix, "", data)
3312 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003313 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3314 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3315 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3316 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003317 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003318 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003319 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003320}
3321
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003322func TestInstallExtraFlattenedApexes(t *testing.T) {
3323 ctx, config := testApex(t, `
3324 apex {
3325 name: "myapex",
3326 key: "myapex.key",
3327 }
3328 apex_key {
3329 name: "myapex.key",
3330 public_key: "testkey.avbpubkey",
3331 private_key: "testkey.pem",
3332 }
3333 `, func(fs map[string][]byte, config android.Config) {
3334 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3335 })
3336 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003337 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003338 mk := android.AndroidMkDataForTest(t, config, "", ab)
3339 var builder strings.Builder
3340 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3341 androidMk := builder.String()
3342 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3343}
3344
Jooyung Han5c998b92019-06-27 11:30:33 +09003345func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003346 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003347 apex {
3348 name: "myapex",
3349 key: "myapex.key",
3350 native_shared_libs: ["mylib"],
3351 uses: ["commonapex"],
3352 }
3353
3354 apex {
3355 name: "commonapex",
3356 key: "myapex.key",
3357 native_shared_libs: ["libcommon"],
3358 provide_cpp_shared_libs: true,
3359 }
3360
3361 apex_key {
3362 name: "myapex.key",
3363 public_key: "testkey.avbpubkey",
3364 private_key: "testkey.pem",
3365 }
3366
3367 cc_library {
3368 name: "mylib",
3369 srcs: ["mylib.cpp"],
3370 shared_libs: ["libcommon"],
3371 system_shared_libs: [],
3372 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003373 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003374 }
3375
3376 cc_library {
3377 name: "libcommon",
3378 srcs: ["mylib_common.cpp"],
3379 system_shared_libs: [],
3380 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003381 // TODO: remove //apex_available:platform
3382 apex_available: [
3383 "//apex_available:platform",
3384 "commonapex",
3385 "myapex",
3386 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003387 }
3388 `)
3389
Sundong Ahnabb64432019-10-22 13:58:29 +09003390 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003391 apexRule1 := module1.Rule("apexRule")
3392 copyCmds1 := apexRule1.Args["copy_commands"]
3393
Sundong Ahnabb64432019-10-22 13:58:29 +09003394 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003395 apexRule2 := module2.Rule("apexRule")
3396 copyCmds2 := apexRule2.Args["copy_commands"]
3397
Colin Cross7113d202019-11-20 16:39:12 -08003398 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3399 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09003400 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
3401 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
3402 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
3403}
3404
3405func TestApexUsesFailsIfNotProvided(t *testing.T) {
3406 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
3407 apex {
3408 name: "myapex",
3409 key: "myapex.key",
3410 uses: ["commonapex"],
3411 }
3412
3413 apex {
3414 name: "commonapex",
3415 key: "myapex.key",
3416 }
3417
3418 apex_key {
3419 name: "myapex.key",
3420 public_key: "testkey.avbpubkey",
3421 private_key: "testkey.pem",
3422 }
3423 `)
3424 testApexError(t, `uses: "commonapex" is not a provider`, `
3425 apex {
3426 name: "myapex",
3427 key: "myapex.key",
3428 uses: ["commonapex"],
3429 }
3430
3431 cc_library {
3432 name: "commonapex",
3433 system_shared_libs: [],
3434 stl: "none",
3435 }
3436
3437 apex_key {
3438 name: "myapex.key",
3439 public_key: "testkey.avbpubkey",
3440 private_key: "testkey.pem",
3441 }
3442 `)
3443}
3444
3445func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
3446 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
3447 apex {
3448 name: "myapex",
3449 key: "myapex.key",
3450 use_vendor: true,
3451 uses: ["commonapex"],
3452 }
3453
3454 apex {
3455 name: "commonapex",
3456 key: "myapex.key",
3457 provide_cpp_shared_libs: true,
3458 }
3459
3460 apex_key {
3461 name: "myapex.key",
3462 public_key: "testkey.avbpubkey",
3463 private_key: "testkey.pem",
3464 }
Jooyung Handc782442019-11-01 03:14:38 +09003465 `, func(fs map[string][]byte, config android.Config) {
3466 setUseVendorWhitelistForTest(config, []string{"myapex"})
3467 })
Jooyung Han5c998b92019-06-27 11:30:33 +09003468}
3469
Jooyung Hand48f3c32019-08-23 11:18:57 +09003470func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
3471 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
3472 apex {
3473 name: "myapex",
3474 key: "myapex.key",
3475 native_shared_libs: ["libfoo"],
3476 }
3477
3478 apex_key {
3479 name: "myapex.key",
3480 public_key: "testkey.avbpubkey",
3481 private_key: "testkey.pem",
3482 }
3483
3484 cc_library {
3485 name: "libfoo",
3486 stl: "none",
3487 system_shared_libs: [],
3488 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003489 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003490 }
3491 `)
3492 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
3493 apex {
3494 name: "myapex",
3495 key: "myapex.key",
3496 java_libs: ["myjar"],
3497 }
3498
3499 apex_key {
3500 name: "myapex.key",
3501 public_key: "testkey.avbpubkey",
3502 private_key: "testkey.pem",
3503 }
3504
3505 java_library {
3506 name: "myjar",
3507 srcs: ["foo/bar/MyClass.java"],
3508 sdk_version: "none",
3509 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09003510 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003511 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003512 }
3513 `)
3514}
3515
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003516func TestApexWithApps(t *testing.T) {
3517 ctx, _ := testApex(t, `
3518 apex {
3519 name: "myapex",
3520 key: "myapex.key",
3521 apps: [
3522 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09003523 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003524 ],
3525 }
3526
3527 apex_key {
3528 name: "myapex.key",
3529 public_key: "testkey.avbpubkey",
3530 private_key: "testkey.pem",
3531 }
3532
3533 android_app {
3534 name: "AppFoo",
3535 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003536 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003537 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09003538 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08003539 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003540 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003541 }
Jiyong Parkf7487312019-10-17 12:54:30 +09003542
3543 android_app {
3544 name: "AppFooPriv",
3545 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003546 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09003547 system_modules: "none",
3548 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08003549 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003550 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09003551 }
Jiyong Park8be103b2019-11-08 15:53:48 +09003552
3553 cc_library_shared {
3554 name: "libjni",
3555 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003556 shared_libs: ["libfoo"],
3557 stl: "none",
3558 system_shared_libs: [],
3559 apex_available: [ "myapex" ],
3560 sdk_version: "current",
3561 }
3562
3563 cc_library_shared {
3564 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09003565 stl: "none",
3566 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09003567 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08003568 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09003569 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003570 `)
3571
Sundong Ahnabb64432019-10-22 13:58:29 +09003572 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003573 apexRule := module.Rule("apexRule")
3574 copyCmds := apexRule.Args["copy_commands"]
3575
3576 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09003577 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003578
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003579 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
3580 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09003581 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003582 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003583 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003584 // JNI libraries including transitive deps are
3585 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00003586 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003587 // ... embedded inside APK (jnilibs.zip)
3588 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
3589 // ... and not directly inside the APEX
3590 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
3591 }
Dario Frenicde2a032019-10-27 00:29:22 +01003592}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003593
Dario Frenicde2a032019-10-27 00:29:22 +01003594func TestApexWithAppImports(t *testing.T) {
3595 ctx, _ := testApex(t, `
3596 apex {
3597 name: "myapex",
3598 key: "myapex.key",
3599 apps: [
3600 "AppFooPrebuilt",
3601 "AppFooPrivPrebuilt",
3602 ],
3603 }
3604
3605 apex_key {
3606 name: "myapex.key",
3607 public_key: "testkey.avbpubkey",
3608 private_key: "testkey.pem",
3609 }
3610
3611 android_app_import {
3612 name: "AppFooPrebuilt",
3613 apk: "PrebuiltAppFoo.apk",
3614 presigned: true,
3615 dex_preopt: {
3616 enabled: false,
3617 },
Jiyong Park592a6a42020-04-21 22:34:28 +09003618 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003619 }
3620
3621 android_app_import {
3622 name: "AppFooPrivPrebuilt",
3623 apk: "PrebuiltAppFooPriv.apk",
3624 privileged: true,
3625 presigned: true,
3626 dex_preopt: {
3627 enabled: false,
3628 },
Jooyung Han39ee1192020-03-23 20:21:11 +09003629 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09003630 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003631 }
3632 `)
3633
Sundong Ahnabb64432019-10-22 13:58:29 +09003634 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01003635 apexRule := module.Rule("apexRule")
3636 copyCmds := apexRule.Args["copy_commands"]
3637
3638 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09003639 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
3640}
3641
3642func TestApexWithAppImportsPrefer(t *testing.T) {
3643 ctx, _ := testApex(t, `
3644 apex {
3645 name: "myapex",
3646 key: "myapex.key",
3647 apps: [
3648 "AppFoo",
3649 ],
3650 }
3651
3652 apex_key {
3653 name: "myapex.key",
3654 public_key: "testkey.avbpubkey",
3655 private_key: "testkey.pem",
3656 }
3657
3658 android_app {
3659 name: "AppFoo",
3660 srcs: ["foo/bar/MyClass.java"],
3661 sdk_version: "none",
3662 system_modules: "none",
3663 apex_available: [ "myapex" ],
3664 }
3665
3666 android_app_import {
3667 name: "AppFoo",
3668 apk: "AppFooPrebuilt.apk",
3669 filename: "AppFooPrebuilt.apk",
3670 presigned: true,
3671 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09003672 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09003673 }
3674 `, withFiles(map[string][]byte{
3675 "AppFooPrebuilt.apk": nil,
3676 }))
3677
3678 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3679 "app/AppFoo/AppFooPrebuilt.apk",
3680 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003681}
3682
Dario Freni6f3937c2019-12-20 22:58:03 +00003683func TestApexWithTestHelperApp(t *testing.T) {
3684 ctx, _ := testApex(t, `
3685 apex {
3686 name: "myapex",
3687 key: "myapex.key",
3688 apps: [
3689 "TesterHelpAppFoo",
3690 ],
3691 }
3692
3693 apex_key {
3694 name: "myapex.key",
3695 public_key: "testkey.avbpubkey",
3696 private_key: "testkey.pem",
3697 }
3698
3699 android_test_helper_app {
3700 name: "TesterHelpAppFoo",
3701 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003702 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00003703 }
3704
3705 `)
3706
3707 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3708 apexRule := module.Rule("apexRule")
3709 copyCmds := apexRule.Args["copy_commands"]
3710
3711 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
3712}
3713
Jooyung Han18020ea2019-11-13 10:50:48 +09003714func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
3715 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09003716 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09003717 apex {
3718 name: "myapex",
3719 key: "myapex.key",
3720 native_shared_libs: ["libfoo"],
3721 }
3722
3723 apex_key {
3724 name: "myapex.key",
3725 public_key: "testkey.avbpubkey",
3726 private_key: "testkey.pem",
3727 }
3728
3729 apex {
3730 name: "otherapex",
3731 key: "myapex.key",
3732 native_shared_libs: ["libfoo"],
3733 }
3734
3735 cc_defaults {
3736 name: "libfoo-defaults",
3737 apex_available: ["otherapex"],
3738 }
3739
3740 cc_library {
3741 name: "libfoo",
3742 defaults: ["libfoo-defaults"],
3743 stl: "none",
3744 system_shared_libs: [],
3745 }`)
3746}
3747
Paul Duffine52e66f2020-03-30 17:54:29 +01003748func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003749 // libfoo is not available to myapex, but only to otherapex
3750 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
3751 apex {
3752 name: "myapex",
3753 key: "myapex.key",
3754 native_shared_libs: ["libfoo"],
3755 }
3756
3757 apex_key {
3758 name: "myapex.key",
3759 public_key: "testkey.avbpubkey",
3760 private_key: "testkey.pem",
3761 }
3762
3763 apex {
3764 name: "otherapex",
3765 key: "otherapex.key",
3766 native_shared_libs: ["libfoo"],
3767 }
3768
3769 apex_key {
3770 name: "otherapex.key",
3771 public_key: "testkey.avbpubkey",
3772 private_key: "testkey.pem",
3773 }
3774
3775 cc_library {
3776 name: "libfoo",
3777 stl: "none",
3778 system_shared_libs: [],
3779 apex_available: ["otherapex"],
3780 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003781}
Jiyong Park127b40b2019-09-30 16:04:35 +09003782
Paul Duffine52e66f2020-03-30 17:54:29 +01003783func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09003784 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01003785 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01003786.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003787.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003788.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01003789.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01003790.*via tag cc\.DependencyTag.*"shared".*
3791.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003792 apex {
3793 name: "myapex",
3794 key: "myapex.key",
3795 native_shared_libs: ["libfoo"],
3796 }
3797
3798 apex_key {
3799 name: "myapex.key",
3800 public_key: "testkey.avbpubkey",
3801 private_key: "testkey.pem",
3802 }
3803
Jiyong Park127b40b2019-09-30 16:04:35 +09003804 cc_library {
3805 name: "libfoo",
3806 stl: "none",
3807 shared_libs: ["libbar"],
3808 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09003809 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003810 }
3811
3812 cc_library {
3813 name: "libbar",
3814 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09003815 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003816 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09003817 apex_available: ["myapex"],
3818 }
3819
3820 cc_library {
3821 name: "libbaz",
3822 stl: "none",
3823 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09003824 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003825}
Jiyong Park127b40b2019-09-30 16:04:35 +09003826
Paul Duffine52e66f2020-03-30 17:54:29 +01003827func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003828 testApexError(t, "\"otherapex\" is not a valid module name", `
3829 apex {
3830 name: "myapex",
3831 key: "myapex.key",
3832 native_shared_libs: ["libfoo"],
3833 }
3834
3835 apex_key {
3836 name: "myapex.key",
3837 public_key: "testkey.avbpubkey",
3838 private_key: "testkey.pem",
3839 }
3840
3841 cc_library {
3842 name: "libfoo",
3843 stl: "none",
3844 system_shared_libs: [],
3845 apex_available: ["otherapex"],
3846 }`)
3847
Paul Duffine52e66f2020-03-30 17:54:29 +01003848 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003849 apex {
3850 name: "myapex",
3851 key: "myapex.key",
3852 native_shared_libs: ["libfoo", "libbar"],
3853 }
3854
3855 apex_key {
3856 name: "myapex.key",
3857 public_key: "testkey.avbpubkey",
3858 private_key: "testkey.pem",
3859 }
3860
3861 cc_library {
3862 name: "libfoo",
3863 stl: "none",
3864 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09003865 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003866 apex_available: ["myapex"],
3867 }
3868
3869 cc_library {
3870 name: "libbar",
3871 stl: "none",
3872 system_shared_libs: [],
3873 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09003874 }
3875
3876 cc_library {
3877 name: "libbaz",
3878 stl: "none",
3879 system_shared_libs: [],
3880 stubs: {
3881 versions: ["10", "20", "30"],
3882 },
Jiyong Park127b40b2019-09-30 16:04:35 +09003883 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01003884}
Jiyong Park127b40b2019-09-30 16:04:35 +09003885
Jiyong Park89e850a2020-04-07 16:37:39 +09003886func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01003887 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09003888 apex {
3889 name: "myapex",
3890 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09003891 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003892 }
3893
3894 apex_key {
3895 name: "myapex.key",
3896 public_key: "testkey.avbpubkey",
3897 private_key: "testkey.pem",
3898 }
3899
3900 cc_library {
3901 name: "libfoo",
3902 stl: "none",
3903 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09003904 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09003905 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09003906 }
3907
3908 cc_library {
3909 name: "libfoo2",
3910 stl: "none",
3911 system_shared_libs: [],
3912 shared_libs: ["libbaz"],
3913 apex_available: ["//apex_available:platform"],
3914 }
3915
3916 cc_library {
3917 name: "libbar",
3918 stl: "none",
3919 system_shared_libs: [],
3920 apex_available: ["myapex"],
3921 }
3922
3923 cc_library {
3924 name: "libbaz",
3925 stl: "none",
3926 system_shared_libs: [],
3927 apex_available: ["myapex"],
3928 stubs: {
3929 versions: ["1"],
3930 },
Jiyong Park127b40b2019-09-30 16:04:35 +09003931 }`)
3932
Jiyong Park89e850a2020-04-07 16:37:39 +09003933 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
3934 // because it depends on libbar which isn't available to platform
3935 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3936 if libfoo.NotAvailableForPlatform() != true {
3937 t.Errorf("%q shouldn't be available to platform", libfoo.String())
3938 }
3939
3940 // libfoo2 however can be available to platform because it depends on libbaz which provides
3941 // stubs
3942 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3943 if libfoo2.NotAvailableForPlatform() == true {
3944 t.Errorf("%q should be available to platform", libfoo2.String())
3945 }
Paul Duffine52e66f2020-03-30 17:54:29 +01003946}
Jiyong Parka90ca002019-10-07 15:47:24 +09003947
Paul Duffine52e66f2020-03-30 17:54:29 +01003948func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09003949 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09003950 apex {
3951 name: "myapex",
3952 key: "myapex.key",
3953 native_shared_libs: ["libfoo"],
3954 }
3955
3956 apex_key {
3957 name: "myapex.key",
3958 public_key: "testkey.avbpubkey",
3959 private_key: "testkey.pem",
3960 }
3961
3962 cc_library {
3963 name: "libfoo",
3964 stl: "none",
3965 system_shared_libs: [],
3966 apex_available: ["myapex"],
3967 static: {
3968 apex_available: ["//apex_available:platform"],
3969 },
3970 }`)
3971
Jiyong Park89e850a2020-04-07 16:37:39 +09003972 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
3973 if libfooShared.NotAvailableForPlatform() != true {
3974 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
3975 }
3976 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
3977 if libfooStatic.NotAvailableForPlatform() != false {
3978 t.Errorf("%q should be available to platform", libfooStatic.String())
3979 }
Jiyong Park127b40b2019-09-30 16:04:35 +09003980}
3981
Jiyong Park5d790c32019-11-15 18:40:32 +09003982func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08003983 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09003984 apex {
3985 name: "myapex",
3986 key: "myapex.key",
3987 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003988 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09003989 }
3990
3991 override_apex {
3992 name: "override_myapex",
3993 base: "myapex",
3994 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08003995 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08003996 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07003997 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09003998 }
3999
4000 apex_key {
4001 name: "myapex.key",
4002 public_key: "testkey.avbpubkey",
4003 private_key: "testkey.pem",
4004 }
4005
4006 android_app {
4007 name: "app",
4008 srcs: ["foo/bar/MyClass.java"],
4009 package_name: "foo",
4010 sdk_version: "none",
4011 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004012 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004013 }
4014
4015 override_android_app {
4016 name: "override_app",
4017 base: "app",
4018 package_name: "bar",
4019 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004020 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004021
Jiyong Park317645e2019-12-05 13:20:58 +09004022 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4023 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4024 if originalVariant.GetOverriddenBy() != "" {
4025 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4026 }
4027 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4028 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4029 }
4030
Jiyong Park5d790c32019-11-15 18:40:32 +09004031 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4032 apexRule := module.Rule("apexRule")
4033 copyCmds := apexRule.Args["copy_commands"]
4034
4035 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004036 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004037
4038 apexBundle := module.Module().(*apexBundle)
4039 name := apexBundle.Name()
4040 if name != "override_myapex" {
4041 t.Errorf("name should be \"override_myapex\", but was %q", name)
4042 }
4043
Baligh Uddin004d7172020-02-19 21:29:28 -08004044 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4045 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4046 }
4047
Jiyong Park20bacab2020-03-03 11:45:41 +09004048 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004049 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004050
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004051 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4052 var builder strings.Builder
4053 data.Custom(&builder, name, "TARGET_", "", data)
4054 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004055 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004056 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4057 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004058 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004059 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004060 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004061 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4062 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004063}
4064
Jooyung Han214bf372019-11-12 13:03:50 +09004065func TestLegacyAndroid10Support(t *testing.T) {
4066 ctx, _ := testApex(t, `
4067 apex {
4068 name: "myapex",
4069 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004070 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004071 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004072 }
4073
4074 apex_key {
4075 name: "myapex.key",
4076 public_key: "testkey.avbpubkey",
4077 private_key: "testkey.pem",
4078 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004079
4080 cc_library {
4081 name: "mylib",
4082 srcs: ["mylib.cpp"],
4083 stl: "libc++",
4084 system_shared_libs: [],
4085 apex_available: [ "myapex" ],
4086 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004087 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004088
4089 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4090 args := module.Rule("apexRule").Args
4091 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004092 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004093
4094 // The copies of the libraries in the apex should have one more dependency than
4095 // the ones outside the apex, namely the unwinder. Ideally we should check
4096 // the dependency names directly here but for some reason the names are blank in
4097 // this test.
4098 for _, lib := range []string{"libc++", "mylib"} {
4099 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4100 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4101 if len(apexImplicits) != len(nonApexImplicits)+1 {
4102 t.Errorf("%q missing unwinder dep", lib)
4103 }
4104 }
Jooyung Han214bf372019-11-12 13:03:50 +09004105}
4106
Jooyung Han58f26ab2019-12-18 15:34:32 +09004107func TestJavaSDKLibrary(t *testing.T) {
4108 ctx, _ := testApex(t, `
4109 apex {
4110 name: "myapex",
4111 key: "myapex.key",
4112 java_libs: ["foo"],
4113 }
4114
4115 apex_key {
4116 name: "myapex.key",
4117 public_key: "testkey.avbpubkey",
4118 private_key: "testkey.pem",
4119 }
4120
4121 java_sdk_library {
4122 name: "foo",
4123 srcs: ["a.java"],
4124 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004125 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004126 }
4127 `, withFiles(map[string][]byte{
4128 "api/current.txt": nil,
4129 "api/removed.txt": nil,
4130 "api/system-current.txt": nil,
4131 "api/system-removed.txt": nil,
4132 "api/test-current.txt": nil,
4133 "api/test-removed.txt": nil,
4134 }))
4135
4136 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004137 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004138 "javalib/foo.jar",
4139 "etc/permissions/foo.xml",
4140 })
4141 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004142 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4143 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004144}
4145
atrost6e126252020-01-27 17:01:16 +00004146func TestCompatConfig(t *testing.T) {
4147 ctx, _ := testApex(t, `
4148 apex {
4149 name: "myapex",
4150 key: "myapex.key",
4151 prebuilts: ["myjar-platform-compat-config"],
4152 java_libs: ["myjar"],
4153 }
4154
4155 apex_key {
4156 name: "myapex.key",
4157 public_key: "testkey.avbpubkey",
4158 private_key: "testkey.pem",
4159 }
4160
4161 platform_compat_config {
4162 name: "myjar-platform-compat-config",
4163 src: ":myjar",
4164 }
4165
4166 java_library {
4167 name: "myjar",
4168 srcs: ["foo/bar/MyClass.java"],
4169 sdk_version: "none",
4170 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004171 apex_available: [ "myapex" ],
4172 }
4173 `)
4174 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4175 "etc/compatconfig/myjar-platform-compat-config.xml",
4176 "javalib/myjar.jar",
4177 })
4178}
4179
Jiyong Park479321d2019-12-16 11:47:12 +09004180func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4181 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4182 apex {
4183 name: "myapex",
4184 key: "myapex.key",
4185 java_libs: ["myjar"],
4186 }
4187
4188 apex_key {
4189 name: "myapex.key",
4190 public_key: "testkey.avbpubkey",
4191 private_key: "testkey.pem",
4192 }
4193
4194 java_library {
4195 name: "myjar",
4196 srcs: ["foo/bar/MyClass.java"],
4197 sdk_version: "none",
4198 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09004199 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004200 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09004201 }
4202 `)
4203}
4204
Jiyong Park7afd1072019-12-30 16:56:33 +09004205func TestCarryRequiredModuleNames(t *testing.T) {
4206 ctx, config := testApex(t, `
4207 apex {
4208 name: "myapex",
4209 key: "myapex.key",
4210 native_shared_libs: ["mylib"],
4211 }
4212
4213 apex_key {
4214 name: "myapex.key",
4215 public_key: "testkey.avbpubkey",
4216 private_key: "testkey.pem",
4217 }
4218
4219 cc_library {
4220 name: "mylib",
4221 srcs: ["mylib.cpp"],
4222 system_shared_libs: [],
4223 stl: "none",
4224 required: ["a", "b"],
4225 host_required: ["c", "d"],
4226 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004227 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09004228 }
4229 `)
4230
4231 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4232 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4233 name := apexBundle.BaseModuleName()
4234 prefix := "TARGET_"
4235 var builder strings.Builder
4236 data.Custom(&builder, name, prefix, "", data)
4237 androidMk := builder.String()
4238 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
4239 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
4240 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
4241}
4242
Jiyong Park7cd10e32020-01-14 09:22:18 +09004243func TestSymlinksFromApexToSystem(t *testing.T) {
4244 bp := `
4245 apex {
4246 name: "myapex",
4247 key: "myapex.key",
4248 native_shared_libs: ["mylib"],
4249 java_libs: ["myjar"],
4250 }
4251
Jiyong Park9d677202020-02-19 16:29:35 +09004252 apex {
4253 name: "myapex.updatable",
4254 key: "myapex.key",
4255 native_shared_libs: ["mylib"],
4256 java_libs: ["myjar"],
4257 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004258 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09004259 }
4260
Jiyong Park7cd10e32020-01-14 09:22:18 +09004261 apex_key {
4262 name: "myapex.key",
4263 public_key: "testkey.avbpubkey",
4264 private_key: "testkey.pem",
4265 }
4266
4267 cc_library {
4268 name: "mylib",
4269 srcs: ["mylib.cpp"],
4270 shared_libs: ["myotherlib"],
4271 system_shared_libs: [],
4272 stl: "none",
4273 apex_available: [
4274 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004275 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004276 "//apex_available:platform",
4277 ],
4278 }
4279
4280 cc_library {
4281 name: "myotherlib",
4282 srcs: ["mylib.cpp"],
4283 system_shared_libs: [],
4284 stl: "none",
4285 apex_available: [
4286 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004287 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004288 "//apex_available:platform",
4289 ],
4290 }
4291
4292 java_library {
4293 name: "myjar",
4294 srcs: ["foo/bar/MyClass.java"],
4295 sdk_version: "none",
4296 system_modules: "none",
4297 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09004298 apex_available: [
4299 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004300 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004301 "//apex_available:platform",
4302 ],
4303 }
4304
4305 java_library {
4306 name: "myotherjar",
4307 srcs: ["foo/bar/MyClass.java"],
4308 sdk_version: "none",
4309 system_modules: "none",
4310 apex_available: [
4311 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004312 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004313 "//apex_available:platform",
4314 ],
4315 }
4316 `
4317
4318 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
4319 for _, f := range files {
4320 if f.path == file {
4321 if f.isLink {
4322 t.Errorf("%q is not a real file", file)
4323 }
4324 return
4325 }
4326 }
4327 t.Errorf("%q is not found", file)
4328 }
4329
4330 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
4331 for _, f := range files {
4332 if f.path == file {
4333 if !f.isLink {
4334 t.Errorf("%q is not a symlink", file)
4335 }
4336 return
4337 }
4338 }
4339 t.Errorf("%q is not found", file)
4340 }
4341
Jiyong Park9d677202020-02-19 16:29:35 +09004342 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
4343 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09004344 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004345 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004346 ensureRealfileExists(t, files, "javalib/myjar.jar")
4347 ensureRealfileExists(t, files, "lib64/mylib.so")
4348 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4349
Jiyong Park9d677202020-02-19 16:29:35 +09004350 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4351 ensureRealfileExists(t, files, "javalib/myjar.jar")
4352 ensureRealfileExists(t, files, "lib64/mylib.so")
4353 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4354
4355 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09004356 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004357 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004358 ensureRealfileExists(t, files, "javalib/myjar.jar")
4359 ensureRealfileExists(t, files, "lib64/mylib.so")
4360 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09004361
4362 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4363 ensureRealfileExists(t, files, "javalib/myjar.jar")
4364 ensureRealfileExists(t, files, "lib64/mylib.so")
4365 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09004366}
4367
Jooyung Han643adc42020-02-27 13:50:06 +09004368func TestApexWithJniLibs(t *testing.T) {
4369 ctx, _ := testApex(t, `
4370 apex {
4371 name: "myapex",
4372 key: "myapex.key",
4373 jni_libs: ["mylib"],
4374 }
4375
4376 apex_key {
4377 name: "myapex.key",
4378 public_key: "testkey.avbpubkey",
4379 private_key: "testkey.pem",
4380 }
4381
4382 cc_library {
4383 name: "mylib",
4384 srcs: ["mylib.cpp"],
4385 shared_libs: ["mylib2"],
4386 system_shared_libs: [],
4387 stl: "none",
4388 apex_available: [ "myapex" ],
4389 }
4390
4391 cc_library {
4392 name: "mylib2",
4393 srcs: ["mylib.cpp"],
4394 system_shared_libs: [],
4395 stl: "none",
4396 apex_available: [ "myapex" ],
4397 }
4398 `)
4399
4400 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4401 // Notice mylib2.so (transitive dep) is not added as a jni_lib
4402 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
4403 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4404 "lib64/mylib.so",
4405 "lib64/mylib2.so",
4406 })
4407}
4408
Jooyung Han49f67012020-04-17 13:43:10 +09004409func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
4410 ctx, _ := testApex(t, `
4411 apex {
4412 name: "myapex",
4413 key: "myapex.key",
4414 }
4415 apex_key {
4416 name: "myapex.key",
4417 public_key: "testkey.avbpubkey",
4418 private_key: "testkey.pem",
4419 }
4420 `, func(fs map[string][]byte, config android.Config) {
4421 delete(config.Targets, android.Android)
4422 config.AndroidCommonTarget = android.Target{}
4423 })
4424
4425 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
4426 t.Errorf("Expected variants: %v, but got: %v", expected, got)
4427 }
4428}
4429
Jooyung Han643adc42020-02-27 13:50:06 +09004430func TestApexWithJniLibs_Errors(t *testing.T) {
4431 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
4432 apex {
4433 name: "myapex",
4434 key: "myapex.key",
4435 jni_libs: ["xxx"],
4436 }
4437
4438 apex_key {
4439 name: "myapex.key",
4440 public_key: "testkey.avbpubkey",
4441 private_key: "testkey.pem",
4442 }
4443
4444 prebuilt_etc {
4445 name: "xxx",
4446 src: "xxx",
4447 }
4448 `, withFiles(map[string][]byte{
4449 "xxx": nil,
4450 }))
4451}
4452
Jiyong Parkbd159612020-02-28 15:22:21 +09004453func TestAppBundle(t *testing.T) {
4454 ctx, _ := testApex(t, `
4455 apex {
4456 name: "myapex",
4457 key: "myapex.key",
4458 apps: ["AppFoo"],
4459 }
4460
4461 apex_key {
4462 name: "myapex.key",
4463 public_key: "testkey.avbpubkey",
4464 private_key: "testkey.pem",
4465 }
4466
4467 android_app {
4468 name: "AppFoo",
4469 srcs: ["foo/bar/MyClass.java"],
4470 sdk_version: "none",
4471 system_modules: "none",
4472 apex_available: [ "myapex" ],
4473 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004474 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09004475
4476 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
4477 content := bundleConfigRule.Args["content"]
4478
4479 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004480 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 +09004481}
4482
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004483func testNoUpdatableJarsInBootImage(t *testing.T, errmsg, bp string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
4484 t.Helper()
4485
4486 bp = bp + `
4487 filegroup {
4488 name: "some-updatable-apex-file_contexts",
4489 srcs: [
4490 "system/sepolicy/apex/some-updatable-apex-file_contexts",
4491 ],
4492 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004493
4494 filegroup {
4495 name: "some-non-updatable-apex-file_contexts",
4496 srcs: [
4497 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
4498 ],
4499 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004500 `
4501 bp += cc.GatherRequiredDepsForTest(android.Android)
4502 bp += java.GatherRequiredDepsForTest()
4503 bp += dexpreopt.BpToolModulesForTest()
4504
4505 fs := map[string][]byte{
4506 "a.java": nil,
4507 "a.jar": nil,
4508 "build/make/target/product/security": nil,
4509 "apex_manifest.json": nil,
4510 "AndroidManifest.xml": nil,
4511 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004512 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004513 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
4514 "framework/aidl/a.aidl": nil,
4515 }
4516 cc.GatherRequiredFilesForTest(fs)
4517
4518 ctx := android.NewTestArchContext()
4519 ctx.RegisterModuleType("apex", BundleFactory)
4520 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
4521 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
4522 cc.RegisterRequiredBuildComponentsForTest(ctx)
4523 java.RegisterJavaBuildComponents(ctx)
4524 java.RegisterSystemModulesBuildComponents(ctx)
4525 java.RegisterAppBuildComponents(ctx)
4526 java.RegisterDexpreoptBootJarsComponents(ctx)
4527 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
4528 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
4529 ctx.PreDepsMutators(RegisterPreDepsMutators)
4530 ctx.PostDepsMutators(RegisterPostDepsMutators)
4531
4532 config := android.TestArchConfig(buildDir, nil, bp, fs)
4533 ctx.Register(config)
4534
4535 _ = dexpreopt.GlobalSoongConfigForTests(config)
4536 dexpreopt.RegisterToolModulesForTest(ctx)
4537 pathCtx := android.PathContextForTesting(config)
4538 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
4539 transformDexpreoptConfig(dexpreoptConfig)
4540 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
4541
4542 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
4543 android.FailIfErrored(t, errs)
4544
4545 _, errs = ctx.PrepareBuildActions(config)
4546 if errmsg == "" {
4547 android.FailIfErrored(t, errs)
4548 } else if len(errs) > 0 {
4549 android.FailIfNoMatchingErrors(t, errmsg, errs)
4550 return
4551 } else {
4552 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
4553 }
4554}
4555
Jooyung Han548640b2020-04-27 12:10:30 +09004556func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
4557 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
4558 apex {
4559 name: "myapex",
4560 key: "myapex.key",
4561 updatable: true,
4562 }
4563
4564 apex_key {
4565 name: "myapex.key",
4566 public_key: "testkey.avbpubkey",
4567 private_key: "testkey.pem",
4568 }
4569 `)
4570}
4571
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004572func TestNoUpdatableJarsInBootImage(t *testing.T) {
4573 bp := `
4574 java_library {
4575 name: "some-updatable-apex-lib",
4576 srcs: ["a.java"],
Artur Satayev8cf899a2020-04-15 17:29:42 +01004577 sdk_version: "current",
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004578 apex_available: [
4579 "some-updatable-apex",
4580 ],
4581 }
4582
4583 java_library {
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004584 name: "some-non-updatable-apex-lib",
4585 srcs: ["a.java"],
4586 apex_available: [
4587 "some-non-updatable-apex",
4588 ],
4589 }
4590
4591 java_library {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004592 name: "some-platform-lib",
4593 srcs: ["a.java"],
Artur Satayev8cf899a2020-04-15 17:29:42 +01004594 sdk_version: "current",
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004595 installable: true,
4596 }
4597
4598 java_library {
4599 name: "some-art-lib",
4600 srcs: ["a.java"],
Artur Satayev8cf899a2020-04-15 17:29:42 +01004601 sdk_version: "current",
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004602 apex_available: [
4603 "com.android.art.something",
4604 ],
4605 hostdex: true,
4606 }
4607
4608 apex {
4609 name: "some-updatable-apex",
4610 key: "some-updatable-apex.key",
4611 java_libs: ["some-updatable-apex-lib"],
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004612 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004613 min_sdk_version: "current",
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004614 }
4615
4616 apex {
4617 name: "some-non-updatable-apex",
4618 key: "some-non-updatable-apex.key",
4619 java_libs: ["some-non-updatable-apex-lib"],
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004620 }
4621
4622 apex_key {
4623 name: "some-updatable-apex.key",
4624 }
4625
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004626 apex_key {
4627 name: "some-non-updatable-apex.key",
4628 }
4629
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004630 apex {
4631 name: "com.android.art.something",
4632 key: "com.android.art.something.key",
4633 java_libs: ["some-art-lib"],
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004634 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004635 min_sdk_version: "current",
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004636 }
4637
4638 apex_key {
4639 name: "com.android.art.something.key",
4640 }
4641 `
4642
4643 var error string
4644 var transform func(*dexpreopt.GlobalConfig)
4645
4646 // updatable jar from ART apex in the ART boot image => ok
4647 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004648 config.ArtApexJars = []string{"com.android.art.something:some-art-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004649 }
4650 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4651
4652 // updatable jar from ART apex in the framework boot image => error
4653 error = "module 'some-art-lib' from updatable apex 'com.android.art.something' is not allowed in the framework boot image"
4654 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004655 config.BootJars = []string{"com.android.art.something:some-art-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004656 }
4657 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4658
4659 // updatable jar from some other apex in the ART boot image => error
4660 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the ART boot image"
4661 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004662 config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004663 }
4664 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4665
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004666 // non-updatable jar from some other apex in the ART boot image => error
4667 error = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
4668 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004669 config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004670 }
4671 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4672
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004673 // updatable jar from some other apex in the framework boot image => error
4674 error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
4675 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004676 config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004677 }
4678 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4679
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004680 // non-updatable jar from some other apex in the framework boot image => ok
4681 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004682 config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004683 }
4684 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4685
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004686 // nonexistent jar in the ART boot image => error
4687 error = "failed to find a dex jar path for module 'nonexistent'"
4688 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004689 config.ArtApexJars = []string{"platform:nonexistent"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004690 }
4691 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4692
4693 // nonexistent jar in the framework boot image => error
4694 error = "failed to find a dex jar path for module 'nonexistent'"
4695 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004696 config.BootJars = []string{"platform:nonexistent"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004697 }
4698 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4699
4700 // platform jar in the ART boot image => error
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004701 error = "module 'some-platform-lib' is not allowed in the ART boot image"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004702 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004703 config.ArtApexJars = []string{"platform:some-platform-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004704 }
4705 testNoUpdatableJarsInBootImage(t, error, bp, transform)
4706
4707 // platform jar in the framework boot image => ok
4708 transform = func(config *dexpreopt.GlobalConfig) {
Ulya Trafimovich50c4a4b2020-04-21 15:36:33 +01004709 config.BootJars = []string{"platform:some-platform-lib"}
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004710 }
4711 testNoUpdatableJarsInBootImage(t, "", bp, transform)
4712}
4713
Jiyong Park62304bb2020-04-13 16:19:48 +09004714func TestTestFor(t *testing.T) {
4715 ctx, _ := testApex(t, `
4716 apex {
4717 name: "myapex",
4718 key: "myapex.key",
4719 native_shared_libs: ["mylib", "myprivlib"],
4720 }
4721
4722 apex_key {
4723 name: "myapex.key",
4724 public_key: "testkey.avbpubkey",
4725 private_key: "testkey.pem",
4726 }
4727
4728 cc_library {
4729 name: "mylib",
4730 srcs: ["mylib.cpp"],
4731 system_shared_libs: [],
4732 stl: "none",
4733 stubs: {
4734 versions: ["1"],
4735 },
4736 apex_available: ["myapex"],
4737 }
4738
4739 cc_library {
4740 name: "myprivlib",
4741 srcs: ["mylib.cpp"],
4742 system_shared_libs: [],
4743 stl: "none",
4744 apex_available: ["myapex"],
4745 }
4746
4747
4748 cc_test {
4749 name: "mytest",
4750 gtest: false,
4751 srcs: ["mylib.cpp"],
4752 system_shared_libs: [],
4753 stl: "none",
4754 shared_libs: ["mylib", "myprivlib"],
4755 test_for: ["myapex"]
4756 }
4757 `)
4758
4759 // the test 'mytest' is a test for the apex, therefore is linked to the
4760 // actual implementation of mylib instead of its stub.
4761 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
4762 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
4763 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
4764}
4765
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004766func TestMain(m *testing.M) {
4767 run := func() int {
4768 setUp()
4769 defer tearDown()
4770
4771 return m.Run()
4772 }
4773
4774 os.Exit(run())
4775}