blob: ea2e2513325aeaf5cad3d3478212a404e78bbaf9 [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
Jiyong Park59140302020-12-14 18:44:04 +09003893func TestApexWithArch(t *testing.T) {
3894 ctx, _ := testApex(t, `
3895 apex {
3896 name: "myapex",
3897 key: "myapex.key",
3898 arch: {
3899 arm64: {
3900 native_shared_libs: ["mylib.arm64"],
3901 },
3902 x86_64: {
3903 native_shared_libs: ["mylib.x64"],
3904 },
3905 }
3906 }
3907
3908 apex_key {
3909 name: "myapex.key",
3910 public_key: "testkey.avbpubkey",
3911 private_key: "testkey.pem",
3912 }
3913
3914 cc_library {
3915 name: "mylib.arm64",
3916 srcs: ["mylib.cpp"],
3917 system_shared_libs: [],
3918 stl: "none",
3919 // TODO: remove //apex_available:platform
3920 apex_available: [
3921 "//apex_available:platform",
3922 "myapex",
3923 ],
3924 }
3925
3926 cc_library {
3927 name: "mylib.x64",
3928 srcs: ["mylib.cpp"],
3929 system_shared_libs: [],
3930 stl: "none",
3931 // TODO: remove //apex_available:platform
3932 apex_available: [
3933 "//apex_available:platform",
3934 "myapex",
3935 ],
3936 }
3937 `)
3938
3939 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
3940 copyCmds := apexRule.Args["copy_commands"]
3941
3942 // Ensure that apex variant is created for the direct dep
3943 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
3944 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
3945
3946 // Ensure that both direct and indirect deps are copied into apex
3947 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
3948 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
3949}
3950
Jiyong Park04480cf2019-02-06 00:16:29 +09003951func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003952 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003953 apex {
3954 name: "myapex",
3955 key: "myapex.key",
3956 binaries: ["myscript"],
3957 }
3958
3959 apex_key {
3960 name: "myapex.key",
3961 public_key: "testkey.avbpubkey",
3962 private_key: "testkey.pem",
3963 }
3964
3965 sh_binary {
3966 name: "myscript",
3967 src: "mylib.cpp",
3968 filename: "myscript.sh",
3969 sub_dir: "script",
3970 }
3971 `)
3972
Sundong Ahnabb64432019-10-22 13:58:29 +09003973 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003974 copyCmds := apexRule.Args["copy_commands"]
3975
3976 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3977}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003978
Jooyung Han91df2082019-11-20 01:49:42 +09003979func TestApexInVariousPartition(t *testing.T) {
3980 testcases := []struct {
3981 propName, parition, flattenedPartition string
3982 }{
3983 {"", "system", "system_ext"},
3984 {"product_specific: true", "product", "product"},
3985 {"soc_specific: true", "vendor", "vendor"},
3986 {"proprietary: true", "vendor", "vendor"},
3987 {"vendor: true", "vendor", "vendor"},
3988 {"system_ext_specific: true", "system_ext", "system_ext"},
3989 }
3990 for _, tc := range testcases {
3991 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3992 ctx, _ := testApex(t, `
3993 apex {
3994 name: "myapex",
3995 key: "myapex.key",
3996 `+tc.propName+`
3997 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003998
Jooyung Han91df2082019-11-20 01:49:42 +09003999 apex_key {
4000 name: "myapex.key",
4001 public_key: "testkey.avbpubkey",
4002 private_key: "testkey.pem",
4003 }
4004 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004005
Jooyung Han91df2082019-11-20 01:49:42 +09004006 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4007 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
4008 actual := apex.installDir.String()
4009 if actual != expected {
4010 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4011 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004012
Jooyung Han91df2082019-11-20 01:49:42 +09004013 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4014 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
4015 actual = flattened.installDir.String()
4016 if actual != expected {
4017 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4018 }
4019 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004020 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004021}
Jiyong Park67882562019-03-21 01:11:21 +09004022
Jooyung Han580eb4f2020-06-24 19:33:06 +09004023func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004024 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004025 apex {
4026 name: "myapex",
4027 key: "myapex.key",
4028 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004029
Jooyung Han580eb4f2020-06-24 19:33:06 +09004030 apex_key {
4031 name: "myapex.key",
4032 public_key: "testkey.avbpubkey",
4033 private_key: "testkey.pem",
4034 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004035 `)
4036 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004037 rule := module.Output("file_contexts")
4038 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4039}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004040
Jooyung Han580eb4f2020-06-24 19:33:06 +09004041func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004042 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004043 apex {
4044 name: "myapex",
4045 key: "myapex.key",
4046 file_contexts: "my_own_file_contexts",
4047 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004048
Jooyung Han580eb4f2020-06-24 19:33:06 +09004049 apex_key {
4050 name: "myapex.key",
4051 public_key: "testkey.avbpubkey",
4052 private_key: "testkey.pem",
4053 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004054 `, withFiles(map[string][]byte{
4055 "my_own_file_contexts": nil,
4056 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004057}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004058
Jooyung Han580eb4f2020-06-24 19:33:06 +09004059func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004060 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004061 apex {
4062 name: "myapex",
4063 key: "myapex.key",
4064 product_specific: true,
4065 file_contexts: "product_specific_file_contexts",
4066 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004067
Jooyung Han580eb4f2020-06-24 19:33:06 +09004068 apex_key {
4069 name: "myapex.key",
4070 public_key: "testkey.avbpubkey",
4071 private_key: "testkey.pem",
4072 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004073 `)
4074
Jooyung Han580eb4f2020-06-24 19:33:06 +09004075 ctx, _ := testApex(t, `
4076 apex {
4077 name: "myapex",
4078 key: "myapex.key",
4079 product_specific: true,
4080 file_contexts: "product_specific_file_contexts",
4081 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004082
Jooyung Han580eb4f2020-06-24 19:33:06 +09004083 apex_key {
4084 name: "myapex.key",
4085 public_key: "testkey.avbpubkey",
4086 private_key: "testkey.pem",
4087 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004088 `, withFiles(map[string][]byte{
4089 "product_specific_file_contexts": nil,
4090 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004091 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4092 rule := module.Output("file_contexts")
4093 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4094}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004095
Jooyung Han580eb4f2020-06-24 19:33:06 +09004096func TestFileContexts_SetViaFileGroup(t *testing.T) {
4097 ctx, _ := testApex(t, `
4098 apex {
4099 name: "myapex",
4100 key: "myapex.key",
4101 product_specific: true,
4102 file_contexts: ":my-file-contexts",
4103 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004104
Jooyung Han580eb4f2020-06-24 19:33:06 +09004105 apex_key {
4106 name: "myapex.key",
4107 public_key: "testkey.avbpubkey",
4108 private_key: "testkey.pem",
4109 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004110
Jooyung Han580eb4f2020-06-24 19:33:06 +09004111 filegroup {
4112 name: "my-file-contexts",
4113 srcs: ["product_specific_file_contexts"],
4114 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004115 `, withFiles(map[string][]byte{
4116 "product_specific_file_contexts": nil,
4117 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004118 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4119 rule := module.Output("file_contexts")
4120 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004121}
4122
Jiyong Park67882562019-03-21 01:11:21 +09004123func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004124 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004125 apex_key {
4126 name: "myapex.key",
4127 public_key: ":my.avbpubkey",
4128 private_key: ":my.pem",
4129 product_specific: true,
4130 }
4131
4132 filegroup {
4133 name: "my.avbpubkey",
4134 srcs: ["testkey2.avbpubkey"],
4135 }
4136
4137 filegroup {
4138 name: "my.pem",
4139 srcs: ["testkey2.pem"],
4140 }
4141 `)
4142
4143 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4144 expected_pubkey := "testkey2.avbpubkey"
4145 actual_pubkey := apex_key.public_key_file.String()
4146 if actual_pubkey != expected_pubkey {
4147 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4148 }
4149 expected_privkey := "testkey2.pem"
4150 actual_privkey := apex_key.private_key_file.String()
4151 if actual_privkey != expected_privkey {
4152 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4153 }
4154}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004155
4156func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004157 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004158 prebuilt_apex {
4159 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004160 arch: {
4161 arm64: {
4162 src: "myapex-arm64.apex",
4163 },
4164 arm: {
4165 src: "myapex-arm.apex",
4166 },
4167 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004168 }
4169 `)
4170
4171 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4172
Jiyong Parkc95714e2019-03-29 14:23:10 +09004173 expectedInput := "myapex-arm64.apex"
4174 if prebuilt.inputApex.String() != expectedInput {
4175 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4176 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004177}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004178
4179func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004180 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004181 prebuilt_apex {
4182 name: "myapex",
4183 src: "myapex-arm.apex",
4184 filename: "notmyapex.apex",
4185 }
4186 `)
4187
4188 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4189
4190 expected := "notmyapex.apex"
4191 if p.installFilename != expected {
4192 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4193 }
4194}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004195
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004196func TestPrebuiltOverrides(t *testing.T) {
4197 ctx, config := testApex(t, `
4198 prebuilt_apex {
4199 name: "myapex.prebuilt",
4200 src: "myapex-arm.apex",
4201 overrides: [
4202 "myapex",
4203 ],
4204 }
4205 `)
4206
4207 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4208
4209 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09004210 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004211 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004212 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004213 }
4214}
4215
Roland Levillain630846d2019-06-26 12:48:34 +01004216func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004217 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004218 apex_test {
4219 name: "myapex",
4220 key: "myapex.key",
4221 tests: [
4222 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004223 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004224 ],
4225 }
4226
4227 apex_key {
4228 name: "myapex.key",
4229 public_key: "testkey.avbpubkey",
4230 private_key: "testkey.pem",
4231 }
4232
Liz Kammer1c14a212020-05-12 15:26:55 -07004233 filegroup {
4234 name: "fg",
4235 srcs: [
4236 "baz",
4237 "bar/baz"
4238 ],
4239 }
4240
Roland Levillain630846d2019-06-26 12:48:34 +01004241 cc_test {
4242 name: "mytest",
4243 gtest: false,
4244 srcs: ["mytest.cpp"],
4245 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004246 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004247 system_shared_libs: [],
4248 static_executable: true,
4249 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004250 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004251 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004252
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004253 cc_library {
4254 name: "mylib",
4255 srcs: ["mylib.cpp"],
4256 system_shared_libs: [],
4257 stl: "none",
4258 }
4259
Liz Kammer5bd365f2020-05-27 15:15:11 -07004260 filegroup {
4261 name: "fg2",
4262 srcs: [
4263 "testdata/baz"
4264 ],
4265 }
4266
Roland Levillain9b5fde92019-06-28 15:41:19 +01004267 cc_test {
4268 name: "mytests",
4269 gtest: false,
4270 srcs: [
4271 "mytest1.cpp",
4272 "mytest2.cpp",
4273 "mytest3.cpp",
4274 ],
4275 test_per_src: true,
4276 relative_install_path: "test",
4277 system_shared_libs: [],
4278 static_executable: true,
4279 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004280 data: [
4281 ":fg",
4282 ":fg2",
4283 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004284 }
Roland Levillain630846d2019-06-26 12:48:34 +01004285 `)
4286
Sundong Ahnabb64432019-10-22 13:58:29 +09004287 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004288 copyCmds := apexRule.Args["copy_commands"]
4289
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004290 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004291 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004292 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004293
Liz Kammer1c14a212020-05-12 15:26:55 -07004294 //Ensure that test data are copied into apex.
4295 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4296 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4297
Roland Levillain9b5fde92019-06-28 15:41:19 +01004298 // Ensure that test deps built with `test_per_src` are copied into apex.
4299 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4300 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4301 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004302
4303 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004304 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4305 data := android.AndroidMkDataForTest(t, config, "", bundle)
4306 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004307 prefix := "TARGET_"
4308 var builder strings.Builder
4309 data.Custom(&builder, name, prefix, "", data)
4310 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004311 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4312 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4313 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4314 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004315 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004316 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004317 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004318
4319 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4320 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4321 data.Custom(&builder, name, prefix, "", data)
4322 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004323 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4324 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004325}
4326
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004327func TestInstallExtraFlattenedApexes(t *testing.T) {
4328 ctx, config := testApex(t, `
4329 apex {
4330 name: "myapex",
4331 key: "myapex.key",
4332 }
4333 apex_key {
4334 name: "myapex.key",
4335 public_key: "testkey.avbpubkey",
4336 private_key: "testkey.pem",
4337 }
4338 `, func(fs map[string][]byte, config android.Config) {
4339 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4340 })
4341 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004342 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004343 mk := android.AndroidMkDataForTest(t, config, "", ab)
4344 var builder strings.Builder
4345 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4346 androidMk := builder.String()
4347 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4348}
4349
Jooyung Hand48f3c32019-08-23 11:18:57 +09004350func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4351 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4352 apex {
4353 name: "myapex",
4354 key: "myapex.key",
4355 native_shared_libs: ["libfoo"],
4356 }
4357
4358 apex_key {
4359 name: "myapex.key",
4360 public_key: "testkey.avbpubkey",
4361 private_key: "testkey.pem",
4362 }
4363
4364 cc_library {
4365 name: "libfoo",
4366 stl: "none",
4367 system_shared_libs: [],
4368 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004369 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004370 }
4371 `)
4372 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4373 apex {
4374 name: "myapex",
4375 key: "myapex.key",
4376 java_libs: ["myjar"],
4377 }
4378
4379 apex_key {
4380 name: "myapex.key",
4381 public_key: "testkey.avbpubkey",
4382 private_key: "testkey.pem",
4383 }
4384
4385 java_library {
4386 name: "myjar",
4387 srcs: ["foo/bar/MyClass.java"],
4388 sdk_version: "none",
4389 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004390 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004391 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004392 }
4393 `)
4394}
4395
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004396func TestApexWithApps(t *testing.T) {
4397 ctx, _ := testApex(t, `
4398 apex {
4399 name: "myapex",
4400 key: "myapex.key",
4401 apps: [
4402 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004403 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004404 ],
4405 }
4406
4407 apex_key {
4408 name: "myapex.key",
4409 public_key: "testkey.avbpubkey",
4410 private_key: "testkey.pem",
4411 }
4412
4413 android_app {
4414 name: "AppFoo",
4415 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004416 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004417 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004418 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004419 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004420 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004421 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004422
4423 android_app {
4424 name: "AppFooPriv",
4425 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004426 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004427 system_modules: "none",
4428 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004429 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004430 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004431 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004432
4433 cc_library_shared {
4434 name: "libjni",
4435 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004436 shared_libs: ["libfoo"],
4437 stl: "none",
4438 system_shared_libs: [],
4439 apex_available: [ "myapex" ],
4440 sdk_version: "current",
4441 }
4442
4443 cc_library_shared {
4444 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004445 stl: "none",
4446 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004447 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004448 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004449 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004450 `)
4451
Sundong Ahnabb64432019-10-22 13:58:29 +09004452 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004453 apexRule := module.Rule("apexRule")
4454 copyCmds := apexRule.Args["copy_commands"]
4455
4456 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004457 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004458
Colin Crossaede88c2020-08-11 12:17:01 -07004459 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004460 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004461 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004462 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004463 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004464 // JNI libraries including transitive deps are
4465 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004466 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004467 // ... embedded inside APK (jnilibs.zip)
4468 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4469 // ... and not directly inside the APEX
4470 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4471 }
Dario Frenicde2a032019-10-27 00:29:22 +01004472}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004473
Dario Frenicde2a032019-10-27 00:29:22 +01004474func TestApexWithAppImports(t *testing.T) {
4475 ctx, _ := testApex(t, `
4476 apex {
4477 name: "myapex",
4478 key: "myapex.key",
4479 apps: [
4480 "AppFooPrebuilt",
4481 "AppFooPrivPrebuilt",
4482 ],
4483 }
4484
4485 apex_key {
4486 name: "myapex.key",
4487 public_key: "testkey.avbpubkey",
4488 private_key: "testkey.pem",
4489 }
4490
4491 android_app_import {
4492 name: "AppFooPrebuilt",
4493 apk: "PrebuiltAppFoo.apk",
4494 presigned: true,
4495 dex_preopt: {
4496 enabled: false,
4497 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004498 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004499 }
4500
4501 android_app_import {
4502 name: "AppFooPrivPrebuilt",
4503 apk: "PrebuiltAppFooPriv.apk",
4504 privileged: true,
4505 presigned: true,
4506 dex_preopt: {
4507 enabled: false,
4508 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004509 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004510 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004511 }
4512 `)
4513
Sundong Ahnabb64432019-10-22 13:58:29 +09004514 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004515 apexRule := module.Rule("apexRule")
4516 copyCmds := apexRule.Args["copy_commands"]
4517
4518 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004519 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4520}
4521
4522func TestApexWithAppImportsPrefer(t *testing.T) {
4523 ctx, _ := testApex(t, `
4524 apex {
4525 name: "myapex",
4526 key: "myapex.key",
4527 apps: [
4528 "AppFoo",
4529 ],
4530 }
4531
4532 apex_key {
4533 name: "myapex.key",
4534 public_key: "testkey.avbpubkey",
4535 private_key: "testkey.pem",
4536 }
4537
4538 android_app {
4539 name: "AppFoo",
4540 srcs: ["foo/bar/MyClass.java"],
4541 sdk_version: "none",
4542 system_modules: "none",
4543 apex_available: [ "myapex" ],
4544 }
4545
4546 android_app_import {
4547 name: "AppFoo",
4548 apk: "AppFooPrebuilt.apk",
4549 filename: "AppFooPrebuilt.apk",
4550 presigned: true,
4551 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004552 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004553 }
4554 `, withFiles(map[string][]byte{
4555 "AppFooPrebuilt.apk": nil,
4556 }))
4557
4558 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4559 "app/AppFoo/AppFooPrebuilt.apk",
4560 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004561}
4562
Dario Freni6f3937c2019-12-20 22:58:03 +00004563func TestApexWithTestHelperApp(t *testing.T) {
4564 ctx, _ := testApex(t, `
4565 apex {
4566 name: "myapex",
4567 key: "myapex.key",
4568 apps: [
4569 "TesterHelpAppFoo",
4570 ],
4571 }
4572
4573 apex_key {
4574 name: "myapex.key",
4575 public_key: "testkey.avbpubkey",
4576 private_key: "testkey.pem",
4577 }
4578
4579 android_test_helper_app {
4580 name: "TesterHelpAppFoo",
4581 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004582 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004583 }
4584
4585 `)
4586
4587 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4588 apexRule := module.Rule("apexRule")
4589 copyCmds := apexRule.Args["copy_commands"]
4590
4591 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4592}
4593
Jooyung Han18020ea2019-11-13 10:50:48 +09004594func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4595 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00004596 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004597 apex {
4598 name: "myapex",
4599 key: "myapex.key",
4600 native_shared_libs: ["libfoo"],
4601 }
4602
4603 apex_key {
4604 name: "myapex.key",
4605 public_key: "testkey.avbpubkey",
4606 private_key: "testkey.pem",
4607 }
4608
4609 apex {
4610 name: "otherapex",
4611 key: "myapex.key",
4612 native_shared_libs: ["libfoo"],
4613 }
4614
4615 cc_defaults {
4616 name: "libfoo-defaults",
4617 apex_available: ["otherapex"],
4618 }
4619
4620 cc_library {
4621 name: "libfoo",
4622 defaults: ["libfoo-defaults"],
4623 stl: "none",
4624 system_shared_libs: [],
4625 }`)
4626}
4627
Paul Duffine52e66f2020-03-30 17:54:29 +01004628func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004629 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00004630 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09004631 apex {
4632 name: "myapex",
4633 key: "myapex.key",
4634 native_shared_libs: ["libfoo"],
4635 }
4636
4637 apex_key {
4638 name: "myapex.key",
4639 public_key: "testkey.avbpubkey",
4640 private_key: "testkey.pem",
4641 }
4642
4643 apex {
4644 name: "otherapex",
4645 key: "otherapex.key",
4646 native_shared_libs: ["libfoo"],
4647 }
4648
4649 apex_key {
4650 name: "otherapex.key",
4651 public_key: "testkey.avbpubkey",
4652 private_key: "testkey.pem",
4653 }
4654
4655 cc_library {
4656 name: "libfoo",
4657 stl: "none",
4658 system_shared_libs: [],
4659 apex_available: ["otherapex"],
4660 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004661}
Jiyong Park127b40b2019-09-30 16:04:35 +09004662
Paul Duffine52e66f2020-03-30 17:54:29 +01004663func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004664 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00004665 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004666.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004667.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004668.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004669.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004670.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004671.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004672 apex {
4673 name: "myapex",
4674 key: "myapex.key",
4675 native_shared_libs: ["libfoo"],
4676 }
4677
4678 apex_key {
4679 name: "myapex.key",
4680 public_key: "testkey.avbpubkey",
4681 private_key: "testkey.pem",
4682 }
4683
Jiyong Park127b40b2019-09-30 16:04:35 +09004684 cc_library {
4685 name: "libfoo",
4686 stl: "none",
4687 shared_libs: ["libbar"],
4688 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004689 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004690 }
4691
4692 cc_library {
4693 name: "libbar",
4694 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004695 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004696 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004697 apex_available: ["myapex"],
4698 }
4699
4700 cc_library {
4701 name: "libbaz",
4702 stl: "none",
4703 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004704 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004705}
Jiyong Park127b40b2019-09-30 16:04:35 +09004706
Paul Duffine52e66f2020-03-30 17:54:29 +01004707func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004708 testApexError(t, "\"otherapex\" is not a valid module name", `
4709 apex {
4710 name: "myapex",
4711 key: "myapex.key",
4712 native_shared_libs: ["libfoo"],
4713 }
4714
4715 apex_key {
4716 name: "myapex.key",
4717 public_key: "testkey.avbpubkey",
4718 private_key: "testkey.pem",
4719 }
4720
4721 cc_library {
4722 name: "libfoo",
4723 stl: "none",
4724 system_shared_libs: [],
4725 apex_available: ["otherapex"],
4726 }`)
4727
Paul Duffine52e66f2020-03-30 17:54:29 +01004728 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004729 apex {
4730 name: "myapex",
4731 key: "myapex.key",
4732 native_shared_libs: ["libfoo", "libbar"],
4733 }
4734
4735 apex_key {
4736 name: "myapex.key",
4737 public_key: "testkey.avbpubkey",
4738 private_key: "testkey.pem",
4739 }
4740
4741 cc_library {
4742 name: "libfoo",
4743 stl: "none",
4744 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004745 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004746 apex_available: ["myapex"],
4747 }
4748
4749 cc_library {
4750 name: "libbar",
4751 stl: "none",
4752 system_shared_libs: [],
4753 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004754 }
4755
4756 cc_library {
4757 name: "libbaz",
4758 stl: "none",
4759 system_shared_libs: [],
4760 stubs: {
4761 versions: ["10", "20", "30"],
4762 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004763 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004764}
Jiyong Park127b40b2019-09-30 16:04:35 +09004765
Jiyong Park89e850a2020-04-07 16:37:39 +09004766func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004767 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004768 apex {
4769 name: "myapex",
4770 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004771 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004772 }
4773
4774 apex_key {
4775 name: "myapex.key",
4776 public_key: "testkey.avbpubkey",
4777 private_key: "testkey.pem",
4778 }
4779
4780 cc_library {
4781 name: "libfoo",
4782 stl: "none",
4783 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004784 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004785 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004786 }
4787
4788 cc_library {
4789 name: "libfoo2",
4790 stl: "none",
4791 system_shared_libs: [],
4792 shared_libs: ["libbaz"],
4793 apex_available: ["//apex_available:platform"],
4794 }
4795
4796 cc_library {
4797 name: "libbar",
4798 stl: "none",
4799 system_shared_libs: [],
4800 apex_available: ["myapex"],
4801 }
4802
4803 cc_library {
4804 name: "libbaz",
4805 stl: "none",
4806 system_shared_libs: [],
4807 apex_available: ["myapex"],
4808 stubs: {
4809 versions: ["1"],
4810 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004811 }`)
4812
Jiyong Park89e850a2020-04-07 16:37:39 +09004813 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4814 // because it depends on libbar which isn't available to platform
4815 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4816 if libfoo.NotAvailableForPlatform() != true {
4817 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4818 }
4819
4820 // libfoo2 however can be available to platform because it depends on libbaz which provides
4821 // stubs
4822 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4823 if libfoo2.NotAvailableForPlatform() == true {
4824 t.Errorf("%q should be available to platform", libfoo2.String())
4825 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004826}
Jiyong Parka90ca002019-10-07 15:47:24 +09004827
Paul Duffine52e66f2020-03-30 17:54:29 +01004828func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004829 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004830 apex {
4831 name: "myapex",
4832 key: "myapex.key",
4833 native_shared_libs: ["libfoo"],
4834 }
4835
4836 apex_key {
4837 name: "myapex.key",
4838 public_key: "testkey.avbpubkey",
4839 private_key: "testkey.pem",
4840 }
4841
4842 cc_library {
4843 name: "libfoo",
4844 stl: "none",
4845 system_shared_libs: [],
4846 apex_available: ["myapex"],
4847 static: {
4848 apex_available: ["//apex_available:platform"],
4849 },
4850 }`)
4851
Jiyong Park89e850a2020-04-07 16:37:39 +09004852 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4853 if libfooShared.NotAvailableForPlatform() != true {
4854 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4855 }
4856 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4857 if libfooStatic.NotAvailableForPlatform() != false {
4858 t.Errorf("%q should be available to platform", libfooStatic.String())
4859 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004860}
4861
Jiyong Park5d790c32019-11-15 18:40:32 +09004862func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004863 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004864 apex {
4865 name: "myapex",
4866 key: "myapex.key",
4867 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004868 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004869 }
4870
4871 override_apex {
4872 name: "override_myapex",
4873 base: "myapex",
4874 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004875 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004876 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004877 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004878 }
4879
4880 apex_key {
4881 name: "myapex.key",
4882 public_key: "testkey.avbpubkey",
4883 private_key: "testkey.pem",
4884 }
4885
4886 android_app {
4887 name: "app",
4888 srcs: ["foo/bar/MyClass.java"],
4889 package_name: "foo",
4890 sdk_version: "none",
4891 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004892 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004893 }
4894
4895 override_android_app {
4896 name: "override_app",
4897 base: "app",
4898 package_name: "bar",
4899 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004900 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004901
Jiyong Park317645e2019-12-05 13:20:58 +09004902 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4903 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4904 if originalVariant.GetOverriddenBy() != "" {
4905 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4906 }
4907 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4908 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4909 }
4910
Jiyong Park5d790c32019-11-15 18:40:32 +09004911 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4912 apexRule := module.Rule("apexRule")
4913 copyCmds := apexRule.Args["copy_commands"]
4914
4915 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004916 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004917
4918 apexBundle := module.Module().(*apexBundle)
4919 name := apexBundle.Name()
4920 if name != "override_myapex" {
4921 t.Errorf("name should be \"override_myapex\", but was %q", name)
4922 }
4923
Baligh Uddin004d7172020-02-19 21:29:28 -08004924 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4925 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4926 }
4927
Jiyong Park20bacab2020-03-03 11:45:41 +09004928 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004929 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004930
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004931 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4932 var builder strings.Builder
4933 data.Custom(&builder, name, "TARGET_", "", data)
4934 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004935 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004936 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4937 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004938 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004939 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004940 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004941 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4942 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004943}
4944
Jooyung Han214bf372019-11-12 13:03:50 +09004945func TestLegacyAndroid10Support(t *testing.T) {
4946 ctx, _ := testApex(t, `
4947 apex {
4948 name: "myapex",
4949 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004950 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004951 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004952 }
4953
4954 apex_key {
4955 name: "myapex.key",
4956 public_key: "testkey.avbpubkey",
4957 private_key: "testkey.pem",
4958 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004959
4960 cc_library {
4961 name: "mylib",
4962 srcs: ["mylib.cpp"],
4963 stl: "libc++",
4964 system_shared_libs: [],
4965 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004966 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004967 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004968 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004969
4970 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4971 args := module.Rule("apexRule").Args
4972 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004973 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004974
4975 // The copies of the libraries in the apex should have one more dependency than
4976 // the ones outside the apex, namely the unwinder. Ideally we should check
4977 // the dependency names directly here but for some reason the names are blank in
4978 // this test.
4979 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004980 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004981 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4982 if len(apexImplicits) != len(nonApexImplicits)+1 {
4983 t.Errorf("%q missing unwinder dep", lib)
4984 }
4985 }
Jooyung Han214bf372019-11-12 13:03:50 +09004986}
4987
Paul Duffin9b879592020-05-26 13:21:35 +01004988var filesForSdkLibrary = map[string][]byte{
4989 "api/current.txt": nil,
4990 "api/removed.txt": nil,
4991 "api/system-current.txt": nil,
4992 "api/system-removed.txt": nil,
4993 "api/test-current.txt": nil,
4994 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004995
4996 // For java_sdk_library_import
4997 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004998}
4999
Jooyung Han58f26ab2019-12-18 15:34:32 +09005000func TestJavaSDKLibrary(t *testing.T) {
5001 ctx, _ := testApex(t, `
5002 apex {
5003 name: "myapex",
5004 key: "myapex.key",
5005 java_libs: ["foo"],
5006 }
5007
5008 apex_key {
5009 name: "myapex.key",
5010 public_key: "testkey.avbpubkey",
5011 private_key: "testkey.pem",
5012 }
5013
5014 java_sdk_library {
5015 name: "foo",
5016 srcs: ["a.java"],
5017 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005018 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005019 }
Paul Duffin9b879592020-05-26 13:21:35 +01005020 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005021
5022 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005023 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005024 "javalib/foo.jar",
5025 "etc/permissions/foo.xml",
5026 })
5027 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005028 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5029 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005030}
5031
Paul Duffin9b879592020-05-26 13:21:35 +01005032func TestJavaSDKLibrary_WithinApex(t *testing.T) {
5033 ctx, _ := testApex(t, `
5034 apex {
5035 name: "myapex",
5036 key: "myapex.key",
5037 java_libs: ["foo", "bar"],
5038 }
5039
5040 apex_key {
5041 name: "myapex.key",
5042 public_key: "testkey.avbpubkey",
5043 private_key: "testkey.pem",
5044 }
5045
5046 java_sdk_library {
5047 name: "foo",
5048 srcs: ["a.java"],
5049 api_packages: ["foo"],
5050 apex_available: ["myapex"],
5051 sdk_version: "none",
5052 system_modules: "none",
5053 }
5054
5055 java_library {
5056 name: "bar",
5057 srcs: ["a.java"],
5058 libs: ["foo"],
5059 apex_available: ["myapex"],
5060 sdk_version: "none",
5061 system_modules: "none",
5062 }
5063 `, withFiles(filesForSdkLibrary))
5064
5065 // java_sdk_library installs both impl jar and permission XML
5066 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5067 "javalib/bar.jar",
5068 "javalib/foo.jar",
5069 "etc/permissions/foo.xml",
5070 })
5071
5072 // The bar library should depend on the implementation jar.
5073 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5074 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5075 t.Errorf("expected %q, found %#q", expected, actual)
5076 }
5077}
5078
5079func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
5080 ctx, _ := testApex(t, `
5081 apex {
5082 name: "myapex",
5083 key: "myapex.key",
5084 java_libs: ["foo"],
5085 }
5086
5087 apex_key {
5088 name: "myapex.key",
5089 public_key: "testkey.avbpubkey",
5090 private_key: "testkey.pem",
5091 }
5092
5093 java_sdk_library {
5094 name: "foo",
5095 srcs: ["a.java"],
5096 api_packages: ["foo"],
5097 apex_available: ["myapex"],
5098 sdk_version: "none",
5099 system_modules: "none",
5100 }
5101
5102 java_library {
5103 name: "bar",
5104 srcs: ["a.java"],
5105 libs: ["foo"],
5106 sdk_version: "none",
5107 system_modules: "none",
5108 }
5109 `, withFiles(filesForSdkLibrary))
5110
5111 // java_sdk_library installs both impl jar and permission XML
5112 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5113 "javalib/foo.jar",
5114 "etc/permissions/foo.xml",
5115 })
5116
5117 // The bar library should depend on the stubs jar.
5118 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5119 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5120 t.Errorf("expected %q, found %#q", expected, actual)
5121 }
5122}
5123
Paul Duffineedc5d52020-06-12 17:46:39 +01005124func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
5125 ctx, _ := testApex(t, ``,
5126 withFiles(map[string][]byte{
5127 "apex/a.java": nil,
5128 "apex/apex_manifest.json": nil,
5129 "apex/Android.bp": []byte(`
5130 package {
5131 default_visibility: ["//visibility:private"],
5132 }
5133
5134 apex {
5135 name: "myapex",
5136 key: "myapex.key",
5137 java_libs: ["foo", "bar"],
5138 }
5139
5140 apex_key {
5141 name: "myapex.key",
5142 public_key: "testkey.avbpubkey",
5143 private_key: "testkey.pem",
5144 }
5145
5146 java_library {
5147 name: "bar",
5148 srcs: ["a.java"],
5149 libs: ["foo"],
5150 apex_available: ["myapex"],
5151 sdk_version: "none",
5152 system_modules: "none",
5153 }
5154`),
5155 "source/a.java": nil,
5156 "source/api/current.txt": nil,
5157 "source/api/removed.txt": nil,
5158 "source/Android.bp": []byte(`
5159 package {
5160 default_visibility: ["//visibility:private"],
5161 }
5162
5163 java_sdk_library {
5164 name: "foo",
5165 visibility: ["//apex"],
5166 srcs: ["a.java"],
5167 api_packages: ["foo"],
5168 apex_available: ["myapex"],
5169 sdk_version: "none",
5170 system_modules: "none",
5171 public: {
5172 enabled: true,
5173 },
5174 }
5175`),
5176 "prebuilt/a.jar": nil,
5177 "prebuilt/Android.bp": []byte(`
5178 package {
5179 default_visibility: ["//visibility:private"],
5180 }
5181
5182 java_sdk_library_import {
5183 name: "foo",
5184 visibility: ["//apex", "//source"],
5185 apex_available: ["myapex"],
5186 prefer: true,
5187 public: {
5188 jars: ["a.jar"],
5189 },
5190 }
5191`),
5192 }),
5193 )
5194
5195 // java_sdk_library installs both impl jar and permission XML
5196 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5197 "javalib/bar.jar",
5198 "javalib/foo.jar",
5199 "etc/permissions/foo.xml",
5200 })
5201
5202 // The bar library should depend on the implementation jar.
5203 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5204 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5205 t.Errorf("expected %q, found %#q", expected, actual)
5206 }
5207}
5208
5209func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5210 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5211 apex {
5212 name: "myapex",
5213 key: "myapex.key",
5214 java_libs: ["foo"],
5215 }
5216
5217 apex_key {
5218 name: "myapex.key",
5219 public_key: "testkey.avbpubkey",
5220 private_key: "testkey.pem",
5221 }
5222
5223 java_sdk_library_import {
5224 name: "foo",
5225 apex_available: ["myapex"],
5226 prefer: true,
5227 public: {
5228 jars: ["a.jar"],
5229 },
5230 }
5231
5232 `, withFiles(filesForSdkLibrary))
5233}
5234
atrost6e126252020-01-27 17:01:16 +00005235func TestCompatConfig(t *testing.T) {
5236 ctx, _ := testApex(t, `
5237 apex {
5238 name: "myapex",
5239 key: "myapex.key",
5240 prebuilts: ["myjar-platform-compat-config"],
5241 java_libs: ["myjar"],
5242 }
5243
5244 apex_key {
5245 name: "myapex.key",
5246 public_key: "testkey.avbpubkey",
5247 private_key: "testkey.pem",
5248 }
5249
5250 platform_compat_config {
5251 name: "myjar-platform-compat-config",
5252 src: ":myjar",
5253 }
5254
5255 java_library {
5256 name: "myjar",
5257 srcs: ["foo/bar/MyClass.java"],
5258 sdk_version: "none",
5259 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005260 apex_available: [ "myapex" ],
5261 }
5262 `)
5263 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5264 "etc/compatconfig/myjar-platform-compat-config.xml",
5265 "javalib/myjar.jar",
5266 })
5267}
5268
Jiyong Park479321d2019-12-16 11:47:12 +09005269func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5270 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5271 apex {
5272 name: "myapex",
5273 key: "myapex.key",
5274 java_libs: ["myjar"],
5275 }
5276
5277 apex_key {
5278 name: "myapex.key",
5279 public_key: "testkey.avbpubkey",
5280 private_key: "testkey.pem",
5281 }
5282
5283 java_library {
5284 name: "myjar",
5285 srcs: ["foo/bar/MyClass.java"],
5286 sdk_version: "none",
5287 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005288 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005289 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005290 }
5291 `)
5292}
5293
Jiyong Park7afd1072019-12-30 16:56:33 +09005294func TestCarryRequiredModuleNames(t *testing.T) {
5295 ctx, config := testApex(t, `
5296 apex {
5297 name: "myapex",
5298 key: "myapex.key",
5299 native_shared_libs: ["mylib"],
5300 }
5301
5302 apex_key {
5303 name: "myapex.key",
5304 public_key: "testkey.avbpubkey",
5305 private_key: "testkey.pem",
5306 }
5307
5308 cc_library {
5309 name: "mylib",
5310 srcs: ["mylib.cpp"],
5311 system_shared_libs: [],
5312 stl: "none",
5313 required: ["a", "b"],
5314 host_required: ["c", "d"],
5315 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005316 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005317 }
5318 `)
5319
5320 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5321 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5322 name := apexBundle.BaseModuleName()
5323 prefix := "TARGET_"
5324 var builder strings.Builder
5325 data.Custom(&builder, name, prefix, "", data)
5326 androidMk := builder.String()
5327 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5328 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5329 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5330}
5331
Jiyong Park7cd10e32020-01-14 09:22:18 +09005332func TestSymlinksFromApexToSystem(t *testing.T) {
5333 bp := `
5334 apex {
5335 name: "myapex",
5336 key: "myapex.key",
5337 native_shared_libs: ["mylib"],
5338 java_libs: ["myjar"],
5339 }
5340
Jiyong Park9d677202020-02-19 16:29:35 +09005341 apex {
5342 name: "myapex.updatable",
5343 key: "myapex.key",
5344 native_shared_libs: ["mylib"],
5345 java_libs: ["myjar"],
5346 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005347 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005348 }
5349
Jiyong Park7cd10e32020-01-14 09:22:18 +09005350 apex_key {
5351 name: "myapex.key",
5352 public_key: "testkey.avbpubkey",
5353 private_key: "testkey.pem",
5354 }
5355
5356 cc_library {
5357 name: "mylib",
5358 srcs: ["mylib.cpp"],
5359 shared_libs: ["myotherlib"],
5360 system_shared_libs: [],
5361 stl: "none",
5362 apex_available: [
5363 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005364 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005365 "//apex_available:platform",
5366 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005367 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005368 }
5369
5370 cc_library {
5371 name: "myotherlib",
5372 srcs: ["mylib.cpp"],
5373 system_shared_libs: [],
5374 stl: "none",
5375 apex_available: [
5376 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005377 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005378 "//apex_available:platform",
5379 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005380 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005381 }
5382
5383 java_library {
5384 name: "myjar",
5385 srcs: ["foo/bar/MyClass.java"],
5386 sdk_version: "none",
5387 system_modules: "none",
5388 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005389 apex_available: [
5390 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005391 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005392 "//apex_available:platform",
5393 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005394 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005395 }
5396
5397 java_library {
5398 name: "myotherjar",
5399 srcs: ["foo/bar/MyClass.java"],
5400 sdk_version: "none",
5401 system_modules: "none",
5402 apex_available: [
5403 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005404 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005405 "//apex_available:platform",
5406 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005407 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005408 }
5409 `
5410
5411 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5412 for _, f := range files {
5413 if f.path == file {
5414 if f.isLink {
5415 t.Errorf("%q is not a real file", file)
5416 }
5417 return
5418 }
5419 }
5420 t.Errorf("%q is not found", file)
5421 }
5422
5423 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5424 for _, f := range files {
5425 if f.path == file {
5426 if !f.isLink {
5427 t.Errorf("%q is not a symlink", file)
5428 }
5429 return
5430 }
5431 }
5432 t.Errorf("%q is not found", file)
5433 }
5434
Jiyong Park9d677202020-02-19 16:29:35 +09005435 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5436 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005437 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005438 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005439 ensureRealfileExists(t, files, "javalib/myjar.jar")
5440 ensureRealfileExists(t, files, "lib64/mylib.so")
5441 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5442
Jiyong Park9d677202020-02-19 16:29:35 +09005443 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5444 ensureRealfileExists(t, files, "javalib/myjar.jar")
5445 ensureRealfileExists(t, files, "lib64/mylib.so")
5446 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5447
5448 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005449 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005450 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005451 ensureRealfileExists(t, files, "javalib/myjar.jar")
5452 ensureRealfileExists(t, files, "lib64/mylib.so")
5453 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005454
5455 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5456 ensureRealfileExists(t, files, "javalib/myjar.jar")
5457 ensureRealfileExists(t, files, "lib64/mylib.so")
5458 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005459}
5460
Yo Chiange8128052020-07-23 20:09:18 +08005461func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5462 ctx, config := testApex(t, `
5463 apex {
5464 name: "myapex",
5465 key: "myapex.key",
5466 native_shared_libs: ["mylib"],
5467 }
5468
5469 apex_key {
5470 name: "myapex.key",
5471 public_key: "testkey.avbpubkey",
5472 private_key: "testkey.pem",
5473 }
5474
5475 cc_library_shared {
5476 name: "mylib",
5477 srcs: ["mylib.cpp"],
5478 shared_libs: ["myotherlib"],
5479 system_shared_libs: [],
5480 stl: "none",
5481 apex_available: [
5482 "myapex",
5483 "//apex_available:platform",
5484 ],
5485 }
5486
5487 cc_prebuilt_library_shared {
5488 name: "myotherlib",
5489 srcs: ["prebuilt.so"],
5490 system_shared_libs: [],
5491 stl: "none",
5492 apex_available: [
5493 "myapex",
5494 "//apex_available:platform",
5495 ],
5496 }
5497 `)
5498
5499 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5500 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5501 var builder strings.Builder
5502 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5503 androidMk := builder.String()
5504 // `myotherlib` is added to `myapex` as symlink
5505 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5506 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5507 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5508 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5509 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5510}
5511
Jooyung Han643adc42020-02-27 13:50:06 +09005512func TestApexWithJniLibs(t *testing.T) {
5513 ctx, _ := testApex(t, `
5514 apex {
5515 name: "myapex",
5516 key: "myapex.key",
5517 jni_libs: ["mylib"],
5518 }
5519
5520 apex_key {
5521 name: "myapex.key",
5522 public_key: "testkey.avbpubkey",
5523 private_key: "testkey.pem",
5524 }
5525
5526 cc_library {
5527 name: "mylib",
5528 srcs: ["mylib.cpp"],
5529 shared_libs: ["mylib2"],
5530 system_shared_libs: [],
5531 stl: "none",
5532 apex_available: [ "myapex" ],
5533 }
5534
5535 cc_library {
5536 name: "mylib2",
5537 srcs: ["mylib.cpp"],
5538 system_shared_libs: [],
5539 stl: "none",
5540 apex_available: [ "myapex" ],
5541 }
5542 `)
5543
5544 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5545 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5546 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5547 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5548 "lib64/mylib.so",
5549 "lib64/mylib2.so",
5550 })
5551}
5552
Jooyung Han49f67012020-04-17 13:43:10 +09005553func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5554 ctx, _ := testApex(t, `
5555 apex {
5556 name: "myapex",
5557 key: "myapex.key",
5558 }
5559 apex_key {
5560 name: "myapex.key",
5561 public_key: "testkey.avbpubkey",
5562 private_key: "testkey.pem",
5563 }
5564 `, func(fs map[string][]byte, config android.Config) {
5565 delete(config.Targets, android.Android)
5566 config.AndroidCommonTarget = android.Target{}
5567 })
5568
5569 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5570 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5571 }
5572}
5573
Jiyong Parkbd159612020-02-28 15:22:21 +09005574func TestAppBundle(t *testing.T) {
5575 ctx, _ := testApex(t, `
5576 apex {
5577 name: "myapex",
5578 key: "myapex.key",
5579 apps: ["AppFoo"],
5580 }
5581
5582 apex_key {
5583 name: "myapex.key",
5584 public_key: "testkey.avbpubkey",
5585 private_key: "testkey.pem",
5586 }
5587
5588 android_app {
5589 name: "AppFoo",
5590 srcs: ["foo/bar/MyClass.java"],
5591 sdk_version: "none",
5592 system_modules: "none",
5593 apex_available: [ "myapex" ],
5594 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005595 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005596
Colin Crosscf371cc2020-11-13 11:48:42 -08005597 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09005598 content := bundleConfigRule.Args["content"]
5599
5600 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005601 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 +09005602}
5603
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005604func TestAppSetBundle(t *testing.T) {
5605 ctx, _ := testApex(t, `
5606 apex {
5607 name: "myapex",
5608 key: "myapex.key",
5609 apps: ["AppSet"],
5610 }
5611
5612 apex_key {
5613 name: "myapex.key",
5614 public_key: "testkey.avbpubkey",
5615 private_key: "testkey.pem",
5616 }
5617
5618 android_app_set {
5619 name: "AppSet",
5620 set: "AppSet.apks",
5621 }`)
5622 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08005623 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005624 content := bundleConfigRule.Args["content"]
5625 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5626 s := mod.Rule("apexRule").Args["copy_commands"]
5627 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5628 if len(copyCmds) != 3 {
5629 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5630 }
5631 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5632 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5633 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5634}
5635
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07005636func TestAppSetBundlePrebuilt(t *testing.T) {
5637 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
5638 bp := `
5639 apex_set {
5640 name: "myapex",
5641 filename: "foo_v2.apex",
5642 sanitized: {
5643 none: { set: "myapex.apks", },
5644 hwaddress: { set: "myapex.hwasan.apks", },
5645 },
5646 }`
5647 fs["Android.bp"] = []byte(bp)
5648
5649 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
5650 })
5651
5652 m := ctx.ModuleForTests("myapex", "android_common")
5653 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5654
5655 actual := extractedApex.Inputs
5656 if len(actual) != 1 {
5657 t.Errorf("expected a single input")
5658 }
5659
5660 expected := "myapex.hwasan.apks"
5661 if actual[0].String() != expected {
5662 t.Errorf("expected %s, got %s", expected, actual[0].String())
5663 }
5664}
5665
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005666func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005667 t.Helper()
5668
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005669 bp := `
5670 java_library {
5671 name: "some-updatable-apex-lib",
5672 srcs: ["a.java"],
5673 sdk_version: "current",
5674 apex_available: [
5675 "some-updatable-apex",
5676 ],
5677 }
5678
5679 java_library {
5680 name: "some-non-updatable-apex-lib",
5681 srcs: ["a.java"],
5682 apex_available: [
5683 "some-non-updatable-apex",
5684 ],
5685 }
5686
5687 java_library {
5688 name: "some-platform-lib",
5689 srcs: ["a.java"],
5690 sdk_version: "current",
5691 installable: true,
5692 }
5693
5694 java_library {
5695 name: "some-art-lib",
5696 srcs: ["a.java"],
5697 sdk_version: "current",
5698 apex_available: [
5699 "com.android.art.something",
5700 ],
5701 hostdex: true,
5702 }
5703
5704 apex {
5705 name: "some-updatable-apex",
5706 key: "some-updatable-apex.key",
5707 java_libs: ["some-updatable-apex-lib"],
5708 updatable: true,
5709 min_sdk_version: "current",
5710 }
5711
5712 apex {
5713 name: "some-non-updatable-apex",
5714 key: "some-non-updatable-apex.key",
5715 java_libs: ["some-non-updatable-apex-lib"],
5716 }
5717
5718 apex_key {
5719 name: "some-updatable-apex.key",
5720 }
5721
5722 apex_key {
5723 name: "some-non-updatable-apex.key",
5724 }
5725
5726 apex {
5727 name: "com.android.art.something",
5728 key: "com.android.art.something.key",
5729 java_libs: ["some-art-lib"],
5730 updatable: true,
5731 min_sdk_version: "current",
5732 }
5733
5734 apex_key {
5735 name: "com.android.art.something.key",
5736 }
5737
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005738 filegroup {
5739 name: "some-updatable-apex-file_contexts",
5740 srcs: [
5741 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5742 ],
5743 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005744
5745 filegroup {
5746 name: "some-non-updatable-apex-file_contexts",
5747 srcs: [
5748 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5749 ],
5750 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005751 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00005752
5753 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
5754}
5755
5756func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
5757 t.Helper()
5758
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005759 bp += cc.GatherRequiredDepsForTest(android.Android)
5760 bp += java.GatherRequiredDepsForTest()
5761 bp += dexpreopt.BpToolModulesForTest()
5762
5763 fs := map[string][]byte{
5764 "a.java": nil,
5765 "a.jar": nil,
5766 "build/make/target/product/security": nil,
5767 "apex_manifest.json": nil,
5768 "AndroidManifest.xml": nil,
5769 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005770 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005771 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5772 "framework/aidl/a.aidl": nil,
5773 }
5774 cc.GatherRequiredFilesForTest(fs)
5775
Colin Crossae8600b2020-10-29 17:09:13 -07005776 config := android.TestArchConfig(buildDir, nil, bp, fs)
5777
5778 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005779 ctx.RegisterModuleType("apex", BundleFactory)
5780 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5781 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005782 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005783 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005784 cc.RegisterRequiredBuildComponentsForTest(ctx)
5785 java.RegisterJavaBuildComponents(ctx)
5786 java.RegisterSystemModulesBuildComponents(ctx)
5787 java.RegisterAppBuildComponents(ctx)
5788 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005789 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5790 ctx.PreDepsMutators(RegisterPreDepsMutators)
5791 ctx.PostDepsMutators(RegisterPostDepsMutators)
5792
Colin Crossae8600b2020-10-29 17:09:13 -07005793 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005794
5795 _ = dexpreopt.GlobalSoongConfigForTests(config)
5796 dexpreopt.RegisterToolModulesForTest(ctx)
5797 pathCtx := android.PathContextForTesting(config)
5798 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5799 transformDexpreoptConfig(dexpreoptConfig)
5800 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5801
5802 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5803 android.FailIfErrored(t, errs)
5804
5805 _, errs = ctx.PrepareBuildActions(config)
5806 if errmsg == "" {
5807 android.FailIfErrored(t, errs)
5808 } else if len(errs) > 0 {
5809 android.FailIfNoMatchingErrors(t, errmsg, errs)
5810 return
5811 } else {
5812 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5813 }
5814}
5815
Jooyung Han548640b2020-04-27 12:10:30 +09005816func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5817 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5818 apex {
5819 name: "myapex",
5820 key: "myapex.key",
5821 updatable: true,
5822 }
5823
5824 apex_key {
5825 name: "myapex.key",
5826 public_key: "testkey.avbpubkey",
5827 private_key: "testkey.pem",
5828 }
5829 `)
5830}
5831
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005832func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005833 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005834 var transform func(*dexpreopt.GlobalConfig)
5835
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005836 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5837 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005838 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005839 }
5840 testNoUpdatableJarsInBootImage(t, "", transform)
5841 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005842
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005843 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005844 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 +01005845 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005846 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005847 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005848 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005849 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005850
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005851 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 -07005852 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 +01005853 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005854 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005855 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005856 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005857 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005858
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005859 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 -07005860 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005861 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005862 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005863 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005864 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005865 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005866
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005867 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 -07005868 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 +01005869 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005870 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005871 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005872 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005873 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005874
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005875 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5876 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005877 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005878 }
5879 testNoUpdatableJarsInBootImage(t, "", transform)
5880 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005881
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005882 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005883 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005884 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005885 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005886 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005887 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005888 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005889
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005890 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005891 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005892 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005893 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005894 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005895 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005896 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005897
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005898 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005899 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005900 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005901 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005902 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005903 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005904 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005905
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005906 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5907 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005908 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005909 }
5910 testNoUpdatableJarsInBootImage(t, "", transform)
5911 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005912}
5913
Andrei Onea115e7e72020-06-05 21:14:03 +01005914func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5915 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01005916 bp += `
5917 apex_key {
5918 name: "myapex.key",
5919 public_key: "testkey.avbpubkey",
5920 private_key: "testkey.pem",
5921 }`
5922 fs := map[string][]byte{
5923 "lib1/src/A.java": nil,
5924 "lib2/src/B.java": nil,
5925 "system/sepolicy/apex/myapex-file_contexts": nil,
5926 }
5927
Colin Crossae8600b2020-10-29 17:09:13 -07005928 config := android.TestArchConfig(buildDir, nil, bp, fs)
5929 android.SetTestNeverallowRules(config, rules)
5930 updatableBootJars := make([]string, 0, len(apexBootJars))
5931 for _, apexBootJar := range apexBootJars {
5932 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
5933 }
5934 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
5935
5936 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01005937 ctx.RegisterModuleType("apex", BundleFactory)
5938 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5939 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5940 cc.RegisterRequiredBuildComponentsForTest(ctx)
5941 java.RegisterJavaBuildComponents(ctx)
5942 java.RegisterSystemModulesBuildComponents(ctx)
5943 java.RegisterDexpreoptBootJarsComponents(ctx)
5944 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5945 ctx.PreDepsMutators(RegisterPreDepsMutators)
5946 ctx.PostDepsMutators(RegisterPostDepsMutators)
5947 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5948
Colin Crossae8600b2020-10-29 17:09:13 -07005949 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01005950
5951 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5952 android.FailIfErrored(t, errs)
5953
5954 _, errs = ctx.PrepareBuildActions(config)
5955 if errmsg == "" {
5956 android.FailIfErrored(t, errs)
5957 } else if len(errs) > 0 {
5958 android.FailIfNoMatchingErrors(t, errmsg, errs)
5959 return
5960 } else {
5961 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5962 }
5963}
5964
5965func TestApexPermittedPackagesRules(t *testing.T) {
5966 testcases := []struct {
5967 name string
5968 expectedError string
5969 bp string
5970 bootJars []string
5971 modulesPackages map[string][]string
5972 }{
5973
5974 {
5975 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
5976 expectedError: "",
5977 bp: `
5978 java_library {
5979 name: "bcp_lib1",
5980 srcs: ["lib1/src/*.java"],
5981 permitted_packages: ["foo.bar"],
5982 apex_available: ["myapex"],
5983 sdk_version: "none",
5984 system_modules: "none",
5985 }
5986 java_library {
5987 name: "nonbcp_lib2",
5988 srcs: ["lib2/src/*.java"],
5989 apex_available: ["myapex"],
5990 permitted_packages: ["a.b"],
5991 sdk_version: "none",
5992 system_modules: "none",
5993 }
5994 apex {
5995 name: "myapex",
5996 key: "myapex.key",
5997 java_libs: ["bcp_lib1", "nonbcp_lib2"],
5998 }`,
5999 bootJars: []string{"bcp_lib1"},
6000 modulesPackages: map[string][]string{
6001 "myapex": []string{
6002 "foo.bar",
6003 },
6004 },
6005 },
6006 {
6007 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6008 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.`,
6009 bp: `
6010 java_library {
6011 name: "bcp_lib1",
6012 srcs: ["lib1/src/*.java"],
6013 apex_available: ["myapex"],
6014 permitted_packages: ["foo.bar"],
6015 sdk_version: "none",
6016 system_modules: "none",
6017 }
6018 java_library {
6019 name: "bcp_lib2",
6020 srcs: ["lib2/src/*.java"],
6021 apex_available: ["myapex"],
6022 permitted_packages: ["foo.bar", "bar.baz"],
6023 sdk_version: "none",
6024 system_modules: "none",
6025 }
6026 apex {
6027 name: "myapex",
6028 key: "myapex.key",
6029 java_libs: ["bcp_lib1", "bcp_lib2"],
6030 }
6031 `,
6032 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6033 modulesPackages: map[string][]string{
6034 "myapex": []string{
6035 "foo.bar",
6036 },
6037 },
6038 },
6039 }
6040 for _, tc := range testcases {
6041 t.Run(tc.name, func(t *testing.T) {
6042 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6043 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6044 })
6045 }
6046}
6047
Jiyong Park62304bb2020-04-13 16:19:48 +09006048func TestTestFor(t *testing.T) {
6049 ctx, _ := testApex(t, `
6050 apex {
6051 name: "myapex",
6052 key: "myapex.key",
6053 native_shared_libs: ["mylib", "myprivlib"],
6054 }
6055
6056 apex_key {
6057 name: "myapex.key",
6058 public_key: "testkey.avbpubkey",
6059 private_key: "testkey.pem",
6060 }
6061
6062 cc_library {
6063 name: "mylib",
6064 srcs: ["mylib.cpp"],
6065 system_shared_libs: [],
6066 stl: "none",
6067 stubs: {
6068 versions: ["1"],
6069 },
6070 apex_available: ["myapex"],
6071 }
6072
6073 cc_library {
6074 name: "myprivlib",
6075 srcs: ["mylib.cpp"],
6076 system_shared_libs: [],
6077 stl: "none",
6078 apex_available: ["myapex"],
6079 }
6080
6081
6082 cc_test {
6083 name: "mytest",
6084 gtest: false,
6085 srcs: ["mylib.cpp"],
6086 system_shared_libs: [],
6087 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006088 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006089 test_for: ["myapex"]
6090 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006091
6092 cc_library {
6093 name: "mytestlib",
6094 srcs: ["mylib.cpp"],
6095 system_shared_libs: [],
6096 shared_libs: ["mylib", "myprivlib"],
6097 stl: "none",
6098 test_for: ["myapex"],
6099 }
6100
6101 cc_benchmark {
6102 name: "mybench",
6103 srcs: ["mylib.cpp"],
6104 system_shared_libs: [],
6105 shared_libs: ["mylib", "myprivlib"],
6106 stl: "none",
6107 test_for: ["myapex"],
6108 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006109 `)
6110
6111 // the test 'mytest' is a test for the apex, therefore is linked to the
6112 // actual implementation of mylib instead of its stub.
6113 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6114 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6115 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006116
6117 // The same should be true for cc_library
6118 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6119 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6120 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6121
6122 // ... and for cc_benchmark
6123 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6124 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6125 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006126}
6127
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006128// TODO(jungjw): Move this to proptools
6129func intPtr(i int) *int {
6130 return &i
6131}
6132
6133func TestApexSet(t *testing.T) {
6134 ctx, config := testApex(t, `
6135 apex_set {
6136 name: "myapex",
6137 set: "myapex.apks",
6138 filename: "foo_v2.apex",
6139 overrides: ["foo"],
6140 }
6141 `, func(fs map[string][]byte, config android.Config) {
6142 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006143 config.Targets[android.Android] = []android.Target{
6144 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6145 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6146 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006147 })
6148
6149 m := ctx.ModuleForTests("myapex", "android_common")
6150
6151 // Check extract_apks tool parameters.
6152 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6153 actual := extractedApex.Args["abis"]
6154 expected := "ARMEABI_V7A,ARM64_V8A"
6155 if actual != expected {
6156 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6157 }
6158 actual = extractedApex.Args["sdk-version"]
6159 expected = "30"
6160 if actual != expected {
6161 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6162 }
6163
6164 a := m.Module().(*ApexSet)
6165 expectedOverrides := []string{"foo"}
6166 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
6167 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6168 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6169 }
6170}
6171
Jiyong Park7d95a512020-05-10 15:16:24 +09006172func TestNoStaticLinkingToStubsLib(t *testing.T) {
6173 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6174 apex {
6175 name: "myapex",
6176 key: "myapex.key",
6177 native_shared_libs: ["mylib"],
6178 }
6179
6180 apex_key {
6181 name: "myapex.key",
6182 public_key: "testkey.avbpubkey",
6183 private_key: "testkey.pem",
6184 }
6185
6186 cc_library {
6187 name: "mylib",
6188 srcs: ["mylib.cpp"],
6189 static_libs: ["otherlib"],
6190 system_shared_libs: [],
6191 stl: "none",
6192 apex_available: [ "myapex" ],
6193 }
6194
6195 cc_library {
6196 name: "otherlib",
6197 srcs: ["mylib.cpp"],
6198 system_shared_libs: [],
6199 stl: "none",
6200 stubs: {
6201 versions: ["1", "2", "3"],
6202 },
6203 apex_available: [ "myapex" ],
6204 }
6205 `)
6206}
6207
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006208func TestApexKeysTxt(t *testing.T) {
6209 ctx, _ := testApex(t, `
6210 apex {
6211 name: "myapex",
6212 key: "myapex.key",
6213 }
6214
6215 apex_key {
6216 name: "myapex.key",
6217 public_key: "testkey.avbpubkey",
6218 private_key: "testkey.pem",
6219 }
6220
6221 prebuilt_apex {
6222 name: "myapex",
6223 prefer: true,
6224 arch: {
6225 arm64: {
6226 src: "myapex-arm64.apex",
6227 },
6228 arm: {
6229 src: "myapex-arm.apex",
6230 },
6231 },
6232 }
6233
6234 apex_set {
6235 name: "myapex_set",
6236 set: "myapex.apks",
6237 filename: "myapex_set.apex",
6238 overrides: ["myapex"],
6239 }
6240 `)
6241
6242 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6243 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6244 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 +09006245 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 +09006246}
6247
Jooyung Han938b5932020-06-20 12:47:47 +09006248func TestAllowedFiles(t *testing.T) {
6249 ctx, _ := testApex(t, `
6250 apex {
6251 name: "myapex",
6252 key: "myapex.key",
6253 apps: ["app"],
6254 allowed_files: "allowed.txt",
6255 }
6256
6257 apex_key {
6258 name: "myapex.key",
6259 public_key: "testkey.avbpubkey",
6260 private_key: "testkey.pem",
6261 }
6262
6263 android_app {
6264 name: "app",
6265 srcs: ["foo/bar/MyClass.java"],
6266 package_name: "foo",
6267 sdk_version: "none",
6268 system_modules: "none",
6269 apex_available: [ "myapex" ],
6270 }
6271 `, withFiles(map[string][]byte{
6272 "sub/Android.bp": []byte(`
6273 override_apex {
6274 name: "override_myapex",
6275 base: "myapex",
6276 apps: ["override_app"],
6277 allowed_files: ":allowed",
6278 }
6279 // Overridable "path" property should be referenced indirectly
6280 filegroup {
6281 name: "allowed",
6282 srcs: ["allowed.txt"],
6283 }
6284 override_android_app {
6285 name: "override_app",
6286 base: "app",
6287 package_name: "bar",
6288 }
6289 `),
6290 }))
6291
6292 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6293 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6294 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6295 }
6296
6297 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6298 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6299 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6300 }
6301}
6302
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006303func TestNonPreferredPrebuiltDependency(t *testing.T) {
6304 _, _ = testApex(t, `
6305 apex {
6306 name: "myapex",
6307 key: "myapex.key",
6308 native_shared_libs: ["mylib"],
6309 }
6310
6311 apex_key {
6312 name: "myapex.key",
6313 public_key: "testkey.avbpubkey",
6314 private_key: "testkey.pem",
6315 }
6316
6317 cc_library {
6318 name: "mylib",
6319 srcs: ["mylib.cpp"],
6320 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006321 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006322 },
6323 apex_available: ["myapex"],
6324 }
6325
6326 cc_prebuilt_library_shared {
6327 name: "mylib",
6328 prefer: false,
6329 srcs: ["prebuilt.so"],
6330 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006331 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006332 },
6333 apex_available: ["myapex"],
6334 }
6335 `)
6336}
6337
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00006338func TestCompressedApex(t *testing.T) {
6339 ctx, config := testApex(t, `
6340 apex {
6341 name: "myapex",
6342 key: "myapex.key",
6343 compressible: true,
6344 }
6345 apex_key {
6346 name: "myapex.key",
6347 public_key: "testkey.avbpubkey",
6348 private_key: "testkey.pem",
6349 }
6350 `, func(fs map[string][]byte, config android.Config) {
6351 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
6352 })
6353
6354 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
6355 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
6356
6357 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
6358 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
6359
6360 // Make sure output of bundle is .capex
6361 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6362 ensureContains(t, ab.outputFile.String(), "myapex.capex")
6363
6364 // Verify android.mk rules
6365 data := android.AndroidMkDataForTest(t, config, "", ab)
6366 var builder strings.Builder
6367 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6368 androidMk := builder.String()
6369 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
6370}
6371
Martin Stjernholm2856c662020-12-02 15:03:42 +00006372func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
6373 ctx, config := testApex(t, `
6374 apex {
6375 name: "myapex",
6376 key: "myapex.key",
6377 native_shared_libs: ["mylib"],
6378 }
6379
6380 apex_key {
6381 name: "myapex.key",
6382 public_key: "testkey.avbpubkey",
6383 private_key: "testkey.pem",
6384 }
6385
6386 cc_library {
6387 name: "mylib",
6388 srcs: ["mylib.cpp"],
6389 apex_available: ["myapex"],
6390 shared_libs: ["otherlib"],
6391 system_shared_libs: [],
6392 }
6393
6394 cc_library {
6395 name: "otherlib",
6396 srcs: ["mylib.cpp"],
6397 stubs: {
6398 versions: ["current"],
6399 },
6400 }
6401
6402 cc_prebuilt_library_shared {
6403 name: "otherlib",
6404 prefer: true,
6405 srcs: ["prebuilt.so"],
6406 stubs: {
6407 versions: ["current"],
6408 },
6409 }
6410 `)
6411
6412 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6413 data := android.AndroidMkDataForTest(t, config, "", ab)
6414 var builder strings.Builder
6415 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6416 androidMk := builder.String()
6417
6418 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
6419 // a thing there.
6420 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
6421}
6422
Jiyong Parke3867542020-12-03 17:28:25 +09006423func TestExcludeDependency(t *testing.T) {
6424 ctx, _ := testApex(t, `
6425 apex {
6426 name: "myapex",
6427 key: "myapex.key",
6428 native_shared_libs: ["mylib"],
6429 }
6430
6431 apex_key {
6432 name: "myapex.key",
6433 public_key: "testkey.avbpubkey",
6434 private_key: "testkey.pem",
6435 }
6436
6437 cc_library {
6438 name: "mylib",
6439 srcs: ["mylib.cpp"],
6440 system_shared_libs: [],
6441 stl: "none",
6442 apex_available: ["myapex"],
6443 shared_libs: ["mylib2"],
6444 target: {
6445 apex: {
6446 exclude_shared_libs: ["mylib2"],
6447 },
6448 },
6449 }
6450
6451 cc_library {
6452 name: "mylib2",
6453 srcs: ["mylib.cpp"],
6454 system_shared_libs: [],
6455 stl: "none",
6456 }
6457 `)
6458
6459 // Check if mylib is linked to mylib2 for the non-apex target
6460 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6461 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
6462
6463 // Make sure that the link doesn't occur for the apex target
6464 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
6465 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
6466
6467 // It shouldn't appear in the copy cmd as well.
6468 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
6469 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
6470}
6471
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006472func TestMain(m *testing.M) {
6473 run := func() int {
6474 setUp()
6475 defer tearDown()
6476
6477 return m.Run()
6478 }
6479
6480 os.Exit(run())
6481}