blob: e8178e4aefd4a1ef7783a2289f98740fe039090b [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Park25fc6a92018-11-18 18:02:45 +090018 "io/ioutil"
19 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090024 "strings"
25 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090026
27 "github.com/google/blueprint/proptools"
28
29 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080030 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000032 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070033 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090034 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090035 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070036 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090037)
38
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070039var buildDir string
40
Jooyung Hand3639552019-08-09 12:57:43 +090041// names returns name list from white space separated string
42func names(s string) (ns []string) {
43 for _, n := range strings.Split(s, " ") {
44 if len(n) > 0 {
45 ns = append(ns, n)
46 }
47 }
48 return
49}
50
Jooyung Han344d5432019-08-23 11:17:39 +090051func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
52 t.Helper()
53 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090054 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
55 if len(errs) > 0 {
56 android.FailIfNoMatchingErrors(t, pattern, errs)
57 return
58 }
59 _, errs = ctx.PrepareBuildActions(config)
60 if len(errs) > 0 {
61 android.FailIfNoMatchingErrors(t, pattern, errs)
62 return
63 }
64
65 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
66}
67
Jooyung Han344d5432019-08-23 11:17:39 +090068func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
69 t.Helper()
70 ctx, config := testApexContext(t, bp, handlers...)
Paul Duffineedc5d52020-06-12 17:46:39 +010071 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090072 android.FailIfErrored(t, errs)
73 _, errs = ctx.PrepareBuildActions(config)
74 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070075 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090076}
77
Jooyung Han344d5432019-08-23 11:17:39 +090078type testCustomizer func(fs map[string][]byte, config android.Config)
79
80func withFiles(files map[string][]byte) testCustomizer {
81 return func(fs map[string][]byte, config android.Config) {
82 for k, v := range files {
83 fs[k] = v
84 }
85 }
86}
87
88func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
89 return func(fs map[string][]byte, config android.Config) {
90 for k, v := range targets {
91 config.Targets[k] = v
92 }
93 }
94}
95
Jooyung Han35155c42020-02-06 17:33:20 +090096// withNativeBridgeTargets sets configuration with targets including:
97// - X86_64 (primary)
98// - X86 (secondary)
99// - Arm64 on X86_64 (native bridge)
100// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700101func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900102 config.Targets[android.Android] = []android.Target{
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
106 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
109 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
110 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
111 }
112}
113
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900114func withManifestPackageNameOverrides(specs []string) testCustomizer {
115 return func(fs map[string][]byte, config android.Config) {
116 config.TestProductVariables.ManifestPackageNameOverrides = specs
117 }
118}
119
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700120func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900121 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
122}
123
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700124func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900125 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
126}
127
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700128func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900129 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900130 filegroup {
131 name: "myapex-file_contexts",
132 srcs: [
133 "system/sepolicy/apex/myapex-file_contexts",
134 ],
135 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900136 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800137
Colin Crossf9aabd72020-02-15 11:29:50 -0800138 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
139
Jiyong Park99644e92020-11-17 22:21:02 +0900140 bp = bp + rust.GatherRequiredDepsForTest()
141
Dario Frenicde2a032019-10-27 00:29:22 +0100142 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900143
Jooyung Han344d5432019-08-23 11:17:39 +0900144 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900145 "a.java": nil,
146 "PrebuiltAppFoo.apk": nil,
147 "PrebuiltAppFooPriv.apk": nil,
148 "build/make/target/product/security": nil,
149 "apex_manifest.json": nil,
150 "AndroidManifest.xml": nil,
151 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900152 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900153 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900154 "system/sepolicy/apex/otherapex-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900155 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800156 "mylib.cpp": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800157 "mytest.cpp": nil,
158 "mytest1.cpp": nil,
159 "mytest2.cpp": nil,
160 "mytest3.cpp": nil,
161 "myprebuilt": nil,
162 "my_include": nil,
163 "foo/bar/MyClass.java": nil,
164 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100165 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800166 "vendor/foo/devkeys/test.x509.pem": nil,
167 "vendor/foo/devkeys/test.pk8": nil,
168 "testkey.x509.pem": nil,
169 "testkey.pk8": nil,
170 "testkey.override.x509.pem": nil,
171 "testkey.override.pk8": nil,
172 "vendor/foo/devkeys/testkey.avbpubkey": nil,
173 "vendor/foo/devkeys/testkey.pem": nil,
174 "NOTICE": nil,
175 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900176 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800177 "testkey2.avbpubkey": nil,
178 "testkey2.pem": nil,
179 "myapex-arm64.apex": nil,
180 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700181 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800182 "frameworks/base/api/current.txt": nil,
183 "framework/aidl/a.aidl": nil,
184 "build/make/core/proguard.flags": nil,
185 "build/make/core/proguard_basic_keeps.flags": nil,
186 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700187 "baz": nil,
188 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700189 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700190 "AppSet.apks": nil,
Jiyong Park99644e92020-11-17 22:21:02 +0900191 "foo.rs": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900192 }
193
Colin Crossf9aabd72020-02-15 11:29:50 -0800194 cc.GatherRequiredFilesForTest(fs)
195
Jooyung Han344d5432019-08-23 11:17:39 +0900196 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800197 // The fs now needs to be populated before creating the config, call handlers twice
198 // for now, once to get any fs changes, and later after the config was created to
199 // set product variables or targets.
200 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
201 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900202 }
203
Colin Cross98be1bb2019-12-13 20:41:13 -0800204 config := android.TestArchConfig(buildDir, nil, bp, fs)
205 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
206 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
207 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
208 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
209 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Dan Albert4f378d72020-07-23 17:32:15 -0700210 config.TestProductVariables.Platform_version_active_codenames = []string{"Q"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800211 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
212
213 for _, handler := range handlers {
214 // The fs now needs to be populated before creating the config, call handlers twice
215 // for now, earlier to get any fs changes, and now after the config was created to
216 // set product variables or targets.
217 tempFS := map[string][]byte{}
218 handler(tempFS, config)
219 }
220
Colin Crossae8600b2020-10-29 17:09:13 -0700221 ctx := android.NewTestArchContext(config)
Paul Duffineedc5d52020-06-12 17:46:39 +0100222
223 // from android package
224 android.RegisterPackageBuildComponents(ctx)
225 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
226
Colin Cross98be1bb2019-12-13 20:41:13 -0800227 ctx.RegisterModuleType("apex", BundleFactory)
228 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
229 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
230 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
231 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
232 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
233 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700234 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800235
Jooyung Hana57af4a2020-01-23 05:36:59 +0000236 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +0100237 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000238 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
239
Paul Duffin021f4e52020-07-30 16:04:17 +0100240 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100241
Paul Duffin021f4e52020-07-30 16:04:17 +0100242 // Register these after the prebuilt mutators have been registered to match what
243 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100244 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
245 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
246
Paul Duffin021f4e52020-07-30 16:04:17 +0100247 cc.RegisterRequiredBuildComponentsForTest(ctx)
Jiyong Park99644e92020-11-17 22:21:02 +0900248 rust.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffin021f4e52020-07-30 16:04:17 +0100249
Colin Cross98be1bb2019-12-13 20:41:13 -0800250 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800251 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
252 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jooyung Han0703fd82020-08-26 22:11:53 +0900253 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000254 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700255 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800256 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000257 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000258 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000259 java.RegisterAppBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100260 java.RegisterSdkLibraryBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900261 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800262 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800263
Colin Cross98be1bb2019-12-13 20:41:13 -0800264 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800265 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800266
Colin Crossae8600b2020-10-29 17:09:13 -0700267 ctx.Register()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900268
Jooyung Han5c998b92019-06-27 11:30:33 +0900269 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900270}
271
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700272func setUp() {
273 var err error
274 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900275 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700276 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900278}
279
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700280func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700281 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282}
283
Jooyung Han643adc42020-02-27 13:50:06 +0900284// ensure that 'result' equals 'expected'
285func ensureEquals(t *testing.T, result string, expected string) {
286 t.Helper()
287 if result != expected {
288 t.Errorf("%q != %q", expected, result)
289 }
290}
291
Jiyong Park25fc6a92018-11-18 18:02:45 +0900292// ensure that 'result' contains 'expected'
293func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900294 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900295 if !strings.Contains(result, expected) {
296 t.Errorf("%q is not found in %q", expected, result)
297 }
298}
299
Liz Kammer5bd365f2020-05-27 15:15:11 -0700300// ensure that 'result' contains 'expected' exactly one time
301func ensureContainsOnce(t *testing.T, result string, expected string) {
302 t.Helper()
303 count := strings.Count(result, expected)
304 if count != 1 {
305 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
306 }
307}
308
Jiyong Park25fc6a92018-11-18 18:02:45 +0900309// ensures that 'result' does not contain 'notExpected'
310func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900311 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900312 if strings.Contains(result, notExpected) {
313 t.Errorf("%q is found in %q", notExpected, result)
314 }
315}
316
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700317func ensureMatches(t *testing.T, result string, expectedRex string) {
318 ok, err := regexp.MatchString(expectedRex, result)
319 if err != nil {
320 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
321 return
322 }
323 if !ok {
324 t.Errorf("%s does not match regular expession %s", result, expectedRex)
325 }
326}
327
Jiyong Park25fc6a92018-11-18 18:02:45 +0900328func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900329 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 if !android.InList(expected, result) {
331 t.Errorf("%q is not found in %v", expected, result)
332 }
333}
334
335func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900336 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900337 if android.InList(notExpected, result) {
338 t.Errorf("%q is found in %v", notExpected, result)
339 }
340}
341
Jooyung Hane1633032019-08-01 17:41:43 +0900342func ensureListEmpty(t *testing.T, result []string) {
343 t.Helper()
344 if len(result) > 0 {
345 t.Errorf("%q is expected to be empty", result)
346 }
347}
348
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000349func ensureListNotEmpty(t *testing.T, result []string) {
350 t.Helper()
351 if len(result) == 0 {
352 t.Errorf("%q is expected to be not empty", result)
353 }
354}
355
Jiyong Park25fc6a92018-11-18 18:02:45 +0900356// Minimal test
357func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900358 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900359 apex_defaults {
360 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900361 manifest: ":myapex.manifest",
362 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900363 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900364 binaries: ["foo.rust"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900365 native_shared_libs: ["mylib"],
Jiyong Park99644e92020-11-17 22:21:02 +0900366 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800367 multilib: {
368 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900369 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800370 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900371 },
Jiyong Park77acec62020-06-01 21:39:15 +0900372 java_libs: [
373 "myjar",
374 "myjar_dex",
375 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900376 }
377
Jiyong Park30ca9372019-02-07 16:27:23 +0900378 apex {
379 name: "myapex",
380 defaults: ["myapex-defaults"],
381 }
382
Jiyong Park25fc6a92018-11-18 18:02:45 +0900383 apex_key {
384 name: "myapex.key",
385 public_key: "testkey.avbpubkey",
386 private_key: "testkey.pem",
387 }
388
Jiyong Park809bb722019-02-13 21:33:49 +0900389 filegroup {
390 name: "myapex.manifest",
391 srcs: ["apex_manifest.json"],
392 }
393
394 filegroup {
395 name: "myapex.androidmanifest",
396 srcs: ["AndroidManifest.xml"],
397 }
398
Jiyong Park25fc6a92018-11-18 18:02:45 +0900399 cc_library {
400 name: "mylib",
401 srcs: ["mylib.cpp"],
402 shared_libs: ["mylib2"],
403 system_shared_libs: [],
404 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000405 // TODO: remove //apex_available:platform
406 apex_available: [
407 "//apex_available:platform",
408 "myapex",
409 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900410 }
411
Alex Light3d673592019-01-18 14:37:31 -0800412 cc_binary {
413 name: "foo",
414 srcs: ["mylib.cpp"],
415 compile_multilib: "both",
416 multilib: {
417 lib32: {
418 suffix: "32",
419 },
420 lib64: {
421 suffix: "64",
422 },
423 },
424 symlinks: ["foo_link_"],
425 symlink_preferred_arch: true,
426 system_shared_libs: [],
427 static_executable: true,
428 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700429 apex_available: [ "myapex", "com.android.gki.*" ],
430 }
431
Jiyong Park99644e92020-11-17 22:21:02 +0900432 rust_binary {
433 name: "foo.rust",
434 srcs: ["foo.rs"],
435 rlibs: ["libfoo.rlib.rust"],
436 dylibs: ["libfoo.dylib.rust"],
437 apex_available: ["myapex"],
438 }
439
440 rust_library_rlib {
441 name: "libfoo.rlib.rust",
442 srcs: ["foo.rs"],
443 crate_name: "foo",
444 apex_available: ["myapex"],
445 }
446
447 rust_library_dylib {
448 name: "libfoo.dylib.rust",
449 srcs: ["foo.rs"],
450 crate_name: "foo",
451 apex_available: ["myapex"],
452 }
453
Yifan Hongd22a84a2020-07-28 17:37:46 -0700454 apex {
455 name: "com.android.gki.fake",
456 binaries: ["foo"],
457 key: "myapex.key",
458 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800459 }
460
Paul Duffindddd5462020-04-07 15:25:44 +0100461 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900462 name: "mylib2",
463 srcs: ["mylib.cpp"],
464 system_shared_libs: [],
465 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900466 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900467 static_libs: ["libstatic"],
468 // TODO: remove //apex_available:platform
469 apex_available: [
470 "//apex_available:platform",
471 "myapex",
472 ],
473 }
474
Paul Duffindddd5462020-04-07 15:25:44 +0100475 cc_prebuilt_library_shared {
476 name: "mylib2",
477 srcs: ["prebuilt.so"],
478 // TODO: remove //apex_available:platform
479 apex_available: [
480 "//apex_available:platform",
481 "myapex",
482 ],
483 }
484
Jiyong Park9918e1a2020-03-17 19:16:40 +0900485 cc_library_static {
486 name: "libstatic",
487 srcs: ["mylib.cpp"],
488 system_shared_libs: [],
489 stl: "none",
490 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000491 // TODO: remove //apex_available:platform
492 apex_available: [
493 "//apex_available:platform",
494 "myapex",
495 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900496 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900497
498 java_library {
499 name: "myjar",
500 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900501 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900502 sdk_version: "none",
503 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900504 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900505 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000506 // TODO: remove //apex_available:platform
507 apex_available: [
508 "//apex_available:platform",
509 "myapex",
510 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900511 }
512
Jiyong Park77acec62020-06-01 21:39:15 +0900513 dex_import {
514 name: "myjar_dex",
515 jars: ["prebuilt.jar"],
516 apex_available: [
517 "//apex_available:platform",
518 "myapex",
519 ],
520 }
521
Jiyong Park7f7766d2019-07-25 22:02:35 +0900522 java_library {
523 name: "myotherjar",
524 srcs: ["foo/bar/MyClass.java"],
525 sdk_version: "none",
526 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900527 // TODO: remove //apex_available:platform
528 apex_available: [
529 "//apex_available:platform",
530 "myapex",
531 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900532 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900533
534 java_library {
535 name: "mysharedjar",
536 srcs: ["foo/bar/MyClass.java"],
537 sdk_version: "none",
538 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900539 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900540 `)
541
Sundong Ahnabb64432019-10-22 13:58:29 +0900542 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900543
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900544 // Make sure that Android.mk is created
545 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
546 data := android.AndroidMkDataForTest(t, config, "", ab)
547 var builder strings.Builder
548 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
549
550 androidMk := builder.String()
551 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
552 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
553
Jiyong Park42cca6c2019-04-01 11:15:50 +0900554 optFlags := apexRule.Args["opt_flags"]
555 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700556 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900557 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900558
Jiyong Park25fc6a92018-11-18 18:02:45 +0900559 copyCmds := apexRule.Args["copy_commands"]
560
561 // Ensure that main rule creates an output
562 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
563
564 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700565 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
566 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
567 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900568 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900569
570 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700571 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
572 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900573 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
574 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900575
576 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800577 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
578 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900579 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900580 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900581 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900582 // .. but not for java libs
583 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900584 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800585
Colin Cross7113d202019-11-20 16:39:12 -0800586 // Ensure that the platform variant ends with _shared or _common
587 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
588 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900589 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
590 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900591 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
592
593 // Ensure that dynamic dependency to java libs are not included
594 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800595
596 // Ensure that all symlinks are present.
597 found_foo_link_64 := false
598 found_foo := false
599 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900600 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800601 if strings.HasSuffix(cmd, "bin/foo") {
602 found_foo = true
603 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
604 found_foo_link_64 = true
605 }
606 }
607 }
608 good := found_foo && found_foo_link_64
609 if !good {
610 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
611 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900612
Sundong Ahnabb64432019-10-22 13:58:29 +0900613 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700614 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900615 if len(noticeInputs) != 3 {
616 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900617 }
618 ensureListContains(t, noticeInputs, "NOTICE")
619 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900620 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900621
Artur Satayeva8bd1132020-04-27 18:07:06 +0100622 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100623 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
624 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
625 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
626 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
627 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100628
629 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100630 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
631 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
632 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
633 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
634 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800635}
636
Jooyung Hanf21c7972019-12-16 22:32:06 +0900637func TestDefaults(t *testing.T) {
638 ctx, _ := testApex(t, `
639 apex_defaults {
640 name: "myapex-defaults",
641 key: "myapex.key",
642 prebuilts: ["myetc"],
643 native_shared_libs: ["mylib"],
644 java_libs: ["myjar"],
645 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900646 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800647 bpfs: ["bpf"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900648 }
649
650 prebuilt_etc {
651 name: "myetc",
652 src: "myprebuilt",
653 }
654
655 apex {
656 name: "myapex",
657 defaults: ["myapex-defaults"],
658 }
659
660 apex_key {
661 name: "myapex.key",
662 public_key: "testkey.avbpubkey",
663 private_key: "testkey.pem",
664 }
665
666 cc_library {
667 name: "mylib",
668 system_shared_libs: [],
669 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000670 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900671 }
672
673 java_library {
674 name: "myjar",
675 srcs: ["foo/bar/MyClass.java"],
676 sdk_version: "none",
677 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000678 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900679 }
680
681 android_app {
682 name: "AppFoo",
683 srcs: ["foo/bar/MyClass.java"],
684 sdk_version: "none",
685 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000686 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900687 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900688
689 runtime_resource_overlay {
690 name: "rro",
691 theme: "blue",
692 }
693
markchien2f59ec92020-09-02 16:23:38 +0800694 bpf {
695 name: "bpf",
696 srcs: ["bpf.c", "bpf2.c"],
697 }
698
Jooyung Hanf21c7972019-12-16 22:32:06 +0900699 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000700 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900701 "etc/myetc",
702 "javalib/myjar.jar",
703 "lib64/mylib.so",
704 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900705 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800706 "etc/bpf/bpf.o",
707 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900708 })
709}
710
Jooyung Han01a3ee22019-11-02 02:52:25 +0900711func TestApexManifest(t *testing.T) {
712 ctx, _ := testApex(t, `
713 apex {
714 name: "myapex",
715 key: "myapex.key",
716 }
717
718 apex_key {
719 name: "myapex.key",
720 public_key: "testkey.avbpubkey",
721 private_key: "testkey.pem",
722 }
723 `)
724
725 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900726 args := module.Rule("apexRule").Args
727 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
728 t.Error("manifest should be apex_manifest.pb, but " + manifest)
729 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900730}
731
Alex Light5098a612018-11-29 17:12:15 -0800732func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700733 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800734 apex {
735 name: "myapex",
736 key: "myapex.key",
737 payload_type: "zip",
738 native_shared_libs: ["mylib"],
739 }
740
741 apex_key {
742 name: "myapex.key",
743 public_key: "testkey.avbpubkey",
744 private_key: "testkey.pem",
745 }
746
747 cc_library {
748 name: "mylib",
749 srcs: ["mylib.cpp"],
750 shared_libs: ["mylib2"],
751 system_shared_libs: [],
752 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000753 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800754 }
755
756 cc_library {
757 name: "mylib2",
758 srcs: ["mylib.cpp"],
759 system_shared_libs: [],
760 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000761 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800762 }
763 `)
764
Sundong Ahnabb64432019-10-22 13:58:29 +0900765 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800766 copyCmds := zipApexRule.Args["copy_commands"]
767
768 // Ensure that main rule creates an output
769 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
770
771 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700772 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800773
774 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700775 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800776
777 // Ensure that both direct and indirect deps are copied into apex
778 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
779 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900780}
781
782func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700783 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900784 apex {
785 name: "myapex",
786 key: "myapex.key",
787 native_shared_libs: ["mylib", "mylib3"],
788 }
789
790 apex_key {
791 name: "myapex.key",
792 public_key: "testkey.avbpubkey",
793 private_key: "testkey.pem",
794 }
795
796 cc_library {
797 name: "mylib",
798 srcs: ["mylib.cpp"],
799 shared_libs: ["mylib2", "mylib3"],
800 system_shared_libs: [],
801 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000802 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900803 }
804
805 cc_library {
806 name: "mylib2",
807 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900808 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900809 system_shared_libs: [],
810 stl: "none",
811 stubs: {
812 versions: ["1", "2", "3"],
813 },
814 }
815
816 cc_library {
817 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900818 srcs: ["mylib.cpp"],
819 shared_libs: ["mylib4"],
820 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900821 stl: "none",
822 stubs: {
823 versions: ["10", "11", "12"],
824 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000825 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900826 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900827
828 cc_library {
829 name: "mylib4",
830 srcs: ["mylib.cpp"],
831 system_shared_libs: [],
832 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000833 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900834 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900835 `)
836
Sundong Ahnabb64432019-10-22 13:58:29 +0900837 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900838 copyCmds := apexRule.Args["copy_commands"]
839
840 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800841 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900842
843 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800844 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900845
846 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800847 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900848
Colin Crossaede88c2020-08-11 12:17:01 -0700849 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900850
851 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900852 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900853 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900854 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900855
856 // 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 -0700857 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900858 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700859 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900860
861 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900862 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900863 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900864
865 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700866 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900867
Jooyung Hana57af4a2020-01-23 05:36:59 +0000868 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900869 "lib64/mylib.so",
870 "lib64/mylib3.so",
871 "lib64/mylib4.so",
872 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900873}
874
Colin Cross7812fd32020-09-25 12:35:10 -0700875func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
876 t.Parallel()
877 ctx, _ := testApex(t, `
878 apex {
879 name: "myapex",
880 key: "myapex.key",
881 native_shared_libs: ["mylib", "mylib3"],
882 min_sdk_version: "29",
883 }
884
885 apex_key {
886 name: "myapex.key",
887 public_key: "testkey.avbpubkey",
888 private_key: "testkey.pem",
889 }
890
891 cc_library {
892 name: "mylib",
893 srcs: ["mylib.cpp"],
894 shared_libs: ["mylib2", "mylib3"],
895 system_shared_libs: [],
896 stl: "none",
897 apex_available: [ "myapex" ],
898 min_sdk_version: "28",
899 }
900
901 cc_library {
902 name: "mylib2",
903 srcs: ["mylib.cpp"],
904 cflags: ["-include mylib.h"],
905 system_shared_libs: [],
906 stl: "none",
907 stubs: {
908 versions: ["28", "29", "30", "current"],
909 },
910 min_sdk_version: "28",
911 }
912
913 cc_library {
914 name: "mylib3",
915 srcs: ["mylib.cpp"],
916 shared_libs: ["mylib4"],
917 system_shared_libs: [],
918 stl: "none",
919 stubs: {
920 versions: ["28", "29", "30", "current"],
921 },
922 apex_available: [ "myapex" ],
923 min_sdk_version: "28",
924 }
925
926 cc_library {
927 name: "mylib4",
928 srcs: ["mylib.cpp"],
929 system_shared_libs: [],
930 stl: "none",
931 apex_available: [ "myapex" ],
932 min_sdk_version: "28",
933 }
934 `)
935
936 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
937 copyCmds := apexRule.Args["copy_commands"]
938
939 // Ensure that direct non-stubs dep is always included
940 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
941
942 // Ensure that indirect stubs dep is not included
943 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
944
945 // Ensure that direct stubs dep is included
946 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
947
948 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
949
950 // Ensure that mylib is linking with the version 29 stubs for mylib2
951 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_29/mylib2.so")
952 // ... and not linking to the non-stub (impl) variant of mylib2
953 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
954
955 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
956 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
957 // .. and not linking to the stubs variant of mylib3
958 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
959
960 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700961 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700962 ensureNotContains(t, mylib2Cflags, "-include ")
963
964 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700965 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -0700966
967 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
968 "lib64/mylib.so",
969 "lib64/mylib3.so",
970 "lib64/mylib4.so",
971 })
972}
973
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900974func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700975 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900976 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900977 name: "myapex2",
978 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900979 native_shared_libs: ["mylib"],
980 }
981
982 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900983 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900984 public_key: "testkey.avbpubkey",
985 private_key: "testkey.pem",
986 }
987
988 cc_library {
989 name: "mylib",
990 srcs: ["mylib.cpp"],
991 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900992 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900993 system_shared_libs: [],
994 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000995 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900996 }
997
998 cc_library {
999 name: "libfoo",
1000 srcs: ["mylib.cpp"],
1001 shared_libs: ["libbar"],
1002 system_shared_libs: [],
1003 stl: "none",
1004 stubs: {
1005 versions: ["10", "20", "30"],
1006 },
1007 }
1008
1009 cc_library {
1010 name: "libbar",
1011 srcs: ["mylib.cpp"],
1012 system_shared_libs: [],
1013 stl: "none",
1014 }
1015
Jiyong Park678c8812020-02-07 17:25:49 +09001016 cc_library_static {
1017 name: "libbaz",
1018 srcs: ["mylib.cpp"],
1019 system_shared_libs: [],
1020 stl: "none",
1021 apex_available: [ "myapex2" ],
1022 }
1023
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001024 `)
1025
Jiyong Park83dc74b2020-01-14 18:38:44 +09001026 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001027 copyCmds := apexRule.Args["copy_commands"]
1028
1029 // Ensure that direct non-stubs dep is always included
1030 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1031
1032 // Ensure that indirect stubs dep is not included
1033 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1034
1035 // Ensure that dependency of stubs is not included
1036 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1037
Colin Crossaede88c2020-08-11 12:17:01 -07001038 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001039
1040 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001041 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001042 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001043 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001044
Jiyong Park3ff16992019-12-27 14:11:47 +09001045 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001046
1047 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1048 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001049
Artur Satayeva8bd1132020-04-27 18:07:06 +01001050 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001051 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2")
1052 ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib")
1053 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001054
Artur Satayeva8bd1132020-04-27 18:07:06 +01001055 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001056 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
1057 ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))")
1058 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001059}
1060
Jooyung Hand3639552019-08-09 12:57:43 +09001061func TestApexWithRuntimeLibsDependency(t *testing.T) {
1062 /*
1063 myapex
1064 |
1065 v (runtime_libs)
1066 mylib ------+------> libfoo [provides stub]
1067 |
1068 `------> libbar
1069 */
1070 ctx, _ := testApex(t, `
1071 apex {
1072 name: "myapex",
1073 key: "myapex.key",
1074 native_shared_libs: ["mylib"],
1075 }
1076
1077 apex_key {
1078 name: "myapex.key",
1079 public_key: "testkey.avbpubkey",
1080 private_key: "testkey.pem",
1081 }
1082
1083 cc_library {
1084 name: "mylib",
1085 srcs: ["mylib.cpp"],
1086 runtime_libs: ["libfoo", "libbar"],
1087 system_shared_libs: [],
1088 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001089 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001090 }
1091
1092 cc_library {
1093 name: "libfoo",
1094 srcs: ["mylib.cpp"],
1095 system_shared_libs: [],
1096 stl: "none",
1097 stubs: {
1098 versions: ["10", "20", "30"],
1099 },
1100 }
1101
1102 cc_library {
1103 name: "libbar",
1104 srcs: ["mylib.cpp"],
1105 system_shared_libs: [],
1106 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001107 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001108 }
1109
1110 `)
1111
Sundong Ahnabb64432019-10-22 13:58:29 +09001112 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001113 copyCmds := apexRule.Args["copy_commands"]
1114
1115 // Ensure that direct non-stubs dep is always included
1116 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1117
1118 // Ensure that indirect stubs dep is not included
1119 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1120
1121 // Ensure that runtime_libs dep in included
1122 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1123
Sundong Ahnabb64432019-10-22 13:58:29 +09001124 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001125 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1126 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001127
1128}
1129
Jooyung Han8ce8db92020-05-15 19:05:05 +09001130func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1131 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1132 bp := `
1133 apex {
1134 name: "com.android.runtime",
1135 key: "com.android.runtime.key",
1136 native_shared_libs: ["libc"],
1137 }
1138
1139 apex_key {
1140 name: "com.android.runtime.key",
1141 public_key: "testkey.avbpubkey",
1142 private_key: "testkey.pem",
1143 }
1144
1145 cc_library {
1146 name: "libc",
1147 no_libcrt: true,
1148 nocrt: true,
1149 stl: "none",
1150 system_shared_libs: [],
1151 stubs: { versions: ["1"] },
1152 apex_available: ["com.android.runtime"],
1153
1154 sanitize: {
1155 hwaddress: true,
1156 }
1157 }
1158
1159 cc_prebuilt_library_shared {
1160 name: "libclang_rt.hwasan-aarch64-android",
1161 no_libcrt: true,
1162 nocrt: true,
1163 stl: "none",
1164 system_shared_libs: [],
1165 srcs: [""],
1166 stubs: { versions: ["1"] },
1167
1168 sanitize: {
1169 never: true,
1170 },
1171 }
1172 `
1173 // override bp to use hard-coded names: com.android.runtime and libc
1174 fs["Android.bp"] = []byte(bp)
1175 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1176 })
1177
1178 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1179 "lib64/bionic/libc.so",
1180 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1181 })
1182
1183 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1184
1185 installed := hwasan.Description("install libclang_rt.hwasan")
1186 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1187
1188 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1189 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1190 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1191}
1192
1193func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1194 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1195 bp := `
1196 apex {
1197 name: "com.android.runtime",
1198 key: "com.android.runtime.key",
1199 native_shared_libs: ["libc"],
1200 }
1201
1202 apex_key {
1203 name: "com.android.runtime.key",
1204 public_key: "testkey.avbpubkey",
1205 private_key: "testkey.pem",
1206 }
1207
1208 cc_library {
1209 name: "libc",
1210 no_libcrt: true,
1211 nocrt: true,
1212 stl: "none",
1213 system_shared_libs: [],
1214 stubs: { versions: ["1"] },
1215 apex_available: ["com.android.runtime"],
1216 }
1217
1218 cc_prebuilt_library_shared {
1219 name: "libclang_rt.hwasan-aarch64-android",
1220 no_libcrt: true,
1221 nocrt: true,
1222 stl: "none",
1223 system_shared_libs: [],
1224 srcs: [""],
1225 stubs: { versions: ["1"] },
1226
1227 sanitize: {
1228 never: true,
1229 },
1230 }
1231 `
1232 // override bp to use hard-coded names: com.android.runtime and libc
1233 fs["Android.bp"] = []byte(bp)
1234 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1235
1236 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1237 })
1238
1239 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1240 "lib64/bionic/libc.so",
1241 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1242 })
1243
1244 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1245
1246 installed := hwasan.Description("install libclang_rt.hwasan")
1247 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1248
1249 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1250 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1251 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1252}
1253
Jooyung Han61b66e92020-03-21 14:21:46 +00001254func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1255 testcases := []struct {
1256 name string
1257 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001258 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001259 shouldLink string
1260 shouldNotLink []string
1261 }{
1262 {
Jooyung Han75568392020-03-20 04:29:24 +09001263 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001264 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001265 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001266 shouldLink: "30",
1267 shouldNotLink: []string{"29"},
1268 },
1269 {
1270 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001271 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001272 apexVariant: "apex29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001273 shouldLink: "29",
1274 shouldNotLink: []string{"30"},
1275 },
1276 }
1277 for _, tc := range testcases {
1278 t.Run(tc.name, func(t *testing.T) {
1279 ctx, _ := testApex(t, `
1280 apex {
1281 name: "myapex",
1282 key: "myapex.key",
1283 use_vendor: true,
1284 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001285 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001286 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001287
Jooyung Han61b66e92020-03-21 14:21:46 +00001288 apex_key {
1289 name: "myapex.key",
1290 public_key: "testkey.avbpubkey",
1291 private_key: "testkey.pem",
1292 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001293
Jooyung Han61b66e92020-03-21 14:21:46 +00001294 cc_library {
1295 name: "mylib",
1296 srcs: ["mylib.cpp"],
1297 vendor_available: true,
1298 shared_libs: ["libbar"],
1299 system_shared_libs: [],
1300 stl: "none",
1301 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001302 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001303 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001304
Jooyung Han61b66e92020-03-21 14:21:46 +00001305 cc_library {
1306 name: "libbar",
1307 srcs: ["mylib.cpp"],
1308 system_shared_libs: [],
1309 stl: "none",
1310 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001311 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001312 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001313
Jooyung Han61b66e92020-03-21 14:21:46 +00001314 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001315 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001316 symbol_file: "",
1317 }
1318 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001319 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001320 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001321
Jooyung Han61b66e92020-03-21 14:21:46 +00001322 // Ensure that LLNDK dep is not included
1323 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1324 "lib64/mylib.so",
1325 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001326
Jooyung Han61b66e92020-03-21 14:21:46 +00001327 // Ensure that LLNDK dep is required
1328 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1329 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1330 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001331
Colin Crossaede88c2020-08-11 12:17:01 -07001332 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001333 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1334 for _, ver := range tc.shouldNotLink {
1335 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1336 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001337
Colin Crossaede88c2020-08-11 12:17:01 -07001338 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001339 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1340 })
1341 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001342}
1343
Jiyong Park25fc6a92018-11-18 18:02:45 +09001344func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001345 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001346 apex {
1347 name: "myapex",
1348 key: "myapex.key",
1349 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1350 }
1351
1352 apex_key {
1353 name: "myapex.key",
1354 public_key: "testkey.avbpubkey",
1355 private_key: "testkey.pem",
1356 }
1357
1358 cc_library {
1359 name: "mylib",
1360 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001361 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001362 shared_libs: ["libdl#27"],
1363 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001364 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001365 }
1366
1367 cc_library_shared {
1368 name: "mylib_shared",
1369 srcs: ["mylib.cpp"],
1370 shared_libs: ["libdl#27"],
1371 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001372 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001373 }
1374
1375 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001376 name: "libBootstrap",
1377 srcs: ["mylib.cpp"],
1378 stl: "none",
1379 bootstrap: true,
1380 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001381 `)
1382
Sundong Ahnabb64432019-10-22 13:58:29 +09001383 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001384 copyCmds := apexRule.Args["copy_commands"]
1385
1386 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001387 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001388 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1389 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001390
1391 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001392 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001393
Colin Crossaede88c2020-08-11 12:17:01 -07001394 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1395 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1396 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001397
1398 // For dependency to libc
1399 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001400 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001401 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001402 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001403 // ... Cflags from stub is correctly exported to mylib
1404 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1405 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1406
1407 // For dependency to libm
1408 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001409 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001410 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001411 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001412 // ... and is not compiling with the stub
1413 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1414 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1415
1416 // For dependency to libdl
1417 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001418 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001419 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001420 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1421 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001422 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001423 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001424 // ... Cflags from stub is correctly exported to mylib
1425 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1426 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001427
1428 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001429 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1430 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1431 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1432 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001433}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001434
Jooyung Han749dc692020-04-15 11:03:39 +09001435func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001436 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001437 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1438 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001439 // 3) (platform) -> liba -> libz : this should be non-stub link
1440 ctx, _ := testApex(t, `
1441 apex {
1442 name: "myapex",
1443 key: "myapex.key",
1444 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001445 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001446 }
1447
1448 apex {
1449 name: "otherapex",
1450 key: "myapex.key",
1451 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001452 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001453 }
1454
1455 apex_key {
1456 name: "myapex.key",
1457 public_key: "testkey.avbpubkey",
1458 private_key: "testkey.pem",
1459 }
1460
1461 cc_library {
1462 name: "libx",
1463 shared_libs: ["liba"],
1464 system_shared_libs: [],
1465 stl: "none",
1466 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001467 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001468 }
1469
1470 cc_library {
1471 name: "liby",
1472 shared_libs: ["liba"],
1473 system_shared_libs: [],
1474 stl: "none",
1475 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001476 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001477 }
1478
1479 cc_library {
1480 name: "liba",
1481 shared_libs: ["libz"],
1482 system_shared_libs: [],
1483 stl: "none",
1484 apex_available: [
1485 "//apex_available:anyapex",
1486 "//apex_available:platform",
1487 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001488 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001489 }
1490
1491 cc_library {
1492 name: "libz",
1493 system_shared_libs: [],
1494 stl: "none",
1495 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001496 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001497 },
1498 }
Jooyung Han749dc692020-04-15 11:03:39 +09001499 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001500
1501 expectLink := func(from, from_variant, to, to_variant string) {
1502 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1503 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1504 }
1505 expectNoLink := func(from, from_variant, to, to_variant string) {
1506 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1507 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1508 }
1509 // platform liba is linked to non-stub version
1510 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001511 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001512 expectLink("liba", "shared_apex29", "libz", "shared_28")
1513 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1514 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001515 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001516 expectLink("liba", "shared_apex30", "libz", "shared_30")
1517 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1518 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001519}
1520
Jooyung Hanaed150d2020-04-02 01:41:41 +09001521func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1522 ctx, _ := testApex(t, `
1523 apex {
1524 name: "myapex",
1525 key: "myapex.key",
1526 native_shared_libs: ["libx"],
1527 min_sdk_version: "R",
1528 }
1529
1530 apex_key {
1531 name: "myapex.key",
1532 public_key: "testkey.avbpubkey",
1533 private_key: "testkey.pem",
1534 }
1535
1536 cc_library {
1537 name: "libx",
1538 shared_libs: ["libz"],
1539 system_shared_libs: [],
1540 stl: "none",
1541 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001542 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001543 }
1544
1545 cc_library {
1546 name: "libz",
1547 system_shared_libs: [],
1548 stl: "none",
1549 stubs: {
1550 versions: ["29", "R"],
1551 },
1552 }
1553 `, func(fs map[string][]byte, config android.Config) {
1554 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1555 })
1556
1557 expectLink := func(from, from_variant, to, to_variant string) {
1558 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1559 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1560 }
1561 expectNoLink := func(from, from_variant, to, to_variant string) {
1562 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1563 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1564 }
Dan Albertc8060532020-07-22 22:32:17 -07001565 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001566 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1567 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001568}
1569
Jooyung Han749dc692020-04-15 11:03:39 +09001570func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001571 ctx, _ := testApex(t, `
1572 apex {
1573 name: "myapex",
1574 key: "myapex.key",
1575 native_shared_libs: ["libx"],
1576 }
1577
1578 apex_key {
1579 name: "myapex.key",
1580 public_key: "testkey.avbpubkey",
1581 private_key: "testkey.pem",
1582 }
1583
1584 cc_library {
1585 name: "libx",
1586 shared_libs: ["libz"],
1587 system_shared_libs: [],
1588 stl: "none",
1589 apex_available: [ "myapex" ],
1590 }
1591
1592 cc_library {
1593 name: "libz",
1594 system_shared_libs: [],
1595 stl: "none",
1596 stubs: {
1597 versions: ["1", "2"],
1598 },
1599 }
1600 `)
1601
1602 expectLink := func(from, from_variant, to, to_variant string) {
1603 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1604 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1605 }
1606 expectNoLink := func(from, from_variant, to, to_variant string) {
1607 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1608 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1609 }
Colin Crossaede88c2020-08-11 12:17:01 -07001610 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1611 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1612 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001613}
1614
1615func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1616 ctx, _ := testApex(t, `
1617 apex {
1618 name: "myapex",
1619 key: "myapex.key",
1620 native_shared_libs: ["libx"],
1621 }
1622
1623 apex_key {
1624 name: "myapex.key",
1625 public_key: "testkey.avbpubkey",
1626 private_key: "testkey.pem",
1627 }
1628
1629 cc_library {
1630 name: "libx",
1631 system_shared_libs: [],
1632 stl: "none",
1633 apex_available: [ "myapex" ],
1634 stubs: {
1635 versions: ["1", "2"],
1636 },
1637 }
1638
1639 cc_library {
1640 name: "libz",
1641 shared_libs: ["libx"],
1642 system_shared_libs: [],
1643 stl: "none",
1644 }
1645 `)
1646
1647 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001648 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001649 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1650 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1651 }
1652 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001653 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001654 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1655 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1656 }
1657 expectLink("libz", "shared", "libx", "shared_2")
1658 expectNoLink("libz", "shared", "libz", "shared_1")
1659 expectNoLink("libz", "shared", "libz", "shared")
1660}
1661
Jooyung Han75568392020-03-20 04:29:24 +09001662func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001663 ctx, _ := testApex(t, `
1664 apex {
1665 name: "myapex",
1666 key: "myapex.key",
1667 native_shared_libs: ["libx"],
1668 min_sdk_version: "29",
1669 }
1670
1671 apex_key {
1672 name: "myapex.key",
1673 public_key: "testkey.avbpubkey",
1674 private_key: "testkey.pem",
1675 }
1676
1677 cc_library {
1678 name: "libx",
1679 shared_libs: ["libbar"],
1680 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001681 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001682 }
1683
1684 cc_library {
1685 name: "libbar",
1686 stubs: {
1687 versions: ["29", "30"],
1688 },
1689 }
Jooyung Han75568392020-03-20 04:29:24 +09001690 `, func(fs map[string][]byte, config android.Config) {
1691 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1692 })
Jooyung Han03b51852020-02-26 22:45:42 +09001693 expectLink := func(from, from_variant, to, to_variant string) {
1694 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1695 libFlags := ld.Args["libFlags"]
1696 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1697 }
Colin Crossaede88c2020-08-11 12:17:01 -07001698 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001699}
1700
Jooyung Han75568392020-03-20 04:29:24 +09001701func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001702 ctx, _ := testApex(t, `
1703 apex {
1704 name: "myapex",
1705 key: "myapex.key",
1706 native_shared_libs: ["libx"],
1707 min_sdk_version: "29",
1708 }
1709
1710 apex_key {
1711 name: "myapex.key",
1712 public_key: "testkey.avbpubkey",
1713 private_key: "testkey.pem",
1714 }
1715
1716 cc_library {
1717 name: "libx",
1718 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001719 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001720 }
Jooyung Han75568392020-03-20 04:29:24 +09001721 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001722
1723 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001724 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Jooyung Han03b51852020-02-26 22:45:42 +09001725 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1726 // note that platform variant is not.
1727 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1728 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001729}
1730
Jooyung Han749dc692020-04-15 11:03:39 +09001731func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001732 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001733 apex {
1734 name: "myapex",
1735 key: "myapex.key",
1736 native_shared_libs: ["libx"],
1737 min_sdk_version: "29",
1738 }
1739
1740 apex_key {
1741 name: "myapex.key",
1742 public_key: "testkey.avbpubkey",
1743 private_key: "testkey.pem",
1744 }
1745
1746 cc_library {
1747 name: "libx",
1748 shared_libs: ["libz"],
1749 system_shared_libs: [],
1750 stl: "none",
1751 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001752 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001753 }
1754
1755 cc_library {
1756 name: "libz",
1757 system_shared_libs: [],
1758 stl: "none",
1759 stubs: {
1760 versions: ["30"],
1761 },
1762 }
Jooyung Han75568392020-03-20 04:29:24 +09001763 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001764}
Jooyung Han03b51852020-02-26 22:45:42 +09001765
Jooyung Han749dc692020-04-15 11:03:39 +09001766func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1767 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001768 apex {
1769 name: "myapex",
1770 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001771 native_shared_libs: ["mylib"],
1772 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001773 }
1774
1775 apex_key {
1776 name: "myapex.key",
1777 public_key: "testkey.avbpubkey",
1778 private_key: "testkey.pem",
1779 }
Jooyung Han749dc692020-04-15 11:03:39 +09001780
1781 cc_library {
1782 name: "mylib",
1783 srcs: ["mylib.cpp"],
1784 system_shared_libs: [],
1785 stl: "none",
1786 apex_available: [
1787 "myapex",
1788 ],
1789 min_sdk_version: "30",
1790 }
1791 `)
1792}
1793
1794func TestApexMinSdkVersion_Okay(t *testing.T) {
1795 testApex(t, `
1796 apex {
1797 name: "myapex",
1798 key: "myapex.key",
1799 native_shared_libs: ["libfoo"],
1800 java_libs: ["libbar"],
1801 min_sdk_version: "29",
1802 }
1803
1804 apex_key {
1805 name: "myapex.key",
1806 public_key: "testkey.avbpubkey",
1807 private_key: "testkey.pem",
1808 }
1809
1810 cc_library {
1811 name: "libfoo",
1812 srcs: ["mylib.cpp"],
1813 shared_libs: ["libfoo_dep"],
1814 apex_available: ["myapex"],
1815 min_sdk_version: "29",
1816 }
1817
1818 cc_library {
1819 name: "libfoo_dep",
1820 srcs: ["mylib.cpp"],
1821 apex_available: ["myapex"],
1822 min_sdk_version: "29",
1823 }
1824
1825 java_library {
1826 name: "libbar",
1827 sdk_version: "current",
1828 srcs: ["a.java"],
1829 static_libs: ["libbar_dep"],
1830 apex_available: ["myapex"],
1831 min_sdk_version: "29",
1832 }
1833
1834 java_library {
1835 name: "libbar_dep",
1836 sdk_version: "current",
1837 srcs: ["a.java"],
1838 apex_available: ["myapex"],
1839 min_sdk_version: "29",
1840 }
Jooyung Han03b51852020-02-26 22:45:42 +09001841 `)
1842}
1843
Artur Satayev8cf899a2020-04-15 17:29:42 +01001844func TestJavaStableSdkVersion(t *testing.T) {
1845 testCases := []struct {
1846 name string
1847 expectedError string
1848 bp string
1849 }{
1850 {
1851 name: "Non-updatable apex with non-stable dep",
1852 bp: `
1853 apex {
1854 name: "myapex",
1855 java_libs: ["myjar"],
1856 key: "myapex.key",
1857 }
1858 apex_key {
1859 name: "myapex.key",
1860 public_key: "testkey.avbpubkey",
1861 private_key: "testkey.pem",
1862 }
1863 java_library {
1864 name: "myjar",
1865 srcs: ["foo/bar/MyClass.java"],
1866 sdk_version: "core_platform",
1867 apex_available: ["myapex"],
1868 }
1869 `,
1870 },
1871 {
1872 name: "Updatable apex with stable dep",
1873 bp: `
1874 apex {
1875 name: "myapex",
1876 java_libs: ["myjar"],
1877 key: "myapex.key",
1878 updatable: true,
1879 min_sdk_version: "29",
1880 }
1881 apex_key {
1882 name: "myapex.key",
1883 public_key: "testkey.avbpubkey",
1884 private_key: "testkey.pem",
1885 }
1886 java_library {
1887 name: "myjar",
1888 srcs: ["foo/bar/MyClass.java"],
1889 sdk_version: "current",
1890 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001891 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001892 }
1893 `,
1894 },
1895 {
1896 name: "Updatable apex with non-stable dep",
1897 expectedError: "cannot depend on \"myjar\"",
1898 bp: `
1899 apex {
1900 name: "myapex",
1901 java_libs: ["myjar"],
1902 key: "myapex.key",
1903 updatable: true,
1904 }
1905 apex_key {
1906 name: "myapex.key",
1907 public_key: "testkey.avbpubkey",
1908 private_key: "testkey.pem",
1909 }
1910 java_library {
1911 name: "myjar",
1912 srcs: ["foo/bar/MyClass.java"],
1913 sdk_version: "core_platform",
1914 apex_available: ["myapex"],
1915 }
1916 `,
1917 },
1918 {
1919 name: "Updatable apex with non-stable transitive dep",
1920 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1921 bp: `
1922 apex {
1923 name: "myapex",
1924 java_libs: ["myjar"],
1925 key: "myapex.key",
1926 updatable: true,
1927 }
1928 apex_key {
1929 name: "myapex.key",
1930 public_key: "testkey.avbpubkey",
1931 private_key: "testkey.pem",
1932 }
1933 java_library {
1934 name: "myjar",
1935 srcs: ["foo/bar/MyClass.java"],
1936 sdk_version: "current",
1937 apex_available: ["myapex"],
1938 static_libs: ["transitive-jar"],
1939 }
1940 java_library {
1941 name: "transitive-jar",
1942 srcs: ["foo/bar/MyClass.java"],
1943 sdk_version: "core_platform",
1944 apex_available: ["myapex"],
1945 }
1946 `,
1947 },
1948 }
1949
1950 for _, test := range testCases {
1951 t.Run(test.name, func(t *testing.T) {
1952 if test.expectedError == "" {
1953 testApex(t, test.bp)
1954 } else {
1955 testApexError(t, test.expectedError, test.bp)
1956 }
1957 })
1958 }
1959}
1960
Jooyung Han749dc692020-04-15 11:03:39 +09001961func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1962 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1963 apex {
1964 name: "myapex",
1965 key: "myapex.key",
1966 native_shared_libs: ["mylib"],
1967 min_sdk_version: "29",
1968 }
1969
1970 apex_key {
1971 name: "myapex.key",
1972 public_key: "testkey.avbpubkey",
1973 private_key: "testkey.pem",
1974 }
1975
1976 cc_library {
1977 name: "mylib",
1978 srcs: ["mylib.cpp"],
1979 shared_libs: ["mylib2"],
1980 system_shared_libs: [],
1981 stl: "none",
1982 apex_available: [
1983 "myapex",
1984 ],
1985 min_sdk_version: "29",
1986 }
1987
1988 // indirect part of the apex
1989 cc_library {
1990 name: "mylib2",
1991 srcs: ["mylib.cpp"],
1992 system_shared_libs: [],
1993 stl: "none",
1994 apex_available: [
1995 "myapex",
1996 ],
1997 min_sdk_version: "30",
1998 }
1999 `)
2000}
2001
2002func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2003 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2004 apex {
2005 name: "myapex",
2006 key: "myapex.key",
2007 apps: ["AppFoo"],
2008 min_sdk_version: "29",
2009 }
2010
2011 apex_key {
2012 name: "myapex.key",
2013 public_key: "testkey.avbpubkey",
2014 private_key: "testkey.pem",
2015 }
2016
2017 android_app {
2018 name: "AppFoo",
2019 srcs: ["foo/bar/MyClass.java"],
2020 sdk_version: "current",
2021 min_sdk_version: "29",
2022 system_modules: "none",
2023 stl: "none",
2024 static_libs: ["bar"],
2025 apex_available: [ "myapex" ],
2026 }
2027
2028 java_library {
2029 name: "bar",
2030 sdk_version: "current",
2031 srcs: ["a.java"],
2032 apex_available: [ "myapex" ],
2033 }
2034 `)
2035}
2036
2037func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
2038 ctx, _ := testApex(t, `
2039 apex {
2040 name: "myapex",
2041 key: "myapex.key",
2042 native_shared_libs: ["mylib"],
2043 min_sdk_version: "29",
2044 }
2045
2046 apex_key {
2047 name: "myapex.key",
2048 public_key: "testkey.avbpubkey",
2049 private_key: "testkey.pem",
2050 }
2051
2052 // mylib in myapex will link to mylib2#29
2053 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2054 cc_library {
2055 name: "mylib",
2056 srcs: ["mylib.cpp"],
2057 shared_libs: ["mylib2"],
2058 system_shared_libs: [],
2059 stl: "none",
2060 apex_available: ["myapex", "otherapex"],
2061 min_sdk_version: "29",
2062 }
2063
2064 cc_library {
2065 name: "mylib2",
2066 srcs: ["mylib.cpp"],
2067 system_shared_libs: [],
2068 stl: "none",
2069 apex_available: ["otherapex"],
2070 stubs: { versions: ["29", "30"] },
2071 min_sdk_version: "30",
2072 }
2073
2074 apex {
2075 name: "otherapex",
2076 key: "myapex.key",
2077 native_shared_libs: ["mylib", "mylib2"],
2078 min_sdk_version: "30",
2079 }
2080 `)
2081 expectLink := func(from, from_variant, to, to_variant string) {
2082 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2083 libFlags := ld.Args["libFlags"]
2084 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2085 }
Colin Crossaede88c2020-08-11 12:17:01 -07002086 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
2087 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002088}
2089
Jiyong Park7c2ee712018-12-07 00:42:25 +09002090func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002091 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002092 apex {
2093 name: "myapex",
2094 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002095 native_shared_libs: ["mylib"],
2096 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002097 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002098 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09002099 }
2100
2101 apex_key {
2102 name: "myapex.key",
2103 public_key: "testkey.avbpubkey",
2104 private_key: "testkey.pem",
2105 }
2106
2107 prebuilt_etc {
2108 name: "myetc",
2109 src: "myprebuilt",
2110 sub_dir: "foo/bar",
2111 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002112
2113 cc_library {
2114 name: "mylib",
2115 srcs: ["mylib.cpp"],
2116 relative_install_path: "foo/bar",
2117 system_shared_libs: [],
2118 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002119 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002120 }
2121
2122 cc_binary {
2123 name: "mybin",
2124 srcs: ["mylib.cpp"],
2125 relative_install_path: "foo/bar",
2126 system_shared_libs: [],
2127 static_executable: true,
2128 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002129 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002130 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002131 `)
2132
Sundong Ahnabb64432019-10-22 13:58:29 +09002133 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002134 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2135
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002136 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002137 ensureListContains(t, dirs, "etc")
2138 ensureListContains(t, dirs, "etc/foo")
2139 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002140 ensureListContains(t, dirs, "lib64")
2141 ensureListContains(t, dirs, "lib64/foo")
2142 ensureListContains(t, dirs, "lib64/foo/bar")
2143 ensureListContains(t, dirs, "lib")
2144 ensureListContains(t, dirs, "lib/foo")
2145 ensureListContains(t, dirs, "lib/foo/bar")
2146
Jiyong Parkbd13e442019-03-15 18:10:35 +09002147 ensureListContains(t, dirs, "bin")
2148 ensureListContains(t, dirs, "bin/foo")
2149 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002150}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002151
Jooyung Han35155c42020-02-06 17:33:20 +09002152func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2153 ctx, _ := testApex(t, `
2154 apex {
2155 name: "myapex",
2156 key: "myapex.key",
2157 multilib: {
2158 both: {
2159 native_shared_libs: ["mylib"],
2160 binaries: ["mybin"],
2161 },
2162 },
2163 compile_multilib: "both",
2164 native_bridge_supported: true,
2165 }
2166
2167 apex_key {
2168 name: "myapex.key",
2169 public_key: "testkey.avbpubkey",
2170 private_key: "testkey.pem",
2171 }
2172
2173 cc_library {
2174 name: "mylib",
2175 relative_install_path: "foo/bar",
2176 system_shared_libs: [],
2177 stl: "none",
2178 apex_available: [ "myapex" ],
2179 native_bridge_supported: true,
2180 }
2181
2182 cc_binary {
2183 name: "mybin",
2184 relative_install_path: "foo/bar",
2185 system_shared_libs: [],
2186 static_executable: true,
2187 stl: "none",
2188 apex_available: [ "myapex" ],
2189 native_bridge_supported: true,
2190 compile_multilib: "both", // default is "first" for binary
2191 multilib: {
2192 lib64: {
2193 suffix: "64",
2194 },
2195 },
2196 }
2197 `, withNativeBridgeEnabled)
2198 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2199 "bin/foo/bar/mybin",
2200 "bin/foo/bar/mybin64",
2201 "bin/arm/foo/bar/mybin",
2202 "bin/arm64/foo/bar/mybin64",
2203 "lib/foo/bar/mylib.so",
2204 "lib/arm/foo/bar/mylib.so",
2205 "lib64/foo/bar/mylib.so",
2206 "lib64/arm64/foo/bar/mylib.so",
2207 })
2208}
2209
Jiyong Parkda6eb592018-12-19 17:12:36 +09002210func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002211 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002212 apex {
2213 name: "myapex",
2214 key: "myapex.key",
2215 native_shared_libs: ["mylib"],
2216 use_vendor: true,
2217 }
2218
2219 apex_key {
2220 name: "myapex.key",
2221 public_key: "testkey.avbpubkey",
2222 private_key: "testkey.pem",
2223 }
2224
2225 cc_library {
2226 name: "mylib",
2227 srcs: ["mylib.cpp"],
2228 shared_libs: ["mylib2"],
2229 system_shared_libs: [],
2230 vendor_available: true,
2231 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002232 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002233 }
2234
2235 cc_library {
2236 name: "mylib2",
2237 srcs: ["mylib.cpp"],
2238 system_shared_libs: [],
2239 vendor_available: true,
2240 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002241 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002242 }
Jooyung Handc782442019-11-01 03:14:38 +09002243 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002244 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002245 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002246
2247 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002248 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002249 for _, implicit := range i.Implicits {
2250 inputsList = append(inputsList, implicit.String())
2251 }
2252 }
2253 inputsString := strings.Join(inputsList, " ")
2254
2255 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002256 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2257 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002258
2259 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002260 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2261 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002262}
Jiyong Park16e91a02018-12-20 18:18:08 +09002263
Jooyung Han85d61762020-06-24 23:50:26 +09002264func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002265 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2266 apex {
2267 name: "myapex",
2268 key: "myapex.key",
2269 use_vendor: true,
2270 }
2271 apex_key {
2272 name: "myapex.key",
2273 public_key: "testkey.avbpubkey",
2274 private_key: "testkey.pem",
2275 }
2276 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002277 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002278 })
Colin Cross440e0d02020-06-11 11:32:11 -07002279 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002280 testApex(t, `
2281 apex {
2282 name: "myapex",
2283 key: "myapex.key",
2284 use_vendor: true,
2285 }
2286 apex_key {
2287 name: "myapex.key",
2288 public_key: "testkey.avbpubkey",
2289 private_key: "testkey.pem",
2290 }
2291 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002292 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002293 })
2294}
2295
Jooyung Han5c998b92019-06-27 11:30:33 +09002296func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2297 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2298 apex {
2299 name: "myapex",
2300 key: "myapex.key",
2301 native_shared_libs: ["mylib"],
2302 use_vendor: true,
2303 }
2304
2305 apex_key {
2306 name: "myapex.key",
2307 public_key: "testkey.avbpubkey",
2308 private_key: "testkey.pem",
2309 }
2310
2311 cc_library {
2312 name: "mylib",
2313 srcs: ["mylib.cpp"],
2314 system_shared_libs: [],
2315 stl: "none",
2316 }
2317 `)
2318}
2319
Jooyung Han85d61762020-06-24 23:50:26 +09002320func TestVendorApex(t *testing.T) {
2321 ctx, config := testApex(t, `
2322 apex {
2323 name: "myapex",
2324 key: "myapex.key",
2325 binaries: ["mybin"],
2326 vendor: true,
2327 }
2328 apex_key {
2329 name: "myapex.key",
2330 public_key: "testkey.avbpubkey",
2331 private_key: "testkey.pem",
2332 }
2333 cc_binary {
2334 name: "mybin",
2335 vendor: true,
2336 shared_libs: ["libfoo"],
2337 }
2338 cc_library {
2339 name: "libfoo",
2340 proprietary: true,
2341 }
2342 `)
2343
2344 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2345 "bin/mybin",
2346 "lib64/libfoo.so",
2347 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2348 "lib64/libc++.so",
2349 })
2350
2351 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2352 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2353 name := apexBundle.BaseModuleName()
2354 prefix := "TARGET_"
2355 var builder strings.Builder
2356 data.Custom(&builder, name, prefix, "", data)
2357 androidMk := builder.String()
2358 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002359
2360 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2361 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2362 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002363}
2364
Jooyung Handf78e212020-07-22 15:54:47 +09002365func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2366 ctx, _ := testApex(t, `
2367 apex {
2368 name: "myapex",
2369 key: "myapex.key",
2370 binaries: ["mybin"],
2371 vendor: true,
2372 use_vndk_as_stable: true,
2373 }
2374 apex_key {
2375 name: "myapex.key",
2376 public_key: "testkey.avbpubkey",
2377 private_key: "testkey.pem",
2378 }
2379 cc_binary {
2380 name: "mybin",
2381 vendor: true,
2382 shared_libs: ["libvndk", "libvendor"],
2383 }
2384 cc_library {
2385 name: "libvndk",
2386 vndk: {
2387 enabled: true,
2388 },
2389 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002390 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002391 }
2392 cc_library {
2393 name: "libvendor",
2394 vendor: true,
2395 }
2396 `)
2397
2398 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2399
Colin Crossaede88c2020-08-11 12:17:01 -07002400 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002401 libs := names(ldRule.Args["libFlags"])
2402 // VNDK libs(libvndk/libc++) as they are
2403 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2404 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2405 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002406 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002407
2408 // VNDK libs are not included when use_vndk_as_stable: true
2409 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2410 "bin/mybin",
2411 "lib64/libvendor.so",
2412 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002413
2414 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2415 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2416 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002417}
2418
Jooyung Han8e5685d2020-09-21 11:02:57 +09002419func TestApex_withPrebuiltFirmware(t *testing.T) {
2420 testCases := []struct {
2421 name string
2422 additionalProp string
2423 }{
2424 {"system apex with prebuilt_firmware", ""},
2425 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2426 }
2427 for _, tc := range testCases {
2428 t.Run(tc.name, func(t *testing.T) {
2429 ctx, _ := testApex(t, `
2430 apex {
2431 name: "myapex",
2432 key: "myapex.key",
2433 prebuilts: ["myfirmware"],
2434 `+tc.additionalProp+`
2435 }
2436 apex_key {
2437 name: "myapex.key",
2438 public_key: "testkey.avbpubkey",
2439 private_key: "testkey.pem",
2440 }
2441 prebuilt_firmware {
2442 name: "myfirmware",
2443 src: "myfirmware.bin",
2444 filename_from_src: true,
2445 `+tc.additionalProp+`
2446 }
2447 `)
2448 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2449 "etc/firmware/myfirmware.bin",
2450 })
2451 })
2452 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002453}
2454
Jooyung Hanefb184e2020-06-25 17:14:25 +09002455func TestAndroidMk_UseVendorRequired(t *testing.T) {
2456 ctx, config := testApex(t, `
2457 apex {
2458 name: "myapex",
2459 key: "myapex.key",
2460 use_vendor: true,
2461 native_shared_libs: ["mylib"],
2462 }
2463
2464 apex_key {
2465 name: "myapex.key",
2466 public_key: "testkey.avbpubkey",
2467 private_key: "testkey.pem",
2468 }
2469
2470 cc_library {
2471 name: "mylib",
2472 vendor_available: true,
2473 apex_available: ["myapex"],
2474 }
2475 `, func(fs map[string][]byte, config android.Config) {
2476 setUseVendorAllowListForTest(config, []string{"myapex"})
2477 })
2478
2479 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2480 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2481 name := apexBundle.BaseModuleName()
2482 prefix := "TARGET_"
2483 var builder strings.Builder
2484 data.Custom(&builder, name, prefix, "", data)
2485 androidMk := builder.String()
2486 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2487}
2488
2489func TestAndroidMk_VendorApexRequired(t *testing.T) {
2490 ctx, config := testApex(t, `
2491 apex {
2492 name: "myapex",
2493 key: "myapex.key",
2494 vendor: true,
2495 native_shared_libs: ["mylib"],
2496 }
2497
2498 apex_key {
2499 name: "myapex.key",
2500 public_key: "testkey.avbpubkey",
2501 private_key: "testkey.pem",
2502 }
2503
2504 cc_library {
2505 name: "mylib",
2506 vendor_available: true,
2507 }
2508 `)
2509
2510 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2511 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2512 name := apexBundle.BaseModuleName()
2513 prefix := "TARGET_"
2514 var builder strings.Builder
2515 data.Custom(&builder, name, prefix, "", data)
2516 androidMk := builder.String()
2517 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2518}
2519
Jooyung Han2ed99d02020-06-24 23:26:26 +09002520func TestAndroidMkWritesCommonProperties(t *testing.T) {
2521 ctx, config := testApex(t, `
2522 apex {
2523 name: "myapex",
2524 key: "myapex.key",
2525 vintf_fragments: ["fragment.xml"],
2526 init_rc: ["init.rc"],
2527 }
2528 apex_key {
2529 name: "myapex.key",
2530 public_key: "testkey.avbpubkey",
2531 private_key: "testkey.pem",
2532 }
2533 cc_binary {
2534 name: "mybin",
2535 }
2536 `)
2537
2538 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2539 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2540 name := apexBundle.BaseModuleName()
2541 prefix := "TARGET_"
2542 var builder strings.Builder
2543 data.Custom(&builder, name, prefix, "", data)
2544 androidMk := builder.String()
2545 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2546 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2547}
2548
Jiyong Park16e91a02018-12-20 18:18:08 +09002549func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002550 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002551 apex {
2552 name: "myapex",
2553 key: "myapex.key",
2554 native_shared_libs: ["mylib"],
2555 }
2556
2557 apex_key {
2558 name: "myapex.key",
2559 public_key: "testkey.avbpubkey",
2560 private_key: "testkey.pem",
2561 }
2562
2563 cc_library {
2564 name: "mylib",
2565 srcs: ["mylib.cpp"],
2566 system_shared_libs: [],
2567 stl: "none",
2568 stubs: {
2569 versions: ["1", "2", "3"],
2570 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002571 apex_available: [
2572 "//apex_available:platform",
2573 "myapex",
2574 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002575 }
2576
2577 cc_binary {
2578 name: "not_in_apex",
2579 srcs: ["mylib.cpp"],
2580 static_libs: ["mylib"],
2581 static_executable: true,
2582 system_shared_libs: [],
2583 stl: "none",
2584 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002585 `)
2586
Colin Cross7113d202019-11-20 16:39:12 -08002587 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002588
2589 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002590 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002591}
Jiyong Park9335a262018-12-24 11:31:58 +09002592
2593func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002594 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002595 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002596 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002597 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002598 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002599 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002600 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002601 }
2602
2603 cc_library {
2604 name: "mylib",
2605 srcs: ["mylib.cpp"],
2606 system_shared_libs: [],
2607 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002608 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002609 }
2610
2611 apex_key {
2612 name: "myapex.key",
2613 public_key: "testkey.avbpubkey",
2614 private_key: "testkey.pem",
2615 }
2616
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002617 android_app_certificate {
2618 name: "myapex.certificate",
2619 certificate: "testkey",
2620 }
2621
2622 android_app_certificate {
2623 name: "myapex.certificate.override",
2624 certificate: "testkey.override",
2625 }
2626
Jiyong Park9335a262018-12-24 11:31:58 +09002627 `)
2628
2629 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002630 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002631
2632 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2633 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2634 "vendor/foo/devkeys/testkey.avbpubkey")
2635 }
2636 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2637 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2638 "vendor/foo/devkeys/testkey.pem")
2639 }
2640
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002641 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002642 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002643 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002644 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002645 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002646 }
2647}
Jiyong Park58e364a2019-01-19 19:24:06 +09002648
Jooyung Hanf121a652019-12-17 14:30:11 +09002649func TestCertificate(t *testing.T) {
2650 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2651 ctx, _ := testApex(t, `
2652 apex {
2653 name: "myapex",
2654 key: "myapex.key",
2655 }
2656 apex_key {
2657 name: "myapex.key",
2658 public_key: "testkey.avbpubkey",
2659 private_key: "testkey.pem",
2660 }`)
2661 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2662 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2663 if actual := rule.Args["certificates"]; actual != expected {
2664 t.Errorf("certificates should be %q, not %q", expected, actual)
2665 }
2666 })
2667 t.Run("override when unspecified", func(t *testing.T) {
2668 ctx, _ := testApex(t, `
2669 apex {
2670 name: "myapex_keytest",
2671 key: "myapex.key",
2672 file_contexts: ":myapex-file_contexts",
2673 }
2674 apex_key {
2675 name: "myapex.key",
2676 public_key: "testkey.avbpubkey",
2677 private_key: "testkey.pem",
2678 }
2679 android_app_certificate {
2680 name: "myapex.certificate.override",
2681 certificate: "testkey.override",
2682 }`)
2683 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2684 expected := "testkey.override.x509.pem testkey.override.pk8"
2685 if actual := rule.Args["certificates"]; actual != expected {
2686 t.Errorf("certificates should be %q, not %q", expected, actual)
2687 }
2688 })
2689 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2690 ctx, _ := testApex(t, `
2691 apex {
2692 name: "myapex",
2693 key: "myapex.key",
2694 certificate: ":myapex.certificate",
2695 }
2696 apex_key {
2697 name: "myapex.key",
2698 public_key: "testkey.avbpubkey",
2699 private_key: "testkey.pem",
2700 }
2701 android_app_certificate {
2702 name: "myapex.certificate",
2703 certificate: "testkey",
2704 }`)
2705 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2706 expected := "testkey.x509.pem testkey.pk8"
2707 if actual := rule.Args["certificates"]; actual != expected {
2708 t.Errorf("certificates should be %q, not %q", expected, actual)
2709 }
2710 })
2711 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2712 ctx, _ := testApex(t, `
2713 apex {
2714 name: "myapex_keytest",
2715 key: "myapex.key",
2716 file_contexts: ":myapex-file_contexts",
2717 certificate: ":myapex.certificate",
2718 }
2719 apex_key {
2720 name: "myapex.key",
2721 public_key: "testkey.avbpubkey",
2722 private_key: "testkey.pem",
2723 }
2724 android_app_certificate {
2725 name: "myapex.certificate.override",
2726 certificate: "testkey.override",
2727 }`)
2728 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2729 expected := "testkey.override.x509.pem testkey.override.pk8"
2730 if actual := rule.Args["certificates"]; actual != expected {
2731 t.Errorf("certificates should be %q, not %q", expected, actual)
2732 }
2733 })
2734 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2735 ctx, _ := testApex(t, `
2736 apex {
2737 name: "myapex",
2738 key: "myapex.key",
2739 certificate: "testkey",
2740 }
2741 apex_key {
2742 name: "myapex.key",
2743 public_key: "testkey.avbpubkey",
2744 private_key: "testkey.pem",
2745 }`)
2746 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2747 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2748 if actual := rule.Args["certificates"]; actual != expected {
2749 t.Errorf("certificates should be %q, not %q", expected, actual)
2750 }
2751 })
2752 t.Run("override when specified as <name>", func(t *testing.T) {
2753 ctx, _ := testApex(t, `
2754 apex {
2755 name: "myapex_keytest",
2756 key: "myapex.key",
2757 file_contexts: ":myapex-file_contexts",
2758 certificate: "testkey",
2759 }
2760 apex_key {
2761 name: "myapex.key",
2762 public_key: "testkey.avbpubkey",
2763 private_key: "testkey.pem",
2764 }
2765 android_app_certificate {
2766 name: "myapex.certificate.override",
2767 certificate: "testkey.override",
2768 }`)
2769 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2770 expected := "testkey.override.x509.pem testkey.override.pk8"
2771 if actual := rule.Args["certificates"]; actual != expected {
2772 t.Errorf("certificates should be %q, not %q", expected, actual)
2773 }
2774 })
2775}
2776
Jiyong Park58e364a2019-01-19 19:24:06 +09002777func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002778 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002779 apex {
2780 name: "myapex",
2781 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002782 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002783 }
2784
2785 apex {
2786 name: "otherapex",
2787 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002788 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002789 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002790 }
2791
2792 apex_key {
2793 name: "myapex.key",
2794 public_key: "testkey.avbpubkey",
2795 private_key: "testkey.pem",
2796 }
2797
2798 cc_library {
2799 name: "mylib",
2800 srcs: ["mylib.cpp"],
2801 system_shared_libs: [],
2802 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002803 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002804 "myapex",
2805 "otherapex",
2806 ],
Jooyung Han24282772020-03-21 23:20:55 +09002807 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002808 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002809 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002810 cc_library {
2811 name: "mylib2",
2812 srcs: ["mylib.cpp"],
2813 system_shared_libs: [],
2814 stl: "none",
2815 apex_available: [
2816 "myapex",
2817 "otherapex",
2818 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002819 static_libs: ["mylib3"],
2820 recovery_available: true,
2821 min_sdk_version: "29",
2822 }
2823 cc_library {
2824 name: "mylib3",
2825 srcs: ["mylib.cpp"],
2826 system_shared_libs: [],
2827 stl: "none",
2828 apex_available: [
2829 "myapex",
2830 "otherapex",
2831 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002832 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002833 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002834 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002835 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002836 `)
2837
Jooyung Hanc87a0592020-03-02 17:44:33 +09002838 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002839 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002840 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002841 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002842
Jooyung Hanccce2f22020-03-07 03:45:53 +09002843 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002844 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002845 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002846 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002847 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002848
Jooyung Hanccce2f22020-03-07 03:45:53 +09002849 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002850 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002851 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002852 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002853 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002854
Colin Crossaede88c2020-08-11 12:17:01 -07002855 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2856 // each variant defines additional macros to distinguish which apex variant it is built for
2857
2858 // non-APEX variant does not have __ANDROID_APEX__ defined
2859 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2860 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2861
2862 // APEX variant has __ANDROID_APEX__ defined
2863 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2864 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2865 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2866 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2867
2868 // APEX variant has __ANDROID_APEX__ defined
2869 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2870 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2871 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2872 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2873
Dan Albertb19953d2020-11-17 15:29:36 -08002874 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002875 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2876 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002877 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07002878
2879 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2880 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002881
2882 // non-APEX variant does not have __ANDROID_APEX__ defined
2883 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2884 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2885
2886 // APEX variant has __ANDROID_APEX__ defined
2887 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002888 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002889 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002890 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002891
Jooyung Hanc87a0592020-03-02 17:44:33 +09002892 // APEX variant has __ANDROID_APEX__ defined
2893 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002894 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002895 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002896 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002897
Dan Albertb19953d2020-11-17 15:29:36 -08002898 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002899 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002900 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002901 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002902}
Jiyong Park7e636d02019-01-28 16:16:54 +09002903
2904func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002905 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002906 apex {
2907 name: "myapex",
2908 key: "myapex.key",
2909 native_shared_libs: ["mylib"],
2910 }
2911
2912 apex_key {
2913 name: "myapex.key",
2914 public_key: "testkey.avbpubkey",
2915 private_key: "testkey.pem",
2916 }
2917
2918 cc_library_headers {
2919 name: "mylib_headers",
2920 export_include_dirs: ["my_include"],
2921 system_shared_libs: [],
2922 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002923 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002924 }
2925
2926 cc_library {
2927 name: "mylib",
2928 srcs: ["mylib.cpp"],
2929 system_shared_libs: [],
2930 stl: "none",
2931 header_libs: ["mylib_headers"],
2932 export_header_lib_headers: ["mylib_headers"],
2933 stubs: {
2934 versions: ["1", "2", "3"],
2935 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002936 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002937 }
2938
2939 cc_library {
2940 name: "otherlib",
2941 srcs: ["mylib.cpp"],
2942 system_shared_libs: [],
2943 stl: "none",
2944 shared_libs: ["mylib"],
2945 }
2946 `)
2947
Colin Cross7113d202019-11-20 16:39:12 -08002948 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002949
2950 // Ensure that the include path of the header lib is exported to 'otherlib'
2951 ensureContains(t, cFlags, "-Imy_include")
2952}
Alex Light9670d332019-01-29 18:07:33 -08002953
Jiyong Park7cd10e32020-01-14 09:22:18 +09002954type fileInApex struct {
2955 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002956 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002957 isLink bool
2958}
2959
Jooyung Hana57af4a2020-01-23 05:36:59 +00002960func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002961 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002962 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002963 copyCmds := apexRule.Args["copy_commands"]
2964 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002965 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002966 for _, cmd := range strings.Split(copyCmds, "&&") {
2967 cmd = strings.TrimSpace(cmd)
2968 if cmd == "" {
2969 continue
2970 }
2971 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002972 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002973 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002974 switch terms[0] {
2975 case "mkdir":
2976 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002977 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002978 t.Fatal("copyCmds contains invalid cp command", cmd)
2979 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002980 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002981 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002982 isLink = false
2983 case "ln":
2984 if len(terms) != 3 && len(terms) != 4 {
2985 // ln LINK TARGET or ln -s LINK TARGET
2986 t.Fatal("copyCmds contains invalid ln command", cmd)
2987 }
2988 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002989 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002990 isLink = true
2991 default:
2992 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2993 }
2994 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002995 index := strings.Index(dst, imageApexDir)
2996 if index == -1 {
2997 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2998 }
2999 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003000 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003001 }
3002 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003003 return ret
3004}
3005
Jooyung Hana57af4a2020-01-23 05:36:59 +00003006func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3007 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003008 var failed bool
3009 var surplus []string
3010 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003011 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003012 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003013 for _, expected := range files {
3014 if matched, _ := path.Match(expected, file.path); matched {
3015 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003016 mactchFound = true
3017 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003018 }
3019 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003020 if !mactchFound {
3021 surplus = append(surplus, file.path)
3022 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003023 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003024
Jooyung Han31c470b2019-10-18 16:26:59 +09003025 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003026 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003027 t.Log("surplus files", surplus)
3028 failed = true
3029 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003030
3031 if len(files) > len(filesMatched) {
3032 var missing []string
3033 for _, expected := range files {
3034 if !filesMatched[expected] {
3035 missing = append(missing, expected)
3036 }
3037 }
3038 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003039 t.Log("missing files", missing)
3040 failed = true
3041 }
3042 if failed {
3043 t.Fail()
3044 }
3045}
3046
Jooyung Han344d5432019-08-23 11:17:39 +09003047func TestVndkApexCurrent(t *testing.T) {
3048 ctx, _ := testApex(t, `
3049 apex_vndk {
3050 name: "myapex",
3051 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003052 }
3053
3054 apex_key {
3055 name: "myapex.key",
3056 public_key: "testkey.avbpubkey",
3057 private_key: "testkey.pem",
3058 }
3059
3060 cc_library {
3061 name: "libvndk",
3062 srcs: ["mylib.cpp"],
3063 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003064 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003065 vndk: {
3066 enabled: true,
3067 },
3068 system_shared_libs: [],
3069 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003070 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003071 }
3072
3073 cc_library {
3074 name: "libvndksp",
3075 srcs: ["mylib.cpp"],
3076 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003077 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003078 vndk: {
3079 enabled: true,
3080 support_system_process: true,
3081 },
3082 system_shared_libs: [],
3083 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003084 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003085 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003086 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003087
Jooyung Hana57af4a2020-01-23 05:36:59 +00003088 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003089 "lib/libvndk.so",
3090 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003091 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003092 "lib64/libvndk.so",
3093 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003094 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003095 "etc/llndk.libraries.VER.txt",
3096 "etc/vndkcore.libraries.VER.txt",
3097 "etc/vndksp.libraries.VER.txt",
3098 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003099 })
Jooyung Han344d5432019-08-23 11:17:39 +09003100}
3101
3102func TestVndkApexWithPrebuilt(t *testing.T) {
3103 ctx, _ := testApex(t, `
3104 apex_vndk {
3105 name: "myapex",
3106 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003107 }
3108
3109 apex_key {
3110 name: "myapex.key",
3111 public_key: "testkey.avbpubkey",
3112 private_key: "testkey.pem",
3113 }
3114
3115 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003116 name: "libvndk",
3117 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003118 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003119 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003120 vndk: {
3121 enabled: true,
3122 },
3123 system_shared_libs: [],
3124 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003125 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003126 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003127
3128 cc_prebuilt_library_shared {
3129 name: "libvndk.arm",
3130 srcs: ["libvndk.arm.so"],
3131 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003132 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003133 vndk: {
3134 enabled: true,
3135 },
3136 enabled: false,
3137 arch: {
3138 arm: {
3139 enabled: true,
3140 },
3141 },
3142 system_shared_libs: [],
3143 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003144 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003145 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003146 `+vndkLibrariesTxtFiles("current"),
3147 withFiles(map[string][]byte{
3148 "libvndk.so": nil,
3149 "libvndk.arm.so": nil,
3150 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003151
Jooyung Hana57af4a2020-01-23 05:36:59 +00003152 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003153 "lib/libvndk.so",
3154 "lib/libvndk.arm.so",
3155 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003156 "lib/libc++.so",
3157 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003158 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003159 })
Jooyung Han344d5432019-08-23 11:17:39 +09003160}
3161
Jooyung Han39edb6c2019-11-06 16:53:07 +09003162func vndkLibrariesTxtFiles(vers ...string) (result string) {
3163 for _, v := range vers {
3164 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09003165 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003166 result += `
3167 vndk_libraries_txt {
3168 name: "` + txt + `.libraries.txt",
3169 }
3170 `
3171 }
3172 } else {
3173 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3174 result += `
3175 prebuilt_etc {
3176 name: "` + txt + `.libraries.` + v + `.txt",
3177 src: "dummy.txt",
3178 }
3179 `
3180 }
3181 }
3182 }
3183 return
3184}
3185
Jooyung Han344d5432019-08-23 11:17:39 +09003186func TestVndkApexVersion(t *testing.T) {
3187 ctx, _ := testApex(t, `
3188 apex_vndk {
3189 name: "myapex_v27",
3190 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003191 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003192 vndk_version: "27",
3193 }
3194
3195 apex_key {
3196 name: "myapex.key",
3197 public_key: "testkey.avbpubkey",
3198 private_key: "testkey.pem",
3199 }
3200
Jooyung Han31c470b2019-10-18 16:26:59 +09003201 vndk_prebuilt_shared {
3202 name: "libvndk27",
3203 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003204 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003205 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003206 vndk: {
3207 enabled: true,
3208 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003209 target_arch: "arm64",
3210 arch: {
3211 arm: {
3212 srcs: ["libvndk27_arm.so"],
3213 },
3214 arm64: {
3215 srcs: ["libvndk27_arm64.so"],
3216 },
3217 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003218 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003219 }
3220
3221 vndk_prebuilt_shared {
3222 name: "libvndk27",
3223 version: "27",
3224 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003225 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003226 vndk: {
3227 enabled: true,
3228 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003229 target_arch: "x86_64",
3230 arch: {
3231 x86: {
3232 srcs: ["libvndk27_x86.so"],
3233 },
3234 x86_64: {
3235 srcs: ["libvndk27_x86_64.so"],
3236 },
3237 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003238 }
3239 `+vndkLibrariesTxtFiles("27"),
3240 withFiles(map[string][]byte{
3241 "libvndk27_arm.so": nil,
3242 "libvndk27_arm64.so": nil,
3243 "libvndk27_x86.so": nil,
3244 "libvndk27_x86_64.so": nil,
3245 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003246
Jooyung Hana57af4a2020-01-23 05:36:59 +00003247 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003248 "lib/libvndk27_arm.so",
3249 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003250 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003251 })
Jooyung Han344d5432019-08-23 11:17:39 +09003252}
3253
3254func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3255 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3256 apex_vndk {
3257 name: "myapex_v27",
3258 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003259 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003260 vndk_version: "27",
3261 }
3262 apex_vndk {
3263 name: "myapex_v27_other",
3264 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003265 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003266 vndk_version: "27",
3267 }
3268
3269 apex_key {
3270 name: "myapex.key",
3271 public_key: "testkey.avbpubkey",
3272 private_key: "testkey.pem",
3273 }
3274
3275 cc_library {
3276 name: "libvndk",
3277 srcs: ["mylib.cpp"],
3278 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003279 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003280 vndk: {
3281 enabled: true,
3282 },
3283 system_shared_libs: [],
3284 stl: "none",
3285 }
3286
3287 vndk_prebuilt_shared {
3288 name: "libvndk",
3289 version: "27",
3290 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003291 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003292 vndk: {
3293 enabled: true,
3294 },
3295 srcs: ["libvndk.so"],
3296 }
3297 `, withFiles(map[string][]byte{
3298 "libvndk.so": nil,
3299 }))
3300}
3301
Jooyung Han90eee022019-10-01 20:02:42 +09003302func TestVndkApexNameRule(t *testing.T) {
3303 ctx, _ := testApex(t, `
3304 apex_vndk {
3305 name: "myapex",
3306 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003307 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003308 }
3309 apex_vndk {
3310 name: "myapex_v28",
3311 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003312 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003313 vndk_version: "28",
3314 }
3315 apex_key {
3316 name: "myapex.key",
3317 public_key: "testkey.avbpubkey",
3318 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003319 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003320
3321 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003322 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003323 actual := proptools.String(bundle.properties.Apex_name)
3324 if !reflect.DeepEqual(actual, expected) {
3325 t.Errorf("Got '%v', expected '%v'", actual, expected)
3326 }
3327 }
3328
3329 assertApexName("com.android.vndk.vVER", "myapex")
3330 assertApexName("com.android.vndk.v28", "myapex_v28")
3331}
3332
Jooyung Han344d5432019-08-23 11:17:39 +09003333func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3334 ctx, _ := testApex(t, `
3335 apex_vndk {
3336 name: "myapex",
3337 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003338 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003339 }
3340
3341 apex_key {
3342 name: "myapex.key",
3343 public_key: "testkey.avbpubkey",
3344 private_key: "testkey.pem",
3345 }
3346
3347 cc_library {
3348 name: "libvndk",
3349 srcs: ["mylib.cpp"],
3350 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003351 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003352 native_bridge_supported: true,
3353 host_supported: true,
3354 vndk: {
3355 enabled: true,
3356 },
3357 system_shared_libs: [],
3358 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003359 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003360 }
Jooyung Han35155c42020-02-06 17:33:20 +09003361 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003362
Jooyung Hana57af4a2020-01-23 05:36:59 +00003363 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003364 "lib/libvndk.so",
3365 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003366 "lib/libc++.so",
3367 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003368 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003369 })
Jooyung Han344d5432019-08-23 11:17:39 +09003370}
3371
3372func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3373 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3374 apex_vndk {
3375 name: "myapex",
3376 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003377 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003378 native_bridge_supported: true,
3379 }
3380
3381 apex_key {
3382 name: "myapex.key",
3383 public_key: "testkey.avbpubkey",
3384 private_key: "testkey.pem",
3385 }
3386
3387 cc_library {
3388 name: "libvndk",
3389 srcs: ["mylib.cpp"],
3390 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003391 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003392 native_bridge_supported: true,
3393 host_supported: true,
3394 vndk: {
3395 enabled: true,
3396 },
3397 system_shared_libs: [],
3398 stl: "none",
3399 }
3400 `)
3401}
3402
Jooyung Han31c470b2019-10-18 16:26:59 +09003403func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003404 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003405 apex_vndk {
3406 name: "myapex_v27",
3407 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003408 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003409 vndk_version: "27",
3410 }
3411
3412 apex_key {
3413 name: "myapex.key",
3414 public_key: "testkey.avbpubkey",
3415 private_key: "testkey.pem",
3416 }
3417
3418 vndk_prebuilt_shared {
3419 name: "libvndk27",
3420 version: "27",
3421 target_arch: "arm",
3422 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003423 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003424 vndk: {
3425 enabled: true,
3426 },
3427 arch: {
3428 arm: {
3429 srcs: ["libvndk27.so"],
3430 }
3431 },
3432 }
3433
3434 vndk_prebuilt_shared {
3435 name: "libvndk27",
3436 version: "27",
3437 target_arch: "arm",
3438 binder32bit: true,
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: ["libvndk27binder32.so"],
3447 }
3448 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003449 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003450 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003451 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003452 withFiles(map[string][]byte{
3453 "libvndk27.so": nil,
3454 "libvndk27binder32.so": nil,
3455 }),
3456 withBinder32bit,
3457 withTargets(map[android.OsType][]android.Target{
3458 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003459 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3460 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003461 },
3462 }),
3463 )
3464
Jooyung Hana57af4a2020-01-23 05:36:59 +00003465 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003466 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003467 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003468 })
3469}
3470
Jooyung Han45a96772020-06-15 14:59:42 +09003471func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3472 ctx, _ := testApex(t, `
3473 apex_vndk {
3474 name: "myapex",
3475 key: "myapex.key",
3476 file_contexts: ":myapex-file_contexts",
3477 }
3478
3479 apex_key {
3480 name: "myapex.key",
3481 public_key: "testkey.avbpubkey",
3482 private_key: "testkey.pem",
3483 }
3484
3485 cc_library {
3486 name: "libz",
3487 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003488 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003489 vndk: {
3490 enabled: true,
3491 },
3492 stubs: {
3493 symbol_file: "libz.map.txt",
3494 versions: ["30"],
3495 }
3496 }
3497 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3498 "libz.map.txt": nil,
3499 }))
3500
3501 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3502 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3503 ensureListEmpty(t, provideNativeLibs)
3504}
3505
Jooyung Hane1633032019-08-01 17:41:43 +09003506func TestDependenciesInApexManifest(t *testing.T) {
3507 ctx, _ := testApex(t, `
3508 apex {
3509 name: "myapex_nodep",
3510 key: "myapex.key",
3511 native_shared_libs: ["lib_nodep"],
3512 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003513 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003514 }
3515
3516 apex {
3517 name: "myapex_dep",
3518 key: "myapex.key",
3519 native_shared_libs: ["lib_dep"],
3520 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003521 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003522 }
3523
3524 apex {
3525 name: "myapex_provider",
3526 key: "myapex.key",
3527 native_shared_libs: ["libfoo"],
3528 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003529 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003530 }
3531
3532 apex {
3533 name: "myapex_selfcontained",
3534 key: "myapex.key",
3535 native_shared_libs: ["lib_dep", "libfoo"],
3536 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003537 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003538 }
3539
3540 apex_key {
3541 name: "myapex.key",
3542 public_key: "testkey.avbpubkey",
3543 private_key: "testkey.pem",
3544 }
3545
3546 cc_library {
3547 name: "lib_nodep",
3548 srcs: ["mylib.cpp"],
3549 system_shared_libs: [],
3550 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003551 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003552 }
3553
3554 cc_library {
3555 name: "lib_dep",
3556 srcs: ["mylib.cpp"],
3557 shared_libs: ["libfoo"],
3558 system_shared_libs: [],
3559 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003560 apex_available: [
3561 "myapex_dep",
3562 "myapex_provider",
3563 "myapex_selfcontained",
3564 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003565 }
3566
3567 cc_library {
3568 name: "libfoo",
3569 srcs: ["mytest.cpp"],
3570 stubs: {
3571 versions: ["1"],
3572 },
3573 system_shared_libs: [],
3574 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003575 apex_available: [
3576 "myapex_provider",
3577 "myapex_selfcontained",
3578 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003579 }
3580 `)
3581
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003582 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003583 var provideNativeLibs, requireNativeLibs []string
3584
Sundong Ahnabb64432019-10-22 13:58:29 +09003585 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003586 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3587 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003588 ensureListEmpty(t, provideNativeLibs)
3589 ensureListEmpty(t, requireNativeLibs)
3590
Sundong Ahnabb64432019-10-22 13:58:29 +09003591 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003592 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3593 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003594 ensureListEmpty(t, provideNativeLibs)
3595 ensureListContains(t, requireNativeLibs, "libfoo.so")
3596
Sundong Ahnabb64432019-10-22 13:58:29 +09003597 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003598 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3599 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003600 ensureListContains(t, provideNativeLibs, "libfoo.so")
3601 ensureListEmpty(t, requireNativeLibs)
3602
Sundong Ahnabb64432019-10-22 13:58:29 +09003603 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003604 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3605 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003606 ensureListContains(t, provideNativeLibs, "libfoo.so")
3607 ensureListEmpty(t, requireNativeLibs)
3608}
3609
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003610func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003611 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003612 apex {
3613 name: "myapex",
3614 key: "myapex.key",
3615 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003616 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003617 }
3618
3619 apex_key {
3620 name: "myapex.key",
3621 public_key: "testkey.avbpubkey",
3622 private_key: "testkey.pem",
3623 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003624
3625 cc_library {
3626 name: "mylib",
3627 srcs: ["mylib.cpp"],
3628 system_shared_libs: [],
3629 stl: "none",
3630 apex_available: [
3631 "//apex_available:platform",
3632 "myapex",
3633 ],
3634 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003635 `)
3636
Sundong Ahnabb64432019-10-22 13:58:29 +09003637 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003638 apexManifestRule := module.Rule("apexManifestRule")
3639 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3640 apexRule := module.Rule("apexRule")
3641 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003642
3643 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3644 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3645 name := apexBundle.BaseModuleName()
3646 prefix := "TARGET_"
3647 var builder strings.Builder
3648 data.Custom(&builder, name, prefix, "", data)
3649 androidMk := builder.String()
3650 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3651 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003652}
3653
Alex Light0851b882019-02-07 13:20:53 -08003654func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003655 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003656 apex {
3657 name: "myapex",
3658 key: "myapex.key",
3659 native_shared_libs: ["mylib_common"],
3660 }
3661
3662 apex_key {
3663 name: "myapex.key",
3664 public_key: "testkey.avbpubkey",
3665 private_key: "testkey.pem",
3666 }
3667
3668 cc_library {
3669 name: "mylib_common",
3670 srcs: ["mylib.cpp"],
3671 system_shared_libs: [],
3672 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003673 apex_available: [
3674 "//apex_available:platform",
3675 "myapex",
3676 ],
Alex Light0851b882019-02-07 13:20:53 -08003677 }
3678 `)
3679
Sundong Ahnabb64432019-10-22 13:58:29 +09003680 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003681 apexRule := module.Rule("apexRule")
3682 copyCmds := apexRule.Args["copy_commands"]
3683
3684 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3685 t.Log("Apex was a test apex!")
3686 t.Fail()
3687 }
3688 // Ensure that main rule creates an output
3689 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3690
3691 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003692 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003693
3694 // Ensure that both direct and indirect deps are copied into apex
3695 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3696
Colin Cross7113d202019-11-20 16:39:12 -08003697 // Ensure that the platform variant ends with _shared
3698 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003699
Colin Cross56a83212020-09-15 18:30:11 -07003700 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003701 t.Log("Found mylib_common not in any apex!")
3702 t.Fail()
3703 }
3704}
3705
3706func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003707 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003708 apex_test {
3709 name: "myapex",
3710 key: "myapex.key",
3711 native_shared_libs: ["mylib_common_test"],
3712 }
3713
3714 apex_key {
3715 name: "myapex.key",
3716 public_key: "testkey.avbpubkey",
3717 private_key: "testkey.pem",
3718 }
3719
3720 cc_library {
3721 name: "mylib_common_test",
3722 srcs: ["mylib.cpp"],
3723 system_shared_libs: [],
3724 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003725 // TODO: remove //apex_available:platform
3726 apex_available: [
3727 "//apex_available:platform",
3728 "myapex",
3729 ],
Alex Light0851b882019-02-07 13:20:53 -08003730 }
3731 `)
3732
Sundong Ahnabb64432019-10-22 13:58:29 +09003733 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003734 apexRule := module.Rule("apexRule")
3735 copyCmds := apexRule.Args["copy_commands"]
3736
3737 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3738 t.Log("Apex was not a test apex!")
3739 t.Fail()
3740 }
3741 // Ensure that main rule creates an output
3742 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3743
3744 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003745 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003746
3747 // Ensure that both direct and indirect deps are copied into apex
3748 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3749
Colin Cross7113d202019-11-20 16:39:12 -08003750 // Ensure that the platform variant ends with _shared
3751 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003752}
3753
Alex Light9670d332019-01-29 18:07:33 -08003754func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003755 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003756 apex {
3757 name: "myapex",
3758 key: "myapex.key",
3759 multilib: {
3760 first: {
3761 native_shared_libs: ["mylib_common"],
3762 }
3763 },
3764 target: {
3765 android: {
3766 multilib: {
3767 first: {
3768 native_shared_libs: ["mylib"],
3769 }
3770 }
3771 },
3772 host: {
3773 multilib: {
3774 first: {
3775 native_shared_libs: ["mylib2"],
3776 }
3777 }
3778 }
3779 }
3780 }
3781
3782 apex_key {
3783 name: "myapex.key",
3784 public_key: "testkey.avbpubkey",
3785 private_key: "testkey.pem",
3786 }
3787
3788 cc_library {
3789 name: "mylib",
3790 srcs: ["mylib.cpp"],
3791 system_shared_libs: [],
3792 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003793 // TODO: remove //apex_available:platform
3794 apex_available: [
3795 "//apex_available:platform",
3796 "myapex",
3797 ],
Alex Light9670d332019-01-29 18:07:33 -08003798 }
3799
3800 cc_library {
3801 name: "mylib_common",
3802 srcs: ["mylib.cpp"],
3803 system_shared_libs: [],
3804 stl: "none",
3805 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003806 // TODO: remove //apex_available:platform
3807 apex_available: [
3808 "//apex_available:platform",
3809 "myapex",
3810 ],
Alex Light9670d332019-01-29 18:07:33 -08003811 }
3812
3813 cc_library {
3814 name: "mylib2",
3815 srcs: ["mylib.cpp"],
3816 system_shared_libs: [],
3817 stl: "none",
3818 compile_multilib: "first",
3819 }
3820 `)
3821
Sundong Ahnabb64432019-10-22 13:58:29 +09003822 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003823 copyCmds := apexRule.Args["copy_commands"]
3824
3825 // Ensure that main rule creates an output
3826 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3827
3828 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003829 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3830 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3831 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003832
3833 // Ensure that both direct and indirect deps are copied into apex
3834 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3835 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3836 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3837
Colin Cross7113d202019-11-20 16:39:12 -08003838 // Ensure that the platform variant ends with _shared
3839 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3840 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3841 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003842}
Jiyong Park04480cf2019-02-06 00:16:29 +09003843
3844func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003845 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003846 apex {
3847 name: "myapex",
3848 key: "myapex.key",
3849 binaries: ["myscript"],
3850 }
3851
3852 apex_key {
3853 name: "myapex.key",
3854 public_key: "testkey.avbpubkey",
3855 private_key: "testkey.pem",
3856 }
3857
3858 sh_binary {
3859 name: "myscript",
3860 src: "mylib.cpp",
3861 filename: "myscript.sh",
3862 sub_dir: "script",
3863 }
3864 `)
3865
Sundong Ahnabb64432019-10-22 13:58:29 +09003866 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003867 copyCmds := apexRule.Args["copy_commands"]
3868
3869 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3870}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003871
Jooyung Han91df2082019-11-20 01:49:42 +09003872func TestApexInVariousPartition(t *testing.T) {
3873 testcases := []struct {
3874 propName, parition, flattenedPartition string
3875 }{
3876 {"", "system", "system_ext"},
3877 {"product_specific: true", "product", "product"},
3878 {"soc_specific: true", "vendor", "vendor"},
3879 {"proprietary: true", "vendor", "vendor"},
3880 {"vendor: true", "vendor", "vendor"},
3881 {"system_ext_specific: true", "system_ext", "system_ext"},
3882 }
3883 for _, tc := range testcases {
3884 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3885 ctx, _ := testApex(t, `
3886 apex {
3887 name: "myapex",
3888 key: "myapex.key",
3889 `+tc.propName+`
3890 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003891
Jooyung Han91df2082019-11-20 01:49:42 +09003892 apex_key {
3893 name: "myapex.key",
3894 public_key: "testkey.avbpubkey",
3895 private_key: "testkey.pem",
3896 }
3897 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003898
Jooyung Han91df2082019-11-20 01:49:42 +09003899 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3900 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3901 actual := apex.installDir.String()
3902 if actual != expected {
3903 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3904 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003905
Jooyung Han91df2082019-11-20 01:49:42 +09003906 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3907 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3908 actual = flattened.installDir.String()
3909 if actual != expected {
3910 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3911 }
3912 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003913 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003914}
Jiyong Park67882562019-03-21 01:11:21 +09003915
Jooyung Han580eb4f2020-06-24 19:33:06 +09003916func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003917 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003918 apex {
3919 name: "myapex",
3920 key: "myapex.key",
3921 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003922
Jooyung Han580eb4f2020-06-24 19:33:06 +09003923 apex_key {
3924 name: "myapex.key",
3925 public_key: "testkey.avbpubkey",
3926 private_key: "testkey.pem",
3927 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003928 `)
3929 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003930 rule := module.Output("file_contexts")
3931 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3932}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003933
Jooyung Han580eb4f2020-06-24 19:33:06 +09003934func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003935 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003936 apex {
3937 name: "myapex",
3938 key: "myapex.key",
3939 file_contexts: "my_own_file_contexts",
3940 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003941
Jooyung Han580eb4f2020-06-24 19:33:06 +09003942 apex_key {
3943 name: "myapex.key",
3944 public_key: "testkey.avbpubkey",
3945 private_key: "testkey.pem",
3946 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003947 `, withFiles(map[string][]byte{
3948 "my_own_file_contexts": nil,
3949 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003950}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003951
Jooyung Han580eb4f2020-06-24 19:33:06 +09003952func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003953 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003954 apex {
3955 name: "myapex",
3956 key: "myapex.key",
3957 product_specific: true,
3958 file_contexts: "product_specific_file_contexts",
3959 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003960
Jooyung Han580eb4f2020-06-24 19:33:06 +09003961 apex_key {
3962 name: "myapex.key",
3963 public_key: "testkey.avbpubkey",
3964 private_key: "testkey.pem",
3965 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003966 `)
3967
Jooyung Han580eb4f2020-06-24 19:33:06 +09003968 ctx, _ := testApex(t, `
3969 apex {
3970 name: "myapex",
3971 key: "myapex.key",
3972 product_specific: true,
3973 file_contexts: "product_specific_file_contexts",
3974 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003975
Jooyung Han580eb4f2020-06-24 19:33:06 +09003976 apex_key {
3977 name: "myapex.key",
3978 public_key: "testkey.avbpubkey",
3979 private_key: "testkey.pem",
3980 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003981 `, withFiles(map[string][]byte{
3982 "product_specific_file_contexts": nil,
3983 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003984 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3985 rule := module.Output("file_contexts")
3986 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3987}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003988
Jooyung Han580eb4f2020-06-24 19:33:06 +09003989func TestFileContexts_SetViaFileGroup(t *testing.T) {
3990 ctx, _ := testApex(t, `
3991 apex {
3992 name: "myapex",
3993 key: "myapex.key",
3994 product_specific: true,
3995 file_contexts: ":my-file-contexts",
3996 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003997
Jooyung Han580eb4f2020-06-24 19:33:06 +09003998 apex_key {
3999 name: "myapex.key",
4000 public_key: "testkey.avbpubkey",
4001 private_key: "testkey.pem",
4002 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004003
Jooyung Han580eb4f2020-06-24 19:33:06 +09004004 filegroup {
4005 name: "my-file-contexts",
4006 srcs: ["product_specific_file_contexts"],
4007 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004008 `, withFiles(map[string][]byte{
4009 "product_specific_file_contexts": nil,
4010 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004011 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4012 rule := module.Output("file_contexts")
4013 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004014}
4015
Jiyong Park67882562019-03-21 01:11:21 +09004016func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004017 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004018 apex_key {
4019 name: "myapex.key",
4020 public_key: ":my.avbpubkey",
4021 private_key: ":my.pem",
4022 product_specific: true,
4023 }
4024
4025 filegroup {
4026 name: "my.avbpubkey",
4027 srcs: ["testkey2.avbpubkey"],
4028 }
4029
4030 filegroup {
4031 name: "my.pem",
4032 srcs: ["testkey2.pem"],
4033 }
4034 `)
4035
4036 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4037 expected_pubkey := "testkey2.avbpubkey"
4038 actual_pubkey := apex_key.public_key_file.String()
4039 if actual_pubkey != expected_pubkey {
4040 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4041 }
4042 expected_privkey := "testkey2.pem"
4043 actual_privkey := apex_key.private_key_file.String()
4044 if actual_privkey != expected_privkey {
4045 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4046 }
4047}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004048
4049func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004050 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004051 prebuilt_apex {
4052 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004053 arch: {
4054 arm64: {
4055 src: "myapex-arm64.apex",
4056 },
4057 arm: {
4058 src: "myapex-arm.apex",
4059 },
4060 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004061 }
4062 `)
4063
4064 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4065
Jiyong Parkc95714e2019-03-29 14:23:10 +09004066 expectedInput := "myapex-arm64.apex"
4067 if prebuilt.inputApex.String() != expectedInput {
4068 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4069 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004070}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004071
4072func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004073 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004074 prebuilt_apex {
4075 name: "myapex",
4076 src: "myapex-arm.apex",
4077 filename: "notmyapex.apex",
4078 }
4079 `)
4080
4081 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4082
4083 expected := "notmyapex.apex"
4084 if p.installFilename != expected {
4085 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4086 }
4087}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004088
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004089func TestPrebuiltOverrides(t *testing.T) {
4090 ctx, config := testApex(t, `
4091 prebuilt_apex {
4092 name: "myapex.prebuilt",
4093 src: "myapex-arm.apex",
4094 overrides: [
4095 "myapex",
4096 ],
4097 }
4098 `)
4099
4100 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4101
4102 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09004103 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004104 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004105 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004106 }
4107}
4108
Roland Levillain630846d2019-06-26 12:48:34 +01004109func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004110 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004111 apex_test {
4112 name: "myapex",
4113 key: "myapex.key",
4114 tests: [
4115 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004116 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004117 ],
4118 }
4119
4120 apex_key {
4121 name: "myapex.key",
4122 public_key: "testkey.avbpubkey",
4123 private_key: "testkey.pem",
4124 }
4125
Liz Kammer1c14a212020-05-12 15:26:55 -07004126 filegroup {
4127 name: "fg",
4128 srcs: [
4129 "baz",
4130 "bar/baz"
4131 ],
4132 }
4133
Roland Levillain630846d2019-06-26 12:48:34 +01004134 cc_test {
4135 name: "mytest",
4136 gtest: false,
4137 srcs: ["mytest.cpp"],
4138 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004139 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004140 system_shared_libs: [],
4141 static_executable: true,
4142 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004143 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004144 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004145
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004146 cc_library {
4147 name: "mylib",
4148 srcs: ["mylib.cpp"],
4149 system_shared_libs: [],
4150 stl: "none",
4151 }
4152
Liz Kammer5bd365f2020-05-27 15:15:11 -07004153 filegroup {
4154 name: "fg2",
4155 srcs: [
4156 "testdata/baz"
4157 ],
4158 }
4159
Roland Levillain9b5fde92019-06-28 15:41:19 +01004160 cc_test {
4161 name: "mytests",
4162 gtest: false,
4163 srcs: [
4164 "mytest1.cpp",
4165 "mytest2.cpp",
4166 "mytest3.cpp",
4167 ],
4168 test_per_src: true,
4169 relative_install_path: "test",
4170 system_shared_libs: [],
4171 static_executable: true,
4172 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004173 data: [
4174 ":fg",
4175 ":fg2",
4176 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004177 }
Roland Levillain630846d2019-06-26 12:48:34 +01004178 `)
4179
Sundong Ahnabb64432019-10-22 13:58:29 +09004180 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004181 copyCmds := apexRule.Args["copy_commands"]
4182
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004183 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004184 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004185 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004186
Liz Kammer1c14a212020-05-12 15:26:55 -07004187 //Ensure that test data are copied into apex.
4188 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4189 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4190
Roland Levillain9b5fde92019-06-28 15:41:19 +01004191 // Ensure that test deps built with `test_per_src` are copied into apex.
4192 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4193 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4194 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004195
4196 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004197 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4198 data := android.AndroidMkDataForTest(t, config, "", bundle)
4199 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004200 prefix := "TARGET_"
4201 var builder strings.Builder
4202 data.Custom(&builder, name, prefix, "", data)
4203 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004204 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4205 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4206 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4207 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004208 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004209 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004210 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004211
4212 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4213 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4214 data.Custom(&builder, name, prefix, "", data)
4215 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004216 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4217 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004218}
4219
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004220func TestInstallExtraFlattenedApexes(t *testing.T) {
4221 ctx, config := testApex(t, `
4222 apex {
4223 name: "myapex",
4224 key: "myapex.key",
4225 }
4226 apex_key {
4227 name: "myapex.key",
4228 public_key: "testkey.avbpubkey",
4229 private_key: "testkey.pem",
4230 }
4231 `, func(fs map[string][]byte, config android.Config) {
4232 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4233 })
4234 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004235 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004236 mk := android.AndroidMkDataForTest(t, config, "", ab)
4237 var builder strings.Builder
4238 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4239 androidMk := builder.String()
4240 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4241}
4242
Jooyung Hand48f3c32019-08-23 11:18:57 +09004243func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4244 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4245 apex {
4246 name: "myapex",
4247 key: "myapex.key",
4248 native_shared_libs: ["libfoo"],
4249 }
4250
4251 apex_key {
4252 name: "myapex.key",
4253 public_key: "testkey.avbpubkey",
4254 private_key: "testkey.pem",
4255 }
4256
4257 cc_library {
4258 name: "libfoo",
4259 stl: "none",
4260 system_shared_libs: [],
4261 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004262 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004263 }
4264 `)
4265 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4266 apex {
4267 name: "myapex",
4268 key: "myapex.key",
4269 java_libs: ["myjar"],
4270 }
4271
4272 apex_key {
4273 name: "myapex.key",
4274 public_key: "testkey.avbpubkey",
4275 private_key: "testkey.pem",
4276 }
4277
4278 java_library {
4279 name: "myjar",
4280 srcs: ["foo/bar/MyClass.java"],
4281 sdk_version: "none",
4282 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004283 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004284 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004285 }
4286 `)
4287}
4288
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004289func TestApexWithApps(t *testing.T) {
4290 ctx, _ := testApex(t, `
4291 apex {
4292 name: "myapex",
4293 key: "myapex.key",
4294 apps: [
4295 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004296 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004297 ],
4298 }
4299
4300 apex_key {
4301 name: "myapex.key",
4302 public_key: "testkey.avbpubkey",
4303 private_key: "testkey.pem",
4304 }
4305
4306 android_app {
4307 name: "AppFoo",
4308 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004309 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004310 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004311 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004312 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004313 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004314 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004315
4316 android_app {
4317 name: "AppFooPriv",
4318 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004319 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004320 system_modules: "none",
4321 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004322 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004323 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004324 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004325
4326 cc_library_shared {
4327 name: "libjni",
4328 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004329 shared_libs: ["libfoo"],
4330 stl: "none",
4331 system_shared_libs: [],
4332 apex_available: [ "myapex" ],
4333 sdk_version: "current",
4334 }
4335
4336 cc_library_shared {
4337 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004338 stl: "none",
4339 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004340 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004341 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004342 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004343 `)
4344
Sundong Ahnabb64432019-10-22 13:58:29 +09004345 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004346 apexRule := module.Rule("apexRule")
4347 copyCmds := apexRule.Args["copy_commands"]
4348
4349 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004350 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004351
Colin Crossaede88c2020-08-11 12:17:01 -07004352 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004353 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004354 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004355 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004356 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004357 // JNI libraries including transitive deps are
4358 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004359 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004360 // ... embedded inside APK (jnilibs.zip)
4361 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4362 // ... and not directly inside the APEX
4363 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4364 }
Dario Frenicde2a032019-10-27 00:29:22 +01004365}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004366
Dario Frenicde2a032019-10-27 00:29:22 +01004367func TestApexWithAppImports(t *testing.T) {
4368 ctx, _ := testApex(t, `
4369 apex {
4370 name: "myapex",
4371 key: "myapex.key",
4372 apps: [
4373 "AppFooPrebuilt",
4374 "AppFooPrivPrebuilt",
4375 ],
4376 }
4377
4378 apex_key {
4379 name: "myapex.key",
4380 public_key: "testkey.avbpubkey",
4381 private_key: "testkey.pem",
4382 }
4383
4384 android_app_import {
4385 name: "AppFooPrebuilt",
4386 apk: "PrebuiltAppFoo.apk",
4387 presigned: true,
4388 dex_preopt: {
4389 enabled: false,
4390 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004391 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004392 }
4393
4394 android_app_import {
4395 name: "AppFooPrivPrebuilt",
4396 apk: "PrebuiltAppFooPriv.apk",
4397 privileged: true,
4398 presigned: true,
4399 dex_preopt: {
4400 enabled: false,
4401 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004402 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004403 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004404 }
4405 `)
4406
Sundong Ahnabb64432019-10-22 13:58:29 +09004407 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004408 apexRule := module.Rule("apexRule")
4409 copyCmds := apexRule.Args["copy_commands"]
4410
4411 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004412 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4413}
4414
4415func TestApexWithAppImportsPrefer(t *testing.T) {
4416 ctx, _ := testApex(t, `
4417 apex {
4418 name: "myapex",
4419 key: "myapex.key",
4420 apps: [
4421 "AppFoo",
4422 ],
4423 }
4424
4425 apex_key {
4426 name: "myapex.key",
4427 public_key: "testkey.avbpubkey",
4428 private_key: "testkey.pem",
4429 }
4430
4431 android_app {
4432 name: "AppFoo",
4433 srcs: ["foo/bar/MyClass.java"],
4434 sdk_version: "none",
4435 system_modules: "none",
4436 apex_available: [ "myapex" ],
4437 }
4438
4439 android_app_import {
4440 name: "AppFoo",
4441 apk: "AppFooPrebuilt.apk",
4442 filename: "AppFooPrebuilt.apk",
4443 presigned: true,
4444 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004445 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004446 }
4447 `, withFiles(map[string][]byte{
4448 "AppFooPrebuilt.apk": nil,
4449 }))
4450
4451 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4452 "app/AppFoo/AppFooPrebuilt.apk",
4453 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004454}
4455
Dario Freni6f3937c2019-12-20 22:58:03 +00004456func TestApexWithTestHelperApp(t *testing.T) {
4457 ctx, _ := testApex(t, `
4458 apex {
4459 name: "myapex",
4460 key: "myapex.key",
4461 apps: [
4462 "TesterHelpAppFoo",
4463 ],
4464 }
4465
4466 apex_key {
4467 name: "myapex.key",
4468 public_key: "testkey.avbpubkey",
4469 private_key: "testkey.pem",
4470 }
4471
4472 android_test_helper_app {
4473 name: "TesterHelpAppFoo",
4474 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004475 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004476 }
4477
4478 `)
4479
4480 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4481 apexRule := module.Rule("apexRule")
4482 copyCmds := apexRule.Args["copy_commands"]
4483
4484 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4485}
4486
Jooyung Han18020ea2019-11-13 10:50:48 +09004487func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4488 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00004489 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004490 apex {
4491 name: "myapex",
4492 key: "myapex.key",
4493 native_shared_libs: ["libfoo"],
4494 }
4495
4496 apex_key {
4497 name: "myapex.key",
4498 public_key: "testkey.avbpubkey",
4499 private_key: "testkey.pem",
4500 }
4501
4502 apex {
4503 name: "otherapex",
4504 key: "myapex.key",
4505 native_shared_libs: ["libfoo"],
4506 }
4507
4508 cc_defaults {
4509 name: "libfoo-defaults",
4510 apex_available: ["otherapex"],
4511 }
4512
4513 cc_library {
4514 name: "libfoo",
4515 defaults: ["libfoo-defaults"],
4516 stl: "none",
4517 system_shared_libs: [],
4518 }`)
4519}
4520
Paul Duffine52e66f2020-03-30 17:54:29 +01004521func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004522 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00004523 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09004524 apex {
4525 name: "myapex",
4526 key: "myapex.key",
4527 native_shared_libs: ["libfoo"],
4528 }
4529
4530 apex_key {
4531 name: "myapex.key",
4532 public_key: "testkey.avbpubkey",
4533 private_key: "testkey.pem",
4534 }
4535
4536 apex {
4537 name: "otherapex",
4538 key: "otherapex.key",
4539 native_shared_libs: ["libfoo"],
4540 }
4541
4542 apex_key {
4543 name: "otherapex.key",
4544 public_key: "testkey.avbpubkey",
4545 private_key: "testkey.pem",
4546 }
4547
4548 cc_library {
4549 name: "libfoo",
4550 stl: "none",
4551 system_shared_libs: [],
4552 apex_available: ["otherapex"],
4553 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004554}
Jiyong Park127b40b2019-09-30 16:04:35 +09004555
Paul Duffine52e66f2020-03-30 17:54:29 +01004556func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004557 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00004558 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004559.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004560.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004561.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004562.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004563.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004564.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004565 apex {
4566 name: "myapex",
4567 key: "myapex.key",
4568 native_shared_libs: ["libfoo"],
4569 }
4570
4571 apex_key {
4572 name: "myapex.key",
4573 public_key: "testkey.avbpubkey",
4574 private_key: "testkey.pem",
4575 }
4576
Jiyong Park127b40b2019-09-30 16:04:35 +09004577 cc_library {
4578 name: "libfoo",
4579 stl: "none",
4580 shared_libs: ["libbar"],
4581 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004582 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004583 }
4584
4585 cc_library {
4586 name: "libbar",
4587 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004588 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004589 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004590 apex_available: ["myapex"],
4591 }
4592
4593 cc_library {
4594 name: "libbaz",
4595 stl: "none",
4596 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004597 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004598}
Jiyong Park127b40b2019-09-30 16:04:35 +09004599
Paul Duffine52e66f2020-03-30 17:54:29 +01004600func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004601 testApexError(t, "\"otherapex\" is not a valid module name", `
4602 apex {
4603 name: "myapex",
4604 key: "myapex.key",
4605 native_shared_libs: ["libfoo"],
4606 }
4607
4608 apex_key {
4609 name: "myapex.key",
4610 public_key: "testkey.avbpubkey",
4611 private_key: "testkey.pem",
4612 }
4613
4614 cc_library {
4615 name: "libfoo",
4616 stl: "none",
4617 system_shared_libs: [],
4618 apex_available: ["otherapex"],
4619 }`)
4620
Paul Duffine52e66f2020-03-30 17:54:29 +01004621 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004622 apex {
4623 name: "myapex",
4624 key: "myapex.key",
4625 native_shared_libs: ["libfoo", "libbar"],
4626 }
4627
4628 apex_key {
4629 name: "myapex.key",
4630 public_key: "testkey.avbpubkey",
4631 private_key: "testkey.pem",
4632 }
4633
4634 cc_library {
4635 name: "libfoo",
4636 stl: "none",
4637 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004638 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004639 apex_available: ["myapex"],
4640 }
4641
4642 cc_library {
4643 name: "libbar",
4644 stl: "none",
4645 system_shared_libs: [],
4646 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004647 }
4648
4649 cc_library {
4650 name: "libbaz",
4651 stl: "none",
4652 system_shared_libs: [],
4653 stubs: {
4654 versions: ["10", "20", "30"],
4655 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004656 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004657}
Jiyong Park127b40b2019-09-30 16:04:35 +09004658
Jiyong Park89e850a2020-04-07 16:37:39 +09004659func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004660 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004661 apex {
4662 name: "myapex",
4663 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004664 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004665 }
4666
4667 apex_key {
4668 name: "myapex.key",
4669 public_key: "testkey.avbpubkey",
4670 private_key: "testkey.pem",
4671 }
4672
4673 cc_library {
4674 name: "libfoo",
4675 stl: "none",
4676 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004677 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004678 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004679 }
4680
4681 cc_library {
4682 name: "libfoo2",
4683 stl: "none",
4684 system_shared_libs: [],
4685 shared_libs: ["libbaz"],
4686 apex_available: ["//apex_available:platform"],
4687 }
4688
4689 cc_library {
4690 name: "libbar",
4691 stl: "none",
4692 system_shared_libs: [],
4693 apex_available: ["myapex"],
4694 }
4695
4696 cc_library {
4697 name: "libbaz",
4698 stl: "none",
4699 system_shared_libs: [],
4700 apex_available: ["myapex"],
4701 stubs: {
4702 versions: ["1"],
4703 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004704 }`)
4705
Jiyong Park89e850a2020-04-07 16:37:39 +09004706 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4707 // because it depends on libbar which isn't available to platform
4708 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4709 if libfoo.NotAvailableForPlatform() != true {
4710 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4711 }
4712
4713 // libfoo2 however can be available to platform because it depends on libbaz which provides
4714 // stubs
4715 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4716 if libfoo2.NotAvailableForPlatform() == true {
4717 t.Errorf("%q should be available to platform", libfoo2.String())
4718 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004719}
Jiyong Parka90ca002019-10-07 15:47:24 +09004720
Paul Duffine52e66f2020-03-30 17:54:29 +01004721func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004722 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004723 apex {
4724 name: "myapex",
4725 key: "myapex.key",
4726 native_shared_libs: ["libfoo"],
4727 }
4728
4729 apex_key {
4730 name: "myapex.key",
4731 public_key: "testkey.avbpubkey",
4732 private_key: "testkey.pem",
4733 }
4734
4735 cc_library {
4736 name: "libfoo",
4737 stl: "none",
4738 system_shared_libs: [],
4739 apex_available: ["myapex"],
4740 static: {
4741 apex_available: ["//apex_available:platform"],
4742 },
4743 }`)
4744
Jiyong Park89e850a2020-04-07 16:37:39 +09004745 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4746 if libfooShared.NotAvailableForPlatform() != true {
4747 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4748 }
4749 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4750 if libfooStatic.NotAvailableForPlatform() != false {
4751 t.Errorf("%q should be available to platform", libfooStatic.String())
4752 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004753}
4754
Jiyong Park5d790c32019-11-15 18:40:32 +09004755func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004756 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004757 apex {
4758 name: "myapex",
4759 key: "myapex.key",
4760 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004761 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004762 }
4763
4764 override_apex {
4765 name: "override_myapex",
4766 base: "myapex",
4767 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004768 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004769 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004770 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004771 }
4772
4773 apex_key {
4774 name: "myapex.key",
4775 public_key: "testkey.avbpubkey",
4776 private_key: "testkey.pem",
4777 }
4778
4779 android_app {
4780 name: "app",
4781 srcs: ["foo/bar/MyClass.java"],
4782 package_name: "foo",
4783 sdk_version: "none",
4784 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004785 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004786 }
4787
4788 override_android_app {
4789 name: "override_app",
4790 base: "app",
4791 package_name: "bar",
4792 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004793 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004794
Jiyong Park317645e2019-12-05 13:20:58 +09004795 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4796 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4797 if originalVariant.GetOverriddenBy() != "" {
4798 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4799 }
4800 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4801 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4802 }
4803
Jiyong Park5d790c32019-11-15 18:40:32 +09004804 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4805 apexRule := module.Rule("apexRule")
4806 copyCmds := apexRule.Args["copy_commands"]
4807
4808 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004809 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004810
4811 apexBundle := module.Module().(*apexBundle)
4812 name := apexBundle.Name()
4813 if name != "override_myapex" {
4814 t.Errorf("name should be \"override_myapex\", but was %q", name)
4815 }
4816
Baligh Uddin004d7172020-02-19 21:29:28 -08004817 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4818 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4819 }
4820
Jiyong Park20bacab2020-03-03 11:45:41 +09004821 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004822 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004823
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004824 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4825 var builder strings.Builder
4826 data.Custom(&builder, name, "TARGET_", "", data)
4827 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004828 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004829 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4830 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004831 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004832 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004833 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004834 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4835 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004836}
4837
Jooyung Han214bf372019-11-12 13:03:50 +09004838func TestLegacyAndroid10Support(t *testing.T) {
4839 ctx, _ := testApex(t, `
4840 apex {
4841 name: "myapex",
4842 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004843 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004844 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004845 }
4846
4847 apex_key {
4848 name: "myapex.key",
4849 public_key: "testkey.avbpubkey",
4850 private_key: "testkey.pem",
4851 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004852
4853 cc_library {
4854 name: "mylib",
4855 srcs: ["mylib.cpp"],
4856 stl: "libc++",
4857 system_shared_libs: [],
4858 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004859 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004860 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004861 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004862
4863 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4864 args := module.Rule("apexRule").Args
4865 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004866 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004867
4868 // The copies of the libraries in the apex should have one more dependency than
4869 // the ones outside the apex, namely the unwinder. Ideally we should check
4870 // the dependency names directly here but for some reason the names are blank in
4871 // this test.
4872 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004873 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004874 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4875 if len(apexImplicits) != len(nonApexImplicits)+1 {
4876 t.Errorf("%q missing unwinder dep", lib)
4877 }
4878 }
Jooyung Han214bf372019-11-12 13:03:50 +09004879}
4880
Paul Duffin9b879592020-05-26 13:21:35 +01004881var filesForSdkLibrary = map[string][]byte{
4882 "api/current.txt": nil,
4883 "api/removed.txt": nil,
4884 "api/system-current.txt": nil,
4885 "api/system-removed.txt": nil,
4886 "api/test-current.txt": nil,
4887 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004888
4889 // For java_sdk_library_import
4890 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004891}
4892
Jooyung Han58f26ab2019-12-18 15:34:32 +09004893func TestJavaSDKLibrary(t *testing.T) {
4894 ctx, _ := testApex(t, `
4895 apex {
4896 name: "myapex",
4897 key: "myapex.key",
4898 java_libs: ["foo"],
4899 }
4900
4901 apex_key {
4902 name: "myapex.key",
4903 public_key: "testkey.avbpubkey",
4904 private_key: "testkey.pem",
4905 }
4906
4907 java_sdk_library {
4908 name: "foo",
4909 srcs: ["a.java"],
4910 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004911 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004912 }
Paul Duffin9b879592020-05-26 13:21:35 +01004913 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004914
4915 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004916 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004917 "javalib/foo.jar",
4918 "etc/permissions/foo.xml",
4919 })
4920 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004921 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4922 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004923}
4924
Paul Duffin9b879592020-05-26 13:21:35 +01004925func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4926 ctx, _ := testApex(t, `
4927 apex {
4928 name: "myapex",
4929 key: "myapex.key",
4930 java_libs: ["foo", "bar"],
4931 }
4932
4933 apex_key {
4934 name: "myapex.key",
4935 public_key: "testkey.avbpubkey",
4936 private_key: "testkey.pem",
4937 }
4938
4939 java_sdk_library {
4940 name: "foo",
4941 srcs: ["a.java"],
4942 api_packages: ["foo"],
4943 apex_available: ["myapex"],
4944 sdk_version: "none",
4945 system_modules: "none",
4946 }
4947
4948 java_library {
4949 name: "bar",
4950 srcs: ["a.java"],
4951 libs: ["foo"],
4952 apex_available: ["myapex"],
4953 sdk_version: "none",
4954 system_modules: "none",
4955 }
4956 `, withFiles(filesForSdkLibrary))
4957
4958 // java_sdk_library installs both impl jar and permission XML
4959 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4960 "javalib/bar.jar",
4961 "javalib/foo.jar",
4962 "etc/permissions/foo.xml",
4963 })
4964
4965 // The bar library should depend on the implementation jar.
4966 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4967 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4968 t.Errorf("expected %q, found %#q", expected, actual)
4969 }
4970}
4971
4972func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4973 ctx, _ := testApex(t, `
4974 apex {
4975 name: "myapex",
4976 key: "myapex.key",
4977 java_libs: ["foo"],
4978 }
4979
4980 apex_key {
4981 name: "myapex.key",
4982 public_key: "testkey.avbpubkey",
4983 private_key: "testkey.pem",
4984 }
4985
4986 java_sdk_library {
4987 name: "foo",
4988 srcs: ["a.java"],
4989 api_packages: ["foo"],
4990 apex_available: ["myapex"],
4991 sdk_version: "none",
4992 system_modules: "none",
4993 }
4994
4995 java_library {
4996 name: "bar",
4997 srcs: ["a.java"],
4998 libs: ["foo"],
4999 sdk_version: "none",
5000 system_modules: "none",
5001 }
5002 `, withFiles(filesForSdkLibrary))
5003
5004 // java_sdk_library installs both impl jar and permission XML
5005 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5006 "javalib/foo.jar",
5007 "etc/permissions/foo.xml",
5008 })
5009
5010 // The bar library should depend on the stubs jar.
5011 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5012 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5013 t.Errorf("expected %q, found %#q", expected, actual)
5014 }
5015}
5016
Paul Duffineedc5d52020-06-12 17:46:39 +01005017func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
5018 ctx, _ := testApex(t, ``,
5019 withFiles(map[string][]byte{
5020 "apex/a.java": nil,
5021 "apex/apex_manifest.json": nil,
5022 "apex/Android.bp": []byte(`
5023 package {
5024 default_visibility: ["//visibility:private"],
5025 }
5026
5027 apex {
5028 name: "myapex",
5029 key: "myapex.key",
5030 java_libs: ["foo", "bar"],
5031 }
5032
5033 apex_key {
5034 name: "myapex.key",
5035 public_key: "testkey.avbpubkey",
5036 private_key: "testkey.pem",
5037 }
5038
5039 java_library {
5040 name: "bar",
5041 srcs: ["a.java"],
5042 libs: ["foo"],
5043 apex_available: ["myapex"],
5044 sdk_version: "none",
5045 system_modules: "none",
5046 }
5047`),
5048 "source/a.java": nil,
5049 "source/api/current.txt": nil,
5050 "source/api/removed.txt": nil,
5051 "source/Android.bp": []byte(`
5052 package {
5053 default_visibility: ["//visibility:private"],
5054 }
5055
5056 java_sdk_library {
5057 name: "foo",
5058 visibility: ["//apex"],
5059 srcs: ["a.java"],
5060 api_packages: ["foo"],
5061 apex_available: ["myapex"],
5062 sdk_version: "none",
5063 system_modules: "none",
5064 public: {
5065 enabled: true,
5066 },
5067 }
5068`),
5069 "prebuilt/a.jar": nil,
5070 "prebuilt/Android.bp": []byte(`
5071 package {
5072 default_visibility: ["//visibility:private"],
5073 }
5074
5075 java_sdk_library_import {
5076 name: "foo",
5077 visibility: ["//apex", "//source"],
5078 apex_available: ["myapex"],
5079 prefer: true,
5080 public: {
5081 jars: ["a.jar"],
5082 },
5083 }
5084`),
5085 }),
5086 )
5087
5088 // java_sdk_library installs both impl jar and permission XML
5089 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5090 "javalib/bar.jar",
5091 "javalib/foo.jar",
5092 "etc/permissions/foo.xml",
5093 })
5094
5095 // The bar library should depend on the implementation jar.
5096 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5097 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5098 t.Errorf("expected %q, found %#q", expected, actual)
5099 }
5100}
5101
5102func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5103 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5104 apex {
5105 name: "myapex",
5106 key: "myapex.key",
5107 java_libs: ["foo"],
5108 }
5109
5110 apex_key {
5111 name: "myapex.key",
5112 public_key: "testkey.avbpubkey",
5113 private_key: "testkey.pem",
5114 }
5115
5116 java_sdk_library_import {
5117 name: "foo",
5118 apex_available: ["myapex"],
5119 prefer: true,
5120 public: {
5121 jars: ["a.jar"],
5122 },
5123 }
5124
5125 `, withFiles(filesForSdkLibrary))
5126}
5127
atrost6e126252020-01-27 17:01:16 +00005128func TestCompatConfig(t *testing.T) {
5129 ctx, _ := testApex(t, `
5130 apex {
5131 name: "myapex",
5132 key: "myapex.key",
5133 prebuilts: ["myjar-platform-compat-config"],
5134 java_libs: ["myjar"],
5135 }
5136
5137 apex_key {
5138 name: "myapex.key",
5139 public_key: "testkey.avbpubkey",
5140 private_key: "testkey.pem",
5141 }
5142
5143 platform_compat_config {
5144 name: "myjar-platform-compat-config",
5145 src: ":myjar",
5146 }
5147
5148 java_library {
5149 name: "myjar",
5150 srcs: ["foo/bar/MyClass.java"],
5151 sdk_version: "none",
5152 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005153 apex_available: [ "myapex" ],
5154 }
5155 `)
5156 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5157 "etc/compatconfig/myjar-platform-compat-config.xml",
5158 "javalib/myjar.jar",
5159 })
5160}
5161
Jiyong Park479321d2019-12-16 11:47:12 +09005162func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5163 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5164 apex {
5165 name: "myapex",
5166 key: "myapex.key",
5167 java_libs: ["myjar"],
5168 }
5169
5170 apex_key {
5171 name: "myapex.key",
5172 public_key: "testkey.avbpubkey",
5173 private_key: "testkey.pem",
5174 }
5175
5176 java_library {
5177 name: "myjar",
5178 srcs: ["foo/bar/MyClass.java"],
5179 sdk_version: "none",
5180 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005181 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005182 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005183 }
5184 `)
5185}
5186
Jiyong Park7afd1072019-12-30 16:56:33 +09005187func TestCarryRequiredModuleNames(t *testing.T) {
5188 ctx, config := testApex(t, `
5189 apex {
5190 name: "myapex",
5191 key: "myapex.key",
5192 native_shared_libs: ["mylib"],
5193 }
5194
5195 apex_key {
5196 name: "myapex.key",
5197 public_key: "testkey.avbpubkey",
5198 private_key: "testkey.pem",
5199 }
5200
5201 cc_library {
5202 name: "mylib",
5203 srcs: ["mylib.cpp"],
5204 system_shared_libs: [],
5205 stl: "none",
5206 required: ["a", "b"],
5207 host_required: ["c", "d"],
5208 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005209 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005210 }
5211 `)
5212
5213 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5214 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5215 name := apexBundle.BaseModuleName()
5216 prefix := "TARGET_"
5217 var builder strings.Builder
5218 data.Custom(&builder, name, prefix, "", data)
5219 androidMk := builder.String()
5220 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5221 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5222 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5223}
5224
Jiyong Park7cd10e32020-01-14 09:22:18 +09005225func TestSymlinksFromApexToSystem(t *testing.T) {
5226 bp := `
5227 apex {
5228 name: "myapex",
5229 key: "myapex.key",
5230 native_shared_libs: ["mylib"],
5231 java_libs: ["myjar"],
5232 }
5233
Jiyong Park9d677202020-02-19 16:29:35 +09005234 apex {
5235 name: "myapex.updatable",
5236 key: "myapex.key",
5237 native_shared_libs: ["mylib"],
5238 java_libs: ["myjar"],
5239 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005240 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005241 }
5242
Jiyong Park7cd10e32020-01-14 09:22:18 +09005243 apex_key {
5244 name: "myapex.key",
5245 public_key: "testkey.avbpubkey",
5246 private_key: "testkey.pem",
5247 }
5248
5249 cc_library {
5250 name: "mylib",
5251 srcs: ["mylib.cpp"],
5252 shared_libs: ["myotherlib"],
5253 system_shared_libs: [],
5254 stl: "none",
5255 apex_available: [
5256 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005257 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005258 "//apex_available:platform",
5259 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005260 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005261 }
5262
5263 cc_library {
5264 name: "myotherlib",
5265 srcs: ["mylib.cpp"],
5266 system_shared_libs: [],
5267 stl: "none",
5268 apex_available: [
5269 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005270 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005271 "//apex_available:platform",
5272 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005273 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005274 }
5275
5276 java_library {
5277 name: "myjar",
5278 srcs: ["foo/bar/MyClass.java"],
5279 sdk_version: "none",
5280 system_modules: "none",
5281 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005282 apex_available: [
5283 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005284 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005285 "//apex_available:platform",
5286 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005287 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005288 }
5289
5290 java_library {
5291 name: "myotherjar",
5292 srcs: ["foo/bar/MyClass.java"],
5293 sdk_version: "none",
5294 system_modules: "none",
5295 apex_available: [
5296 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005297 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005298 "//apex_available:platform",
5299 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005300 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005301 }
5302 `
5303
5304 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5305 for _, f := range files {
5306 if f.path == file {
5307 if f.isLink {
5308 t.Errorf("%q is not a real file", file)
5309 }
5310 return
5311 }
5312 }
5313 t.Errorf("%q is not found", file)
5314 }
5315
5316 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5317 for _, f := range files {
5318 if f.path == file {
5319 if !f.isLink {
5320 t.Errorf("%q is not a symlink", file)
5321 }
5322 return
5323 }
5324 }
5325 t.Errorf("%q is not found", file)
5326 }
5327
Jiyong Park9d677202020-02-19 16:29:35 +09005328 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5329 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005330 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005331 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005332 ensureRealfileExists(t, files, "javalib/myjar.jar")
5333 ensureRealfileExists(t, files, "lib64/mylib.so")
5334 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5335
Jiyong Park9d677202020-02-19 16:29:35 +09005336 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5337 ensureRealfileExists(t, files, "javalib/myjar.jar")
5338 ensureRealfileExists(t, files, "lib64/mylib.so")
5339 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5340
5341 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005342 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005343 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005344 ensureRealfileExists(t, files, "javalib/myjar.jar")
5345 ensureRealfileExists(t, files, "lib64/mylib.so")
5346 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005347
5348 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5349 ensureRealfileExists(t, files, "javalib/myjar.jar")
5350 ensureRealfileExists(t, files, "lib64/mylib.so")
5351 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005352}
5353
Yo Chiange8128052020-07-23 20:09:18 +08005354func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5355 ctx, config := testApex(t, `
5356 apex {
5357 name: "myapex",
5358 key: "myapex.key",
5359 native_shared_libs: ["mylib"],
5360 }
5361
5362 apex_key {
5363 name: "myapex.key",
5364 public_key: "testkey.avbpubkey",
5365 private_key: "testkey.pem",
5366 }
5367
5368 cc_library_shared {
5369 name: "mylib",
5370 srcs: ["mylib.cpp"],
5371 shared_libs: ["myotherlib"],
5372 system_shared_libs: [],
5373 stl: "none",
5374 apex_available: [
5375 "myapex",
5376 "//apex_available:platform",
5377 ],
5378 }
5379
5380 cc_prebuilt_library_shared {
5381 name: "myotherlib",
5382 srcs: ["prebuilt.so"],
5383 system_shared_libs: [],
5384 stl: "none",
5385 apex_available: [
5386 "myapex",
5387 "//apex_available:platform",
5388 ],
5389 }
5390 `)
5391
5392 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5393 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5394 var builder strings.Builder
5395 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5396 androidMk := builder.String()
5397 // `myotherlib` is added to `myapex` as symlink
5398 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5399 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5400 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5401 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5402 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5403}
5404
Jooyung Han643adc42020-02-27 13:50:06 +09005405func TestApexWithJniLibs(t *testing.T) {
5406 ctx, _ := testApex(t, `
5407 apex {
5408 name: "myapex",
5409 key: "myapex.key",
5410 jni_libs: ["mylib"],
5411 }
5412
5413 apex_key {
5414 name: "myapex.key",
5415 public_key: "testkey.avbpubkey",
5416 private_key: "testkey.pem",
5417 }
5418
5419 cc_library {
5420 name: "mylib",
5421 srcs: ["mylib.cpp"],
5422 shared_libs: ["mylib2"],
5423 system_shared_libs: [],
5424 stl: "none",
5425 apex_available: [ "myapex" ],
5426 }
5427
5428 cc_library {
5429 name: "mylib2",
5430 srcs: ["mylib.cpp"],
5431 system_shared_libs: [],
5432 stl: "none",
5433 apex_available: [ "myapex" ],
5434 }
5435 `)
5436
5437 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5438 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5439 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5440 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5441 "lib64/mylib.so",
5442 "lib64/mylib2.so",
5443 })
5444}
5445
Jooyung Han49f67012020-04-17 13:43:10 +09005446func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5447 ctx, _ := testApex(t, `
5448 apex {
5449 name: "myapex",
5450 key: "myapex.key",
5451 }
5452 apex_key {
5453 name: "myapex.key",
5454 public_key: "testkey.avbpubkey",
5455 private_key: "testkey.pem",
5456 }
5457 `, func(fs map[string][]byte, config android.Config) {
5458 delete(config.Targets, android.Android)
5459 config.AndroidCommonTarget = android.Target{}
5460 })
5461
5462 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5463 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5464 }
5465}
5466
Jiyong Parkbd159612020-02-28 15:22:21 +09005467func TestAppBundle(t *testing.T) {
5468 ctx, _ := testApex(t, `
5469 apex {
5470 name: "myapex",
5471 key: "myapex.key",
5472 apps: ["AppFoo"],
5473 }
5474
5475 apex_key {
5476 name: "myapex.key",
5477 public_key: "testkey.avbpubkey",
5478 private_key: "testkey.pem",
5479 }
5480
5481 android_app {
5482 name: "AppFoo",
5483 srcs: ["foo/bar/MyClass.java"],
5484 sdk_version: "none",
5485 system_modules: "none",
5486 apex_available: [ "myapex" ],
5487 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005488 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005489
Colin Crosscf371cc2020-11-13 11:48:42 -08005490 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09005491 content := bundleConfigRule.Args["content"]
5492
5493 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005494 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 +09005495}
5496
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005497func TestAppSetBundle(t *testing.T) {
5498 ctx, _ := testApex(t, `
5499 apex {
5500 name: "myapex",
5501 key: "myapex.key",
5502 apps: ["AppSet"],
5503 }
5504
5505 apex_key {
5506 name: "myapex.key",
5507 public_key: "testkey.avbpubkey",
5508 private_key: "testkey.pem",
5509 }
5510
5511 android_app_set {
5512 name: "AppSet",
5513 set: "AppSet.apks",
5514 }`)
5515 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08005516 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005517 content := bundleConfigRule.Args["content"]
5518 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5519 s := mod.Rule("apexRule").Args["copy_commands"]
5520 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5521 if len(copyCmds) != 3 {
5522 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5523 }
5524 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5525 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5526 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5527}
5528
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07005529func TestAppSetBundlePrebuilt(t *testing.T) {
5530 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
5531 bp := `
5532 apex_set {
5533 name: "myapex",
5534 filename: "foo_v2.apex",
5535 sanitized: {
5536 none: { set: "myapex.apks", },
5537 hwaddress: { set: "myapex.hwasan.apks", },
5538 },
5539 }`
5540 fs["Android.bp"] = []byte(bp)
5541
5542 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
5543 })
5544
5545 m := ctx.ModuleForTests("myapex", "android_common")
5546 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5547
5548 actual := extractedApex.Inputs
5549 if len(actual) != 1 {
5550 t.Errorf("expected a single input")
5551 }
5552
5553 expected := "myapex.hwasan.apks"
5554 if actual[0].String() != expected {
5555 t.Errorf("expected %s, got %s", expected, actual[0].String())
5556 }
5557}
5558
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005559func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005560 t.Helper()
5561
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005562 bp := `
5563 java_library {
5564 name: "some-updatable-apex-lib",
5565 srcs: ["a.java"],
5566 sdk_version: "current",
5567 apex_available: [
5568 "some-updatable-apex",
5569 ],
5570 }
5571
5572 java_library {
5573 name: "some-non-updatable-apex-lib",
5574 srcs: ["a.java"],
5575 apex_available: [
5576 "some-non-updatable-apex",
5577 ],
5578 }
5579
5580 java_library {
5581 name: "some-platform-lib",
5582 srcs: ["a.java"],
5583 sdk_version: "current",
5584 installable: true,
5585 }
5586
5587 java_library {
5588 name: "some-art-lib",
5589 srcs: ["a.java"],
5590 sdk_version: "current",
5591 apex_available: [
5592 "com.android.art.something",
5593 ],
5594 hostdex: true,
5595 }
5596
5597 apex {
5598 name: "some-updatable-apex",
5599 key: "some-updatable-apex.key",
5600 java_libs: ["some-updatable-apex-lib"],
5601 updatable: true,
5602 min_sdk_version: "current",
5603 }
5604
5605 apex {
5606 name: "some-non-updatable-apex",
5607 key: "some-non-updatable-apex.key",
5608 java_libs: ["some-non-updatable-apex-lib"],
5609 }
5610
5611 apex_key {
5612 name: "some-updatable-apex.key",
5613 }
5614
5615 apex_key {
5616 name: "some-non-updatable-apex.key",
5617 }
5618
5619 apex {
5620 name: "com.android.art.something",
5621 key: "com.android.art.something.key",
5622 java_libs: ["some-art-lib"],
5623 updatable: true,
5624 min_sdk_version: "current",
5625 }
5626
5627 apex_key {
5628 name: "com.android.art.something.key",
5629 }
5630
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005631 filegroup {
5632 name: "some-updatable-apex-file_contexts",
5633 srcs: [
5634 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5635 ],
5636 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005637
5638 filegroup {
5639 name: "some-non-updatable-apex-file_contexts",
5640 srcs: [
5641 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5642 ],
5643 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005644 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00005645
5646 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
5647}
5648
5649func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
5650 t.Helper()
5651
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005652 bp += cc.GatherRequiredDepsForTest(android.Android)
5653 bp += java.GatherRequiredDepsForTest()
5654 bp += dexpreopt.BpToolModulesForTest()
5655
5656 fs := map[string][]byte{
5657 "a.java": nil,
5658 "a.jar": nil,
5659 "build/make/target/product/security": nil,
5660 "apex_manifest.json": nil,
5661 "AndroidManifest.xml": nil,
5662 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005663 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005664 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5665 "framework/aidl/a.aidl": nil,
5666 }
5667 cc.GatherRequiredFilesForTest(fs)
5668
Colin Crossae8600b2020-10-29 17:09:13 -07005669 config := android.TestArchConfig(buildDir, nil, bp, fs)
5670
5671 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005672 ctx.RegisterModuleType("apex", BundleFactory)
5673 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5674 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005675 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005676 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005677 cc.RegisterRequiredBuildComponentsForTest(ctx)
5678 java.RegisterJavaBuildComponents(ctx)
5679 java.RegisterSystemModulesBuildComponents(ctx)
5680 java.RegisterAppBuildComponents(ctx)
5681 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005682 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5683 ctx.PreDepsMutators(RegisterPreDepsMutators)
5684 ctx.PostDepsMutators(RegisterPostDepsMutators)
5685
Colin Crossae8600b2020-10-29 17:09:13 -07005686 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005687
5688 _ = dexpreopt.GlobalSoongConfigForTests(config)
5689 dexpreopt.RegisterToolModulesForTest(ctx)
5690 pathCtx := android.PathContextForTesting(config)
5691 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5692 transformDexpreoptConfig(dexpreoptConfig)
5693 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5694
5695 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5696 android.FailIfErrored(t, errs)
5697
5698 _, errs = ctx.PrepareBuildActions(config)
5699 if errmsg == "" {
5700 android.FailIfErrored(t, errs)
5701 } else if len(errs) > 0 {
5702 android.FailIfNoMatchingErrors(t, errmsg, errs)
5703 return
5704 } else {
5705 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5706 }
5707}
5708
Jooyung Han548640b2020-04-27 12:10:30 +09005709func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5710 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5711 apex {
5712 name: "myapex",
5713 key: "myapex.key",
5714 updatable: true,
5715 }
5716
5717 apex_key {
5718 name: "myapex.key",
5719 public_key: "testkey.avbpubkey",
5720 private_key: "testkey.pem",
5721 }
5722 `)
5723}
5724
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005725func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005726 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005727 var transform func(*dexpreopt.GlobalConfig)
5728
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005729 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5730 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005731 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005732 }
5733 testNoUpdatableJarsInBootImage(t, "", transform)
5734 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005735
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005736 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005737 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 +01005738 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005739 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005740 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005741 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005742 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005743
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005744 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 -07005745 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 +01005746 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005747 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005748 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005749 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005750 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005751
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005752 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 -07005753 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005754 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005755 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005756 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005757 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005758 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005759
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005760 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 -07005761 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 +01005762 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005763 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005764 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005765 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005766 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005767
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005768 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5769 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005770 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005771 }
5772 testNoUpdatableJarsInBootImage(t, "", transform)
5773 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005774
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005775 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005776 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005777 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005778 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005779 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005780 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005781 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005782
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005783 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005784 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005785 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005786 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005787 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005788 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005789 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005790
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005791 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005792 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005793 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005794 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005795 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005796 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005797 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005798
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005799 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5800 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005801 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005802 }
5803 testNoUpdatableJarsInBootImage(t, "", transform)
5804 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005805}
5806
Andrei Onea115e7e72020-06-05 21:14:03 +01005807func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5808 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01005809 bp += `
5810 apex_key {
5811 name: "myapex.key",
5812 public_key: "testkey.avbpubkey",
5813 private_key: "testkey.pem",
5814 }`
5815 fs := map[string][]byte{
5816 "lib1/src/A.java": nil,
5817 "lib2/src/B.java": nil,
5818 "system/sepolicy/apex/myapex-file_contexts": nil,
5819 }
5820
Colin Crossae8600b2020-10-29 17:09:13 -07005821 config := android.TestArchConfig(buildDir, nil, bp, fs)
5822 android.SetTestNeverallowRules(config, rules)
5823 updatableBootJars := make([]string, 0, len(apexBootJars))
5824 for _, apexBootJar := range apexBootJars {
5825 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
5826 }
5827 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
5828
5829 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01005830 ctx.RegisterModuleType("apex", BundleFactory)
5831 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5832 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5833 cc.RegisterRequiredBuildComponentsForTest(ctx)
5834 java.RegisterJavaBuildComponents(ctx)
5835 java.RegisterSystemModulesBuildComponents(ctx)
5836 java.RegisterDexpreoptBootJarsComponents(ctx)
5837 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5838 ctx.PreDepsMutators(RegisterPreDepsMutators)
5839 ctx.PostDepsMutators(RegisterPostDepsMutators)
5840 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5841
Colin Crossae8600b2020-10-29 17:09:13 -07005842 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01005843
5844 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5845 android.FailIfErrored(t, errs)
5846
5847 _, errs = ctx.PrepareBuildActions(config)
5848 if errmsg == "" {
5849 android.FailIfErrored(t, errs)
5850 } else if len(errs) > 0 {
5851 android.FailIfNoMatchingErrors(t, errmsg, errs)
5852 return
5853 } else {
5854 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5855 }
5856}
5857
5858func TestApexPermittedPackagesRules(t *testing.T) {
5859 testcases := []struct {
5860 name string
5861 expectedError string
5862 bp string
5863 bootJars []string
5864 modulesPackages map[string][]string
5865 }{
5866
5867 {
5868 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
5869 expectedError: "",
5870 bp: `
5871 java_library {
5872 name: "bcp_lib1",
5873 srcs: ["lib1/src/*.java"],
5874 permitted_packages: ["foo.bar"],
5875 apex_available: ["myapex"],
5876 sdk_version: "none",
5877 system_modules: "none",
5878 }
5879 java_library {
5880 name: "nonbcp_lib2",
5881 srcs: ["lib2/src/*.java"],
5882 apex_available: ["myapex"],
5883 permitted_packages: ["a.b"],
5884 sdk_version: "none",
5885 system_modules: "none",
5886 }
5887 apex {
5888 name: "myapex",
5889 key: "myapex.key",
5890 java_libs: ["bcp_lib1", "nonbcp_lib2"],
5891 }`,
5892 bootJars: []string{"bcp_lib1"},
5893 modulesPackages: map[string][]string{
5894 "myapex": []string{
5895 "foo.bar",
5896 },
5897 },
5898 },
5899 {
5900 name: "Bootclasspath apex jar not satisfying allowed module packages.",
5901 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.`,
5902 bp: `
5903 java_library {
5904 name: "bcp_lib1",
5905 srcs: ["lib1/src/*.java"],
5906 apex_available: ["myapex"],
5907 permitted_packages: ["foo.bar"],
5908 sdk_version: "none",
5909 system_modules: "none",
5910 }
5911 java_library {
5912 name: "bcp_lib2",
5913 srcs: ["lib2/src/*.java"],
5914 apex_available: ["myapex"],
5915 permitted_packages: ["foo.bar", "bar.baz"],
5916 sdk_version: "none",
5917 system_modules: "none",
5918 }
5919 apex {
5920 name: "myapex",
5921 key: "myapex.key",
5922 java_libs: ["bcp_lib1", "bcp_lib2"],
5923 }
5924 `,
5925 bootJars: []string{"bcp_lib1", "bcp_lib2"},
5926 modulesPackages: map[string][]string{
5927 "myapex": []string{
5928 "foo.bar",
5929 },
5930 },
5931 },
5932 }
5933 for _, tc := range testcases {
5934 t.Run(tc.name, func(t *testing.T) {
5935 rules := createApexPermittedPackagesRules(tc.modulesPackages)
5936 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
5937 })
5938 }
5939}
5940
Jiyong Park62304bb2020-04-13 16:19:48 +09005941func TestTestFor(t *testing.T) {
5942 ctx, _ := testApex(t, `
5943 apex {
5944 name: "myapex",
5945 key: "myapex.key",
5946 native_shared_libs: ["mylib", "myprivlib"],
5947 }
5948
5949 apex_key {
5950 name: "myapex.key",
5951 public_key: "testkey.avbpubkey",
5952 private_key: "testkey.pem",
5953 }
5954
5955 cc_library {
5956 name: "mylib",
5957 srcs: ["mylib.cpp"],
5958 system_shared_libs: [],
5959 stl: "none",
5960 stubs: {
5961 versions: ["1"],
5962 },
5963 apex_available: ["myapex"],
5964 }
5965
5966 cc_library {
5967 name: "myprivlib",
5968 srcs: ["mylib.cpp"],
5969 system_shared_libs: [],
5970 stl: "none",
5971 apex_available: ["myapex"],
5972 }
5973
5974
5975 cc_test {
5976 name: "mytest",
5977 gtest: false,
5978 srcs: ["mylib.cpp"],
5979 system_shared_libs: [],
5980 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09005981 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09005982 test_for: ["myapex"]
5983 }
Jiyong Park46a512f2020-12-04 18:02:13 +09005984
5985 cc_library {
5986 name: "mytestlib",
5987 srcs: ["mylib.cpp"],
5988 system_shared_libs: [],
5989 shared_libs: ["mylib", "myprivlib"],
5990 stl: "none",
5991 test_for: ["myapex"],
5992 }
5993
5994 cc_benchmark {
5995 name: "mybench",
5996 srcs: ["mylib.cpp"],
5997 system_shared_libs: [],
5998 shared_libs: ["mylib", "myprivlib"],
5999 stl: "none",
6000 test_for: ["myapex"],
6001 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006002 `)
6003
6004 // the test 'mytest' is a test for the apex, therefore is linked to the
6005 // actual implementation of mylib instead of its stub.
6006 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6007 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6008 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006009
6010 // The same should be true for cc_library
6011 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6012 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6013 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6014
6015 // ... and for cc_benchmark
6016 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6017 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6018 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006019}
6020
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006021// TODO(jungjw): Move this to proptools
6022func intPtr(i int) *int {
6023 return &i
6024}
6025
6026func TestApexSet(t *testing.T) {
6027 ctx, config := testApex(t, `
6028 apex_set {
6029 name: "myapex",
6030 set: "myapex.apks",
6031 filename: "foo_v2.apex",
6032 overrides: ["foo"],
6033 }
6034 `, func(fs map[string][]byte, config android.Config) {
6035 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006036 config.Targets[android.Android] = []android.Target{
6037 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6038 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6039 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006040 })
6041
6042 m := ctx.ModuleForTests("myapex", "android_common")
6043
6044 // Check extract_apks tool parameters.
6045 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6046 actual := extractedApex.Args["abis"]
6047 expected := "ARMEABI_V7A,ARM64_V8A"
6048 if actual != expected {
6049 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6050 }
6051 actual = extractedApex.Args["sdk-version"]
6052 expected = "30"
6053 if actual != expected {
6054 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6055 }
6056
6057 a := m.Module().(*ApexSet)
6058 expectedOverrides := []string{"foo"}
6059 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
6060 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6061 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6062 }
6063}
6064
Jiyong Park7d95a512020-05-10 15:16:24 +09006065func TestNoStaticLinkingToStubsLib(t *testing.T) {
6066 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6067 apex {
6068 name: "myapex",
6069 key: "myapex.key",
6070 native_shared_libs: ["mylib"],
6071 }
6072
6073 apex_key {
6074 name: "myapex.key",
6075 public_key: "testkey.avbpubkey",
6076 private_key: "testkey.pem",
6077 }
6078
6079 cc_library {
6080 name: "mylib",
6081 srcs: ["mylib.cpp"],
6082 static_libs: ["otherlib"],
6083 system_shared_libs: [],
6084 stl: "none",
6085 apex_available: [ "myapex" ],
6086 }
6087
6088 cc_library {
6089 name: "otherlib",
6090 srcs: ["mylib.cpp"],
6091 system_shared_libs: [],
6092 stl: "none",
6093 stubs: {
6094 versions: ["1", "2", "3"],
6095 },
6096 apex_available: [ "myapex" ],
6097 }
6098 `)
6099}
6100
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006101func TestApexKeysTxt(t *testing.T) {
6102 ctx, _ := testApex(t, `
6103 apex {
6104 name: "myapex",
6105 key: "myapex.key",
6106 }
6107
6108 apex_key {
6109 name: "myapex.key",
6110 public_key: "testkey.avbpubkey",
6111 private_key: "testkey.pem",
6112 }
6113
6114 prebuilt_apex {
6115 name: "myapex",
6116 prefer: true,
6117 arch: {
6118 arm64: {
6119 src: "myapex-arm64.apex",
6120 },
6121 arm: {
6122 src: "myapex-arm.apex",
6123 },
6124 },
6125 }
6126
6127 apex_set {
6128 name: "myapex_set",
6129 set: "myapex.apks",
6130 filename: "myapex_set.apex",
6131 overrides: ["myapex"],
6132 }
6133 `)
6134
6135 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6136 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6137 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 +09006138 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 +09006139}
6140
Jooyung Han938b5932020-06-20 12:47:47 +09006141func TestAllowedFiles(t *testing.T) {
6142 ctx, _ := testApex(t, `
6143 apex {
6144 name: "myapex",
6145 key: "myapex.key",
6146 apps: ["app"],
6147 allowed_files: "allowed.txt",
6148 }
6149
6150 apex_key {
6151 name: "myapex.key",
6152 public_key: "testkey.avbpubkey",
6153 private_key: "testkey.pem",
6154 }
6155
6156 android_app {
6157 name: "app",
6158 srcs: ["foo/bar/MyClass.java"],
6159 package_name: "foo",
6160 sdk_version: "none",
6161 system_modules: "none",
6162 apex_available: [ "myapex" ],
6163 }
6164 `, withFiles(map[string][]byte{
6165 "sub/Android.bp": []byte(`
6166 override_apex {
6167 name: "override_myapex",
6168 base: "myapex",
6169 apps: ["override_app"],
6170 allowed_files: ":allowed",
6171 }
6172 // Overridable "path" property should be referenced indirectly
6173 filegroup {
6174 name: "allowed",
6175 srcs: ["allowed.txt"],
6176 }
6177 override_android_app {
6178 name: "override_app",
6179 base: "app",
6180 package_name: "bar",
6181 }
6182 `),
6183 }))
6184
6185 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6186 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6187 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6188 }
6189
6190 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6191 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6192 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6193 }
6194}
6195
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006196func TestNonPreferredPrebuiltDependency(t *testing.T) {
6197 _, _ = testApex(t, `
6198 apex {
6199 name: "myapex",
6200 key: "myapex.key",
6201 native_shared_libs: ["mylib"],
6202 }
6203
6204 apex_key {
6205 name: "myapex.key",
6206 public_key: "testkey.avbpubkey",
6207 private_key: "testkey.pem",
6208 }
6209
6210 cc_library {
6211 name: "mylib",
6212 srcs: ["mylib.cpp"],
6213 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006214 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006215 },
6216 apex_available: ["myapex"],
6217 }
6218
6219 cc_prebuilt_library_shared {
6220 name: "mylib",
6221 prefer: false,
6222 srcs: ["prebuilt.so"],
6223 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006224 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006225 },
6226 apex_available: ["myapex"],
6227 }
6228 `)
6229}
6230
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00006231func TestCompressedApex(t *testing.T) {
6232 ctx, config := testApex(t, `
6233 apex {
6234 name: "myapex",
6235 key: "myapex.key",
6236 compressible: true,
6237 }
6238 apex_key {
6239 name: "myapex.key",
6240 public_key: "testkey.avbpubkey",
6241 private_key: "testkey.pem",
6242 }
6243 `, func(fs map[string][]byte, config android.Config) {
6244 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
6245 })
6246
6247 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
6248 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
6249
6250 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
6251 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
6252
6253 // Make sure output of bundle is .capex
6254 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6255 ensureContains(t, ab.outputFile.String(), "myapex.capex")
6256
6257 // Verify android.mk rules
6258 data := android.AndroidMkDataForTest(t, config, "", ab)
6259 var builder strings.Builder
6260 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6261 androidMk := builder.String()
6262 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
6263}
6264
Martin Stjernholm2856c662020-12-02 15:03:42 +00006265func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
6266 ctx, config := testApex(t, `
6267 apex {
6268 name: "myapex",
6269 key: "myapex.key",
6270 native_shared_libs: ["mylib"],
6271 }
6272
6273 apex_key {
6274 name: "myapex.key",
6275 public_key: "testkey.avbpubkey",
6276 private_key: "testkey.pem",
6277 }
6278
6279 cc_library {
6280 name: "mylib",
6281 srcs: ["mylib.cpp"],
6282 apex_available: ["myapex"],
6283 shared_libs: ["otherlib"],
6284 system_shared_libs: [],
6285 }
6286
6287 cc_library {
6288 name: "otherlib",
6289 srcs: ["mylib.cpp"],
6290 stubs: {
6291 versions: ["current"],
6292 },
6293 }
6294
6295 cc_prebuilt_library_shared {
6296 name: "otherlib",
6297 prefer: true,
6298 srcs: ["prebuilt.so"],
6299 stubs: {
6300 versions: ["current"],
6301 },
6302 }
6303 `)
6304
6305 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
6306 data := android.AndroidMkDataForTest(t, config, "", ab)
6307 var builder strings.Builder
6308 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
6309 androidMk := builder.String()
6310
6311 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
6312 // a thing there.
6313 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
6314}
6315
Jiyong Parke3867542020-12-03 17:28:25 +09006316func TestExcludeDependency(t *testing.T) {
6317 ctx, _ := testApex(t, `
6318 apex {
6319 name: "myapex",
6320 key: "myapex.key",
6321 native_shared_libs: ["mylib"],
6322 }
6323
6324 apex_key {
6325 name: "myapex.key",
6326 public_key: "testkey.avbpubkey",
6327 private_key: "testkey.pem",
6328 }
6329
6330 cc_library {
6331 name: "mylib",
6332 srcs: ["mylib.cpp"],
6333 system_shared_libs: [],
6334 stl: "none",
6335 apex_available: ["myapex"],
6336 shared_libs: ["mylib2"],
6337 target: {
6338 apex: {
6339 exclude_shared_libs: ["mylib2"],
6340 },
6341 },
6342 }
6343
6344 cc_library {
6345 name: "mylib2",
6346 srcs: ["mylib.cpp"],
6347 system_shared_libs: [],
6348 stl: "none",
6349 }
6350 `)
6351
6352 // Check if mylib is linked to mylib2 for the non-apex target
6353 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6354 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
6355
6356 // Make sure that the link doesn't occur for the apex target
6357 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
6358 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
6359
6360 // It shouldn't appear in the copy cmd as well.
6361 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
6362 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
6363}
6364
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006365func TestMain(m *testing.M) {
6366 run := func() int {
6367 setUp()
6368 defer tearDown()
6369
6370 return m.Run()
6371 }
6372
6373 os.Exit(run())
6374}