blob: 39ce1358107398bee77ffee04d974a15b37f8473 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Park25fc6a92018-11-18 18:02:45 +090018 "io/ioutil"
19 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090024 "strings"
25 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090026
27 "github.com/google/blueprint/proptools"
28
29 "android/soong/android"
30 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000031 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070032 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090033 "android/soong/java"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070034 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090035)
36
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070037var buildDir string
38
Jooyung Hand3639552019-08-09 12:57:43 +090039// names returns name list from white space separated string
40func names(s string) (ns []string) {
41 for _, n := range strings.Split(s, " ") {
42 if len(n) > 0 {
43 ns = append(ns, n)
44 }
45 }
46 return
47}
48
Jooyung Han344d5432019-08-23 11:17:39 +090049func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
50 t.Helper()
51 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090052 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
53 if len(errs) > 0 {
54 android.FailIfNoMatchingErrors(t, pattern, errs)
55 return
56 }
57 _, errs = ctx.PrepareBuildActions(config)
58 if len(errs) > 0 {
59 android.FailIfNoMatchingErrors(t, pattern, errs)
60 return
61 }
62
63 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
64}
65
Jooyung Han344d5432019-08-23 11:17:39 +090066func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
67 t.Helper()
68 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090069 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
70 android.FailIfErrored(t, errs)
71 _, errs = ctx.PrepareBuildActions(config)
72 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070073 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090074}
75
Jooyung Han344d5432019-08-23 11:17:39 +090076type testCustomizer func(fs map[string][]byte, config android.Config)
77
78func withFiles(files map[string][]byte) testCustomizer {
79 return func(fs map[string][]byte, config android.Config) {
80 for k, v := range files {
81 fs[k] = v
82 }
83 }
84}
85
86func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
87 return func(fs map[string][]byte, config android.Config) {
88 for k, v := range targets {
89 config.Targets[k] = v
90 }
91 }
92}
93
Jooyung Han35155c42020-02-06 17:33:20 +090094// withNativeBridgeTargets sets configuration with targets including:
95// - X86_64 (primary)
96// - X86 (secondary)
97// - Arm64 on X86_64 (native bridge)
98// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -070099func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900100 config.Targets[android.Android] = []android.Target{
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
109 }
110}
111
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900112func withManifestPackageNameOverrides(specs []string) testCustomizer {
113 return func(fs map[string][]byte, config android.Config) {
114 config.TestProductVariables.ManifestPackageNameOverrides = specs
115 }
116}
117
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700118func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900119 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
120}
121
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700122func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900123 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
124}
125
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700126func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jooyung Han671f1ce2019-12-17 12:47:13 +0900127 android.ClearApexDependency()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900128
129 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900130 filegroup {
131 name: "myapex-file_contexts",
132 srcs: [
133 "system/sepolicy/apex/myapex-file_contexts",
134 ],
135 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900136 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800137
Colin Crossf9aabd72020-02-15 11:29:50 -0800138 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
139
Dario Frenicde2a032019-10-27 00:29:22 +0100140 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900141
Jooyung Han344d5432019-08-23 11:17:39 +0900142 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900143 "a.java": nil,
144 "PrebuiltAppFoo.apk": nil,
145 "PrebuiltAppFooPriv.apk": nil,
146 "build/make/target/product/security": nil,
147 "apex_manifest.json": nil,
148 "AndroidManifest.xml": nil,
149 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900150 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900151 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900152 "system/sepolicy/apex/otherapex-file_contexts": nil,
153 "system/sepolicy/apex/commonapex-file_contexts": nil,
154 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800155 "mylib.cpp": nil,
156 "mylib_common.cpp": nil,
157 "mytest.cpp": nil,
158 "mytest1.cpp": nil,
159 "mytest2.cpp": nil,
160 "mytest3.cpp": nil,
161 "myprebuilt": nil,
162 "my_include": nil,
163 "foo/bar/MyClass.java": nil,
164 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100165 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800166 "vendor/foo/devkeys/test.x509.pem": nil,
167 "vendor/foo/devkeys/test.pk8": nil,
168 "testkey.x509.pem": nil,
169 "testkey.pk8": nil,
170 "testkey.override.x509.pem": nil,
171 "testkey.override.pk8": nil,
172 "vendor/foo/devkeys/testkey.avbpubkey": nil,
173 "vendor/foo/devkeys/testkey.pem": nil,
174 "NOTICE": nil,
175 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900176 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800177 "testkey2.avbpubkey": nil,
178 "testkey2.pem": nil,
179 "myapex-arm64.apex": nil,
180 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700181 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800182 "frameworks/base/api/current.txt": nil,
183 "framework/aidl/a.aidl": nil,
184 "build/make/core/proguard.flags": nil,
185 "build/make/core/proguard_basic_keeps.flags": nil,
186 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700187 "baz": nil,
188 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700189 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700190 "AppSet.apks": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900191 }
192
Colin Crossf9aabd72020-02-15 11:29:50 -0800193 cc.GatherRequiredFilesForTest(fs)
194
Jooyung Han344d5432019-08-23 11:17:39 +0900195 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800196 // The fs now needs to be populated before creating the config, call handlers twice
197 // for now, once to get any fs changes, and later after the config was created to
198 // set product variables or targets.
199 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
200 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900201 }
202
Colin Cross98be1bb2019-12-13 20:41:13 -0800203 config := android.TestArchConfig(buildDir, nil, bp, fs)
204 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
205 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
206 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
207 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
208 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
209 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
210
211 for _, handler := range handlers {
212 // The fs now needs to be populated before creating the config, call handlers twice
213 // for now, earlier to get any fs changes, and now after the config was created to
214 // set product variables or targets.
215 tempFS := map[string][]byte{}
216 handler(tempFS, config)
217 }
218
219 ctx := android.NewTestArchContext()
220 ctx.RegisterModuleType("apex", BundleFactory)
221 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
222 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
223 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
224 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
225 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
226 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700227 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800228
Jooyung Hana57af4a2020-01-23 05:36:59 +0000229 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
230 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
231
Paul Duffin77980a82019-12-19 16:01:36 +0000232 cc.RegisterRequiredBuildComponentsForTest(ctx)
Colin Cross98be1bb2019-12-13 20:41:13 -0800233 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800234 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
235 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700236 ctx.RegisterModuleType("prebuilt_etc", prebuilt_etc.PrebuiltEtcFactory)
atrost6e126252020-01-27 17:01:16 +0000237 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700238 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800239 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000240 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000241 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000242 java.RegisterAppBuildComponents(ctx)
Jooyung Han58f26ab2019-12-18 15:34:32 +0900243 ctx.RegisterModuleType("java_sdk_library", java.SdkLibraryFactory)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900244 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800245
Colin Cross98be1bb2019-12-13 20:41:13 -0800246 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800247 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800248
249 ctx.Register(config)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900250
Jooyung Han5c998b92019-06-27 11:30:33 +0900251 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900252}
253
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700254func setUp() {
255 var err error
256 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900257 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700258 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900260}
261
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700262func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700263 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900264}
265
Jooyung Han643adc42020-02-27 13:50:06 +0900266// ensure that 'result' equals 'expected'
267func ensureEquals(t *testing.T, result string, expected string) {
268 t.Helper()
269 if result != expected {
270 t.Errorf("%q != %q", expected, result)
271 }
272}
273
Jiyong Park25fc6a92018-11-18 18:02:45 +0900274// ensure that 'result' contains 'expected'
275func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900276 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277 if !strings.Contains(result, expected) {
278 t.Errorf("%q is not found in %q", expected, result)
279 }
280}
281
Liz Kammer5bd365f2020-05-27 15:15:11 -0700282// ensure that 'result' contains 'expected' exactly one time
283func ensureContainsOnce(t *testing.T, result string, expected string) {
284 t.Helper()
285 count := strings.Count(result, expected)
286 if count != 1 {
287 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
288 }
289}
290
Jiyong Park25fc6a92018-11-18 18:02:45 +0900291// ensures that 'result' does not contain 'notExpected'
292func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900293 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900294 if strings.Contains(result, notExpected) {
295 t.Errorf("%q is found in %q", notExpected, result)
296 }
297}
298
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700299func ensureMatches(t *testing.T, result string, expectedRex string) {
300 ok, err := regexp.MatchString(expectedRex, result)
301 if err != nil {
302 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
303 return
304 }
305 if !ok {
306 t.Errorf("%s does not match regular expession %s", result, expectedRex)
307 }
308}
309
Jiyong Park25fc6a92018-11-18 18:02:45 +0900310func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900311 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900312 if !android.InList(expected, result) {
313 t.Errorf("%q is not found in %v", expected, result)
314 }
315}
316
317func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900318 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900319 if android.InList(notExpected, result) {
320 t.Errorf("%q is found in %v", notExpected, result)
321 }
322}
323
Jooyung Hane1633032019-08-01 17:41:43 +0900324func ensureListEmpty(t *testing.T, result []string) {
325 t.Helper()
326 if len(result) > 0 {
327 t.Errorf("%q is expected to be empty", result)
328 }
329}
330
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331// Minimal test
332func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900333 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900334 apex_defaults {
335 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900336 manifest: ":myapex.manifest",
337 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900338 key: "myapex.key",
339 native_shared_libs: ["mylib"],
Alex Light3d673592019-01-18 14:37:31 -0800340 multilib: {
341 both: {
342 binaries: ["foo",],
343 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900344 },
Jiyong Park77acec62020-06-01 21:39:15 +0900345 java_libs: [
346 "myjar",
347 "myjar_dex",
348 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900349 }
350
Jiyong Park30ca9372019-02-07 16:27:23 +0900351 apex {
352 name: "myapex",
353 defaults: ["myapex-defaults"],
354 }
355
Jiyong Park25fc6a92018-11-18 18:02:45 +0900356 apex_key {
357 name: "myapex.key",
358 public_key: "testkey.avbpubkey",
359 private_key: "testkey.pem",
360 }
361
Jiyong Park809bb722019-02-13 21:33:49 +0900362 filegroup {
363 name: "myapex.manifest",
364 srcs: ["apex_manifest.json"],
365 }
366
367 filegroup {
368 name: "myapex.androidmanifest",
369 srcs: ["AndroidManifest.xml"],
370 }
371
Jiyong Park25fc6a92018-11-18 18:02:45 +0900372 cc_library {
373 name: "mylib",
374 srcs: ["mylib.cpp"],
375 shared_libs: ["mylib2"],
376 system_shared_libs: [],
377 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000378 // TODO: remove //apex_available:platform
379 apex_available: [
380 "//apex_available:platform",
381 "myapex",
382 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900383 }
384
Alex Light3d673592019-01-18 14:37:31 -0800385 cc_binary {
386 name: "foo",
387 srcs: ["mylib.cpp"],
388 compile_multilib: "both",
389 multilib: {
390 lib32: {
391 suffix: "32",
392 },
393 lib64: {
394 suffix: "64",
395 },
396 },
397 symlinks: ["foo_link_"],
398 symlink_preferred_arch: true,
399 system_shared_libs: [],
400 static_executable: true,
401 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000402 apex_available: [ "myapex" ],
Alex Light3d673592019-01-18 14:37:31 -0800403 }
404
Paul Duffindddd5462020-04-07 15:25:44 +0100405 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900406 name: "mylib2",
407 srcs: ["mylib.cpp"],
408 system_shared_libs: [],
409 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900410 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900411 static_libs: ["libstatic"],
412 // TODO: remove //apex_available:platform
413 apex_available: [
414 "//apex_available:platform",
415 "myapex",
416 ],
417 }
418
Paul Duffindddd5462020-04-07 15:25:44 +0100419 cc_prebuilt_library_shared {
420 name: "mylib2",
421 srcs: ["prebuilt.so"],
422 // TODO: remove //apex_available:platform
423 apex_available: [
424 "//apex_available:platform",
425 "myapex",
426 ],
427 }
428
Jiyong Park9918e1a2020-03-17 19:16:40 +0900429 cc_library_static {
430 name: "libstatic",
431 srcs: ["mylib.cpp"],
432 system_shared_libs: [],
433 stl: "none",
434 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000435 // TODO: remove //apex_available:platform
436 apex_available: [
437 "//apex_available:platform",
438 "myapex",
439 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900440 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900441
442 java_library {
443 name: "myjar",
444 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900445 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900446 sdk_version: "none",
447 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900448 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900449 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000450 // TODO: remove //apex_available:platform
451 apex_available: [
452 "//apex_available:platform",
453 "myapex",
454 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900455 }
456
Jiyong Park77acec62020-06-01 21:39:15 +0900457 dex_import {
458 name: "myjar_dex",
459 jars: ["prebuilt.jar"],
460 apex_available: [
461 "//apex_available:platform",
462 "myapex",
463 ],
464 }
465
Jiyong Park7f7766d2019-07-25 22:02:35 +0900466 java_library {
467 name: "myotherjar",
468 srcs: ["foo/bar/MyClass.java"],
469 sdk_version: "none",
470 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900471 // TODO: remove //apex_available:platform
472 apex_available: [
473 "//apex_available:platform",
474 "myapex",
475 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900477
478 java_library {
479 name: "mysharedjar",
480 srcs: ["foo/bar/MyClass.java"],
481 sdk_version: "none",
482 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900483 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900484 `)
485
Sundong Ahnabb64432019-10-22 13:58:29 +0900486 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900487
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900488 // Make sure that Android.mk is created
489 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
490 data := android.AndroidMkDataForTest(t, config, "", ab)
491 var builder strings.Builder
492 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
493
494 androidMk := builder.String()
495 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
496 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
497
Jiyong Park42cca6c2019-04-01 11:15:50 +0900498 optFlags := apexRule.Args["opt_flags"]
499 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700500 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900501 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900502
Jiyong Park25fc6a92018-11-18 18:02:45 +0900503 copyCmds := apexRule.Args["copy_commands"]
504
505 // Ensure that main rule creates an output
506 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
507
508 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800509 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900510 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
Jiyong Park77acec62020-06-01 21:39:15 +0900511 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900512
513 // Ensure that apex variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800514 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900515 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900516
517 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800518 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
519 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900520 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900521 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900522 // .. but not for java libs
523 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900524 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800525
Colin Cross7113d202019-11-20 16:39:12 -0800526 // Ensure that the platform variant ends with _shared or _common
527 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
528 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900529 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
530 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900531 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
532
533 // Ensure that dynamic dependency to java libs are not included
534 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800535
536 // Ensure that all symlinks are present.
537 found_foo_link_64 := false
538 found_foo := false
539 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900540 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800541 if strings.HasSuffix(cmd, "bin/foo") {
542 found_foo = true
543 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
544 found_foo_link_64 = true
545 }
546 }
547 }
548 good := found_foo && found_foo_link_64
549 if !good {
550 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
551 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900552
Sundong Ahnabb64432019-10-22 13:58:29 +0900553 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700554 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900555 if len(noticeInputs) != 3 {
556 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900557 }
558 ensureListContains(t, noticeInputs, "NOTICE")
559 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900560 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900561
Artur Satayeva8bd1132020-04-27 18:07:06 +0100562 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100563 ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex")
564 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex")
565 ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib")
566 ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar")
567 ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100568
569 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100570 ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))")
571 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
572 ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))")
573 ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))")
574 ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800575}
576
Jooyung Hanf21c7972019-12-16 22:32:06 +0900577func TestDefaults(t *testing.T) {
578 ctx, _ := testApex(t, `
579 apex_defaults {
580 name: "myapex-defaults",
581 key: "myapex.key",
582 prebuilts: ["myetc"],
583 native_shared_libs: ["mylib"],
584 java_libs: ["myjar"],
585 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900586 rros: ["rro"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900587 }
588
589 prebuilt_etc {
590 name: "myetc",
591 src: "myprebuilt",
592 }
593
594 apex {
595 name: "myapex",
596 defaults: ["myapex-defaults"],
597 }
598
599 apex_key {
600 name: "myapex.key",
601 public_key: "testkey.avbpubkey",
602 private_key: "testkey.pem",
603 }
604
605 cc_library {
606 name: "mylib",
607 system_shared_libs: [],
608 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000609 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900610 }
611
612 java_library {
613 name: "myjar",
614 srcs: ["foo/bar/MyClass.java"],
615 sdk_version: "none",
616 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000617 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900618 }
619
620 android_app {
621 name: "AppFoo",
622 srcs: ["foo/bar/MyClass.java"],
623 sdk_version: "none",
624 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000625 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900626 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900627
628 runtime_resource_overlay {
629 name: "rro",
630 theme: "blue",
631 }
632
Jooyung Hanf21c7972019-12-16 22:32:06 +0900633 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000634 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900635 "etc/myetc",
636 "javalib/myjar.jar",
637 "lib64/mylib.so",
638 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900639 "overlay/blue/rro.apk",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900640 })
641}
642
Jooyung Han01a3ee22019-11-02 02:52:25 +0900643func TestApexManifest(t *testing.T) {
644 ctx, _ := testApex(t, `
645 apex {
646 name: "myapex",
647 key: "myapex.key",
648 }
649
650 apex_key {
651 name: "myapex.key",
652 public_key: "testkey.avbpubkey",
653 private_key: "testkey.pem",
654 }
655 `)
656
657 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900658 args := module.Rule("apexRule").Args
659 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
660 t.Error("manifest should be apex_manifest.pb, but " + manifest)
661 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900662}
663
Alex Light5098a612018-11-29 17:12:15 -0800664func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700665 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800666 apex {
667 name: "myapex",
668 key: "myapex.key",
669 payload_type: "zip",
670 native_shared_libs: ["mylib"],
671 }
672
673 apex_key {
674 name: "myapex.key",
675 public_key: "testkey.avbpubkey",
676 private_key: "testkey.pem",
677 }
678
679 cc_library {
680 name: "mylib",
681 srcs: ["mylib.cpp"],
682 shared_libs: ["mylib2"],
683 system_shared_libs: [],
684 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000685 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800686 }
687
688 cc_library {
689 name: "mylib2",
690 srcs: ["mylib.cpp"],
691 system_shared_libs: [],
692 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000693 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800694 }
695 `)
696
Sundong Ahnabb64432019-10-22 13:58:29 +0900697 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800698 copyCmds := zipApexRule.Args["copy_commands"]
699
700 // Ensure that main rule creates an output
701 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
702
703 // Ensure that APEX variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -0800704 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800705
706 // Ensure that APEX variant is created for the indirect dep
Colin Cross7113d202019-11-20 16:39:12 -0800707 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light5098a612018-11-29 17:12:15 -0800708
709 // Ensure that both direct and indirect deps are copied into apex
710 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
711 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900712}
713
714func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700715 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900716 apex {
717 name: "myapex",
718 key: "myapex.key",
719 native_shared_libs: ["mylib", "mylib3"],
720 }
721
722 apex_key {
723 name: "myapex.key",
724 public_key: "testkey.avbpubkey",
725 private_key: "testkey.pem",
726 }
727
728 cc_library {
729 name: "mylib",
730 srcs: ["mylib.cpp"],
731 shared_libs: ["mylib2", "mylib3"],
732 system_shared_libs: [],
733 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000734 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900735 }
736
737 cc_library {
738 name: "mylib2",
739 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900740 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900741 system_shared_libs: [],
742 stl: "none",
743 stubs: {
744 versions: ["1", "2", "3"],
745 },
746 }
747
748 cc_library {
749 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900750 srcs: ["mylib.cpp"],
751 shared_libs: ["mylib4"],
752 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900753 stl: "none",
754 stubs: {
755 versions: ["10", "11", "12"],
756 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000757 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900758 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900759
760 cc_library {
761 name: "mylib4",
762 srcs: ["mylib.cpp"],
763 system_shared_libs: [],
764 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000765 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900766 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900767 `)
768
Sundong Ahnabb64432019-10-22 13:58:29 +0900769 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900770 copyCmds := apexRule.Args["copy_commands"]
771
772 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800773 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900774
775 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800776 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900777
778 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800779 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900780
Colin Cross7113d202019-11-20 16:39:12 -0800781 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900782
783 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900784 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900785 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900786 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900787
788 // 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 -0800789 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900790 // .. and not linking to the stubs variant of mylib3
Colin Cross7113d202019-11-20 16:39:12 -0800791 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900792
793 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900794 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900795 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900796
797 // Ensure that genstub is invoked with --apex
Jiyong Park3ff16992019-12-27 14:11:47 +0900798 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900799
Jooyung Hana57af4a2020-01-23 05:36:59 +0000800 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900801 "lib64/mylib.so",
802 "lib64/mylib3.so",
803 "lib64/mylib4.so",
804 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900805}
806
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900807func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700808 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900809 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900810 name: "myapex2",
811 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900812 native_shared_libs: ["mylib"],
813 }
814
815 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900816 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900817 public_key: "testkey.avbpubkey",
818 private_key: "testkey.pem",
819 }
820
821 cc_library {
822 name: "mylib",
823 srcs: ["mylib.cpp"],
824 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900825 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900826 system_shared_libs: [],
827 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000828 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900829 }
830
831 cc_library {
832 name: "libfoo",
833 srcs: ["mylib.cpp"],
834 shared_libs: ["libbar"],
835 system_shared_libs: [],
836 stl: "none",
837 stubs: {
838 versions: ["10", "20", "30"],
839 },
840 }
841
842 cc_library {
843 name: "libbar",
844 srcs: ["mylib.cpp"],
845 system_shared_libs: [],
846 stl: "none",
847 }
848
Jiyong Park678c8812020-02-07 17:25:49 +0900849 cc_library_static {
850 name: "libbaz",
851 srcs: ["mylib.cpp"],
852 system_shared_libs: [],
853 stl: "none",
854 apex_available: [ "myapex2" ],
855 }
856
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900857 `)
858
Jiyong Park83dc74b2020-01-14 18:38:44 +0900859 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900860 copyCmds := apexRule.Args["copy_commands"]
861
862 // Ensure that direct non-stubs dep is always included
863 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
864
865 // Ensure that indirect stubs dep is not included
866 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
867
868 // Ensure that dependency of stubs is not included
869 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
870
Jiyong Park83dc74b2020-01-14 18:38:44 +0900871 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900872
873 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900874 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900875 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +0900876 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900877
Jiyong Park3ff16992019-12-27 14:11:47 +0900878 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900879
880 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
881 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900882
Artur Satayeva8bd1132020-04-27 18:07:06 +0100883 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100884 ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2")
885 ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib")
886 ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +0900887
Artur Satayeva8bd1132020-04-27 18:07:06 +0100888 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev480e25b2020-04-27 18:53:18 +0100889 ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))")
890 ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))")
891 ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900892}
893
Jooyung Hand3639552019-08-09 12:57:43 +0900894func TestApexWithRuntimeLibsDependency(t *testing.T) {
895 /*
896 myapex
897 |
898 v (runtime_libs)
899 mylib ------+------> libfoo [provides stub]
900 |
901 `------> libbar
902 */
903 ctx, _ := testApex(t, `
904 apex {
905 name: "myapex",
906 key: "myapex.key",
907 native_shared_libs: ["mylib"],
908 }
909
910 apex_key {
911 name: "myapex.key",
912 public_key: "testkey.avbpubkey",
913 private_key: "testkey.pem",
914 }
915
916 cc_library {
917 name: "mylib",
918 srcs: ["mylib.cpp"],
919 runtime_libs: ["libfoo", "libbar"],
920 system_shared_libs: [],
921 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000922 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900923 }
924
925 cc_library {
926 name: "libfoo",
927 srcs: ["mylib.cpp"],
928 system_shared_libs: [],
929 stl: "none",
930 stubs: {
931 versions: ["10", "20", "30"],
932 },
933 }
934
935 cc_library {
936 name: "libbar",
937 srcs: ["mylib.cpp"],
938 system_shared_libs: [],
939 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000940 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +0900941 }
942
943 `)
944
Sundong Ahnabb64432019-10-22 13:58:29 +0900945 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +0900946 copyCmds := apexRule.Args["copy_commands"]
947
948 // Ensure that direct non-stubs dep is always included
949 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
950
951 // Ensure that indirect stubs dep is not included
952 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
953
954 // Ensure that runtime_libs dep in included
955 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
956
Sundong Ahnabb64432019-10-22 13:58:29 +0900957 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +0900958 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
959 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +0900960
961}
962
Jooyung Han8ce8db92020-05-15 19:05:05 +0900963func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
964 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
965 bp := `
966 apex {
967 name: "com.android.runtime",
968 key: "com.android.runtime.key",
969 native_shared_libs: ["libc"],
970 }
971
972 apex_key {
973 name: "com.android.runtime.key",
974 public_key: "testkey.avbpubkey",
975 private_key: "testkey.pem",
976 }
977
978 cc_library {
979 name: "libc",
980 no_libcrt: true,
981 nocrt: true,
982 stl: "none",
983 system_shared_libs: [],
984 stubs: { versions: ["1"] },
985 apex_available: ["com.android.runtime"],
986
987 sanitize: {
988 hwaddress: true,
989 }
990 }
991
992 cc_prebuilt_library_shared {
993 name: "libclang_rt.hwasan-aarch64-android",
994 no_libcrt: true,
995 nocrt: true,
996 stl: "none",
997 system_shared_libs: [],
998 srcs: [""],
999 stubs: { versions: ["1"] },
1000
1001 sanitize: {
1002 never: true,
1003 },
1004 }
1005 `
1006 // override bp to use hard-coded names: com.android.runtime and libc
1007 fs["Android.bp"] = []byte(bp)
1008 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1009 })
1010
1011 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1012 "lib64/bionic/libc.so",
1013 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1014 })
1015
1016 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1017
1018 installed := hwasan.Description("install libclang_rt.hwasan")
1019 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1020
1021 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1022 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1023 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1024}
1025
1026func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1027 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1028 bp := `
1029 apex {
1030 name: "com.android.runtime",
1031 key: "com.android.runtime.key",
1032 native_shared_libs: ["libc"],
1033 }
1034
1035 apex_key {
1036 name: "com.android.runtime.key",
1037 public_key: "testkey.avbpubkey",
1038 private_key: "testkey.pem",
1039 }
1040
1041 cc_library {
1042 name: "libc",
1043 no_libcrt: true,
1044 nocrt: true,
1045 stl: "none",
1046 system_shared_libs: [],
1047 stubs: { versions: ["1"] },
1048 apex_available: ["com.android.runtime"],
1049 }
1050
1051 cc_prebuilt_library_shared {
1052 name: "libclang_rt.hwasan-aarch64-android",
1053 no_libcrt: true,
1054 nocrt: true,
1055 stl: "none",
1056 system_shared_libs: [],
1057 srcs: [""],
1058 stubs: { versions: ["1"] },
1059
1060 sanitize: {
1061 never: true,
1062 },
1063 }
1064 `
1065 // override bp to use hard-coded names: com.android.runtime and libc
1066 fs["Android.bp"] = []byte(bp)
1067 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1068
1069 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1070 })
1071
1072 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1073 "lib64/bionic/libc.so",
1074 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1075 })
1076
1077 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1078
1079 installed := hwasan.Description("install libclang_rt.hwasan")
1080 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1081
1082 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1083 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1084 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1085}
1086
Jooyung Han61b66e92020-03-21 14:21:46 +00001087func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1088 testcases := []struct {
1089 name string
1090 minSdkVersion string
1091 shouldLink string
1092 shouldNotLink []string
1093 }{
1094 {
Jooyung Han75568392020-03-20 04:29:24 +09001095 name: "should link to the latest",
Jooyung Han61b66e92020-03-21 14:21:46 +00001096 minSdkVersion: "current",
1097 shouldLink: "30",
1098 shouldNotLink: []string{"29"},
1099 },
1100 {
1101 name: "should link to llndk#29",
1102 minSdkVersion: "29",
1103 shouldLink: "29",
1104 shouldNotLink: []string{"30"},
1105 },
1106 }
1107 for _, tc := range testcases {
1108 t.Run(tc.name, func(t *testing.T) {
1109 ctx, _ := testApex(t, `
1110 apex {
1111 name: "myapex",
1112 key: "myapex.key",
1113 use_vendor: true,
1114 native_shared_libs: ["mylib"],
1115 min_sdk_version: "`+tc.minSdkVersion+`",
1116 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001117
Jooyung Han61b66e92020-03-21 14:21:46 +00001118 apex_key {
1119 name: "myapex.key",
1120 public_key: "testkey.avbpubkey",
1121 private_key: "testkey.pem",
1122 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001123
Jooyung Han61b66e92020-03-21 14:21:46 +00001124 cc_library {
1125 name: "mylib",
1126 srcs: ["mylib.cpp"],
1127 vendor_available: true,
1128 shared_libs: ["libbar"],
1129 system_shared_libs: [],
1130 stl: "none",
1131 apex_available: [ "myapex" ],
1132 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001133
Jooyung Han61b66e92020-03-21 14:21:46 +00001134 cc_library {
1135 name: "libbar",
1136 srcs: ["mylib.cpp"],
1137 system_shared_libs: [],
1138 stl: "none",
1139 stubs: { versions: ["29","30"] },
1140 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001141
Jooyung Han61b66e92020-03-21 14:21:46 +00001142 llndk_library {
1143 name: "libbar",
1144 symbol_file: "",
1145 }
1146 `, func(fs map[string][]byte, config android.Config) {
1147 setUseVendorWhitelistForTest(config, []string{"myapex"})
1148 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001149
Jooyung Han61b66e92020-03-21 14:21:46 +00001150 // Ensure that LLNDK dep is not included
1151 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1152 "lib64/mylib.so",
1153 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001154
Jooyung Han61b66e92020-03-21 14:21:46 +00001155 // Ensure that LLNDK dep is required
1156 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1157 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1158 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001159
Jooyung Han61b66e92020-03-21 14:21:46 +00001160 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1161 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1162 for _, ver := range tc.shouldNotLink {
1163 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1164 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001165
Jooyung Han61b66e92020-03-21 14:21:46 +00001166 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1167 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1168 })
1169 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001170}
1171
Jiyong Park25fc6a92018-11-18 18:02:45 +09001172func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001173 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001174 apex {
1175 name: "myapex",
1176 key: "myapex.key",
1177 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1178 }
1179
1180 apex_key {
1181 name: "myapex.key",
1182 public_key: "testkey.avbpubkey",
1183 private_key: "testkey.pem",
1184 }
1185
1186 cc_library {
1187 name: "mylib",
1188 srcs: ["mylib.cpp"],
1189 shared_libs: ["libdl#27"],
1190 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001191 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001192 }
1193
1194 cc_library_shared {
1195 name: "mylib_shared",
1196 srcs: ["mylib.cpp"],
1197 shared_libs: ["libdl#27"],
1198 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001199 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001200 }
1201
1202 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001203 name: "libBootstrap",
1204 srcs: ["mylib.cpp"],
1205 stl: "none",
1206 bootstrap: true,
1207 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001208 `)
1209
Sundong Ahnabb64432019-10-22 13:58:29 +09001210 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001211 copyCmds := apexRule.Args["copy_commands"]
1212
1213 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001214 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001215 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1216 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001217
1218 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001219 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001220
Colin Cross7113d202019-11-20 16:39:12 -08001221 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
1222 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
1223 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001224
1225 // For dependency to libc
1226 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001227 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001228 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001229 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001230 // ... Cflags from stub is correctly exported to mylib
1231 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1232 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1233
1234 // For dependency to libm
1235 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001236 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001237 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001238 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001239 // ... and is not compiling with the stub
1240 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1241 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1242
1243 // For dependency to libdl
1244 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001245 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001246 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001247 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1248 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001249 // ... and not linking to the non-stub (impl) variant
Colin Cross7113d202019-11-20 16:39:12 -08001250 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001251 // ... Cflags from stub is correctly exported to mylib
1252 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1253 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001254
1255 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001256 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1257 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1258 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1259 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001260}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001261
Jooyung Han03b51852020-02-26 22:45:42 +09001262func TestApexUseStubsAccordingToMinSdkVersionInUnbundledBuild(t *testing.T) {
1263 // there are three links between liba --> libz
1264 // 1) myapex -> libx -> liba -> libz : this should be #2 link, but fallback to #1
1265 // 2) otherapex -> liby -> liba -> libz : this should be #3 link
1266 // 3) (platform) -> liba -> libz : this should be non-stub link
1267 ctx, _ := testApex(t, `
1268 apex {
1269 name: "myapex",
1270 key: "myapex.key",
1271 native_shared_libs: ["libx"],
1272 min_sdk_version: "2",
1273 }
1274
1275 apex {
1276 name: "otherapex",
1277 key: "myapex.key",
1278 native_shared_libs: ["liby"],
1279 min_sdk_version: "3",
1280 }
1281
1282 apex_key {
1283 name: "myapex.key",
1284 public_key: "testkey.avbpubkey",
1285 private_key: "testkey.pem",
1286 }
1287
1288 cc_library {
1289 name: "libx",
1290 shared_libs: ["liba"],
1291 system_shared_libs: [],
1292 stl: "none",
1293 apex_available: [ "myapex" ],
1294 }
1295
1296 cc_library {
1297 name: "liby",
1298 shared_libs: ["liba"],
1299 system_shared_libs: [],
1300 stl: "none",
1301 apex_available: [ "otherapex" ],
1302 }
1303
1304 cc_library {
1305 name: "liba",
1306 shared_libs: ["libz"],
1307 system_shared_libs: [],
1308 stl: "none",
1309 apex_available: [
1310 "//apex_available:anyapex",
1311 "//apex_available:platform",
1312 ],
1313 }
1314
1315 cc_library {
1316 name: "libz",
1317 system_shared_libs: [],
1318 stl: "none",
1319 stubs: {
1320 versions: ["1", "3"],
1321 },
1322 }
1323 `, withUnbundledBuild)
1324
1325 expectLink := func(from, from_variant, to, to_variant string) {
1326 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1327 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1328 }
1329 expectNoLink := func(from, from_variant, to, to_variant string) {
1330 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1331 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1332 }
1333 // platform liba is linked to non-stub version
1334 expectLink("liba", "shared", "libz", "shared")
1335 // liba in myapex is linked to #1
1336 expectLink("liba", "shared_myapex", "libz", "shared_1")
1337 expectNoLink("liba", "shared_myapex", "libz", "shared_3")
1338 expectNoLink("liba", "shared_myapex", "libz", "shared")
1339 // liba in otherapex is linked to #3
1340 expectLink("liba", "shared_otherapex", "libz", "shared_3")
1341 expectNoLink("liba", "shared_otherapex", "libz", "shared_1")
1342 expectNoLink("liba", "shared_otherapex", "libz", "shared")
1343}
1344
Jooyung Hanaed150d2020-04-02 01:41:41 +09001345func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1346 ctx, _ := testApex(t, `
1347 apex {
1348 name: "myapex",
1349 key: "myapex.key",
1350 native_shared_libs: ["libx"],
1351 min_sdk_version: "R",
1352 }
1353
1354 apex_key {
1355 name: "myapex.key",
1356 public_key: "testkey.avbpubkey",
1357 private_key: "testkey.pem",
1358 }
1359
1360 cc_library {
1361 name: "libx",
1362 shared_libs: ["libz"],
1363 system_shared_libs: [],
1364 stl: "none",
1365 apex_available: [ "myapex" ],
1366 }
1367
1368 cc_library {
1369 name: "libz",
1370 system_shared_libs: [],
1371 stl: "none",
1372 stubs: {
1373 versions: ["29", "R"],
1374 },
1375 }
1376 `, func(fs map[string][]byte, config android.Config) {
1377 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1378 })
1379
1380 expectLink := func(from, from_variant, to, to_variant string) {
1381 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1382 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1383 }
1384 expectNoLink := func(from, from_variant, to, to_variant string) {
1385 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1386 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1387 }
1388 // 9000 is quite a magic number.
1389 // Finalized SDK codenames are mapped as P(28), Q(29), ...
1390 // And, codenames which are not finalized yet(active_codenames + future_codenames) are numbered from 9000, 9001, ...
1391 // to distinguish them from finalized and future_api(10000)
1392 // In this test, "R" is assumed not finalized yet( listed in Platform_version_active_codenames) and translated into 9000
1393 // (refer android/api_levels.go)
1394 expectLink("libx", "shared_myapex", "libz", "shared_9000")
1395 expectNoLink("libx", "shared_myapex", "libz", "shared_29")
1396 expectNoLink("libx", "shared_myapex", "libz", "shared")
1397}
1398
Jooyung Han03b51852020-02-26 22:45:42 +09001399func TestApexMinSdkVersionDefaultsToLatest(t *testing.T) {
1400 ctx, _ := testApex(t, `
1401 apex {
1402 name: "myapex",
1403 key: "myapex.key",
1404 native_shared_libs: ["libx"],
1405 }
1406
1407 apex_key {
1408 name: "myapex.key",
1409 public_key: "testkey.avbpubkey",
1410 private_key: "testkey.pem",
1411 }
1412
1413 cc_library {
1414 name: "libx",
1415 shared_libs: ["libz"],
1416 system_shared_libs: [],
1417 stl: "none",
1418 apex_available: [ "myapex" ],
1419 }
1420
1421 cc_library {
1422 name: "libz",
1423 system_shared_libs: [],
1424 stl: "none",
1425 stubs: {
1426 versions: ["1", "2"],
1427 },
1428 }
1429 `)
1430
1431 expectLink := func(from, from_variant, to, to_variant string) {
1432 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1433 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1434 }
1435 expectNoLink := func(from, from_variant, to, to_variant string) {
1436 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1437 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1438 }
1439 expectLink("libx", "shared_myapex", "libz", "shared_2")
1440 expectNoLink("libx", "shared_myapex", "libz", "shared_1")
1441 expectNoLink("libx", "shared_myapex", "libz", "shared")
1442}
1443
1444func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1445 ctx, _ := testApex(t, `
1446 apex {
1447 name: "myapex",
1448 key: "myapex.key",
1449 native_shared_libs: ["libx"],
1450 }
1451
1452 apex_key {
1453 name: "myapex.key",
1454 public_key: "testkey.avbpubkey",
1455 private_key: "testkey.pem",
1456 }
1457
1458 cc_library {
1459 name: "libx",
1460 system_shared_libs: [],
1461 stl: "none",
1462 apex_available: [ "myapex" ],
1463 stubs: {
1464 versions: ["1", "2"],
1465 },
1466 }
1467
1468 cc_library {
1469 name: "libz",
1470 shared_libs: ["libx"],
1471 system_shared_libs: [],
1472 stl: "none",
1473 }
1474 `)
1475
1476 expectLink := func(from, from_variant, to, to_variant string) {
1477 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1478 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1479 }
1480 expectNoLink := func(from, from_variant, to, to_variant string) {
1481 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1482 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1483 }
1484 expectLink("libz", "shared", "libx", "shared_2")
1485 expectNoLink("libz", "shared", "libz", "shared_1")
1486 expectNoLink("libz", "shared", "libz", "shared")
1487}
1488
Jooyung Han75568392020-03-20 04:29:24 +09001489func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001490 ctx, _ := testApex(t, `
1491 apex {
1492 name: "myapex",
1493 key: "myapex.key",
1494 native_shared_libs: ["libx"],
1495 min_sdk_version: "29",
1496 }
1497
1498 apex_key {
1499 name: "myapex.key",
1500 public_key: "testkey.avbpubkey",
1501 private_key: "testkey.pem",
1502 }
1503
1504 cc_library {
1505 name: "libx",
1506 shared_libs: ["libbar"],
1507 apex_available: [ "myapex" ],
1508 }
1509
1510 cc_library {
1511 name: "libbar",
1512 stubs: {
1513 versions: ["29", "30"],
1514 },
1515 }
Jooyung Han75568392020-03-20 04:29:24 +09001516 `, func(fs map[string][]byte, config android.Config) {
1517 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1518 })
Jooyung Han03b51852020-02-26 22:45:42 +09001519 expectLink := func(from, from_variant, to, to_variant string) {
1520 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1521 libFlags := ld.Args["libFlags"]
1522 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1523 }
Jooyung Han75568392020-03-20 04:29:24 +09001524 expectLink("libx", "shared_hwasan_myapex", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001525}
1526
Jooyung Han75568392020-03-20 04:29:24 +09001527func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001528 ctx, _ := testApex(t, `
1529 apex {
1530 name: "myapex",
1531 key: "myapex.key",
1532 native_shared_libs: ["libx"],
1533 min_sdk_version: "29",
1534 }
1535
1536 apex_key {
1537 name: "myapex.key",
1538 public_key: "testkey.avbpubkey",
1539 private_key: "testkey.pem",
1540 }
1541
1542 cc_library {
1543 name: "libx",
1544 apex_available: [ "myapex" ],
1545 }
Jooyung Han75568392020-03-20 04:29:24 +09001546 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001547
1548 // ensure apex variant of c++ is linked with static unwinder
1549 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module)
1550 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1551 // note that platform variant is not.
1552 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1553 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001554}
1555
1556func TestInvalidMinSdkVersion(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001557 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001558 apex {
1559 name: "myapex",
1560 key: "myapex.key",
1561 native_shared_libs: ["libx"],
1562 min_sdk_version: "29",
1563 }
1564
1565 apex_key {
1566 name: "myapex.key",
1567 public_key: "testkey.avbpubkey",
1568 private_key: "testkey.pem",
1569 }
1570
1571 cc_library {
1572 name: "libx",
1573 shared_libs: ["libz"],
1574 system_shared_libs: [],
1575 stl: "none",
1576 apex_available: [ "myapex" ],
1577 }
1578
1579 cc_library {
1580 name: "libz",
1581 system_shared_libs: [],
1582 stl: "none",
1583 stubs: {
1584 versions: ["30"],
1585 },
1586 }
Jooyung Han75568392020-03-20 04:29:24 +09001587 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001588
Jooyung Hanaed150d2020-04-02 01:41:41 +09001589 testApexError(t, `"myapex" .*: min_sdk_version: SDK version should be .*`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001590 apex {
1591 name: "myapex",
1592 key: "myapex.key",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001593 min_sdk_version: "abc",
Jooyung Han03b51852020-02-26 22:45:42 +09001594 }
1595
1596 apex_key {
1597 name: "myapex.key",
1598 public_key: "testkey.avbpubkey",
1599 private_key: "testkey.pem",
1600 }
1601 `)
1602}
1603
Artur Satayev8cf899a2020-04-15 17:29:42 +01001604func TestJavaStableSdkVersion(t *testing.T) {
1605 testCases := []struct {
1606 name string
1607 expectedError string
1608 bp string
1609 }{
1610 {
1611 name: "Non-updatable apex with non-stable dep",
1612 bp: `
1613 apex {
1614 name: "myapex",
1615 java_libs: ["myjar"],
1616 key: "myapex.key",
1617 }
1618 apex_key {
1619 name: "myapex.key",
1620 public_key: "testkey.avbpubkey",
1621 private_key: "testkey.pem",
1622 }
1623 java_library {
1624 name: "myjar",
1625 srcs: ["foo/bar/MyClass.java"],
1626 sdk_version: "core_platform",
1627 apex_available: ["myapex"],
1628 }
1629 `,
1630 },
1631 {
1632 name: "Updatable apex with stable dep",
1633 bp: `
1634 apex {
1635 name: "myapex",
1636 java_libs: ["myjar"],
1637 key: "myapex.key",
1638 updatable: true,
1639 min_sdk_version: "29",
1640 }
1641 apex_key {
1642 name: "myapex.key",
1643 public_key: "testkey.avbpubkey",
1644 private_key: "testkey.pem",
1645 }
1646 java_library {
1647 name: "myjar",
1648 srcs: ["foo/bar/MyClass.java"],
1649 sdk_version: "current",
1650 apex_available: ["myapex"],
1651 }
1652 `,
1653 },
1654 {
1655 name: "Updatable apex with non-stable dep",
1656 expectedError: "cannot depend on \"myjar\"",
1657 bp: `
1658 apex {
1659 name: "myapex",
1660 java_libs: ["myjar"],
1661 key: "myapex.key",
1662 updatable: true,
1663 }
1664 apex_key {
1665 name: "myapex.key",
1666 public_key: "testkey.avbpubkey",
1667 private_key: "testkey.pem",
1668 }
1669 java_library {
1670 name: "myjar",
1671 srcs: ["foo/bar/MyClass.java"],
1672 sdk_version: "core_platform",
1673 apex_available: ["myapex"],
1674 }
1675 `,
1676 },
1677 {
1678 name: "Updatable apex with non-stable transitive dep",
1679 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1680 bp: `
1681 apex {
1682 name: "myapex",
1683 java_libs: ["myjar"],
1684 key: "myapex.key",
1685 updatable: true,
1686 }
1687 apex_key {
1688 name: "myapex.key",
1689 public_key: "testkey.avbpubkey",
1690 private_key: "testkey.pem",
1691 }
1692 java_library {
1693 name: "myjar",
1694 srcs: ["foo/bar/MyClass.java"],
1695 sdk_version: "current",
1696 apex_available: ["myapex"],
1697 static_libs: ["transitive-jar"],
1698 }
1699 java_library {
1700 name: "transitive-jar",
1701 srcs: ["foo/bar/MyClass.java"],
1702 sdk_version: "core_platform",
1703 apex_available: ["myapex"],
1704 }
1705 `,
1706 },
1707 }
1708
1709 for _, test := range testCases {
1710 t.Run(test.name, func(t *testing.T) {
1711 if test.expectedError == "" {
1712 testApex(t, test.bp)
1713 } else {
1714 testApexError(t, test.expectedError, test.bp)
1715 }
1716 })
1717 }
1718}
1719
Jiyong Park7c2ee712018-12-07 00:42:25 +09001720func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001721 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09001722 apex {
1723 name: "myapex",
1724 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001725 native_shared_libs: ["mylib"],
1726 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09001727 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001728 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09001729 }
1730
1731 apex_key {
1732 name: "myapex.key",
1733 public_key: "testkey.avbpubkey",
1734 private_key: "testkey.pem",
1735 }
1736
1737 prebuilt_etc {
1738 name: "myetc",
1739 src: "myprebuilt",
1740 sub_dir: "foo/bar",
1741 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001742
1743 cc_library {
1744 name: "mylib",
1745 srcs: ["mylib.cpp"],
1746 relative_install_path: "foo/bar",
1747 system_shared_libs: [],
1748 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001749 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001750 }
1751
1752 cc_binary {
1753 name: "mybin",
1754 srcs: ["mylib.cpp"],
1755 relative_install_path: "foo/bar",
1756 system_shared_libs: [],
1757 static_executable: true,
1758 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001759 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001760 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09001761 `)
1762
Sundong Ahnabb64432019-10-22 13:58:29 +09001763 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001764 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
1765
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001766 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09001767 ensureListContains(t, dirs, "etc")
1768 ensureListContains(t, dirs, "etc/foo")
1769 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001770 ensureListContains(t, dirs, "lib64")
1771 ensureListContains(t, dirs, "lib64/foo")
1772 ensureListContains(t, dirs, "lib64/foo/bar")
1773 ensureListContains(t, dirs, "lib")
1774 ensureListContains(t, dirs, "lib/foo")
1775 ensureListContains(t, dirs, "lib/foo/bar")
1776
Jiyong Parkbd13e442019-03-15 18:10:35 +09001777 ensureListContains(t, dirs, "bin")
1778 ensureListContains(t, dirs, "bin/foo")
1779 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09001780}
Jiyong Parkda6eb592018-12-19 17:12:36 +09001781
Jooyung Han35155c42020-02-06 17:33:20 +09001782func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
1783 ctx, _ := testApex(t, `
1784 apex {
1785 name: "myapex",
1786 key: "myapex.key",
1787 multilib: {
1788 both: {
1789 native_shared_libs: ["mylib"],
1790 binaries: ["mybin"],
1791 },
1792 },
1793 compile_multilib: "both",
1794 native_bridge_supported: true,
1795 }
1796
1797 apex_key {
1798 name: "myapex.key",
1799 public_key: "testkey.avbpubkey",
1800 private_key: "testkey.pem",
1801 }
1802
1803 cc_library {
1804 name: "mylib",
1805 relative_install_path: "foo/bar",
1806 system_shared_libs: [],
1807 stl: "none",
1808 apex_available: [ "myapex" ],
1809 native_bridge_supported: true,
1810 }
1811
1812 cc_binary {
1813 name: "mybin",
1814 relative_install_path: "foo/bar",
1815 system_shared_libs: [],
1816 static_executable: true,
1817 stl: "none",
1818 apex_available: [ "myapex" ],
1819 native_bridge_supported: true,
1820 compile_multilib: "both", // default is "first" for binary
1821 multilib: {
1822 lib64: {
1823 suffix: "64",
1824 },
1825 },
1826 }
1827 `, withNativeBridgeEnabled)
1828 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1829 "bin/foo/bar/mybin",
1830 "bin/foo/bar/mybin64",
1831 "bin/arm/foo/bar/mybin",
1832 "bin/arm64/foo/bar/mybin64",
1833 "lib/foo/bar/mylib.so",
1834 "lib/arm/foo/bar/mylib.so",
1835 "lib64/foo/bar/mylib.so",
1836 "lib64/arm64/foo/bar/mylib.so",
1837 })
1838}
1839
Jiyong Parkda6eb592018-12-19 17:12:36 +09001840func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001841 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09001842 apex {
1843 name: "myapex",
1844 key: "myapex.key",
1845 native_shared_libs: ["mylib"],
1846 use_vendor: true,
1847 }
1848
1849 apex_key {
1850 name: "myapex.key",
1851 public_key: "testkey.avbpubkey",
1852 private_key: "testkey.pem",
1853 }
1854
1855 cc_library {
1856 name: "mylib",
1857 srcs: ["mylib.cpp"],
1858 shared_libs: ["mylib2"],
1859 system_shared_libs: [],
1860 vendor_available: true,
1861 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001862 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001863 }
1864
1865 cc_library {
1866 name: "mylib2",
1867 srcs: ["mylib.cpp"],
1868 system_shared_libs: [],
1869 vendor_available: true,
1870 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001871 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09001872 }
Jooyung Handc782442019-11-01 03:14:38 +09001873 `, func(fs map[string][]byte, config android.Config) {
1874 setUseVendorWhitelistForTest(config, []string{"myapex"})
1875 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09001876
1877 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09001878 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09001879 for _, implicit := range i.Implicits {
1880 inputsList = append(inputsList, implicit.String())
1881 }
1882 }
1883 inputsString := strings.Join(inputsList, " ")
1884
1885 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossfb0c16e2019-11-20 17:12:35 -08001886 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib.so")
1887 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001888
1889 // ensure that the apex does not include core variants
Colin Cross7113d202019-11-20 16:39:12 -08001890 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
1891 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09001892}
Jiyong Park16e91a02018-12-20 18:18:08 +09001893
Jooyung Handc782442019-11-01 03:14:38 +09001894func TestUseVendorRestriction(t *testing.T) {
1895 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
1896 apex {
1897 name: "myapex",
1898 key: "myapex.key",
1899 use_vendor: true,
1900 }
1901 apex_key {
1902 name: "myapex.key",
1903 public_key: "testkey.avbpubkey",
1904 private_key: "testkey.pem",
1905 }
1906 `, func(fs map[string][]byte, config android.Config) {
1907 setUseVendorWhitelistForTest(config, []string{""})
1908 })
1909 // no error with whitelist
1910 testApex(t, `
1911 apex {
1912 name: "myapex",
1913 key: "myapex.key",
1914 use_vendor: true,
1915 }
1916 apex_key {
1917 name: "myapex.key",
1918 public_key: "testkey.avbpubkey",
1919 private_key: "testkey.pem",
1920 }
1921 `, func(fs map[string][]byte, config android.Config) {
1922 setUseVendorWhitelistForTest(config, []string{"myapex"})
1923 })
1924}
1925
Jooyung Han5c998b92019-06-27 11:30:33 +09001926func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
1927 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
1928 apex {
1929 name: "myapex",
1930 key: "myapex.key",
1931 native_shared_libs: ["mylib"],
1932 use_vendor: true,
1933 }
1934
1935 apex_key {
1936 name: "myapex.key",
1937 public_key: "testkey.avbpubkey",
1938 private_key: "testkey.pem",
1939 }
1940
1941 cc_library {
1942 name: "mylib",
1943 srcs: ["mylib.cpp"],
1944 system_shared_libs: [],
1945 stl: "none",
1946 }
1947 `)
1948}
1949
Jiyong Park16e91a02018-12-20 18:18:08 +09001950func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001951 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09001952 apex {
1953 name: "myapex",
1954 key: "myapex.key",
1955 native_shared_libs: ["mylib"],
1956 }
1957
1958 apex_key {
1959 name: "myapex.key",
1960 public_key: "testkey.avbpubkey",
1961 private_key: "testkey.pem",
1962 }
1963
1964 cc_library {
1965 name: "mylib",
1966 srcs: ["mylib.cpp"],
1967 system_shared_libs: [],
1968 stl: "none",
1969 stubs: {
1970 versions: ["1", "2", "3"],
1971 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001972 apex_available: [
1973 "//apex_available:platform",
1974 "myapex",
1975 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09001976 }
1977
1978 cc_binary {
1979 name: "not_in_apex",
1980 srcs: ["mylib.cpp"],
1981 static_libs: ["mylib"],
1982 static_executable: true,
1983 system_shared_libs: [],
1984 stl: "none",
1985 }
Jiyong Park16e91a02018-12-20 18:18:08 +09001986 `)
1987
Colin Cross7113d202019-11-20 16:39:12 -08001988 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09001989
1990 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08001991 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09001992}
Jiyong Park9335a262018-12-24 11:31:58 +09001993
1994func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001995 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09001996 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001997 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09001998 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09001999 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002000 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002001 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002002 }
2003
2004 cc_library {
2005 name: "mylib",
2006 srcs: ["mylib.cpp"],
2007 system_shared_libs: [],
2008 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002009 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002010 }
2011
2012 apex_key {
2013 name: "myapex.key",
2014 public_key: "testkey.avbpubkey",
2015 private_key: "testkey.pem",
2016 }
2017
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002018 android_app_certificate {
2019 name: "myapex.certificate",
2020 certificate: "testkey",
2021 }
2022
2023 android_app_certificate {
2024 name: "myapex.certificate.override",
2025 certificate: "testkey.override",
2026 }
2027
Jiyong Park9335a262018-12-24 11:31:58 +09002028 `)
2029
2030 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002031 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002032
2033 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2034 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2035 "vendor/foo/devkeys/testkey.avbpubkey")
2036 }
2037 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2038 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2039 "vendor/foo/devkeys/testkey.pem")
2040 }
2041
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002042 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002043 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002044 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002045 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002046 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002047 }
2048}
Jiyong Park58e364a2019-01-19 19:24:06 +09002049
Jooyung Hanf121a652019-12-17 14:30:11 +09002050func TestCertificate(t *testing.T) {
2051 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2052 ctx, _ := testApex(t, `
2053 apex {
2054 name: "myapex",
2055 key: "myapex.key",
2056 }
2057 apex_key {
2058 name: "myapex.key",
2059 public_key: "testkey.avbpubkey",
2060 private_key: "testkey.pem",
2061 }`)
2062 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2063 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2064 if actual := rule.Args["certificates"]; actual != expected {
2065 t.Errorf("certificates should be %q, not %q", expected, actual)
2066 }
2067 })
2068 t.Run("override when unspecified", func(t *testing.T) {
2069 ctx, _ := testApex(t, `
2070 apex {
2071 name: "myapex_keytest",
2072 key: "myapex.key",
2073 file_contexts: ":myapex-file_contexts",
2074 }
2075 apex_key {
2076 name: "myapex.key",
2077 public_key: "testkey.avbpubkey",
2078 private_key: "testkey.pem",
2079 }
2080 android_app_certificate {
2081 name: "myapex.certificate.override",
2082 certificate: "testkey.override",
2083 }`)
2084 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2085 expected := "testkey.override.x509.pem testkey.override.pk8"
2086 if actual := rule.Args["certificates"]; actual != expected {
2087 t.Errorf("certificates should be %q, not %q", expected, actual)
2088 }
2089 })
2090 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2091 ctx, _ := testApex(t, `
2092 apex {
2093 name: "myapex",
2094 key: "myapex.key",
2095 certificate: ":myapex.certificate",
2096 }
2097 apex_key {
2098 name: "myapex.key",
2099 public_key: "testkey.avbpubkey",
2100 private_key: "testkey.pem",
2101 }
2102 android_app_certificate {
2103 name: "myapex.certificate",
2104 certificate: "testkey",
2105 }`)
2106 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2107 expected := "testkey.x509.pem testkey.pk8"
2108 if actual := rule.Args["certificates"]; actual != expected {
2109 t.Errorf("certificates should be %q, not %q", expected, actual)
2110 }
2111 })
2112 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2113 ctx, _ := testApex(t, `
2114 apex {
2115 name: "myapex_keytest",
2116 key: "myapex.key",
2117 file_contexts: ":myapex-file_contexts",
2118 certificate: ":myapex.certificate",
2119 }
2120 apex_key {
2121 name: "myapex.key",
2122 public_key: "testkey.avbpubkey",
2123 private_key: "testkey.pem",
2124 }
2125 android_app_certificate {
2126 name: "myapex.certificate.override",
2127 certificate: "testkey.override",
2128 }`)
2129 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2130 expected := "testkey.override.x509.pem testkey.override.pk8"
2131 if actual := rule.Args["certificates"]; actual != expected {
2132 t.Errorf("certificates should be %q, not %q", expected, actual)
2133 }
2134 })
2135 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2136 ctx, _ := testApex(t, `
2137 apex {
2138 name: "myapex",
2139 key: "myapex.key",
2140 certificate: "testkey",
2141 }
2142 apex_key {
2143 name: "myapex.key",
2144 public_key: "testkey.avbpubkey",
2145 private_key: "testkey.pem",
2146 }`)
2147 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2148 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2149 if actual := rule.Args["certificates"]; actual != expected {
2150 t.Errorf("certificates should be %q, not %q", expected, actual)
2151 }
2152 })
2153 t.Run("override when specified as <name>", func(t *testing.T) {
2154 ctx, _ := testApex(t, `
2155 apex {
2156 name: "myapex_keytest",
2157 key: "myapex.key",
2158 file_contexts: ":myapex-file_contexts",
2159 certificate: "testkey",
2160 }
2161 apex_key {
2162 name: "myapex.key",
2163 public_key: "testkey.avbpubkey",
2164 private_key: "testkey.pem",
2165 }
2166 android_app_certificate {
2167 name: "myapex.certificate.override",
2168 certificate: "testkey.override",
2169 }`)
2170 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2171 expected := "testkey.override.x509.pem testkey.override.pk8"
2172 if actual := rule.Args["certificates"]; actual != expected {
2173 t.Errorf("certificates should be %q, not %q", expected, actual)
2174 }
2175 })
2176}
2177
Jiyong Park58e364a2019-01-19 19:24:06 +09002178func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002179 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002180 apex {
2181 name: "myapex",
2182 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002183 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002184 }
2185
2186 apex {
2187 name: "otherapex",
2188 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002189 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002190 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002191 }
2192
2193 apex_key {
2194 name: "myapex.key",
2195 public_key: "testkey.avbpubkey",
2196 private_key: "testkey.pem",
2197 }
2198
2199 cc_library {
2200 name: "mylib",
2201 srcs: ["mylib.cpp"],
2202 system_shared_libs: [],
2203 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002204 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002205 "myapex",
2206 "otherapex",
2207 ],
Jooyung Han24282772020-03-21 23:20:55 +09002208 recovery_available: true,
Jiyong Park58e364a2019-01-19 19:24:06 +09002209 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002210 cc_library {
2211 name: "mylib2",
2212 srcs: ["mylib.cpp"],
2213 system_shared_libs: [],
2214 stl: "none",
2215 apex_available: [
2216 "myapex",
2217 "otherapex",
2218 ],
2219 use_apex_name_macro: true,
2220 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002221 `)
2222
Jooyung Hanc87a0592020-03-02 17:44:33 +09002223 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002224 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002225 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han75568392020-03-20 04:29:24 +09002226 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002227
Jooyung Hanccce2f22020-03-07 03:45:53 +09002228 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002229 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2230 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002231 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002232 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002233
Jooyung Hanccce2f22020-03-07 03:45:53 +09002234 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Jooyung Hanc87a0592020-03-02 17:44:33 +09002235 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2236 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanccce2f22020-03-07 03:45:53 +09002237 ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002238 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002239
Jooyung Hanc87a0592020-03-02 17:44:33 +09002240 // When cc_library sets use_apex_name_macro: true
2241 // apex variants define additional macro to distinguish which apex variant it is built for
2242
2243 // non-APEX variant does not have __ANDROID_APEX__ defined
2244 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2245 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2246
2247 // APEX variant has __ANDROID_APEX__ defined
2248 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002249 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002250 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2251 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002252
Jooyung Hanc87a0592020-03-02 17:44:33 +09002253 // APEX variant has __ANDROID_APEX__ defined
2254 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002255 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002256 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2257 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002258
2259 // recovery variant does not set __ANDROID_SDK_VERSION__
2260 mylibCFlags = ctx.ModuleForTests("mylib", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2261 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2262 ensureNotContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002263}
Jiyong Park7e636d02019-01-28 16:16:54 +09002264
2265func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002266 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002267 apex {
2268 name: "myapex",
2269 key: "myapex.key",
2270 native_shared_libs: ["mylib"],
2271 }
2272
2273 apex_key {
2274 name: "myapex.key",
2275 public_key: "testkey.avbpubkey",
2276 private_key: "testkey.pem",
2277 }
2278
2279 cc_library_headers {
2280 name: "mylib_headers",
2281 export_include_dirs: ["my_include"],
2282 system_shared_libs: [],
2283 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002284 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002285 }
2286
2287 cc_library {
2288 name: "mylib",
2289 srcs: ["mylib.cpp"],
2290 system_shared_libs: [],
2291 stl: "none",
2292 header_libs: ["mylib_headers"],
2293 export_header_lib_headers: ["mylib_headers"],
2294 stubs: {
2295 versions: ["1", "2", "3"],
2296 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002297 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002298 }
2299
2300 cc_library {
2301 name: "otherlib",
2302 srcs: ["mylib.cpp"],
2303 system_shared_libs: [],
2304 stl: "none",
2305 shared_libs: ["mylib"],
2306 }
2307 `)
2308
Colin Cross7113d202019-11-20 16:39:12 -08002309 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002310
2311 // Ensure that the include path of the header lib is exported to 'otherlib'
2312 ensureContains(t, cFlags, "-Imy_include")
2313}
Alex Light9670d332019-01-29 18:07:33 -08002314
Jiyong Park7cd10e32020-01-14 09:22:18 +09002315type fileInApex struct {
2316 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002317 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002318 isLink bool
2319}
2320
Jooyung Hana57af4a2020-01-23 05:36:59 +00002321func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002322 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002323 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002324 copyCmds := apexRule.Args["copy_commands"]
2325 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002326 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002327 for _, cmd := range strings.Split(copyCmds, "&&") {
2328 cmd = strings.TrimSpace(cmd)
2329 if cmd == "" {
2330 continue
2331 }
2332 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002333 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002334 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002335 switch terms[0] {
2336 case "mkdir":
2337 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002338 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002339 t.Fatal("copyCmds contains invalid cp command", cmd)
2340 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002341 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002342 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002343 isLink = false
2344 case "ln":
2345 if len(terms) != 3 && len(terms) != 4 {
2346 // ln LINK TARGET or ln -s LINK TARGET
2347 t.Fatal("copyCmds contains invalid ln command", cmd)
2348 }
2349 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002350 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002351 isLink = true
2352 default:
2353 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2354 }
2355 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002356 index := strings.Index(dst, imageApexDir)
2357 if index == -1 {
2358 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2359 }
2360 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002361 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002362 }
2363 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002364 return ret
2365}
2366
Jooyung Hana57af4a2020-01-23 05:36:59 +00002367func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
2368 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09002369 var failed bool
2370 var surplus []string
2371 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00002372 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09002373 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09002374 for _, expected := range files {
2375 if matched, _ := path.Match(expected, file.path); matched {
2376 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09002377 mactchFound = true
2378 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09002379 }
2380 }
Jooyung Hane6436d72020-02-27 13:31:56 +09002381 if !mactchFound {
2382 surplus = append(surplus, file.path)
2383 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002384 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002385
Jooyung Han31c470b2019-10-18 16:26:59 +09002386 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002387 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09002388 t.Log("surplus files", surplus)
2389 failed = true
2390 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002391
2392 if len(files) > len(filesMatched) {
2393 var missing []string
2394 for _, expected := range files {
2395 if !filesMatched[expected] {
2396 missing = append(missing, expected)
2397 }
2398 }
2399 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09002400 t.Log("missing files", missing)
2401 failed = true
2402 }
2403 if failed {
2404 t.Fail()
2405 }
2406}
2407
Jooyung Han344d5432019-08-23 11:17:39 +09002408func TestVndkApexCurrent(t *testing.T) {
2409 ctx, _ := testApex(t, `
2410 apex_vndk {
2411 name: "myapex",
2412 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002413 }
2414
2415 apex_key {
2416 name: "myapex.key",
2417 public_key: "testkey.avbpubkey",
2418 private_key: "testkey.pem",
2419 }
2420
2421 cc_library {
2422 name: "libvndk",
2423 srcs: ["mylib.cpp"],
2424 vendor_available: true,
2425 vndk: {
2426 enabled: true,
2427 },
2428 system_shared_libs: [],
2429 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002430 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002431 }
2432
2433 cc_library {
2434 name: "libvndksp",
2435 srcs: ["mylib.cpp"],
2436 vendor_available: true,
2437 vndk: {
2438 enabled: true,
2439 support_system_process: true,
2440 },
2441 system_shared_libs: [],
2442 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002443 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002444 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002445 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09002446
Jooyung Hana57af4a2020-01-23 05:36:59 +00002447 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002448 "lib/libvndk.so",
2449 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002450 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09002451 "lib64/libvndk.so",
2452 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002453 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002454 "etc/llndk.libraries.VER.txt",
2455 "etc/vndkcore.libraries.VER.txt",
2456 "etc/vndksp.libraries.VER.txt",
2457 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09002458 })
Jooyung Han344d5432019-08-23 11:17:39 +09002459}
2460
2461func TestVndkApexWithPrebuilt(t *testing.T) {
2462 ctx, _ := testApex(t, `
2463 apex_vndk {
2464 name: "myapex",
2465 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09002466 }
2467
2468 apex_key {
2469 name: "myapex.key",
2470 public_key: "testkey.avbpubkey",
2471 private_key: "testkey.pem",
2472 }
2473
2474 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09002475 name: "libvndk",
2476 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09002477 vendor_available: true,
2478 vndk: {
2479 enabled: true,
2480 },
2481 system_shared_libs: [],
2482 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002483 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002484 }
Jooyung Han31c470b2019-10-18 16:26:59 +09002485
2486 cc_prebuilt_library_shared {
2487 name: "libvndk.arm",
2488 srcs: ["libvndk.arm.so"],
2489 vendor_available: true,
2490 vndk: {
2491 enabled: true,
2492 },
2493 enabled: false,
2494 arch: {
2495 arm: {
2496 enabled: true,
2497 },
2498 },
2499 system_shared_libs: [],
2500 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002501 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002502 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002503 `+vndkLibrariesTxtFiles("current"),
2504 withFiles(map[string][]byte{
2505 "libvndk.so": nil,
2506 "libvndk.arm.so": nil,
2507 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002508
Jooyung Hana57af4a2020-01-23 05:36:59 +00002509 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002510 "lib/libvndk.so",
2511 "lib/libvndk.arm.so",
2512 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002513 "lib/libc++.so",
2514 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002515 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002516 })
Jooyung Han344d5432019-08-23 11:17:39 +09002517}
2518
Jooyung Han39edb6c2019-11-06 16:53:07 +09002519func vndkLibrariesTxtFiles(vers ...string) (result string) {
2520 for _, v := range vers {
2521 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09002522 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002523 result += `
2524 vndk_libraries_txt {
2525 name: "` + txt + `.libraries.txt",
2526 }
2527 `
2528 }
2529 } else {
2530 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
2531 result += `
2532 prebuilt_etc {
2533 name: "` + txt + `.libraries.` + v + `.txt",
2534 src: "dummy.txt",
2535 }
2536 `
2537 }
2538 }
2539 }
2540 return
2541}
2542
Jooyung Han344d5432019-08-23 11:17:39 +09002543func TestVndkApexVersion(t *testing.T) {
2544 ctx, _ := testApex(t, `
2545 apex_vndk {
2546 name: "myapex_v27",
2547 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002548 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002549 vndk_version: "27",
2550 }
2551
2552 apex_key {
2553 name: "myapex.key",
2554 public_key: "testkey.avbpubkey",
2555 private_key: "testkey.pem",
2556 }
2557
Jooyung Han31c470b2019-10-18 16:26:59 +09002558 vndk_prebuilt_shared {
2559 name: "libvndk27",
2560 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09002561 vendor_available: true,
2562 vndk: {
2563 enabled: true,
2564 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002565 target_arch: "arm64",
2566 arch: {
2567 arm: {
2568 srcs: ["libvndk27_arm.so"],
2569 },
2570 arm64: {
2571 srcs: ["libvndk27_arm64.so"],
2572 },
2573 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002574 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002575 }
2576
2577 vndk_prebuilt_shared {
2578 name: "libvndk27",
2579 version: "27",
2580 vendor_available: true,
2581 vndk: {
2582 enabled: true,
2583 },
Jooyung Han31c470b2019-10-18 16:26:59 +09002584 target_arch: "x86_64",
2585 arch: {
2586 x86: {
2587 srcs: ["libvndk27_x86.so"],
2588 },
2589 x86_64: {
2590 srcs: ["libvndk27_x86_64.so"],
2591 },
2592 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09002593 }
2594 `+vndkLibrariesTxtFiles("27"),
2595 withFiles(map[string][]byte{
2596 "libvndk27_arm.so": nil,
2597 "libvndk27_arm64.so": nil,
2598 "libvndk27_x86.so": nil,
2599 "libvndk27_x86_64.so": nil,
2600 }))
Jooyung Han344d5432019-08-23 11:17:39 +09002601
Jooyung Hana57af4a2020-01-23 05:36:59 +00002602 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002603 "lib/libvndk27_arm.so",
2604 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002605 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002606 })
Jooyung Han344d5432019-08-23 11:17:39 +09002607}
2608
2609func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
2610 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
2611 apex_vndk {
2612 name: "myapex_v27",
2613 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002614 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002615 vndk_version: "27",
2616 }
2617 apex_vndk {
2618 name: "myapex_v27_other",
2619 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002620 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002621 vndk_version: "27",
2622 }
2623
2624 apex_key {
2625 name: "myapex.key",
2626 public_key: "testkey.avbpubkey",
2627 private_key: "testkey.pem",
2628 }
2629
2630 cc_library {
2631 name: "libvndk",
2632 srcs: ["mylib.cpp"],
2633 vendor_available: true,
2634 vndk: {
2635 enabled: true,
2636 },
2637 system_shared_libs: [],
2638 stl: "none",
2639 }
2640
2641 vndk_prebuilt_shared {
2642 name: "libvndk",
2643 version: "27",
2644 vendor_available: true,
2645 vndk: {
2646 enabled: true,
2647 },
2648 srcs: ["libvndk.so"],
2649 }
2650 `, withFiles(map[string][]byte{
2651 "libvndk.so": nil,
2652 }))
2653}
2654
Jooyung Han90eee022019-10-01 20:02:42 +09002655func TestVndkApexNameRule(t *testing.T) {
2656 ctx, _ := testApex(t, `
2657 apex_vndk {
2658 name: "myapex",
2659 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002660 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002661 }
2662 apex_vndk {
2663 name: "myapex_v28",
2664 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002665 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09002666 vndk_version: "28",
2667 }
2668 apex_key {
2669 name: "myapex.key",
2670 public_key: "testkey.avbpubkey",
2671 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002672 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09002673
2674 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00002675 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09002676 actual := proptools.String(bundle.properties.Apex_name)
2677 if !reflect.DeepEqual(actual, expected) {
2678 t.Errorf("Got '%v', expected '%v'", actual, expected)
2679 }
2680 }
2681
2682 assertApexName("com.android.vndk.vVER", "myapex")
2683 assertApexName("com.android.vndk.v28", "myapex_v28")
2684}
2685
Jooyung Han344d5432019-08-23 11:17:39 +09002686func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
2687 ctx, _ := testApex(t, `
2688 apex_vndk {
2689 name: "myapex",
2690 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002691 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002692 }
2693
2694 apex_key {
2695 name: "myapex.key",
2696 public_key: "testkey.avbpubkey",
2697 private_key: "testkey.pem",
2698 }
2699
2700 cc_library {
2701 name: "libvndk",
2702 srcs: ["mylib.cpp"],
2703 vendor_available: true,
2704 native_bridge_supported: true,
2705 host_supported: true,
2706 vndk: {
2707 enabled: true,
2708 },
2709 system_shared_libs: [],
2710 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002711 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09002712 }
Jooyung Han35155c42020-02-06 17:33:20 +09002713 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09002714
Jooyung Hana57af4a2020-01-23 05:36:59 +00002715 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002716 "lib/libvndk.so",
2717 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09002718 "lib/libc++.so",
2719 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002720 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002721 })
Jooyung Han344d5432019-08-23 11:17:39 +09002722}
2723
2724func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
2725 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
2726 apex_vndk {
2727 name: "myapex",
2728 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002729 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09002730 native_bridge_supported: true,
2731 }
2732
2733 apex_key {
2734 name: "myapex.key",
2735 public_key: "testkey.avbpubkey",
2736 private_key: "testkey.pem",
2737 }
2738
2739 cc_library {
2740 name: "libvndk",
2741 srcs: ["mylib.cpp"],
2742 vendor_available: true,
2743 native_bridge_supported: true,
2744 host_supported: true,
2745 vndk: {
2746 enabled: true,
2747 },
2748 system_shared_libs: [],
2749 stl: "none",
2750 }
2751 `)
2752}
2753
Jooyung Han31c470b2019-10-18 16:26:59 +09002754func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09002755 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09002756 apex_vndk {
2757 name: "myapex_v27",
2758 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002759 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09002760 vndk_version: "27",
2761 }
2762
2763 apex_key {
2764 name: "myapex.key",
2765 public_key: "testkey.avbpubkey",
2766 private_key: "testkey.pem",
2767 }
2768
2769 vndk_prebuilt_shared {
2770 name: "libvndk27",
2771 version: "27",
2772 target_arch: "arm",
2773 vendor_available: true,
2774 vndk: {
2775 enabled: true,
2776 },
2777 arch: {
2778 arm: {
2779 srcs: ["libvndk27.so"],
2780 }
2781 },
2782 }
2783
2784 vndk_prebuilt_shared {
2785 name: "libvndk27",
2786 version: "27",
2787 target_arch: "arm",
2788 binder32bit: true,
2789 vendor_available: true,
2790 vndk: {
2791 enabled: true,
2792 },
2793 arch: {
2794 arm: {
2795 srcs: ["libvndk27binder32.so"],
2796 }
2797 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002798 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09002799 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09002800 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09002801 withFiles(map[string][]byte{
2802 "libvndk27.so": nil,
2803 "libvndk27binder32.so": nil,
2804 }),
2805 withBinder32bit,
2806 withTargets(map[android.OsType][]android.Target{
2807 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09002808 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
2809 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09002810 },
2811 }),
2812 )
2813
Jooyung Hana57af4a2020-01-23 05:36:59 +00002814 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09002815 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09002816 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09002817 })
2818}
2819
Jooyung Hane1633032019-08-01 17:41:43 +09002820func TestDependenciesInApexManifest(t *testing.T) {
2821 ctx, _ := testApex(t, `
2822 apex {
2823 name: "myapex_nodep",
2824 key: "myapex.key",
2825 native_shared_libs: ["lib_nodep"],
2826 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002827 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002828 }
2829
2830 apex {
2831 name: "myapex_dep",
2832 key: "myapex.key",
2833 native_shared_libs: ["lib_dep"],
2834 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002835 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002836 }
2837
2838 apex {
2839 name: "myapex_provider",
2840 key: "myapex.key",
2841 native_shared_libs: ["libfoo"],
2842 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002843 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002844 }
2845
2846 apex {
2847 name: "myapex_selfcontained",
2848 key: "myapex.key",
2849 native_shared_libs: ["lib_dep", "libfoo"],
2850 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09002851 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09002852 }
2853
2854 apex_key {
2855 name: "myapex.key",
2856 public_key: "testkey.avbpubkey",
2857 private_key: "testkey.pem",
2858 }
2859
2860 cc_library {
2861 name: "lib_nodep",
2862 srcs: ["mylib.cpp"],
2863 system_shared_libs: [],
2864 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002865 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09002866 }
2867
2868 cc_library {
2869 name: "lib_dep",
2870 srcs: ["mylib.cpp"],
2871 shared_libs: ["libfoo"],
2872 system_shared_libs: [],
2873 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002874 apex_available: [
2875 "myapex_dep",
2876 "myapex_provider",
2877 "myapex_selfcontained",
2878 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002879 }
2880
2881 cc_library {
2882 name: "libfoo",
2883 srcs: ["mytest.cpp"],
2884 stubs: {
2885 versions: ["1"],
2886 },
2887 system_shared_libs: [],
2888 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002889 apex_available: [
2890 "myapex_provider",
2891 "myapex_selfcontained",
2892 ],
Jooyung Hane1633032019-08-01 17:41:43 +09002893 }
2894 `)
2895
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002896 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09002897 var provideNativeLibs, requireNativeLibs []string
2898
Sundong Ahnabb64432019-10-22 13:58:29 +09002899 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002900 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2901 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002902 ensureListEmpty(t, provideNativeLibs)
2903 ensureListEmpty(t, requireNativeLibs)
2904
Sundong Ahnabb64432019-10-22 13:58:29 +09002905 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002906 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2907 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002908 ensureListEmpty(t, provideNativeLibs)
2909 ensureListContains(t, requireNativeLibs, "libfoo.so")
2910
Sundong Ahnabb64432019-10-22 13:58:29 +09002911 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002912 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2913 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002914 ensureListContains(t, provideNativeLibs, "libfoo.so")
2915 ensureListEmpty(t, requireNativeLibs)
2916
Sundong Ahnabb64432019-10-22 13:58:29 +09002917 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002918 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
2919 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09002920 ensureListContains(t, provideNativeLibs, "libfoo.so")
2921 ensureListEmpty(t, requireNativeLibs)
2922}
2923
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002924func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09002925 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002926 apex {
2927 name: "myapex",
2928 key: "myapex.key",
2929 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09002930 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002931 }
2932
2933 apex_key {
2934 name: "myapex.key",
2935 public_key: "testkey.avbpubkey",
2936 private_key: "testkey.pem",
2937 }
Jiyong Parkdb334862020-02-05 17:19:28 +09002938
2939 cc_library {
2940 name: "mylib",
2941 srcs: ["mylib.cpp"],
2942 system_shared_libs: [],
2943 stl: "none",
2944 apex_available: [
2945 "//apex_available:platform",
2946 "myapex",
2947 ],
2948 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002949 `)
2950
Sundong Ahnabb64432019-10-22 13:58:29 +09002951 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002952 apexManifestRule := module.Rule("apexManifestRule")
2953 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
2954 apexRule := module.Rule("apexRule")
2955 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09002956
2957 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2958 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2959 name := apexBundle.BaseModuleName()
2960 prefix := "TARGET_"
2961 var builder strings.Builder
2962 data.Custom(&builder, name, prefix, "", data)
2963 androidMk := builder.String()
2964 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
2965 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09002966}
2967
Alex Light0851b882019-02-07 13:20:53 -08002968func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002969 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08002970 apex {
2971 name: "myapex",
2972 key: "myapex.key",
2973 native_shared_libs: ["mylib_common"],
2974 }
2975
2976 apex_key {
2977 name: "myapex.key",
2978 public_key: "testkey.avbpubkey",
2979 private_key: "testkey.pem",
2980 }
2981
2982 cc_library {
2983 name: "mylib_common",
2984 srcs: ["mylib.cpp"],
2985 system_shared_libs: [],
2986 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002987 apex_available: [
2988 "//apex_available:platform",
2989 "myapex",
2990 ],
Alex Light0851b882019-02-07 13:20:53 -08002991 }
2992 `)
2993
Sundong Ahnabb64432019-10-22 13:58:29 +09002994 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08002995 apexRule := module.Rule("apexRule")
2996 copyCmds := apexRule.Args["copy_commands"]
2997
2998 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
2999 t.Log("Apex was a test apex!")
3000 t.Fail()
3001 }
3002 // Ensure that main rule creates an output
3003 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3004
3005 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003006 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003007
3008 // Ensure that both direct and indirect deps are copied into apex
3009 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3010
Colin Cross7113d202019-11-20 16:39:12 -08003011 // Ensure that the platform variant ends with _shared
3012 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003013
3014 if !android.InAnyApex("mylib_common") {
3015 t.Log("Found mylib_common not in any apex!")
3016 t.Fail()
3017 }
3018}
3019
3020func TestTestApex(t *testing.T) {
3021 if android.InAnyApex("mylib_common_test") {
3022 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!")
3023 }
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003024 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003025 apex_test {
3026 name: "myapex",
3027 key: "myapex.key",
3028 native_shared_libs: ["mylib_common_test"],
3029 }
3030
3031 apex_key {
3032 name: "myapex.key",
3033 public_key: "testkey.avbpubkey",
3034 private_key: "testkey.pem",
3035 }
3036
3037 cc_library {
3038 name: "mylib_common_test",
3039 srcs: ["mylib.cpp"],
3040 system_shared_libs: [],
3041 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003042 // TODO: remove //apex_available:platform
3043 apex_available: [
3044 "//apex_available:platform",
3045 "myapex",
3046 ],
Alex Light0851b882019-02-07 13:20:53 -08003047 }
3048 `)
3049
Sundong Ahnabb64432019-10-22 13:58:29 +09003050 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003051 apexRule := module.Rule("apexRule")
3052 copyCmds := apexRule.Args["copy_commands"]
3053
3054 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3055 t.Log("Apex was not a test apex!")
3056 t.Fail()
3057 }
3058 // Ensure that main rule creates an output
3059 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3060
3061 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003062 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
Alex Light0851b882019-02-07 13:20:53 -08003063
3064 // Ensure that both direct and indirect deps are copied into apex
3065 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3066
Colin Cross7113d202019-11-20 16:39:12 -08003067 // Ensure that the platform variant ends with _shared
3068 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003069}
3070
Alex Light9670d332019-01-29 18:07:33 -08003071func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003072 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003073 apex {
3074 name: "myapex",
3075 key: "myapex.key",
3076 multilib: {
3077 first: {
3078 native_shared_libs: ["mylib_common"],
3079 }
3080 },
3081 target: {
3082 android: {
3083 multilib: {
3084 first: {
3085 native_shared_libs: ["mylib"],
3086 }
3087 }
3088 },
3089 host: {
3090 multilib: {
3091 first: {
3092 native_shared_libs: ["mylib2"],
3093 }
3094 }
3095 }
3096 }
3097 }
3098
3099 apex_key {
3100 name: "myapex.key",
3101 public_key: "testkey.avbpubkey",
3102 private_key: "testkey.pem",
3103 }
3104
3105 cc_library {
3106 name: "mylib",
3107 srcs: ["mylib.cpp"],
3108 system_shared_libs: [],
3109 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003110 // TODO: remove //apex_available:platform
3111 apex_available: [
3112 "//apex_available:platform",
3113 "myapex",
3114 ],
Alex Light9670d332019-01-29 18:07:33 -08003115 }
3116
3117 cc_library {
3118 name: "mylib_common",
3119 srcs: ["mylib.cpp"],
3120 system_shared_libs: [],
3121 stl: "none",
3122 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003123 // TODO: remove //apex_available:platform
3124 apex_available: [
3125 "//apex_available:platform",
3126 "myapex",
3127 ],
Alex Light9670d332019-01-29 18:07:33 -08003128 }
3129
3130 cc_library {
3131 name: "mylib2",
3132 srcs: ["mylib.cpp"],
3133 system_shared_libs: [],
3134 stl: "none",
3135 compile_multilib: "first",
3136 }
3137 `)
3138
Sundong Ahnabb64432019-10-22 13:58:29 +09003139 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003140 copyCmds := apexRule.Args["copy_commands"]
3141
3142 // Ensure that main rule creates an output
3143 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3144
3145 // Ensure that apex variant is created for the direct dep
Colin Cross7113d202019-11-20 16:39:12 -08003146 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3147 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
3148 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
Alex Light9670d332019-01-29 18:07:33 -08003149
3150 // Ensure that both direct and indirect deps are copied into apex
3151 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3152 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3153 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3154
Colin Cross7113d202019-11-20 16:39:12 -08003155 // Ensure that the platform variant ends with _shared
3156 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3157 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3158 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003159}
Jiyong Park04480cf2019-02-06 00:16:29 +09003160
3161func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003162 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003163 apex {
3164 name: "myapex",
3165 key: "myapex.key",
3166 binaries: ["myscript"],
3167 }
3168
3169 apex_key {
3170 name: "myapex.key",
3171 public_key: "testkey.avbpubkey",
3172 private_key: "testkey.pem",
3173 }
3174
3175 sh_binary {
3176 name: "myscript",
3177 src: "mylib.cpp",
3178 filename: "myscript.sh",
3179 sub_dir: "script",
3180 }
3181 `)
3182
Sundong Ahnabb64432019-10-22 13:58:29 +09003183 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003184 copyCmds := apexRule.Args["copy_commands"]
3185
3186 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3187}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003188
Jooyung Han91df2082019-11-20 01:49:42 +09003189func TestApexInVariousPartition(t *testing.T) {
3190 testcases := []struct {
3191 propName, parition, flattenedPartition string
3192 }{
3193 {"", "system", "system_ext"},
3194 {"product_specific: true", "product", "product"},
3195 {"soc_specific: true", "vendor", "vendor"},
3196 {"proprietary: true", "vendor", "vendor"},
3197 {"vendor: true", "vendor", "vendor"},
3198 {"system_ext_specific: true", "system_ext", "system_ext"},
3199 }
3200 for _, tc := range testcases {
3201 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3202 ctx, _ := testApex(t, `
3203 apex {
3204 name: "myapex",
3205 key: "myapex.key",
3206 `+tc.propName+`
3207 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003208
Jooyung Han91df2082019-11-20 01:49:42 +09003209 apex_key {
3210 name: "myapex.key",
3211 public_key: "testkey.avbpubkey",
3212 private_key: "testkey.pem",
3213 }
3214 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003215
Jooyung Han91df2082019-11-20 01:49:42 +09003216 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3217 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3218 actual := apex.installDir.String()
3219 if actual != expected {
3220 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3221 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003222
Jooyung Han91df2082019-11-20 01:49:42 +09003223 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3224 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3225 actual = flattened.installDir.String()
3226 if actual != expected {
3227 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3228 }
3229 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003230 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003231}
Jiyong Park67882562019-03-21 01:11:21 +09003232
Jooyung Han54aca7b2019-11-20 02:26:02 +09003233func TestFileContexts(t *testing.T) {
3234 ctx, _ := testApex(t, `
3235 apex {
3236 name: "myapex",
3237 key: "myapex.key",
3238 }
3239
3240 apex_key {
3241 name: "myapex.key",
3242 public_key: "testkey.avbpubkey",
3243 private_key: "testkey.pem",
3244 }
3245 `)
3246 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3247 apexRule := module.Rule("apexRule")
3248 actual := apexRule.Args["file_contexts"]
3249 expected := "system/sepolicy/apex/myapex-file_contexts"
3250 if actual != expected {
3251 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3252 }
3253
3254 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
3255 apex {
3256 name: "myapex",
3257 key: "myapex.key",
3258 file_contexts: "my_own_file_contexts",
3259 }
3260
3261 apex_key {
3262 name: "myapex.key",
3263 public_key: "testkey.avbpubkey",
3264 private_key: "testkey.pem",
3265 }
3266 `, withFiles(map[string][]byte{
3267 "my_own_file_contexts": nil,
3268 }))
3269
3270 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
3271 apex {
3272 name: "myapex",
3273 key: "myapex.key",
3274 product_specific: true,
3275 file_contexts: "product_specific_file_contexts",
3276 }
3277
3278 apex_key {
3279 name: "myapex.key",
3280 public_key: "testkey.avbpubkey",
3281 private_key: "testkey.pem",
3282 }
3283 `)
3284
3285 ctx, _ = testApex(t, `
3286 apex {
3287 name: "myapex",
3288 key: "myapex.key",
3289 product_specific: true,
3290 file_contexts: "product_specific_file_contexts",
3291 }
3292
3293 apex_key {
3294 name: "myapex.key",
3295 public_key: "testkey.avbpubkey",
3296 private_key: "testkey.pem",
3297 }
3298 `, withFiles(map[string][]byte{
3299 "product_specific_file_contexts": nil,
3300 }))
3301 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3302 apexRule = module.Rule("apexRule")
3303 actual = apexRule.Args["file_contexts"]
3304 expected = "product_specific_file_contexts"
3305 if actual != expected {
3306 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3307 }
3308
3309 ctx, _ = testApex(t, `
3310 apex {
3311 name: "myapex",
3312 key: "myapex.key",
3313 product_specific: true,
3314 file_contexts: ":my-file-contexts",
3315 }
3316
3317 apex_key {
3318 name: "myapex.key",
3319 public_key: "testkey.avbpubkey",
3320 private_key: "testkey.pem",
3321 }
3322
3323 filegroup {
3324 name: "my-file-contexts",
3325 srcs: ["product_specific_file_contexts"],
3326 }
3327 `, withFiles(map[string][]byte{
3328 "product_specific_file_contexts": nil,
3329 }))
3330 module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
3331 apexRule = module.Rule("apexRule")
3332 actual = apexRule.Args["file_contexts"]
3333 expected = "product_specific_file_contexts"
3334 if actual != expected {
3335 t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
3336 }
3337}
3338
Jiyong Park67882562019-03-21 01:11:21 +09003339func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003340 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09003341 apex_key {
3342 name: "myapex.key",
3343 public_key: ":my.avbpubkey",
3344 private_key: ":my.pem",
3345 product_specific: true,
3346 }
3347
3348 filegroup {
3349 name: "my.avbpubkey",
3350 srcs: ["testkey2.avbpubkey"],
3351 }
3352
3353 filegroup {
3354 name: "my.pem",
3355 srcs: ["testkey2.pem"],
3356 }
3357 `)
3358
3359 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
3360 expected_pubkey := "testkey2.avbpubkey"
3361 actual_pubkey := apex_key.public_key_file.String()
3362 if actual_pubkey != expected_pubkey {
3363 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
3364 }
3365 expected_privkey := "testkey2.pem"
3366 actual_privkey := apex_key.private_key_file.String()
3367 if actual_privkey != expected_privkey {
3368 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
3369 }
3370}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003371
3372func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003373 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003374 prebuilt_apex {
3375 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09003376 arch: {
3377 arm64: {
3378 src: "myapex-arm64.apex",
3379 },
3380 arm: {
3381 src: "myapex-arm.apex",
3382 },
3383 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003384 }
3385 `)
3386
3387 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3388
Jiyong Parkc95714e2019-03-29 14:23:10 +09003389 expectedInput := "myapex-arm64.apex"
3390 if prebuilt.inputApex.String() != expectedInput {
3391 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
3392 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07003393}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003394
3395func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003396 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01003397 prebuilt_apex {
3398 name: "myapex",
3399 src: "myapex-arm.apex",
3400 filename: "notmyapex.apex",
3401 }
3402 `)
3403
3404 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
3405
3406 expected := "notmyapex.apex"
3407 if p.installFilename != expected {
3408 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
3409 }
3410}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07003411
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003412func TestPrebuiltOverrides(t *testing.T) {
3413 ctx, config := testApex(t, `
3414 prebuilt_apex {
3415 name: "myapex.prebuilt",
3416 src: "myapex-arm.apex",
3417 overrides: [
3418 "myapex",
3419 ],
3420 }
3421 `)
3422
3423 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
3424
3425 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09003426 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003427 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09003428 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003429 }
3430}
3431
Roland Levillain630846d2019-06-26 12:48:34 +01003432func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01003433 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01003434 apex_test {
3435 name: "myapex",
3436 key: "myapex.key",
3437 tests: [
3438 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01003439 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01003440 ],
3441 }
3442
3443 apex_key {
3444 name: "myapex.key",
3445 public_key: "testkey.avbpubkey",
3446 private_key: "testkey.pem",
3447 }
3448
Liz Kammer1c14a212020-05-12 15:26:55 -07003449 filegroup {
3450 name: "fg",
3451 srcs: [
3452 "baz",
3453 "bar/baz"
3454 ],
3455 }
3456
Roland Levillain630846d2019-06-26 12:48:34 +01003457 cc_test {
3458 name: "mytest",
3459 gtest: false,
3460 srcs: ["mytest.cpp"],
3461 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003462 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01003463 system_shared_libs: [],
3464 static_executable: true,
3465 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07003466 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01003467 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01003468
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003469 cc_library {
3470 name: "mylib",
3471 srcs: ["mylib.cpp"],
3472 system_shared_libs: [],
3473 stl: "none",
3474 }
3475
Liz Kammer5bd365f2020-05-27 15:15:11 -07003476 filegroup {
3477 name: "fg2",
3478 srcs: [
3479 "testdata/baz"
3480 ],
3481 }
3482
Roland Levillain9b5fde92019-06-28 15:41:19 +01003483 cc_test {
3484 name: "mytests",
3485 gtest: false,
3486 srcs: [
3487 "mytest1.cpp",
3488 "mytest2.cpp",
3489 "mytest3.cpp",
3490 ],
3491 test_per_src: true,
3492 relative_install_path: "test",
3493 system_shared_libs: [],
3494 static_executable: true,
3495 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07003496 data: [
3497 ":fg",
3498 ":fg2",
3499 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01003500 }
Roland Levillain630846d2019-06-26 12:48:34 +01003501 `)
3502
Sundong Ahnabb64432019-10-22 13:58:29 +09003503 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01003504 copyCmds := apexRule.Args["copy_commands"]
3505
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003506 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01003507 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09003508 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01003509
Liz Kammer1c14a212020-05-12 15:26:55 -07003510 //Ensure that test data are copied into apex.
3511 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
3512 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
3513
Roland Levillain9b5fde92019-06-28 15:41:19 +01003514 // Ensure that test deps built with `test_per_src` are copied into apex.
3515 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
3516 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
3517 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01003518
3519 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07003520 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3521 data := android.AndroidMkDataForTest(t, config, "", bundle)
3522 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01003523 prefix := "TARGET_"
3524 var builder strings.Builder
3525 data.Custom(&builder, name, prefix, "", data)
3526 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09003527 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
3528 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
3529 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
3530 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09003531 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09003532 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01003533 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07003534
3535 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3536 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
3537 data.Custom(&builder, name, prefix, "", data)
3538 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07003539 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
3540 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01003541}
3542
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003543func TestInstallExtraFlattenedApexes(t *testing.T) {
3544 ctx, config := testApex(t, `
3545 apex {
3546 name: "myapex",
3547 key: "myapex.key",
3548 }
3549 apex_key {
3550 name: "myapex.key",
3551 public_key: "testkey.avbpubkey",
3552 private_key: "testkey.pem",
3553 }
3554 `, func(fs map[string][]byte, config android.Config) {
3555 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
3556 })
3557 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09003558 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09003559 mk := android.AndroidMkDataForTest(t, config, "", ab)
3560 var builder strings.Builder
3561 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
3562 androidMk := builder.String()
3563 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
3564}
3565
Jooyung Han5c998b92019-06-27 11:30:33 +09003566func TestApexUsesOtherApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003567 ctx, _ := testApex(t, `
Jooyung Han5c998b92019-06-27 11:30:33 +09003568 apex {
3569 name: "myapex",
3570 key: "myapex.key",
3571 native_shared_libs: ["mylib"],
3572 uses: ["commonapex"],
3573 }
3574
3575 apex {
3576 name: "commonapex",
3577 key: "myapex.key",
3578 native_shared_libs: ["libcommon"],
3579 provide_cpp_shared_libs: true,
3580 }
3581
3582 apex_key {
3583 name: "myapex.key",
3584 public_key: "testkey.avbpubkey",
3585 private_key: "testkey.pem",
3586 }
3587
3588 cc_library {
3589 name: "mylib",
3590 srcs: ["mylib.cpp"],
3591 shared_libs: ["libcommon"],
3592 system_shared_libs: [],
3593 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003594 apex_available: [ "myapex" ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003595 }
3596
3597 cc_library {
3598 name: "libcommon",
3599 srcs: ["mylib_common.cpp"],
3600 system_shared_libs: [],
3601 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003602 // TODO: remove //apex_available:platform
3603 apex_available: [
3604 "//apex_available:platform",
3605 "commonapex",
3606 "myapex",
3607 ],
Jooyung Han5c998b92019-06-27 11:30:33 +09003608 }
3609 `)
3610
Sundong Ahnabb64432019-10-22 13:58:29 +09003611 module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003612 apexRule1 := module1.Rule("apexRule")
3613 copyCmds1 := apexRule1.Args["copy_commands"]
3614
Sundong Ahnabb64432019-10-22 13:58:29 +09003615 module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
Jooyung Han5c998b92019-06-27 11:30:33 +09003616 apexRule2 := module2.Rule("apexRule")
3617 copyCmds2 := apexRule2.Args["copy_commands"]
3618
Colin Cross7113d202019-11-20 16:39:12 -08003619 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
3620 ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
Jooyung Han5c998b92019-06-27 11:30:33 +09003621 ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
3622 ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
3623 ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
3624}
3625
3626func TestApexUsesFailsIfNotProvided(t *testing.T) {
3627 testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
3628 apex {
3629 name: "myapex",
3630 key: "myapex.key",
3631 uses: ["commonapex"],
3632 }
3633
3634 apex {
3635 name: "commonapex",
3636 key: "myapex.key",
3637 }
3638
3639 apex_key {
3640 name: "myapex.key",
3641 public_key: "testkey.avbpubkey",
3642 private_key: "testkey.pem",
3643 }
3644 `)
3645 testApexError(t, `uses: "commonapex" is not a provider`, `
3646 apex {
3647 name: "myapex",
3648 key: "myapex.key",
3649 uses: ["commonapex"],
3650 }
3651
3652 cc_library {
3653 name: "commonapex",
3654 system_shared_libs: [],
3655 stl: "none",
3656 }
3657
3658 apex_key {
3659 name: "myapex.key",
3660 public_key: "testkey.avbpubkey",
3661 private_key: "testkey.pem",
3662 }
3663 `)
3664}
3665
3666func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
3667 testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
3668 apex {
3669 name: "myapex",
3670 key: "myapex.key",
3671 use_vendor: true,
3672 uses: ["commonapex"],
3673 }
3674
3675 apex {
3676 name: "commonapex",
3677 key: "myapex.key",
3678 provide_cpp_shared_libs: true,
3679 }
3680
3681 apex_key {
3682 name: "myapex.key",
3683 public_key: "testkey.avbpubkey",
3684 private_key: "testkey.pem",
3685 }
Jooyung Handc782442019-11-01 03:14:38 +09003686 `, func(fs map[string][]byte, config android.Config) {
3687 setUseVendorWhitelistForTest(config, []string{"myapex"})
3688 })
Jooyung Han5c998b92019-06-27 11:30:33 +09003689}
3690
Jooyung Hand48f3c32019-08-23 11:18:57 +09003691func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
3692 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
3693 apex {
3694 name: "myapex",
3695 key: "myapex.key",
3696 native_shared_libs: ["libfoo"],
3697 }
3698
3699 apex_key {
3700 name: "myapex.key",
3701 public_key: "testkey.avbpubkey",
3702 private_key: "testkey.pem",
3703 }
3704
3705 cc_library {
3706 name: "libfoo",
3707 stl: "none",
3708 system_shared_libs: [],
3709 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003710 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003711 }
3712 `)
3713 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
3714 apex {
3715 name: "myapex",
3716 key: "myapex.key",
3717 java_libs: ["myjar"],
3718 }
3719
3720 apex_key {
3721 name: "myapex.key",
3722 public_key: "testkey.avbpubkey",
3723 private_key: "testkey.pem",
3724 }
3725
3726 java_library {
3727 name: "myjar",
3728 srcs: ["foo/bar/MyClass.java"],
3729 sdk_version: "none",
3730 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09003731 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09003732 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09003733 }
3734 `)
3735}
3736
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003737func TestApexWithApps(t *testing.T) {
3738 ctx, _ := testApex(t, `
3739 apex {
3740 name: "myapex",
3741 key: "myapex.key",
3742 apps: [
3743 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09003744 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003745 ],
3746 }
3747
3748 apex_key {
3749 name: "myapex.key",
3750 public_key: "testkey.avbpubkey",
3751 private_key: "testkey.pem",
3752 }
3753
3754 android_app {
3755 name: "AppFoo",
3756 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003757 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003758 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09003759 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08003760 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003761 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003762 }
Jiyong Parkf7487312019-10-17 12:54:30 +09003763
3764 android_app {
3765 name: "AppFooPriv",
3766 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08003767 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09003768 system_modules: "none",
3769 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08003770 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003771 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09003772 }
Jiyong Park8be103b2019-11-08 15:53:48 +09003773
3774 cc_library_shared {
3775 name: "libjni",
3776 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003777 shared_libs: ["libfoo"],
3778 stl: "none",
3779 system_shared_libs: [],
3780 apex_available: [ "myapex" ],
3781 sdk_version: "current",
3782 }
3783
3784 cc_library_shared {
3785 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09003786 stl: "none",
3787 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09003788 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08003789 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09003790 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003791 `)
3792
Sundong Ahnabb64432019-10-22 13:58:29 +09003793 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003794 apexRule := module.Rule("apexRule")
3795 copyCmds := apexRule.Args["copy_commands"]
3796
3797 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09003798 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003799
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003800 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Description("zip jni libs")
3801 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09003802 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003803 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09003804 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003805 // JNI libraries including transitive deps are
3806 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossc511bc52020-04-07 16:50:32 +00003807 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_myapex").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09003808 // ... embedded inside APK (jnilibs.zip)
3809 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
3810 // ... and not directly inside the APEX
3811 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
3812 }
Dario Frenicde2a032019-10-27 00:29:22 +01003813}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003814
Dario Frenicde2a032019-10-27 00:29:22 +01003815func TestApexWithAppImports(t *testing.T) {
3816 ctx, _ := testApex(t, `
3817 apex {
3818 name: "myapex",
3819 key: "myapex.key",
3820 apps: [
3821 "AppFooPrebuilt",
3822 "AppFooPrivPrebuilt",
3823 ],
3824 }
3825
3826 apex_key {
3827 name: "myapex.key",
3828 public_key: "testkey.avbpubkey",
3829 private_key: "testkey.pem",
3830 }
3831
3832 android_app_import {
3833 name: "AppFooPrebuilt",
3834 apk: "PrebuiltAppFoo.apk",
3835 presigned: true,
3836 dex_preopt: {
3837 enabled: false,
3838 },
Jiyong Park592a6a42020-04-21 22:34:28 +09003839 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003840 }
3841
3842 android_app_import {
3843 name: "AppFooPrivPrebuilt",
3844 apk: "PrebuiltAppFooPriv.apk",
3845 privileged: true,
3846 presigned: true,
3847 dex_preopt: {
3848 enabled: false,
3849 },
Jooyung Han39ee1192020-03-23 20:21:11 +09003850 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09003851 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01003852 }
3853 `)
3854
Sundong Ahnabb64432019-10-22 13:58:29 +09003855 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01003856 apexRule := module.Rule("apexRule")
3857 copyCmds := apexRule.Args["copy_commands"]
3858
3859 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09003860 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
3861}
3862
3863func TestApexWithAppImportsPrefer(t *testing.T) {
3864 ctx, _ := testApex(t, `
3865 apex {
3866 name: "myapex",
3867 key: "myapex.key",
3868 apps: [
3869 "AppFoo",
3870 ],
3871 }
3872
3873 apex_key {
3874 name: "myapex.key",
3875 public_key: "testkey.avbpubkey",
3876 private_key: "testkey.pem",
3877 }
3878
3879 android_app {
3880 name: "AppFoo",
3881 srcs: ["foo/bar/MyClass.java"],
3882 sdk_version: "none",
3883 system_modules: "none",
3884 apex_available: [ "myapex" ],
3885 }
3886
3887 android_app_import {
3888 name: "AppFoo",
3889 apk: "AppFooPrebuilt.apk",
3890 filename: "AppFooPrebuilt.apk",
3891 presigned: true,
3892 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09003893 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09003894 }
3895 `, withFiles(map[string][]byte{
3896 "AppFooPrebuilt.apk": nil,
3897 }))
3898
3899 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3900 "app/AppFoo/AppFooPrebuilt.apk",
3901 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09003902}
3903
Dario Freni6f3937c2019-12-20 22:58:03 +00003904func TestApexWithTestHelperApp(t *testing.T) {
3905 ctx, _ := testApex(t, `
3906 apex {
3907 name: "myapex",
3908 key: "myapex.key",
3909 apps: [
3910 "TesterHelpAppFoo",
3911 ],
3912 }
3913
3914 apex_key {
3915 name: "myapex.key",
3916 public_key: "testkey.avbpubkey",
3917 private_key: "testkey.pem",
3918 }
3919
3920 android_test_helper_app {
3921 name: "TesterHelpAppFoo",
3922 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003923 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00003924 }
3925
3926 `)
3927
3928 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3929 apexRule := module.Rule("apexRule")
3930 copyCmds := apexRule.Args["copy_commands"]
3931
3932 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
3933}
3934
Jooyung Han18020ea2019-11-13 10:50:48 +09003935func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
3936 // libfoo's apex_available comes from cc_defaults
Jooyung Han5e9013b2020-03-10 06:23:13 +09003937 testApexError(t, `requires "libfoo" that is not available for the APEX`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09003938 apex {
3939 name: "myapex",
3940 key: "myapex.key",
3941 native_shared_libs: ["libfoo"],
3942 }
3943
3944 apex_key {
3945 name: "myapex.key",
3946 public_key: "testkey.avbpubkey",
3947 private_key: "testkey.pem",
3948 }
3949
3950 apex {
3951 name: "otherapex",
3952 key: "myapex.key",
3953 native_shared_libs: ["libfoo"],
3954 }
3955
3956 cc_defaults {
3957 name: "libfoo-defaults",
3958 apex_available: ["otherapex"],
3959 }
3960
3961 cc_library {
3962 name: "libfoo",
3963 defaults: ["libfoo-defaults"],
3964 stl: "none",
3965 system_shared_libs: [],
3966 }`)
3967}
3968
Paul Duffine52e66f2020-03-30 17:54:29 +01003969func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09003970 // libfoo is not available to myapex, but only to otherapex
3971 testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
3972 apex {
3973 name: "myapex",
3974 key: "myapex.key",
3975 native_shared_libs: ["libfoo"],
3976 }
3977
3978 apex_key {
3979 name: "myapex.key",
3980 public_key: "testkey.avbpubkey",
3981 private_key: "testkey.pem",
3982 }
3983
3984 apex {
3985 name: "otherapex",
3986 key: "otherapex.key",
3987 native_shared_libs: ["libfoo"],
3988 }
3989
3990 apex_key {
3991 name: "otherapex.key",
3992 public_key: "testkey.avbpubkey",
3993 private_key: "testkey.pem",
3994 }
3995
3996 cc_library {
3997 name: "libfoo",
3998 stl: "none",
3999 system_shared_libs: [],
4000 apex_available: ["otherapex"],
4001 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004002}
Jiyong Park127b40b2019-09-30 16:04:35 +09004003
Paul Duffine52e66f2020-03-30 17:54:29 +01004004func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004005 // libbbaz is an indirect dep
Paul Duffindf915ff2020-03-30 17:58:21 +01004006 testApexError(t, `requires "libbaz" that is not available for the APEX. Dependency path:
Paul Duffinc5192442020-03-31 11:31:36 +01004007.*via tag apex\.dependencyTag.*"sharedLib".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004008.*-> libfoo.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004009.*via tag cc\.DependencyTag.*"shared".*
Paul Duffindf915ff2020-03-30 17:58:21 +01004010.*-> libbar.*link:shared.*
Paul Duffin65347702020-03-31 15:23:40 +01004011.*via tag cc\.DependencyTag.*"shared".*
4012.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004013 apex {
4014 name: "myapex",
4015 key: "myapex.key",
4016 native_shared_libs: ["libfoo"],
4017 }
4018
4019 apex_key {
4020 name: "myapex.key",
4021 public_key: "testkey.avbpubkey",
4022 private_key: "testkey.pem",
4023 }
4024
Jiyong Park127b40b2019-09-30 16:04:35 +09004025 cc_library {
4026 name: "libfoo",
4027 stl: "none",
4028 shared_libs: ["libbar"],
4029 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004030 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004031 }
4032
4033 cc_library {
4034 name: "libbar",
4035 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004036 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004037 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004038 apex_available: ["myapex"],
4039 }
4040
4041 cc_library {
4042 name: "libbaz",
4043 stl: "none",
4044 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004045 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004046}
Jiyong Park127b40b2019-09-30 16:04:35 +09004047
Paul Duffine52e66f2020-03-30 17:54:29 +01004048func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004049 testApexError(t, "\"otherapex\" is not a valid module name", `
4050 apex {
4051 name: "myapex",
4052 key: "myapex.key",
4053 native_shared_libs: ["libfoo"],
4054 }
4055
4056 apex_key {
4057 name: "myapex.key",
4058 public_key: "testkey.avbpubkey",
4059 private_key: "testkey.pem",
4060 }
4061
4062 cc_library {
4063 name: "libfoo",
4064 stl: "none",
4065 system_shared_libs: [],
4066 apex_available: ["otherapex"],
4067 }`)
4068
Paul Duffine52e66f2020-03-30 17:54:29 +01004069 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004070 apex {
4071 name: "myapex",
4072 key: "myapex.key",
4073 native_shared_libs: ["libfoo", "libbar"],
4074 }
4075
4076 apex_key {
4077 name: "myapex.key",
4078 public_key: "testkey.avbpubkey",
4079 private_key: "testkey.pem",
4080 }
4081
4082 cc_library {
4083 name: "libfoo",
4084 stl: "none",
4085 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004086 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004087 apex_available: ["myapex"],
4088 }
4089
4090 cc_library {
4091 name: "libbar",
4092 stl: "none",
4093 system_shared_libs: [],
4094 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004095 }
4096
4097 cc_library {
4098 name: "libbaz",
4099 stl: "none",
4100 system_shared_libs: [],
4101 stubs: {
4102 versions: ["10", "20", "30"],
4103 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004104 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004105}
Jiyong Park127b40b2019-09-30 16:04:35 +09004106
Jiyong Park89e850a2020-04-07 16:37:39 +09004107func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004108 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004109 apex {
4110 name: "myapex",
4111 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004112 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004113 }
4114
4115 apex_key {
4116 name: "myapex.key",
4117 public_key: "testkey.avbpubkey",
4118 private_key: "testkey.pem",
4119 }
4120
4121 cc_library {
4122 name: "libfoo",
4123 stl: "none",
4124 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004125 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004126 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004127 }
4128
4129 cc_library {
4130 name: "libfoo2",
4131 stl: "none",
4132 system_shared_libs: [],
4133 shared_libs: ["libbaz"],
4134 apex_available: ["//apex_available:platform"],
4135 }
4136
4137 cc_library {
4138 name: "libbar",
4139 stl: "none",
4140 system_shared_libs: [],
4141 apex_available: ["myapex"],
4142 }
4143
4144 cc_library {
4145 name: "libbaz",
4146 stl: "none",
4147 system_shared_libs: [],
4148 apex_available: ["myapex"],
4149 stubs: {
4150 versions: ["1"],
4151 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004152 }`)
4153
Jiyong Park89e850a2020-04-07 16:37:39 +09004154 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4155 // because it depends on libbar which isn't available to platform
4156 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4157 if libfoo.NotAvailableForPlatform() != true {
4158 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4159 }
4160
4161 // libfoo2 however can be available to platform because it depends on libbaz which provides
4162 // stubs
4163 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4164 if libfoo2.NotAvailableForPlatform() == true {
4165 t.Errorf("%q should be available to platform", libfoo2.String())
4166 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004167}
Jiyong Parka90ca002019-10-07 15:47:24 +09004168
Paul Duffine52e66f2020-03-30 17:54:29 +01004169func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004170 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004171 apex {
4172 name: "myapex",
4173 key: "myapex.key",
4174 native_shared_libs: ["libfoo"],
4175 }
4176
4177 apex_key {
4178 name: "myapex.key",
4179 public_key: "testkey.avbpubkey",
4180 private_key: "testkey.pem",
4181 }
4182
4183 cc_library {
4184 name: "libfoo",
4185 stl: "none",
4186 system_shared_libs: [],
4187 apex_available: ["myapex"],
4188 static: {
4189 apex_available: ["//apex_available:platform"],
4190 },
4191 }`)
4192
Jiyong Park89e850a2020-04-07 16:37:39 +09004193 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4194 if libfooShared.NotAvailableForPlatform() != true {
4195 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4196 }
4197 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4198 if libfooStatic.NotAvailableForPlatform() != false {
4199 t.Errorf("%q should be available to platform", libfooStatic.String())
4200 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004201}
4202
Jiyong Park5d790c32019-11-15 18:40:32 +09004203func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004204 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004205 apex {
4206 name: "myapex",
4207 key: "myapex.key",
4208 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004209 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004210 }
4211
4212 override_apex {
4213 name: "override_myapex",
4214 base: "myapex",
4215 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004216 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004217 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004218 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004219 }
4220
4221 apex_key {
4222 name: "myapex.key",
4223 public_key: "testkey.avbpubkey",
4224 private_key: "testkey.pem",
4225 }
4226
4227 android_app {
4228 name: "app",
4229 srcs: ["foo/bar/MyClass.java"],
4230 package_name: "foo",
4231 sdk_version: "none",
4232 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004233 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004234 }
4235
4236 override_android_app {
4237 name: "override_app",
4238 base: "app",
4239 package_name: "bar",
4240 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004241 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004242
Jiyong Park317645e2019-12-05 13:20:58 +09004243 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4244 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4245 if originalVariant.GetOverriddenBy() != "" {
4246 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4247 }
4248 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4249 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4250 }
4251
Jiyong Park5d790c32019-11-15 18:40:32 +09004252 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4253 apexRule := module.Rule("apexRule")
4254 copyCmds := apexRule.Args["copy_commands"]
4255
4256 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004257 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004258
4259 apexBundle := module.Module().(*apexBundle)
4260 name := apexBundle.Name()
4261 if name != "override_myapex" {
4262 t.Errorf("name should be \"override_myapex\", but was %q", name)
4263 }
4264
Baligh Uddin004d7172020-02-19 21:29:28 -08004265 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4266 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4267 }
4268
Jiyong Park20bacab2020-03-03 11:45:41 +09004269 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004270 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004271
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004272 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4273 var builder strings.Builder
4274 data.Custom(&builder, name, "TARGET_", "", data)
4275 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004276 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004277 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4278 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004279 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004280 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004281 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004282 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4283 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004284}
4285
Jooyung Han214bf372019-11-12 13:03:50 +09004286func TestLegacyAndroid10Support(t *testing.T) {
4287 ctx, _ := testApex(t, `
4288 apex {
4289 name: "myapex",
4290 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004291 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004292 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004293 }
4294
4295 apex_key {
4296 name: "myapex.key",
4297 public_key: "testkey.avbpubkey",
4298 private_key: "testkey.pem",
4299 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004300
4301 cc_library {
4302 name: "mylib",
4303 srcs: ["mylib.cpp"],
4304 stl: "libc++",
4305 system_shared_libs: [],
4306 apex_available: [ "myapex" ],
4307 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004308 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004309
4310 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4311 args := module.Rule("apexRule").Args
4312 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004313 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004314
4315 // The copies of the libraries in the apex should have one more dependency than
4316 // the ones outside the apex, namely the unwinder. Ideally we should check
4317 // the dependency names directly here but for some reason the names are blank in
4318 // this test.
4319 for _, lib := range []string{"libc++", "mylib"} {
4320 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_myapex").Rule("ld").Implicits
4321 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4322 if len(apexImplicits) != len(nonApexImplicits)+1 {
4323 t.Errorf("%q missing unwinder dep", lib)
4324 }
4325 }
Jooyung Han214bf372019-11-12 13:03:50 +09004326}
4327
Paul Duffin9b879592020-05-26 13:21:35 +01004328var filesForSdkLibrary = map[string][]byte{
4329 "api/current.txt": nil,
4330 "api/removed.txt": nil,
4331 "api/system-current.txt": nil,
4332 "api/system-removed.txt": nil,
4333 "api/test-current.txt": nil,
4334 "api/test-removed.txt": nil,
4335}
4336
Jooyung Han58f26ab2019-12-18 15:34:32 +09004337func TestJavaSDKLibrary(t *testing.T) {
4338 ctx, _ := testApex(t, `
4339 apex {
4340 name: "myapex",
4341 key: "myapex.key",
4342 java_libs: ["foo"],
4343 }
4344
4345 apex_key {
4346 name: "myapex.key",
4347 public_key: "testkey.avbpubkey",
4348 private_key: "testkey.pem",
4349 }
4350
4351 java_sdk_library {
4352 name: "foo",
4353 srcs: ["a.java"],
4354 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004355 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004356 }
Paul Duffin9b879592020-05-26 13:21:35 +01004357 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004358
4359 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004360 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004361 "javalib/foo.jar",
4362 "etc/permissions/foo.xml",
4363 })
4364 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004365 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4366 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004367}
4368
Paul Duffin9b879592020-05-26 13:21:35 +01004369func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4370 ctx, _ := testApex(t, `
4371 apex {
4372 name: "myapex",
4373 key: "myapex.key",
4374 java_libs: ["foo", "bar"],
4375 }
4376
4377 apex_key {
4378 name: "myapex.key",
4379 public_key: "testkey.avbpubkey",
4380 private_key: "testkey.pem",
4381 }
4382
4383 java_sdk_library {
4384 name: "foo",
4385 srcs: ["a.java"],
4386 api_packages: ["foo"],
4387 apex_available: ["myapex"],
4388 sdk_version: "none",
4389 system_modules: "none",
4390 }
4391
4392 java_library {
4393 name: "bar",
4394 srcs: ["a.java"],
4395 libs: ["foo"],
4396 apex_available: ["myapex"],
4397 sdk_version: "none",
4398 system_modules: "none",
4399 }
4400 `, withFiles(filesForSdkLibrary))
4401
4402 // java_sdk_library installs both impl jar and permission XML
4403 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4404 "javalib/bar.jar",
4405 "javalib/foo.jar",
4406 "etc/permissions/foo.xml",
4407 })
4408
4409 // The bar library should depend on the implementation jar.
4410 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4411 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4412 t.Errorf("expected %q, found %#q", expected, actual)
4413 }
4414}
4415
4416func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4417 ctx, _ := testApex(t, `
4418 apex {
4419 name: "myapex",
4420 key: "myapex.key",
4421 java_libs: ["foo"],
4422 }
4423
4424 apex_key {
4425 name: "myapex.key",
4426 public_key: "testkey.avbpubkey",
4427 private_key: "testkey.pem",
4428 }
4429
4430 java_sdk_library {
4431 name: "foo",
4432 srcs: ["a.java"],
4433 api_packages: ["foo"],
4434 apex_available: ["myapex"],
4435 sdk_version: "none",
4436 system_modules: "none",
4437 }
4438
4439 java_library {
4440 name: "bar",
4441 srcs: ["a.java"],
4442 libs: ["foo"],
4443 sdk_version: "none",
4444 system_modules: "none",
4445 }
4446 `, withFiles(filesForSdkLibrary))
4447
4448 // java_sdk_library installs both impl jar and permission XML
4449 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4450 "javalib/foo.jar",
4451 "etc/permissions/foo.xml",
4452 })
4453
4454 // The bar library should depend on the stubs jar.
4455 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
4456 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4457 t.Errorf("expected %q, found %#q", expected, actual)
4458 }
4459}
4460
atrost6e126252020-01-27 17:01:16 +00004461func TestCompatConfig(t *testing.T) {
4462 ctx, _ := testApex(t, `
4463 apex {
4464 name: "myapex",
4465 key: "myapex.key",
4466 prebuilts: ["myjar-platform-compat-config"],
4467 java_libs: ["myjar"],
4468 }
4469
4470 apex_key {
4471 name: "myapex.key",
4472 public_key: "testkey.avbpubkey",
4473 private_key: "testkey.pem",
4474 }
4475
4476 platform_compat_config {
4477 name: "myjar-platform-compat-config",
4478 src: ":myjar",
4479 }
4480
4481 java_library {
4482 name: "myjar",
4483 srcs: ["foo/bar/MyClass.java"],
4484 sdk_version: "none",
4485 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00004486 apex_available: [ "myapex" ],
4487 }
4488 `)
4489 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4490 "etc/compatconfig/myjar-platform-compat-config.xml",
4491 "javalib/myjar.jar",
4492 })
4493}
4494
Jiyong Park479321d2019-12-16 11:47:12 +09004495func TestRejectNonInstallableJavaLibrary(t *testing.T) {
4496 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
4497 apex {
4498 name: "myapex",
4499 key: "myapex.key",
4500 java_libs: ["myjar"],
4501 }
4502
4503 apex_key {
4504 name: "myapex.key",
4505 public_key: "testkey.avbpubkey",
4506 private_key: "testkey.pem",
4507 }
4508
4509 java_library {
4510 name: "myjar",
4511 srcs: ["foo/bar/MyClass.java"],
4512 sdk_version: "none",
4513 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09004514 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004515 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09004516 }
4517 `)
4518}
4519
Jiyong Park7afd1072019-12-30 16:56:33 +09004520func TestCarryRequiredModuleNames(t *testing.T) {
4521 ctx, config := testApex(t, `
4522 apex {
4523 name: "myapex",
4524 key: "myapex.key",
4525 native_shared_libs: ["mylib"],
4526 }
4527
4528 apex_key {
4529 name: "myapex.key",
4530 public_key: "testkey.avbpubkey",
4531 private_key: "testkey.pem",
4532 }
4533
4534 cc_library {
4535 name: "mylib",
4536 srcs: ["mylib.cpp"],
4537 system_shared_libs: [],
4538 stl: "none",
4539 required: ["a", "b"],
4540 host_required: ["c", "d"],
4541 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004542 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09004543 }
4544 `)
4545
4546 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4547 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4548 name := apexBundle.BaseModuleName()
4549 prefix := "TARGET_"
4550 var builder strings.Builder
4551 data.Custom(&builder, name, prefix, "", data)
4552 androidMk := builder.String()
4553 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
4554 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
4555 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
4556}
4557
Jiyong Park7cd10e32020-01-14 09:22:18 +09004558func TestSymlinksFromApexToSystem(t *testing.T) {
4559 bp := `
4560 apex {
4561 name: "myapex",
4562 key: "myapex.key",
4563 native_shared_libs: ["mylib"],
4564 java_libs: ["myjar"],
4565 }
4566
Jiyong Park9d677202020-02-19 16:29:35 +09004567 apex {
4568 name: "myapex.updatable",
4569 key: "myapex.key",
4570 native_shared_libs: ["mylib"],
4571 java_libs: ["myjar"],
4572 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09004573 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09004574 }
4575
Jiyong Park7cd10e32020-01-14 09:22:18 +09004576 apex_key {
4577 name: "myapex.key",
4578 public_key: "testkey.avbpubkey",
4579 private_key: "testkey.pem",
4580 }
4581
4582 cc_library {
4583 name: "mylib",
4584 srcs: ["mylib.cpp"],
4585 shared_libs: ["myotherlib"],
4586 system_shared_libs: [],
4587 stl: "none",
4588 apex_available: [
4589 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004590 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004591 "//apex_available:platform",
4592 ],
4593 }
4594
4595 cc_library {
4596 name: "myotherlib",
4597 srcs: ["mylib.cpp"],
4598 system_shared_libs: [],
4599 stl: "none",
4600 apex_available: [
4601 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004602 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004603 "//apex_available:platform",
4604 ],
4605 }
4606
4607 java_library {
4608 name: "myjar",
4609 srcs: ["foo/bar/MyClass.java"],
4610 sdk_version: "none",
4611 system_modules: "none",
4612 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09004613 apex_available: [
4614 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004615 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004616 "//apex_available:platform",
4617 ],
4618 }
4619
4620 java_library {
4621 name: "myotherjar",
4622 srcs: ["foo/bar/MyClass.java"],
4623 sdk_version: "none",
4624 system_modules: "none",
4625 apex_available: [
4626 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09004627 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09004628 "//apex_available:platform",
4629 ],
4630 }
4631 `
4632
4633 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
4634 for _, f := range files {
4635 if f.path == file {
4636 if f.isLink {
4637 t.Errorf("%q is not a real file", file)
4638 }
4639 return
4640 }
4641 }
4642 t.Errorf("%q is not found", file)
4643 }
4644
4645 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
4646 for _, f := range files {
4647 if f.path == file {
4648 if !f.isLink {
4649 t.Errorf("%q is not a symlink", file)
4650 }
4651 return
4652 }
4653 }
4654 t.Errorf("%q is not found", file)
4655 }
4656
Jiyong Park9d677202020-02-19 16:29:35 +09004657 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
4658 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09004659 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004660 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004661 ensureRealfileExists(t, files, "javalib/myjar.jar")
4662 ensureRealfileExists(t, files, "lib64/mylib.so")
4663 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4664
Jiyong Park9d677202020-02-19 16:29:35 +09004665 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4666 ensureRealfileExists(t, files, "javalib/myjar.jar")
4667 ensureRealfileExists(t, files, "lib64/mylib.so")
4668 ensureRealfileExists(t, files, "lib64/myotherlib.so")
4669
4670 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09004671 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00004672 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09004673 ensureRealfileExists(t, files, "javalib/myjar.jar")
4674 ensureRealfileExists(t, files, "lib64/mylib.so")
4675 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09004676
4677 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
4678 ensureRealfileExists(t, files, "javalib/myjar.jar")
4679 ensureRealfileExists(t, files, "lib64/mylib.so")
4680 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09004681}
4682
Jooyung Han643adc42020-02-27 13:50:06 +09004683func TestApexWithJniLibs(t *testing.T) {
4684 ctx, _ := testApex(t, `
4685 apex {
4686 name: "myapex",
4687 key: "myapex.key",
4688 jni_libs: ["mylib"],
4689 }
4690
4691 apex_key {
4692 name: "myapex.key",
4693 public_key: "testkey.avbpubkey",
4694 private_key: "testkey.pem",
4695 }
4696
4697 cc_library {
4698 name: "mylib",
4699 srcs: ["mylib.cpp"],
4700 shared_libs: ["mylib2"],
4701 system_shared_libs: [],
4702 stl: "none",
4703 apex_available: [ "myapex" ],
4704 }
4705
4706 cc_library {
4707 name: "mylib2",
4708 srcs: ["mylib.cpp"],
4709 system_shared_libs: [],
4710 stl: "none",
4711 apex_available: [ "myapex" ],
4712 }
4713 `)
4714
4715 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4716 // Notice mylib2.so (transitive dep) is not added as a jni_lib
4717 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
4718 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4719 "lib64/mylib.so",
4720 "lib64/mylib2.so",
4721 })
4722}
4723
Jooyung Han49f67012020-04-17 13:43:10 +09004724func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
4725 ctx, _ := testApex(t, `
4726 apex {
4727 name: "myapex",
4728 key: "myapex.key",
4729 }
4730 apex_key {
4731 name: "myapex.key",
4732 public_key: "testkey.avbpubkey",
4733 private_key: "testkey.pem",
4734 }
4735 `, func(fs map[string][]byte, config android.Config) {
4736 delete(config.Targets, android.Android)
4737 config.AndroidCommonTarget = android.Target{}
4738 })
4739
4740 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
4741 t.Errorf("Expected variants: %v, but got: %v", expected, got)
4742 }
4743}
4744
Jooyung Han643adc42020-02-27 13:50:06 +09004745func TestApexWithJniLibs_Errors(t *testing.T) {
4746 testApexError(t, `jni_libs: "xxx" is not a cc_library`, `
4747 apex {
4748 name: "myapex",
4749 key: "myapex.key",
4750 jni_libs: ["xxx"],
4751 }
4752
4753 apex_key {
4754 name: "myapex.key",
4755 public_key: "testkey.avbpubkey",
4756 private_key: "testkey.pem",
4757 }
4758
4759 prebuilt_etc {
4760 name: "xxx",
4761 src: "xxx",
4762 }
4763 `, withFiles(map[string][]byte{
4764 "xxx": nil,
4765 }))
4766}
4767
Jiyong Parkbd159612020-02-28 15:22:21 +09004768func TestAppBundle(t *testing.T) {
4769 ctx, _ := testApex(t, `
4770 apex {
4771 name: "myapex",
4772 key: "myapex.key",
4773 apps: ["AppFoo"],
4774 }
4775
4776 apex_key {
4777 name: "myapex.key",
4778 public_key: "testkey.avbpubkey",
4779 private_key: "testkey.pem",
4780 }
4781
4782 android_app {
4783 name: "AppFoo",
4784 srcs: ["foo/bar/MyClass.java"],
4785 sdk_version: "none",
4786 system_modules: "none",
4787 apex_available: [ "myapex" ],
4788 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004789 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09004790
4791 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("Bundle Config")
4792 content := bundleConfigRule.Args["content"]
4793
4794 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09004795 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 +09004796}
4797
Sasha Smundak18d98bc2020-05-27 16:36:07 -07004798func TestAppSetBundle(t *testing.T) {
4799 ctx, _ := testApex(t, `
4800 apex {
4801 name: "myapex",
4802 key: "myapex.key",
4803 apps: ["AppSet"],
4804 }
4805
4806 apex_key {
4807 name: "myapex.key",
4808 public_key: "testkey.avbpubkey",
4809 private_key: "testkey.pem",
4810 }
4811
4812 android_app_set {
4813 name: "AppSet",
4814 set: "AppSet.apks",
4815 }`)
4816 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4817 bundleConfigRule := mod.Description("Bundle Config")
4818 content := bundleConfigRule.Args["content"]
4819 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
4820 s := mod.Rule("apexRule").Args["copy_commands"]
4821 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
4822 if len(copyCmds) != 3 {
4823 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
4824 }
4825 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
4826 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
4827 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
4828}
4829
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004830func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004831 t.Helper()
4832
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004833 bp := `
4834 java_library {
4835 name: "some-updatable-apex-lib",
4836 srcs: ["a.java"],
4837 sdk_version: "current",
4838 apex_available: [
4839 "some-updatable-apex",
4840 ],
4841 }
4842
4843 java_library {
4844 name: "some-non-updatable-apex-lib",
4845 srcs: ["a.java"],
4846 apex_available: [
4847 "some-non-updatable-apex",
4848 ],
4849 }
4850
4851 java_library {
4852 name: "some-platform-lib",
4853 srcs: ["a.java"],
4854 sdk_version: "current",
4855 installable: true,
4856 }
4857
4858 java_library {
4859 name: "some-art-lib",
4860 srcs: ["a.java"],
4861 sdk_version: "current",
4862 apex_available: [
4863 "com.android.art.something",
4864 ],
4865 hostdex: true,
4866 }
4867
4868 apex {
4869 name: "some-updatable-apex",
4870 key: "some-updatable-apex.key",
4871 java_libs: ["some-updatable-apex-lib"],
4872 updatable: true,
4873 min_sdk_version: "current",
4874 }
4875
4876 apex {
4877 name: "some-non-updatable-apex",
4878 key: "some-non-updatable-apex.key",
4879 java_libs: ["some-non-updatable-apex-lib"],
4880 }
4881
4882 apex_key {
4883 name: "some-updatable-apex.key",
4884 }
4885
4886 apex_key {
4887 name: "some-non-updatable-apex.key",
4888 }
4889
4890 apex {
4891 name: "com.android.art.something",
4892 key: "com.android.art.something.key",
4893 java_libs: ["some-art-lib"],
4894 updatable: true,
4895 min_sdk_version: "current",
4896 }
4897
4898 apex_key {
4899 name: "com.android.art.something.key",
4900 }
4901
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004902 filegroup {
4903 name: "some-updatable-apex-file_contexts",
4904 srcs: [
4905 "system/sepolicy/apex/some-updatable-apex-file_contexts",
4906 ],
4907 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004908
4909 filegroup {
4910 name: "some-non-updatable-apex-file_contexts",
4911 srcs: [
4912 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
4913 ],
4914 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004915 `
4916 bp += cc.GatherRequiredDepsForTest(android.Android)
4917 bp += java.GatherRequiredDepsForTest()
4918 bp += dexpreopt.BpToolModulesForTest()
4919
4920 fs := map[string][]byte{
4921 "a.java": nil,
4922 "a.jar": nil,
4923 "build/make/target/product/security": nil,
4924 "apex_manifest.json": nil,
4925 "AndroidManifest.xml": nil,
4926 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01004927 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004928 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
4929 "framework/aidl/a.aidl": nil,
4930 }
4931 cc.GatherRequiredFilesForTest(fs)
4932
4933 ctx := android.NewTestArchContext()
4934 ctx.RegisterModuleType("apex", BundleFactory)
4935 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
4936 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01004937 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004938 cc.RegisterRequiredBuildComponentsForTest(ctx)
4939 java.RegisterJavaBuildComponents(ctx)
4940 java.RegisterSystemModulesBuildComponents(ctx)
4941 java.RegisterAppBuildComponents(ctx)
4942 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004943 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
4944 ctx.PreDepsMutators(RegisterPreDepsMutators)
4945 ctx.PostDepsMutators(RegisterPostDepsMutators)
4946
4947 config := android.TestArchConfig(buildDir, nil, bp, fs)
4948 ctx.Register(config)
4949
4950 _ = dexpreopt.GlobalSoongConfigForTests(config)
4951 dexpreopt.RegisterToolModulesForTest(ctx)
4952 pathCtx := android.PathContextForTesting(config)
4953 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
4954 transformDexpreoptConfig(dexpreoptConfig)
4955 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
4956
4957 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
4958 android.FailIfErrored(t, errs)
4959
4960 _, errs = ctx.PrepareBuildActions(config)
4961 if errmsg == "" {
4962 android.FailIfErrored(t, errs)
4963 } else if len(errs) > 0 {
4964 android.FailIfNoMatchingErrors(t, errmsg, errs)
4965 return
4966 } else {
4967 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
4968 }
4969}
4970
Jooyung Han548640b2020-04-27 12:10:30 +09004971func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
4972 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
4973 apex {
4974 name: "myapex",
4975 key: "myapex.key",
4976 updatable: true,
4977 }
4978
4979 apex_key {
4980 name: "myapex.key",
4981 public_key: "testkey.avbpubkey",
4982 private_key: "testkey.pem",
4983 }
4984 `)
4985}
4986
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004987func TestNoUpdatableJarsInBootImage(t *testing.T) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004988
Sasha Smundak18d98bc2020-05-27 16:36:07 -07004989 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004990 var transform func(*dexpreopt.GlobalConfig)
4991
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004992 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
4993 transform = func(config *dexpreopt.GlobalConfig) {
4994 config.ArtApexJars = []string{"com.android.art.something:some-art-lib"}
4995 }
4996 testNoUpdatableJarsInBootImage(t, "", transform)
4997 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00004998
Ulya Trafimovich7caef202020-05-19 12:00:52 +01004999 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005000 err = "module 'some-art-lib' from updatable apex 'com.android.art.something' is not allowed in the framework boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005001 transform = func(config *dexpreopt.GlobalConfig) {
5002 config.BootJars = []string{"com.android.art.something:some-art-lib"}
5003 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005004 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005005 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005006
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005007 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005008 err = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005009 transform = func(config *dexpreopt.GlobalConfig) {
5010 config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5011 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005012 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005013 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005014
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005015 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005016 err = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005017 transform = func(config *dexpreopt.GlobalConfig) {
5018 config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5019 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005020 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005021 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005022
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005023 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005024 err = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005025 transform = func(config *dexpreopt.GlobalConfig) {
5026 config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"}
5027 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005028 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005029 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005030
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005031 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5032 transform = func(config *dexpreopt.GlobalConfig) {
5033 config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"}
5034 }
5035 testNoUpdatableJarsInBootImage(t, "", transform)
5036 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005037
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005038 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005039 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005040 transform = func(config *dexpreopt.GlobalConfig) {
5041 config.ArtApexJars = []string{"platform:nonexistent"}
5042 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005043 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005044 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005045
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005046 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005047 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005048 transform = func(config *dexpreopt.GlobalConfig) {
5049 config.BootJars = []string{"platform:nonexistent"}
5050 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005051 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005052 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005053
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005054 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005055 err = "module 'some-platform-lib' is not allowed in the ART boot image"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005056 transform = func(config *dexpreopt.GlobalConfig) {
5057 config.ArtApexJars = []string{"platform:some-platform-lib"}
5058 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005059 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005060 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005061
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005062 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5063 transform = func(config *dexpreopt.GlobalConfig) {
5064 config.BootJars = []string{"platform:some-platform-lib"}
5065 }
5066 testNoUpdatableJarsInBootImage(t, "", transform)
5067 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005068}
5069
Jiyong Park62304bb2020-04-13 16:19:48 +09005070func TestTestFor(t *testing.T) {
5071 ctx, _ := testApex(t, `
5072 apex {
5073 name: "myapex",
5074 key: "myapex.key",
5075 native_shared_libs: ["mylib", "myprivlib"],
5076 }
5077
5078 apex_key {
5079 name: "myapex.key",
5080 public_key: "testkey.avbpubkey",
5081 private_key: "testkey.pem",
5082 }
5083
5084 cc_library {
5085 name: "mylib",
5086 srcs: ["mylib.cpp"],
5087 system_shared_libs: [],
5088 stl: "none",
5089 stubs: {
5090 versions: ["1"],
5091 },
5092 apex_available: ["myapex"],
5093 }
5094
5095 cc_library {
5096 name: "myprivlib",
5097 srcs: ["mylib.cpp"],
5098 system_shared_libs: [],
5099 stl: "none",
5100 apex_available: ["myapex"],
5101 }
5102
5103
5104 cc_test {
5105 name: "mytest",
5106 gtest: false,
5107 srcs: ["mylib.cpp"],
5108 system_shared_libs: [],
5109 stl: "none",
5110 shared_libs: ["mylib", "myprivlib"],
5111 test_for: ["myapex"]
5112 }
5113 `)
5114
5115 // the test 'mytest' is a test for the apex, therefore is linked to the
5116 // actual implementation of mylib instead of its stub.
5117 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5118 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5119 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
5120}
5121
Jaewoong Jungfa00c062020-05-14 14:15:24 -07005122// TODO(jungjw): Move this to proptools
5123func intPtr(i int) *int {
5124 return &i
5125}
5126
5127func TestApexSet(t *testing.T) {
5128 ctx, config := testApex(t, `
5129 apex_set {
5130 name: "myapex",
5131 set: "myapex.apks",
5132 filename: "foo_v2.apex",
5133 overrides: ["foo"],
5134 }
5135 `, func(fs map[string][]byte, config android.Config) {
5136 config.TestProductVariables.Platform_sdk_version = intPtr(30)
5137 config.TestProductVariables.DeviceArch = proptools.StringPtr("arm")
5138 config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm64")
5139 })
5140
5141 m := ctx.ModuleForTests("myapex", "android_common")
5142
5143 // Check extract_apks tool parameters.
5144 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5145 actual := extractedApex.Args["abis"]
5146 expected := "ARMEABI_V7A,ARM64_V8A"
5147 if actual != expected {
5148 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5149 }
5150 actual = extractedApex.Args["sdk-version"]
5151 expected = "30"
5152 if actual != expected {
5153 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
5154 }
5155
5156 a := m.Module().(*ApexSet)
5157 expectedOverrides := []string{"foo"}
5158 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
5159 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
5160 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
5161 }
5162}
5163
Jiyong Park7d95a512020-05-10 15:16:24 +09005164func TestNoStaticLinkingToStubsLib(t *testing.T) {
5165 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
5166 apex {
5167 name: "myapex",
5168 key: "myapex.key",
5169 native_shared_libs: ["mylib"],
5170 }
5171
5172 apex_key {
5173 name: "myapex.key",
5174 public_key: "testkey.avbpubkey",
5175 private_key: "testkey.pem",
5176 }
5177
5178 cc_library {
5179 name: "mylib",
5180 srcs: ["mylib.cpp"],
5181 static_libs: ["otherlib"],
5182 system_shared_libs: [],
5183 stl: "none",
5184 apex_available: [ "myapex" ],
5185 }
5186
5187 cc_library {
5188 name: "otherlib",
5189 srcs: ["mylib.cpp"],
5190 system_shared_libs: [],
5191 stl: "none",
5192 stubs: {
5193 versions: ["1", "2", "3"],
5194 },
5195 apex_available: [ "myapex" ],
5196 }
5197 `)
5198}
5199
Jiyong Park8d6c51e2020-06-12 17:26:31 +09005200func TestApexKeysTxt(t *testing.T) {
5201 ctx, _ := testApex(t, `
5202 apex {
5203 name: "myapex",
5204 key: "myapex.key",
5205 }
5206
5207 apex_key {
5208 name: "myapex.key",
5209 public_key: "testkey.avbpubkey",
5210 private_key: "testkey.pem",
5211 }
5212
5213 prebuilt_apex {
5214 name: "myapex",
5215 prefer: true,
5216 arch: {
5217 arm64: {
5218 src: "myapex-arm64.apex",
5219 },
5220 arm: {
5221 src: "myapex-arm.apex",
5222 },
5223 },
5224 }
5225
5226 apex_set {
5227 name: "myapex_set",
5228 set: "myapex.apks",
5229 filename: "myapex_set.apex",
5230 overrides: ["myapex"],
5231 }
5232 `)
5233
5234 apexKeysText := ctx.SingletonForTests("apex_keys_text")
5235 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
5236 ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
5237 ensureNotContains(t, content, "myapex.apex")
5238}
5239
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005240func TestMain(m *testing.M) {
5241 run := func() int {
5242 setUp()
5243 defer tearDown()
5244
5245 return m.Run()
5246 }
5247
5248 os.Exit(run())
5249}