blob: ab8ae161666e4d4c5f00348cc95d035cfa76948b [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"
markchien2f59ec92020-09-02 16:23:38 +080030 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000032 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070033 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090034 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090035 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070036 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090037)
38
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070039var buildDir string
40
Jooyung Hand3639552019-08-09 12:57:43 +090041// names returns name list from white space separated string
42func names(s string) (ns []string) {
43 for _, n := range strings.Split(s, " ") {
44 if len(n) > 0 {
45 ns = append(ns, n)
46 }
47 }
48 return
49}
50
Jooyung Han344d5432019-08-23 11:17:39 +090051func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
52 t.Helper()
53 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090054 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
55 if len(errs) > 0 {
56 android.FailIfNoMatchingErrors(t, pattern, errs)
57 return
58 }
59 _, errs = ctx.PrepareBuildActions(config)
60 if len(errs) > 0 {
61 android.FailIfNoMatchingErrors(t, pattern, errs)
62 return
63 }
64
65 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
66}
67
Jooyung Han344d5432019-08-23 11:17:39 +090068func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
69 t.Helper()
70 ctx, config := testApexContext(t, bp, handlers...)
Paul Duffineedc5d52020-06-12 17:46:39 +010071 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090072 android.FailIfErrored(t, errs)
73 _, errs = ctx.PrepareBuildActions(config)
74 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070075 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090076}
77
Jooyung Han344d5432019-08-23 11:17:39 +090078type testCustomizer func(fs map[string][]byte, config android.Config)
79
80func withFiles(files map[string][]byte) testCustomizer {
81 return func(fs map[string][]byte, config android.Config) {
82 for k, v := range files {
83 fs[k] = v
84 }
85 }
86}
87
88func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
89 return func(fs map[string][]byte, config android.Config) {
90 for k, v := range targets {
91 config.Targets[k] = v
92 }
93 }
94}
95
Jooyung Han35155c42020-02-06 17:33:20 +090096// withNativeBridgeTargets sets configuration with targets including:
97// - X86_64 (primary)
98// - X86 (secondary)
99// - Arm64 on X86_64 (native bridge)
100// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700101func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900102 config.Targets[android.Android] = []android.Target{
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
106 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
109 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
110 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
111 }
112}
113
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900114func withManifestPackageNameOverrides(specs []string) testCustomizer {
115 return func(fs map[string][]byte, config android.Config) {
116 config.TestProductVariables.ManifestPackageNameOverrides = specs
117 }
118}
119
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700120func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900121 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
122}
123
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700124func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900125 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
126}
127
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700128func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900129 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
Jiyong Park99644e92020-11-17 22:21:02 +0900140 bp = bp + rust.GatherRequiredDepsForTest()
141
Dario Frenicde2a032019-10-27 00:29:22 +0100142 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900143
Jooyung Han344d5432019-08-23 11:17:39 +0900144 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900145 "a.java": nil,
146 "PrebuiltAppFoo.apk": nil,
147 "PrebuiltAppFooPriv.apk": nil,
148 "build/make/target/product/security": nil,
149 "apex_manifest.json": nil,
150 "AndroidManifest.xml": nil,
151 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900152 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900153 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900154 "system/sepolicy/apex/otherapex-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900155 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800156 "mylib.cpp": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800157 "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,
Jiyong Park99644e92020-11-17 22:21:02 +0900191 "foo.rs": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900192 }
193
Colin Crossf9aabd72020-02-15 11:29:50 -0800194 cc.GatherRequiredFilesForTest(fs)
195
Jooyung Han344d5432019-08-23 11:17:39 +0900196 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800197 // The fs now needs to be populated before creating the config, call handlers twice
198 // for now, once to get any fs changes, and later after the config was created to
199 // set product variables or targets.
200 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
201 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900202 }
203
Colin Cross98be1bb2019-12-13 20:41:13 -0800204 config := android.TestArchConfig(buildDir, nil, bp, fs)
205 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
206 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
207 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
208 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
209 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Dan Albert4f378d72020-07-23 17:32:15 -0700210 config.TestProductVariables.Platform_version_active_codenames = []string{"Q"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800211 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
212
213 for _, handler := range handlers {
214 // The fs now needs to be populated before creating the config, call handlers twice
215 // for now, earlier to get any fs changes, and now after the config was created to
216 // set product variables or targets.
217 tempFS := map[string][]byte{}
218 handler(tempFS, config)
219 }
220
Colin Crossae8600b2020-10-29 17:09:13 -0700221 ctx := android.NewTestArchContext(config)
Paul Duffineedc5d52020-06-12 17:46:39 +0100222
223 // from android package
224 android.RegisterPackageBuildComponents(ctx)
225 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
226
Colin Cross98be1bb2019-12-13 20:41:13 -0800227 ctx.RegisterModuleType("apex", BundleFactory)
228 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
229 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
230 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
231 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
232 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
233 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700234 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800235
Jooyung Hana57af4a2020-01-23 05:36:59 +0000236 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +0100237 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000238 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
239
Paul Duffin021f4e52020-07-30 16:04:17 +0100240 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100241
Paul Duffin021f4e52020-07-30 16:04:17 +0100242 // Register these after the prebuilt mutators have been registered to match what
243 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100244 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
245 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
246
Paul Duffin021f4e52020-07-30 16:04:17 +0100247 cc.RegisterRequiredBuildComponentsForTest(ctx)
Jiyong Park99644e92020-11-17 22:21:02 +0900248 rust.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffin021f4e52020-07-30 16:04:17 +0100249
Colin Cross98be1bb2019-12-13 20:41:13 -0800250 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800251 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
252 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jooyung Han0703fd82020-08-26 22:11:53 +0900253 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000254 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700255 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800256 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000257 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000258 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000259 java.RegisterAppBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100260 java.RegisterSdkLibraryBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900261 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800262 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800263
Colin Cross98be1bb2019-12-13 20:41:13 -0800264 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800265 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800266
Colin Crossae8600b2020-10-29 17:09:13 -0700267 ctx.Register()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900268
Jooyung Han5c998b92019-06-27 11:30:33 +0900269 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900270}
271
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700272func setUp() {
273 var err error
274 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900275 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700276 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900278}
279
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700280func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700281 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282}
283
Jooyung Han643adc42020-02-27 13:50:06 +0900284// ensure that 'result' equals 'expected'
285func ensureEquals(t *testing.T, result string, expected string) {
286 t.Helper()
287 if result != expected {
288 t.Errorf("%q != %q", expected, result)
289 }
290}
291
Jiyong Park25fc6a92018-11-18 18:02:45 +0900292// ensure that 'result' contains 'expected'
293func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900294 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900295 if !strings.Contains(result, expected) {
296 t.Errorf("%q is not found in %q", expected, result)
297 }
298}
299
Liz Kammer5bd365f2020-05-27 15:15:11 -0700300// ensure that 'result' contains 'expected' exactly one time
301func ensureContainsOnce(t *testing.T, result string, expected string) {
302 t.Helper()
303 count := strings.Count(result, expected)
304 if count != 1 {
305 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
306 }
307}
308
Jiyong Park25fc6a92018-11-18 18:02:45 +0900309// ensures that 'result' does not contain 'notExpected'
310func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900311 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900312 if strings.Contains(result, notExpected) {
313 t.Errorf("%q is found in %q", notExpected, result)
314 }
315}
316
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700317func ensureMatches(t *testing.T, result string, expectedRex string) {
318 ok, err := regexp.MatchString(expectedRex, result)
319 if err != nil {
320 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
321 return
322 }
323 if !ok {
324 t.Errorf("%s does not match regular expession %s", result, expectedRex)
325 }
326}
327
Jiyong Park25fc6a92018-11-18 18:02:45 +0900328func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900329 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 if !android.InList(expected, result) {
331 t.Errorf("%q is not found in %v", expected, result)
332 }
333}
334
335func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900336 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900337 if android.InList(notExpected, result) {
338 t.Errorf("%q is found in %v", notExpected, result)
339 }
340}
341
Jooyung Hane1633032019-08-01 17:41:43 +0900342func ensureListEmpty(t *testing.T, result []string) {
343 t.Helper()
344 if len(result) > 0 {
345 t.Errorf("%q is expected to be empty", result)
346 }
347}
348
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000349func ensureListNotEmpty(t *testing.T, result []string) {
350 t.Helper()
351 if len(result) == 0 {
352 t.Errorf("%q is expected to be not empty", result)
353 }
354}
355
Jiyong Park25fc6a92018-11-18 18:02:45 +0900356// Minimal test
357func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900358 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900359 apex_defaults {
360 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900361 manifest: ":myapex.manifest",
362 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900363 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900364 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900365 native_shared_libs: [
366 "mylib",
367 "libfoo.ffi",
368 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900369 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800370 multilib: {
371 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900372 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800373 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900374 },
Jiyong Park77acec62020-06-01 21:39:15 +0900375 java_libs: [
376 "myjar",
377 "myjar_dex",
378 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900379 }
380
Jiyong Park30ca9372019-02-07 16:27:23 +0900381 apex {
382 name: "myapex",
383 defaults: ["myapex-defaults"],
384 }
385
Jiyong Park25fc6a92018-11-18 18:02:45 +0900386 apex_key {
387 name: "myapex.key",
388 public_key: "testkey.avbpubkey",
389 private_key: "testkey.pem",
390 }
391
Jiyong Park809bb722019-02-13 21:33:49 +0900392 filegroup {
393 name: "myapex.manifest",
394 srcs: ["apex_manifest.json"],
395 }
396
397 filegroup {
398 name: "myapex.androidmanifest",
399 srcs: ["AndroidManifest.xml"],
400 }
401
Jiyong Park25fc6a92018-11-18 18:02:45 +0900402 cc_library {
403 name: "mylib",
404 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900405 shared_libs: [
406 "mylib2",
407 "libbar.ffi",
408 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900409 system_shared_libs: [],
410 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000411 // TODO: remove //apex_available:platform
412 apex_available: [
413 "//apex_available:platform",
414 "myapex",
415 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900416 }
417
Alex Light3d673592019-01-18 14:37:31 -0800418 cc_binary {
419 name: "foo",
420 srcs: ["mylib.cpp"],
421 compile_multilib: "both",
422 multilib: {
423 lib32: {
424 suffix: "32",
425 },
426 lib64: {
427 suffix: "64",
428 },
429 },
430 symlinks: ["foo_link_"],
431 symlink_preferred_arch: true,
432 system_shared_libs: [],
433 static_executable: true,
434 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700435 apex_available: [ "myapex", "com.android.gki.*" ],
436 }
437
Jiyong Park99644e92020-11-17 22:21:02 +0900438 rust_binary {
439 name: "foo.rust",
440 srcs: ["foo.rs"],
441 rlibs: ["libfoo.rlib.rust"],
442 dylibs: ["libfoo.dylib.rust"],
443 apex_available: ["myapex"],
444 }
445
446 rust_library_rlib {
447 name: "libfoo.rlib.rust",
448 srcs: ["foo.rs"],
449 crate_name: "foo",
450 apex_available: ["myapex"],
451 }
452
453 rust_library_dylib {
454 name: "libfoo.dylib.rust",
455 srcs: ["foo.rs"],
456 crate_name: "foo",
457 apex_available: ["myapex"],
458 }
459
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900460 rust_ffi_shared {
461 name: "libfoo.ffi",
462 srcs: ["foo.rs"],
463 crate_name: "foo",
464 apex_available: ["myapex"],
465 }
466
467 rust_ffi_shared {
468 name: "libbar.ffi",
469 srcs: ["foo.rs"],
470 crate_name: "bar",
471 apex_available: ["myapex"],
472 }
473
Yifan Hongd22a84a2020-07-28 17:37:46 -0700474 apex {
475 name: "com.android.gki.fake",
476 binaries: ["foo"],
477 key: "myapex.key",
478 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800479 }
480
Paul Duffindddd5462020-04-07 15:25:44 +0100481 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900482 name: "mylib2",
483 srcs: ["mylib.cpp"],
484 system_shared_libs: [],
485 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900486 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900487 static_libs: ["libstatic"],
488 // TODO: remove //apex_available:platform
489 apex_available: [
490 "//apex_available:platform",
491 "myapex",
492 ],
493 }
494
Paul Duffindddd5462020-04-07 15:25:44 +0100495 cc_prebuilt_library_shared {
496 name: "mylib2",
497 srcs: ["prebuilt.so"],
498 // TODO: remove //apex_available:platform
499 apex_available: [
500 "//apex_available:platform",
501 "myapex",
502 ],
503 }
504
Jiyong Park9918e1a2020-03-17 19:16:40 +0900505 cc_library_static {
506 name: "libstatic",
507 srcs: ["mylib.cpp"],
508 system_shared_libs: [],
509 stl: "none",
510 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000511 // TODO: remove //apex_available:platform
512 apex_available: [
513 "//apex_available:platform",
514 "myapex",
515 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900516 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900517
518 java_library {
519 name: "myjar",
520 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900521 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900522 sdk_version: "none",
523 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900524 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900525 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000526 // TODO: remove //apex_available:platform
527 apex_available: [
528 "//apex_available:platform",
529 "myapex",
530 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900531 }
532
Jiyong Park77acec62020-06-01 21:39:15 +0900533 dex_import {
534 name: "myjar_dex",
535 jars: ["prebuilt.jar"],
536 apex_available: [
537 "//apex_available:platform",
538 "myapex",
539 ],
540 }
541
Jiyong Park7f7766d2019-07-25 22:02:35 +0900542 java_library {
543 name: "myotherjar",
544 srcs: ["foo/bar/MyClass.java"],
545 sdk_version: "none",
546 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900547 // TODO: remove //apex_available:platform
548 apex_available: [
549 "//apex_available:platform",
550 "myapex",
551 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900552 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900553
554 java_library {
555 name: "mysharedjar",
556 srcs: ["foo/bar/MyClass.java"],
557 sdk_version: "none",
558 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900559 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900560 `)
561
Sundong Ahnabb64432019-10-22 13:58:29 +0900562 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900563
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900564 // Make sure that Android.mk is created
565 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
566 data := android.AndroidMkDataForTest(t, config, "", ab)
567 var builder strings.Builder
568 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
569
570 androidMk := builder.String()
571 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
572 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
573
Jiyong Park42cca6c2019-04-01 11:15:50 +0900574 optFlags := apexRule.Args["opt_flags"]
575 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700576 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900577 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900578
Jiyong Park25fc6a92018-11-18 18:02:45 +0900579 copyCmds := apexRule.Args["copy_commands"]
580
581 // Ensure that main rule creates an output
582 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
583
584 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700585 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
586 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
587 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900588 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900589 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900590
591 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700592 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
593 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900594 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
595 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900596 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900597
598 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800599 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
600 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900601 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900602 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900603 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900604 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
605 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900606 // .. but not for java libs
607 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900608 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800609
Colin Cross7113d202019-11-20 16:39:12 -0800610 // Ensure that the platform variant ends with _shared or _common
611 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
612 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900613 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
614 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900615 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
616
617 // Ensure that dynamic dependency to java libs are not included
618 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800619
620 // Ensure that all symlinks are present.
621 found_foo_link_64 := false
622 found_foo := false
623 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900624 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800625 if strings.HasSuffix(cmd, "bin/foo") {
626 found_foo = true
627 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
628 found_foo_link_64 = true
629 }
630 }
631 }
632 good := found_foo && found_foo_link_64
633 if !good {
634 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
635 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900636
Sundong Ahnabb64432019-10-22 13:58:29 +0900637 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700638 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900639 if len(noticeInputs) != 3 {
640 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900641 }
642 ensureListContains(t, noticeInputs, "NOTICE")
643 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900644 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900645
Artur Satayeva8bd1132020-04-27 18:07:06 +0100646 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100647 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
648 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
649 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
650 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
651 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100652
653 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100654 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
655 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
656 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
657 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
658 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800659}
660
Jooyung Hanf21c7972019-12-16 22:32:06 +0900661func TestDefaults(t *testing.T) {
662 ctx, _ := testApex(t, `
663 apex_defaults {
664 name: "myapex-defaults",
665 key: "myapex.key",
666 prebuilts: ["myetc"],
667 native_shared_libs: ["mylib"],
668 java_libs: ["myjar"],
669 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900670 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800671 bpfs: ["bpf"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900672 }
673
674 prebuilt_etc {
675 name: "myetc",
676 src: "myprebuilt",
677 }
678
679 apex {
680 name: "myapex",
681 defaults: ["myapex-defaults"],
682 }
683
684 apex_key {
685 name: "myapex.key",
686 public_key: "testkey.avbpubkey",
687 private_key: "testkey.pem",
688 }
689
690 cc_library {
691 name: "mylib",
692 system_shared_libs: [],
693 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000694 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900695 }
696
697 java_library {
698 name: "myjar",
699 srcs: ["foo/bar/MyClass.java"],
700 sdk_version: "none",
701 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000702 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900703 }
704
705 android_app {
706 name: "AppFoo",
707 srcs: ["foo/bar/MyClass.java"],
708 sdk_version: "none",
709 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000710 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900711 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900712
713 runtime_resource_overlay {
714 name: "rro",
715 theme: "blue",
716 }
717
markchien2f59ec92020-09-02 16:23:38 +0800718 bpf {
719 name: "bpf",
720 srcs: ["bpf.c", "bpf2.c"],
721 }
722
Jooyung Hanf21c7972019-12-16 22:32:06 +0900723 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000724 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900725 "etc/myetc",
726 "javalib/myjar.jar",
727 "lib64/mylib.so",
728 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900729 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800730 "etc/bpf/bpf.o",
731 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900732 })
733}
734
Jooyung Han01a3ee22019-11-02 02:52:25 +0900735func TestApexManifest(t *testing.T) {
736 ctx, _ := testApex(t, `
737 apex {
738 name: "myapex",
739 key: "myapex.key",
740 }
741
742 apex_key {
743 name: "myapex.key",
744 public_key: "testkey.avbpubkey",
745 private_key: "testkey.pem",
746 }
747 `)
748
749 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900750 args := module.Rule("apexRule").Args
751 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
752 t.Error("manifest should be apex_manifest.pb, but " + manifest)
753 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900754}
755
Alex Light5098a612018-11-29 17:12:15 -0800756func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700757 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800758 apex {
759 name: "myapex",
760 key: "myapex.key",
761 payload_type: "zip",
762 native_shared_libs: ["mylib"],
763 }
764
765 apex_key {
766 name: "myapex.key",
767 public_key: "testkey.avbpubkey",
768 private_key: "testkey.pem",
769 }
770
771 cc_library {
772 name: "mylib",
773 srcs: ["mylib.cpp"],
774 shared_libs: ["mylib2"],
775 system_shared_libs: [],
776 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000777 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800778 }
779
780 cc_library {
781 name: "mylib2",
782 srcs: ["mylib.cpp"],
783 system_shared_libs: [],
784 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000785 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800786 }
787 `)
788
Sundong Ahnabb64432019-10-22 13:58:29 +0900789 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800790 copyCmds := zipApexRule.Args["copy_commands"]
791
792 // Ensure that main rule creates an output
793 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
794
795 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700796 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800797
798 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700799 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800800
801 // Ensure that both direct and indirect deps are copied into apex
802 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
803 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900804}
805
806func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700807 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900808 apex {
809 name: "myapex",
810 key: "myapex.key",
811 native_shared_libs: ["mylib", "mylib3"],
812 }
813
814 apex_key {
815 name: "myapex.key",
816 public_key: "testkey.avbpubkey",
817 private_key: "testkey.pem",
818 }
819
820 cc_library {
821 name: "mylib",
822 srcs: ["mylib.cpp"],
823 shared_libs: ["mylib2", "mylib3"],
824 system_shared_libs: [],
825 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000826 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900827 }
828
829 cc_library {
830 name: "mylib2",
831 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900832 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900833 system_shared_libs: [],
834 stl: "none",
835 stubs: {
836 versions: ["1", "2", "3"],
837 },
838 }
839
840 cc_library {
841 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900842 srcs: ["mylib.cpp"],
843 shared_libs: ["mylib4"],
844 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900845 stl: "none",
846 stubs: {
847 versions: ["10", "11", "12"],
848 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000849 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900850 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900851
852 cc_library {
853 name: "mylib4",
854 srcs: ["mylib.cpp"],
855 system_shared_libs: [],
856 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000857 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900858 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900859 `)
860
Sundong Ahnabb64432019-10-22 13:58:29 +0900861 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900862 copyCmds := apexRule.Args["copy_commands"]
863
864 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800865 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900866
867 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800868 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900869
870 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800871 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900872
Colin Crossaede88c2020-08-11 12:17:01 -0700873 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900874
875 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900876 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900877 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900878 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900879
880 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700881 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900882 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700883 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900884
885 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900886 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900887 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900888
889 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700890 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900891
Jooyung Hana57af4a2020-01-23 05:36:59 +0000892 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900893 "lib64/mylib.so",
894 "lib64/mylib3.so",
895 "lib64/mylib4.so",
896 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900897}
898
Colin Cross7812fd32020-09-25 12:35:10 -0700899func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
900 t.Parallel()
901 ctx, _ := testApex(t, `
902 apex {
903 name: "myapex",
904 key: "myapex.key",
905 native_shared_libs: ["mylib", "mylib3"],
906 min_sdk_version: "29",
907 }
908
909 apex_key {
910 name: "myapex.key",
911 public_key: "testkey.avbpubkey",
912 private_key: "testkey.pem",
913 }
914
915 cc_library {
916 name: "mylib",
917 srcs: ["mylib.cpp"],
918 shared_libs: ["mylib2", "mylib3"],
919 system_shared_libs: [],
920 stl: "none",
921 apex_available: [ "myapex" ],
922 min_sdk_version: "28",
923 }
924
925 cc_library {
926 name: "mylib2",
927 srcs: ["mylib.cpp"],
928 cflags: ["-include mylib.h"],
929 system_shared_libs: [],
930 stl: "none",
931 stubs: {
932 versions: ["28", "29", "30", "current"],
933 },
934 min_sdk_version: "28",
935 }
936
937 cc_library {
938 name: "mylib3",
939 srcs: ["mylib.cpp"],
940 shared_libs: ["mylib4"],
941 system_shared_libs: [],
942 stl: "none",
943 stubs: {
944 versions: ["28", "29", "30", "current"],
945 },
946 apex_available: [ "myapex" ],
947 min_sdk_version: "28",
948 }
949
950 cc_library {
951 name: "mylib4",
952 srcs: ["mylib.cpp"],
953 system_shared_libs: [],
954 stl: "none",
955 apex_available: [ "myapex" ],
956 min_sdk_version: "28",
957 }
958 `)
959
960 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
961 copyCmds := apexRule.Args["copy_commands"]
962
963 // Ensure that direct non-stubs dep is always included
964 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
965
966 // Ensure that indirect stubs dep is not included
967 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
968
969 // Ensure that direct stubs dep is included
970 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
971
972 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
973
974 // Ensure that mylib is linking with the version 29 stubs for mylib2
975 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_29/mylib2.so")
976 // ... and not linking to the non-stub (impl) variant of mylib2
977 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
978
979 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
980 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
981 // .. and not linking to the stubs variant of mylib3
982 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
983
984 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700985 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700986 ensureNotContains(t, mylib2Cflags, "-include ")
987
988 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700989 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -0700990
991 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
992 "lib64/mylib.so",
993 "lib64/mylib3.so",
994 "lib64/mylib4.so",
995 })
996}
997
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900998func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700999 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001000 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001001 name: "myapex2",
1002 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001003 native_shared_libs: ["mylib"],
1004 }
1005
1006 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001007 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001008 public_key: "testkey.avbpubkey",
1009 private_key: "testkey.pem",
1010 }
1011
1012 cc_library {
1013 name: "mylib",
1014 srcs: ["mylib.cpp"],
1015 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001016 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001017 system_shared_libs: [],
1018 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001019 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001020 }
1021
1022 cc_library {
1023 name: "libfoo",
1024 srcs: ["mylib.cpp"],
1025 shared_libs: ["libbar"],
1026 system_shared_libs: [],
1027 stl: "none",
1028 stubs: {
1029 versions: ["10", "20", "30"],
1030 },
1031 }
1032
1033 cc_library {
1034 name: "libbar",
1035 srcs: ["mylib.cpp"],
1036 system_shared_libs: [],
1037 stl: "none",
1038 }
1039
Jiyong Park678c8812020-02-07 17:25:49 +09001040 cc_library_static {
1041 name: "libbaz",
1042 srcs: ["mylib.cpp"],
1043 system_shared_libs: [],
1044 stl: "none",
1045 apex_available: [ "myapex2" ],
1046 }
1047
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001048 `)
1049
Jiyong Park83dc74b2020-01-14 18:38:44 +09001050 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001051 copyCmds := apexRule.Args["copy_commands"]
1052
1053 // Ensure that direct non-stubs dep is always included
1054 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1055
1056 // Ensure that indirect stubs dep is not included
1057 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1058
1059 // Ensure that dependency of stubs is not included
1060 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1061
Colin Crossaede88c2020-08-11 12:17:01 -07001062 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001063
1064 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001065 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001066 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001067 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001068
Jiyong Park3ff16992019-12-27 14:11:47 +09001069 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001070
1071 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1072 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001073
Artur Satayeva8bd1132020-04-27 18:07:06 +01001074 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001075 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2")
1076 ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib")
1077 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001078
Artur Satayeva8bd1132020-04-27 18:07:06 +01001079 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001080 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
1081 ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))")
1082 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001083}
1084
Jooyung Hand3639552019-08-09 12:57:43 +09001085func TestApexWithRuntimeLibsDependency(t *testing.T) {
1086 /*
1087 myapex
1088 |
1089 v (runtime_libs)
1090 mylib ------+------> libfoo [provides stub]
1091 |
1092 `------> libbar
1093 */
1094 ctx, _ := testApex(t, `
1095 apex {
1096 name: "myapex",
1097 key: "myapex.key",
1098 native_shared_libs: ["mylib"],
1099 }
1100
1101 apex_key {
1102 name: "myapex.key",
1103 public_key: "testkey.avbpubkey",
1104 private_key: "testkey.pem",
1105 }
1106
1107 cc_library {
1108 name: "mylib",
1109 srcs: ["mylib.cpp"],
1110 runtime_libs: ["libfoo", "libbar"],
1111 system_shared_libs: [],
1112 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001113 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001114 }
1115
1116 cc_library {
1117 name: "libfoo",
1118 srcs: ["mylib.cpp"],
1119 system_shared_libs: [],
1120 stl: "none",
1121 stubs: {
1122 versions: ["10", "20", "30"],
1123 },
1124 }
1125
1126 cc_library {
1127 name: "libbar",
1128 srcs: ["mylib.cpp"],
1129 system_shared_libs: [],
1130 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001131 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001132 }
1133
1134 `)
1135
Sundong Ahnabb64432019-10-22 13:58:29 +09001136 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001137 copyCmds := apexRule.Args["copy_commands"]
1138
1139 // Ensure that direct non-stubs dep is always included
1140 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1141
1142 // Ensure that indirect stubs dep is not included
1143 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1144
1145 // Ensure that runtime_libs dep in included
1146 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1147
Sundong Ahnabb64432019-10-22 13:58:29 +09001148 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001149 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1150 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001151
1152}
1153
Jooyung Han8ce8db92020-05-15 19:05:05 +09001154func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1155 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1156 bp := `
1157 apex {
1158 name: "com.android.runtime",
1159 key: "com.android.runtime.key",
1160 native_shared_libs: ["libc"],
1161 }
1162
1163 apex_key {
1164 name: "com.android.runtime.key",
1165 public_key: "testkey.avbpubkey",
1166 private_key: "testkey.pem",
1167 }
1168
1169 cc_library {
1170 name: "libc",
1171 no_libcrt: true,
1172 nocrt: true,
1173 stl: "none",
1174 system_shared_libs: [],
1175 stubs: { versions: ["1"] },
1176 apex_available: ["com.android.runtime"],
1177
1178 sanitize: {
1179 hwaddress: true,
1180 }
1181 }
1182
1183 cc_prebuilt_library_shared {
1184 name: "libclang_rt.hwasan-aarch64-android",
1185 no_libcrt: true,
1186 nocrt: true,
1187 stl: "none",
1188 system_shared_libs: [],
1189 srcs: [""],
1190 stubs: { versions: ["1"] },
1191
1192 sanitize: {
1193 never: true,
1194 },
1195 }
1196 `
1197 // override bp to use hard-coded names: com.android.runtime and libc
1198 fs["Android.bp"] = []byte(bp)
1199 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1200 })
1201
1202 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1203 "lib64/bionic/libc.so",
1204 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1205 })
1206
1207 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1208
1209 installed := hwasan.Description("install libclang_rt.hwasan")
1210 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1211
1212 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1213 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1214 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1215}
1216
1217func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1218 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1219 bp := `
1220 apex {
1221 name: "com.android.runtime",
1222 key: "com.android.runtime.key",
1223 native_shared_libs: ["libc"],
1224 }
1225
1226 apex_key {
1227 name: "com.android.runtime.key",
1228 public_key: "testkey.avbpubkey",
1229 private_key: "testkey.pem",
1230 }
1231
1232 cc_library {
1233 name: "libc",
1234 no_libcrt: true,
1235 nocrt: true,
1236 stl: "none",
1237 system_shared_libs: [],
1238 stubs: { versions: ["1"] },
1239 apex_available: ["com.android.runtime"],
1240 }
1241
1242 cc_prebuilt_library_shared {
1243 name: "libclang_rt.hwasan-aarch64-android",
1244 no_libcrt: true,
1245 nocrt: true,
1246 stl: "none",
1247 system_shared_libs: [],
1248 srcs: [""],
1249 stubs: { versions: ["1"] },
1250
1251 sanitize: {
1252 never: true,
1253 },
1254 }
1255 `
1256 // override bp to use hard-coded names: com.android.runtime and libc
1257 fs["Android.bp"] = []byte(bp)
1258 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1259
1260 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1261 })
1262
1263 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1264 "lib64/bionic/libc.so",
1265 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1266 })
1267
1268 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1269
1270 installed := hwasan.Description("install libclang_rt.hwasan")
1271 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1272
1273 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1274 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1275 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1276}
1277
Jooyung Han61b66e92020-03-21 14:21:46 +00001278func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1279 testcases := []struct {
1280 name string
1281 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001282 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001283 shouldLink string
1284 shouldNotLink []string
1285 }{
1286 {
Jooyung Han75568392020-03-20 04:29:24 +09001287 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001288 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001289 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001290 shouldLink: "30",
1291 shouldNotLink: []string{"29"},
1292 },
1293 {
1294 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001295 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001296 apexVariant: "apex29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001297 shouldLink: "29",
1298 shouldNotLink: []string{"30"},
1299 },
1300 }
1301 for _, tc := range testcases {
1302 t.Run(tc.name, func(t *testing.T) {
1303 ctx, _ := testApex(t, `
1304 apex {
1305 name: "myapex",
1306 key: "myapex.key",
1307 use_vendor: true,
1308 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001309 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001310 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001311
Jooyung Han61b66e92020-03-21 14:21:46 +00001312 apex_key {
1313 name: "myapex.key",
1314 public_key: "testkey.avbpubkey",
1315 private_key: "testkey.pem",
1316 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001317
Jooyung Han61b66e92020-03-21 14:21:46 +00001318 cc_library {
1319 name: "mylib",
1320 srcs: ["mylib.cpp"],
1321 vendor_available: true,
1322 shared_libs: ["libbar"],
1323 system_shared_libs: [],
1324 stl: "none",
1325 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001326 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001327 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001328
Jooyung Han61b66e92020-03-21 14:21:46 +00001329 cc_library {
1330 name: "libbar",
1331 srcs: ["mylib.cpp"],
1332 system_shared_libs: [],
1333 stl: "none",
1334 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001335 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001336 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001337
Jooyung Han61b66e92020-03-21 14:21:46 +00001338 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001339 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001340 symbol_file: "",
1341 }
1342 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001343 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001344 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001345
Jooyung Han61b66e92020-03-21 14:21:46 +00001346 // Ensure that LLNDK dep is not included
1347 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1348 "lib64/mylib.so",
1349 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001350
Jooyung Han61b66e92020-03-21 14:21:46 +00001351 // Ensure that LLNDK dep is required
1352 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1353 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1354 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001355
Colin Crossaede88c2020-08-11 12:17:01 -07001356 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001357 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1358 for _, ver := range tc.shouldNotLink {
1359 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1360 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001361
Colin Crossaede88c2020-08-11 12:17:01 -07001362 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001363 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1364 })
1365 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001366}
1367
Jiyong Park25fc6a92018-11-18 18:02:45 +09001368func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001369 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001370 apex {
1371 name: "myapex",
1372 key: "myapex.key",
1373 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1374 }
1375
1376 apex_key {
1377 name: "myapex.key",
1378 public_key: "testkey.avbpubkey",
1379 private_key: "testkey.pem",
1380 }
1381
1382 cc_library {
1383 name: "mylib",
1384 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001385 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001386 shared_libs: ["libdl#27"],
1387 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001388 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001389 }
1390
1391 cc_library_shared {
1392 name: "mylib_shared",
1393 srcs: ["mylib.cpp"],
1394 shared_libs: ["libdl#27"],
1395 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001396 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001397 }
1398
1399 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001400 name: "libBootstrap",
1401 srcs: ["mylib.cpp"],
1402 stl: "none",
1403 bootstrap: true,
1404 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001405 `)
1406
Sundong Ahnabb64432019-10-22 13:58:29 +09001407 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001408 copyCmds := apexRule.Args["copy_commands"]
1409
1410 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001411 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001412 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1413 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001414
1415 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001416 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001417
Colin Crossaede88c2020-08-11 12:17:01 -07001418 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1419 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1420 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001421
1422 // For dependency to libc
1423 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001424 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001425 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001426 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001427 // ... Cflags from stub is correctly exported to mylib
1428 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1429 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1430
1431 // For dependency to libm
1432 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001433 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001434 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001435 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001436 // ... and is not compiling with the stub
1437 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1438 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1439
1440 // For dependency to libdl
1441 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001442 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001443 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001444 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1445 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001446 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001447 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001448 // ... Cflags from stub is correctly exported to mylib
1449 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1450 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001451
1452 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001453 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1454 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1455 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1456 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001457}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001458
Jooyung Han749dc692020-04-15 11:03:39 +09001459func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001460 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001461 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1462 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001463 // 3) (platform) -> liba -> libz : this should be non-stub link
1464 ctx, _ := testApex(t, `
1465 apex {
1466 name: "myapex",
1467 key: "myapex.key",
1468 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001469 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001470 }
1471
1472 apex {
1473 name: "otherapex",
1474 key: "myapex.key",
1475 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001476 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001477 }
1478
1479 apex_key {
1480 name: "myapex.key",
1481 public_key: "testkey.avbpubkey",
1482 private_key: "testkey.pem",
1483 }
1484
1485 cc_library {
1486 name: "libx",
1487 shared_libs: ["liba"],
1488 system_shared_libs: [],
1489 stl: "none",
1490 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001491 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001492 }
1493
1494 cc_library {
1495 name: "liby",
1496 shared_libs: ["liba"],
1497 system_shared_libs: [],
1498 stl: "none",
1499 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001500 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001501 }
1502
1503 cc_library {
1504 name: "liba",
1505 shared_libs: ["libz"],
1506 system_shared_libs: [],
1507 stl: "none",
1508 apex_available: [
1509 "//apex_available:anyapex",
1510 "//apex_available:platform",
1511 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001512 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001513 }
1514
1515 cc_library {
1516 name: "libz",
1517 system_shared_libs: [],
1518 stl: "none",
1519 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001520 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001521 },
1522 }
Jooyung Han749dc692020-04-15 11:03:39 +09001523 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001524
1525 expectLink := func(from, from_variant, to, to_variant string) {
1526 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1527 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1528 }
1529 expectNoLink := func(from, from_variant, to, to_variant string) {
1530 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1531 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1532 }
1533 // platform liba is linked to non-stub version
1534 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001535 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001536 expectLink("liba", "shared_apex29", "libz", "shared_28")
1537 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1538 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001539 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001540 expectLink("liba", "shared_apex30", "libz", "shared_30")
1541 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1542 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001543}
1544
Jooyung Hanaed150d2020-04-02 01:41:41 +09001545func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1546 ctx, _ := testApex(t, `
1547 apex {
1548 name: "myapex",
1549 key: "myapex.key",
1550 native_shared_libs: ["libx"],
1551 min_sdk_version: "R",
1552 }
1553
1554 apex_key {
1555 name: "myapex.key",
1556 public_key: "testkey.avbpubkey",
1557 private_key: "testkey.pem",
1558 }
1559
1560 cc_library {
1561 name: "libx",
1562 shared_libs: ["libz"],
1563 system_shared_libs: [],
1564 stl: "none",
1565 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001566 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001567 }
1568
1569 cc_library {
1570 name: "libz",
1571 system_shared_libs: [],
1572 stl: "none",
1573 stubs: {
1574 versions: ["29", "R"],
1575 },
1576 }
1577 `, func(fs map[string][]byte, config android.Config) {
1578 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1579 })
1580
1581 expectLink := func(from, from_variant, to, to_variant string) {
1582 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1583 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1584 }
1585 expectNoLink := func(from, from_variant, to, to_variant string) {
1586 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1587 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1588 }
Dan Albertc8060532020-07-22 22:32:17 -07001589 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001590 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1591 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001592}
1593
Jooyung Han749dc692020-04-15 11:03:39 +09001594func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001595 ctx, _ := testApex(t, `
1596 apex {
1597 name: "myapex",
1598 key: "myapex.key",
1599 native_shared_libs: ["libx"],
1600 }
1601
1602 apex_key {
1603 name: "myapex.key",
1604 public_key: "testkey.avbpubkey",
1605 private_key: "testkey.pem",
1606 }
1607
1608 cc_library {
1609 name: "libx",
1610 shared_libs: ["libz"],
1611 system_shared_libs: [],
1612 stl: "none",
1613 apex_available: [ "myapex" ],
1614 }
1615
1616 cc_library {
1617 name: "libz",
1618 system_shared_libs: [],
1619 stl: "none",
1620 stubs: {
1621 versions: ["1", "2"],
1622 },
1623 }
1624 `)
1625
1626 expectLink := func(from, from_variant, to, to_variant string) {
1627 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1628 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1629 }
1630 expectNoLink := func(from, from_variant, to, to_variant string) {
1631 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1632 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1633 }
Colin Crossaede88c2020-08-11 12:17:01 -07001634 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1635 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1636 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001637}
1638
1639func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1640 ctx, _ := testApex(t, `
1641 apex {
1642 name: "myapex",
1643 key: "myapex.key",
1644 native_shared_libs: ["libx"],
1645 }
1646
1647 apex_key {
1648 name: "myapex.key",
1649 public_key: "testkey.avbpubkey",
1650 private_key: "testkey.pem",
1651 }
1652
1653 cc_library {
1654 name: "libx",
1655 system_shared_libs: [],
1656 stl: "none",
1657 apex_available: [ "myapex" ],
1658 stubs: {
1659 versions: ["1", "2"],
1660 },
1661 }
1662
1663 cc_library {
1664 name: "libz",
1665 shared_libs: ["libx"],
1666 system_shared_libs: [],
1667 stl: "none",
1668 }
1669 `)
1670
1671 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001672 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001673 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1674 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1675 }
1676 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001677 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001678 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1679 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1680 }
1681 expectLink("libz", "shared", "libx", "shared_2")
1682 expectNoLink("libz", "shared", "libz", "shared_1")
1683 expectNoLink("libz", "shared", "libz", "shared")
1684}
1685
Jooyung Han75568392020-03-20 04:29:24 +09001686func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001687 ctx, _ := testApex(t, `
1688 apex {
1689 name: "myapex",
1690 key: "myapex.key",
1691 native_shared_libs: ["libx"],
1692 min_sdk_version: "29",
1693 }
1694
1695 apex_key {
1696 name: "myapex.key",
1697 public_key: "testkey.avbpubkey",
1698 private_key: "testkey.pem",
1699 }
1700
1701 cc_library {
1702 name: "libx",
1703 shared_libs: ["libbar"],
1704 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001705 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001706 }
1707
1708 cc_library {
1709 name: "libbar",
1710 stubs: {
1711 versions: ["29", "30"],
1712 },
1713 }
Jooyung Han75568392020-03-20 04:29:24 +09001714 `, func(fs map[string][]byte, config android.Config) {
1715 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1716 })
Jooyung Han03b51852020-02-26 22:45:42 +09001717 expectLink := func(from, from_variant, to, to_variant string) {
1718 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1719 libFlags := ld.Args["libFlags"]
1720 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1721 }
Colin Crossaede88c2020-08-11 12:17:01 -07001722 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001723}
1724
Jooyung Han75568392020-03-20 04:29:24 +09001725func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001726 ctx, _ := testApex(t, `
1727 apex {
1728 name: "myapex",
1729 key: "myapex.key",
1730 native_shared_libs: ["libx"],
1731 min_sdk_version: "29",
1732 }
1733
1734 apex_key {
1735 name: "myapex.key",
1736 public_key: "testkey.avbpubkey",
1737 private_key: "testkey.pem",
1738 }
1739
1740 cc_library {
1741 name: "libx",
1742 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001743 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001744 }
Jooyung Han75568392020-03-20 04:29:24 +09001745 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001746
1747 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001748 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Jooyung Han03b51852020-02-26 22:45:42 +09001749 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1750 // note that platform variant is not.
1751 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1752 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001753}
1754
Jooyung Han749dc692020-04-15 11:03:39 +09001755func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001756 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001757 apex {
1758 name: "myapex",
1759 key: "myapex.key",
1760 native_shared_libs: ["libx"],
1761 min_sdk_version: "29",
1762 }
1763
1764 apex_key {
1765 name: "myapex.key",
1766 public_key: "testkey.avbpubkey",
1767 private_key: "testkey.pem",
1768 }
1769
1770 cc_library {
1771 name: "libx",
1772 shared_libs: ["libz"],
1773 system_shared_libs: [],
1774 stl: "none",
1775 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001776 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001777 }
1778
1779 cc_library {
1780 name: "libz",
1781 system_shared_libs: [],
1782 stl: "none",
1783 stubs: {
1784 versions: ["30"],
1785 },
1786 }
Jooyung Han75568392020-03-20 04:29:24 +09001787 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001788}
Jooyung Han03b51852020-02-26 22:45:42 +09001789
Jooyung Han749dc692020-04-15 11:03:39 +09001790func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1791 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001792 apex {
1793 name: "myapex",
1794 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001795 native_shared_libs: ["mylib"],
1796 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001797 }
1798
1799 apex_key {
1800 name: "myapex.key",
1801 public_key: "testkey.avbpubkey",
1802 private_key: "testkey.pem",
1803 }
Jooyung Han749dc692020-04-15 11:03:39 +09001804
1805 cc_library {
1806 name: "mylib",
1807 srcs: ["mylib.cpp"],
1808 system_shared_libs: [],
1809 stl: "none",
1810 apex_available: [
1811 "myapex",
1812 ],
1813 min_sdk_version: "30",
1814 }
1815 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05001816
1817 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
1818 apex {
1819 name: "myapex",
1820 key: "myapex.key",
1821 native_shared_libs: ["libfoo.ffi"],
1822 min_sdk_version: "29",
1823 }
1824
1825 apex_key {
1826 name: "myapex.key",
1827 public_key: "testkey.avbpubkey",
1828 private_key: "testkey.pem",
1829 }
1830
1831 rust_ffi_shared {
1832 name: "libfoo.ffi",
1833 srcs: ["foo.rs"],
1834 crate_name: "foo",
1835 apex_available: [
1836 "myapex",
1837 ],
1838 min_sdk_version: "30",
1839 }
1840 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001841}
1842
1843func TestApexMinSdkVersion_Okay(t *testing.T) {
1844 testApex(t, `
1845 apex {
1846 name: "myapex",
1847 key: "myapex.key",
1848 native_shared_libs: ["libfoo"],
1849 java_libs: ["libbar"],
1850 min_sdk_version: "29",
1851 }
1852
1853 apex_key {
1854 name: "myapex.key",
1855 public_key: "testkey.avbpubkey",
1856 private_key: "testkey.pem",
1857 }
1858
1859 cc_library {
1860 name: "libfoo",
1861 srcs: ["mylib.cpp"],
1862 shared_libs: ["libfoo_dep"],
1863 apex_available: ["myapex"],
1864 min_sdk_version: "29",
1865 }
1866
1867 cc_library {
1868 name: "libfoo_dep",
1869 srcs: ["mylib.cpp"],
1870 apex_available: ["myapex"],
1871 min_sdk_version: "29",
1872 }
1873
1874 java_library {
1875 name: "libbar",
1876 sdk_version: "current",
1877 srcs: ["a.java"],
1878 static_libs: ["libbar_dep"],
1879 apex_available: ["myapex"],
1880 min_sdk_version: "29",
1881 }
1882
1883 java_library {
1884 name: "libbar_dep",
1885 sdk_version: "current",
1886 srcs: ["a.java"],
1887 apex_available: ["myapex"],
1888 min_sdk_version: "29",
1889 }
Jooyung Han03b51852020-02-26 22:45:42 +09001890 `)
1891}
1892
Artur Satayev8cf899a2020-04-15 17:29:42 +01001893func TestJavaStableSdkVersion(t *testing.T) {
1894 testCases := []struct {
1895 name string
1896 expectedError string
1897 bp string
1898 }{
1899 {
1900 name: "Non-updatable apex with non-stable dep",
1901 bp: `
1902 apex {
1903 name: "myapex",
1904 java_libs: ["myjar"],
1905 key: "myapex.key",
1906 }
1907 apex_key {
1908 name: "myapex.key",
1909 public_key: "testkey.avbpubkey",
1910 private_key: "testkey.pem",
1911 }
1912 java_library {
1913 name: "myjar",
1914 srcs: ["foo/bar/MyClass.java"],
1915 sdk_version: "core_platform",
1916 apex_available: ["myapex"],
1917 }
1918 `,
1919 },
1920 {
1921 name: "Updatable apex with stable dep",
1922 bp: `
1923 apex {
1924 name: "myapex",
1925 java_libs: ["myjar"],
1926 key: "myapex.key",
1927 updatable: true,
1928 min_sdk_version: "29",
1929 }
1930 apex_key {
1931 name: "myapex.key",
1932 public_key: "testkey.avbpubkey",
1933 private_key: "testkey.pem",
1934 }
1935 java_library {
1936 name: "myjar",
1937 srcs: ["foo/bar/MyClass.java"],
1938 sdk_version: "current",
1939 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001940 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001941 }
1942 `,
1943 },
1944 {
1945 name: "Updatable apex with non-stable dep",
1946 expectedError: "cannot depend on \"myjar\"",
1947 bp: `
1948 apex {
1949 name: "myapex",
1950 java_libs: ["myjar"],
1951 key: "myapex.key",
1952 updatable: true,
1953 }
1954 apex_key {
1955 name: "myapex.key",
1956 public_key: "testkey.avbpubkey",
1957 private_key: "testkey.pem",
1958 }
1959 java_library {
1960 name: "myjar",
1961 srcs: ["foo/bar/MyClass.java"],
1962 sdk_version: "core_platform",
1963 apex_available: ["myapex"],
1964 }
1965 `,
1966 },
1967 {
1968 name: "Updatable apex with non-stable transitive dep",
1969 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1970 bp: `
1971 apex {
1972 name: "myapex",
1973 java_libs: ["myjar"],
1974 key: "myapex.key",
1975 updatable: true,
1976 }
1977 apex_key {
1978 name: "myapex.key",
1979 public_key: "testkey.avbpubkey",
1980 private_key: "testkey.pem",
1981 }
1982 java_library {
1983 name: "myjar",
1984 srcs: ["foo/bar/MyClass.java"],
1985 sdk_version: "current",
1986 apex_available: ["myapex"],
1987 static_libs: ["transitive-jar"],
1988 }
1989 java_library {
1990 name: "transitive-jar",
1991 srcs: ["foo/bar/MyClass.java"],
1992 sdk_version: "core_platform",
1993 apex_available: ["myapex"],
1994 }
1995 `,
1996 },
1997 }
1998
1999 for _, test := range testCases {
2000 t.Run(test.name, func(t *testing.T) {
2001 if test.expectedError == "" {
2002 testApex(t, test.bp)
2003 } else {
2004 testApexError(t, test.expectedError, test.bp)
2005 }
2006 })
2007 }
2008}
2009
Jooyung Han749dc692020-04-15 11:03:39 +09002010func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2011 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2012 apex {
2013 name: "myapex",
2014 key: "myapex.key",
2015 native_shared_libs: ["mylib"],
2016 min_sdk_version: "29",
2017 }
2018
2019 apex_key {
2020 name: "myapex.key",
2021 public_key: "testkey.avbpubkey",
2022 private_key: "testkey.pem",
2023 }
2024
2025 cc_library {
2026 name: "mylib",
2027 srcs: ["mylib.cpp"],
2028 shared_libs: ["mylib2"],
2029 system_shared_libs: [],
2030 stl: "none",
2031 apex_available: [
2032 "myapex",
2033 ],
2034 min_sdk_version: "29",
2035 }
2036
2037 // indirect part of the apex
2038 cc_library {
2039 name: "mylib2",
2040 srcs: ["mylib.cpp"],
2041 system_shared_libs: [],
2042 stl: "none",
2043 apex_available: [
2044 "myapex",
2045 ],
2046 min_sdk_version: "30",
2047 }
2048 `)
2049}
2050
2051func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2052 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2053 apex {
2054 name: "myapex",
2055 key: "myapex.key",
2056 apps: ["AppFoo"],
2057 min_sdk_version: "29",
2058 }
2059
2060 apex_key {
2061 name: "myapex.key",
2062 public_key: "testkey.avbpubkey",
2063 private_key: "testkey.pem",
2064 }
2065
2066 android_app {
2067 name: "AppFoo",
2068 srcs: ["foo/bar/MyClass.java"],
2069 sdk_version: "current",
2070 min_sdk_version: "29",
2071 system_modules: "none",
2072 stl: "none",
2073 static_libs: ["bar"],
2074 apex_available: [ "myapex" ],
2075 }
2076
2077 java_library {
2078 name: "bar",
2079 sdk_version: "current",
2080 srcs: ["a.java"],
2081 apex_available: [ "myapex" ],
2082 }
2083 `)
2084}
2085
2086func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
2087 ctx, _ := testApex(t, `
2088 apex {
2089 name: "myapex",
2090 key: "myapex.key",
2091 native_shared_libs: ["mylib"],
2092 min_sdk_version: "29",
2093 }
2094
2095 apex_key {
2096 name: "myapex.key",
2097 public_key: "testkey.avbpubkey",
2098 private_key: "testkey.pem",
2099 }
2100
2101 // mylib in myapex will link to mylib2#29
2102 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2103 cc_library {
2104 name: "mylib",
2105 srcs: ["mylib.cpp"],
2106 shared_libs: ["mylib2"],
2107 system_shared_libs: [],
2108 stl: "none",
2109 apex_available: ["myapex", "otherapex"],
2110 min_sdk_version: "29",
2111 }
2112
2113 cc_library {
2114 name: "mylib2",
2115 srcs: ["mylib.cpp"],
2116 system_shared_libs: [],
2117 stl: "none",
2118 apex_available: ["otherapex"],
2119 stubs: { versions: ["29", "30"] },
2120 min_sdk_version: "30",
2121 }
2122
2123 apex {
2124 name: "otherapex",
2125 key: "myapex.key",
2126 native_shared_libs: ["mylib", "mylib2"],
2127 min_sdk_version: "30",
2128 }
2129 `)
2130 expectLink := func(from, from_variant, to, to_variant string) {
2131 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2132 libFlags := ld.Args["libFlags"]
2133 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2134 }
Colin Crossaede88c2020-08-11 12:17:01 -07002135 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
2136 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002137}
2138
Jiyong Park7c2ee712018-12-07 00:42:25 +09002139func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002140 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002141 apex {
2142 name: "myapex",
2143 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002144 native_shared_libs: ["mylib"],
2145 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002146 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002147 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09002148 }
2149
2150 apex_key {
2151 name: "myapex.key",
2152 public_key: "testkey.avbpubkey",
2153 private_key: "testkey.pem",
2154 }
2155
2156 prebuilt_etc {
2157 name: "myetc",
2158 src: "myprebuilt",
2159 sub_dir: "foo/bar",
2160 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002161
2162 cc_library {
2163 name: "mylib",
2164 srcs: ["mylib.cpp"],
2165 relative_install_path: "foo/bar",
2166 system_shared_libs: [],
2167 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002168 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002169 }
2170
2171 cc_binary {
2172 name: "mybin",
2173 srcs: ["mylib.cpp"],
2174 relative_install_path: "foo/bar",
2175 system_shared_libs: [],
2176 static_executable: true,
2177 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002178 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002179 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002180 `)
2181
Sundong Ahnabb64432019-10-22 13:58:29 +09002182 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002183 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2184
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002185 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002186 ensureListContains(t, dirs, "etc")
2187 ensureListContains(t, dirs, "etc/foo")
2188 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002189 ensureListContains(t, dirs, "lib64")
2190 ensureListContains(t, dirs, "lib64/foo")
2191 ensureListContains(t, dirs, "lib64/foo/bar")
2192 ensureListContains(t, dirs, "lib")
2193 ensureListContains(t, dirs, "lib/foo")
2194 ensureListContains(t, dirs, "lib/foo/bar")
2195
Jiyong Parkbd13e442019-03-15 18:10:35 +09002196 ensureListContains(t, dirs, "bin")
2197 ensureListContains(t, dirs, "bin/foo")
2198 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002199}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002200
Jooyung Han35155c42020-02-06 17:33:20 +09002201func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2202 ctx, _ := testApex(t, `
2203 apex {
2204 name: "myapex",
2205 key: "myapex.key",
2206 multilib: {
2207 both: {
2208 native_shared_libs: ["mylib"],
2209 binaries: ["mybin"],
2210 },
2211 },
2212 compile_multilib: "both",
2213 native_bridge_supported: true,
2214 }
2215
2216 apex_key {
2217 name: "myapex.key",
2218 public_key: "testkey.avbpubkey",
2219 private_key: "testkey.pem",
2220 }
2221
2222 cc_library {
2223 name: "mylib",
2224 relative_install_path: "foo/bar",
2225 system_shared_libs: [],
2226 stl: "none",
2227 apex_available: [ "myapex" ],
2228 native_bridge_supported: true,
2229 }
2230
2231 cc_binary {
2232 name: "mybin",
2233 relative_install_path: "foo/bar",
2234 system_shared_libs: [],
2235 static_executable: true,
2236 stl: "none",
2237 apex_available: [ "myapex" ],
2238 native_bridge_supported: true,
2239 compile_multilib: "both", // default is "first" for binary
2240 multilib: {
2241 lib64: {
2242 suffix: "64",
2243 },
2244 },
2245 }
2246 `, withNativeBridgeEnabled)
2247 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2248 "bin/foo/bar/mybin",
2249 "bin/foo/bar/mybin64",
2250 "bin/arm/foo/bar/mybin",
2251 "bin/arm64/foo/bar/mybin64",
2252 "lib/foo/bar/mylib.so",
2253 "lib/arm/foo/bar/mylib.so",
2254 "lib64/foo/bar/mylib.so",
2255 "lib64/arm64/foo/bar/mylib.so",
2256 })
2257}
2258
Jiyong Parkda6eb592018-12-19 17:12:36 +09002259func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002260 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002261 apex {
2262 name: "myapex",
2263 key: "myapex.key",
2264 native_shared_libs: ["mylib"],
2265 use_vendor: true,
2266 }
2267
2268 apex_key {
2269 name: "myapex.key",
2270 public_key: "testkey.avbpubkey",
2271 private_key: "testkey.pem",
2272 }
2273
2274 cc_library {
2275 name: "mylib",
2276 srcs: ["mylib.cpp"],
2277 shared_libs: ["mylib2"],
2278 system_shared_libs: [],
2279 vendor_available: true,
2280 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002281 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002282 }
2283
2284 cc_library {
2285 name: "mylib2",
2286 srcs: ["mylib.cpp"],
2287 system_shared_libs: [],
2288 vendor_available: true,
2289 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002290 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002291 }
Jooyung Handc782442019-11-01 03:14:38 +09002292 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002293 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002294 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002295
2296 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002297 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002298 for _, implicit := range i.Implicits {
2299 inputsList = append(inputsList, implicit.String())
2300 }
2301 }
2302 inputsString := strings.Join(inputsList, " ")
2303
2304 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002305 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2306 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002307
2308 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002309 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2310 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002311}
Jiyong Park16e91a02018-12-20 18:18:08 +09002312
Jooyung Han85d61762020-06-24 23:50:26 +09002313func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002314 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2315 apex {
2316 name: "myapex",
2317 key: "myapex.key",
2318 use_vendor: true,
2319 }
2320 apex_key {
2321 name: "myapex.key",
2322 public_key: "testkey.avbpubkey",
2323 private_key: "testkey.pem",
2324 }
2325 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002326 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002327 })
Colin Cross440e0d02020-06-11 11:32:11 -07002328 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002329 testApex(t, `
2330 apex {
2331 name: "myapex",
2332 key: "myapex.key",
2333 use_vendor: true,
2334 }
2335 apex_key {
2336 name: "myapex.key",
2337 public_key: "testkey.avbpubkey",
2338 private_key: "testkey.pem",
2339 }
2340 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002341 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002342 })
2343}
2344
Jooyung Han5c998b92019-06-27 11:30:33 +09002345func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2346 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2347 apex {
2348 name: "myapex",
2349 key: "myapex.key",
2350 native_shared_libs: ["mylib"],
2351 use_vendor: true,
2352 }
2353
2354 apex_key {
2355 name: "myapex.key",
2356 public_key: "testkey.avbpubkey",
2357 private_key: "testkey.pem",
2358 }
2359
2360 cc_library {
2361 name: "mylib",
2362 srcs: ["mylib.cpp"],
2363 system_shared_libs: [],
2364 stl: "none",
2365 }
2366 `)
2367}
2368
Jooyung Han85d61762020-06-24 23:50:26 +09002369func TestVendorApex(t *testing.T) {
2370 ctx, config := testApex(t, `
2371 apex {
2372 name: "myapex",
2373 key: "myapex.key",
2374 binaries: ["mybin"],
2375 vendor: true,
2376 }
2377 apex_key {
2378 name: "myapex.key",
2379 public_key: "testkey.avbpubkey",
2380 private_key: "testkey.pem",
2381 }
2382 cc_binary {
2383 name: "mybin",
2384 vendor: true,
2385 shared_libs: ["libfoo"],
2386 }
2387 cc_library {
2388 name: "libfoo",
2389 proprietary: true,
2390 }
2391 `)
2392
2393 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2394 "bin/mybin",
2395 "lib64/libfoo.so",
2396 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2397 "lib64/libc++.so",
2398 })
2399
2400 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2401 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2402 name := apexBundle.BaseModuleName()
2403 prefix := "TARGET_"
2404 var builder strings.Builder
2405 data.Custom(&builder, name, prefix, "", data)
2406 androidMk := builder.String()
2407 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002408
2409 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2410 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2411 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002412}
2413
Jooyung Handf78e212020-07-22 15:54:47 +09002414func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2415 ctx, _ := testApex(t, `
2416 apex {
2417 name: "myapex",
2418 key: "myapex.key",
2419 binaries: ["mybin"],
2420 vendor: true,
2421 use_vndk_as_stable: true,
2422 }
2423 apex_key {
2424 name: "myapex.key",
2425 public_key: "testkey.avbpubkey",
2426 private_key: "testkey.pem",
2427 }
2428 cc_binary {
2429 name: "mybin",
2430 vendor: true,
2431 shared_libs: ["libvndk", "libvendor"],
2432 }
2433 cc_library {
2434 name: "libvndk",
2435 vndk: {
2436 enabled: true,
2437 },
2438 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002439 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002440 }
2441 cc_library {
2442 name: "libvendor",
2443 vendor: true,
2444 }
2445 `)
2446
2447 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2448
Colin Crossaede88c2020-08-11 12:17:01 -07002449 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002450 libs := names(ldRule.Args["libFlags"])
2451 // VNDK libs(libvndk/libc++) as they are
2452 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2453 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2454 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002455 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002456
2457 // VNDK libs are not included when use_vndk_as_stable: true
2458 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2459 "bin/mybin",
2460 "lib64/libvendor.so",
2461 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002462
2463 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2464 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2465 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002466}
2467
Jooyung Han8e5685d2020-09-21 11:02:57 +09002468func TestApex_withPrebuiltFirmware(t *testing.T) {
2469 testCases := []struct {
2470 name string
2471 additionalProp string
2472 }{
2473 {"system apex with prebuilt_firmware", ""},
2474 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2475 }
2476 for _, tc := range testCases {
2477 t.Run(tc.name, func(t *testing.T) {
2478 ctx, _ := testApex(t, `
2479 apex {
2480 name: "myapex",
2481 key: "myapex.key",
2482 prebuilts: ["myfirmware"],
2483 `+tc.additionalProp+`
2484 }
2485 apex_key {
2486 name: "myapex.key",
2487 public_key: "testkey.avbpubkey",
2488 private_key: "testkey.pem",
2489 }
2490 prebuilt_firmware {
2491 name: "myfirmware",
2492 src: "myfirmware.bin",
2493 filename_from_src: true,
2494 `+tc.additionalProp+`
2495 }
2496 `)
2497 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2498 "etc/firmware/myfirmware.bin",
2499 })
2500 })
2501 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002502}
2503
Jooyung Hanefb184e2020-06-25 17:14:25 +09002504func TestAndroidMk_UseVendorRequired(t *testing.T) {
2505 ctx, config := testApex(t, `
2506 apex {
2507 name: "myapex",
2508 key: "myapex.key",
2509 use_vendor: true,
2510 native_shared_libs: ["mylib"],
2511 }
2512
2513 apex_key {
2514 name: "myapex.key",
2515 public_key: "testkey.avbpubkey",
2516 private_key: "testkey.pem",
2517 }
2518
2519 cc_library {
2520 name: "mylib",
2521 vendor_available: true,
2522 apex_available: ["myapex"],
2523 }
2524 `, func(fs map[string][]byte, config android.Config) {
2525 setUseVendorAllowListForTest(config, []string{"myapex"})
2526 })
2527
2528 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2529 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2530 name := apexBundle.BaseModuleName()
2531 prefix := "TARGET_"
2532 var builder strings.Builder
2533 data.Custom(&builder, name, prefix, "", data)
2534 androidMk := builder.String()
2535 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2536}
2537
2538func TestAndroidMk_VendorApexRequired(t *testing.T) {
2539 ctx, config := testApex(t, `
2540 apex {
2541 name: "myapex",
2542 key: "myapex.key",
2543 vendor: true,
2544 native_shared_libs: ["mylib"],
2545 }
2546
2547 apex_key {
2548 name: "myapex.key",
2549 public_key: "testkey.avbpubkey",
2550 private_key: "testkey.pem",
2551 }
2552
2553 cc_library {
2554 name: "mylib",
2555 vendor_available: true,
2556 }
2557 `)
2558
2559 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2560 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2561 name := apexBundle.BaseModuleName()
2562 prefix := "TARGET_"
2563 var builder strings.Builder
2564 data.Custom(&builder, name, prefix, "", data)
2565 androidMk := builder.String()
2566 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2567}
2568
Jooyung Han2ed99d02020-06-24 23:26:26 +09002569func TestAndroidMkWritesCommonProperties(t *testing.T) {
2570 ctx, config := testApex(t, `
2571 apex {
2572 name: "myapex",
2573 key: "myapex.key",
2574 vintf_fragments: ["fragment.xml"],
2575 init_rc: ["init.rc"],
2576 }
2577 apex_key {
2578 name: "myapex.key",
2579 public_key: "testkey.avbpubkey",
2580 private_key: "testkey.pem",
2581 }
2582 cc_binary {
2583 name: "mybin",
2584 }
2585 `)
2586
2587 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2588 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2589 name := apexBundle.BaseModuleName()
2590 prefix := "TARGET_"
2591 var builder strings.Builder
2592 data.Custom(&builder, name, prefix, "", data)
2593 androidMk := builder.String()
2594 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2595 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2596}
2597
Jiyong Park16e91a02018-12-20 18:18:08 +09002598func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002599 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002600 apex {
2601 name: "myapex",
2602 key: "myapex.key",
2603 native_shared_libs: ["mylib"],
2604 }
2605
2606 apex_key {
2607 name: "myapex.key",
2608 public_key: "testkey.avbpubkey",
2609 private_key: "testkey.pem",
2610 }
2611
2612 cc_library {
2613 name: "mylib",
2614 srcs: ["mylib.cpp"],
2615 system_shared_libs: [],
2616 stl: "none",
2617 stubs: {
2618 versions: ["1", "2", "3"],
2619 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002620 apex_available: [
2621 "//apex_available:platform",
2622 "myapex",
2623 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002624 }
2625
2626 cc_binary {
2627 name: "not_in_apex",
2628 srcs: ["mylib.cpp"],
2629 static_libs: ["mylib"],
2630 static_executable: true,
2631 system_shared_libs: [],
2632 stl: "none",
2633 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002634 `)
2635
Colin Cross7113d202019-11-20 16:39:12 -08002636 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002637
2638 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002639 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002640}
Jiyong Park9335a262018-12-24 11:31:58 +09002641
2642func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002643 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002644 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002645 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002646 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002647 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002648 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002649 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002650 }
2651
2652 cc_library {
2653 name: "mylib",
2654 srcs: ["mylib.cpp"],
2655 system_shared_libs: [],
2656 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002657 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002658 }
2659
2660 apex_key {
2661 name: "myapex.key",
2662 public_key: "testkey.avbpubkey",
2663 private_key: "testkey.pem",
2664 }
2665
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002666 android_app_certificate {
2667 name: "myapex.certificate",
2668 certificate: "testkey",
2669 }
2670
2671 android_app_certificate {
2672 name: "myapex.certificate.override",
2673 certificate: "testkey.override",
2674 }
2675
Jiyong Park9335a262018-12-24 11:31:58 +09002676 `)
2677
2678 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002679 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002680
2681 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2682 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2683 "vendor/foo/devkeys/testkey.avbpubkey")
2684 }
2685 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2686 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2687 "vendor/foo/devkeys/testkey.pem")
2688 }
2689
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002690 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002691 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002692 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002693 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002694 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002695 }
2696}
Jiyong Park58e364a2019-01-19 19:24:06 +09002697
Jooyung Hanf121a652019-12-17 14:30:11 +09002698func TestCertificate(t *testing.T) {
2699 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2700 ctx, _ := testApex(t, `
2701 apex {
2702 name: "myapex",
2703 key: "myapex.key",
2704 }
2705 apex_key {
2706 name: "myapex.key",
2707 public_key: "testkey.avbpubkey",
2708 private_key: "testkey.pem",
2709 }`)
2710 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2711 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2712 if actual := rule.Args["certificates"]; actual != expected {
2713 t.Errorf("certificates should be %q, not %q", expected, actual)
2714 }
2715 })
2716 t.Run("override when unspecified", func(t *testing.T) {
2717 ctx, _ := testApex(t, `
2718 apex {
2719 name: "myapex_keytest",
2720 key: "myapex.key",
2721 file_contexts: ":myapex-file_contexts",
2722 }
2723 apex_key {
2724 name: "myapex.key",
2725 public_key: "testkey.avbpubkey",
2726 private_key: "testkey.pem",
2727 }
2728 android_app_certificate {
2729 name: "myapex.certificate.override",
2730 certificate: "testkey.override",
2731 }`)
2732 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2733 expected := "testkey.override.x509.pem testkey.override.pk8"
2734 if actual := rule.Args["certificates"]; actual != expected {
2735 t.Errorf("certificates should be %q, not %q", expected, actual)
2736 }
2737 })
2738 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2739 ctx, _ := testApex(t, `
2740 apex {
2741 name: "myapex",
2742 key: "myapex.key",
2743 certificate: ":myapex.certificate",
2744 }
2745 apex_key {
2746 name: "myapex.key",
2747 public_key: "testkey.avbpubkey",
2748 private_key: "testkey.pem",
2749 }
2750 android_app_certificate {
2751 name: "myapex.certificate",
2752 certificate: "testkey",
2753 }`)
2754 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2755 expected := "testkey.x509.pem testkey.pk8"
2756 if actual := rule.Args["certificates"]; actual != expected {
2757 t.Errorf("certificates should be %q, not %q", expected, actual)
2758 }
2759 })
2760 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2761 ctx, _ := testApex(t, `
2762 apex {
2763 name: "myapex_keytest",
2764 key: "myapex.key",
2765 file_contexts: ":myapex-file_contexts",
2766 certificate: ":myapex.certificate",
2767 }
2768 apex_key {
2769 name: "myapex.key",
2770 public_key: "testkey.avbpubkey",
2771 private_key: "testkey.pem",
2772 }
2773 android_app_certificate {
2774 name: "myapex.certificate.override",
2775 certificate: "testkey.override",
2776 }`)
2777 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2778 expected := "testkey.override.x509.pem testkey.override.pk8"
2779 if actual := rule.Args["certificates"]; actual != expected {
2780 t.Errorf("certificates should be %q, not %q", expected, actual)
2781 }
2782 })
2783 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2784 ctx, _ := testApex(t, `
2785 apex {
2786 name: "myapex",
2787 key: "myapex.key",
2788 certificate: "testkey",
2789 }
2790 apex_key {
2791 name: "myapex.key",
2792 public_key: "testkey.avbpubkey",
2793 private_key: "testkey.pem",
2794 }`)
2795 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2796 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2797 if actual := rule.Args["certificates"]; actual != expected {
2798 t.Errorf("certificates should be %q, not %q", expected, actual)
2799 }
2800 })
2801 t.Run("override when specified as <name>", func(t *testing.T) {
2802 ctx, _ := testApex(t, `
2803 apex {
2804 name: "myapex_keytest",
2805 key: "myapex.key",
2806 file_contexts: ":myapex-file_contexts",
2807 certificate: "testkey",
2808 }
2809 apex_key {
2810 name: "myapex.key",
2811 public_key: "testkey.avbpubkey",
2812 private_key: "testkey.pem",
2813 }
2814 android_app_certificate {
2815 name: "myapex.certificate.override",
2816 certificate: "testkey.override",
2817 }`)
2818 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2819 expected := "testkey.override.x509.pem testkey.override.pk8"
2820 if actual := rule.Args["certificates"]; actual != expected {
2821 t.Errorf("certificates should be %q, not %q", expected, actual)
2822 }
2823 })
2824}
2825
Jiyong Park58e364a2019-01-19 19:24:06 +09002826func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002827 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002828 apex {
2829 name: "myapex",
2830 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002831 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002832 }
2833
2834 apex {
2835 name: "otherapex",
2836 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002837 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002838 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002839 }
2840
2841 apex_key {
2842 name: "myapex.key",
2843 public_key: "testkey.avbpubkey",
2844 private_key: "testkey.pem",
2845 }
2846
2847 cc_library {
2848 name: "mylib",
2849 srcs: ["mylib.cpp"],
2850 system_shared_libs: [],
2851 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002852 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002853 "myapex",
2854 "otherapex",
2855 ],
Jooyung Han24282772020-03-21 23:20:55 +09002856 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002857 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002858 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002859 cc_library {
2860 name: "mylib2",
2861 srcs: ["mylib.cpp"],
2862 system_shared_libs: [],
2863 stl: "none",
2864 apex_available: [
2865 "myapex",
2866 "otherapex",
2867 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002868 static_libs: ["mylib3"],
2869 recovery_available: true,
2870 min_sdk_version: "29",
2871 }
2872 cc_library {
2873 name: "mylib3",
2874 srcs: ["mylib.cpp"],
2875 system_shared_libs: [],
2876 stl: "none",
2877 apex_available: [
2878 "myapex",
2879 "otherapex",
2880 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002881 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002882 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002883 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002884 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002885 `)
2886
Jooyung Hanc87a0592020-03-02 17:44:33 +09002887 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002888 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002889 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002890 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002891
Jooyung Hanccce2f22020-03-07 03:45:53 +09002892 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002893 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002894 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002895 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002896 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002897
Jooyung Hanccce2f22020-03-07 03:45:53 +09002898 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002899 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002900 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002901 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002902 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002903
Colin Crossaede88c2020-08-11 12:17:01 -07002904 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2905 // each variant defines additional macros to distinguish which apex variant it is built for
2906
2907 // non-APEX variant does not have __ANDROID_APEX__ defined
2908 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2909 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2910
2911 // APEX variant has __ANDROID_APEX__ defined
2912 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2913 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2914 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2915 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2916
2917 // APEX variant has __ANDROID_APEX__ defined
2918 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2919 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2920 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2921 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2922
Dan Albertb19953d2020-11-17 15:29:36 -08002923 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002924 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2925 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002926 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07002927
2928 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2929 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002930
2931 // non-APEX variant does not have __ANDROID_APEX__ defined
2932 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2933 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2934
2935 // APEX variant has __ANDROID_APEX__ defined
2936 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002937 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002938 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002939 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002940
Jooyung Hanc87a0592020-03-02 17:44:33 +09002941 // APEX variant has __ANDROID_APEX__ defined
2942 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002943 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002944 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002945 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002946
Dan Albertb19953d2020-11-17 15:29:36 -08002947 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002948 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002949 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002950 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002951}
Jiyong Park7e636d02019-01-28 16:16:54 +09002952
2953func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002954 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002955 apex {
2956 name: "myapex",
2957 key: "myapex.key",
2958 native_shared_libs: ["mylib"],
2959 }
2960
2961 apex_key {
2962 name: "myapex.key",
2963 public_key: "testkey.avbpubkey",
2964 private_key: "testkey.pem",
2965 }
2966
2967 cc_library_headers {
2968 name: "mylib_headers",
2969 export_include_dirs: ["my_include"],
2970 system_shared_libs: [],
2971 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002972 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002973 }
2974
2975 cc_library {
2976 name: "mylib",
2977 srcs: ["mylib.cpp"],
2978 system_shared_libs: [],
2979 stl: "none",
2980 header_libs: ["mylib_headers"],
2981 export_header_lib_headers: ["mylib_headers"],
2982 stubs: {
2983 versions: ["1", "2", "3"],
2984 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002985 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002986 }
2987
2988 cc_library {
2989 name: "otherlib",
2990 srcs: ["mylib.cpp"],
2991 system_shared_libs: [],
2992 stl: "none",
2993 shared_libs: ["mylib"],
2994 }
2995 `)
2996
Colin Cross7113d202019-11-20 16:39:12 -08002997 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002998
2999 // Ensure that the include path of the header lib is exported to 'otherlib'
3000 ensureContains(t, cFlags, "-Imy_include")
3001}
Alex Light9670d332019-01-29 18:07:33 -08003002
Jiyong Park7cd10e32020-01-14 09:22:18 +09003003type fileInApex struct {
3004 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003005 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003006 isLink bool
3007}
3008
Jooyung Hana57af4a2020-01-23 05:36:59 +00003009func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003010 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003011 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003012 copyCmds := apexRule.Args["copy_commands"]
3013 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003014 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003015 for _, cmd := range strings.Split(copyCmds, "&&") {
3016 cmd = strings.TrimSpace(cmd)
3017 if cmd == "" {
3018 continue
3019 }
3020 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003021 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003022 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003023 switch terms[0] {
3024 case "mkdir":
3025 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003026 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003027 t.Fatal("copyCmds contains invalid cp command", cmd)
3028 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003029 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003030 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003031 isLink = false
3032 case "ln":
3033 if len(terms) != 3 && len(terms) != 4 {
3034 // ln LINK TARGET or ln -s LINK TARGET
3035 t.Fatal("copyCmds contains invalid ln command", cmd)
3036 }
3037 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003038 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003039 isLink = true
3040 default:
3041 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3042 }
3043 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003044 index := strings.Index(dst, imageApexDir)
3045 if index == -1 {
3046 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3047 }
3048 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003049 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003050 }
3051 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003052 return ret
3053}
3054
Jooyung Hana57af4a2020-01-23 05:36:59 +00003055func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3056 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003057 var failed bool
3058 var surplus []string
3059 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003060 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003061 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003062 for _, expected := range files {
3063 if matched, _ := path.Match(expected, file.path); matched {
3064 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003065 mactchFound = true
3066 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003067 }
3068 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003069 if !mactchFound {
3070 surplus = append(surplus, file.path)
3071 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003072 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003073
Jooyung Han31c470b2019-10-18 16:26:59 +09003074 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003075 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003076 t.Log("surplus files", surplus)
3077 failed = true
3078 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003079
3080 if len(files) > len(filesMatched) {
3081 var missing []string
3082 for _, expected := range files {
3083 if !filesMatched[expected] {
3084 missing = append(missing, expected)
3085 }
3086 }
3087 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003088 t.Log("missing files", missing)
3089 failed = true
3090 }
3091 if failed {
3092 t.Fail()
3093 }
3094}
3095
Jooyung Han344d5432019-08-23 11:17:39 +09003096func TestVndkApexCurrent(t *testing.T) {
3097 ctx, _ := testApex(t, `
3098 apex_vndk {
3099 name: "myapex",
3100 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003101 }
3102
3103 apex_key {
3104 name: "myapex.key",
3105 public_key: "testkey.avbpubkey",
3106 private_key: "testkey.pem",
3107 }
3108
3109 cc_library {
3110 name: "libvndk",
3111 srcs: ["mylib.cpp"],
3112 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003113 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003114 vndk: {
3115 enabled: true,
3116 },
3117 system_shared_libs: [],
3118 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003119 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003120 }
3121
3122 cc_library {
3123 name: "libvndksp",
3124 srcs: ["mylib.cpp"],
3125 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003126 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003127 vndk: {
3128 enabled: true,
3129 support_system_process: true,
3130 },
3131 system_shared_libs: [],
3132 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003133 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003134 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003135 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003136
Jooyung Hana57af4a2020-01-23 05:36:59 +00003137 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003138 "lib/libvndk.so",
3139 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003140 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003141 "lib64/libvndk.so",
3142 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003143 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003144 "etc/llndk.libraries.VER.txt",
3145 "etc/vndkcore.libraries.VER.txt",
3146 "etc/vndksp.libraries.VER.txt",
3147 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003148 })
Jooyung Han344d5432019-08-23 11:17:39 +09003149}
3150
3151func TestVndkApexWithPrebuilt(t *testing.T) {
3152 ctx, _ := testApex(t, `
3153 apex_vndk {
3154 name: "myapex",
3155 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003156 }
3157
3158 apex_key {
3159 name: "myapex.key",
3160 public_key: "testkey.avbpubkey",
3161 private_key: "testkey.pem",
3162 }
3163
3164 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003165 name: "libvndk",
3166 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003167 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003168 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003169 vndk: {
3170 enabled: true,
3171 },
3172 system_shared_libs: [],
3173 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003174 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003175 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003176
3177 cc_prebuilt_library_shared {
3178 name: "libvndk.arm",
3179 srcs: ["libvndk.arm.so"],
3180 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003181 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003182 vndk: {
3183 enabled: true,
3184 },
3185 enabled: false,
3186 arch: {
3187 arm: {
3188 enabled: true,
3189 },
3190 },
3191 system_shared_libs: [],
3192 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003193 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003194 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003195 `+vndkLibrariesTxtFiles("current"),
3196 withFiles(map[string][]byte{
3197 "libvndk.so": nil,
3198 "libvndk.arm.so": nil,
3199 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003200
Jooyung Hana57af4a2020-01-23 05:36:59 +00003201 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003202 "lib/libvndk.so",
3203 "lib/libvndk.arm.so",
3204 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003205 "lib/libc++.so",
3206 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003207 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003208 })
Jooyung Han344d5432019-08-23 11:17:39 +09003209}
3210
Jooyung Han39edb6c2019-11-06 16:53:07 +09003211func vndkLibrariesTxtFiles(vers ...string) (result string) {
3212 for _, v := range vers {
3213 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09003214 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003215 result += `
3216 vndk_libraries_txt {
3217 name: "` + txt + `.libraries.txt",
3218 }
3219 `
3220 }
3221 } else {
3222 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3223 result += `
3224 prebuilt_etc {
3225 name: "` + txt + `.libraries.` + v + `.txt",
3226 src: "dummy.txt",
3227 }
3228 `
3229 }
3230 }
3231 }
3232 return
3233}
3234
Jooyung Han344d5432019-08-23 11:17:39 +09003235func TestVndkApexVersion(t *testing.T) {
3236 ctx, _ := testApex(t, `
3237 apex_vndk {
3238 name: "myapex_v27",
3239 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003240 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003241 vndk_version: "27",
3242 }
3243
3244 apex_key {
3245 name: "myapex.key",
3246 public_key: "testkey.avbpubkey",
3247 private_key: "testkey.pem",
3248 }
3249
Jooyung Han31c470b2019-10-18 16:26:59 +09003250 vndk_prebuilt_shared {
3251 name: "libvndk27",
3252 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003253 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003254 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003255 vndk: {
3256 enabled: true,
3257 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003258 target_arch: "arm64",
3259 arch: {
3260 arm: {
3261 srcs: ["libvndk27_arm.so"],
3262 },
3263 arm64: {
3264 srcs: ["libvndk27_arm64.so"],
3265 },
3266 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003267 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003268 }
3269
3270 vndk_prebuilt_shared {
3271 name: "libvndk27",
3272 version: "27",
3273 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003274 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003275 vndk: {
3276 enabled: true,
3277 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003278 target_arch: "x86_64",
3279 arch: {
3280 x86: {
3281 srcs: ["libvndk27_x86.so"],
3282 },
3283 x86_64: {
3284 srcs: ["libvndk27_x86_64.so"],
3285 },
3286 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003287 }
3288 `+vndkLibrariesTxtFiles("27"),
3289 withFiles(map[string][]byte{
3290 "libvndk27_arm.so": nil,
3291 "libvndk27_arm64.so": nil,
3292 "libvndk27_x86.so": nil,
3293 "libvndk27_x86_64.so": nil,
3294 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003295
Jooyung Hana57af4a2020-01-23 05:36:59 +00003296 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003297 "lib/libvndk27_arm.so",
3298 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003299 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003300 })
Jooyung Han344d5432019-08-23 11:17:39 +09003301}
3302
3303func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3304 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3305 apex_vndk {
3306 name: "myapex_v27",
3307 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003308 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003309 vndk_version: "27",
3310 }
3311 apex_vndk {
3312 name: "myapex_v27_other",
3313 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003314 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003315 vndk_version: "27",
3316 }
3317
3318 apex_key {
3319 name: "myapex.key",
3320 public_key: "testkey.avbpubkey",
3321 private_key: "testkey.pem",
3322 }
3323
3324 cc_library {
3325 name: "libvndk",
3326 srcs: ["mylib.cpp"],
3327 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003328 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003329 vndk: {
3330 enabled: true,
3331 },
3332 system_shared_libs: [],
3333 stl: "none",
3334 }
3335
3336 vndk_prebuilt_shared {
3337 name: "libvndk",
3338 version: "27",
3339 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003340 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003341 vndk: {
3342 enabled: true,
3343 },
3344 srcs: ["libvndk.so"],
3345 }
3346 `, withFiles(map[string][]byte{
3347 "libvndk.so": nil,
3348 }))
3349}
3350
Jooyung Han90eee022019-10-01 20:02:42 +09003351func TestVndkApexNameRule(t *testing.T) {
3352 ctx, _ := testApex(t, `
3353 apex_vndk {
3354 name: "myapex",
3355 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003356 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003357 }
3358 apex_vndk {
3359 name: "myapex_v28",
3360 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003361 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003362 vndk_version: "28",
3363 }
3364 apex_key {
3365 name: "myapex.key",
3366 public_key: "testkey.avbpubkey",
3367 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003368 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003369
3370 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003371 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003372 actual := proptools.String(bundle.properties.Apex_name)
3373 if !reflect.DeepEqual(actual, expected) {
3374 t.Errorf("Got '%v', expected '%v'", actual, expected)
3375 }
3376 }
3377
3378 assertApexName("com.android.vndk.vVER", "myapex")
3379 assertApexName("com.android.vndk.v28", "myapex_v28")
3380}
3381
Jooyung Han344d5432019-08-23 11:17:39 +09003382func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3383 ctx, _ := testApex(t, `
3384 apex_vndk {
3385 name: "myapex",
3386 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003387 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003388 }
3389
3390 apex_key {
3391 name: "myapex.key",
3392 public_key: "testkey.avbpubkey",
3393 private_key: "testkey.pem",
3394 }
3395
3396 cc_library {
3397 name: "libvndk",
3398 srcs: ["mylib.cpp"],
3399 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003400 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003401 native_bridge_supported: true,
3402 host_supported: true,
3403 vndk: {
3404 enabled: true,
3405 },
3406 system_shared_libs: [],
3407 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003408 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003409 }
Jooyung Han35155c42020-02-06 17:33:20 +09003410 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003411
Jooyung Hana57af4a2020-01-23 05:36:59 +00003412 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003413 "lib/libvndk.so",
3414 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003415 "lib/libc++.so",
3416 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003417 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003418 })
Jooyung Han344d5432019-08-23 11:17:39 +09003419}
3420
3421func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3422 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3423 apex_vndk {
3424 name: "myapex",
3425 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003426 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003427 native_bridge_supported: true,
3428 }
3429
3430 apex_key {
3431 name: "myapex.key",
3432 public_key: "testkey.avbpubkey",
3433 private_key: "testkey.pem",
3434 }
3435
3436 cc_library {
3437 name: "libvndk",
3438 srcs: ["mylib.cpp"],
3439 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003440 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003441 native_bridge_supported: true,
3442 host_supported: true,
3443 vndk: {
3444 enabled: true,
3445 },
3446 system_shared_libs: [],
3447 stl: "none",
3448 }
3449 `)
3450}
3451
Jooyung Han31c470b2019-10-18 16:26:59 +09003452func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003453 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003454 apex_vndk {
3455 name: "myapex_v27",
3456 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003457 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003458 vndk_version: "27",
3459 }
3460
3461 apex_key {
3462 name: "myapex.key",
3463 public_key: "testkey.avbpubkey",
3464 private_key: "testkey.pem",
3465 }
3466
3467 vndk_prebuilt_shared {
3468 name: "libvndk27",
3469 version: "27",
3470 target_arch: "arm",
3471 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003472 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003473 vndk: {
3474 enabled: true,
3475 },
3476 arch: {
3477 arm: {
3478 srcs: ["libvndk27.so"],
3479 }
3480 },
3481 }
3482
3483 vndk_prebuilt_shared {
3484 name: "libvndk27",
3485 version: "27",
3486 target_arch: "arm",
3487 binder32bit: true,
3488 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003489 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003490 vndk: {
3491 enabled: true,
3492 },
3493 arch: {
3494 arm: {
3495 srcs: ["libvndk27binder32.so"],
3496 }
3497 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003498 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003499 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003500 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003501 withFiles(map[string][]byte{
3502 "libvndk27.so": nil,
3503 "libvndk27binder32.so": nil,
3504 }),
3505 withBinder32bit,
3506 withTargets(map[android.OsType][]android.Target{
3507 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003508 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3509 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003510 },
3511 }),
3512 )
3513
Jooyung Hana57af4a2020-01-23 05:36:59 +00003514 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003515 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003516 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003517 })
3518}
3519
Jooyung Han45a96772020-06-15 14:59:42 +09003520func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3521 ctx, _ := testApex(t, `
3522 apex_vndk {
3523 name: "myapex",
3524 key: "myapex.key",
3525 file_contexts: ":myapex-file_contexts",
3526 }
3527
3528 apex_key {
3529 name: "myapex.key",
3530 public_key: "testkey.avbpubkey",
3531 private_key: "testkey.pem",
3532 }
3533
3534 cc_library {
3535 name: "libz",
3536 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003537 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003538 vndk: {
3539 enabled: true,
3540 },
3541 stubs: {
3542 symbol_file: "libz.map.txt",
3543 versions: ["30"],
3544 }
3545 }
3546 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3547 "libz.map.txt": nil,
3548 }))
3549
3550 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3551 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3552 ensureListEmpty(t, provideNativeLibs)
3553}
3554
Jooyung Hane1633032019-08-01 17:41:43 +09003555func TestDependenciesInApexManifest(t *testing.T) {
3556 ctx, _ := testApex(t, `
3557 apex {
3558 name: "myapex_nodep",
3559 key: "myapex.key",
3560 native_shared_libs: ["lib_nodep"],
3561 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003562 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003563 }
3564
3565 apex {
3566 name: "myapex_dep",
3567 key: "myapex.key",
3568 native_shared_libs: ["lib_dep"],
3569 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003570 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003571 }
3572
3573 apex {
3574 name: "myapex_provider",
3575 key: "myapex.key",
3576 native_shared_libs: ["libfoo"],
3577 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003578 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003579 }
3580
3581 apex {
3582 name: "myapex_selfcontained",
3583 key: "myapex.key",
3584 native_shared_libs: ["lib_dep", "libfoo"],
3585 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003586 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003587 }
3588
3589 apex_key {
3590 name: "myapex.key",
3591 public_key: "testkey.avbpubkey",
3592 private_key: "testkey.pem",
3593 }
3594
3595 cc_library {
3596 name: "lib_nodep",
3597 srcs: ["mylib.cpp"],
3598 system_shared_libs: [],
3599 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003600 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003601 }
3602
3603 cc_library {
3604 name: "lib_dep",
3605 srcs: ["mylib.cpp"],
3606 shared_libs: ["libfoo"],
3607 system_shared_libs: [],
3608 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003609 apex_available: [
3610 "myapex_dep",
3611 "myapex_provider",
3612 "myapex_selfcontained",
3613 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003614 }
3615
3616 cc_library {
3617 name: "libfoo",
3618 srcs: ["mytest.cpp"],
3619 stubs: {
3620 versions: ["1"],
3621 },
3622 system_shared_libs: [],
3623 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003624 apex_available: [
3625 "myapex_provider",
3626 "myapex_selfcontained",
3627 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003628 }
3629 `)
3630
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003631 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003632 var provideNativeLibs, requireNativeLibs []string
3633
Sundong Ahnabb64432019-10-22 13:58:29 +09003634 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003635 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3636 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003637 ensureListEmpty(t, provideNativeLibs)
3638 ensureListEmpty(t, requireNativeLibs)
3639
Sundong Ahnabb64432019-10-22 13:58:29 +09003640 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003641 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3642 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003643 ensureListEmpty(t, provideNativeLibs)
3644 ensureListContains(t, requireNativeLibs, "libfoo.so")
3645
Sundong Ahnabb64432019-10-22 13:58:29 +09003646 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003647 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3648 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003649 ensureListContains(t, provideNativeLibs, "libfoo.so")
3650 ensureListEmpty(t, requireNativeLibs)
3651
Sundong Ahnabb64432019-10-22 13:58:29 +09003652 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003653 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3654 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003655 ensureListContains(t, provideNativeLibs, "libfoo.so")
3656 ensureListEmpty(t, requireNativeLibs)
3657}
3658
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003659func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003660 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003661 apex {
3662 name: "myapex",
3663 key: "myapex.key",
3664 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003665 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003666 }
3667
3668 apex_key {
3669 name: "myapex.key",
3670 public_key: "testkey.avbpubkey",
3671 private_key: "testkey.pem",
3672 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003673
3674 cc_library {
3675 name: "mylib",
3676 srcs: ["mylib.cpp"],
3677 system_shared_libs: [],
3678 stl: "none",
3679 apex_available: [
3680 "//apex_available:platform",
3681 "myapex",
3682 ],
3683 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003684 `)
3685
Sundong Ahnabb64432019-10-22 13:58:29 +09003686 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003687 apexManifestRule := module.Rule("apexManifestRule")
3688 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3689 apexRule := module.Rule("apexRule")
3690 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003691
3692 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3693 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3694 name := apexBundle.BaseModuleName()
3695 prefix := "TARGET_"
3696 var builder strings.Builder
3697 data.Custom(&builder, name, prefix, "", data)
3698 androidMk := builder.String()
3699 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3700 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003701}
3702
Alex Light0851b882019-02-07 13:20:53 -08003703func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003704 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003705 apex {
3706 name: "myapex",
3707 key: "myapex.key",
3708 native_shared_libs: ["mylib_common"],
3709 }
3710
3711 apex_key {
3712 name: "myapex.key",
3713 public_key: "testkey.avbpubkey",
3714 private_key: "testkey.pem",
3715 }
3716
3717 cc_library {
3718 name: "mylib_common",
3719 srcs: ["mylib.cpp"],
3720 system_shared_libs: [],
3721 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003722 apex_available: [
3723 "//apex_available:platform",
3724 "myapex",
3725 ],
Alex Light0851b882019-02-07 13:20:53 -08003726 }
3727 `)
3728
Sundong Ahnabb64432019-10-22 13:58:29 +09003729 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003730 apexRule := module.Rule("apexRule")
3731 copyCmds := apexRule.Args["copy_commands"]
3732
3733 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3734 t.Log("Apex was a test apex!")
3735 t.Fail()
3736 }
3737 // Ensure that main rule creates an output
3738 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3739
3740 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003741 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003742
3743 // Ensure that both direct and indirect deps are copied into apex
3744 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3745
Colin Cross7113d202019-11-20 16:39:12 -08003746 // Ensure that the platform variant ends with _shared
3747 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003748
Colin Cross56a83212020-09-15 18:30:11 -07003749 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003750 t.Log("Found mylib_common not in any apex!")
3751 t.Fail()
3752 }
3753}
3754
3755func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003756 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003757 apex_test {
3758 name: "myapex",
3759 key: "myapex.key",
3760 native_shared_libs: ["mylib_common_test"],
3761 }
3762
3763 apex_key {
3764 name: "myapex.key",
3765 public_key: "testkey.avbpubkey",
3766 private_key: "testkey.pem",
3767 }
3768
3769 cc_library {
3770 name: "mylib_common_test",
3771 srcs: ["mylib.cpp"],
3772 system_shared_libs: [],
3773 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003774 // TODO: remove //apex_available:platform
3775 apex_available: [
3776 "//apex_available:platform",
3777 "myapex",
3778 ],
Alex Light0851b882019-02-07 13:20:53 -08003779 }
3780 `)
3781
Sundong Ahnabb64432019-10-22 13:58:29 +09003782 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003783 apexRule := module.Rule("apexRule")
3784 copyCmds := apexRule.Args["copy_commands"]
3785
3786 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3787 t.Log("Apex was not a test apex!")
3788 t.Fail()
3789 }
3790 // Ensure that main rule creates an output
3791 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3792
3793 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003794 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003795
3796 // Ensure that both direct and indirect deps are copied into apex
3797 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3798
Colin Cross7113d202019-11-20 16:39:12 -08003799 // Ensure that the platform variant ends with _shared
3800 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003801}
3802
Alex Light9670d332019-01-29 18:07:33 -08003803func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003804 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003805 apex {
3806 name: "myapex",
3807 key: "myapex.key",
3808 multilib: {
3809 first: {
3810 native_shared_libs: ["mylib_common"],
3811 }
3812 },
3813 target: {
3814 android: {
3815 multilib: {
3816 first: {
3817 native_shared_libs: ["mylib"],
3818 }
3819 }
3820 },
3821 host: {
3822 multilib: {
3823 first: {
3824 native_shared_libs: ["mylib2"],
3825 }
3826 }
3827 }
3828 }
3829 }
3830
3831 apex_key {
3832 name: "myapex.key",
3833 public_key: "testkey.avbpubkey",
3834 private_key: "testkey.pem",
3835 }
3836
3837 cc_library {
3838 name: "mylib",
3839 srcs: ["mylib.cpp"],
3840 system_shared_libs: [],
3841 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003842 // TODO: remove //apex_available:platform
3843 apex_available: [
3844 "//apex_available:platform",
3845 "myapex",
3846 ],
Alex Light9670d332019-01-29 18:07:33 -08003847 }
3848
3849 cc_library {
3850 name: "mylib_common",
3851 srcs: ["mylib.cpp"],
3852 system_shared_libs: [],
3853 stl: "none",
3854 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003855 // TODO: remove //apex_available:platform
3856 apex_available: [
3857 "//apex_available:platform",
3858 "myapex",
3859 ],
Alex Light9670d332019-01-29 18:07:33 -08003860 }
3861
3862 cc_library {
3863 name: "mylib2",
3864 srcs: ["mylib.cpp"],
3865 system_shared_libs: [],
3866 stl: "none",
3867 compile_multilib: "first",
3868 }
3869 `)
3870
Sundong Ahnabb64432019-10-22 13:58:29 +09003871 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003872 copyCmds := apexRule.Args["copy_commands"]
3873
3874 // Ensure that main rule creates an output
3875 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3876
3877 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003878 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3879 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3880 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003881
3882 // Ensure that both direct and indirect deps are copied into apex
3883 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3884 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3885 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3886
Colin Cross7113d202019-11-20 16:39:12 -08003887 // Ensure that the platform variant ends with _shared
3888 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3889 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3890 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003891}
Jiyong Park04480cf2019-02-06 00:16:29 +09003892
3893func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003894 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003895 apex {
3896 name: "myapex",
3897 key: "myapex.key",
3898 binaries: ["myscript"],
3899 }
3900
3901 apex_key {
3902 name: "myapex.key",
3903 public_key: "testkey.avbpubkey",
3904 private_key: "testkey.pem",
3905 }
3906
3907 sh_binary {
3908 name: "myscript",
3909 src: "mylib.cpp",
3910 filename: "myscript.sh",
3911 sub_dir: "script",
3912 }
3913 `)
3914
Sundong Ahnabb64432019-10-22 13:58:29 +09003915 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003916 copyCmds := apexRule.Args["copy_commands"]
3917
3918 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3919}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003920
Jooyung Han91df2082019-11-20 01:49:42 +09003921func TestApexInVariousPartition(t *testing.T) {
3922 testcases := []struct {
3923 propName, parition, flattenedPartition string
3924 }{
3925 {"", "system", "system_ext"},
3926 {"product_specific: true", "product", "product"},
3927 {"soc_specific: true", "vendor", "vendor"},
3928 {"proprietary: true", "vendor", "vendor"},
3929 {"vendor: true", "vendor", "vendor"},
3930 {"system_ext_specific: true", "system_ext", "system_ext"},
3931 }
3932 for _, tc := range testcases {
3933 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3934 ctx, _ := testApex(t, `
3935 apex {
3936 name: "myapex",
3937 key: "myapex.key",
3938 `+tc.propName+`
3939 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003940
Jooyung Han91df2082019-11-20 01:49:42 +09003941 apex_key {
3942 name: "myapex.key",
3943 public_key: "testkey.avbpubkey",
3944 private_key: "testkey.pem",
3945 }
3946 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003947
Jooyung Han91df2082019-11-20 01:49:42 +09003948 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3949 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3950 actual := apex.installDir.String()
3951 if actual != expected {
3952 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3953 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003954
Jooyung Han91df2082019-11-20 01:49:42 +09003955 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3956 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3957 actual = flattened.installDir.String()
3958 if actual != expected {
3959 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3960 }
3961 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003962 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003963}
Jiyong Park67882562019-03-21 01:11:21 +09003964
Jooyung Han580eb4f2020-06-24 19:33:06 +09003965func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003966 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003967 apex {
3968 name: "myapex",
3969 key: "myapex.key",
3970 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003971
Jooyung Han580eb4f2020-06-24 19:33:06 +09003972 apex_key {
3973 name: "myapex.key",
3974 public_key: "testkey.avbpubkey",
3975 private_key: "testkey.pem",
3976 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003977 `)
3978 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003979 rule := module.Output("file_contexts")
3980 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3981}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003982
Jooyung Han580eb4f2020-06-24 19:33:06 +09003983func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003984 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003985 apex {
3986 name: "myapex",
3987 key: "myapex.key",
3988 file_contexts: "my_own_file_contexts",
3989 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003990
Jooyung Han580eb4f2020-06-24 19:33:06 +09003991 apex_key {
3992 name: "myapex.key",
3993 public_key: "testkey.avbpubkey",
3994 private_key: "testkey.pem",
3995 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003996 `, withFiles(map[string][]byte{
3997 "my_own_file_contexts": nil,
3998 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003999}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004000
Jooyung Han580eb4f2020-06-24 19:33:06 +09004001func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004002 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004003 apex {
4004 name: "myapex",
4005 key: "myapex.key",
4006 product_specific: true,
4007 file_contexts: "product_specific_file_contexts",
4008 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004009
Jooyung Han580eb4f2020-06-24 19:33:06 +09004010 apex_key {
4011 name: "myapex.key",
4012 public_key: "testkey.avbpubkey",
4013 private_key: "testkey.pem",
4014 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004015 `)
4016
Jooyung Han580eb4f2020-06-24 19:33:06 +09004017 ctx, _ := testApex(t, `
4018 apex {
4019 name: "myapex",
4020 key: "myapex.key",
4021 product_specific: true,
4022 file_contexts: "product_specific_file_contexts",
4023 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004024
Jooyung Han580eb4f2020-06-24 19:33:06 +09004025 apex_key {
4026 name: "myapex.key",
4027 public_key: "testkey.avbpubkey",
4028 private_key: "testkey.pem",
4029 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004030 `, withFiles(map[string][]byte{
4031 "product_specific_file_contexts": nil,
4032 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004033 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4034 rule := module.Output("file_contexts")
4035 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4036}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004037
Jooyung Han580eb4f2020-06-24 19:33:06 +09004038func TestFileContexts_SetViaFileGroup(t *testing.T) {
4039 ctx, _ := testApex(t, `
4040 apex {
4041 name: "myapex",
4042 key: "myapex.key",
4043 product_specific: true,
4044 file_contexts: ":my-file-contexts",
4045 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004046
Jooyung Han580eb4f2020-06-24 19:33:06 +09004047 apex_key {
4048 name: "myapex.key",
4049 public_key: "testkey.avbpubkey",
4050 private_key: "testkey.pem",
4051 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004052
Jooyung Han580eb4f2020-06-24 19:33:06 +09004053 filegroup {
4054 name: "my-file-contexts",
4055 srcs: ["product_specific_file_contexts"],
4056 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004057 `, withFiles(map[string][]byte{
4058 "product_specific_file_contexts": nil,
4059 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004060 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4061 rule := module.Output("file_contexts")
4062 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004063}
4064
Jiyong Park67882562019-03-21 01:11:21 +09004065func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004066 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004067 apex_key {
4068 name: "myapex.key",
4069 public_key: ":my.avbpubkey",
4070 private_key: ":my.pem",
4071 product_specific: true,
4072 }
4073
4074 filegroup {
4075 name: "my.avbpubkey",
4076 srcs: ["testkey2.avbpubkey"],
4077 }
4078
4079 filegroup {
4080 name: "my.pem",
4081 srcs: ["testkey2.pem"],
4082 }
4083 `)
4084
4085 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4086 expected_pubkey := "testkey2.avbpubkey"
4087 actual_pubkey := apex_key.public_key_file.String()
4088 if actual_pubkey != expected_pubkey {
4089 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4090 }
4091 expected_privkey := "testkey2.pem"
4092 actual_privkey := apex_key.private_key_file.String()
4093 if actual_privkey != expected_privkey {
4094 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4095 }
4096}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004097
4098func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004099 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004100 prebuilt_apex {
4101 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004102 arch: {
4103 arm64: {
4104 src: "myapex-arm64.apex",
4105 },
4106 arm: {
4107 src: "myapex-arm.apex",
4108 },
4109 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004110 }
4111 `)
4112
4113 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4114
Jiyong Parkc95714e2019-03-29 14:23:10 +09004115 expectedInput := "myapex-arm64.apex"
4116 if prebuilt.inputApex.String() != expectedInput {
4117 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4118 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004119}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004120
4121func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004122 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004123 prebuilt_apex {
4124 name: "myapex",
4125 src: "myapex-arm.apex",
4126 filename: "notmyapex.apex",
4127 }
4128 `)
4129
4130 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4131
4132 expected := "notmyapex.apex"
4133 if p.installFilename != expected {
4134 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4135 }
4136}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004137
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004138func TestPrebuiltOverrides(t *testing.T) {
4139 ctx, config := testApex(t, `
4140 prebuilt_apex {
4141 name: "myapex.prebuilt",
4142 src: "myapex-arm.apex",
4143 overrides: [
4144 "myapex",
4145 ],
4146 }
4147 `)
4148
4149 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4150
4151 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09004152 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004153 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004154 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004155 }
4156}
4157
Roland Levillain630846d2019-06-26 12:48:34 +01004158func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004159 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004160 apex_test {
4161 name: "myapex",
4162 key: "myapex.key",
4163 tests: [
4164 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004165 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004166 ],
4167 }
4168
4169 apex_key {
4170 name: "myapex.key",
4171 public_key: "testkey.avbpubkey",
4172 private_key: "testkey.pem",
4173 }
4174
Liz Kammer1c14a212020-05-12 15:26:55 -07004175 filegroup {
4176 name: "fg",
4177 srcs: [
4178 "baz",
4179 "bar/baz"
4180 ],
4181 }
4182
Roland Levillain630846d2019-06-26 12:48:34 +01004183 cc_test {
4184 name: "mytest",
4185 gtest: false,
4186 srcs: ["mytest.cpp"],
4187 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004188 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004189 system_shared_libs: [],
4190 static_executable: true,
4191 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004192 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004193 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004194
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004195 cc_library {
4196 name: "mylib",
4197 srcs: ["mylib.cpp"],
4198 system_shared_libs: [],
4199 stl: "none",
4200 }
4201
Liz Kammer5bd365f2020-05-27 15:15:11 -07004202 filegroup {
4203 name: "fg2",
4204 srcs: [
4205 "testdata/baz"
4206 ],
4207 }
4208
Roland Levillain9b5fde92019-06-28 15:41:19 +01004209 cc_test {
4210 name: "mytests",
4211 gtest: false,
4212 srcs: [
4213 "mytest1.cpp",
4214 "mytest2.cpp",
4215 "mytest3.cpp",
4216 ],
4217 test_per_src: true,
4218 relative_install_path: "test",
4219 system_shared_libs: [],
4220 static_executable: true,
4221 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004222 data: [
4223 ":fg",
4224 ":fg2",
4225 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004226 }
Roland Levillain630846d2019-06-26 12:48:34 +01004227 `)
4228
Sundong Ahnabb64432019-10-22 13:58:29 +09004229 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004230 copyCmds := apexRule.Args["copy_commands"]
4231
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004232 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004233 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004234 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004235
Liz Kammer1c14a212020-05-12 15:26:55 -07004236 //Ensure that test data are copied into apex.
4237 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4238 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4239
Roland Levillain9b5fde92019-06-28 15:41:19 +01004240 // Ensure that test deps built with `test_per_src` are copied into apex.
4241 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4242 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4243 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004244
4245 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004246 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4247 data := android.AndroidMkDataForTest(t, config, "", bundle)
4248 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004249 prefix := "TARGET_"
4250 var builder strings.Builder
4251 data.Custom(&builder, name, prefix, "", data)
4252 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004253 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4254 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4255 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4256 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004257 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004258 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004259 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004260
4261 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4262 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4263 data.Custom(&builder, name, prefix, "", data)
4264 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004265 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4266 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004267}
4268
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004269func TestInstallExtraFlattenedApexes(t *testing.T) {
4270 ctx, config := testApex(t, `
4271 apex {
4272 name: "myapex",
4273 key: "myapex.key",
4274 }
4275 apex_key {
4276 name: "myapex.key",
4277 public_key: "testkey.avbpubkey",
4278 private_key: "testkey.pem",
4279 }
4280 `, func(fs map[string][]byte, config android.Config) {
4281 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4282 })
4283 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004284 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004285 mk := android.AndroidMkDataForTest(t, config, "", ab)
4286 var builder strings.Builder
4287 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4288 androidMk := builder.String()
4289 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4290}
4291
Jooyung Hand48f3c32019-08-23 11:18:57 +09004292func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4293 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4294 apex {
4295 name: "myapex",
4296 key: "myapex.key",
4297 native_shared_libs: ["libfoo"],
4298 }
4299
4300 apex_key {
4301 name: "myapex.key",
4302 public_key: "testkey.avbpubkey",
4303 private_key: "testkey.pem",
4304 }
4305
4306 cc_library {
4307 name: "libfoo",
4308 stl: "none",
4309 system_shared_libs: [],
4310 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004311 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004312 }
4313 `)
4314 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4315 apex {
4316 name: "myapex",
4317 key: "myapex.key",
4318 java_libs: ["myjar"],
4319 }
4320
4321 apex_key {
4322 name: "myapex.key",
4323 public_key: "testkey.avbpubkey",
4324 private_key: "testkey.pem",
4325 }
4326
4327 java_library {
4328 name: "myjar",
4329 srcs: ["foo/bar/MyClass.java"],
4330 sdk_version: "none",
4331 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004332 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004333 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004334 }
4335 `)
4336}
4337
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004338func TestApexWithApps(t *testing.T) {
4339 ctx, _ := testApex(t, `
4340 apex {
4341 name: "myapex",
4342 key: "myapex.key",
4343 apps: [
4344 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004345 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004346 ],
4347 }
4348
4349 apex_key {
4350 name: "myapex.key",
4351 public_key: "testkey.avbpubkey",
4352 private_key: "testkey.pem",
4353 }
4354
4355 android_app {
4356 name: "AppFoo",
4357 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004358 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004359 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004360 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004361 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004362 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004363 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004364
4365 android_app {
4366 name: "AppFooPriv",
4367 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004368 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004369 system_modules: "none",
4370 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004371 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004372 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004373 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004374
4375 cc_library_shared {
4376 name: "libjni",
4377 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004378 shared_libs: ["libfoo"],
4379 stl: "none",
4380 system_shared_libs: [],
4381 apex_available: [ "myapex" ],
4382 sdk_version: "current",
4383 }
4384
4385 cc_library_shared {
4386 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004387 stl: "none",
4388 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004389 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004390 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004391 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004392 `)
4393
Sundong Ahnabb64432019-10-22 13:58:29 +09004394 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004395 apexRule := module.Rule("apexRule")
4396 copyCmds := apexRule.Args["copy_commands"]
4397
4398 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004399 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004400
Colin Crossaede88c2020-08-11 12:17:01 -07004401 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004402 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004403 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004404 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004405 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004406 // JNI libraries including transitive deps are
4407 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004408 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004409 // ... embedded inside APK (jnilibs.zip)
4410 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4411 // ... and not directly inside the APEX
4412 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4413 }
Dario Frenicde2a032019-10-27 00:29:22 +01004414}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004415
Dario Frenicde2a032019-10-27 00:29:22 +01004416func TestApexWithAppImports(t *testing.T) {
4417 ctx, _ := testApex(t, `
4418 apex {
4419 name: "myapex",
4420 key: "myapex.key",
4421 apps: [
4422 "AppFooPrebuilt",
4423 "AppFooPrivPrebuilt",
4424 ],
4425 }
4426
4427 apex_key {
4428 name: "myapex.key",
4429 public_key: "testkey.avbpubkey",
4430 private_key: "testkey.pem",
4431 }
4432
4433 android_app_import {
4434 name: "AppFooPrebuilt",
4435 apk: "PrebuiltAppFoo.apk",
4436 presigned: true,
4437 dex_preopt: {
4438 enabled: false,
4439 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004440 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004441 }
4442
4443 android_app_import {
4444 name: "AppFooPrivPrebuilt",
4445 apk: "PrebuiltAppFooPriv.apk",
4446 privileged: true,
4447 presigned: true,
4448 dex_preopt: {
4449 enabled: false,
4450 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004451 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004452 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004453 }
4454 `)
4455
Sundong Ahnabb64432019-10-22 13:58:29 +09004456 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004457 apexRule := module.Rule("apexRule")
4458 copyCmds := apexRule.Args["copy_commands"]
4459
4460 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004461 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4462}
4463
4464func TestApexWithAppImportsPrefer(t *testing.T) {
4465 ctx, _ := testApex(t, `
4466 apex {
4467 name: "myapex",
4468 key: "myapex.key",
4469 apps: [
4470 "AppFoo",
4471 ],
4472 }
4473
4474 apex_key {
4475 name: "myapex.key",
4476 public_key: "testkey.avbpubkey",
4477 private_key: "testkey.pem",
4478 }
4479
4480 android_app {
4481 name: "AppFoo",
4482 srcs: ["foo/bar/MyClass.java"],
4483 sdk_version: "none",
4484 system_modules: "none",
4485 apex_available: [ "myapex" ],
4486 }
4487
4488 android_app_import {
4489 name: "AppFoo",
4490 apk: "AppFooPrebuilt.apk",
4491 filename: "AppFooPrebuilt.apk",
4492 presigned: true,
4493 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004494 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004495 }
4496 `, withFiles(map[string][]byte{
4497 "AppFooPrebuilt.apk": nil,
4498 }))
4499
4500 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4501 "app/AppFoo/AppFooPrebuilt.apk",
4502 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004503}
4504
Dario Freni6f3937c2019-12-20 22:58:03 +00004505func TestApexWithTestHelperApp(t *testing.T) {
4506 ctx, _ := testApex(t, `
4507 apex {
4508 name: "myapex",
4509 key: "myapex.key",
4510 apps: [
4511 "TesterHelpAppFoo",
4512 ],
4513 }
4514
4515 apex_key {
4516 name: "myapex.key",
4517 public_key: "testkey.avbpubkey",
4518 private_key: "testkey.pem",
4519 }
4520
4521 android_test_helper_app {
4522 name: "TesterHelpAppFoo",
4523 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004524 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004525 }
4526
4527 `)
4528
4529 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4530 apexRule := module.Rule("apexRule")
4531 copyCmds := apexRule.Args["copy_commands"]
4532
4533 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4534}
4535
Jooyung Han18020ea2019-11-13 10:50:48 +09004536func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4537 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00004538 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004539 apex {
4540 name: "myapex",
4541 key: "myapex.key",
4542 native_shared_libs: ["libfoo"],
4543 }
4544
4545 apex_key {
4546 name: "myapex.key",
4547 public_key: "testkey.avbpubkey",
4548 private_key: "testkey.pem",
4549 }
4550
4551 apex {
4552 name: "otherapex",
4553 key: "myapex.key",
4554 native_shared_libs: ["libfoo"],
4555 }
4556
4557 cc_defaults {
4558 name: "libfoo-defaults",
4559 apex_available: ["otherapex"],
4560 }
4561
4562 cc_library {
4563 name: "libfoo",
4564 defaults: ["libfoo-defaults"],
4565 stl: "none",
4566 system_shared_libs: [],
4567 }`)
4568}
4569
Paul Duffine52e66f2020-03-30 17:54:29 +01004570func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004571 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00004572 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09004573 apex {
4574 name: "myapex",
4575 key: "myapex.key",
4576 native_shared_libs: ["libfoo"],
4577 }
4578
4579 apex_key {
4580 name: "myapex.key",
4581 public_key: "testkey.avbpubkey",
4582 private_key: "testkey.pem",
4583 }
4584
4585 apex {
4586 name: "otherapex",
4587 key: "otherapex.key",
4588 native_shared_libs: ["libfoo"],
4589 }
4590
4591 apex_key {
4592 name: "otherapex.key",
4593 public_key: "testkey.avbpubkey",
4594 private_key: "testkey.pem",
4595 }
4596
4597 cc_library {
4598 name: "libfoo",
4599 stl: "none",
4600 system_shared_libs: [],
4601 apex_available: ["otherapex"],
4602 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004603}
Jiyong Park127b40b2019-09-30 16:04:35 +09004604
Paul Duffine52e66f2020-03-30 17:54:29 +01004605func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004606 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00004607 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004608.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004609.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004610.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004611.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004612.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004613.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004614 apex {
4615 name: "myapex",
4616 key: "myapex.key",
4617 native_shared_libs: ["libfoo"],
4618 }
4619
4620 apex_key {
4621 name: "myapex.key",
4622 public_key: "testkey.avbpubkey",
4623 private_key: "testkey.pem",
4624 }
4625
Jiyong Park127b40b2019-09-30 16:04:35 +09004626 cc_library {
4627 name: "libfoo",
4628 stl: "none",
4629 shared_libs: ["libbar"],
4630 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004631 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004632 }
4633
4634 cc_library {
4635 name: "libbar",
4636 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004637 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004638 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004639 apex_available: ["myapex"],
4640 }
4641
4642 cc_library {
4643 name: "libbaz",
4644 stl: "none",
4645 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004646 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004647}
Jiyong Park127b40b2019-09-30 16:04:35 +09004648
Paul Duffine52e66f2020-03-30 17:54:29 +01004649func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004650 testApexError(t, "\"otherapex\" is not a valid module name", `
4651 apex {
4652 name: "myapex",
4653 key: "myapex.key",
4654 native_shared_libs: ["libfoo"],
4655 }
4656
4657 apex_key {
4658 name: "myapex.key",
4659 public_key: "testkey.avbpubkey",
4660 private_key: "testkey.pem",
4661 }
4662
4663 cc_library {
4664 name: "libfoo",
4665 stl: "none",
4666 system_shared_libs: [],
4667 apex_available: ["otherapex"],
4668 }`)
4669
Paul Duffine52e66f2020-03-30 17:54:29 +01004670 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004671 apex {
4672 name: "myapex",
4673 key: "myapex.key",
4674 native_shared_libs: ["libfoo", "libbar"],
4675 }
4676
4677 apex_key {
4678 name: "myapex.key",
4679 public_key: "testkey.avbpubkey",
4680 private_key: "testkey.pem",
4681 }
4682
4683 cc_library {
4684 name: "libfoo",
4685 stl: "none",
4686 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004687 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004688 apex_available: ["myapex"],
4689 }
4690
4691 cc_library {
4692 name: "libbar",
4693 stl: "none",
4694 system_shared_libs: [],
4695 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004696 }
4697
4698 cc_library {
4699 name: "libbaz",
4700 stl: "none",
4701 system_shared_libs: [],
4702 stubs: {
4703 versions: ["10", "20", "30"],
4704 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004705 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004706}
Jiyong Park127b40b2019-09-30 16:04:35 +09004707
Jiyong Park89e850a2020-04-07 16:37:39 +09004708func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004709 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004710 apex {
4711 name: "myapex",
4712 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004713 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004714 }
4715
4716 apex_key {
4717 name: "myapex.key",
4718 public_key: "testkey.avbpubkey",
4719 private_key: "testkey.pem",
4720 }
4721
4722 cc_library {
4723 name: "libfoo",
4724 stl: "none",
4725 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004726 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004727 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004728 }
4729
4730 cc_library {
4731 name: "libfoo2",
4732 stl: "none",
4733 system_shared_libs: [],
4734 shared_libs: ["libbaz"],
4735 apex_available: ["//apex_available:platform"],
4736 }
4737
4738 cc_library {
4739 name: "libbar",
4740 stl: "none",
4741 system_shared_libs: [],
4742 apex_available: ["myapex"],
4743 }
4744
4745 cc_library {
4746 name: "libbaz",
4747 stl: "none",
4748 system_shared_libs: [],
4749 apex_available: ["myapex"],
4750 stubs: {
4751 versions: ["1"],
4752 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004753 }`)
4754
Jiyong Park89e850a2020-04-07 16:37:39 +09004755 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4756 // because it depends on libbar which isn't available to platform
4757 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4758 if libfoo.NotAvailableForPlatform() != true {
4759 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4760 }
4761
4762 // libfoo2 however can be available to platform because it depends on libbaz which provides
4763 // stubs
4764 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4765 if libfoo2.NotAvailableForPlatform() == true {
4766 t.Errorf("%q should be available to platform", libfoo2.String())
4767 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004768}
Jiyong Parka90ca002019-10-07 15:47:24 +09004769
Paul Duffine52e66f2020-03-30 17:54:29 +01004770func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004771 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004772 apex {
4773 name: "myapex",
4774 key: "myapex.key",
4775 native_shared_libs: ["libfoo"],
4776 }
4777
4778 apex_key {
4779 name: "myapex.key",
4780 public_key: "testkey.avbpubkey",
4781 private_key: "testkey.pem",
4782 }
4783
4784 cc_library {
4785 name: "libfoo",
4786 stl: "none",
4787 system_shared_libs: [],
4788 apex_available: ["myapex"],
4789 static: {
4790 apex_available: ["//apex_available:platform"],
4791 },
4792 }`)
4793
Jiyong Park89e850a2020-04-07 16:37:39 +09004794 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4795 if libfooShared.NotAvailableForPlatform() != true {
4796 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4797 }
4798 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4799 if libfooStatic.NotAvailableForPlatform() != false {
4800 t.Errorf("%q should be available to platform", libfooStatic.String())
4801 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004802}
4803
Jiyong Park5d790c32019-11-15 18:40:32 +09004804func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004805 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004806 apex {
4807 name: "myapex",
4808 key: "myapex.key",
4809 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004810 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004811 }
4812
4813 override_apex {
4814 name: "override_myapex",
4815 base: "myapex",
4816 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004817 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004818 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004819 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004820 }
4821
4822 apex_key {
4823 name: "myapex.key",
4824 public_key: "testkey.avbpubkey",
4825 private_key: "testkey.pem",
4826 }
4827
4828 android_app {
4829 name: "app",
4830 srcs: ["foo/bar/MyClass.java"],
4831 package_name: "foo",
4832 sdk_version: "none",
4833 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004834 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004835 }
4836
4837 override_android_app {
4838 name: "override_app",
4839 base: "app",
4840 package_name: "bar",
4841 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004842 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004843
Jiyong Park317645e2019-12-05 13:20:58 +09004844 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4845 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4846 if originalVariant.GetOverriddenBy() != "" {
4847 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4848 }
4849 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4850 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4851 }
4852
Jiyong Park5d790c32019-11-15 18:40:32 +09004853 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4854 apexRule := module.Rule("apexRule")
4855 copyCmds := apexRule.Args["copy_commands"]
4856
4857 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004858 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004859
4860 apexBundle := module.Module().(*apexBundle)
4861 name := apexBundle.Name()
4862 if name != "override_myapex" {
4863 t.Errorf("name should be \"override_myapex\", but was %q", name)
4864 }
4865
Baligh Uddin004d7172020-02-19 21:29:28 -08004866 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4867 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4868 }
4869
Jiyong Park20bacab2020-03-03 11:45:41 +09004870 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004871 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004872
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004873 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4874 var builder strings.Builder
4875 data.Custom(&builder, name, "TARGET_", "", data)
4876 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004877 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004878 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4879 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004880 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004881 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004882 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004883 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4884 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004885}
4886
Jooyung Han214bf372019-11-12 13:03:50 +09004887func TestLegacyAndroid10Support(t *testing.T) {
4888 ctx, _ := testApex(t, `
4889 apex {
4890 name: "myapex",
4891 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004892 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004893 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004894 }
4895
4896 apex_key {
4897 name: "myapex.key",
4898 public_key: "testkey.avbpubkey",
4899 private_key: "testkey.pem",
4900 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004901
4902 cc_library {
4903 name: "mylib",
4904 srcs: ["mylib.cpp"],
4905 stl: "libc++",
4906 system_shared_libs: [],
4907 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004908 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004909 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004910 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004911
4912 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4913 args := module.Rule("apexRule").Args
4914 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004915 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004916
4917 // The copies of the libraries in the apex should have one more dependency than
4918 // the ones outside the apex, namely the unwinder. Ideally we should check
4919 // the dependency names directly here but for some reason the names are blank in
4920 // this test.
4921 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004922 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004923 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4924 if len(apexImplicits) != len(nonApexImplicits)+1 {
4925 t.Errorf("%q missing unwinder dep", lib)
4926 }
4927 }
Jooyung Han214bf372019-11-12 13:03:50 +09004928}
4929
Paul Duffin9b879592020-05-26 13:21:35 +01004930var filesForSdkLibrary = map[string][]byte{
4931 "api/current.txt": nil,
4932 "api/removed.txt": nil,
4933 "api/system-current.txt": nil,
4934 "api/system-removed.txt": nil,
4935 "api/test-current.txt": nil,
4936 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004937
4938 // For java_sdk_library_import
4939 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004940}
4941
Jooyung Han58f26ab2019-12-18 15:34:32 +09004942func TestJavaSDKLibrary(t *testing.T) {
4943 ctx, _ := testApex(t, `
4944 apex {
4945 name: "myapex",
4946 key: "myapex.key",
4947 java_libs: ["foo"],
4948 }
4949
4950 apex_key {
4951 name: "myapex.key",
4952 public_key: "testkey.avbpubkey",
4953 private_key: "testkey.pem",
4954 }
4955
4956 java_sdk_library {
4957 name: "foo",
4958 srcs: ["a.java"],
4959 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004960 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004961 }
Paul Duffin9b879592020-05-26 13:21:35 +01004962 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004963
4964 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004965 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004966 "javalib/foo.jar",
4967 "etc/permissions/foo.xml",
4968 })
4969 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004970 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4971 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004972}
4973
Paul Duffin9b879592020-05-26 13:21:35 +01004974func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4975 ctx, _ := testApex(t, `
4976 apex {
4977 name: "myapex",
4978 key: "myapex.key",
4979 java_libs: ["foo", "bar"],
4980 }
4981
4982 apex_key {
4983 name: "myapex.key",
4984 public_key: "testkey.avbpubkey",
4985 private_key: "testkey.pem",
4986 }
4987
4988 java_sdk_library {
4989 name: "foo",
4990 srcs: ["a.java"],
4991 api_packages: ["foo"],
4992 apex_available: ["myapex"],
4993 sdk_version: "none",
4994 system_modules: "none",
4995 }
4996
4997 java_library {
4998 name: "bar",
4999 srcs: ["a.java"],
5000 libs: ["foo"],
5001 apex_available: ["myapex"],
5002 sdk_version: "none",
5003 system_modules: "none",
5004 }
5005 `, withFiles(filesForSdkLibrary))
5006
5007 // java_sdk_library installs both impl jar and permission XML
5008 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5009 "javalib/bar.jar",
5010 "javalib/foo.jar",
5011 "etc/permissions/foo.xml",
5012 })
5013
5014 // The bar library should depend on the implementation jar.
5015 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5016 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5017 t.Errorf("expected %q, found %#q", expected, actual)
5018 }
5019}
5020
5021func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
5022 ctx, _ := testApex(t, `
5023 apex {
5024 name: "myapex",
5025 key: "myapex.key",
5026 java_libs: ["foo"],
5027 }
5028
5029 apex_key {
5030 name: "myapex.key",
5031 public_key: "testkey.avbpubkey",
5032 private_key: "testkey.pem",
5033 }
5034
5035 java_sdk_library {
5036 name: "foo",
5037 srcs: ["a.java"],
5038 api_packages: ["foo"],
5039 apex_available: ["myapex"],
5040 sdk_version: "none",
5041 system_modules: "none",
5042 }
5043
5044 java_library {
5045 name: "bar",
5046 srcs: ["a.java"],
5047 libs: ["foo"],
5048 sdk_version: "none",
5049 system_modules: "none",
5050 }
5051 `, withFiles(filesForSdkLibrary))
5052
5053 // java_sdk_library installs both impl jar and permission XML
5054 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5055 "javalib/foo.jar",
5056 "etc/permissions/foo.xml",
5057 })
5058
5059 // The bar library should depend on the stubs jar.
5060 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5061 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5062 t.Errorf("expected %q, found %#q", expected, actual)
5063 }
5064}
5065
Paul Duffineedc5d52020-06-12 17:46:39 +01005066func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
5067 ctx, _ := testApex(t, ``,
5068 withFiles(map[string][]byte{
5069 "apex/a.java": nil,
5070 "apex/apex_manifest.json": nil,
5071 "apex/Android.bp": []byte(`
5072 package {
5073 default_visibility: ["//visibility:private"],
5074 }
5075
5076 apex {
5077 name: "myapex",
5078 key: "myapex.key",
5079 java_libs: ["foo", "bar"],
5080 }
5081
5082 apex_key {
5083 name: "myapex.key",
5084 public_key: "testkey.avbpubkey",
5085 private_key: "testkey.pem",
5086 }
5087
5088 java_library {
5089 name: "bar",
5090 srcs: ["a.java"],
5091 libs: ["foo"],
5092 apex_available: ["myapex"],
5093 sdk_version: "none",
5094 system_modules: "none",
5095 }
5096`),
5097 "source/a.java": nil,
5098 "source/api/current.txt": nil,
5099 "source/api/removed.txt": nil,
5100 "source/Android.bp": []byte(`
5101 package {
5102 default_visibility: ["//visibility:private"],
5103 }
5104
5105 java_sdk_library {
5106 name: "foo",
5107 visibility: ["//apex"],
5108 srcs: ["a.java"],
5109 api_packages: ["foo"],
5110 apex_available: ["myapex"],
5111 sdk_version: "none",
5112 system_modules: "none",
5113 public: {
5114 enabled: true,
5115 },
5116 }
5117`),
5118 "prebuilt/a.jar": nil,
5119 "prebuilt/Android.bp": []byte(`
5120 package {
5121 default_visibility: ["//visibility:private"],
5122 }
5123
5124 java_sdk_library_import {
5125 name: "foo",
5126 visibility: ["//apex", "//source"],
5127 apex_available: ["myapex"],
5128 prefer: true,
5129 public: {
5130 jars: ["a.jar"],
5131 },
5132 }
5133`),
5134 }),
5135 )
5136
5137 // java_sdk_library installs both impl jar and permission XML
5138 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5139 "javalib/bar.jar",
5140 "javalib/foo.jar",
5141 "etc/permissions/foo.xml",
5142 })
5143
5144 // The bar library should depend on the implementation jar.
5145 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5146 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5147 t.Errorf("expected %q, found %#q", expected, actual)
5148 }
5149}
5150
5151func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5152 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5153 apex {
5154 name: "myapex",
5155 key: "myapex.key",
5156 java_libs: ["foo"],
5157 }
5158
5159 apex_key {
5160 name: "myapex.key",
5161 public_key: "testkey.avbpubkey",
5162 private_key: "testkey.pem",
5163 }
5164
5165 java_sdk_library_import {
5166 name: "foo",
5167 apex_available: ["myapex"],
5168 prefer: true,
5169 public: {
5170 jars: ["a.jar"],
5171 },
5172 }
5173
5174 `, withFiles(filesForSdkLibrary))
5175}
5176
atrost6e126252020-01-27 17:01:16 +00005177func TestCompatConfig(t *testing.T) {
5178 ctx, _ := testApex(t, `
5179 apex {
5180 name: "myapex",
5181 key: "myapex.key",
5182 prebuilts: ["myjar-platform-compat-config"],
5183 java_libs: ["myjar"],
5184 }
5185
5186 apex_key {
5187 name: "myapex.key",
5188 public_key: "testkey.avbpubkey",
5189 private_key: "testkey.pem",
5190 }
5191
5192 platform_compat_config {
5193 name: "myjar-platform-compat-config",
5194 src: ":myjar",
5195 }
5196
5197 java_library {
5198 name: "myjar",
5199 srcs: ["foo/bar/MyClass.java"],
5200 sdk_version: "none",
5201 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005202 apex_available: [ "myapex" ],
5203 }
5204 `)
5205 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5206 "etc/compatconfig/myjar-platform-compat-config.xml",
5207 "javalib/myjar.jar",
5208 })
5209}
5210
Jiyong Park479321d2019-12-16 11:47:12 +09005211func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5212 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5213 apex {
5214 name: "myapex",
5215 key: "myapex.key",
5216 java_libs: ["myjar"],
5217 }
5218
5219 apex_key {
5220 name: "myapex.key",
5221 public_key: "testkey.avbpubkey",
5222 private_key: "testkey.pem",
5223 }
5224
5225 java_library {
5226 name: "myjar",
5227 srcs: ["foo/bar/MyClass.java"],
5228 sdk_version: "none",
5229 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005230 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005231 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005232 }
5233 `)
5234}
5235
Jiyong Park7afd1072019-12-30 16:56:33 +09005236func TestCarryRequiredModuleNames(t *testing.T) {
5237 ctx, config := testApex(t, `
5238 apex {
5239 name: "myapex",
5240 key: "myapex.key",
5241 native_shared_libs: ["mylib"],
5242 }
5243
5244 apex_key {
5245 name: "myapex.key",
5246 public_key: "testkey.avbpubkey",
5247 private_key: "testkey.pem",
5248 }
5249
5250 cc_library {
5251 name: "mylib",
5252 srcs: ["mylib.cpp"],
5253 system_shared_libs: [],
5254 stl: "none",
5255 required: ["a", "b"],
5256 host_required: ["c", "d"],
5257 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005258 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005259 }
5260 `)
5261
5262 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5263 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5264 name := apexBundle.BaseModuleName()
5265 prefix := "TARGET_"
5266 var builder strings.Builder
5267 data.Custom(&builder, name, prefix, "", data)
5268 androidMk := builder.String()
5269 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5270 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5271 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5272}
5273
Jiyong Park7cd10e32020-01-14 09:22:18 +09005274func TestSymlinksFromApexToSystem(t *testing.T) {
5275 bp := `
5276 apex {
5277 name: "myapex",
5278 key: "myapex.key",
5279 native_shared_libs: ["mylib"],
5280 java_libs: ["myjar"],
5281 }
5282
Jiyong Park9d677202020-02-19 16:29:35 +09005283 apex {
5284 name: "myapex.updatable",
5285 key: "myapex.key",
5286 native_shared_libs: ["mylib"],
5287 java_libs: ["myjar"],
5288 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005289 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005290 }
5291
Jiyong Park7cd10e32020-01-14 09:22:18 +09005292 apex_key {
5293 name: "myapex.key",
5294 public_key: "testkey.avbpubkey",
5295 private_key: "testkey.pem",
5296 }
5297
5298 cc_library {
5299 name: "mylib",
5300 srcs: ["mylib.cpp"],
5301 shared_libs: ["myotherlib"],
5302 system_shared_libs: [],
5303 stl: "none",
5304 apex_available: [
5305 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005306 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005307 "//apex_available:platform",
5308 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005309 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005310 }
5311
5312 cc_library {
5313 name: "myotherlib",
5314 srcs: ["mylib.cpp"],
5315 system_shared_libs: [],
5316 stl: "none",
5317 apex_available: [
5318 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005319 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005320 "//apex_available:platform",
5321 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005322 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005323 }
5324
5325 java_library {
5326 name: "myjar",
5327 srcs: ["foo/bar/MyClass.java"],
5328 sdk_version: "none",
5329 system_modules: "none",
5330 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005331 apex_available: [
5332 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005333 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005334 "//apex_available:platform",
5335 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005336 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005337 }
5338
5339 java_library {
5340 name: "myotherjar",
5341 srcs: ["foo/bar/MyClass.java"],
5342 sdk_version: "none",
5343 system_modules: "none",
5344 apex_available: [
5345 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005346 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005347 "//apex_available:platform",
5348 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005349 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005350 }
5351 `
5352
5353 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5354 for _, f := range files {
5355 if f.path == file {
5356 if f.isLink {
5357 t.Errorf("%q is not a real file", file)
5358 }
5359 return
5360 }
5361 }
5362 t.Errorf("%q is not found", file)
5363 }
5364
5365 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5366 for _, f := range files {
5367 if f.path == file {
5368 if !f.isLink {
5369 t.Errorf("%q is not a symlink", file)
5370 }
5371 return
5372 }
5373 }
5374 t.Errorf("%q is not found", file)
5375 }
5376
Jiyong Park9d677202020-02-19 16:29:35 +09005377 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5378 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005379 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005380 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005381 ensureRealfileExists(t, files, "javalib/myjar.jar")
5382 ensureRealfileExists(t, files, "lib64/mylib.so")
5383 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5384
Jiyong Park9d677202020-02-19 16:29:35 +09005385 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5386 ensureRealfileExists(t, files, "javalib/myjar.jar")
5387 ensureRealfileExists(t, files, "lib64/mylib.so")
5388 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5389
5390 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005391 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005392 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005393 ensureRealfileExists(t, files, "javalib/myjar.jar")
5394 ensureRealfileExists(t, files, "lib64/mylib.so")
5395 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005396
5397 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5398 ensureRealfileExists(t, files, "javalib/myjar.jar")
5399 ensureRealfileExists(t, files, "lib64/mylib.so")
5400 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005401}
5402
Yo Chiange8128052020-07-23 20:09:18 +08005403func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5404 ctx, config := testApex(t, `
5405 apex {
5406 name: "myapex",
5407 key: "myapex.key",
5408 native_shared_libs: ["mylib"],
5409 }
5410
5411 apex_key {
5412 name: "myapex.key",
5413 public_key: "testkey.avbpubkey",
5414 private_key: "testkey.pem",
5415 }
5416
5417 cc_library_shared {
5418 name: "mylib",
5419 srcs: ["mylib.cpp"],
5420 shared_libs: ["myotherlib"],
5421 system_shared_libs: [],
5422 stl: "none",
5423 apex_available: [
5424 "myapex",
5425 "//apex_available:platform",
5426 ],
5427 }
5428
5429 cc_prebuilt_library_shared {
5430 name: "myotherlib",
5431 srcs: ["prebuilt.so"],
5432 system_shared_libs: [],
5433 stl: "none",
5434 apex_available: [
5435 "myapex",
5436 "//apex_available:platform",
5437 ],
5438 }
5439 `)
5440
5441 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5442 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5443 var builder strings.Builder
5444 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5445 androidMk := builder.String()
5446 // `myotherlib` is added to `myapex` as symlink
5447 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5448 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5449 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5450 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5451 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5452}
5453
Jooyung Han643adc42020-02-27 13:50:06 +09005454func TestApexWithJniLibs(t *testing.T) {
5455 ctx, _ := testApex(t, `
5456 apex {
5457 name: "myapex",
5458 key: "myapex.key",
5459 jni_libs: ["mylib"],
5460 }
5461
5462 apex_key {
5463 name: "myapex.key",
5464 public_key: "testkey.avbpubkey",
5465 private_key: "testkey.pem",
5466 }
5467
5468 cc_library {
5469 name: "mylib",
5470 srcs: ["mylib.cpp"],
5471 shared_libs: ["mylib2"],
5472 system_shared_libs: [],
5473 stl: "none",
5474 apex_available: [ "myapex" ],
5475 }
5476
5477 cc_library {
5478 name: "mylib2",
5479 srcs: ["mylib.cpp"],
5480 system_shared_libs: [],
5481 stl: "none",
5482 apex_available: [ "myapex" ],
5483 }
5484 `)
5485
5486 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5487 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5488 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5489 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5490 "lib64/mylib.so",
5491 "lib64/mylib2.so",
5492 })
5493}
5494
Jooyung Han49f67012020-04-17 13:43:10 +09005495func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5496 ctx, _ := testApex(t, `
5497 apex {
5498 name: "myapex",
5499 key: "myapex.key",
5500 }
5501 apex_key {
5502 name: "myapex.key",
5503 public_key: "testkey.avbpubkey",
5504 private_key: "testkey.pem",
5505 }
5506 `, func(fs map[string][]byte, config android.Config) {
5507 delete(config.Targets, android.Android)
5508 config.AndroidCommonTarget = android.Target{}
5509 })
5510
5511 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5512 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5513 }
5514}
5515
Jiyong Parkbd159612020-02-28 15:22:21 +09005516func TestAppBundle(t *testing.T) {
5517 ctx, _ := testApex(t, `
5518 apex {
5519 name: "myapex",
5520 key: "myapex.key",
5521 apps: ["AppFoo"],
5522 }
5523
5524 apex_key {
5525 name: "myapex.key",
5526 public_key: "testkey.avbpubkey",
5527 private_key: "testkey.pem",
5528 }
5529
5530 android_app {
5531 name: "AppFoo",
5532 srcs: ["foo/bar/MyClass.java"],
5533 sdk_version: "none",
5534 system_modules: "none",
5535 apex_available: [ "myapex" ],
5536 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005537 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005538
Colin Crosscf371cc2020-11-13 11:48:42 -08005539 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09005540 content := bundleConfigRule.Args["content"]
5541
5542 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005543 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 +09005544}
5545
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005546func TestAppSetBundle(t *testing.T) {
5547 ctx, _ := testApex(t, `
5548 apex {
5549 name: "myapex",
5550 key: "myapex.key",
5551 apps: ["AppSet"],
5552 }
5553
5554 apex_key {
5555 name: "myapex.key",
5556 public_key: "testkey.avbpubkey",
5557 private_key: "testkey.pem",
5558 }
5559
5560 android_app_set {
5561 name: "AppSet",
5562 set: "AppSet.apks",
5563 }`)
5564 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08005565 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005566 content := bundleConfigRule.Args["content"]
5567 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5568 s := mod.Rule("apexRule").Args["copy_commands"]
5569 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5570 if len(copyCmds) != 3 {
5571 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5572 }
5573 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5574 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5575 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5576}
5577
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07005578func TestAppSetBundlePrebuilt(t *testing.T) {
5579 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
5580 bp := `
5581 apex_set {
5582 name: "myapex",
5583 filename: "foo_v2.apex",
5584 sanitized: {
5585 none: { set: "myapex.apks", },
5586 hwaddress: { set: "myapex.hwasan.apks", },
5587 },
5588 }`
5589 fs["Android.bp"] = []byte(bp)
5590
5591 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
5592 })
5593
5594 m := ctx.ModuleForTests("myapex", "android_common")
5595 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5596
5597 actual := extractedApex.Inputs
5598 if len(actual) != 1 {
5599 t.Errorf("expected a single input")
5600 }
5601
5602 expected := "myapex.hwasan.apks"
5603 if actual[0].String() != expected {
5604 t.Errorf("expected %s, got %s", expected, actual[0].String())
5605 }
5606}
5607
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005608func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005609 t.Helper()
5610
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005611 bp := `
5612 java_library {
5613 name: "some-updatable-apex-lib",
5614 srcs: ["a.java"],
5615 sdk_version: "current",
5616 apex_available: [
5617 "some-updatable-apex",
5618 ],
5619 }
5620
5621 java_library {
5622 name: "some-non-updatable-apex-lib",
5623 srcs: ["a.java"],
5624 apex_available: [
5625 "some-non-updatable-apex",
5626 ],
5627 }
5628
5629 java_library {
5630 name: "some-platform-lib",
5631 srcs: ["a.java"],
5632 sdk_version: "current",
5633 installable: true,
5634 }
5635
5636 java_library {
5637 name: "some-art-lib",
5638 srcs: ["a.java"],
5639 sdk_version: "current",
5640 apex_available: [
5641 "com.android.art.something",
5642 ],
5643 hostdex: true,
5644 }
5645
5646 apex {
5647 name: "some-updatable-apex",
5648 key: "some-updatable-apex.key",
5649 java_libs: ["some-updatable-apex-lib"],
5650 updatable: true,
5651 min_sdk_version: "current",
5652 }
5653
5654 apex {
5655 name: "some-non-updatable-apex",
5656 key: "some-non-updatable-apex.key",
5657 java_libs: ["some-non-updatable-apex-lib"],
5658 }
5659
5660 apex_key {
5661 name: "some-updatable-apex.key",
5662 }
5663
5664 apex_key {
5665 name: "some-non-updatable-apex.key",
5666 }
5667
5668 apex {
5669 name: "com.android.art.something",
5670 key: "com.android.art.something.key",
5671 java_libs: ["some-art-lib"],
5672 updatable: true,
5673 min_sdk_version: "current",
5674 }
5675
5676 apex_key {
5677 name: "com.android.art.something.key",
5678 }
5679
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005680 filegroup {
5681 name: "some-updatable-apex-file_contexts",
5682 srcs: [
5683 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5684 ],
5685 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005686
5687 filegroup {
5688 name: "some-non-updatable-apex-file_contexts",
5689 srcs: [
5690 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5691 ],
5692 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005693 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00005694
5695 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
5696}
5697
5698func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
5699 t.Helper()
5700
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005701 bp += cc.GatherRequiredDepsForTest(android.Android)
5702 bp += java.GatherRequiredDepsForTest()
5703 bp += dexpreopt.BpToolModulesForTest()
5704
5705 fs := map[string][]byte{
5706 "a.java": nil,
5707 "a.jar": nil,
5708 "build/make/target/product/security": nil,
5709 "apex_manifest.json": nil,
5710 "AndroidManifest.xml": nil,
5711 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005712 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005713 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5714 "framework/aidl/a.aidl": nil,
5715 }
5716 cc.GatherRequiredFilesForTest(fs)
5717
Colin Crossae8600b2020-10-29 17:09:13 -07005718 config := android.TestArchConfig(buildDir, nil, bp, fs)
5719
5720 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005721 ctx.RegisterModuleType("apex", BundleFactory)
5722 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5723 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005724 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005725 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005726 cc.RegisterRequiredBuildComponentsForTest(ctx)
5727 java.RegisterJavaBuildComponents(ctx)
5728 java.RegisterSystemModulesBuildComponents(ctx)
5729 java.RegisterAppBuildComponents(ctx)
5730 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005731 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5732 ctx.PreDepsMutators(RegisterPreDepsMutators)
5733 ctx.PostDepsMutators(RegisterPostDepsMutators)
5734
Colin Crossae8600b2020-10-29 17:09:13 -07005735 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005736
5737 _ = dexpreopt.GlobalSoongConfigForTests(config)
5738 dexpreopt.RegisterToolModulesForTest(ctx)
5739 pathCtx := android.PathContextForTesting(config)
5740 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5741 transformDexpreoptConfig(dexpreoptConfig)
5742 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5743
5744 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5745 android.FailIfErrored(t, errs)
5746
5747 _, errs = ctx.PrepareBuildActions(config)
5748 if errmsg == "" {
5749 android.FailIfErrored(t, errs)
5750 } else if len(errs) > 0 {
5751 android.FailIfNoMatchingErrors(t, errmsg, errs)
5752 return
5753 } else {
5754 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5755 }
5756}
5757
Jooyung Han548640b2020-04-27 12:10:30 +09005758func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5759 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5760 apex {
5761 name: "myapex",
5762 key: "myapex.key",
5763 updatable: true,
5764 }
5765
5766 apex_key {
5767 name: "myapex.key",
5768 public_key: "testkey.avbpubkey",
5769 private_key: "testkey.pem",
5770 }
5771 `)
5772}
5773
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005774func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005775 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005776 var transform func(*dexpreopt.GlobalConfig)
5777
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005778 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5779 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005780 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005781 }
5782 testNoUpdatableJarsInBootImage(t, "", transform)
5783 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005784
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005785 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005786 err = `module "some-art-lib" from updatable apexes \["com.android.art.something"\] is not allowed in the framework boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005787 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005788 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005789 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005790 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005791 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005792
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005793 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005794 err = `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005795 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005796 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005797 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005798 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005799 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005800
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005801 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005802 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005803 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005804 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005805 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005806 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005807 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005808
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005809 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005810 err = `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the framework boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005811 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005812 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005813 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005814 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005815 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005816
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005817 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5818 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005819 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005820 }
5821 testNoUpdatableJarsInBootImage(t, "", transform)
5822 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005823
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005824 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005825 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005826 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005827 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005828 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005829 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005830 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005831
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005832 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005833 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005834 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005835 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005836 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005837 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005838 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005839
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005840 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005841 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005842 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005843 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005844 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005845 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005846 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005847
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005848 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5849 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005850 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005851 }
5852 testNoUpdatableJarsInBootImage(t, "", transform)
5853 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005854}
5855
Andrei Onea115e7e72020-06-05 21:14:03 +01005856func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5857 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01005858 bp += `
5859 apex_key {
5860 name: "myapex.key",
5861 public_key: "testkey.avbpubkey",
5862 private_key: "testkey.pem",
5863 }`
5864 fs := map[string][]byte{
5865 "lib1/src/A.java": nil,
5866 "lib2/src/B.java": nil,
5867 "system/sepolicy/apex/myapex-file_contexts": nil,
5868 }
5869
Colin Crossae8600b2020-10-29 17:09:13 -07005870 config := android.TestArchConfig(buildDir, nil, bp, fs)
5871 android.SetTestNeverallowRules(config, rules)
5872 updatableBootJars := make([]string, 0, len(apexBootJars))
5873 for _, apexBootJar := range apexBootJars {
5874 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
5875 }
5876 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
5877
5878 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01005879 ctx.RegisterModuleType("apex", BundleFactory)
5880 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5881 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5882 cc.RegisterRequiredBuildComponentsForTest(ctx)
5883 java.RegisterJavaBuildComponents(ctx)
5884 java.RegisterSystemModulesBuildComponents(ctx)
5885 java.RegisterDexpreoptBootJarsComponents(ctx)
5886 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5887 ctx.PreDepsMutators(RegisterPreDepsMutators)
5888 ctx.PostDepsMutators(RegisterPostDepsMutators)
5889 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5890
Colin Crossae8600b2020-10-29 17:09:13 -07005891 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01005892
5893 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5894 android.FailIfErrored(t, errs)
5895
5896 _, errs = ctx.PrepareBuildActions(config)
5897 if errmsg == "" {
5898 android.FailIfErrored(t, errs)
5899 } else if len(errs) > 0 {
5900 android.FailIfNoMatchingErrors(t, errmsg, errs)
5901 return
5902 } else {
5903 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5904 }
5905}
5906
5907func TestApexPermittedPackagesRules(t *testing.T) {
5908 testcases := []struct {
5909 name string
5910 expectedError string
5911 bp string
5912 bootJars []string
5913 modulesPackages map[string][]string
5914 }{
5915
5916 {
5917 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
5918 expectedError: "",
5919 bp: `
5920 java_library {
5921 name: "bcp_lib1",
5922 srcs: ["lib1/src/*.java"],
5923 permitted_packages: ["foo.bar"],
5924 apex_available: ["myapex"],
5925 sdk_version: "none",
5926 system_modules: "none",
5927 }
5928 java_library {
5929 name: "nonbcp_lib2",
5930 srcs: ["lib2/src/*.java"],
5931 apex_available: ["myapex"],
5932 permitted_packages: ["a.b"],
5933 sdk_version: "none",
5934 system_modules: "none",
5935 }
5936 apex {
5937 name: "myapex",
5938 key: "myapex.key",
5939 java_libs: ["bcp_lib1", "nonbcp_lib2"],
5940 }`,
5941 bootJars: []string{"bcp_lib1"},
5942 modulesPackages: map[string][]string{
5943 "myapex": []string{
5944 "foo.bar",
5945 },
5946 },
5947 },
5948 {
5949 name: "Bootclasspath apex jar not satisfying allowed module packages.",
5950 expectedError: `module "bcp_lib2" .* which is restricted because jars that are part of the myapex module may only allow these packages: foo.bar. Please jarjar or move code around.`,
5951 bp: `
5952 java_library {
5953 name: "bcp_lib1",
5954 srcs: ["lib1/src/*.java"],
5955 apex_available: ["myapex"],
5956 permitted_packages: ["foo.bar"],
5957 sdk_version: "none",
5958 system_modules: "none",
5959 }
5960 java_library {
5961 name: "bcp_lib2",
5962 srcs: ["lib2/src/*.java"],
5963 apex_available: ["myapex"],
5964 permitted_packages: ["foo.bar", "bar.baz"],
5965 sdk_version: "none",
5966 system_modules: "none",
5967 }
5968 apex {
5969 name: "myapex",
5970 key: "myapex.key",
5971 java_libs: ["bcp_lib1", "bcp_lib2"],
5972 }
5973 `,
5974 bootJars: []string{"bcp_lib1", "bcp_lib2"},
5975 modulesPackages: map[string][]string{
5976 "myapex": []string{
5977 "foo.bar",
5978 },
5979 },
5980 },
5981 }
5982 for _, tc := range testcases {
5983 t.Run(tc.name, func(t *testing.T) {
5984 rules := createApexPermittedPackagesRules(tc.modulesPackages)
5985 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
5986 })
5987 }
5988}
5989
Jiyong Park62304bb2020-04-13 16:19:48 +09005990func TestTestFor(t *testing.T) {
5991 ctx, _ := testApex(t, `
5992 apex {
5993 name: "myapex",
5994 key: "myapex.key",
5995 native_shared_libs: ["mylib", "myprivlib"],
5996 }
5997
5998 apex_key {
5999 name: "myapex.key",
6000 public_key: "testkey.avbpubkey",
6001 private_key: "testkey.pem",
6002 }
6003
6004 cc_library {
6005 name: "mylib",
6006 srcs: ["mylib.cpp"],
6007 system_shared_libs: [],
6008 stl: "none",
6009 stubs: {
6010 versions: ["1"],
6011 },
6012 apex_available: ["myapex"],
6013 }
6014
6015 cc_library {
6016 name: "myprivlib",
6017 srcs: ["mylib.cpp"],
6018 system_shared_libs: [],
6019 stl: "none",
6020 apex_available: ["myapex"],
6021 }
6022
6023
6024 cc_test {
6025 name: "mytest",
6026 gtest: false,
6027 srcs: ["mylib.cpp"],
6028 system_shared_libs: [],
6029 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006030 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006031 test_for: ["myapex"]
6032 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006033
6034 cc_library {
6035 name: "mytestlib",
6036 srcs: ["mylib.cpp"],
6037 system_shared_libs: [],
6038 shared_libs: ["mylib", "myprivlib"],
6039 stl: "none",
6040 test_for: ["myapex"],
6041 }
6042
6043 cc_benchmark {
6044 name: "mybench",
6045 srcs: ["mylib.cpp"],
6046 system_shared_libs: [],
6047 shared_libs: ["mylib", "myprivlib"],
6048 stl: "none",
6049 test_for: ["myapex"],
6050 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006051 `)
6052
6053 // the test 'mytest' is a test for the apex, therefore is linked to the
6054 // actual implementation of mylib instead of its stub.
6055 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6056 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6057 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006058
6059 // The same should be true for cc_library
6060 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6061 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6062 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6063
6064 // ... and for cc_benchmark
6065 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6066 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6067 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006068}
6069
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006070// TODO(jungjw): Move this to proptools
6071func intPtr(i int) *int {
6072 return &i
6073}
6074
6075func TestApexSet(t *testing.T) {
6076 ctx, config := testApex(t, `
6077 apex_set {
6078 name: "myapex",
6079 set: "myapex.apks",
6080 filename: "foo_v2.apex",
6081 overrides: ["foo"],
6082 }
6083 `, func(fs map[string][]byte, config android.Config) {
6084 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006085 config.Targets[android.Android] = []android.Target{
6086 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6087 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6088 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006089 })
6090
6091 m := ctx.ModuleForTests("myapex", "android_common")
6092
6093 // Check extract_apks tool parameters.
6094 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6095 actual := extractedApex.Args["abis"]
6096 expected := "ARMEABI_V7A,ARM64_V8A"
6097 if actual != expected {
6098 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6099 }
6100 actual = extractedApex.Args["sdk-version"]
6101 expected = "30"
6102 if actual != expected {
6103 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6104 }
6105
6106 a := m.Module().(*ApexSet)
6107 expectedOverrides := []string{"foo"}
6108 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
6109 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6110 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6111 }
6112}
6113
Jiyong Park7d95a512020-05-10 15:16:24 +09006114func TestNoStaticLinkingToStubsLib(t *testing.T) {
6115 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6116 apex {
6117 name: "myapex",
6118 key: "myapex.key",
6119 native_shared_libs: ["mylib"],
6120 }
6121
6122 apex_key {
6123 name: "myapex.key",
6124 public_key: "testkey.avbpubkey",
6125 private_key: "testkey.pem",
6126 }
6127
6128 cc_library {
6129 name: "mylib",
6130 srcs: ["mylib.cpp"],
6131 static_libs: ["otherlib"],
6132 system_shared_libs: [],
6133 stl: "none",
6134 apex_available: [ "myapex" ],
6135 }
6136
6137 cc_library {
6138 name: "otherlib",
6139 srcs: ["mylib.cpp"],
6140 system_shared_libs: [],
6141 stl: "none",
6142 stubs: {
6143 versions: ["1", "2", "3"],
6144 },
6145 apex_available: [ "myapex" ],
6146 }
6147 `)
6148}
6149
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006150func TestApexKeysTxt(t *testing.T) {
6151 ctx, _ := testApex(t, `
6152 apex {
6153 name: "myapex",
6154 key: "myapex.key",
6155 }
6156
6157 apex_key {
6158 name: "myapex.key",
6159 public_key: "testkey.avbpubkey",
6160 private_key: "testkey.pem",
6161 }
6162
6163 prebuilt_apex {
6164 name: "myapex",
6165 prefer: true,
6166 arch: {
6167 arm64: {
6168 src: "myapex-arm64.apex",
6169 },
6170 arm: {
6171 src: "myapex-arm.apex",
6172 },
6173 },
6174 }
6175
6176 apex_set {
6177 name: "myapex_set",
6178 set: "myapex.apks",
6179 filename: "myapex_set.apex",
6180 overrides: ["myapex"],
6181 }
6182 `)
6183
6184 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6185 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6186 ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
Jiyong Park03a7f3e2020-06-18 19:34:42 +09006187 ensureContains(t, content, `name="myapex.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006188}
6189
Jooyung Han938b5932020-06-20 12:47:47 +09006190func TestAllowedFiles(t *testing.T) {
6191 ctx, _ := testApex(t, `
6192 apex {
6193 name: "myapex",
6194 key: "myapex.key",
6195 apps: ["app"],
6196 allowed_files: "allowed.txt",
6197 }
6198
6199 apex_key {
6200 name: "myapex.key",
6201 public_key: "testkey.avbpubkey",
6202 private_key: "testkey.pem",
6203 }
6204
6205 android_app {
6206 name: "app",
6207 srcs: ["foo/bar/MyClass.java"],
6208 package_name: "foo",
6209 sdk_version: "none",
6210 system_modules: "none",
6211 apex_available: [ "myapex" ],
6212 }
6213 `, withFiles(map[string][]byte{
6214 "sub/Android.bp": []byte(`
6215 override_apex {
6216 name: "override_myapex",
6217 base: "myapex",
6218 apps: ["override_app"],
6219 allowed_files: ":allowed",
6220 }
6221 // Overridable "path" property should be referenced indirectly
6222 filegroup {
6223 name: "allowed",
6224 srcs: ["allowed.txt"],
6225 }
6226 override_android_app {
6227 name: "override_app",
6228 base: "app",
6229 package_name: "bar",
6230 }
6231 `),
6232 }))
6233
6234 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6235 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6236 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6237 }
6238
6239 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6240 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6241 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6242 }
6243}
6244
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006245func TestNonPreferredPrebuiltDependency(t *testing.T) {
6246 _, _ = testApex(t, `
6247 apex {
6248 name: "myapex",
6249 key: "myapex.key",
6250 native_shared_libs: ["mylib"],
6251 }
6252
6253 apex_key {
6254 name: "myapex.key",
6255 public_key: "testkey.avbpubkey",
6256 private_key: "testkey.pem",
6257 }
6258
6259 cc_library {
6260 name: "mylib",
6261 srcs: ["mylib.cpp"],
6262 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006263 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006264 },
6265 apex_available: ["myapex"],
6266 }
6267
6268 cc_prebuilt_library_shared {
6269 name: "mylib",
6270 prefer: false,
6271 srcs: ["prebuilt.so"],
6272 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006273 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006274 },
6275 apex_available: ["myapex"],
6276 }
6277 `)
6278}
6279
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00006280func TestCompressedApex(t *testing.T) {
6281 ctx, config := testApex(t, `
6282 apex {
6283 name: "myapex",
6284 key: "myapex.key",
6285 compressible: true,
6286 }
6287 apex_key {
6288 name: "myapex.key",
6289 public_key: "testkey.avbpubkey",
6290 private_key: "testkey.pem",
6291 }
6292 `, func(fs map[string][]byte, config android.Config) {
6293 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
6294 })
6295
6296 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
6297 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
6298
6299 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
6300 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
6301
6302 // Make sure output of bundle is .capex
6303 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6304 ensureContains(t, ab.outputFile.String(), "myapex.capex")
6305
6306 // Verify android.mk rules
6307 data := android.AndroidMkDataForTest(t, config, "", ab)
6308 var builder strings.Builder
6309 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6310 androidMk := builder.String()
6311 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
6312}
6313
Martin Stjernholm2856c662020-12-02 15:03:42 +00006314func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
6315 ctx, config := testApex(t, `
6316 apex {
6317 name: "myapex",
6318 key: "myapex.key",
6319 native_shared_libs: ["mylib"],
6320 }
6321
6322 apex_key {
6323 name: "myapex.key",
6324 public_key: "testkey.avbpubkey",
6325 private_key: "testkey.pem",
6326 }
6327
6328 cc_library {
6329 name: "mylib",
6330 srcs: ["mylib.cpp"],
6331 apex_available: ["myapex"],
6332 shared_libs: ["otherlib"],
6333 system_shared_libs: [],
6334 }
6335
6336 cc_library {
6337 name: "otherlib",
6338 srcs: ["mylib.cpp"],
6339 stubs: {
6340 versions: ["current"],
6341 },
6342 }
6343
6344 cc_prebuilt_library_shared {
6345 name: "otherlib",
6346 prefer: true,
6347 srcs: ["prebuilt.so"],
6348 stubs: {
6349 versions: ["current"],
6350 },
6351 }
6352 `)
6353
6354 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6355 data := android.AndroidMkDataForTest(t, config, "", ab)
6356 var builder strings.Builder
6357 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6358 androidMk := builder.String()
6359
6360 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
6361 // a thing there.
6362 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
6363}
6364
Jiyong Parke3867542020-12-03 17:28:25 +09006365func TestExcludeDependency(t *testing.T) {
6366 ctx, _ := testApex(t, `
6367 apex {
6368 name: "myapex",
6369 key: "myapex.key",
6370 native_shared_libs: ["mylib"],
6371 }
6372
6373 apex_key {
6374 name: "myapex.key",
6375 public_key: "testkey.avbpubkey",
6376 private_key: "testkey.pem",
6377 }
6378
6379 cc_library {
6380 name: "mylib",
6381 srcs: ["mylib.cpp"],
6382 system_shared_libs: [],
6383 stl: "none",
6384 apex_available: ["myapex"],
6385 shared_libs: ["mylib2"],
6386 target: {
6387 apex: {
6388 exclude_shared_libs: ["mylib2"],
6389 },
6390 },
6391 }
6392
6393 cc_library {
6394 name: "mylib2",
6395 srcs: ["mylib.cpp"],
6396 system_shared_libs: [],
6397 stl: "none",
6398 }
6399 `)
6400
6401 // Check if mylib is linked to mylib2 for the non-apex target
6402 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6403 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
6404
6405 // Make sure that the link doesn't occur for the apex target
6406 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
6407 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
6408
6409 // It shouldn't appear in the copy cmd as well.
6410 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
6411 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
6412}
6413
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006414func TestMain(m *testing.M) {
6415 run := func() int {
6416 setUp()
6417 defer tearDown()
6418
6419 return m.Run()
6420 }
6421
6422 os.Exit(run())
6423}