blob: 79f7441f9312f4bc03f398fb2e3bae4a5f386e66 [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
Jiyong Park25fc6a92018-11-18 18:02:45 +0900349// Minimal test
350func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900351 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900352 apex_defaults {
353 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900354 manifest: ":myapex.manifest",
355 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900356 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900357 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900358 native_shared_libs: [
359 "mylib",
360 "libfoo.ffi",
361 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900362 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800363 multilib: {
364 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900365 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800366 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900367 },
Jiyong Park77acec62020-06-01 21:39:15 +0900368 java_libs: [
369 "myjar",
370 "myjar_dex",
371 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900372 }
373
Jiyong Park30ca9372019-02-07 16:27:23 +0900374 apex {
375 name: "myapex",
376 defaults: ["myapex-defaults"],
377 }
378
Jiyong Park25fc6a92018-11-18 18:02:45 +0900379 apex_key {
380 name: "myapex.key",
381 public_key: "testkey.avbpubkey",
382 private_key: "testkey.pem",
383 }
384
Jiyong Park809bb722019-02-13 21:33:49 +0900385 filegroup {
386 name: "myapex.manifest",
387 srcs: ["apex_manifest.json"],
388 }
389
390 filegroup {
391 name: "myapex.androidmanifest",
392 srcs: ["AndroidManifest.xml"],
393 }
394
Jiyong Park25fc6a92018-11-18 18:02:45 +0900395 cc_library {
396 name: "mylib",
397 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900398 shared_libs: [
399 "mylib2",
400 "libbar.ffi",
401 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900402 system_shared_libs: [],
403 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000404 // TODO: remove //apex_available:platform
405 apex_available: [
406 "//apex_available:platform",
407 "myapex",
408 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900409 }
410
Alex Light3d673592019-01-18 14:37:31 -0800411 cc_binary {
412 name: "foo",
413 srcs: ["mylib.cpp"],
414 compile_multilib: "both",
415 multilib: {
416 lib32: {
417 suffix: "32",
418 },
419 lib64: {
420 suffix: "64",
421 },
422 },
423 symlinks: ["foo_link_"],
424 symlink_preferred_arch: true,
425 system_shared_libs: [],
426 static_executable: true,
427 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700428 apex_available: [ "myapex", "com.android.gki.*" ],
429 }
430
Jiyong Park99644e92020-11-17 22:21:02 +0900431 rust_binary {
432 name: "foo.rust",
433 srcs: ["foo.rs"],
434 rlibs: ["libfoo.rlib.rust"],
435 dylibs: ["libfoo.dylib.rust"],
436 apex_available: ["myapex"],
437 }
438
439 rust_library_rlib {
440 name: "libfoo.rlib.rust",
441 srcs: ["foo.rs"],
442 crate_name: "foo",
443 apex_available: ["myapex"],
444 }
445
446 rust_library_dylib {
447 name: "libfoo.dylib.rust",
448 srcs: ["foo.rs"],
449 crate_name: "foo",
450 apex_available: ["myapex"],
451 }
452
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900453 rust_ffi_shared {
454 name: "libfoo.ffi",
455 srcs: ["foo.rs"],
456 crate_name: "foo",
457 apex_available: ["myapex"],
458 }
459
460 rust_ffi_shared {
461 name: "libbar.ffi",
462 srcs: ["foo.rs"],
463 crate_name: "bar",
464 apex_available: ["myapex"],
465 }
466
Yifan Hongd22a84a2020-07-28 17:37:46 -0700467 apex {
468 name: "com.android.gki.fake",
469 binaries: ["foo"],
470 key: "myapex.key",
471 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800472 }
473
Paul Duffindddd5462020-04-07 15:25:44 +0100474 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900475 name: "mylib2",
476 srcs: ["mylib.cpp"],
477 system_shared_libs: [],
478 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900479 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900480 static_libs: ["libstatic"],
481 // TODO: remove //apex_available:platform
482 apex_available: [
483 "//apex_available:platform",
484 "myapex",
485 ],
486 }
487
Paul Duffindddd5462020-04-07 15:25:44 +0100488 cc_prebuilt_library_shared {
489 name: "mylib2",
490 srcs: ["prebuilt.so"],
491 // TODO: remove //apex_available:platform
492 apex_available: [
493 "//apex_available:platform",
494 "myapex",
495 ],
496 }
497
Jiyong Park9918e1a2020-03-17 19:16:40 +0900498 cc_library_static {
499 name: "libstatic",
500 srcs: ["mylib.cpp"],
501 system_shared_libs: [],
502 stl: "none",
503 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000504 // TODO: remove //apex_available:platform
505 apex_available: [
506 "//apex_available:platform",
507 "myapex",
508 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900509 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900510
511 java_library {
512 name: "myjar",
513 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900514 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900515 sdk_version: "none",
516 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900517 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900518 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000519 // TODO: remove //apex_available:platform
520 apex_available: [
521 "//apex_available:platform",
522 "myapex",
523 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900524 }
525
Jiyong Park77acec62020-06-01 21:39:15 +0900526 dex_import {
527 name: "myjar_dex",
528 jars: ["prebuilt.jar"],
529 apex_available: [
530 "//apex_available:platform",
531 "myapex",
532 ],
533 }
534
Jiyong Park7f7766d2019-07-25 22:02:35 +0900535 java_library {
536 name: "myotherjar",
537 srcs: ["foo/bar/MyClass.java"],
538 sdk_version: "none",
539 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900540 // TODO: remove //apex_available:platform
541 apex_available: [
542 "//apex_available:platform",
543 "myapex",
544 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900545 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900546
547 java_library {
548 name: "mysharedjar",
549 srcs: ["foo/bar/MyClass.java"],
550 sdk_version: "none",
551 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900552 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900553 `)
554
Sundong Ahnabb64432019-10-22 13:58:29 +0900555 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900556
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900557 // Make sure that Android.mk is created
558 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
559 data := android.AndroidMkDataForTest(t, config, "", ab)
560 var builder strings.Builder
561 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
562
563 androidMk := builder.String()
564 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
565 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
566
Jiyong Park42cca6c2019-04-01 11:15:50 +0900567 optFlags := apexRule.Args["opt_flags"]
568 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700569 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900570 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900571
Jiyong Park25fc6a92018-11-18 18:02:45 +0900572 copyCmds := apexRule.Args["copy_commands"]
573
574 // Ensure that main rule creates an output
575 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
576
577 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700578 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
579 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
580 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900581 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900582 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900583
584 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700585 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
586 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900587 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
588 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900589 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900590
591 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800592 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
593 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900594 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900595 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900596 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900597 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
598 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900599 // .. but not for java libs
600 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900601 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800602
Colin Cross7113d202019-11-20 16:39:12 -0800603 // Ensure that the platform variant ends with _shared or _common
604 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
605 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900606 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
607 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900608 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
609
610 // Ensure that dynamic dependency to java libs are not included
611 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800612
613 // Ensure that all symlinks are present.
614 found_foo_link_64 := false
615 found_foo := false
616 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900617 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800618 if strings.HasSuffix(cmd, "bin/foo") {
619 found_foo = true
620 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
621 found_foo_link_64 = true
622 }
623 }
624 }
625 good := found_foo && found_foo_link_64
626 if !good {
627 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
628 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900629
Sundong Ahnabb64432019-10-22 13:58:29 +0900630 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700631 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900632 if len(noticeInputs) != 3 {
633 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900634 }
635 ensureListContains(t, noticeInputs, "NOTICE")
636 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900637 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900638
Artur Satayeva8bd1132020-04-27 18:07:06 +0100639 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100640 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
641 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
642 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
643 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
644 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100645
646 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100647 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
648 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
649 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
650 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
651 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800652}
653
Jooyung Hanf21c7972019-12-16 22:32:06 +0900654func TestDefaults(t *testing.T) {
655 ctx, _ := testApex(t, `
656 apex_defaults {
657 name: "myapex-defaults",
658 key: "myapex.key",
659 prebuilts: ["myetc"],
660 native_shared_libs: ["mylib"],
661 java_libs: ["myjar"],
662 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900663 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800664 bpfs: ["bpf"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900665 }
666
667 prebuilt_etc {
668 name: "myetc",
669 src: "myprebuilt",
670 }
671
672 apex {
673 name: "myapex",
674 defaults: ["myapex-defaults"],
675 }
676
677 apex_key {
678 name: "myapex.key",
679 public_key: "testkey.avbpubkey",
680 private_key: "testkey.pem",
681 }
682
683 cc_library {
684 name: "mylib",
685 system_shared_libs: [],
686 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000687 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900688 }
689
690 java_library {
691 name: "myjar",
692 srcs: ["foo/bar/MyClass.java"],
693 sdk_version: "none",
694 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000695 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900696 }
697
698 android_app {
699 name: "AppFoo",
700 srcs: ["foo/bar/MyClass.java"],
701 sdk_version: "none",
702 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000703 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900704 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900705
706 runtime_resource_overlay {
707 name: "rro",
708 theme: "blue",
709 }
710
markchien2f59ec92020-09-02 16:23:38 +0800711 bpf {
712 name: "bpf",
713 srcs: ["bpf.c", "bpf2.c"],
714 }
715
Jooyung Hanf21c7972019-12-16 22:32:06 +0900716 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000717 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900718 "etc/myetc",
719 "javalib/myjar.jar",
720 "lib64/mylib.so",
721 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900722 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800723 "etc/bpf/bpf.o",
724 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900725 })
726}
727
Jooyung Han01a3ee22019-11-02 02:52:25 +0900728func TestApexManifest(t *testing.T) {
729 ctx, _ := testApex(t, `
730 apex {
731 name: "myapex",
732 key: "myapex.key",
733 }
734
735 apex_key {
736 name: "myapex.key",
737 public_key: "testkey.avbpubkey",
738 private_key: "testkey.pem",
739 }
740 `)
741
742 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900743 args := module.Rule("apexRule").Args
744 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
745 t.Error("manifest should be apex_manifest.pb, but " + manifest)
746 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900747}
748
Alex Light5098a612018-11-29 17:12:15 -0800749func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700750 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800751 apex {
752 name: "myapex",
753 key: "myapex.key",
754 payload_type: "zip",
755 native_shared_libs: ["mylib"],
756 }
757
758 apex_key {
759 name: "myapex.key",
760 public_key: "testkey.avbpubkey",
761 private_key: "testkey.pem",
762 }
763
764 cc_library {
765 name: "mylib",
766 srcs: ["mylib.cpp"],
767 shared_libs: ["mylib2"],
768 system_shared_libs: [],
769 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000770 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800771 }
772
773 cc_library {
774 name: "mylib2",
775 srcs: ["mylib.cpp"],
776 system_shared_libs: [],
777 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000778 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800779 }
780 `)
781
Sundong Ahnabb64432019-10-22 13:58:29 +0900782 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800783 copyCmds := zipApexRule.Args["copy_commands"]
784
785 // Ensure that main rule creates an output
786 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
787
788 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700789 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800790
791 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700792 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800793
794 // Ensure that both direct and indirect deps are copied into apex
795 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
796 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900797}
798
799func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700800 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900801 apex {
802 name: "myapex",
803 key: "myapex.key",
804 native_shared_libs: ["mylib", "mylib3"],
805 }
806
807 apex_key {
808 name: "myapex.key",
809 public_key: "testkey.avbpubkey",
810 private_key: "testkey.pem",
811 }
812
813 cc_library {
814 name: "mylib",
815 srcs: ["mylib.cpp"],
816 shared_libs: ["mylib2", "mylib3"],
817 system_shared_libs: [],
818 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000819 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900820 }
821
822 cc_library {
823 name: "mylib2",
824 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900825 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900826 system_shared_libs: [],
827 stl: "none",
828 stubs: {
829 versions: ["1", "2", "3"],
830 },
831 }
832
833 cc_library {
834 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900835 srcs: ["mylib.cpp"],
836 shared_libs: ["mylib4"],
837 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900838 stl: "none",
839 stubs: {
840 versions: ["10", "11", "12"],
841 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000842 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900843 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900844
845 cc_library {
846 name: "mylib4",
847 srcs: ["mylib.cpp"],
848 system_shared_libs: [],
849 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000850 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900851 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900852 `)
853
Sundong Ahnabb64432019-10-22 13:58:29 +0900854 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900855 copyCmds := apexRule.Args["copy_commands"]
856
857 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800858 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900859
860 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800861 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900862
863 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800864 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900865
Colin Crossaede88c2020-08-11 12:17:01 -0700866 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867
868 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900869 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900870 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900871 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900872
873 // 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 -0700874 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900875 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700876 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900877
878 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900879 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900880 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900881
882 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700883 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900884
Jooyung Hana57af4a2020-01-23 05:36:59 +0000885 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900886 "lib64/mylib.so",
887 "lib64/mylib3.so",
888 "lib64/mylib4.so",
889 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900890}
891
Colin Cross7812fd32020-09-25 12:35:10 -0700892func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
893 t.Parallel()
894 ctx, _ := testApex(t, `
895 apex {
896 name: "myapex",
897 key: "myapex.key",
898 native_shared_libs: ["mylib", "mylib3"],
899 min_sdk_version: "29",
900 }
901
902 apex_key {
903 name: "myapex.key",
904 public_key: "testkey.avbpubkey",
905 private_key: "testkey.pem",
906 }
907
908 cc_library {
909 name: "mylib",
910 srcs: ["mylib.cpp"],
911 shared_libs: ["mylib2", "mylib3"],
912 system_shared_libs: [],
913 stl: "none",
914 apex_available: [ "myapex" ],
915 min_sdk_version: "28",
916 }
917
918 cc_library {
919 name: "mylib2",
920 srcs: ["mylib.cpp"],
921 cflags: ["-include mylib.h"],
922 system_shared_libs: [],
923 stl: "none",
924 stubs: {
925 versions: ["28", "29", "30", "current"],
926 },
927 min_sdk_version: "28",
928 }
929
930 cc_library {
931 name: "mylib3",
932 srcs: ["mylib.cpp"],
933 shared_libs: ["mylib4"],
934 system_shared_libs: [],
935 stl: "none",
936 stubs: {
937 versions: ["28", "29", "30", "current"],
938 },
939 apex_available: [ "myapex" ],
940 min_sdk_version: "28",
941 }
942
943 cc_library {
944 name: "mylib4",
945 srcs: ["mylib.cpp"],
946 system_shared_libs: [],
947 stl: "none",
948 apex_available: [ "myapex" ],
949 min_sdk_version: "28",
950 }
951 `)
952
953 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
954 copyCmds := apexRule.Args["copy_commands"]
955
956 // Ensure that direct non-stubs dep is always included
957 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
958
959 // Ensure that indirect stubs dep is not included
960 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
961
962 // Ensure that direct stubs dep is included
963 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
964
965 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
966
967 // Ensure that mylib is linking with the version 29 stubs for mylib2
968 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_29/mylib2.so")
969 // ... and not linking to the non-stub (impl) variant of mylib2
970 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
971
972 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
973 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
974 // .. and not linking to the stubs variant of mylib3
975 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
976
977 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700978 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700979 ensureNotContains(t, mylib2Cflags, "-include ")
980
981 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700982 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -0700983
984 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
985 "lib64/mylib.so",
986 "lib64/mylib3.so",
987 "lib64/mylib4.so",
988 })
989}
990
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900991func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700992 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900993 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900994 name: "myapex2",
995 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900996 native_shared_libs: ["mylib"],
997 }
998
999 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001000 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001001 public_key: "testkey.avbpubkey",
1002 private_key: "testkey.pem",
1003 }
1004
1005 cc_library {
1006 name: "mylib",
1007 srcs: ["mylib.cpp"],
1008 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001009 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001010 system_shared_libs: [],
1011 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001012 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001013 }
1014
1015 cc_library {
1016 name: "libfoo",
1017 srcs: ["mylib.cpp"],
1018 shared_libs: ["libbar"],
1019 system_shared_libs: [],
1020 stl: "none",
1021 stubs: {
1022 versions: ["10", "20", "30"],
1023 },
1024 }
1025
1026 cc_library {
1027 name: "libbar",
1028 srcs: ["mylib.cpp"],
1029 system_shared_libs: [],
1030 stl: "none",
1031 }
1032
Jiyong Park678c8812020-02-07 17:25:49 +09001033 cc_library_static {
1034 name: "libbaz",
1035 srcs: ["mylib.cpp"],
1036 system_shared_libs: [],
1037 stl: "none",
1038 apex_available: [ "myapex2" ],
1039 }
1040
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001041 `)
1042
Jiyong Park83dc74b2020-01-14 18:38:44 +09001043 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001044 copyCmds := apexRule.Args["copy_commands"]
1045
1046 // Ensure that direct non-stubs dep is always included
1047 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1048
1049 // Ensure that indirect stubs dep is not included
1050 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1051
1052 // Ensure that dependency of stubs is not included
1053 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1054
Colin Crossaede88c2020-08-11 12:17:01 -07001055 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001056
1057 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001058 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001059 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001060 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001061
Jiyong Park3ff16992019-12-27 14:11:47 +09001062 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001063
1064 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1065 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001066
Artur Satayeva8bd1132020-04-27 18:07:06 +01001067 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001068 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2")
1069 ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib")
1070 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001071
Artur Satayeva8bd1132020-04-27 18:07:06 +01001072 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001073 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
1074 ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))")
1075 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001076}
1077
Jooyung Hand3639552019-08-09 12:57:43 +09001078func TestApexWithRuntimeLibsDependency(t *testing.T) {
1079 /*
1080 myapex
1081 |
1082 v (runtime_libs)
1083 mylib ------+------> libfoo [provides stub]
1084 |
1085 `------> libbar
1086 */
1087 ctx, _ := testApex(t, `
1088 apex {
1089 name: "myapex",
1090 key: "myapex.key",
1091 native_shared_libs: ["mylib"],
1092 }
1093
1094 apex_key {
1095 name: "myapex.key",
1096 public_key: "testkey.avbpubkey",
1097 private_key: "testkey.pem",
1098 }
1099
1100 cc_library {
1101 name: "mylib",
1102 srcs: ["mylib.cpp"],
1103 runtime_libs: ["libfoo", "libbar"],
1104 system_shared_libs: [],
1105 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001106 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001107 }
1108
1109 cc_library {
1110 name: "libfoo",
1111 srcs: ["mylib.cpp"],
1112 system_shared_libs: [],
1113 stl: "none",
1114 stubs: {
1115 versions: ["10", "20", "30"],
1116 },
1117 }
1118
1119 cc_library {
1120 name: "libbar",
1121 srcs: ["mylib.cpp"],
1122 system_shared_libs: [],
1123 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001124 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001125 }
1126
1127 `)
1128
Sundong Ahnabb64432019-10-22 13:58:29 +09001129 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001130 copyCmds := apexRule.Args["copy_commands"]
1131
1132 // Ensure that direct non-stubs dep is always included
1133 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1134
1135 // Ensure that indirect stubs dep is not included
1136 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1137
1138 // Ensure that runtime_libs dep in included
1139 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1140
Sundong Ahnabb64432019-10-22 13:58:29 +09001141 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001142 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1143 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001144
1145}
1146
Jooyung Han8ce8db92020-05-15 19:05:05 +09001147func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1148 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1149 bp := `
1150 apex {
1151 name: "com.android.runtime",
1152 key: "com.android.runtime.key",
1153 native_shared_libs: ["libc"],
1154 }
1155
1156 apex_key {
1157 name: "com.android.runtime.key",
1158 public_key: "testkey.avbpubkey",
1159 private_key: "testkey.pem",
1160 }
1161
1162 cc_library {
1163 name: "libc",
1164 no_libcrt: true,
1165 nocrt: true,
1166 stl: "none",
1167 system_shared_libs: [],
1168 stubs: { versions: ["1"] },
1169 apex_available: ["com.android.runtime"],
1170
1171 sanitize: {
1172 hwaddress: true,
1173 }
1174 }
1175
1176 cc_prebuilt_library_shared {
1177 name: "libclang_rt.hwasan-aarch64-android",
1178 no_libcrt: true,
1179 nocrt: true,
1180 stl: "none",
1181 system_shared_libs: [],
1182 srcs: [""],
1183 stubs: { versions: ["1"] },
1184
1185 sanitize: {
1186 never: true,
1187 },
1188 }
1189 `
1190 // override bp to use hard-coded names: com.android.runtime and libc
1191 fs["Android.bp"] = []byte(bp)
1192 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1193 })
1194
1195 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1196 "lib64/bionic/libc.so",
1197 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1198 })
1199
1200 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1201
1202 installed := hwasan.Description("install libclang_rt.hwasan")
1203 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1204
1205 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1206 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1207 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1208}
1209
1210func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1211 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1212 bp := `
1213 apex {
1214 name: "com.android.runtime",
1215 key: "com.android.runtime.key",
1216 native_shared_libs: ["libc"],
1217 }
1218
1219 apex_key {
1220 name: "com.android.runtime.key",
1221 public_key: "testkey.avbpubkey",
1222 private_key: "testkey.pem",
1223 }
1224
1225 cc_library {
1226 name: "libc",
1227 no_libcrt: true,
1228 nocrt: true,
1229 stl: "none",
1230 system_shared_libs: [],
1231 stubs: { versions: ["1"] },
1232 apex_available: ["com.android.runtime"],
1233 }
1234
1235 cc_prebuilt_library_shared {
1236 name: "libclang_rt.hwasan-aarch64-android",
1237 no_libcrt: true,
1238 nocrt: true,
1239 stl: "none",
1240 system_shared_libs: [],
1241 srcs: [""],
1242 stubs: { versions: ["1"] },
1243
1244 sanitize: {
1245 never: true,
1246 },
1247 }
1248 `
1249 // override bp to use hard-coded names: com.android.runtime and libc
1250 fs["Android.bp"] = []byte(bp)
1251 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1252
1253 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1254 })
1255
1256 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1257 "lib64/bionic/libc.so",
1258 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1259 })
1260
1261 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1262
1263 installed := hwasan.Description("install libclang_rt.hwasan")
1264 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1265
1266 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1267 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1268 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1269}
1270
Jooyung Han61b66e92020-03-21 14:21:46 +00001271func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1272 testcases := []struct {
1273 name string
1274 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001275 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001276 shouldLink string
1277 shouldNotLink []string
1278 }{
1279 {
Jooyung Han75568392020-03-20 04:29:24 +09001280 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001281 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001282 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001283 shouldLink: "30",
1284 shouldNotLink: []string{"29"},
1285 },
1286 {
1287 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001288 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001289 apexVariant: "apex29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001290 shouldLink: "29",
1291 shouldNotLink: []string{"30"},
1292 },
1293 }
1294 for _, tc := range testcases {
1295 t.Run(tc.name, func(t *testing.T) {
1296 ctx, _ := testApex(t, `
1297 apex {
1298 name: "myapex",
1299 key: "myapex.key",
1300 use_vendor: true,
1301 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001302 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001303 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001304
Jooyung Han61b66e92020-03-21 14:21:46 +00001305 apex_key {
1306 name: "myapex.key",
1307 public_key: "testkey.avbpubkey",
1308 private_key: "testkey.pem",
1309 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001310
Jooyung Han61b66e92020-03-21 14:21:46 +00001311 cc_library {
1312 name: "mylib",
1313 srcs: ["mylib.cpp"],
1314 vendor_available: true,
1315 shared_libs: ["libbar"],
1316 system_shared_libs: [],
1317 stl: "none",
1318 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001319 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001320 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001321
Jooyung Han61b66e92020-03-21 14:21:46 +00001322 cc_library {
1323 name: "libbar",
1324 srcs: ["mylib.cpp"],
1325 system_shared_libs: [],
1326 stl: "none",
1327 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001328 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001329 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001330
Jooyung Han61b66e92020-03-21 14:21:46 +00001331 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001332 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001333 symbol_file: "",
1334 }
1335 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001336 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001337 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001338
Jooyung Han61b66e92020-03-21 14:21:46 +00001339 // Ensure that LLNDK dep is not included
1340 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1341 "lib64/mylib.so",
1342 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001343
Jooyung Han61b66e92020-03-21 14:21:46 +00001344 // Ensure that LLNDK dep is required
1345 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1346 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1347 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001348
Colin Crossaede88c2020-08-11 12:17:01 -07001349 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001350 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1351 for _, ver := range tc.shouldNotLink {
1352 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1353 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001354
Colin Crossaede88c2020-08-11 12:17:01 -07001355 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001356 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1357 })
1358 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001359}
1360
Jiyong Park25fc6a92018-11-18 18:02:45 +09001361func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001362 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001363 apex {
1364 name: "myapex",
1365 key: "myapex.key",
1366 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1367 }
1368
1369 apex_key {
1370 name: "myapex.key",
1371 public_key: "testkey.avbpubkey",
1372 private_key: "testkey.pem",
1373 }
1374
1375 cc_library {
1376 name: "mylib",
1377 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001378 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001379 shared_libs: ["libdl#27"],
1380 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001381 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001382 }
1383
1384 cc_library_shared {
1385 name: "mylib_shared",
1386 srcs: ["mylib.cpp"],
1387 shared_libs: ["libdl#27"],
1388 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001389 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001390 }
1391
1392 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001393 name: "libBootstrap",
1394 srcs: ["mylib.cpp"],
1395 stl: "none",
1396 bootstrap: true,
1397 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001398 `)
1399
Sundong Ahnabb64432019-10-22 13:58:29 +09001400 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001401 copyCmds := apexRule.Args["copy_commands"]
1402
1403 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001404 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001405 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1406 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001407
1408 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001409 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001410
Colin Crossaede88c2020-08-11 12:17:01 -07001411 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1412 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1413 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001414
1415 // For dependency to libc
1416 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001417 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001418 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001419 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001420 // ... Cflags from stub is correctly exported to mylib
1421 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1422 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1423
1424 // For dependency to libm
1425 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001426 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001427 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001428 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001429 // ... and is not compiling with the stub
1430 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1431 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1432
1433 // For dependency to libdl
1434 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001435 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001436 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001437 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1438 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001439 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001440 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001441 // ... Cflags from stub is correctly exported to mylib
1442 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1443 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001444
1445 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001446 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1447 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1448 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1449 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001450}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001451
Jooyung Han749dc692020-04-15 11:03:39 +09001452func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001453 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001454 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1455 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001456 // 3) (platform) -> liba -> libz : this should be non-stub link
1457 ctx, _ := testApex(t, `
1458 apex {
1459 name: "myapex",
1460 key: "myapex.key",
1461 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001462 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001463 }
1464
1465 apex {
1466 name: "otherapex",
1467 key: "myapex.key",
1468 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001469 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001470 }
1471
1472 apex_key {
1473 name: "myapex.key",
1474 public_key: "testkey.avbpubkey",
1475 private_key: "testkey.pem",
1476 }
1477
1478 cc_library {
1479 name: "libx",
1480 shared_libs: ["liba"],
1481 system_shared_libs: [],
1482 stl: "none",
1483 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001484 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001485 }
1486
1487 cc_library {
1488 name: "liby",
1489 shared_libs: ["liba"],
1490 system_shared_libs: [],
1491 stl: "none",
1492 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001493 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001494 }
1495
1496 cc_library {
1497 name: "liba",
1498 shared_libs: ["libz"],
1499 system_shared_libs: [],
1500 stl: "none",
1501 apex_available: [
1502 "//apex_available:anyapex",
1503 "//apex_available:platform",
1504 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001505 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001506 }
1507
1508 cc_library {
1509 name: "libz",
1510 system_shared_libs: [],
1511 stl: "none",
1512 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001513 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001514 },
1515 }
Jooyung Han749dc692020-04-15 11:03:39 +09001516 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001517
1518 expectLink := func(from, from_variant, to, to_variant string) {
1519 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1520 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1521 }
1522 expectNoLink := func(from, from_variant, to, to_variant string) {
1523 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1524 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1525 }
1526 // platform liba is linked to non-stub version
1527 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001528 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001529 expectLink("liba", "shared_apex29", "libz", "shared_28")
1530 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1531 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001532 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001533 expectLink("liba", "shared_apex30", "libz", "shared_30")
1534 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1535 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001536}
1537
Jooyung Hanaed150d2020-04-02 01:41:41 +09001538func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1539 ctx, _ := testApex(t, `
1540 apex {
1541 name: "myapex",
1542 key: "myapex.key",
1543 native_shared_libs: ["libx"],
1544 min_sdk_version: "R",
1545 }
1546
1547 apex_key {
1548 name: "myapex.key",
1549 public_key: "testkey.avbpubkey",
1550 private_key: "testkey.pem",
1551 }
1552
1553 cc_library {
1554 name: "libx",
1555 shared_libs: ["libz"],
1556 system_shared_libs: [],
1557 stl: "none",
1558 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001559 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001560 }
1561
1562 cc_library {
1563 name: "libz",
1564 system_shared_libs: [],
1565 stl: "none",
1566 stubs: {
1567 versions: ["29", "R"],
1568 },
1569 }
1570 `, func(fs map[string][]byte, config android.Config) {
1571 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1572 })
1573
1574 expectLink := func(from, from_variant, to, to_variant string) {
1575 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1576 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1577 }
1578 expectNoLink := func(from, from_variant, to, to_variant string) {
1579 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1580 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1581 }
Dan Albertc8060532020-07-22 22:32:17 -07001582 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001583 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1584 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001585}
1586
Jooyung Han749dc692020-04-15 11:03:39 +09001587func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001588 ctx, _ := testApex(t, `
1589 apex {
1590 name: "myapex",
1591 key: "myapex.key",
1592 native_shared_libs: ["libx"],
1593 }
1594
1595 apex_key {
1596 name: "myapex.key",
1597 public_key: "testkey.avbpubkey",
1598 private_key: "testkey.pem",
1599 }
1600
1601 cc_library {
1602 name: "libx",
1603 shared_libs: ["libz"],
1604 system_shared_libs: [],
1605 stl: "none",
1606 apex_available: [ "myapex" ],
1607 }
1608
1609 cc_library {
1610 name: "libz",
1611 system_shared_libs: [],
1612 stl: "none",
1613 stubs: {
1614 versions: ["1", "2"],
1615 },
1616 }
1617 `)
1618
1619 expectLink := func(from, from_variant, to, to_variant string) {
1620 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1621 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1622 }
1623 expectNoLink := func(from, from_variant, to, to_variant string) {
1624 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1625 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1626 }
Colin Crossaede88c2020-08-11 12:17:01 -07001627 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1628 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1629 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001630}
1631
1632func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1633 ctx, _ := testApex(t, `
1634 apex {
1635 name: "myapex",
1636 key: "myapex.key",
1637 native_shared_libs: ["libx"],
1638 }
1639
1640 apex_key {
1641 name: "myapex.key",
1642 public_key: "testkey.avbpubkey",
1643 private_key: "testkey.pem",
1644 }
1645
1646 cc_library {
1647 name: "libx",
1648 system_shared_libs: [],
1649 stl: "none",
1650 apex_available: [ "myapex" ],
1651 stubs: {
1652 versions: ["1", "2"],
1653 },
1654 }
1655
1656 cc_library {
1657 name: "libz",
1658 shared_libs: ["libx"],
1659 system_shared_libs: [],
1660 stl: "none",
1661 }
1662 `)
1663
1664 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001665 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001666 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1667 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1668 }
1669 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001670 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001671 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1672 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1673 }
1674 expectLink("libz", "shared", "libx", "shared_2")
1675 expectNoLink("libz", "shared", "libz", "shared_1")
1676 expectNoLink("libz", "shared", "libz", "shared")
1677}
1678
Jooyung Han75568392020-03-20 04:29:24 +09001679func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001680 ctx, _ := testApex(t, `
1681 apex {
1682 name: "myapex",
1683 key: "myapex.key",
1684 native_shared_libs: ["libx"],
1685 min_sdk_version: "29",
1686 }
1687
1688 apex_key {
1689 name: "myapex.key",
1690 public_key: "testkey.avbpubkey",
1691 private_key: "testkey.pem",
1692 }
1693
1694 cc_library {
1695 name: "libx",
1696 shared_libs: ["libbar"],
1697 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001698 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001699 }
1700
1701 cc_library {
1702 name: "libbar",
1703 stubs: {
1704 versions: ["29", "30"],
1705 },
1706 }
Jooyung Han75568392020-03-20 04:29:24 +09001707 `, func(fs map[string][]byte, config android.Config) {
1708 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1709 })
Jooyung Han03b51852020-02-26 22:45:42 +09001710 expectLink := func(from, from_variant, to, to_variant string) {
1711 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1712 libFlags := ld.Args["libFlags"]
1713 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1714 }
Colin Crossaede88c2020-08-11 12:17:01 -07001715 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001716}
1717
Jooyung Han75568392020-03-20 04:29:24 +09001718func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001719 ctx, _ := testApex(t, `
1720 apex {
1721 name: "myapex",
1722 key: "myapex.key",
1723 native_shared_libs: ["libx"],
1724 min_sdk_version: "29",
1725 }
1726
1727 apex_key {
1728 name: "myapex.key",
1729 public_key: "testkey.avbpubkey",
1730 private_key: "testkey.pem",
1731 }
1732
1733 cc_library {
1734 name: "libx",
1735 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001736 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001737 }
Jooyung Han75568392020-03-20 04:29:24 +09001738 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001739
1740 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001741 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Jooyung Han03b51852020-02-26 22:45:42 +09001742 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1743 // note that platform variant is not.
1744 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1745 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001746}
1747
Jooyung Han749dc692020-04-15 11:03:39 +09001748func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001749 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001750 apex {
1751 name: "myapex",
1752 key: "myapex.key",
1753 native_shared_libs: ["libx"],
1754 min_sdk_version: "29",
1755 }
1756
1757 apex_key {
1758 name: "myapex.key",
1759 public_key: "testkey.avbpubkey",
1760 private_key: "testkey.pem",
1761 }
1762
1763 cc_library {
1764 name: "libx",
1765 shared_libs: ["libz"],
1766 system_shared_libs: [],
1767 stl: "none",
1768 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001769 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001770 }
1771
1772 cc_library {
1773 name: "libz",
1774 system_shared_libs: [],
1775 stl: "none",
1776 stubs: {
1777 versions: ["30"],
1778 },
1779 }
Jooyung Han75568392020-03-20 04:29:24 +09001780 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001781}
Jooyung Han03b51852020-02-26 22:45:42 +09001782
Jooyung Han749dc692020-04-15 11:03:39 +09001783func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1784 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001785 apex {
1786 name: "myapex",
1787 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001788 native_shared_libs: ["mylib"],
1789 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001790 }
1791
1792 apex_key {
1793 name: "myapex.key",
1794 public_key: "testkey.avbpubkey",
1795 private_key: "testkey.pem",
1796 }
Jooyung Han749dc692020-04-15 11:03:39 +09001797
1798 cc_library {
1799 name: "mylib",
1800 srcs: ["mylib.cpp"],
1801 system_shared_libs: [],
1802 stl: "none",
1803 apex_available: [
1804 "myapex",
1805 ],
1806 min_sdk_version: "30",
1807 }
1808 `)
1809}
1810
1811func TestApexMinSdkVersion_Okay(t *testing.T) {
1812 testApex(t, `
1813 apex {
1814 name: "myapex",
1815 key: "myapex.key",
1816 native_shared_libs: ["libfoo"],
1817 java_libs: ["libbar"],
1818 min_sdk_version: "29",
1819 }
1820
1821 apex_key {
1822 name: "myapex.key",
1823 public_key: "testkey.avbpubkey",
1824 private_key: "testkey.pem",
1825 }
1826
1827 cc_library {
1828 name: "libfoo",
1829 srcs: ["mylib.cpp"],
1830 shared_libs: ["libfoo_dep"],
1831 apex_available: ["myapex"],
1832 min_sdk_version: "29",
1833 }
1834
1835 cc_library {
1836 name: "libfoo_dep",
1837 srcs: ["mylib.cpp"],
1838 apex_available: ["myapex"],
1839 min_sdk_version: "29",
1840 }
1841
1842 java_library {
1843 name: "libbar",
1844 sdk_version: "current",
1845 srcs: ["a.java"],
1846 static_libs: ["libbar_dep"],
1847 apex_available: ["myapex"],
1848 min_sdk_version: "29",
1849 }
1850
1851 java_library {
1852 name: "libbar_dep",
1853 sdk_version: "current",
1854 srcs: ["a.java"],
1855 apex_available: ["myapex"],
1856 min_sdk_version: "29",
1857 }
Jooyung Han03b51852020-02-26 22:45:42 +09001858 `)
1859}
1860
Artur Satayev8cf899a2020-04-15 17:29:42 +01001861func TestJavaStableSdkVersion(t *testing.T) {
1862 testCases := []struct {
1863 name string
1864 expectedError string
1865 bp string
1866 }{
1867 {
1868 name: "Non-updatable apex with non-stable dep",
1869 bp: `
1870 apex {
1871 name: "myapex",
1872 java_libs: ["myjar"],
1873 key: "myapex.key",
1874 }
1875 apex_key {
1876 name: "myapex.key",
1877 public_key: "testkey.avbpubkey",
1878 private_key: "testkey.pem",
1879 }
1880 java_library {
1881 name: "myjar",
1882 srcs: ["foo/bar/MyClass.java"],
1883 sdk_version: "core_platform",
1884 apex_available: ["myapex"],
1885 }
1886 `,
1887 },
1888 {
1889 name: "Updatable apex with stable dep",
1890 bp: `
1891 apex {
1892 name: "myapex",
1893 java_libs: ["myjar"],
1894 key: "myapex.key",
1895 updatable: true,
1896 min_sdk_version: "29",
1897 }
1898 apex_key {
1899 name: "myapex.key",
1900 public_key: "testkey.avbpubkey",
1901 private_key: "testkey.pem",
1902 }
1903 java_library {
1904 name: "myjar",
1905 srcs: ["foo/bar/MyClass.java"],
1906 sdk_version: "current",
1907 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001908 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001909 }
1910 `,
1911 },
1912 {
1913 name: "Updatable apex with non-stable dep",
1914 expectedError: "cannot depend on \"myjar\"",
1915 bp: `
1916 apex {
1917 name: "myapex",
1918 java_libs: ["myjar"],
1919 key: "myapex.key",
1920 updatable: true,
1921 }
1922 apex_key {
1923 name: "myapex.key",
1924 public_key: "testkey.avbpubkey",
1925 private_key: "testkey.pem",
1926 }
1927 java_library {
1928 name: "myjar",
1929 srcs: ["foo/bar/MyClass.java"],
1930 sdk_version: "core_platform",
1931 apex_available: ["myapex"],
1932 }
1933 `,
1934 },
1935 {
1936 name: "Updatable apex with non-stable transitive dep",
1937 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1938 bp: `
1939 apex {
1940 name: "myapex",
1941 java_libs: ["myjar"],
1942 key: "myapex.key",
1943 updatable: true,
1944 }
1945 apex_key {
1946 name: "myapex.key",
1947 public_key: "testkey.avbpubkey",
1948 private_key: "testkey.pem",
1949 }
1950 java_library {
1951 name: "myjar",
1952 srcs: ["foo/bar/MyClass.java"],
1953 sdk_version: "current",
1954 apex_available: ["myapex"],
1955 static_libs: ["transitive-jar"],
1956 }
1957 java_library {
1958 name: "transitive-jar",
1959 srcs: ["foo/bar/MyClass.java"],
1960 sdk_version: "core_platform",
1961 apex_available: ["myapex"],
1962 }
1963 `,
1964 },
1965 }
1966
1967 for _, test := range testCases {
1968 t.Run(test.name, func(t *testing.T) {
1969 if test.expectedError == "" {
1970 testApex(t, test.bp)
1971 } else {
1972 testApexError(t, test.expectedError, test.bp)
1973 }
1974 })
1975 }
1976}
1977
Jooyung Han749dc692020-04-15 11:03:39 +09001978func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1979 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1980 apex {
1981 name: "myapex",
1982 key: "myapex.key",
1983 native_shared_libs: ["mylib"],
1984 min_sdk_version: "29",
1985 }
1986
1987 apex_key {
1988 name: "myapex.key",
1989 public_key: "testkey.avbpubkey",
1990 private_key: "testkey.pem",
1991 }
1992
1993 cc_library {
1994 name: "mylib",
1995 srcs: ["mylib.cpp"],
1996 shared_libs: ["mylib2"],
1997 system_shared_libs: [],
1998 stl: "none",
1999 apex_available: [
2000 "myapex",
2001 ],
2002 min_sdk_version: "29",
2003 }
2004
2005 // indirect part of the apex
2006 cc_library {
2007 name: "mylib2",
2008 srcs: ["mylib.cpp"],
2009 system_shared_libs: [],
2010 stl: "none",
2011 apex_available: [
2012 "myapex",
2013 ],
2014 min_sdk_version: "30",
2015 }
2016 `)
2017}
2018
2019func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2020 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2021 apex {
2022 name: "myapex",
2023 key: "myapex.key",
2024 apps: ["AppFoo"],
2025 min_sdk_version: "29",
2026 }
2027
2028 apex_key {
2029 name: "myapex.key",
2030 public_key: "testkey.avbpubkey",
2031 private_key: "testkey.pem",
2032 }
2033
2034 android_app {
2035 name: "AppFoo",
2036 srcs: ["foo/bar/MyClass.java"],
2037 sdk_version: "current",
2038 min_sdk_version: "29",
2039 system_modules: "none",
2040 stl: "none",
2041 static_libs: ["bar"],
2042 apex_available: [ "myapex" ],
2043 }
2044
2045 java_library {
2046 name: "bar",
2047 sdk_version: "current",
2048 srcs: ["a.java"],
2049 apex_available: [ "myapex" ],
2050 }
2051 `)
2052}
2053
2054func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
2055 ctx, _ := testApex(t, `
2056 apex {
2057 name: "myapex",
2058 key: "myapex.key",
2059 native_shared_libs: ["mylib"],
2060 min_sdk_version: "29",
2061 }
2062
2063 apex_key {
2064 name: "myapex.key",
2065 public_key: "testkey.avbpubkey",
2066 private_key: "testkey.pem",
2067 }
2068
2069 // mylib in myapex will link to mylib2#29
2070 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2071 cc_library {
2072 name: "mylib",
2073 srcs: ["mylib.cpp"],
2074 shared_libs: ["mylib2"],
2075 system_shared_libs: [],
2076 stl: "none",
2077 apex_available: ["myapex", "otherapex"],
2078 min_sdk_version: "29",
2079 }
2080
2081 cc_library {
2082 name: "mylib2",
2083 srcs: ["mylib.cpp"],
2084 system_shared_libs: [],
2085 stl: "none",
2086 apex_available: ["otherapex"],
2087 stubs: { versions: ["29", "30"] },
2088 min_sdk_version: "30",
2089 }
2090
2091 apex {
2092 name: "otherapex",
2093 key: "myapex.key",
2094 native_shared_libs: ["mylib", "mylib2"],
2095 min_sdk_version: "30",
2096 }
2097 `)
2098 expectLink := func(from, from_variant, to, to_variant string) {
2099 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2100 libFlags := ld.Args["libFlags"]
2101 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2102 }
Colin Crossaede88c2020-08-11 12:17:01 -07002103 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
2104 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002105}
2106
Jiyong Park7c2ee712018-12-07 00:42:25 +09002107func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002108 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002109 apex {
2110 name: "myapex",
2111 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002112 native_shared_libs: ["mylib"],
2113 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002114 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002115 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09002116 }
2117
2118 apex_key {
2119 name: "myapex.key",
2120 public_key: "testkey.avbpubkey",
2121 private_key: "testkey.pem",
2122 }
2123
2124 prebuilt_etc {
2125 name: "myetc",
2126 src: "myprebuilt",
2127 sub_dir: "foo/bar",
2128 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002129
2130 cc_library {
2131 name: "mylib",
2132 srcs: ["mylib.cpp"],
2133 relative_install_path: "foo/bar",
2134 system_shared_libs: [],
2135 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002136 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002137 }
2138
2139 cc_binary {
2140 name: "mybin",
2141 srcs: ["mylib.cpp"],
2142 relative_install_path: "foo/bar",
2143 system_shared_libs: [],
2144 static_executable: true,
2145 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002146 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002147 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002148 `)
2149
Sundong Ahnabb64432019-10-22 13:58:29 +09002150 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002151 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2152
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002153 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002154 ensureListContains(t, dirs, "etc")
2155 ensureListContains(t, dirs, "etc/foo")
2156 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002157 ensureListContains(t, dirs, "lib64")
2158 ensureListContains(t, dirs, "lib64/foo")
2159 ensureListContains(t, dirs, "lib64/foo/bar")
2160 ensureListContains(t, dirs, "lib")
2161 ensureListContains(t, dirs, "lib/foo")
2162 ensureListContains(t, dirs, "lib/foo/bar")
2163
Jiyong Parkbd13e442019-03-15 18:10:35 +09002164 ensureListContains(t, dirs, "bin")
2165 ensureListContains(t, dirs, "bin/foo")
2166 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002167}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002168
Jooyung Han35155c42020-02-06 17:33:20 +09002169func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2170 ctx, _ := testApex(t, `
2171 apex {
2172 name: "myapex",
2173 key: "myapex.key",
2174 multilib: {
2175 both: {
2176 native_shared_libs: ["mylib"],
2177 binaries: ["mybin"],
2178 },
2179 },
2180 compile_multilib: "both",
2181 native_bridge_supported: true,
2182 }
2183
2184 apex_key {
2185 name: "myapex.key",
2186 public_key: "testkey.avbpubkey",
2187 private_key: "testkey.pem",
2188 }
2189
2190 cc_library {
2191 name: "mylib",
2192 relative_install_path: "foo/bar",
2193 system_shared_libs: [],
2194 stl: "none",
2195 apex_available: [ "myapex" ],
2196 native_bridge_supported: true,
2197 }
2198
2199 cc_binary {
2200 name: "mybin",
2201 relative_install_path: "foo/bar",
2202 system_shared_libs: [],
2203 static_executable: true,
2204 stl: "none",
2205 apex_available: [ "myapex" ],
2206 native_bridge_supported: true,
2207 compile_multilib: "both", // default is "first" for binary
2208 multilib: {
2209 lib64: {
2210 suffix: "64",
2211 },
2212 },
2213 }
2214 `, withNativeBridgeEnabled)
2215 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2216 "bin/foo/bar/mybin",
2217 "bin/foo/bar/mybin64",
2218 "bin/arm/foo/bar/mybin",
2219 "bin/arm64/foo/bar/mybin64",
2220 "lib/foo/bar/mylib.so",
2221 "lib/arm/foo/bar/mylib.so",
2222 "lib64/foo/bar/mylib.so",
2223 "lib64/arm64/foo/bar/mylib.so",
2224 })
2225}
2226
Jiyong Parkda6eb592018-12-19 17:12:36 +09002227func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002228 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002229 apex {
2230 name: "myapex",
2231 key: "myapex.key",
2232 native_shared_libs: ["mylib"],
2233 use_vendor: true,
2234 }
2235
2236 apex_key {
2237 name: "myapex.key",
2238 public_key: "testkey.avbpubkey",
2239 private_key: "testkey.pem",
2240 }
2241
2242 cc_library {
2243 name: "mylib",
2244 srcs: ["mylib.cpp"],
2245 shared_libs: ["mylib2"],
2246 system_shared_libs: [],
2247 vendor_available: true,
2248 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002249 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002250 }
2251
2252 cc_library {
2253 name: "mylib2",
2254 srcs: ["mylib.cpp"],
2255 system_shared_libs: [],
2256 vendor_available: true,
2257 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002258 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002259 }
Jooyung Handc782442019-11-01 03:14:38 +09002260 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002261 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002262 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002263
2264 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002265 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002266 for _, implicit := range i.Implicits {
2267 inputsList = append(inputsList, implicit.String())
2268 }
2269 }
2270 inputsString := strings.Join(inputsList, " ")
2271
2272 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002273 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2274 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002275
2276 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002277 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2278 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002279}
Jiyong Park16e91a02018-12-20 18:18:08 +09002280
Jooyung Han85d61762020-06-24 23:50:26 +09002281func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002282 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2283 apex {
2284 name: "myapex",
2285 key: "myapex.key",
2286 use_vendor: true,
2287 }
2288 apex_key {
2289 name: "myapex.key",
2290 public_key: "testkey.avbpubkey",
2291 private_key: "testkey.pem",
2292 }
2293 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002294 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002295 })
Colin Cross440e0d02020-06-11 11:32:11 -07002296 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002297 testApex(t, `
2298 apex {
2299 name: "myapex",
2300 key: "myapex.key",
2301 use_vendor: true,
2302 }
2303 apex_key {
2304 name: "myapex.key",
2305 public_key: "testkey.avbpubkey",
2306 private_key: "testkey.pem",
2307 }
2308 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002309 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002310 })
2311}
2312
Jooyung Han5c998b92019-06-27 11:30:33 +09002313func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2314 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2315 apex {
2316 name: "myapex",
2317 key: "myapex.key",
2318 native_shared_libs: ["mylib"],
2319 use_vendor: true,
2320 }
2321
2322 apex_key {
2323 name: "myapex.key",
2324 public_key: "testkey.avbpubkey",
2325 private_key: "testkey.pem",
2326 }
2327
2328 cc_library {
2329 name: "mylib",
2330 srcs: ["mylib.cpp"],
2331 system_shared_libs: [],
2332 stl: "none",
2333 }
2334 `)
2335}
2336
Jooyung Han85d61762020-06-24 23:50:26 +09002337func TestVendorApex(t *testing.T) {
2338 ctx, config := testApex(t, `
2339 apex {
2340 name: "myapex",
2341 key: "myapex.key",
2342 binaries: ["mybin"],
2343 vendor: true,
2344 }
2345 apex_key {
2346 name: "myapex.key",
2347 public_key: "testkey.avbpubkey",
2348 private_key: "testkey.pem",
2349 }
2350 cc_binary {
2351 name: "mybin",
2352 vendor: true,
2353 shared_libs: ["libfoo"],
2354 }
2355 cc_library {
2356 name: "libfoo",
2357 proprietary: true,
2358 }
2359 `)
2360
2361 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2362 "bin/mybin",
2363 "lib64/libfoo.so",
2364 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2365 "lib64/libc++.so",
2366 })
2367
2368 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2369 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2370 name := apexBundle.BaseModuleName()
2371 prefix := "TARGET_"
2372 var builder strings.Builder
2373 data.Custom(&builder, name, prefix, "", data)
2374 androidMk := builder.String()
2375 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002376
2377 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2378 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2379 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002380}
2381
Jooyung Handf78e212020-07-22 15:54:47 +09002382func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2383 ctx, _ := testApex(t, `
2384 apex {
2385 name: "myapex",
2386 key: "myapex.key",
2387 binaries: ["mybin"],
2388 vendor: true,
2389 use_vndk_as_stable: true,
2390 }
2391 apex_key {
2392 name: "myapex.key",
2393 public_key: "testkey.avbpubkey",
2394 private_key: "testkey.pem",
2395 }
2396 cc_binary {
2397 name: "mybin",
2398 vendor: true,
2399 shared_libs: ["libvndk", "libvendor"],
2400 }
2401 cc_library {
2402 name: "libvndk",
2403 vndk: {
2404 enabled: true,
2405 },
2406 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002407 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002408 }
2409 cc_library {
2410 name: "libvendor",
2411 vendor: true,
2412 }
2413 `)
2414
2415 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2416
Colin Crossaede88c2020-08-11 12:17:01 -07002417 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002418 libs := names(ldRule.Args["libFlags"])
2419 // VNDK libs(libvndk/libc++) as they are
2420 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2421 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2422 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002423 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002424
2425 // VNDK libs are not included when use_vndk_as_stable: true
2426 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2427 "bin/mybin",
2428 "lib64/libvendor.so",
2429 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002430
2431 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2432 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2433 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002434}
2435
Jooyung Han8e5685d2020-09-21 11:02:57 +09002436func TestApex_withPrebuiltFirmware(t *testing.T) {
2437 testCases := []struct {
2438 name string
2439 additionalProp string
2440 }{
2441 {"system apex with prebuilt_firmware", ""},
2442 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2443 }
2444 for _, tc := range testCases {
2445 t.Run(tc.name, func(t *testing.T) {
2446 ctx, _ := testApex(t, `
2447 apex {
2448 name: "myapex",
2449 key: "myapex.key",
2450 prebuilts: ["myfirmware"],
2451 `+tc.additionalProp+`
2452 }
2453 apex_key {
2454 name: "myapex.key",
2455 public_key: "testkey.avbpubkey",
2456 private_key: "testkey.pem",
2457 }
2458 prebuilt_firmware {
2459 name: "myfirmware",
2460 src: "myfirmware.bin",
2461 filename_from_src: true,
2462 `+tc.additionalProp+`
2463 }
2464 `)
2465 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2466 "etc/firmware/myfirmware.bin",
2467 })
2468 })
2469 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002470}
2471
Jooyung Hanefb184e2020-06-25 17:14:25 +09002472func TestAndroidMk_UseVendorRequired(t *testing.T) {
2473 ctx, config := testApex(t, `
2474 apex {
2475 name: "myapex",
2476 key: "myapex.key",
2477 use_vendor: true,
2478 native_shared_libs: ["mylib"],
2479 }
2480
2481 apex_key {
2482 name: "myapex.key",
2483 public_key: "testkey.avbpubkey",
2484 private_key: "testkey.pem",
2485 }
2486
2487 cc_library {
2488 name: "mylib",
2489 vendor_available: true,
2490 apex_available: ["myapex"],
2491 }
2492 `, func(fs map[string][]byte, config android.Config) {
2493 setUseVendorAllowListForTest(config, []string{"myapex"})
2494 })
2495
2496 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2497 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2498 name := apexBundle.BaseModuleName()
2499 prefix := "TARGET_"
2500 var builder strings.Builder
2501 data.Custom(&builder, name, prefix, "", data)
2502 androidMk := builder.String()
2503 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2504}
2505
2506func TestAndroidMk_VendorApexRequired(t *testing.T) {
2507 ctx, config := testApex(t, `
2508 apex {
2509 name: "myapex",
2510 key: "myapex.key",
2511 vendor: true,
2512 native_shared_libs: ["mylib"],
2513 }
2514
2515 apex_key {
2516 name: "myapex.key",
2517 public_key: "testkey.avbpubkey",
2518 private_key: "testkey.pem",
2519 }
2520
2521 cc_library {
2522 name: "mylib",
2523 vendor_available: true,
2524 }
2525 `)
2526
2527 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2528 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2529 name := apexBundle.BaseModuleName()
2530 prefix := "TARGET_"
2531 var builder strings.Builder
2532 data.Custom(&builder, name, prefix, "", data)
2533 androidMk := builder.String()
2534 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2535}
2536
Jooyung Han2ed99d02020-06-24 23:26:26 +09002537func TestAndroidMkWritesCommonProperties(t *testing.T) {
2538 ctx, config := testApex(t, `
2539 apex {
2540 name: "myapex",
2541 key: "myapex.key",
2542 vintf_fragments: ["fragment.xml"],
2543 init_rc: ["init.rc"],
2544 }
2545 apex_key {
2546 name: "myapex.key",
2547 public_key: "testkey.avbpubkey",
2548 private_key: "testkey.pem",
2549 }
2550 cc_binary {
2551 name: "mybin",
2552 }
2553 `)
2554
2555 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2556 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2557 name := apexBundle.BaseModuleName()
2558 prefix := "TARGET_"
2559 var builder strings.Builder
2560 data.Custom(&builder, name, prefix, "", data)
2561 androidMk := builder.String()
2562 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2563 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2564}
2565
Jiyong Park16e91a02018-12-20 18:18:08 +09002566func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002567 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002568 apex {
2569 name: "myapex",
2570 key: "myapex.key",
2571 native_shared_libs: ["mylib"],
2572 }
2573
2574 apex_key {
2575 name: "myapex.key",
2576 public_key: "testkey.avbpubkey",
2577 private_key: "testkey.pem",
2578 }
2579
2580 cc_library {
2581 name: "mylib",
2582 srcs: ["mylib.cpp"],
2583 system_shared_libs: [],
2584 stl: "none",
2585 stubs: {
2586 versions: ["1", "2", "3"],
2587 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002588 apex_available: [
2589 "//apex_available:platform",
2590 "myapex",
2591 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002592 }
2593
2594 cc_binary {
2595 name: "not_in_apex",
2596 srcs: ["mylib.cpp"],
2597 static_libs: ["mylib"],
2598 static_executable: true,
2599 system_shared_libs: [],
2600 stl: "none",
2601 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002602 `)
2603
Colin Cross7113d202019-11-20 16:39:12 -08002604 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002605
2606 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002607 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002608}
Jiyong Park9335a262018-12-24 11:31:58 +09002609
2610func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002611 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002612 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002613 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002614 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002615 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002616 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002617 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002618 }
2619
2620 cc_library {
2621 name: "mylib",
2622 srcs: ["mylib.cpp"],
2623 system_shared_libs: [],
2624 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002625 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002626 }
2627
2628 apex_key {
2629 name: "myapex.key",
2630 public_key: "testkey.avbpubkey",
2631 private_key: "testkey.pem",
2632 }
2633
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002634 android_app_certificate {
2635 name: "myapex.certificate",
2636 certificate: "testkey",
2637 }
2638
2639 android_app_certificate {
2640 name: "myapex.certificate.override",
2641 certificate: "testkey.override",
2642 }
2643
Jiyong Park9335a262018-12-24 11:31:58 +09002644 `)
2645
2646 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002647 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002648
2649 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2650 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2651 "vendor/foo/devkeys/testkey.avbpubkey")
2652 }
2653 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2654 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2655 "vendor/foo/devkeys/testkey.pem")
2656 }
2657
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002658 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002659 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002660 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002661 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002662 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002663 }
2664}
Jiyong Park58e364a2019-01-19 19:24:06 +09002665
Jooyung Hanf121a652019-12-17 14:30:11 +09002666func TestCertificate(t *testing.T) {
2667 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2668 ctx, _ := testApex(t, `
2669 apex {
2670 name: "myapex",
2671 key: "myapex.key",
2672 }
2673 apex_key {
2674 name: "myapex.key",
2675 public_key: "testkey.avbpubkey",
2676 private_key: "testkey.pem",
2677 }`)
2678 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2679 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2680 if actual := rule.Args["certificates"]; actual != expected {
2681 t.Errorf("certificates should be %q, not %q", expected, actual)
2682 }
2683 })
2684 t.Run("override when unspecified", func(t *testing.T) {
2685 ctx, _ := testApex(t, `
2686 apex {
2687 name: "myapex_keytest",
2688 key: "myapex.key",
2689 file_contexts: ":myapex-file_contexts",
2690 }
2691 apex_key {
2692 name: "myapex.key",
2693 public_key: "testkey.avbpubkey",
2694 private_key: "testkey.pem",
2695 }
2696 android_app_certificate {
2697 name: "myapex.certificate.override",
2698 certificate: "testkey.override",
2699 }`)
2700 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2701 expected := "testkey.override.x509.pem testkey.override.pk8"
2702 if actual := rule.Args["certificates"]; actual != expected {
2703 t.Errorf("certificates should be %q, not %q", expected, actual)
2704 }
2705 })
2706 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2707 ctx, _ := testApex(t, `
2708 apex {
2709 name: "myapex",
2710 key: "myapex.key",
2711 certificate: ":myapex.certificate",
2712 }
2713 apex_key {
2714 name: "myapex.key",
2715 public_key: "testkey.avbpubkey",
2716 private_key: "testkey.pem",
2717 }
2718 android_app_certificate {
2719 name: "myapex.certificate",
2720 certificate: "testkey",
2721 }`)
2722 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2723 expected := "testkey.x509.pem testkey.pk8"
2724 if actual := rule.Args["certificates"]; actual != expected {
2725 t.Errorf("certificates should be %q, not %q", expected, actual)
2726 }
2727 })
2728 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2729 ctx, _ := testApex(t, `
2730 apex {
2731 name: "myapex_keytest",
2732 key: "myapex.key",
2733 file_contexts: ":myapex-file_contexts",
2734 certificate: ":myapex.certificate",
2735 }
2736 apex_key {
2737 name: "myapex.key",
2738 public_key: "testkey.avbpubkey",
2739 private_key: "testkey.pem",
2740 }
2741 android_app_certificate {
2742 name: "myapex.certificate.override",
2743 certificate: "testkey.override",
2744 }`)
2745 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2746 expected := "testkey.override.x509.pem testkey.override.pk8"
2747 if actual := rule.Args["certificates"]; actual != expected {
2748 t.Errorf("certificates should be %q, not %q", expected, actual)
2749 }
2750 })
2751 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2752 ctx, _ := testApex(t, `
2753 apex {
2754 name: "myapex",
2755 key: "myapex.key",
2756 certificate: "testkey",
2757 }
2758 apex_key {
2759 name: "myapex.key",
2760 public_key: "testkey.avbpubkey",
2761 private_key: "testkey.pem",
2762 }`)
2763 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2764 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2765 if actual := rule.Args["certificates"]; actual != expected {
2766 t.Errorf("certificates should be %q, not %q", expected, actual)
2767 }
2768 })
2769 t.Run("override when specified as <name>", func(t *testing.T) {
2770 ctx, _ := testApex(t, `
2771 apex {
2772 name: "myapex_keytest",
2773 key: "myapex.key",
2774 file_contexts: ":myapex-file_contexts",
2775 certificate: "testkey",
2776 }
2777 apex_key {
2778 name: "myapex.key",
2779 public_key: "testkey.avbpubkey",
2780 private_key: "testkey.pem",
2781 }
2782 android_app_certificate {
2783 name: "myapex.certificate.override",
2784 certificate: "testkey.override",
2785 }`)
2786 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2787 expected := "testkey.override.x509.pem testkey.override.pk8"
2788 if actual := rule.Args["certificates"]; actual != expected {
2789 t.Errorf("certificates should be %q, not %q", expected, actual)
2790 }
2791 })
2792}
2793
Jiyong Park58e364a2019-01-19 19:24:06 +09002794func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002795 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002796 apex {
2797 name: "myapex",
2798 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002799 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002800 }
2801
2802 apex {
2803 name: "otherapex",
2804 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002805 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002806 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002807 }
2808
2809 apex_key {
2810 name: "myapex.key",
2811 public_key: "testkey.avbpubkey",
2812 private_key: "testkey.pem",
2813 }
2814
2815 cc_library {
2816 name: "mylib",
2817 srcs: ["mylib.cpp"],
2818 system_shared_libs: [],
2819 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002820 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002821 "myapex",
2822 "otherapex",
2823 ],
Jooyung Han24282772020-03-21 23:20:55 +09002824 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002825 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002826 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002827 cc_library {
2828 name: "mylib2",
2829 srcs: ["mylib.cpp"],
2830 system_shared_libs: [],
2831 stl: "none",
2832 apex_available: [
2833 "myapex",
2834 "otherapex",
2835 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002836 static_libs: ["mylib3"],
2837 recovery_available: true,
2838 min_sdk_version: "29",
2839 }
2840 cc_library {
2841 name: "mylib3",
2842 srcs: ["mylib.cpp"],
2843 system_shared_libs: [],
2844 stl: "none",
2845 apex_available: [
2846 "myapex",
2847 "otherapex",
2848 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002849 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002850 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002851 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002852 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002853 `)
2854
Jooyung Hanc87a0592020-03-02 17:44:33 +09002855 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002856 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002857 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002858 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002859
Jooyung Hanccce2f22020-03-07 03:45:53 +09002860 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002861 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002862 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002863 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002864 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002865
Jooyung Hanccce2f22020-03-07 03:45:53 +09002866 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002867 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002868 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002869 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002870 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002871
Colin Crossaede88c2020-08-11 12:17:01 -07002872 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2873 // each variant defines additional macros to distinguish which apex variant it is built for
2874
2875 // non-APEX variant does not have __ANDROID_APEX__ defined
2876 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2877 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2878
2879 // APEX variant has __ANDROID_APEX__ defined
2880 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2881 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2882 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2883 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2884
2885 // APEX variant has __ANDROID_APEX__ defined
2886 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2887 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2888 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2889 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2890
Dan Albertb19953d2020-11-17 15:29:36 -08002891 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002892 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2893 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002894 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07002895
2896 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2897 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002898
2899 // non-APEX variant does not have __ANDROID_APEX__ defined
2900 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2901 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2902
2903 // APEX variant has __ANDROID_APEX__ defined
2904 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002905 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002906 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002907 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002908
Jooyung Hanc87a0592020-03-02 17:44:33 +09002909 // APEX variant has __ANDROID_APEX__ defined
2910 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002911 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002912 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002913 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002914
Dan Albertb19953d2020-11-17 15:29:36 -08002915 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002916 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002917 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002918 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002919}
Jiyong Park7e636d02019-01-28 16:16:54 +09002920
2921func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002922 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002923 apex {
2924 name: "myapex",
2925 key: "myapex.key",
2926 native_shared_libs: ["mylib"],
2927 }
2928
2929 apex_key {
2930 name: "myapex.key",
2931 public_key: "testkey.avbpubkey",
2932 private_key: "testkey.pem",
2933 }
2934
2935 cc_library_headers {
2936 name: "mylib_headers",
2937 export_include_dirs: ["my_include"],
2938 system_shared_libs: [],
2939 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002940 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002941 }
2942
2943 cc_library {
2944 name: "mylib",
2945 srcs: ["mylib.cpp"],
2946 system_shared_libs: [],
2947 stl: "none",
2948 header_libs: ["mylib_headers"],
2949 export_header_lib_headers: ["mylib_headers"],
2950 stubs: {
2951 versions: ["1", "2", "3"],
2952 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002953 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002954 }
2955
2956 cc_library {
2957 name: "otherlib",
2958 srcs: ["mylib.cpp"],
2959 system_shared_libs: [],
2960 stl: "none",
2961 shared_libs: ["mylib"],
2962 }
2963 `)
2964
Colin Cross7113d202019-11-20 16:39:12 -08002965 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002966
2967 // Ensure that the include path of the header lib is exported to 'otherlib'
2968 ensureContains(t, cFlags, "-Imy_include")
2969}
Alex Light9670d332019-01-29 18:07:33 -08002970
Jiyong Park7cd10e32020-01-14 09:22:18 +09002971type fileInApex struct {
2972 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002973 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002974 isLink bool
2975}
2976
Jooyung Hana57af4a2020-01-23 05:36:59 +00002977func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002978 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002979 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002980 copyCmds := apexRule.Args["copy_commands"]
2981 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002982 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002983 for _, cmd := range strings.Split(copyCmds, "&&") {
2984 cmd = strings.TrimSpace(cmd)
2985 if cmd == "" {
2986 continue
2987 }
2988 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002989 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002990 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002991 switch terms[0] {
2992 case "mkdir":
2993 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002994 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002995 t.Fatal("copyCmds contains invalid cp command", cmd)
2996 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002997 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002998 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002999 isLink = false
3000 case "ln":
3001 if len(terms) != 3 && len(terms) != 4 {
3002 // ln LINK TARGET or ln -s LINK TARGET
3003 t.Fatal("copyCmds contains invalid ln command", cmd)
3004 }
3005 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003006 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003007 isLink = true
3008 default:
3009 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3010 }
3011 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003012 index := strings.Index(dst, imageApexDir)
3013 if index == -1 {
3014 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3015 }
3016 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003017 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003018 }
3019 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003020 return ret
3021}
3022
Jooyung Hana57af4a2020-01-23 05:36:59 +00003023func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3024 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003025 var failed bool
3026 var surplus []string
3027 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003028 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003029 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003030 for _, expected := range files {
3031 if matched, _ := path.Match(expected, file.path); matched {
3032 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003033 mactchFound = true
3034 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003035 }
3036 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003037 if !mactchFound {
3038 surplus = append(surplus, file.path)
3039 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003040 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003041
Jooyung Han31c470b2019-10-18 16:26:59 +09003042 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003043 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003044 t.Log("surplus files", surplus)
3045 failed = true
3046 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003047
3048 if len(files) > len(filesMatched) {
3049 var missing []string
3050 for _, expected := range files {
3051 if !filesMatched[expected] {
3052 missing = append(missing, expected)
3053 }
3054 }
3055 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003056 t.Log("missing files", missing)
3057 failed = true
3058 }
3059 if failed {
3060 t.Fail()
3061 }
3062}
3063
Jooyung Han344d5432019-08-23 11:17:39 +09003064func TestVndkApexCurrent(t *testing.T) {
3065 ctx, _ := testApex(t, `
3066 apex_vndk {
3067 name: "myapex",
3068 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003069 }
3070
3071 apex_key {
3072 name: "myapex.key",
3073 public_key: "testkey.avbpubkey",
3074 private_key: "testkey.pem",
3075 }
3076
3077 cc_library {
3078 name: "libvndk",
3079 srcs: ["mylib.cpp"],
3080 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003081 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003082 vndk: {
3083 enabled: true,
3084 },
3085 system_shared_libs: [],
3086 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003087 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003088 }
3089
3090 cc_library {
3091 name: "libvndksp",
3092 srcs: ["mylib.cpp"],
3093 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003094 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003095 vndk: {
3096 enabled: true,
3097 support_system_process: true,
3098 },
3099 system_shared_libs: [],
3100 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003101 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003102 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003103 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003104
Jooyung Hana57af4a2020-01-23 05:36:59 +00003105 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003106 "lib/libvndk.so",
3107 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003108 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003109 "lib64/libvndk.so",
3110 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003111 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003112 "etc/llndk.libraries.VER.txt",
3113 "etc/vndkcore.libraries.VER.txt",
3114 "etc/vndksp.libraries.VER.txt",
3115 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003116 })
Jooyung Han344d5432019-08-23 11:17:39 +09003117}
3118
3119func TestVndkApexWithPrebuilt(t *testing.T) {
3120 ctx, _ := testApex(t, `
3121 apex_vndk {
3122 name: "myapex",
3123 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003124 }
3125
3126 apex_key {
3127 name: "myapex.key",
3128 public_key: "testkey.avbpubkey",
3129 private_key: "testkey.pem",
3130 }
3131
3132 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003133 name: "libvndk",
3134 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003135 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003136 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003137 vndk: {
3138 enabled: true,
3139 },
3140 system_shared_libs: [],
3141 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003142 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003143 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003144
3145 cc_prebuilt_library_shared {
3146 name: "libvndk.arm",
3147 srcs: ["libvndk.arm.so"],
3148 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003149 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003150 vndk: {
3151 enabled: true,
3152 },
3153 enabled: false,
3154 arch: {
3155 arm: {
3156 enabled: true,
3157 },
3158 },
3159 system_shared_libs: [],
3160 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003161 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003162 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003163 `+vndkLibrariesTxtFiles("current"),
3164 withFiles(map[string][]byte{
3165 "libvndk.so": nil,
3166 "libvndk.arm.so": nil,
3167 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003168
Jooyung Hana57af4a2020-01-23 05:36:59 +00003169 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003170 "lib/libvndk.so",
3171 "lib/libvndk.arm.so",
3172 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003173 "lib/libc++.so",
3174 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003175 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003176 })
Jooyung Han344d5432019-08-23 11:17:39 +09003177}
3178
Jooyung Han39edb6c2019-11-06 16:53:07 +09003179func vndkLibrariesTxtFiles(vers ...string) (result string) {
3180 for _, v := range vers {
3181 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09003182 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003183 result += `
3184 vndk_libraries_txt {
3185 name: "` + txt + `.libraries.txt",
3186 }
3187 `
3188 }
3189 } else {
3190 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3191 result += `
3192 prebuilt_etc {
3193 name: "` + txt + `.libraries.` + v + `.txt",
3194 src: "dummy.txt",
3195 }
3196 `
3197 }
3198 }
3199 }
3200 return
3201}
3202
Jooyung Han344d5432019-08-23 11:17:39 +09003203func TestVndkApexVersion(t *testing.T) {
3204 ctx, _ := testApex(t, `
3205 apex_vndk {
3206 name: "myapex_v27",
3207 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003208 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003209 vndk_version: "27",
3210 }
3211
3212 apex_key {
3213 name: "myapex.key",
3214 public_key: "testkey.avbpubkey",
3215 private_key: "testkey.pem",
3216 }
3217
Jooyung Han31c470b2019-10-18 16:26:59 +09003218 vndk_prebuilt_shared {
3219 name: "libvndk27",
3220 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003221 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003222 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003223 vndk: {
3224 enabled: true,
3225 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003226 target_arch: "arm64",
3227 arch: {
3228 arm: {
3229 srcs: ["libvndk27_arm.so"],
3230 },
3231 arm64: {
3232 srcs: ["libvndk27_arm64.so"],
3233 },
3234 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003235 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003236 }
3237
3238 vndk_prebuilt_shared {
3239 name: "libvndk27",
3240 version: "27",
3241 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003242 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003243 vndk: {
3244 enabled: true,
3245 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003246 target_arch: "x86_64",
3247 arch: {
3248 x86: {
3249 srcs: ["libvndk27_x86.so"],
3250 },
3251 x86_64: {
3252 srcs: ["libvndk27_x86_64.so"],
3253 },
3254 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003255 }
3256 `+vndkLibrariesTxtFiles("27"),
3257 withFiles(map[string][]byte{
3258 "libvndk27_arm.so": nil,
3259 "libvndk27_arm64.so": nil,
3260 "libvndk27_x86.so": nil,
3261 "libvndk27_x86_64.so": nil,
3262 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003263
Jooyung Hana57af4a2020-01-23 05:36:59 +00003264 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003265 "lib/libvndk27_arm.so",
3266 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003267 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003268 })
Jooyung Han344d5432019-08-23 11:17:39 +09003269}
3270
3271func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3272 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3273 apex_vndk {
3274 name: "myapex_v27",
3275 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003276 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003277 vndk_version: "27",
3278 }
3279 apex_vndk {
3280 name: "myapex_v27_other",
3281 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003282 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003283 vndk_version: "27",
3284 }
3285
3286 apex_key {
3287 name: "myapex.key",
3288 public_key: "testkey.avbpubkey",
3289 private_key: "testkey.pem",
3290 }
3291
3292 cc_library {
3293 name: "libvndk",
3294 srcs: ["mylib.cpp"],
3295 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003296 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003297 vndk: {
3298 enabled: true,
3299 },
3300 system_shared_libs: [],
3301 stl: "none",
3302 }
3303
3304 vndk_prebuilt_shared {
3305 name: "libvndk",
3306 version: "27",
3307 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003308 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003309 vndk: {
3310 enabled: true,
3311 },
3312 srcs: ["libvndk.so"],
3313 }
3314 `, withFiles(map[string][]byte{
3315 "libvndk.so": nil,
3316 }))
3317}
3318
Jooyung Han90eee022019-10-01 20:02:42 +09003319func TestVndkApexNameRule(t *testing.T) {
3320 ctx, _ := testApex(t, `
3321 apex_vndk {
3322 name: "myapex",
3323 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003324 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003325 }
3326 apex_vndk {
3327 name: "myapex_v28",
3328 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003329 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003330 vndk_version: "28",
3331 }
3332 apex_key {
3333 name: "myapex.key",
3334 public_key: "testkey.avbpubkey",
3335 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003336 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003337
3338 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003339 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003340 actual := proptools.String(bundle.properties.Apex_name)
3341 if !reflect.DeepEqual(actual, expected) {
3342 t.Errorf("Got '%v', expected '%v'", actual, expected)
3343 }
3344 }
3345
3346 assertApexName("com.android.vndk.vVER", "myapex")
3347 assertApexName("com.android.vndk.v28", "myapex_v28")
3348}
3349
Jooyung Han344d5432019-08-23 11:17:39 +09003350func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3351 ctx, _ := testApex(t, `
3352 apex_vndk {
3353 name: "myapex",
3354 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003355 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003356 }
3357
3358 apex_key {
3359 name: "myapex.key",
3360 public_key: "testkey.avbpubkey",
3361 private_key: "testkey.pem",
3362 }
3363
3364 cc_library {
3365 name: "libvndk",
3366 srcs: ["mylib.cpp"],
3367 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003368 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003369 native_bridge_supported: true,
3370 host_supported: true,
3371 vndk: {
3372 enabled: true,
3373 },
3374 system_shared_libs: [],
3375 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003376 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003377 }
Jooyung Han35155c42020-02-06 17:33:20 +09003378 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003379
Jooyung Hana57af4a2020-01-23 05:36:59 +00003380 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003381 "lib/libvndk.so",
3382 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003383 "lib/libc++.so",
3384 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003385 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003386 })
Jooyung Han344d5432019-08-23 11:17:39 +09003387}
3388
3389func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3390 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3391 apex_vndk {
3392 name: "myapex",
3393 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003394 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003395 native_bridge_supported: true,
3396 }
3397
3398 apex_key {
3399 name: "myapex.key",
3400 public_key: "testkey.avbpubkey",
3401 private_key: "testkey.pem",
3402 }
3403
3404 cc_library {
3405 name: "libvndk",
3406 srcs: ["mylib.cpp"],
3407 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003408 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003409 native_bridge_supported: true,
3410 host_supported: true,
3411 vndk: {
3412 enabled: true,
3413 },
3414 system_shared_libs: [],
3415 stl: "none",
3416 }
3417 `)
3418}
3419
Jooyung Han31c470b2019-10-18 16:26:59 +09003420func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003421 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003422 apex_vndk {
3423 name: "myapex_v27",
3424 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003425 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003426 vndk_version: "27",
3427 }
3428
3429 apex_key {
3430 name: "myapex.key",
3431 public_key: "testkey.avbpubkey",
3432 private_key: "testkey.pem",
3433 }
3434
3435 vndk_prebuilt_shared {
3436 name: "libvndk27",
3437 version: "27",
3438 target_arch: "arm",
3439 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003440 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003441 vndk: {
3442 enabled: true,
3443 },
3444 arch: {
3445 arm: {
3446 srcs: ["libvndk27.so"],
3447 }
3448 },
3449 }
3450
3451 vndk_prebuilt_shared {
3452 name: "libvndk27",
3453 version: "27",
3454 target_arch: "arm",
3455 binder32bit: true,
3456 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003457 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003458 vndk: {
3459 enabled: true,
3460 },
3461 arch: {
3462 arm: {
3463 srcs: ["libvndk27binder32.so"],
3464 }
3465 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003466 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003467 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003468 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003469 withFiles(map[string][]byte{
3470 "libvndk27.so": nil,
3471 "libvndk27binder32.so": nil,
3472 }),
3473 withBinder32bit,
3474 withTargets(map[android.OsType][]android.Target{
3475 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003476 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3477 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003478 },
3479 }),
3480 )
3481
Jooyung Hana57af4a2020-01-23 05:36:59 +00003482 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003483 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003484 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003485 })
3486}
3487
Jooyung Han45a96772020-06-15 14:59:42 +09003488func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3489 ctx, _ := testApex(t, `
3490 apex_vndk {
3491 name: "myapex",
3492 key: "myapex.key",
3493 file_contexts: ":myapex-file_contexts",
3494 }
3495
3496 apex_key {
3497 name: "myapex.key",
3498 public_key: "testkey.avbpubkey",
3499 private_key: "testkey.pem",
3500 }
3501
3502 cc_library {
3503 name: "libz",
3504 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003505 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003506 vndk: {
3507 enabled: true,
3508 },
3509 stubs: {
3510 symbol_file: "libz.map.txt",
3511 versions: ["30"],
3512 }
3513 }
3514 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3515 "libz.map.txt": nil,
3516 }))
3517
3518 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3519 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3520 ensureListEmpty(t, provideNativeLibs)
3521}
3522
Jooyung Hane1633032019-08-01 17:41:43 +09003523func TestDependenciesInApexManifest(t *testing.T) {
3524 ctx, _ := testApex(t, `
3525 apex {
3526 name: "myapex_nodep",
3527 key: "myapex.key",
3528 native_shared_libs: ["lib_nodep"],
3529 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003530 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003531 }
3532
3533 apex {
3534 name: "myapex_dep",
3535 key: "myapex.key",
3536 native_shared_libs: ["lib_dep"],
3537 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003538 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003539 }
3540
3541 apex {
3542 name: "myapex_provider",
3543 key: "myapex.key",
3544 native_shared_libs: ["libfoo"],
3545 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003546 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003547 }
3548
3549 apex {
3550 name: "myapex_selfcontained",
3551 key: "myapex.key",
3552 native_shared_libs: ["lib_dep", "libfoo"],
3553 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003554 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003555 }
3556
3557 apex_key {
3558 name: "myapex.key",
3559 public_key: "testkey.avbpubkey",
3560 private_key: "testkey.pem",
3561 }
3562
3563 cc_library {
3564 name: "lib_nodep",
3565 srcs: ["mylib.cpp"],
3566 system_shared_libs: [],
3567 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003568 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003569 }
3570
3571 cc_library {
3572 name: "lib_dep",
3573 srcs: ["mylib.cpp"],
3574 shared_libs: ["libfoo"],
3575 system_shared_libs: [],
3576 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003577 apex_available: [
3578 "myapex_dep",
3579 "myapex_provider",
3580 "myapex_selfcontained",
3581 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003582 }
3583
3584 cc_library {
3585 name: "libfoo",
3586 srcs: ["mytest.cpp"],
3587 stubs: {
3588 versions: ["1"],
3589 },
3590 system_shared_libs: [],
3591 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003592 apex_available: [
3593 "myapex_provider",
3594 "myapex_selfcontained",
3595 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003596 }
3597 `)
3598
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003599 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003600 var provideNativeLibs, requireNativeLibs []string
3601
Sundong Ahnabb64432019-10-22 13:58:29 +09003602 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003603 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3604 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003605 ensureListEmpty(t, provideNativeLibs)
3606 ensureListEmpty(t, requireNativeLibs)
3607
Sundong Ahnabb64432019-10-22 13:58:29 +09003608 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003609 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3610 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003611 ensureListEmpty(t, provideNativeLibs)
3612 ensureListContains(t, requireNativeLibs, "libfoo.so")
3613
Sundong Ahnabb64432019-10-22 13:58:29 +09003614 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003615 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3616 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003617 ensureListContains(t, provideNativeLibs, "libfoo.so")
3618 ensureListEmpty(t, requireNativeLibs)
3619
Sundong Ahnabb64432019-10-22 13:58:29 +09003620 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003621 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3622 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003623 ensureListContains(t, provideNativeLibs, "libfoo.so")
3624 ensureListEmpty(t, requireNativeLibs)
3625}
3626
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003627func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003628 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003629 apex {
3630 name: "myapex",
3631 key: "myapex.key",
3632 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003633 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003634 }
3635
3636 apex_key {
3637 name: "myapex.key",
3638 public_key: "testkey.avbpubkey",
3639 private_key: "testkey.pem",
3640 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003641
3642 cc_library {
3643 name: "mylib",
3644 srcs: ["mylib.cpp"],
3645 system_shared_libs: [],
3646 stl: "none",
3647 apex_available: [
3648 "//apex_available:platform",
3649 "myapex",
3650 ],
3651 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003652 `)
3653
Sundong Ahnabb64432019-10-22 13:58:29 +09003654 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003655 apexManifestRule := module.Rule("apexManifestRule")
3656 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3657 apexRule := module.Rule("apexRule")
3658 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003659
3660 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3661 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3662 name := apexBundle.BaseModuleName()
3663 prefix := "TARGET_"
3664 var builder strings.Builder
3665 data.Custom(&builder, name, prefix, "", data)
3666 androidMk := builder.String()
3667 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3668 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003669}
3670
Alex Light0851b882019-02-07 13:20:53 -08003671func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003672 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003673 apex {
3674 name: "myapex",
3675 key: "myapex.key",
3676 native_shared_libs: ["mylib_common"],
3677 }
3678
3679 apex_key {
3680 name: "myapex.key",
3681 public_key: "testkey.avbpubkey",
3682 private_key: "testkey.pem",
3683 }
3684
3685 cc_library {
3686 name: "mylib_common",
3687 srcs: ["mylib.cpp"],
3688 system_shared_libs: [],
3689 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003690 apex_available: [
3691 "//apex_available:platform",
3692 "myapex",
3693 ],
Alex Light0851b882019-02-07 13:20:53 -08003694 }
3695 `)
3696
Sundong Ahnabb64432019-10-22 13:58:29 +09003697 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003698 apexRule := module.Rule("apexRule")
3699 copyCmds := apexRule.Args["copy_commands"]
3700
3701 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3702 t.Log("Apex was a test apex!")
3703 t.Fail()
3704 }
3705 // Ensure that main rule creates an output
3706 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3707
3708 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003709 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003710
3711 // Ensure that both direct and indirect deps are copied into apex
3712 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3713
Colin Cross7113d202019-11-20 16:39:12 -08003714 // Ensure that the platform variant ends with _shared
3715 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003716
Colin Cross56a83212020-09-15 18:30:11 -07003717 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003718 t.Log("Found mylib_common not in any apex!")
3719 t.Fail()
3720 }
3721}
3722
3723func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003724 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003725 apex_test {
3726 name: "myapex",
3727 key: "myapex.key",
3728 native_shared_libs: ["mylib_common_test"],
3729 }
3730
3731 apex_key {
3732 name: "myapex.key",
3733 public_key: "testkey.avbpubkey",
3734 private_key: "testkey.pem",
3735 }
3736
3737 cc_library {
3738 name: "mylib_common_test",
3739 srcs: ["mylib.cpp"],
3740 system_shared_libs: [],
3741 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003742 // TODO: remove //apex_available:platform
3743 apex_available: [
3744 "//apex_available:platform",
3745 "myapex",
3746 ],
Alex Light0851b882019-02-07 13:20:53 -08003747 }
3748 `)
3749
Sundong Ahnabb64432019-10-22 13:58:29 +09003750 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003751 apexRule := module.Rule("apexRule")
3752 copyCmds := apexRule.Args["copy_commands"]
3753
3754 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3755 t.Log("Apex was not a test apex!")
3756 t.Fail()
3757 }
3758 // Ensure that main rule creates an output
3759 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3760
3761 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003762 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003763
3764 // Ensure that both direct and indirect deps are copied into apex
3765 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3766
Colin Cross7113d202019-11-20 16:39:12 -08003767 // Ensure that the platform variant ends with _shared
3768 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003769}
3770
Alex Light9670d332019-01-29 18:07:33 -08003771func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003772 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003773 apex {
3774 name: "myapex",
3775 key: "myapex.key",
3776 multilib: {
3777 first: {
3778 native_shared_libs: ["mylib_common"],
3779 }
3780 },
3781 target: {
3782 android: {
3783 multilib: {
3784 first: {
3785 native_shared_libs: ["mylib"],
3786 }
3787 }
3788 },
3789 host: {
3790 multilib: {
3791 first: {
3792 native_shared_libs: ["mylib2"],
3793 }
3794 }
3795 }
3796 }
3797 }
3798
3799 apex_key {
3800 name: "myapex.key",
3801 public_key: "testkey.avbpubkey",
3802 private_key: "testkey.pem",
3803 }
3804
3805 cc_library {
3806 name: "mylib",
3807 srcs: ["mylib.cpp"],
3808 system_shared_libs: [],
3809 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003810 // TODO: remove //apex_available:platform
3811 apex_available: [
3812 "//apex_available:platform",
3813 "myapex",
3814 ],
Alex Light9670d332019-01-29 18:07:33 -08003815 }
3816
3817 cc_library {
3818 name: "mylib_common",
3819 srcs: ["mylib.cpp"],
3820 system_shared_libs: [],
3821 stl: "none",
3822 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003823 // TODO: remove //apex_available:platform
3824 apex_available: [
3825 "//apex_available:platform",
3826 "myapex",
3827 ],
Alex Light9670d332019-01-29 18:07:33 -08003828 }
3829
3830 cc_library {
3831 name: "mylib2",
3832 srcs: ["mylib.cpp"],
3833 system_shared_libs: [],
3834 stl: "none",
3835 compile_multilib: "first",
3836 }
3837 `)
3838
Sundong Ahnabb64432019-10-22 13:58:29 +09003839 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003840 copyCmds := apexRule.Args["copy_commands"]
3841
3842 // Ensure that main rule creates an output
3843 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3844
3845 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003846 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3847 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3848 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003849
3850 // Ensure that both direct and indirect deps are copied into apex
3851 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3852 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3853 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3854
Colin Cross7113d202019-11-20 16:39:12 -08003855 // Ensure that the platform variant ends with _shared
3856 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3857 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3858 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003859}
Jiyong Park04480cf2019-02-06 00:16:29 +09003860
3861func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003862 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003863 apex {
3864 name: "myapex",
3865 key: "myapex.key",
3866 binaries: ["myscript"],
3867 }
3868
3869 apex_key {
3870 name: "myapex.key",
3871 public_key: "testkey.avbpubkey",
3872 private_key: "testkey.pem",
3873 }
3874
3875 sh_binary {
3876 name: "myscript",
3877 src: "mylib.cpp",
3878 filename: "myscript.sh",
3879 sub_dir: "script",
3880 }
3881 `)
3882
Sundong Ahnabb64432019-10-22 13:58:29 +09003883 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003884 copyCmds := apexRule.Args["copy_commands"]
3885
3886 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3887}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003888
Jooyung Han91df2082019-11-20 01:49:42 +09003889func TestApexInVariousPartition(t *testing.T) {
3890 testcases := []struct {
3891 propName, parition, flattenedPartition string
3892 }{
3893 {"", "system", "system_ext"},
3894 {"product_specific: true", "product", "product"},
3895 {"soc_specific: true", "vendor", "vendor"},
3896 {"proprietary: true", "vendor", "vendor"},
3897 {"vendor: true", "vendor", "vendor"},
3898 {"system_ext_specific: true", "system_ext", "system_ext"},
3899 }
3900 for _, tc := range testcases {
3901 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3902 ctx, _ := testApex(t, `
3903 apex {
3904 name: "myapex",
3905 key: "myapex.key",
3906 `+tc.propName+`
3907 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003908
Jooyung Han91df2082019-11-20 01:49:42 +09003909 apex_key {
3910 name: "myapex.key",
3911 public_key: "testkey.avbpubkey",
3912 private_key: "testkey.pem",
3913 }
3914 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003915
Jooyung Han91df2082019-11-20 01:49:42 +09003916 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3917 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3918 actual := apex.installDir.String()
3919 if actual != expected {
3920 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3921 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003922
Jooyung Han91df2082019-11-20 01:49:42 +09003923 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3924 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3925 actual = flattened.installDir.String()
3926 if actual != expected {
3927 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3928 }
3929 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003930 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003931}
Jiyong Park67882562019-03-21 01:11:21 +09003932
Jooyung Han580eb4f2020-06-24 19:33:06 +09003933func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003934 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003935 apex {
3936 name: "myapex",
3937 key: "myapex.key",
3938 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003939
Jooyung Han580eb4f2020-06-24 19:33:06 +09003940 apex_key {
3941 name: "myapex.key",
3942 public_key: "testkey.avbpubkey",
3943 private_key: "testkey.pem",
3944 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003945 `)
3946 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003947 rule := module.Output("file_contexts")
3948 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3949}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003950
Jooyung Han580eb4f2020-06-24 19:33:06 +09003951func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003952 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003953 apex {
3954 name: "myapex",
3955 key: "myapex.key",
3956 file_contexts: "my_own_file_contexts",
3957 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003958
Jooyung Han580eb4f2020-06-24 19:33:06 +09003959 apex_key {
3960 name: "myapex.key",
3961 public_key: "testkey.avbpubkey",
3962 private_key: "testkey.pem",
3963 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003964 `, withFiles(map[string][]byte{
3965 "my_own_file_contexts": nil,
3966 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003967}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003968
Jooyung Han580eb4f2020-06-24 19:33:06 +09003969func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003970 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003971 apex {
3972 name: "myapex",
3973 key: "myapex.key",
3974 product_specific: true,
3975 file_contexts: "product_specific_file_contexts",
3976 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003977
Jooyung Han580eb4f2020-06-24 19:33:06 +09003978 apex_key {
3979 name: "myapex.key",
3980 public_key: "testkey.avbpubkey",
3981 private_key: "testkey.pem",
3982 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003983 `)
3984
Jooyung Han580eb4f2020-06-24 19:33:06 +09003985 ctx, _ := testApex(t, `
3986 apex {
3987 name: "myapex",
3988 key: "myapex.key",
3989 product_specific: true,
3990 file_contexts: "product_specific_file_contexts",
3991 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003992
Jooyung Han580eb4f2020-06-24 19:33:06 +09003993 apex_key {
3994 name: "myapex.key",
3995 public_key: "testkey.avbpubkey",
3996 private_key: "testkey.pem",
3997 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003998 `, withFiles(map[string][]byte{
3999 "product_specific_file_contexts": nil,
4000 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004001 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4002 rule := module.Output("file_contexts")
4003 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4004}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004005
Jooyung Han580eb4f2020-06-24 19:33:06 +09004006func TestFileContexts_SetViaFileGroup(t *testing.T) {
4007 ctx, _ := testApex(t, `
4008 apex {
4009 name: "myapex",
4010 key: "myapex.key",
4011 product_specific: true,
4012 file_contexts: ":my-file-contexts",
4013 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004014
Jooyung Han580eb4f2020-06-24 19:33:06 +09004015 apex_key {
4016 name: "myapex.key",
4017 public_key: "testkey.avbpubkey",
4018 private_key: "testkey.pem",
4019 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004020
Jooyung Han580eb4f2020-06-24 19:33:06 +09004021 filegroup {
4022 name: "my-file-contexts",
4023 srcs: ["product_specific_file_contexts"],
4024 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004025 `, withFiles(map[string][]byte{
4026 "product_specific_file_contexts": nil,
4027 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004028 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4029 rule := module.Output("file_contexts")
4030 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004031}
4032
Jiyong Park67882562019-03-21 01:11:21 +09004033func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004034 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004035 apex_key {
4036 name: "myapex.key",
4037 public_key: ":my.avbpubkey",
4038 private_key: ":my.pem",
4039 product_specific: true,
4040 }
4041
4042 filegroup {
4043 name: "my.avbpubkey",
4044 srcs: ["testkey2.avbpubkey"],
4045 }
4046
4047 filegroup {
4048 name: "my.pem",
4049 srcs: ["testkey2.pem"],
4050 }
4051 `)
4052
4053 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4054 expected_pubkey := "testkey2.avbpubkey"
4055 actual_pubkey := apex_key.public_key_file.String()
4056 if actual_pubkey != expected_pubkey {
4057 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4058 }
4059 expected_privkey := "testkey2.pem"
4060 actual_privkey := apex_key.private_key_file.String()
4061 if actual_privkey != expected_privkey {
4062 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4063 }
4064}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004065
4066func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004067 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004068 prebuilt_apex {
4069 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004070 arch: {
4071 arm64: {
4072 src: "myapex-arm64.apex",
4073 },
4074 arm: {
4075 src: "myapex-arm.apex",
4076 },
4077 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004078 }
4079 `)
4080
4081 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4082
Jiyong Parkc95714e2019-03-29 14:23:10 +09004083 expectedInput := "myapex-arm64.apex"
4084 if prebuilt.inputApex.String() != expectedInput {
4085 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4086 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004087}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004088
4089func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004090 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004091 prebuilt_apex {
4092 name: "myapex",
4093 src: "myapex-arm.apex",
4094 filename: "notmyapex.apex",
4095 }
4096 `)
4097
4098 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4099
4100 expected := "notmyapex.apex"
4101 if p.installFilename != expected {
4102 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4103 }
4104}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004105
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004106func TestPrebuiltOverrides(t *testing.T) {
4107 ctx, config := testApex(t, `
4108 prebuilt_apex {
4109 name: "myapex.prebuilt",
4110 src: "myapex-arm.apex",
4111 overrides: [
4112 "myapex",
4113 ],
4114 }
4115 `)
4116
4117 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4118
4119 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09004120 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004121 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004122 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004123 }
4124}
4125
Roland Levillain630846d2019-06-26 12:48:34 +01004126func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004127 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004128 apex_test {
4129 name: "myapex",
4130 key: "myapex.key",
4131 tests: [
4132 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004133 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004134 ],
4135 }
4136
4137 apex_key {
4138 name: "myapex.key",
4139 public_key: "testkey.avbpubkey",
4140 private_key: "testkey.pem",
4141 }
4142
Liz Kammer1c14a212020-05-12 15:26:55 -07004143 filegroup {
4144 name: "fg",
4145 srcs: [
4146 "baz",
4147 "bar/baz"
4148 ],
4149 }
4150
Roland Levillain630846d2019-06-26 12:48:34 +01004151 cc_test {
4152 name: "mytest",
4153 gtest: false,
4154 srcs: ["mytest.cpp"],
4155 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004156 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004157 system_shared_libs: [],
4158 static_executable: true,
4159 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004160 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004161 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004162
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004163 cc_library {
4164 name: "mylib",
4165 srcs: ["mylib.cpp"],
4166 system_shared_libs: [],
4167 stl: "none",
4168 }
4169
Liz Kammer5bd365f2020-05-27 15:15:11 -07004170 filegroup {
4171 name: "fg2",
4172 srcs: [
4173 "testdata/baz"
4174 ],
4175 }
4176
Roland Levillain9b5fde92019-06-28 15:41:19 +01004177 cc_test {
4178 name: "mytests",
4179 gtest: false,
4180 srcs: [
4181 "mytest1.cpp",
4182 "mytest2.cpp",
4183 "mytest3.cpp",
4184 ],
4185 test_per_src: true,
4186 relative_install_path: "test",
4187 system_shared_libs: [],
4188 static_executable: true,
4189 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004190 data: [
4191 ":fg",
4192 ":fg2",
4193 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004194 }
Roland Levillain630846d2019-06-26 12:48:34 +01004195 `)
4196
Sundong Ahnabb64432019-10-22 13:58:29 +09004197 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004198 copyCmds := apexRule.Args["copy_commands"]
4199
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004200 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004201 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004202 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004203
Liz Kammer1c14a212020-05-12 15:26:55 -07004204 //Ensure that test data are copied into apex.
4205 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4206 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4207
Roland Levillain9b5fde92019-06-28 15:41:19 +01004208 // Ensure that test deps built with `test_per_src` are copied into apex.
4209 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4210 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4211 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004212
4213 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004214 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4215 data := android.AndroidMkDataForTest(t, config, "", bundle)
4216 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004217 prefix := "TARGET_"
4218 var builder strings.Builder
4219 data.Custom(&builder, name, prefix, "", data)
4220 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004221 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4222 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4223 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4224 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004225 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004226 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004227 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004228
4229 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4230 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4231 data.Custom(&builder, name, prefix, "", data)
4232 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004233 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4234 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004235}
4236
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004237func TestInstallExtraFlattenedApexes(t *testing.T) {
4238 ctx, config := testApex(t, `
4239 apex {
4240 name: "myapex",
4241 key: "myapex.key",
4242 }
4243 apex_key {
4244 name: "myapex.key",
4245 public_key: "testkey.avbpubkey",
4246 private_key: "testkey.pem",
4247 }
4248 `, func(fs map[string][]byte, config android.Config) {
4249 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4250 })
4251 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004252 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004253 mk := android.AndroidMkDataForTest(t, config, "", ab)
4254 var builder strings.Builder
4255 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4256 androidMk := builder.String()
4257 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4258}
4259
Jooyung Hand48f3c32019-08-23 11:18:57 +09004260func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4261 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4262 apex {
4263 name: "myapex",
4264 key: "myapex.key",
4265 native_shared_libs: ["libfoo"],
4266 }
4267
4268 apex_key {
4269 name: "myapex.key",
4270 public_key: "testkey.avbpubkey",
4271 private_key: "testkey.pem",
4272 }
4273
4274 cc_library {
4275 name: "libfoo",
4276 stl: "none",
4277 system_shared_libs: [],
4278 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004279 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004280 }
4281 `)
4282 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4283 apex {
4284 name: "myapex",
4285 key: "myapex.key",
4286 java_libs: ["myjar"],
4287 }
4288
4289 apex_key {
4290 name: "myapex.key",
4291 public_key: "testkey.avbpubkey",
4292 private_key: "testkey.pem",
4293 }
4294
4295 java_library {
4296 name: "myjar",
4297 srcs: ["foo/bar/MyClass.java"],
4298 sdk_version: "none",
4299 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004300 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004301 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004302 }
4303 `)
4304}
4305
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004306func TestApexWithApps(t *testing.T) {
4307 ctx, _ := testApex(t, `
4308 apex {
4309 name: "myapex",
4310 key: "myapex.key",
4311 apps: [
4312 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004313 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004314 ],
4315 }
4316
4317 apex_key {
4318 name: "myapex.key",
4319 public_key: "testkey.avbpubkey",
4320 private_key: "testkey.pem",
4321 }
4322
4323 android_app {
4324 name: "AppFoo",
4325 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004326 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004327 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004328 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004329 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004330 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004331 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004332
4333 android_app {
4334 name: "AppFooPriv",
4335 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004336 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004337 system_modules: "none",
4338 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004339 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004340 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004341 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004342
4343 cc_library_shared {
4344 name: "libjni",
4345 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004346 shared_libs: ["libfoo"],
4347 stl: "none",
4348 system_shared_libs: [],
4349 apex_available: [ "myapex" ],
4350 sdk_version: "current",
4351 }
4352
4353 cc_library_shared {
4354 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004355 stl: "none",
4356 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004357 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004358 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004359 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004360 `)
4361
Sundong Ahnabb64432019-10-22 13:58:29 +09004362 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004363 apexRule := module.Rule("apexRule")
4364 copyCmds := apexRule.Args["copy_commands"]
4365
4366 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004367 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004368
Colin Crossaede88c2020-08-11 12:17:01 -07004369 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004370 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004371 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004372 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004373 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004374 // JNI libraries including transitive deps are
4375 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004376 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004377 // ... embedded inside APK (jnilibs.zip)
4378 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4379 // ... and not directly inside the APEX
4380 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4381 }
Dario Frenicde2a032019-10-27 00:29:22 +01004382}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004383
Dario Frenicde2a032019-10-27 00:29:22 +01004384func TestApexWithAppImports(t *testing.T) {
4385 ctx, _ := testApex(t, `
4386 apex {
4387 name: "myapex",
4388 key: "myapex.key",
4389 apps: [
4390 "AppFooPrebuilt",
4391 "AppFooPrivPrebuilt",
4392 ],
4393 }
4394
4395 apex_key {
4396 name: "myapex.key",
4397 public_key: "testkey.avbpubkey",
4398 private_key: "testkey.pem",
4399 }
4400
4401 android_app_import {
4402 name: "AppFooPrebuilt",
4403 apk: "PrebuiltAppFoo.apk",
4404 presigned: true,
4405 dex_preopt: {
4406 enabled: false,
4407 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004408 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004409 }
4410
4411 android_app_import {
4412 name: "AppFooPrivPrebuilt",
4413 apk: "PrebuiltAppFooPriv.apk",
4414 privileged: true,
4415 presigned: true,
4416 dex_preopt: {
4417 enabled: false,
4418 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004419 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004420 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004421 }
4422 `)
4423
Sundong Ahnabb64432019-10-22 13:58:29 +09004424 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004425 apexRule := module.Rule("apexRule")
4426 copyCmds := apexRule.Args["copy_commands"]
4427
4428 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004429 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4430}
4431
4432func TestApexWithAppImportsPrefer(t *testing.T) {
4433 ctx, _ := testApex(t, `
4434 apex {
4435 name: "myapex",
4436 key: "myapex.key",
4437 apps: [
4438 "AppFoo",
4439 ],
4440 }
4441
4442 apex_key {
4443 name: "myapex.key",
4444 public_key: "testkey.avbpubkey",
4445 private_key: "testkey.pem",
4446 }
4447
4448 android_app {
4449 name: "AppFoo",
4450 srcs: ["foo/bar/MyClass.java"],
4451 sdk_version: "none",
4452 system_modules: "none",
4453 apex_available: [ "myapex" ],
4454 }
4455
4456 android_app_import {
4457 name: "AppFoo",
4458 apk: "AppFooPrebuilt.apk",
4459 filename: "AppFooPrebuilt.apk",
4460 presigned: true,
4461 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004462 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004463 }
4464 `, withFiles(map[string][]byte{
4465 "AppFooPrebuilt.apk": nil,
4466 }))
4467
4468 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4469 "app/AppFoo/AppFooPrebuilt.apk",
4470 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004471}
4472
Dario Freni6f3937c2019-12-20 22:58:03 +00004473func TestApexWithTestHelperApp(t *testing.T) {
4474 ctx, _ := testApex(t, `
4475 apex {
4476 name: "myapex",
4477 key: "myapex.key",
4478 apps: [
4479 "TesterHelpAppFoo",
4480 ],
4481 }
4482
4483 apex_key {
4484 name: "myapex.key",
4485 public_key: "testkey.avbpubkey",
4486 private_key: "testkey.pem",
4487 }
4488
4489 android_test_helper_app {
4490 name: "TesterHelpAppFoo",
4491 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004492 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004493 }
4494
4495 `)
4496
4497 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4498 apexRule := module.Rule("apexRule")
4499 copyCmds := apexRule.Args["copy_commands"]
4500
4501 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4502}
4503
Jooyung Han18020ea2019-11-13 10:50:48 +09004504func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4505 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00004506 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004507 apex {
4508 name: "myapex",
4509 key: "myapex.key",
4510 native_shared_libs: ["libfoo"],
4511 }
4512
4513 apex_key {
4514 name: "myapex.key",
4515 public_key: "testkey.avbpubkey",
4516 private_key: "testkey.pem",
4517 }
4518
4519 apex {
4520 name: "otherapex",
4521 key: "myapex.key",
4522 native_shared_libs: ["libfoo"],
4523 }
4524
4525 cc_defaults {
4526 name: "libfoo-defaults",
4527 apex_available: ["otherapex"],
4528 }
4529
4530 cc_library {
4531 name: "libfoo",
4532 defaults: ["libfoo-defaults"],
4533 stl: "none",
4534 system_shared_libs: [],
4535 }`)
4536}
4537
Paul Duffine52e66f2020-03-30 17:54:29 +01004538func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004539 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00004540 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09004541 apex {
4542 name: "myapex",
4543 key: "myapex.key",
4544 native_shared_libs: ["libfoo"],
4545 }
4546
4547 apex_key {
4548 name: "myapex.key",
4549 public_key: "testkey.avbpubkey",
4550 private_key: "testkey.pem",
4551 }
4552
4553 apex {
4554 name: "otherapex",
4555 key: "otherapex.key",
4556 native_shared_libs: ["libfoo"],
4557 }
4558
4559 apex_key {
4560 name: "otherapex.key",
4561 public_key: "testkey.avbpubkey",
4562 private_key: "testkey.pem",
4563 }
4564
4565 cc_library {
4566 name: "libfoo",
4567 stl: "none",
4568 system_shared_libs: [],
4569 apex_available: ["otherapex"],
4570 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004571}
Jiyong Park127b40b2019-09-30 16:04:35 +09004572
Paul Duffine52e66f2020-03-30 17:54:29 +01004573func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004574 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00004575 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004576.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004577.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004578.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004579.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004580.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004581.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004582 apex {
4583 name: "myapex",
4584 key: "myapex.key",
4585 native_shared_libs: ["libfoo"],
4586 }
4587
4588 apex_key {
4589 name: "myapex.key",
4590 public_key: "testkey.avbpubkey",
4591 private_key: "testkey.pem",
4592 }
4593
Jiyong Park127b40b2019-09-30 16:04:35 +09004594 cc_library {
4595 name: "libfoo",
4596 stl: "none",
4597 shared_libs: ["libbar"],
4598 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004599 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004600 }
4601
4602 cc_library {
4603 name: "libbar",
4604 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004605 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004606 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004607 apex_available: ["myapex"],
4608 }
4609
4610 cc_library {
4611 name: "libbaz",
4612 stl: "none",
4613 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004614 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004615}
Jiyong Park127b40b2019-09-30 16:04:35 +09004616
Paul Duffine52e66f2020-03-30 17:54:29 +01004617func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004618 testApexError(t, "\"otherapex\" is not a valid module name", `
4619 apex {
4620 name: "myapex",
4621 key: "myapex.key",
4622 native_shared_libs: ["libfoo"],
4623 }
4624
4625 apex_key {
4626 name: "myapex.key",
4627 public_key: "testkey.avbpubkey",
4628 private_key: "testkey.pem",
4629 }
4630
4631 cc_library {
4632 name: "libfoo",
4633 stl: "none",
4634 system_shared_libs: [],
4635 apex_available: ["otherapex"],
4636 }`)
4637
Paul Duffine52e66f2020-03-30 17:54:29 +01004638 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004639 apex {
4640 name: "myapex",
4641 key: "myapex.key",
4642 native_shared_libs: ["libfoo", "libbar"],
4643 }
4644
4645 apex_key {
4646 name: "myapex.key",
4647 public_key: "testkey.avbpubkey",
4648 private_key: "testkey.pem",
4649 }
4650
4651 cc_library {
4652 name: "libfoo",
4653 stl: "none",
4654 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004655 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004656 apex_available: ["myapex"],
4657 }
4658
4659 cc_library {
4660 name: "libbar",
4661 stl: "none",
4662 system_shared_libs: [],
4663 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004664 }
4665
4666 cc_library {
4667 name: "libbaz",
4668 stl: "none",
4669 system_shared_libs: [],
4670 stubs: {
4671 versions: ["10", "20", "30"],
4672 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004673 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004674}
Jiyong Park127b40b2019-09-30 16:04:35 +09004675
Jiyong Park89e850a2020-04-07 16:37:39 +09004676func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004677 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004678 apex {
4679 name: "myapex",
4680 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004681 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004682 }
4683
4684 apex_key {
4685 name: "myapex.key",
4686 public_key: "testkey.avbpubkey",
4687 private_key: "testkey.pem",
4688 }
4689
4690 cc_library {
4691 name: "libfoo",
4692 stl: "none",
4693 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004694 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004695 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004696 }
4697
4698 cc_library {
4699 name: "libfoo2",
4700 stl: "none",
4701 system_shared_libs: [],
4702 shared_libs: ["libbaz"],
4703 apex_available: ["//apex_available:platform"],
4704 }
4705
4706 cc_library {
4707 name: "libbar",
4708 stl: "none",
4709 system_shared_libs: [],
4710 apex_available: ["myapex"],
4711 }
4712
4713 cc_library {
4714 name: "libbaz",
4715 stl: "none",
4716 system_shared_libs: [],
4717 apex_available: ["myapex"],
4718 stubs: {
4719 versions: ["1"],
4720 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004721 }`)
4722
Jiyong Park89e850a2020-04-07 16:37:39 +09004723 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4724 // because it depends on libbar which isn't available to platform
4725 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4726 if libfoo.NotAvailableForPlatform() != true {
4727 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4728 }
4729
4730 // libfoo2 however can be available to platform because it depends on libbaz which provides
4731 // stubs
4732 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4733 if libfoo2.NotAvailableForPlatform() == true {
4734 t.Errorf("%q should be available to platform", libfoo2.String())
4735 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004736}
Jiyong Parka90ca002019-10-07 15:47:24 +09004737
Paul Duffine52e66f2020-03-30 17:54:29 +01004738func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004739 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004740 apex {
4741 name: "myapex",
4742 key: "myapex.key",
4743 native_shared_libs: ["libfoo"],
4744 }
4745
4746 apex_key {
4747 name: "myapex.key",
4748 public_key: "testkey.avbpubkey",
4749 private_key: "testkey.pem",
4750 }
4751
4752 cc_library {
4753 name: "libfoo",
4754 stl: "none",
4755 system_shared_libs: [],
4756 apex_available: ["myapex"],
4757 static: {
4758 apex_available: ["//apex_available:platform"],
4759 },
4760 }`)
4761
Jiyong Park89e850a2020-04-07 16:37:39 +09004762 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4763 if libfooShared.NotAvailableForPlatform() != true {
4764 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4765 }
4766 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4767 if libfooStatic.NotAvailableForPlatform() != false {
4768 t.Errorf("%q should be available to platform", libfooStatic.String())
4769 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004770}
4771
Jiyong Park5d790c32019-11-15 18:40:32 +09004772func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004773 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004774 apex {
4775 name: "myapex",
4776 key: "myapex.key",
4777 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004778 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004779 }
4780
4781 override_apex {
4782 name: "override_myapex",
4783 base: "myapex",
4784 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004785 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004786 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004787 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004788 }
4789
4790 apex_key {
4791 name: "myapex.key",
4792 public_key: "testkey.avbpubkey",
4793 private_key: "testkey.pem",
4794 }
4795
4796 android_app {
4797 name: "app",
4798 srcs: ["foo/bar/MyClass.java"],
4799 package_name: "foo",
4800 sdk_version: "none",
4801 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004802 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004803 }
4804
4805 override_android_app {
4806 name: "override_app",
4807 base: "app",
4808 package_name: "bar",
4809 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004810 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004811
Jiyong Park317645e2019-12-05 13:20:58 +09004812 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4813 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4814 if originalVariant.GetOverriddenBy() != "" {
4815 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4816 }
4817 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4818 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4819 }
4820
Jiyong Park5d790c32019-11-15 18:40:32 +09004821 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4822 apexRule := module.Rule("apexRule")
4823 copyCmds := apexRule.Args["copy_commands"]
4824
4825 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004826 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004827
4828 apexBundle := module.Module().(*apexBundle)
4829 name := apexBundle.Name()
4830 if name != "override_myapex" {
4831 t.Errorf("name should be \"override_myapex\", but was %q", name)
4832 }
4833
Baligh Uddin004d7172020-02-19 21:29:28 -08004834 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4835 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4836 }
4837
Jiyong Park20bacab2020-03-03 11:45:41 +09004838 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004839 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004840
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004841 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4842 var builder strings.Builder
4843 data.Custom(&builder, name, "TARGET_", "", data)
4844 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004845 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004846 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4847 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004848 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004849 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004850 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004851 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4852 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004853}
4854
Jooyung Han214bf372019-11-12 13:03:50 +09004855func TestLegacyAndroid10Support(t *testing.T) {
4856 ctx, _ := testApex(t, `
4857 apex {
4858 name: "myapex",
4859 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004860 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004861 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004862 }
4863
4864 apex_key {
4865 name: "myapex.key",
4866 public_key: "testkey.avbpubkey",
4867 private_key: "testkey.pem",
4868 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004869
4870 cc_library {
4871 name: "mylib",
4872 srcs: ["mylib.cpp"],
4873 stl: "libc++",
4874 system_shared_libs: [],
4875 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004876 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004877 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004878 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004879
4880 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4881 args := module.Rule("apexRule").Args
4882 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004883 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004884
4885 // The copies of the libraries in the apex should have one more dependency than
4886 // the ones outside the apex, namely the unwinder. Ideally we should check
4887 // the dependency names directly here but for some reason the names are blank in
4888 // this test.
4889 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004890 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004891 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4892 if len(apexImplicits) != len(nonApexImplicits)+1 {
4893 t.Errorf("%q missing unwinder dep", lib)
4894 }
4895 }
Jooyung Han214bf372019-11-12 13:03:50 +09004896}
4897
Paul Duffin9b879592020-05-26 13:21:35 +01004898var filesForSdkLibrary = map[string][]byte{
4899 "api/current.txt": nil,
4900 "api/removed.txt": nil,
4901 "api/system-current.txt": nil,
4902 "api/system-removed.txt": nil,
4903 "api/test-current.txt": nil,
4904 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004905
4906 // For java_sdk_library_import
4907 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004908}
4909
Jooyung Han58f26ab2019-12-18 15:34:32 +09004910func TestJavaSDKLibrary(t *testing.T) {
4911 ctx, _ := testApex(t, `
4912 apex {
4913 name: "myapex",
4914 key: "myapex.key",
4915 java_libs: ["foo"],
4916 }
4917
4918 apex_key {
4919 name: "myapex.key",
4920 public_key: "testkey.avbpubkey",
4921 private_key: "testkey.pem",
4922 }
4923
4924 java_sdk_library {
4925 name: "foo",
4926 srcs: ["a.java"],
4927 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004928 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004929 }
Paul Duffin9b879592020-05-26 13:21:35 +01004930 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004931
4932 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004933 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004934 "javalib/foo.jar",
4935 "etc/permissions/foo.xml",
4936 })
4937 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004938 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4939 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004940}
4941
Paul Duffin9b879592020-05-26 13:21:35 +01004942func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4943 ctx, _ := testApex(t, `
4944 apex {
4945 name: "myapex",
4946 key: "myapex.key",
4947 java_libs: ["foo", "bar"],
4948 }
4949
4950 apex_key {
4951 name: "myapex.key",
4952 public_key: "testkey.avbpubkey",
4953 private_key: "testkey.pem",
4954 }
4955
4956 java_sdk_library {
4957 name: "foo",
4958 srcs: ["a.java"],
4959 api_packages: ["foo"],
4960 apex_available: ["myapex"],
4961 sdk_version: "none",
4962 system_modules: "none",
4963 }
4964
4965 java_library {
4966 name: "bar",
4967 srcs: ["a.java"],
4968 libs: ["foo"],
4969 apex_available: ["myapex"],
4970 sdk_version: "none",
4971 system_modules: "none",
4972 }
4973 `, withFiles(filesForSdkLibrary))
4974
4975 // java_sdk_library installs both impl jar and permission XML
4976 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4977 "javalib/bar.jar",
4978 "javalib/foo.jar",
4979 "etc/permissions/foo.xml",
4980 })
4981
4982 // The bar library should depend on the implementation jar.
4983 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4984 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4985 t.Errorf("expected %q, found %#q", expected, actual)
4986 }
4987}
4988
4989func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4990 ctx, _ := testApex(t, `
4991 apex {
4992 name: "myapex",
4993 key: "myapex.key",
4994 java_libs: ["foo"],
4995 }
4996
4997 apex_key {
4998 name: "myapex.key",
4999 public_key: "testkey.avbpubkey",
5000 private_key: "testkey.pem",
5001 }
5002
5003 java_sdk_library {
5004 name: "foo",
5005 srcs: ["a.java"],
5006 api_packages: ["foo"],
5007 apex_available: ["myapex"],
5008 sdk_version: "none",
5009 system_modules: "none",
5010 }
5011
5012 java_library {
5013 name: "bar",
5014 srcs: ["a.java"],
5015 libs: ["foo"],
5016 sdk_version: "none",
5017 system_modules: "none",
5018 }
5019 `, withFiles(filesForSdkLibrary))
5020
5021 // java_sdk_library installs both impl jar and permission XML
5022 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5023 "javalib/foo.jar",
5024 "etc/permissions/foo.xml",
5025 })
5026
5027 // The bar library should depend on the stubs jar.
5028 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5029 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5030 t.Errorf("expected %q, found %#q", expected, actual)
5031 }
5032}
5033
Paul Duffineedc5d52020-06-12 17:46:39 +01005034func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
5035 ctx, _ := testApex(t, ``,
5036 withFiles(map[string][]byte{
5037 "apex/a.java": nil,
5038 "apex/apex_manifest.json": nil,
5039 "apex/Android.bp": []byte(`
5040 package {
5041 default_visibility: ["//visibility:private"],
5042 }
5043
5044 apex {
5045 name: "myapex",
5046 key: "myapex.key",
5047 java_libs: ["foo", "bar"],
5048 }
5049
5050 apex_key {
5051 name: "myapex.key",
5052 public_key: "testkey.avbpubkey",
5053 private_key: "testkey.pem",
5054 }
5055
5056 java_library {
5057 name: "bar",
5058 srcs: ["a.java"],
5059 libs: ["foo"],
5060 apex_available: ["myapex"],
5061 sdk_version: "none",
5062 system_modules: "none",
5063 }
5064`),
5065 "source/a.java": nil,
5066 "source/api/current.txt": nil,
5067 "source/api/removed.txt": nil,
5068 "source/Android.bp": []byte(`
5069 package {
5070 default_visibility: ["//visibility:private"],
5071 }
5072
5073 java_sdk_library {
5074 name: "foo",
5075 visibility: ["//apex"],
5076 srcs: ["a.java"],
5077 api_packages: ["foo"],
5078 apex_available: ["myapex"],
5079 sdk_version: "none",
5080 system_modules: "none",
5081 public: {
5082 enabled: true,
5083 },
5084 }
5085`),
5086 "prebuilt/a.jar": nil,
5087 "prebuilt/Android.bp": []byte(`
5088 package {
5089 default_visibility: ["//visibility:private"],
5090 }
5091
5092 java_sdk_library_import {
5093 name: "foo",
5094 visibility: ["//apex", "//source"],
5095 apex_available: ["myapex"],
5096 prefer: true,
5097 public: {
5098 jars: ["a.jar"],
5099 },
5100 }
5101`),
5102 }),
5103 )
5104
5105 // java_sdk_library installs both impl jar and permission XML
5106 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5107 "javalib/bar.jar",
5108 "javalib/foo.jar",
5109 "etc/permissions/foo.xml",
5110 })
5111
5112 // The bar library should depend on the implementation jar.
5113 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5114 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5115 t.Errorf("expected %q, found %#q", expected, actual)
5116 }
5117}
5118
5119func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5120 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5121 apex {
5122 name: "myapex",
5123 key: "myapex.key",
5124 java_libs: ["foo"],
5125 }
5126
5127 apex_key {
5128 name: "myapex.key",
5129 public_key: "testkey.avbpubkey",
5130 private_key: "testkey.pem",
5131 }
5132
5133 java_sdk_library_import {
5134 name: "foo",
5135 apex_available: ["myapex"],
5136 prefer: true,
5137 public: {
5138 jars: ["a.jar"],
5139 },
5140 }
5141
5142 `, withFiles(filesForSdkLibrary))
5143}
5144
atrost6e126252020-01-27 17:01:16 +00005145func TestCompatConfig(t *testing.T) {
5146 ctx, _ := testApex(t, `
5147 apex {
5148 name: "myapex",
5149 key: "myapex.key",
5150 prebuilts: ["myjar-platform-compat-config"],
5151 java_libs: ["myjar"],
5152 }
5153
5154 apex_key {
5155 name: "myapex.key",
5156 public_key: "testkey.avbpubkey",
5157 private_key: "testkey.pem",
5158 }
5159
5160 platform_compat_config {
5161 name: "myjar-platform-compat-config",
5162 src: ":myjar",
5163 }
5164
5165 java_library {
5166 name: "myjar",
5167 srcs: ["foo/bar/MyClass.java"],
5168 sdk_version: "none",
5169 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005170 apex_available: [ "myapex" ],
5171 }
5172 `)
5173 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5174 "etc/compatconfig/myjar-platform-compat-config.xml",
5175 "javalib/myjar.jar",
5176 })
5177}
5178
Jiyong Park479321d2019-12-16 11:47:12 +09005179func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5180 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5181 apex {
5182 name: "myapex",
5183 key: "myapex.key",
5184 java_libs: ["myjar"],
5185 }
5186
5187 apex_key {
5188 name: "myapex.key",
5189 public_key: "testkey.avbpubkey",
5190 private_key: "testkey.pem",
5191 }
5192
5193 java_library {
5194 name: "myjar",
5195 srcs: ["foo/bar/MyClass.java"],
5196 sdk_version: "none",
5197 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005198 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005199 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005200 }
5201 `)
5202}
5203
Jiyong Park7afd1072019-12-30 16:56:33 +09005204func TestCarryRequiredModuleNames(t *testing.T) {
5205 ctx, config := testApex(t, `
5206 apex {
5207 name: "myapex",
5208 key: "myapex.key",
5209 native_shared_libs: ["mylib"],
5210 }
5211
5212 apex_key {
5213 name: "myapex.key",
5214 public_key: "testkey.avbpubkey",
5215 private_key: "testkey.pem",
5216 }
5217
5218 cc_library {
5219 name: "mylib",
5220 srcs: ["mylib.cpp"],
5221 system_shared_libs: [],
5222 stl: "none",
5223 required: ["a", "b"],
5224 host_required: ["c", "d"],
5225 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005226 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005227 }
5228 `)
5229
5230 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5231 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5232 name := apexBundle.BaseModuleName()
5233 prefix := "TARGET_"
5234 var builder strings.Builder
5235 data.Custom(&builder, name, prefix, "", data)
5236 androidMk := builder.String()
5237 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5238 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5239 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5240}
5241
Jiyong Park7cd10e32020-01-14 09:22:18 +09005242func TestSymlinksFromApexToSystem(t *testing.T) {
5243 bp := `
5244 apex {
5245 name: "myapex",
5246 key: "myapex.key",
5247 native_shared_libs: ["mylib"],
5248 java_libs: ["myjar"],
5249 }
5250
Jiyong Park9d677202020-02-19 16:29:35 +09005251 apex {
5252 name: "myapex.updatable",
5253 key: "myapex.key",
5254 native_shared_libs: ["mylib"],
5255 java_libs: ["myjar"],
5256 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005257 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005258 }
5259
Jiyong Park7cd10e32020-01-14 09:22:18 +09005260 apex_key {
5261 name: "myapex.key",
5262 public_key: "testkey.avbpubkey",
5263 private_key: "testkey.pem",
5264 }
5265
5266 cc_library {
5267 name: "mylib",
5268 srcs: ["mylib.cpp"],
5269 shared_libs: ["myotherlib"],
5270 system_shared_libs: [],
5271 stl: "none",
5272 apex_available: [
5273 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005274 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005275 "//apex_available:platform",
5276 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005277 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005278 }
5279
5280 cc_library {
5281 name: "myotherlib",
5282 srcs: ["mylib.cpp"],
5283 system_shared_libs: [],
5284 stl: "none",
5285 apex_available: [
5286 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005287 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005288 "//apex_available:platform",
5289 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005290 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005291 }
5292
5293 java_library {
5294 name: "myjar",
5295 srcs: ["foo/bar/MyClass.java"],
5296 sdk_version: "none",
5297 system_modules: "none",
5298 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005299 apex_available: [
5300 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005301 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005302 "//apex_available:platform",
5303 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005304 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005305 }
5306
5307 java_library {
5308 name: "myotherjar",
5309 srcs: ["foo/bar/MyClass.java"],
5310 sdk_version: "none",
5311 system_modules: "none",
5312 apex_available: [
5313 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005314 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005315 "//apex_available:platform",
5316 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005317 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005318 }
5319 `
5320
5321 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5322 for _, f := range files {
5323 if f.path == file {
5324 if f.isLink {
5325 t.Errorf("%q is not a real file", file)
5326 }
5327 return
5328 }
5329 }
5330 t.Errorf("%q is not found", file)
5331 }
5332
5333 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5334 for _, f := range files {
5335 if f.path == file {
5336 if !f.isLink {
5337 t.Errorf("%q is not a symlink", file)
5338 }
5339 return
5340 }
5341 }
5342 t.Errorf("%q is not found", file)
5343 }
5344
Jiyong Park9d677202020-02-19 16:29:35 +09005345 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5346 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005347 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005348 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005349 ensureRealfileExists(t, files, "javalib/myjar.jar")
5350 ensureRealfileExists(t, files, "lib64/mylib.so")
5351 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5352
Jiyong Park9d677202020-02-19 16:29:35 +09005353 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5354 ensureRealfileExists(t, files, "javalib/myjar.jar")
5355 ensureRealfileExists(t, files, "lib64/mylib.so")
5356 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5357
5358 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005359 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005360 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005361 ensureRealfileExists(t, files, "javalib/myjar.jar")
5362 ensureRealfileExists(t, files, "lib64/mylib.so")
5363 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005364
5365 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5366 ensureRealfileExists(t, files, "javalib/myjar.jar")
5367 ensureRealfileExists(t, files, "lib64/mylib.so")
5368 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005369}
5370
Yo Chiange8128052020-07-23 20:09:18 +08005371func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5372 ctx, config := testApex(t, `
5373 apex {
5374 name: "myapex",
5375 key: "myapex.key",
5376 native_shared_libs: ["mylib"],
5377 }
5378
5379 apex_key {
5380 name: "myapex.key",
5381 public_key: "testkey.avbpubkey",
5382 private_key: "testkey.pem",
5383 }
5384
5385 cc_library_shared {
5386 name: "mylib",
5387 srcs: ["mylib.cpp"],
5388 shared_libs: ["myotherlib"],
5389 system_shared_libs: [],
5390 stl: "none",
5391 apex_available: [
5392 "myapex",
5393 "//apex_available:platform",
5394 ],
5395 }
5396
5397 cc_prebuilt_library_shared {
5398 name: "myotherlib",
5399 srcs: ["prebuilt.so"],
5400 system_shared_libs: [],
5401 stl: "none",
5402 apex_available: [
5403 "myapex",
5404 "//apex_available:platform",
5405 ],
5406 }
5407 `)
5408
5409 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5410 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5411 var builder strings.Builder
5412 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5413 androidMk := builder.String()
5414 // `myotherlib` is added to `myapex` as symlink
5415 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5416 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5417 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5418 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5419 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5420}
5421
Jooyung Han643adc42020-02-27 13:50:06 +09005422func TestApexWithJniLibs(t *testing.T) {
5423 ctx, _ := testApex(t, `
5424 apex {
5425 name: "myapex",
5426 key: "myapex.key",
5427 jni_libs: ["mylib"],
5428 }
5429
5430 apex_key {
5431 name: "myapex.key",
5432 public_key: "testkey.avbpubkey",
5433 private_key: "testkey.pem",
5434 }
5435
5436 cc_library {
5437 name: "mylib",
5438 srcs: ["mylib.cpp"],
5439 shared_libs: ["mylib2"],
5440 system_shared_libs: [],
5441 stl: "none",
5442 apex_available: [ "myapex" ],
5443 }
5444
5445 cc_library {
5446 name: "mylib2",
5447 srcs: ["mylib.cpp"],
5448 system_shared_libs: [],
5449 stl: "none",
5450 apex_available: [ "myapex" ],
5451 }
5452 `)
5453
5454 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5455 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5456 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5457 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5458 "lib64/mylib.so",
5459 "lib64/mylib2.so",
5460 })
5461}
5462
Jooyung Han49f67012020-04-17 13:43:10 +09005463func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5464 ctx, _ := testApex(t, `
5465 apex {
5466 name: "myapex",
5467 key: "myapex.key",
5468 }
5469 apex_key {
5470 name: "myapex.key",
5471 public_key: "testkey.avbpubkey",
5472 private_key: "testkey.pem",
5473 }
5474 `, func(fs map[string][]byte, config android.Config) {
5475 delete(config.Targets, android.Android)
5476 config.AndroidCommonTarget = android.Target{}
5477 })
5478
5479 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5480 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5481 }
5482}
5483
Jiyong Parkbd159612020-02-28 15:22:21 +09005484func TestAppBundle(t *testing.T) {
5485 ctx, _ := testApex(t, `
5486 apex {
5487 name: "myapex",
5488 key: "myapex.key",
5489 apps: ["AppFoo"],
5490 }
5491
5492 apex_key {
5493 name: "myapex.key",
5494 public_key: "testkey.avbpubkey",
5495 private_key: "testkey.pem",
5496 }
5497
5498 android_app {
5499 name: "AppFoo",
5500 srcs: ["foo/bar/MyClass.java"],
5501 sdk_version: "none",
5502 system_modules: "none",
5503 apex_available: [ "myapex" ],
5504 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005505 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005506
Colin Crosscf371cc2020-11-13 11:48:42 -08005507 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09005508 content := bundleConfigRule.Args["content"]
5509
5510 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005511 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 +09005512}
5513
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005514func TestAppSetBundle(t *testing.T) {
5515 ctx, _ := testApex(t, `
5516 apex {
5517 name: "myapex",
5518 key: "myapex.key",
5519 apps: ["AppSet"],
5520 }
5521
5522 apex_key {
5523 name: "myapex.key",
5524 public_key: "testkey.avbpubkey",
5525 private_key: "testkey.pem",
5526 }
5527
5528 android_app_set {
5529 name: "AppSet",
5530 set: "AppSet.apks",
5531 }`)
5532 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08005533 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005534 content := bundleConfigRule.Args["content"]
5535 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5536 s := mod.Rule("apexRule").Args["copy_commands"]
5537 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5538 if len(copyCmds) != 3 {
5539 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5540 }
5541 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5542 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5543 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5544}
5545
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07005546func TestAppSetBundlePrebuilt(t *testing.T) {
5547 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
5548 bp := `
5549 apex_set {
5550 name: "myapex",
5551 filename: "foo_v2.apex",
5552 sanitized: {
5553 none: { set: "myapex.apks", },
5554 hwaddress: { set: "myapex.hwasan.apks", },
5555 },
5556 }`
5557 fs["Android.bp"] = []byte(bp)
5558
5559 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
5560 })
5561
5562 m := ctx.ModuleForTests("myapex", "android_common")
5563 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5564
5565 actual := extractedApex.Inputs
5566 if len(actual) != 1 {
5567 t.Errorf("expected a single input")
5568 }
5569
5570 expected := "myapex.hwasan.apks"
5571 if actual[0].String() != expected {
5572 t.Errorf("expected %s, got %s", expected, actual[0].String())
5573 }
5574}
5575
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005576func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005577 t.Helper()
5578
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005579 bp := `
5580 java_library {
5581 name: "some-updatable-apex-lib",
5582 srcs: ["a.java"],
5583 sdk_version: "current",
5584 apex_available: [
5585 "some-updatable-apex",
5586 ],
5587 }
5588
5589 java_library {
5590 name: "some-non-updatable-apex-lib",
5591 srcs: ["a.java"],
5592 apex_available: [
5593 "some-non-updatable-apex",
5594 ],
5595 }
5596
5597 java_library {
5598 name: "some-platform-lib",
5599 srcs: ["a.java"],
5600 sdk_version: "current",
5601 installable: true,
5602 }
5603
5604 java_library {
5605 name: "some-art-lib",
5606 srcs: ["a.java"],
5607 sdk_version: "current",
5608 apex_available: [
5609 "com.android.art.something",
5610 ],
5611 hostdex: true,
5612 }
5613
5614 apex {
5615 name: "some-updatable-apex",
5616 key: "some-updatable-apex.key",
5617 java_libs: ["some-updatable-apex-lib"],
5618 updatable: true,
5619 min_sdk_version: "current",
5620 }
5621
5622 apex {
5623 name: "some-non-updatable-apex",
5624 key: "some-non-updatable-apex.key",
5625 java_libs: ["some-non-updatable-apex-lib"],
5626 }
5627
5628 apex_key {
5629 name: "some-updatable-apex.key",
5630 }
5631
5632 apex_key {
5633 name: "some-non-updatable-apex.key",
5634 }
5635
5636 apex {
5637 name: "com.android.art.something",
5638 key: "com.android.art.something.key",
5639 java_libs: ["some-art-lib"],
5640 updatable: true,
5641 min_sdk_version: "current",
5642 }
5643
5644 apex_key {
5645 name: "com.android.art.something.key",
5646 }
5647
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005648 filegroup {
5649 name: "some-updatable-apex-file_contexts",
5650 srcs: [
5651 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5652 ],
5653 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005654
5655 filegroup {
5656 name: "some-non-updatable-apex-file_contexts",
5657 srcs: [
5658 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5659 ],
5660 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005661 `
5662 bp += cc.GatherRequiredDepsForTest(android.Android)
5663 bp += java.GatherRequiredDepsForTest()
5664 bp += dexpreopt.BpToolModulesForTest()
5665
5666 fs := map[string][]byte{
5667 "a.java": nil,
5668 "a.jar": nil,
5669 "build/make/target/product/security": nil,
5670 "apex_manifest.json": nil,
5671 "AndroidManifest.xml": nil,
5672 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005673 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005674 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5675 "framework/aidl/a.aidl": nil,
5676 }
5677 cc.GatherRequiredFilesForTest(fs)
5678
Colin Crossae8600b2020-10-29 17:09:13 -07005679 config := android.TestArchConfig(buildDir, nil, bp, fs)
5680
5681 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005682 ctx.RegisterModuleType("apex", BundleFactory)
5683 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5684 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005685 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005686 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005687 cc.RegisterRequiredBuildComponentsForTest(ctx)
5688 java.RegisterJavaBuildComponents(ctx)
5689 java.RegisterSystemModulesBuildComponents(ctx)
5690 java.RegisterAppBuildComponents(ctx)
5691 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005692 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5693 ctx.PreDepsMutators(RegisterPreDepsMutators)
5694 ctx.PostDepsMutators(RegisterPostDepsMutators)
5695
Colin Crossae8600b2020-10-29 17:09:13 -07005696 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005697
5698 _ = dexpreopt.GlobalSoongConfigForTests(config)
5699 dexpreopt.RegisterToolModulesForTest(ctx)
5700 pathCtx := android.PathContextForTesting(config)
5701 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5702 transformDexpreoptConfig(dexpreoptConfig)
5703 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5704
5705 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5706 android.FailIfErrored(t, errs)
5707
5708 _, errs = ctx.PrepareBuildActions(config)
5709 if errmsg == "" {
5710 android.FailIfErrored(t, errs)
5711 } else if len(errs) > 0 {
5712 android.FailIfNoMatchingErrors(t, errmsg, errs)
5713 return
5714 } else {
5715 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5716 }
5717}
5718
Jooyung Han548640b2020-04-27 12:10:30 +09005719func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5720 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5721 apex {
5722 name: "myapex",
5723 key: "myapex.key",
5724 updatable: true,
5725 }
5726
5727 apex_key {
5728 name: "myapex.key",
5729 public_key: "testkey.avbpubkey",
5730 private_key: "testkey.pem",
5731 }
5732 `)
5733}
5734
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005735func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005736 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005737 var transform func(*dexpreopt.GlobalConfig)
5738
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005739 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5740 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005741 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005742 }
5743 testNoUpdatableJarsInBootImage(t, "", transform)
5744 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005745
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005746 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005747 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 +01005748 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005749 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005750 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005751 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005752 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005753
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005754 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 -07005755 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 +01005756 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005757 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005758 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005759 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005760 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005761
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005762 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 -07005763 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005764 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005765 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005766 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005767 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005768 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005769
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005770 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 -07005771 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 +01005772 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005773 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005774 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005775 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005776 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005777
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005778 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5779 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005780 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005781 }
5782 testNoUpdatableJarsInBootImage(t, "", transform)
5783 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005784
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005785 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005786 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005787 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005788 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005789 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005790 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005791 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005792
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005793 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005794 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005795 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005796 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005797 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005798 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005799 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005800
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005801 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005802 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005803 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005804 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005805 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005806 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005807 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005808
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005809 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5810 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005811 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005812 }
5813 testNoUpdatableJarsInBootImage(t, "", transform)
5814 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005815}
5816
Andrei Onea115e7e72020-06-05 21:14:03 +01005817func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5818 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01005819 bp += `
5820 apex_key {
5821 name: "myapex.key",
5822 public_key: "testkey.avbpubkey",
5823 private_key: "testkey.pem",
5824 }`
5825 fs := map[string][]byte{
5826 "lib1/src/A.java": nil,
5827 "lib2/src/B.java": nil,
5828 "system/sepolicy/apex/myapex-file_contexts": nil,
5829 }
5830
Colin Crossae8600b2020-10-29 17:09:13 -07005831 config := android.TestArchConfig(buildDir, nil, bp, fs)
5832 android.SetTestNeverallowRules(config, rules)
5833 updatableBootJars := make([]string, 0, len(apexBootJars))
5834 for _, apexBootJar := range apexBootJars {
5835 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
5836 }
5837 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
5838
5839 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01005840 ctx.RegisterModuleType("apex", BundleFactory)
5841 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5842 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5843 cc.RegisterRequiredBuildComponentsForTest(ctx)
5844 java.RegisterJavaBuildComponents(ctx)
5845 java.RegisterSystemModulesBuildComponents(ctx)
5846 java.RegisterDexpreoptBootJarsComponents(ctx)
5847 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5848 ctx.PreDepsMutators(RegisterPreDepsMutators)
5849 ctx.PostDepsMutators(RegisterPostDepsMutators)
5850 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5851
Colin Crossae8600b2020-10-29 17:09:13 -07005852 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01005853
5854 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5855 android.FailIfErrored(t, errs)
5856
5857 _, errs = ctx.PrepareBuildActions(config)
5858 if errmsg == "" {
5859 android.FailIfErrored(t, errs)
5860 } else if len(errs) > 0 {
5861 android.FailIfNoMatchingErrors(t, errmsg, errs)
5862 return
5863 } else {
5864 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5865 }
5866}
5867
5868func TestApexPermittedPackagesRules(t *testing.T) {
5869 testcases := []struct {
5870 name string
5871 expectedError string
5872 bp string
5873 bootJars []string
5874 modulesPackages map[string][]string
5875 }{
5876
5877 {
5878 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
5879 expectedError: "",
5880 bp: `
5881 java_library {
5882 name: "bcp_lib1",
5883 srcs: ["lib1/src/*.java"],
5884 permitted_packages: ["foo.bar"],
5885 apex_available: ["myapex"],
5886 sdk_version: "none",
5887 system_modules: "none",
5888 }
5889 java_library {
5890 name: "nonbcp_lib2",
5891 srcs: ["lib2/src/*.java"],
5892 apex_available: ["myapex"],
5893 permitted_packages: ["a.b"],
5894 sdk_version: "none",
5895 system_modules: "none",
5896 }
5897 apex {
5898 name: "myapex",
5899 key: "myapex.key",
5900 java_libs: ["bcp_lib1", "nonbcp_lib2"],
5901 }`,
5902 bootJars: []string{"bcp_lib1"},
5903 modulesPackages: map[string][]string{
5904 "myapex": []string{
5905 "foo.bar",
5906 },
5907 },
5908 },
5909 {
5910 name: "Bootclasspath apex jar not satisfying allowed module packages.",
5911 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.`,
5912 bp: `
5913 java_library {
5914 name: "bcp_lib1",
5915 srcs: ["lib1/src/*.java"],
5916 apex_available: ["myapex"],
5917 permitted_packages: ["foo.bar"],
5918 sdk_version: "none",
5919 system_modules: "none",
5920 }
5921 java_library {
5922 name: "bcp_lib2",
5923 srcs: ["lib2/src/*.java"],
5924 apex_available: ["myapex"],
5925 permitted_packages: ["foo.bar", "bar.baz"],
5926 sdk_version: "none",
5927 system_modules: "none",
5928 }
5929 apex {
5930 name: "myapex",
5931 key: "myapex.key",
5932 java_libs: ["bcp_lib1", "bcp_lib2"],
5933 }
5934 `,
5935 bootJars: []string{"bcp_lib1", "bcp_lib2"},
5936 modulesPackages: map[string][]string{
5937 "myapex": []string{
5938 "foo.bar",
5939 },
5940 },
5941 },
5942 }
5943 for _, tc := range testcases {
5944 t.Run(tc.name, func(t *testing.T) {
5945 rules := createApexPermittedPackagesRules(tc.modulesPackages)
5946 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
5947 })
5948 }
5949}
5950
Jiyong Park62304bb2020-04-13 16:19:48 +09005951func TestTestFor(t *testing.T) {
5952 ctx, _ := testApex(t, `
5953 apex {
5954 name: "myapex",
5955 key: "myapex.key",
5956 native_shared_libs: ["mylib", "myprivlib"],
5957 }
5958
5959 apex_key {
5960 name: "myapex.key",
5961 public_key: "testkey.avbpubkey",
5962 private_key: "testkey.pem",
5963 }
5964
5965 cc_library {
5966 name: "mylib",
5967 srcs: ["mylib.cpp"],
5968 system_shared_libs: [],
5969 stl: "none",
5970 stubs: {
5971 versions: ["1"],
5972 },
5973 apex_available: ["myapex"],
5974 }
5975
5976 cc_library {
5977 name: "myprivlib",
5978 srcs: ["mylib.cpp"],
5979 system_shared_libs: [],
5980 stl: "none",
5981 apex_available: ["myapex"],
5982 }
5983
5984
5985 cc_test {
5986 name: "mytest",
5987 gtest: false,
5988 srcs: ["mylib.cpp"],
5989 system_shared_libs: [],
5990 stl: "none",
5991 shared_libs: ["mylib", "myprivlib"],
5992 test_for: ["myapex"]
5993 }
5994 `)
5995
5996 // the test 'mytest' is a test for the apex, therefore is linked to the
5997 // actual implementation of mylib instead of its stub.
5998 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5999 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6000 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6001}
6002
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006003// TODO(jungjw): Move this to proptools
6004func intPtr(i int) *int {
6005 return &i
6006}
6007
6008func TestApexSet(t *testing.T) {
6009 ctx, config := testApex(t, `
6010 apex_set {
6011 name: "myapex",
6012 set: "myapex.apks",
6013 filename: "foo_v2.apex",
6014 overrides: ["foo"],
6015 }
6016 `, func(fs map[string][]byte, config android.Config) {
6017 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006018 config.Targets[android.Android] = []android.Target{
6019 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6020 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6021 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006022 })
6023
6024 m := ctx.ModuleForTests("myapex", "android_common")
6025
6026 // Check extract_apks tool parameters.
6027 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6028 actual := extractedApex.Args["abis"]
6029 expected := "ARMEABI_V7A,ARM64_V8A"
6030 if actual != expected {
6031 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6032 }
6033 actual = extractedApex.Args["sdk-version"]
6034 expected = "30"
6035 if actual != expected {
6036 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6037 }
6038
6039 a := m.Module().(*ApexSet)
6040 expectedOverrides := []string{"foo"}
6041 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
6042 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6043 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6044 }
6045}
6046
Jiyong Park7d95a512020-05-10 15:16:24 +09006047func TestNoStaticLinkingToStubsLib(t *testing.T) {
6048 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6049 apex {
6050 name: "myapex",
6051 key: "myapex.key",
6052 native_shared_libs: ["mylib"],
6053 }
6054
6055 apex_key {
6056 name: "myapex.key",
6057 public_key: "testkey.avbpubkey",
6058 private_key: "testkey.pem",
6059 }
6060
6061 cc_library {
6062 name: "mylib",
6063 srcs: ["mylib.cpp"],
6064 static_libs: ["otherlib"],
6065 system_shared_libs: [],
6066 stl: "none",
6067 apex_available: [ "myapex" ],
6068 }
6069
6070 cc_library {
6071 name: "otherlib",
6072 srcs: ["mylib.cpp"],
6073 system_shared_libs: [],
6074 stl: "none",
6075 stubs: {
6076 versions: ["1", "2", "3"],
6077 },
6078 apex_available: [ "myapex" ],
6079 }
6080 `)
6081}
6082
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006083func TestApexKeysTxt(t *testing.T) {
6084 ctx, _ := testApex(t, `
6085 apex {
6086 name: "myapex",
6087 key: "myapex.key",
6088 }
6089
6090 apex_key {
6091 name: "myapex.key",
6092 public_key: "testkey.avbpubkey",
6093 private_key: "testkey.pem",
6094 }
6095
6096 prebuilt_apex {
6097 name: "myapex",
6098 prefer: true,
6099 arch: {
6100 arm64: {
6101 src: "myapex-arm64.apex",
6102 },
6103 arm: {
6104 src: "myapex-arm.apex",
6105 },
6106 },
6107 }
6108
6109 apex_set {
6110 name: "myapex_set",
6111 set: "myapex.apks",
6112 filename: "myapex_set.apex",
6113 overrides: ["myapex"],
6114 }
6115 `)
6116
6117 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6118 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6119 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 +09006120 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 +09006121}
6122
Jooyung Han938b5932020-06-20 12:47:47 +09006123func TestAllowedFiles(t *testing.T) {
6124 ctx, _ := testApex(t, `
6125 apex {
6126 name: "myapex",
6127 key: "myapex.key",
6128 apps: ["app"],
6129 allowed_files: "allowed.txt",
6130 }
6131
6132 apex_key {
6133 name: "myapex.key",
6134 public_key: "testkey.avbpubkey",
6135 private_key: "testkey.pem",
6136 }
6137
6138 android_app {
6139 name: "app",
6140 srcs: ["foo/bar/MyClass.java"],
6141 package_name: "foo",
6142 sdk_version: "none",
6143 system_modules: "none",
6144 apex_available: [ "myapex" ],
6145 }
6146 `, withFiles(map[string][]byte{
6147 "sub/Android.bp": []byte(`
6148 override_apex {
6149 name: "override_myapex",
6150 base: "myapex",
6151 apps: ["override_app"],
6152 allowed_files: ":allowed",
6153 }
6154 // Overridable "path" property should be referenced indirectly
6155 filegroup {
6156 name: "allowed",
6157 srcs: ["allowed.txt"],
6158 }
6159 override_android_app {
6160 name: "override_app",
6161 base: "app",
6162 package_name: "bar",
6163 }
6164 `),
6165 }))
6166
6167 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6168 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6169 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6170 }
6171
6172 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6173 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6174 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6175 }
6176}
6177
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006178func TestNonPreferredPrebuiltDependency(t *testing.T) {
6179 _, _ = testApex(t, `
6180 apex {
6181 name: "myapex",
6182 key: "myapex.key",
6183 native_shared_libs: ["mylib"],
6184 }
6185
6186 apex_key {
6187 name: "myapex.key",
6188 public_key: "testkey.avbpubkey",
6189 private_key: "testkey.pem",
6190 }
6191
6192 cc_library {
6193 name: "mylib",
6194 srcs: ["mylib.cpp"],
6195 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006196 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006197 },
6198 apex_available: ["myapex"],
6199 }
6200
6201 cc_prebuilt_library_shared {
6202 name: "mylib",
6203 prefer: false,
6204 srcs: ["prebuilt.so"],
6205 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006206 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006207 },
6208 apex_available: ["myapex"],
6209 }
6210 `)
6211}
6212
Martin Stjernholm2856c662020-12-02 15:03:42 +00006213func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
6214 ctx, config := testApex(t, `
6215 apex {
6216 name: "myapex",
6217 key: "myapex.key",
6218 native_shared_libs: ["mylib"],
6219 }
6220
6221 apex_key {
6222 name: "myapex.key",
6223 public_key: "testkey.avbpubkey",
6224 private_key: "testkey.pem",
6225 }
6226
6227 cc_library {
6228 name: "mylib",
6229 srcs: ["mylib.cpp"],
6230 apex_available: ["myapex"],
6231 shared_libs: ["otherlib"],
6232 system_shared_libs: [],
6233 }
6234
6235 cc_library {
6236 name: "otherlib",
6237 srcs: ["mylib.cpp"],
6238 stubs: {
6239 versions: ["current"],
6240 },
6241 }
6242
6243 cc_prebuilt_library_shared {
6244 name: "otherlib",
6245 prefer: true,
6246 srcs: ["prebuilt.so"],
6247 stubs: {
6248 versions: ["current"],
6249 },
6250 }
6251 `)
6252
6253 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6254 data := android.AndroidMkDataForTest(t, config, "", ab)
6255 var builder strings.Builder
6256 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6257 androidMk := builder.String()
6258
6259 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
6260 // a thing there.
6261 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
6262}
6263
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006264func TestMain(m *testing.M) {
6265 run := func() int {
6266 setUp()
6267 defer tearDown()
6268
6269 return m.Run()
6270 }
6271
6272 os.Exit(run())
6273}