blob: 9a5968c1c67e2a1694bca17701528affd50ea9f2 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Park25fc6a92018-11-18 18:02:45 +090018 "io/ioutil"
19 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090024 "strings"
25 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090026
27 "github.com/google/blueprint/proptools"
28
29 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080030 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000032 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070033 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090034 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090035 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070036 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090037)
38
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070039var buildDir string
40
Jooyung Hand3639552019-08-09 12:57:43 +090041// names returns name list from white space separated string
42func names(s string) (ns []string) {
43 for _, n := range strings.Split(s, " ") {
44 if len(n) > 0 {
45 ns = append(ns, n)
46 }
47 }
48 return
49}
50
Jooyung Han344d5432019-08-23 11:17:39 +090051func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
52 t.Helper()
53 ctx, config := testApexContext(t, bp, handlers...)
Jooyung Han5c998b92019-06-27 11:30:33 +090054 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
55 if len(errs) > 0 {
56 android.FailIfNoMatchingErrors(t, pattern, errs)
57 return
58 }
59 _, errs = ctx.PrepareBuildActions(config)
60 if len(errs) > 0 {
61 android.FailIfNoMatchingErrors(t, pattern, errs)
62 return
63 }
64
65 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
66}
67
Jooyung Han344d5432019-08-23 11:17:39 +090068func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
69 t.Helper()
70 ctx, config := testApexContext(t, bp, handlers...)
Paul Duffineedc5d52020-06-12 17:46:39 +010071 _, errs := ctx.ParseBlueprintsFiles(".")
Jooyung Han5c998b92019-06-27 11:30:33 +090072 android.FailIfErrored(t, errs)
73 _, errs = ctx.PrepareBuildActions(config)
74 android.FailIfErrored(t, errs)
Jaewoong Jung22f7d182019-07-16 18:25:41 -070075 return ctx, config
Jooyung Han5c998b92019-06-27 11:30:33 +090076}
77
Jooyung Han344d5432019-08-23 11:17:39 +090078type testCustomizer func(fs map[string][]byte, config android.Config)
79
80func withFiles(files map[string][]byte) testCustomizer {
81 return func(fs map[string][]byte, config android.Config) {
82 for k, v := range files {
83 fs[k] = v
84 }
85 }
86}
87
88func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
89 return func(fs map[string][]byte, config android.Config) {
90 for k, v := range targets {
91 config.Targets[k] = v
92 }
93 }
94}
95
Jooyung Han35155c42020-02-06 17:33:20 +090096// withNativeBridgeTargets sets configuration with targets including:
97// - X86_64 (primary)
98// - X86 (secondary)
99// - Arm64 on X86_64 (native bridge)
100// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700101func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +0900102 config.Targets[android.Android] = []android.Target{
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
106 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
109 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
110 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
111 }
112}
113
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900114func withManifestPackageNameOverrides(specs []string) testCustomizer {
115 return func(fs map[string][]byte, config android.Config) {
116 config.TestProductVariables.ManifestPackageNameOverrides = specs
117 }
118}
119
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700120func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900121 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
122}
123
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700124func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900125 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
126}
127
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700128func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900129 bp = bp + `
Jooyung Han54aca7b2019-11-20 02:26:02 +0900130 filegroup {
131 name: "myapex-file_contexts",
132 srcs: [
133 "system/sepolicy/apex/myapex-file_contexts",
134 ],
135 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900136 `
Colin Cross98be1bb2019-12-13 20:41:13 -0800137
Colin Crossf9aabd72020-02-15 11:29:50 -0800138 bp = bp + cc.GatherRequiredDepsForTest(android.Android)
139
Jiyong Park99644e92020-11-17 22:21:02 +0900140 bp = bp + rust.GatherRequiredDepsForTest()
141
Dario Frenicde2a032019-10-27 00:29:22 +0100142 bp = bp + java.GatherRequiredDepsForTest()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900143
Jooyung Han344d5432019-08-23 11:17:39 +0900144 fs := map[string][]byte{
Jooyung Han54aca7b2019-11-20 02:26:02 +0900145 "a.java": nil,
146 "PrebuiltAppFoo.apk": nil,
147 "PrebuiltAppFooPriv.apk": nil,
148 "build/make/target/product/security": nil,
149 "apex_manifest.json": nil,
150 "AndroidManifest.xml": nil,
151 "system/sepolicy/apex/myapex-file_contexts": nil,
Jiyong Park9d677202020-02-19 16:29:35 +0900152 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
Jiyong Park83dc74b2020-01-14 18:38:44 +0900153 "system/sepolicy/apex/myapex2-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900154 "system/sepolicy/apex/otherapex-file_contexts": nil,
Jooyung Han54aca7b2019-11-20 02:26:02 +0900155 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800156 "mylib.cpp": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800157 "mytest.cpp": nil,
158 "mytest1.cpp": nil,
159 "mytest2.cpp": nil,
160 "mytest3.cpp": nil,
161 "myprebuilt": nil,
162 "my_include": nil,
163 "foo/bar/MyClass.java": nil,
164 "prebuilt.jar": nil,
Paul Duffindddd5462020-04-07 15:25:44 +0100165 "prebuilt.so": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800166 "vendor/foo/devkeys/test.x509.pem": nil,
167 "vendor/foo/devkeys/test.pk8": nil,
168 "testkey.x509.pem": nil,
169 "testkey.pk8": nil,
170 "testkey.override.x509.pem": nil,
171 "testkey.override.pk8": nil,
172 "vendor/foo/devkeys/testkey.avbpubkey": nil,
173 "vendor/foo/devkeys/testkey.pem": nil,
174 "NOTICE": nil,
175 "custom_notice": nil,
Jiyong Park9918e1a2020-03-17 19:16:40 +0900176 "custom_notice_for_static_lib": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800177 "testkey2.avbpubkey": nil,
178 "testkey2.pem": nil,
179 "myapex-arm64.apex": nil,
180 "myapex-arm.apex": nil,
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700181 "myapex.apks": nil,
Colin Cross98be1bb2019-12-13 20:41:13 -0800182 "frameworks/base/api/current.txt": nil,
183 "framework/aidl/a.aidl": nil,
184 "build/make/core/proguard.flags": nil,
185 "build/make/core/proguard_basic_keeps.flags": nil,
186 "dummy.txt": nil,
Liz Kammer1c14a212020-05-12 15:26:55 -0700187 "baz": nil,
188 "bar/baz": nil,
Liz Kammer5bd365f2020-05-27 15:15:11 -0700189 "testdata/baz": nil,
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700190 "AppSet.apks": nil,
Jiyong Park99644e92020-11-17 22:21:02 +0900191 "foo.rs": nil,
Jooyung Han344d5432019-08-23 11:17:39 +0900192 }
193
Colin Crossf9aabd72020-02-15 11:29:50 -0800194 cc.GatherRequiredFilesForTest(fs)
195
Jooyung Han344d5432019-08-23 11:17:39 +0900196 for _, handler := range handlers {
Colin Cross98be1bb2019-12-13 20:41:13 -0800197 // The fs now needs to be populated before creating the config, call handlers twice
198 // for now, once to get any fs changes, and later after the config was created to
199 // set product variables or targets.
200 tempConfig := android.TestArchConfig(buildDir, nil, bp, fs)
201 handler(fs, tempConfig)
Jooyung Han344d5432019-08-23 11:17:39 +0900202 }
203
Colin Cross98be1bb2019-12-13 20:41:13 -0800204 config := android.TestArchConfig(buildDir, nil, bp, fs)
205 config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
206 config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
207 config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
208 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
209 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
Dan Albert4f378d72020-07-23 17:32:15 -0700210 config.TestProductVariables.Platform_version_active_codenames = []string{"Q"}
Colin Cross98be1bb2019-12-13 20:41:13 -0800211 config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
212
213 for _, handler := range handlers {
214 // The fs now needs to be populated before creating the config, call handlers twice
215 // for now, earlier to get any fs changes, and now after the config was created to
216 // set product variables or targets.
217 tempFS := map[string][]byte{}
218 handler(tempFS, config)
219 }
220
Colin Crossae8600b2020-10-29 17:09:13 -0700221 ctx := android.NewTestArchContext(config)
Paul Duffineedc5d52020-06-12 17:46:39 +0100222
223 // from android package
224 android.RegisterPackageBuildComponents(ctx)
225 ctx.PreArchMutators(android.RegisterVisibilityRuleChecker)
226
Colin Cross98be1bb2019-12-13 20:41:13 -0800227 ctx.RegisterModuleType("apex", BundleFactory)
228 ctx.RegisterModuleType("apex_test", testApexBundleFactory)
229 ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
230 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
231 ctx.RegisterModuleType("apex_defaults", defaultsFactory)
232 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
233 ctx.RegisterModuleType("override_apex", overrideApexFactory)
Jaewoong Jungfa00c062020-05-14 14:15:24 -0700234 ctx.RegisterModuleType("apex_set", apexSetFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800235
Jooyung Hana57af4a2020-01-23 05:36:59 +0000236 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin44f1d842020-06-26 20:17:02 +0100237 ctx.PreArchMutators(android.RegisterComponentsMutator)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000238 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
239
Paul Duffin021f4e52020-07-30 16:04:17 +0100240 android.RegisterPrebuiltMutators(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100241
Paul Duffin021f4e52020-07-30 16:04:17 +0100242 // Register these after the prebuilt mutators have been registered to match what
243 // happens at runtime.
Paul Duffineedc5d52020-06-12 17:46:39 +0100244 ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer)
245 ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)
246
Paul Duffin021f4e52020-07-30 16:04:17 +0100247 cc.RegisterRequiredBuildComponentsForTest(ctx)
Jiyong Park99644e92020-11-17 22:21:02 +0900248 rust.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffin021f4e52020-07-30 16:04:17 +0100249
Colin Cross98be1bb2019-12-13 20:41:13 -0800250 ctx.RegisterModuleType("cc_test", cc.TestFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800251 ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
252 ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
Jooyung Han0703fd82020-08-26 22:11:53 +0900253 prebuilt_etc.RegisterPrebuiltEtcBuildComponents(ctx)
atrost6e126252020-01-27 17:01:16 +0000254 ctx.RegisterModuleType("platform_compat_config", java.PlatformCompatConfigFactory)
Jaewoong Jung4b79e982020-06-01 10:45:49 -0700255 ctx.RegisterModuleType("sh_binary", sh.ShBinaryFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800256 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000257 java.RegisterJavaBuildComponents(ctx)
Paul Duffin43dc1cc2019-12-19 11:18:54 +0000258 java.RegisterSystemModulesBuildComponents(ctx)
Paul Duffinf9b1da02019-12-18 19:51:55 +0000259 java.RegisterAppBuildComponents(ctx)
Paul Duffineedc5d52020-06-12 17:46:39 +0100260 java.RegisterSdkLibraryBuildComponents(ctx)
Jiyong Park8d6c51e2020-06-12 17:26:31 +0900261 ctx.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
markchien2f59ec92020-09-02 16:23:38 +0800262 ctx.RegisterModuleType("bpf", bpf.BpfFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800263
Colin Cross98be1bb2019-12-13 20:41:13 -0800264 ctx.PreDepsMutators(RegisterPreDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800265 ctx.PostDepsMutators(RegisterPostDepsMutators)
Colin Cross98be1bb2019-12-13 20:41:13 -0800266
Colin Crossae8600b2020-10-29 17:09:13 -0700267 ctx.Register()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900268
Jooyung Han5c998b92019-06-27 11:30:33 +0900269 return ctx, config
Jiyong Park25fc6a92018-11-18 18:02:45 +0900270}
271
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700272func setUp() {
273 var err error
274 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900275 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700276 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900278}
279
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700280func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700281 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282}
283
Jooyung Han643adc42020-02-27 13:50:06 +0900284// ensure that 'result' equals 'expected'
285func ensureEquals(t *testing.T, result string, expected string) {
286 t.Helper()
287 if result != expected {
288 t.Errorf("%q != %q", expected, result)
289 }
290}
291
Jiyong Park25fc6a92018-11-18 18:02:45 +0900292// ensure that 'result' contains 'expected'
293func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900294 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900295 if !strings.Contains(result, expected) {
296 t.Errorf("%q is not found in %q", expected, result)
297 }
298}
299
Liz Kammer5bd365f2020-05-27 15:15:11 -0700300// ensure that 'result' contains 'expected' exactly one time
301func ensureContainsOnce(t *testing.T, result string, expected string) {
302 t.Helper()
303 count := strings.Count(result, expected)
304 if count != 1 {
305 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
306 }
307}
308
Jiyong Park25fc6a92018-11-18 18:02:45 +0900309// ensures that 'result' does not contain 'notExpected'
310func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900311 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900312 if strings.Contains(result, notExpected) {
313 t.Errorf("%q is found in %q", notExpected, result)
314 }
315}
316
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700317func ensureMatches(t *testing.T, result string, expectedRex string) {
318 ok, err := regexp.MatchString(expectedRex, result)
319 if err != nil {
320 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
321 return
322 }
323 if !ok {
324 t.Errorf("%s does not match regular expession %s", result, expectedRex)
325 }
326}
327
Jiyong Park25fc6a92018-11-18 18:02:45 +0900328func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900329 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 if !android.InList(expected, result) {
331 t.Errorf("%q is not found in %v", expected, result)
332 }
333}
334
335func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900336 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900337 if android.InList(notExpected, result) {
338 t.Errorf("%q is found in %v", notExpected, result)
339 }
340}
341
Jooyung Hane1633032019-08-01 17:41:43 +0900342func ensureListEmpty(t *testing.T, result []string) {
343 t.Helper()
344 if len(result) > 0 {
345 t.Errorf("%q is expected to be empty", result)
346 }
347}
348
Jiyong Park25fc6a92018-11-18 18:02:45 +0900349// Minimal test
350func TestBasicApex(t *testing.T) {
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900351 ctx, config := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900352 apex_defaults {
353 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900354 manifest: ":myapex.manifest",
355 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900356 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900357 binaries: ["foo.rust"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900358 native_shared_libs: ["mylib"],
Jiyong Park99644e92020-11-17 22:21:02 +0900359 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800360 multilib: {
361 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900362 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800363 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900364 },
Jiyong Park77acec62020-06-01 21:39:15 +0900365 java_libs: [
366 "myjar",
367 "myjar_dex",
368 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900369 }
370
Jiyong Park30ca9372019-02-07 16:27:23 +0900371 apex {
372 name: "myapex",
373 defaults: ["myapex-defaults"],
374 }
375
Jiyong Park25fc6a92018-11-18 18:02:45 +0900376 apex_key {
377 name: "myapex.key",
378 public_key: "testkey.avbpubkey",
379 private_key: "testkey.pem",
380 }
381
Jiyong Park809bb722019-02-13 21:33:49 +0900382 filegroup {
383 name: "myapex.manifest",
384 srcs: ["apex_manifest.json"],
385 }
386
387 filegroup {
388 name: "myapex.androidmanifest",
389 srcs: ["AndroidManifest.xml"],
390 }
391
Jiyong Park25fc6a92018-11-18 18:02:45 +0900392 cc_library {
393 name: "mylib",
394 srcs: ["mylib.cpp"],
395 shared_libs: ["mylib2"],
396 system_shared_libs: [],
397 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000398 // TODO: remove //apex_available:platform
399 apex_available: [
400 "//apex_available:platform",
401 "myapex",
402 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900403 }
404
Alex Light3d673592019-01-18 14:37:31 -0800405 cc_binary {
406 name: "foo",
407 srcs: ["mylib.cpp"],
408 compile_multilib: "both",
409 multilib: {
410 lib32: {
411 suffix: "32",
412 },
413 lib64: {
414 suffix: "64",
415 },
416 },
417 symlinks: ["foo_link_"],
418 symlink_preferred_arch: true,
419 system_shared_libs: [],
420 static_executable: true,
421 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700422 apex_available: [ "myapex", "com.android.gki.*" ],
423 }
424
Jiyong Park99644e92020-11-17 22:21:02 +0900425 rust_binary {
426 name: "foo.rust",
427 srcs: ["foo.rs"],
428 rlibs: ["libfoo.rlib.rust"],
429 dylibs: ["libfoo.dylib.rust"],
430 apex_available: ["myapex"],
431 }
432
433 rust_library_rlib {
434 name: "libfoo.rlib.rust",
435 srcs: ["foo.rs"],
436 crate_name: "foo",
437 apex_available: ["myapex"],
438 }
439
440 rust_library_dylib {
441 name: "libfoo.dylib.rust",
442 srcs: ["foo.rs"],
443 crate_name: "foo",
444 apex_available: ["myapex"],
445 }
446
Yifan Hongd22a84a2020-07-28 17:37:46 -0700447 apex {
448 name: "com.android.gki.fake",
449 binaries: ["foo"],
450 key: "myapex.key",
451 file_contexts: ":myapex-file_contexts",
Alex Light3d673592019-01-18 14:37:31 -0800452 }
453
Paul Duffindddd5462020-04-07 15:25:44 +0100454 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900455 name: "mylib2",
456 srcs: ["mylib.cpp"],
457 system_shared_libs: [],
458 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900459 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900460 static_libs: ["libstatic"],
461 // TODO: remove //apex_available:platform
462 apex_available: [
463 "//apex_available:platform",
464 "myapex",
465 ],
466 }
467
Paul Duffindddd5462020-04-07 15:25:44 +0100468 cc_prebuilt_library_shared {
469 name: "mylib2",
470 srcs: ["prebuilt.so"],
471 // TODO: remove //apex_available:platform
472 apex_available: [
473 "//apex_available:platform",
474 "myapex",
475 ],
476 }
477
Jiyong Park9918e1a2020-03-17 19:16:40 +0900478 cc_library_static {
479 name: "libstatic",
480 srcs: ["mylib.cpp"],
481 system_shared_libs: [],
482 stl: "none",
483 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000484 // TODO: remove //apex_available:platform
485 apex_available: [
486 "//apex_available:platform",
487 "myapex",
488 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900489 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490
491 java_library {
492 name: "myjar",
493 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900494 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900495 sdk_version: "none",
496 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900497 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900498 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000499 // TODO: remove //apex_available:platform
500 apex_available: [
501 "//apex_available:platform",
502 "myapex",
503 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900504 }
505
Jiyong Park77acec62020-06-01 21:39:15 +0900506 dex_import {
507 name: "myjar_dex",
508 jars: ["prebuilt.jar"],
509 apex_available: [
510 "//apex_available:platform",
511 "myapex",
512 ],
513 }
514
Jiyong Park7f7766d2019-07-25 22:02:35 +0900515 java_library {
516 name: "myotherjar",
517 srcs: ["foo/bar/MyClass.java"],
518 sdk_version: "none",
519 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900520 // TODO: remove //apex_available:platform
521 apex_available: [
522 "//apex_available:platform",
523 "myapex",
524 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900525 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900526
527 java_library {
528 name: "mysharedjar",
529 srcs: ["foo/bar/MyClass.java"],
530 sdk_version: "none",
531 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900532 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900533 `)
534
Sundong Ahnabb64432019-10-22 13:58:29 +0900535 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900536
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900537 // Make sure that Android.mk is created
538 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
539 data := android.AndroidMkDataForTest(t, config, "", ab)
540 var builder strings.Builder
541 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
542
543 androidMk := builder.String()
544 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
545 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
546
Jiyong Park42cca6c2019-04-01 11:15:50 +0900547 optFlags := apexRule.Args["opt_flags"]
548 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700549 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900550 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900551
Jiyong Park25fc6a92018-11-18 18:02:45 +0900552 copyCmds := apexRule.Args["copy_commands"]
553
554 // Ensure that main rule creates an output
555 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
556
557 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700558 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
559 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
560 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900561 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900562
563 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700564 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
565 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900566 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
567 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900568
569 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800570 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
571 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900572 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900573 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900574 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900575 // .. but not for java libs
576 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900577 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800578
Colin Cross7113d202019-11-20 16:39:12 -0800579 // Ensure that the platform variant ends with _shared or _common
580 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
581 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900582 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
583 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900584 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
585
586 // Ensure that dynamic dependency to java libs are not included
587 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800588
589 // Ensure that all symlinks are present.
590 found_foo_link_64 := false
591 found_foo := false
592 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900593 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800594 if strings.HasSuffix(cmd, "bin/foo") {
595 found_foo = true
596 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
597 found_foo_link_64 = true
598 }
599 }
600 }
601 good := found_foo && found_foo_link_64
602 if !good {
603 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
604 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900605
Sundong Ahnabb64432019-10-22 13:58:29 +0900606 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700607 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900608 if len(noticeInputs) != 3 {
609 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900610 }
611 ensureListContains(t, noticeInputs, "NOTICE")
612 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900613 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900614
Artur Satayeva8bd1132020-04-27 18:07:06 +0100615 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100616 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
617 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex")
618 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
619 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
620 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100621
622 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100623 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
624 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
625 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
626 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
627 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800628}
629
Jooyung Hanf21c7972019-12-16 22:32:06 +0900630func TestDefaults(t *testing.T) {
631 ctx, _ := testApex(t, `
632 apex_defaults {
633 name: "myapex-defaults",
634 key: "myapex.key",
635 prebuilts: ["myetc"],
636 native_shared_libs: ["mylib"],
637 java_libs: ["myjar"],
638 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900639 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800640 bpfs: ["bpf"],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900641 }
642
643 prebuilt_etc {
644 name: "myetc",
645 src: "myprebuilt",
646 }
647
648 apex {
649 name: "myapex",
650 defaults: ["myapex-defaults"],
651 }
652
653 apex_key {
654 name: "myapex.key",
655 public_key: "testkey.avbpubkey",
656 private_key: "testkey.pem",
657 }
658
659 cc_library {
660 name: "mylib",
661 system_shared_libs: [],
662 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000663 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900664 }
665
666 java_library {
667 name: "myjar",
668 srcs: ["foo/bar/MyClass.java"],
669 sdk_version: "none",
670 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000671 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900672 }
673
674 android_app {
675 name: "AppFoo",
676 srcs: ["foo/bar/MyClass.java"],
677 sdk_version: "none",
678 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000679 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900680 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900681
682 runtime_resource_overlay {
683 name: "rro",
684 theme: "blue",
685 }
686
markchien2f59ec92020-09-02 16:23:38 +0800687 bpf {
688 name: "bpf",
689 srcs: ["bpf.c", "bpf2.c"],
690 }
691
Jooyung Hanf21c7972019-12-16 22:32:06 +0900692 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000693 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900694 "etc/myetc",
695 "javalib/myjar.jar",
696 "lib64/mylib.so",
697 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900698 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800699 "etc/bpf/bpf.o",
700 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900701 })
702}
703
Jooyung Han01a3ee22019-11-02 02:52:25 +0900704func TestApexManifest(t *testing.T) {
705 ctx, _ := testApex(t, `
706 apex {
707 name: "myapex",
708 key: "myapex.key",
709 }
710
711 apex_key {
712 name: "myapex.key",
713 public_key: "testkey.avbpubkey",
714 private_key: "testkey.pem",
715 }
716 `)
717
718 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900719 args := module.Rule("apexRule").Args
720 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
721 t.Error("manifest should be apex_manifest.pb, but " + manifest)
722 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900723}
724
Alex Light5098a612018-11-29 17:12:15 -0800725func TestBasicZipApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700726 ctx, _ := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800727 apex {
728 name: "myapex",
729 key: "myapex.key",
730 payload_type: "zip",
731 native_shared_libs: ["mylib"],
732 }
733
734 apex_key {
735 name: "myapex.key",
736 public_key: "testkey.avbpubkey",
737 private_key: "testkey.pem",
738 }
739
740 cc_library {
741 name: "mylib",
742 srcs: ["mylib.cpp"],
743 shared_libs: ["mylib2"],
744 system_shared_libs: [],
745 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000746 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800747 }
748
749 cc_library {
750 name: "mylib2",
751 srcs: ["mylib.cpp"],
752 system_shared_libs: [],
753 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000754 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800755 }
756 `)
757
Sundong Ahnabb64432019-10-22 13:58:29 +0900758 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800759 copyCmds := zipApexRule.Args["copy_commands"]
760
761 // Ensure that main rule creates an output
762 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
763
764 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700765 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800766
767 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700768 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800769
770 // Ensure that both direct and indirect deps are copied into apex
771 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
772 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900773}
774
775func TestApexWithStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700776 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900777 apex {
778 name: "myapex",
779 key: "myapex.key",
780 native_shared_libs: ["mylib", "mylib3"],
781 }
782
783 apex_key {
784 name: "myapex.key",
785 public_key: "testkey.avbpubkey",
786 private_key: "testkey.pem",
787 }
788
789 cc_library {
790 name: "mylib",
791 srcs: ["mylib.cpp"],
792 shared_libs: ["mylib2", "mylib3"],
793 system_shared_libs: [],
794 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000795 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900796 }
797
798 cc_library {
799 name: "mylib2",
800 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900801 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900802 system_shared_libs: [],
803 stl: "none",
804 stubs: {
805 versions: ["1", "2", "3"],
806 },
807 }
808
809 cc_library {
810 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900811 srcs: ["mylib.cpp"],
812 shared_libs: ["mylib4"],
813 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900814 stl: "none",
815 stubs: {
816 versions: ["10", "11", "12"],
817 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000818 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900819 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900820
821 cc_library {
822 name: "mylib4",
823 srcs: ["mylib.cpp"],
824 system_shared_libs: [],
825 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000826 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900827 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900828 `)
829
Sundong Ahnabb64432019-10-22 13:58:29 +0900830 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900831 copyCmds := apexRule.Args["copy_commands"]
832
833 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800834 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900835
836 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800837 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900838
839 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800840 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900841
Colin Crossaede88c2020-08-11 12:17:01 -0700842 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900843
844 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900845 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900846 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900847 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900848
849 // 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 -0700850 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900851 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700852 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900853
854 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900855 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900856 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900857
858 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700859 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900860
Jooyung Hana57af4a2020-01-23 05:36:59 +0000861 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900862 "lib64/mylib.so",
863 "lib64/mylib3.so",
864 "lib64/mylib4.so",
865 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900866}
867
Colin Cross7812fd32020-09-25 12:35:10 -0700868func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
869 t.Parallel()
870 ctx, _ := testApex(t, `
871 apex {
872 name: "myapex",
873 key: "myapex.key",
874 native_shared_libs: ["mylib", "mylib3"],
875 min_sdk_version: "29",
876 }
877
878 apex_key {
879 name: "myapex.key",
880 public_key: "testkey.avbpubkey",
881 private_key: "testkey.pem",
882 }
883
884 cc_library {
885 name: "mylib",
886 srcs: ["mylib.cpp"],
887 shared_libs: ["mylib2", "mylib3"],
888 system_shared_libs: [],
889 stl: "none",
890 apex_available: [ "myapex" ],
891 min_sdk_version: "28",
892 }
893
894 cc_library {
895 name: "mylib2",
896 srcs: ["mylib.cpp"],
897 cflags: ["-include mylib.h"],
898 system_shared_libs: [],
899 stl: "none",
900 stubs: {
901 versions: ["28", "29", "30", "current"],
902 },
903 min_sdk_version: "28",
904 }
905
906 cc_library {
907 name: "mylib3",
908 srcs: ["mylib.cpp"],
909 shared_libs: ["mylib4"],
910 system_shared_libs: [],
911 stl: "none",
912 stubs: {
913 versions: ["28", "29", "30", "current"],
914 },
915 apex_available: [ "myapex" ],
916 min_sdk_version: "28",
917 }
918
919 cc_library {
920 name: "mylib4",
921 srcs: ["mylib.cpp"],
922 system_shared_libs: [],
923 stl: "none",
924 apex_available: [ "myapex" ],
925 min_sdk_version: "28",
926 }
927 `)
928
929 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
930 copyCmds := apexRule.Args["copy_commands"]
931
932 // Ensure that direct non-stubs dep is always included
933 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
934
935 // Ensure that indirect stubs dep is not included
936 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
937
938 // Ensure that direct stubs dep is included
939 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
940
941 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
942
943 // Ensure that mylib is linking with the version 29 stubs for mylib2
944 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_29/mylib2.so")
945 // ... and not linking to the non-stub (impl) variant of mylib2
946 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
947
948 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
949 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
950 // .. and not linking to the stubs variant of mylib3
951 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
952
953 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700954 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700955 ensureNotContains(t, mylib2Cflags, "-include ")
956
957 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700958 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -0700959
960 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
961 "lib64/mylib.so",
962 "lib64/mylib3.so",
963 "lib64/mylib4.so",
964 })
965}
966
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900967func TestApexWithExplicitStubsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -0700968 ctx, _ := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900969 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900970 name: "myapex2",
971 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900972 native_shared_libs: ["mylib"],
973 }
974
975 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +0900976 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900977 public_key: "testkey.avbpubkey",
978 private_key: "testkey.pem",
979 }
980
981 cc_library {
982 name: "mylib",
983 srcs: ["mylib.cpp"],
984 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +0900985 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900986 system_shared_libs: [],
987 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000988 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +0900989 }
990
991 cc_library {
992 name: "libfoo",
993 srcs: ["mylib.cpp"],
994 shared_libs: ["libbar"],
995 system_shared_libs: [],
996 stl: "none",
997 stubs: {
998 versions: ["10", "20", "30"],
999 },
1000 }
1001
1002 cc_library {
1003 name: "libbar",
1004 srcs: ["mylib.cpp"],
1005 system_shared_libs: [],
1006 stl: "none",
1007 }
1008
Jiyong Park678c8812020-02-07 17:25:49 +09001009 cc_library_static {
1010 name: "libbaz",
1011 srcs: ["mylib.cpp"],
1012 system_shared_libs: [],
1013 stl: "none",
1014 apex_available: [ "myapex2" ],
1015 }
1016
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001017 `)
1018
Jiyong Park83dc74b2020-01-14 18:38:44 +09001019 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001020 copyCmds := apexRule.Args["copy_commands"]
1021
1022 // Ensure that direct non-stubs dep is always included
1023 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1024
1025 // Ensure that indirect stubs dep is not included
1026 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1027
1028 // Ensure that dependency of stubs is not included
1029 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1030
Colin Crossaede88c2020-08-11 12:17:01 -07001031 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001032
1033 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001034 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001035 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001036 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001037
Jiyong Park3ff16992019-12-27 14:11:47 +09001038 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001039
1040 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1041 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001042
Artur Satayeva8bd1132020-04-27 18:07:06 +01001043 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001044 ensureListContains(t, fullDepsInfo, " mylib(minSdkVersion:(no version)) <- myapex2")
1045 ensureListContains(t, fullDepsInfo, " libbaz(minSdkVersion:(no version)) <- mylib")
1046 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001047
Artur Satayeva8bd1132020-04-27 18:07:06 +01001048 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001049 ensureListContains(t, flatDepsInfo, "mylib(minSdkVersion:(no version))")
1050 ensureListContains(t, flatDepsInfo, "libbaz(minSdkVersion:(no version))")
1051 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001052}
1053
Jooyung Hand3639552019-08-09 12:57:43 +09001054func TestApexWithRuntimeLibsDependency(t *testing.T) {
1055 /*
1056 myapex
1057 |
1058 v (runtime_libs)
1059 mylib ------+------> libfoo [provides stub]
1060 |
1061 `------> libbar
1062 */
1063 ctx, _ := testApex(t, `
1064 apex {
1065 name: "myapex",
1066 key: "myapex.key",
1067 native_shared_libs: ["mylib"],
1068 }
1069
1070 apex_key {
1071 name: "myapex.key",
1072 public_key: "testkey.avbpubkey",
1073 private_key: "testkey.pem",
1074 }
1075
1076 cc_library {
1077 name: "mylib",
1078 srcs: ["mylib.cpp"],
1079 runtime_libs: ["libfoo", "libbar"],
1080 system_shared_libs: [],
1081 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001082 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001083 }
1084
1085 cc_library {
1086 name: "libfoo",
1087 srcs: ["mylib.cpp"],
1088 system_shared_libs: [],
1089 stl: "none",
1090 stubs: {
1091 versions: ["10", "20", "30"],
1092 },
1093 }
1094
1095 cc_library {
1096 name: "libbar",
1097 srcs: ["mylib.cpp"],
1098 system_shared_libs: [],
1099 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001100 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001101 }
1102
1103 `)
1104
Sundong Ahnabb64432019-10-22 13:58:29 +09001105 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001106 copyCmds := apexRule.Args["copy_commands"]
1107
1108 // Ensure that direct non-stubs dep is always included
1109 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1110
1111 // Ensure that indirect stubs dep is not included
1112 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1113
1114 // Ensure that runtime_libs dep in included
1115 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1116
Sundong Ahnabb64432019-10-22 13:58:29 +09001117 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001118 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1119 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001120
1121}
1122
Jooyung Han8ce8db92020-05-15 19:05:05 +09001123func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1124 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1125 bp := `
1126 apex {
1127 name: "com.android.runtime",
1128 key: "com.android.runtime.key",
1129 native_shared_libs: ["libc"],
1130 }
1131
1132 apex_key {
1133 name: "com.android.runtime.key",
1134 public_key: "testkey.avbpubkey",
1135 private_key: "testkey.pem",
1136 }
1137
1138 cc_library {
1139 name: "libc",
1140 no_libcrt: true,
1141 nocrt: true,
1142 stl: "none",
1143 system_shared_libs: [],
1144 stubs: { versions: ["1"] },
1145 apex_available: ["com.android.runtime"],
1146
1147 sanitize: {
1148 hwaddress: true,
1149 }
1150 }
1151
1152 cc_prebuilt_library_shared {
1153 name: "libclang_rt.hwasan-aarch64-android",
1154 no_libcrt: true,
1155 nocrt: true,
1156 stl: "none",
1157 system_shared_libs: [],
1158 srcs: [""],
1159 stubs: { versions: ["1"] },
1160
1161 sanitize: {
1162 never: true,
1163 },
1164 }
1165 `
1166 // override bp to use hard-coded names: com.android.runtime and libc
1167 fs["Android.bp"] = []byte(bp)
1168 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1169 })
1170
1171 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1172 "lib64/bionic/libc.so",
1173 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1174 })
1175
1176 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1177
1178 installed := hwasan.Description("install libclang_rt.hwasan")
1179 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1180
1181 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1182 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1183 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1184}
1185
1186func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
1187 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
1188 bp := `
1189 apex {
1190 name: "com.android.runtime",
1191 key: "com.android.runtime.key",
1192 native_shared_libs: ["libc"],
1193 }
1194
1195 apex_key {
1196 name: "com.android.runtime.key",
1197 public_key: "testkey.avbpubkey",
1198 private_key: "testkey.pem",
1199 }
1200
1201 cc_library {
1202 name: "libc",
1203 no_libcrt: true,
1204 nocrt: true,
1205 stl: "none",
1206 system_shared_libs: [],
1207 stubs: { versions: ["1"] },
1208 apex_available: ["com.android.runtime"],
1209 }
1210
1211 cc_prebuilt_library_shared {
1212 name: "libclang_rt.hwasan-aarch64-android",
1213 no_libcrt: true,
1214 nocrt: true,
1215 stl: "none",
1216 system_shared_libs: [],
1217 srcs: [""],
1218 stubs: { versions: ["1"] },
1219
1220 sanitize: {
1221 never: true,
1222 },
1223 }
1224 `
1225 // override bp to use hard-coded names: com.android.runtime and libc
1226 fs["Android.bp"] = []byte(bp)
1227 fs["system/sepolicy/apex/com.android.runtime-file_contexts"] = nil
1228
1229 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1230 })
1231
1232 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1233 "lib64/bionic/libc.so",
1234 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1235 })
1236
1237 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1238
1239 installed := hwasan.Description("install libclang_rt.hwasan")
1240 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1241
1242 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1243 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1244 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1245}
1246
Jooyung Han61b66e92020-03-21 14:21:46 +00001247func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1248 testcases := []struct {
1249 name string
1250 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001251 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001252 shouldLink string
1253 shouldNotLink []string
1254 }{
1255 {
Jooyung Han75568392020-03-20 04:29:24 +09001256 name: "should link to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001257 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001258 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001259 shouldLink: "30",
1260 shouldNotLink: []string{"29"},
1261 },
1262 {
1263 name: "should link to llndk#29",
Jooyung Han749dc692020-04-15 11:03:39 +09001264 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001265 apexVariant: "apex29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001266 shouldLink: "29",
1267 shouldNotLink: []string{"30"},
1268 },
1269 }
1270 for _, tc := range testcases {
1271 t.Run(tc.name, func(t *testing.T) {
1272 ctx, _ := testApex(t, `
1273 apex {
1274 name: "myapex",
1275 key: "myapex.key",
1276 use_vendor: true,
1277 native_shared_libs: ["mylib"],
Jooyung Han749dc692020-04-15 11:03:39 +09001278 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001279 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001280
Jooyung Han61b66e92020-03-21 14:21:46 +00001281 apex_key {
1282 name: "myapex.key",
1283 public_key: "testkey.avbpubkey",
1284 private_key: "testkey.pem",
1285 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001286
Jooyung Han61b66e92020-03-21 14:21:46 +00001287 cc_library {
1288 name: "mylib",
1289 srcs: ["mylib.cpp"],
1290 vendor_available: true,
1291 shared_libs: ["libbar"],
1292 system_shared_libs: [],
1293 stl: "none",
1294 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001295 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001296 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001297
Jooyung Han61b66e92020-03-21 14:21:46 +00001298 cc_library {
1299 name: "libbar",
1300 srcs: ["mylib.cpp"],
1301 system_shared_libs: [],
1302 stl: "none",
1303 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001304 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001305 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001306
Jooyung Han61b66e92020-03-21 14:21:46 +00001307 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001308 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001309 symbol_file: "",
1310 }
1311 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001312 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001313 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001314
Jooyung Han61b66e92020-03-21 14:21:46 +00001315 // Ensure that LLNDK dep is not included
1316 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1317 "lib64/mylib.so",
1318 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001319
Jooyung Han61b66e92020-03-21 14:21:46 +00001320 // Ensure that LLNDK dep is required
1321 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1322 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1323 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001324
Colin Crossaede88c2020-08-11 12:17:01 -07001325 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001326 ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
1327 for _, ver := range tc.shouldNotLink {
1328 ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
1329 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001330
Colin Crossaede88c2020-08-11 12:17:01 -07001331 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001332 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1333 })
1334 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001335}
1336
Jiyong Park25fc6a92018-11-18 18:02:45 +09001337func TestApexWithSystemLibsStubs(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07001338 ctx, _ := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001339 apex {
1340 name: "myapex",
1341 key: "myapex.key",
1342 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
1343 }
1344
1345 apex_key {
1346 name: "myapex.key",
1347 public_key: "testkey.avbpubkey",
1348 private_key: "testkey.pem",
1349 }
1350
1351 cc_library {
1352 name: "mylib",
1353 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001354 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001355 shared_libs: ["libdl#27"],
1356 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001357 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001358 }
1359
1360 cc_library_shared {
1361 name: "mylib_shared",
1362 srcs: ["mylib.cpp"],
1363 shared_libs: ["libdl#27"],
1364 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001365 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001366 }
1367
1368 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001369 name: "libBootstrap",
1370 srcs: ["mylib.cpp"],
1371 stl: "none",
1372 bootstrap: true,
1373 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001374 `)
1375
Sundong Ahnabb64432019-10-22 13:58:29 +09001376 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001377 copyCmds := apexRule.Args["copy_commands"]
1378
1379 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001380 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001381 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1382 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001383
1384 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001385 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001386
Colin Crossaede88c2020-08-11 12:17:01 -07001387 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1388 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1389 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001390
1391 // For dependency to libc
1392 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001393 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001394 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001395 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001396 // ... Cflags from stub is correctly exported to mylib
1397 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1398 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1399
1400 // For dependency to libm
1401 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001402 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001403 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001404 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001405 // ... and is not compiling with the stub
1406 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1407 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1408
1409 // For dependency to libdl
1410 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001411 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001412 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001413 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1414 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001415 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001416 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001417 // ... Cflags from stub is correctly exported to mylib
1418 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1419 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001420
1421 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001422 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1423 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1424 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1425 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001426}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001427
Jooyung Han749dc692020-04-15 11:03:39 +09001428func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001429 // there are three links between liba --> libz
Jooyung Han749dc692020-04-15 11:03:39 +09001430 // 1) myapex -> libx -> liba -> libz : this should be #29 link, but fallback to #28
1431 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001432 // 3) (platform) -> liba -> libz : this should be non-stub link
1433 ctx, _ := testApex(t, `
1434 apex {
1435 name: "myapex",
1436 key: "myapex.key",
1437 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001438 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001439 }
1440
1441 apex {
1442 name: "otherapex",
1443 key: "myapex.key",
1444 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001445 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001446 }
1447
1448 apex_key {
1449 name: "myapex.key",
1450 public_key: "testkey.avbpubkey",
1451 private_key: "testkey.pem",
1452 }
1453
1454 cc_library {
1455 name: "libx",
1456 shared_libs: ["liba"],
1457 system_shared_libs: [],
1458 stl: "none",
1459 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001460 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001461 }
1462
1463 cc_library {
1464 name: "liby",
1465 shared_libs: ["liba"],
1466 system_shared_libs: [],
1467 stl: "none",
1468 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001469 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001470 }
1471
1472 cc_library {
1473 name: "liba",
1474 shared_libs: ["libz"],
1475 system_shared_libs: [],
1476 stl: "none",
1477 apex_available: [
1478 "//apex_available:anyapex",
1479 "//apex_available:platform",
1480 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001481 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001482 }
1483
1484 cc_library {
1485 name: "libz",
1486 system_shared_libs: [],
1487 stl: "none",
1488 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001489 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001490 },
1491 }
Jooyung Han749dc692020-04-15 11:03:39 +09001492 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001493
1494 expectLink := func(from, from_variant, to, to_variant string) {
1495 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1496 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1497 }
1498 expectNoLink := func(from, from_variant, to, to_variant string) {
1499 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1500 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1501 }
1502 // platform liba is linked to non-stub version
1503 expectLink("liba", "shared", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001504 // liba in myapex is linked to #28
Colin Crossaede88c2020-08-11 12:17:01 -07001505 expectLink("liba", "shared_apex29", "libz", "shared_28")
1506 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
1507 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001508 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001509 expectLink("liba", "shared_apex30", "libz", "shared_30")
1510 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1511 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001512}
1513
Jooyung Hanaed150d2020-04-02 01:41:41 +09001514func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
1515 ctx, _ := testApex(t, `
1516 apex {
1517 name: "myapex",
1518 key: "myapex.key",
1519 native_shared_libs: ["libx"],
1520 min_sdk_version: "R",
1521 }
1522
1523 apex_key {
1524 name: "myapex.key",
1525 public_key: "testkey.avbpubkey",
1526 private_key: "testkey.pem",
1527 }
1528
1529 cc_library {
1530 name: "libx",
1531 shared_libs: ["libz"],
1532 system_shared_libs: [],
1533 stl: "none",
1534 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001535 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001536 }
1537
1538 cc_library {
1539 name: "libz",
1540 system_shared_libs: [],
1541 stl: "none",
1542 stubs: {
1543 versions: ["29", "R"],
1544 },
1545 }
1546 `, func(fs map[string][]byte, config android.Config) {
1547 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1548 })
1549
1550 expectLink := func(from, from_variant, to, to_variant string) {
1551 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1552 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1553 }
1554 expectNoLink := func(from, from_variant, to, to_variant string) {
1555 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1556 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1557 }
Dan Albertc8060532020-07-22 22:32:17 -07001558 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001559 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1560 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001561}
1562
Jooyung Han749dc692020-04-15 11:03:39 +09001563func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001564 ctx, _ := testApex(t, `
1565 apex {
1566 name: "myapex",
1567 key: "myapex.key",
1568 native_shared_libs: ["libx"],
1569 }
1570
1571 apex_key {
1572 name: "myapex.key",
1573 public_key: "testkey.avbpubkey",
1574 private_key: "testkey.pem",
1575 }
1576
1577 cc_library {
1578 name: "libx",
1579 shared_libs: ["libz"],
1580 system_shared_libs: [],
1581 stl: "none",
1582 apex_available: [ "myapex" ],
1583 }
1584
1585 cc_library {
1586 name: "libz",
1587 system_shared_libs: [],
1588 stl: "none",
1589 stubs: {
1590 versions: ["1", "2"],
1591 },
1592 }
1593 `)
1594
1595 expectLink := func(from, from_variant, to, to_variant string) {
1596 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1597 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1598 }
1599 expectNoLink := func(from, from_variant, to, to_variant string) {
1600 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1601 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1602 }
Colin Crossaede88c2020-08-11 12:17:01 -07001603 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1604 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1605 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001606}
1607
1608func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
1609 ctx, _ := testApex(t, `
1610 apex {
1611 name: "myapex",
1612 key: "myapex.key",
1613 native_shared_libs: ["libx"],
1614 }
1615
1616 apex_key {
1617 name: "myapex.key",
1618 public_key: "testkey.avbpubkey",
1619 private_key: "testkey.pem",
1620 }
1621
1622 cc_library {
1623 name: "libx",
1624 system_shared_libs: [],
1625 stl: "none",
1626 apex_available: [ "myapex" ],
1627 stubs: {
1628 versions: ["1", "2"],
1629 },
1630 }
1631
1632 cc_library {
1633 name: "libz",
1634 shared_libs: ["libx"],
1635 system_shared_libs: [],
1636 stl: "none",
1637 }
1638 `)
1639
1640 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001641 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001642 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1643 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1644 }
1645 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001646 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001647 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1648 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1649 }
1650 expectLink("libz", "shared", "libx", "shared_2")
1651 expectNoLink("libz", "shared", "libz", "shared_1")
1652 expectNoLink("libz", "shared", "libz", "shared")
1653}
1654
Jooyung Han75568392020-03-20 04:29:24 +09001655func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001656 ctx, _ := testApex(t, `
1657 apex {
1658 name: "myapex",
1659 key: "myapex.key",
1660 native_shared_libs: ["libx"],
1661 min_sdk_version: "29",
1662 }
1663
1664 apex_key {
1665 name: "myapex.key",
1666 public_key: "testkey.avbpubkey",
1667 private_key: "testkey.pem",
1668 }
1669
1670 cc_library {
1671 name: "libx",
1672 shared_libs: ["libbar"],
1673 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001674 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001675 }
1676
1677 cc_library {
1678 name: "libbar",
1679 stubs: {
1680 versions: ["29", "30"],
1681 },
1682 }
Jooyung Han75568392020-03-20 04:29:24 +09001683 `, func(fs map[string][]byte, config android.Config) {
1684 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1685 })
Jooyung Han03b51852020-02-26 22:45:42 +09001686 expectLink := func(from, from_variant, to, to_variant string) {
1687 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1688 libFlags := ld.Args["libFlags"]
1689 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1690 }
Colin Crossaede88c2020-08-11 12:17:01 -07001691 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001692}
1693
Jooyung Han75568392020-03-20 04:29:24 +09001694func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Jooyung Han03b51852020-02-26 22:45:42 +09001695 ctx, _ := testApex(t, `
1696 apex {
1697 name: "myapex",
1698 key: "myapex.key",
1699 native_shared_libs: ["libx"],
1700 min_sdk_version: "29",
1701 }
1702
1703 apex_key {
1704 name: "myapex.key",
1705 public_key: "testkey.avbpubkey",
1706 private_key: "testkey.pem",
1707 }
1708
1709 cc_library {
1710 name: "libx",
1711 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001712 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001713 }
Jooyung Han75568392020-03-20 04:29:24 +09001714 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001715
1716 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001717 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Jooyung Han03b51852020-02-26 22:45:42 +09001718 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
1719 // note that platform variant is not.
1720 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
1721 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped")
Jooyung Han03b51852020-02-26 22:45:42 +09001722}
1723
Jooyung Han749dc692020-04-15 11:03:39 +09001724func TestApexMinSdkVersion_ErrorIfIncompatibleStubs(t *testing.T) {
Jooyung Han75568392020-03-20 04:29:24 +09001725 testApexError(t, `"libz" .*: not found a version\(<=29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001726 apex {
1727 name: "myapex",
1728 key: "myapex.key",
1729 native_shared_libs: ["libx"],
1730 min_sdk_version: "29",
1731 }
1732
1733 apex_key {
1734 name: "myapex.key",
1735 public_key: "testkey.avbpubkey",
1736 private_key: "testkey.pem",
1737 }
1738
1739 cc_library {
1740 name: "libx",
1741 shared_libs: ["libz"],
1742 system_shared_libs: [],
1743 stl: "none",
1744 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001745 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001746 }
1747
1748 cc_library {
1749 name: "libz",
1750 system_shared_libs: [],
1751 stl: "none",
1752 stubs: {
1753 versions: ["30"],
1754 },
1755 }
Jooyung Han75568392020-03-20 04:29:24 +09001756 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001757}
Jooyung Han03b51852020-02-26 22:45:42 +09001758
Jooyung Han749dc692020-04-15 11:03:39 +09001759func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1760 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001761 apex {
1762 name: "myapex",
1763 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001764 native_shared_libs: ["mylib"],
1765 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001766 }
1767
1768 apex_key {
1769 name: "myapex.key",
1770 public_key: "testkey.avbpubkey",
1771 private_key: "testkey.pem",
1772 }
Jooyung Han749dc692020-04-15 11:03:39 +09001773
1774 cc_library {
1775 name: "mylib",
1776 srcs: ["mylib.cpp"],
1777 system_shared_libs: [],
1778 stl: "none",
1779 apex_available: [
1780 "myapex",
1781 ],
1782 min_sdk_version: "30",
1783 }
1784 `)
1785}
1786
1787func TestApexMinSdkVersion_Okay(t *testing.T) {
1788 testApex(t, `
1789 apex {
1790 name: "myapex",
1791 key: "myapex.key",
1792 native_shared_libs: ["libfoo"],
1793 java_libs: ["libbar"],
1794 min_sdk_version: "29",
1795 }
1796
1797 apex_key {
1798 name: "myapex.key",
1799 public_key: "testkey.avbpubkey",
1800 private_key: "testkey.pem",
1801 }
1802
1803 cc_library {
1804 name: "libfoo",
1805 srcs: ["mylib.cpp"],
1806 shared_libs: ["libfoo_dep"],
1807 apex_available: ["myapex"],
1808 min_sdk_version: "29",
1809 }
1810
1811 cc_library {
1812 name: "libfoo_dep",
1813 srcs: ["mylib.cpp"],
1814 apex_available: ["myapex"],
1815 min_sdk_version: "29",
1816 }
1817
1818 java_library {
1819 name: "libbar",
1820 sdk_version: "current",
1821 srcs: ["a.java"],
1822 static_libs: ["libbar_dep"],
1823 apex_available: ["myapex"],
1824 min_sdk_version: "29",
1825 }
1826
1827 java_library {
1828 name: "libbar_dep",
1829 sdk_version: "current",
1830 srcs: ["a.java"],
1831 apex_available: ["myapex"],
1832 min_sdk_version: "29",
1833 }
Jooyung Han03b51852020-02-26 22:45:42 +09001834 `)
1835}
1836
Artur Satayev8cf899a2020-04-15 17:29:42 +01001837func TestJavaStableSdkVersion(t *testing.T) {
1838 testCases := []struct {
1839 name string
1840 expectedError string
1841 bp string
1842 }{
1843 {
1844 name: "Non-updatable apex with non-stable dep",
1845 bp: `
1846 apex {
1847 name: "myapex",
1848 java_libs: ["myjar"],
1849 key: "myapex.key",
1850 }
1851 apex_key {
1852 name: "myapex.key",
1853 public_key: "testkey.avbpubkey",
1854 private_key: "testkey.pem",
1855 }
1856 java_library {
1857 name: "myjar",
1858 srcs: ["foo/bar/MyClass.java"],
1859 sdk_version: "core_platform",
1860 apex_available: ["myapex"],
1861 }
1862 `,
1863 },
1864 {
1865 name: "Updatable apex with stable dep",
1866 bp: `
1867 apex {
1868 name: "myapex",
1869 java_libs: ["myjar"],
1870 key: "myapex.key",
1871 updatable: true,
1872 min_sdk_version: "29",
1873 }
1874 apex_key {
1875 name: "myapex.key",
1876 public_key: "testkey.avbpubkey",
1877 private_key: "testkey.pem",
1878 }
1879 java_library {
1880 name: "myjar",
1881 srcs: ["foo/bar/MyClass.java"],
1882 sdk_version: "current",
1883 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001884 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001885 }
1886 `,
1887 },
1888 {
1889 name: "Updatable apex with non-stable dep",
1890 expectedError: "cannot depend on \"myjar\"",
1891 bp: `
1892 apex {
1893 name: "myapex",
1894 java_libs: ["myjar"],
1895 key: "myapex.key",
1896 updatable: true,
1897 }
1898 apex_key {
1899 name: "myapex.key",
1900 public_key: "testkey.avbpubkey",
1901 private_key: "testkey.pem",
1902 }
1903 java_library {
1904 name: "myjar",
1905 srcs: ["foo/bar/MyClass.java"],
1906 sdk_version: "core_platform",
1907 apex_available: ["myapex"],
1908 }
1909 `,
1910 },
1911 {
1912 name: "Updatable apex with non-stable transitive dep",
1913 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.",
1914 bp: `
1915 apex {
1916 name: "myapex",
1917 java_libs: ["myjar"],
1918 key: "myapex.key",
1919 updatable: true,
1920 }
1921 apex_key {
1922 name: "myapex.key",
1923 public_key: "testkey.avbpubkey",
1924 private_key: "testkey.pem",
1925 }
1926 java_library {
1927 name: "myjar",
1928 srcs: ["foo/bar/MyClass.java"],
1929 sdk_version: "current",
1930 apex_available: ["myapex"],
1931 static_libs: ["transitive-jar"],
1932 }
1933 java_library {
1934 name: "transitive-jar",
1935 srcs: ["foo/bar/MyClass.java"],
1936 sdk_version: "core_platform",
1937 apex_available: ["myapex"],
1938 }
1939 `,
1940 },
1941 }
1942
1943 for _, test := range testCases {
1944 t.Run(test.name, func(t *testing.T) {
1945 if test.expectedError == "" {
1946 testApex(t, test.bp)
1947 } else {
1948 testApexError(t, test.expectedError, test.bp)
1949 }
1950 })
1951 }
1952}
1953
Jooyung Han749dc692020-04-15 11:03:39 +09001954func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
1955 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
1956 apex {
1957 name: "myapex",
1958 key: "myapex.key",
1959 native_shared_libs: ["mylib"],
1960 min_sdk_version: "29",
1961 }
1962
1963 apex_key {
1964 name: "myapex.key",
1965 public_key: "testkey.avbpubkey",
1966 private_key: "testkey.pem",
1967 }
1968
1969 cc_library {
1970 name: "mylib",
1971 srcs: ["mylib.cpp"],
1972 shared_libs: ["mylib2"],
1973 system_shared_libs: [],
1974 stl: "none",
1975 apex_available: [
1976 "myapex",
1977 ],
1978 min_sdk_version: "29",
1979 }
1980
1981 // indirect part of the apex
1982 cc_library {
1983 name: "mylib2",
1984 srcs: ["mylib.cpp"],
1985 system_shared_libs: [],
1986 stl: "none",
1987 apex_available: [
1988 "myapex",
1989 ],
1990 min_sdk_version: "30",
1991 }
1992 `)
1993}
1994
1995func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
1996 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
1997 apex {
1998 name: "myapex",
1999 key: "myapex.key",
2000 apps: ["AppFoo"],
2001 min_sdk_version: "29",
2002 }
2003
2004 apex_key {
2005 name: "myapex.key",
2006 public_key: "testkey.avbpubkey",
2007 private_key: "testkey.pem",
2008 }
2009
2010 android_app {
2011 name: "AppFoo",
2012 srcs: ["foo/bar/MyClass.java"],
2013 sdk_version: "current",
2014 min_sdk_version: "29",
2015 system_modules: "none",
2016 stl: "none",
2017 static_libs: ["bar"],
2018 apex_available: [ "myapex" ],
2019 }
2020
2021 java_library {
2022 name: "bar",
2023 sdk_version: "current",
2024 srcs: ["a.java"],
2025 apex_available: [ "myapex" ],
2026 }
2027 `)
2028}
2029
2030func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
2031 ctx, _ := testApex(t, `
2032 apex {
2033 name: "myapex",
2034 key: "myapex.key",
2035 native_shared_libs: ["mylib"],
2036 min_sdk_version: "29",
2037 }
2038
2039 apex_key {
2040 name: "myapex.key",
2041 public_key: "testkey.avbpubkey",
2042 private_key: "testkey.pem",
2043 }
2044
2045 // mylib in myapex will link to mylib2#29
2046 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2047 cc_library {
2048 name: "mylib",
2049 srcs: ["mylib.cpp"],
2050 shared_libs: ["mylib2"],
2051 system_shared_libs: [],
2052 stl: "none",
2053 apex_available: ["myapex", "otherapex"],
2054 min_sdk_version: "29",
2055 }
2056
2057 cc_library {
2058 name: "mylib2",
2059 srcs: ["mylib.cpp"],
2060 system_shared_libs: [],
2061 stl: "none",
2062 apex_available: ["otherapex"],
2063 stubs: { versions: ["29", "30"] },
2064 min_sdk_version: "30",
2065 }
2066
2067 apex {
2068 name: "otherapex",
2069 key: "myapex.key",
2070 native_shared_libs: ["mylib", "mylib2"],
2071 min_sdk_version: "30",
2072 }
2073 `)
2074 expectLink := func(from, from_variant, to, to_variant string) {
2075 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2076 libFlags := ld.Args["libFlags"]
2077 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2078 }
Colin Crossaede88c2020-08-11 12:17:01 -07002079 expectLink("mylib", "shared_apex29", "mylib2", "shared_29")
2080 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002081}
2082
Jiyong Park7c2ee712018-12-07 00:42:25 +09002083func TestFilesInSubDir(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002084 ctx, _ := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002085 apex {
2086 name: "myapex",
2087 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002088 native_shared_libs: ["mylib"],
2089 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002090 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002091 compile_multilib: "both",
Jiyong Park7c2ee712018-12-07 00:42:25 +09002092 }
2093
2094 apex_key {
2095 name: "myapex.key",
2096 public_key: "testkey.avbpubkey",
2097 private_key: "testkey.pem",
2098 }
2099
2100 prebuilt_etc {
2101 name: "myetc",
2102 src: "myprebuilt",
2103 sub_dir: "foo/bar",
2104 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002105
2106 cc_library {
2107 name: "mylib",
2108 srcs: ["mylib.cpp"],
2109 relative_install_path: "foo/bar",
2110 system_shared_libs: [],
2111 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002112 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002113 }
2114
2115 cc_binary {
2116 name: "mybin",
2117 srcs: ["mylib.cpp"],
2118 relative_install_path: "foo/bar",
2119 system_shared_libs: [],
2120 static_executable: true,
2121 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002122 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002123 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002124 `)
2125
Sundong Ahnabb64432019-10-22 13:58:29 +09002126 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002127 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2128
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002129 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002130 ensureListContains(t, dirs, "etc")
2131 ensureListContains(t, dirs, "etc/foo")
2132 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002133 ensureListContains(t, dirs, "lib64")
2134 ensureListContains(t, dirs, "lib64/foo")
2135 ensureListContains(t, dirs, "lib64/foo/bar")
2136 ensureListContains(t, dirs, "lib")
2137 ensureListContains(t, dirs, "lib/foo")
2138 ensureListContains(t, dirs, "lib/foo/bar")
2139
Jiyong Parkbd13e442019-03-15 18:10:35 +09002140 ensureListContains(t, dirs, "bin")
2141 ensureListContains(t, dirs, "bin/foo")
2142 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002143}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002144
Jooyung Han35155c42020-02-06 17:33:20 +09002145func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
2146 ctx, _ := testApex(t, `
2147 apex {
2148 name: "myapex",
2149 key: "myapex.key",
2150 multilib: {
2151 both: {
2152 native_shared_libs: ["mylib"],
2153 binaries: ["mybin"],
2154 },
2155 },
2156 compile_multilib: "both",
2157 native_bridge_supported: true,
2158 }
2159
2160 apex_key {
2161 name: "myapex.key",
2162 public_key: "testkey.avbpubkey",
2163 private_key: "testkey.pem",
2164 }
2165
2166 cc_library {
2167 name: "mylib",
2168 relative_install_path: "foo/bar",
2169 system_shared_libs: [],
2170 stl: "none",
2171 apex_available: [ "myapex" ],
2172 native_bridge_supported: true,
2173 }
2174
2175 cc_binary {
2176 name: "mybin",
2177 relative_install_path: "foo/bar",
2178 system_shared_libs: [],
2179 static_executable: true,
2180 stl: "none",
2181 apex_available: [ "myapex" ],
2182 native_bridge_supported: true,
2183 compile_multilib: "both", // default is "first" for binary
2184 multilib: {
2185 lib64: {
2186 suffix: "64",
2187 },
2188 },
2189 }
2190 `, withNativeBridgeEnabled)
2191 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2192 "bin/foo/bar/mybin",
2193 "bin/foo/bar/mybin64",
2194 "bin/arm/foo/bar/mybin",
2195 "bin/arm64/foo/bar/mybin64",
2196 "lib/foo/bar/mylib.so",
2197 "lib/arm/foo/bar/mylib.so",
2198 "lib64/foo/bar/mylib.so",
2199 "lib64/arm64/foo/bar/mylib.so",
2200 })
2201}
2202
Jiyong Parkda6eb592018-12-19 17:12:36 +09002203func TestUseVendor(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002204 ctx, _ := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002205 apex {
2206 name: "myapex",
2207 key: "myapex.key",
2208 native_shared_libs: ["mylib"],
2209 use_vendor: true,
2210 }
2211
2212 apex_key {
2213 name: "myapex.key",
2214 public_key: "testkey.avbpubkey",
2215 private_key: "testkey.pem",
2216 }
2217
2218 cc_library {
2219 name: "mylib",
2220 srcs: ["mylib.cpp"],
2221 shared_libs: ["mylib2"],
2222 system_shared_libs: [],
2223 vendor_available: true,
2224 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002225 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002226 }
2227
2228 cc_library {
2229 name: "mylib2",
2230 srcs: ["mylib.cpp"],
2231 system_shared_libs: [],
2232 vendor_available: true,
2233 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002234 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002235 }
Jooyung Handc782442019-11-01 03:14:38 +09002236 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002237 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002238 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002239
2240 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002241 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002242 for _, implicit := range i.Implicits {
2243 inputsList = append(inputsList, implicit.String())
2244 }
2245 }
2246 inputsString := strings.Join(inputsList, " ")
2247
2248 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002249 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2250 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002251
2252 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002253 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2254 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002255}
Jiyong Park16e91a02018-12-20 18:18:08 +09002256
Jooyung Han85d61762020-06-24 23:50:26 +09002257func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002258 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2259 apex {
2260 name: "myapex",
2261 key: "myapex.key",
2262 use_vendor: true,
2263 }
2264 apex_key {
2265 name: "myapex.key",
2266 public_key: "testkey.avbpubkey",
2267 private_key: "testkey.pem",
2268 }
2269 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002270 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002271 })
Colin Cross440e0d02020-06-11 11:32:11 -07002272 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002273 testApex(t, `
2274 apex {
2275 name: "myapex",
2276 key: "myapex.key",
2277 use_vendor: true,
2278 }
2279 apex_key {
2280 name: "myapex.key",
2281 public_key: "testkey.avbpubkey",
2282 private_key: "testkey.pem",
2283 }
2284 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002285 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002286 })
2287}
2288
Jooyung Han5c998b92019-06-27 11:30:33 +09002289func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2290 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2291 apex {
2292 name: "myapex",
2293 key: "myapex.key",
2294 native_shared_libs: ["mylib"],
2295 use_vendor: true,
2296 }
2297
2298 apex_key {
2299 name: "myapex.key",
2300 public_key: "testkey.avbpubkey",
2301 private_key: "testkey.pem",
2302 }
2303
2304 cc_library {
2305 name: "mylib",
2306 srcs: ["mylib.cpp"],
2307 system_shared_libs: [],
2308 stl: "none",
2309 }
2310 `)
2311}
2312
Jooyung Han85d61762020-06-24 23:50:26 +09002313func TestVendorApex(t *testing.T) {
2314 ctx, config := testApex(t, `
2315 apex {
2316 name: "myapex",
2317 key: "myapex.key",
2318 binaries: ["mybin"],
2319 vendor: true,
2320 }
2321 apex_key {
2322 name: "myapex.key",
2323 public_key: "testkey.avbpubkey",
2324 private_key: "testkey.pem",
2325 }
2326 cc_binary {
2327 name: "mybin",
2328 vendor: true,
2329 shared_libs: ["libfoo"],
2330 }
2331 cc_library {
2332 name: "libfoo",
2333 proprietary: true,
2334 }
2335 `)
2336
2337 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2338 "bin/mybin",
2339 "lib64/libfoo.so",
2340 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2341 "lib64/libc++.so",
2342 })
2343
2344 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2345 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2346 name := apexBundle.BaseModuleName()
2347 prefix := "TARGET_"
2348 var builder strings.Builder
2349 data.Custom(&builder, name, prefix, "", data)
2350 androidMk := builder.String()
2351 ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002352
2353 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2354 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2355 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002356}
2357
Jooyung Handf78e212020-07-22 15:54:47 +09002358func TestVendorApex_use_vndk_as_stable(t *testing.T) {
2359 ctx, _ := testApex(t, `
2360 apex {
2361 name: "myapex",
2362 key: "myapex.key",
2363 binaries: ["mybin"],
2364 vendor: true,
2365 use_vndk_as_stable: true,
2366 }
2367 apex_key {
2368 name: "myapex.key",
2369 public_key: "testkey.avbpubkey",
2370 private_key: "testkey.pem",
2371 }
2372 cc_binary {
2373 name: "mybin",
2374 vendor: true,
2375 shared_libs: ["libvndk", "libvendor"],
2376 }
2377 cc_library {
2378 name: "libvndk",
2379 vndk: {
2380 enabled: true,
2381 },
2382 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002383 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002384 }
2385 cc_library {
2386 name: "libvendor",
2387 vendor: true,
2388 }
2389 `)
2390
2391 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2392
Colin Crossaede88c2020-08-11 12:17:01 -07002393 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002394 libs := names(ldRule.Args["libFlags"])
2395 // VNDK libs(libvndk/libc++) as they are
2396 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2397 ensureListContains(t, libs, buildDir+"/.intermediates/libc++/"+vendorVariant+"_shared/libc++.so")
2398 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002399 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002400
2401 // VNDK libs are not included when use_vndk_as_stable: true
2402 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2403 "bin/mybin",
2404 "lib64/libvendor.so",
2405 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002406
2407 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2408 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2409 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002410}
2411
Jooyung Han8e5685d2020-09-21 11:02:57 +09002412func TestApex_withPrebuiltFirmware(t *testing.T) {
2413 testCases := []struct {
2414 name string
2415 additionalProp string
2416 }{
2417 {"system apex with prebuilt_firmware", ""},
2418 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2419 }
2420 for _, tc := range testCases {
2421 t.Run(tc.name, func(t *testing.T) {
2422 ctx, _ := testApex(t, `
2423 apex {
2424 name: "myapex",
2425 key: "myapex.key",
2426 prebuilts: ["myfirmware"],
2427 `+tc.additionalProp+`
2428 }
2429 apex_key {
2430 name: "myapex.key",
2431 public_key: "testkey.avbpubkey",
2432 private_key: "testkey.pem",
2433 }
2434 prebuilt_firmware {
2435 name: "myfirmware",
2436 src: "myfirmware.bin",
2437 filename_from_src: true,
2438 `+tc.additionalProp+`
2439 }
2440 `)
2441 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2442 "etc/firmware/myfirmware.bin",
2443 })
2444 })
2445 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002446}
2447
Jooyung Hanefb184e2020-06-25 17:14:25 +09002448func TestAndroidMk_UseVendorRequired(t *testing.T) {
2449 ctx, config := testApex(t, `
2450 apex {
2451 name: "myapex",
2452 key: "myapex.key",
2453 use_vendor: true,
2454 native_shared_libs: ["mylib"],
2455 }
2456
2457 apex_key {
2458 name: "myapex.key",
2459 public_key: "testkey.avbpubkey",
2460 private_key: "testkey.pem",
2461 }
2462
2463 cc_library {
2464 name: "mylib",
2465 vendor_available: true,
2466 apex_available: ["myapex"],
2467 }
2468 `, func(fs map[string][]byte, config android.Config) {
2469 setUseVendorAllowListForTest(config, []string{"myapex"})
2470 })
2471
2472 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2473 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2474 name := apexBundle.BaseModuleName()
2475 prefix := "TARGET_"
2476 var builder strings.Builder
2477 data.Custom(&builder, name, prefix, "", data)
2478 androidMk := builder.String()
2479 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2480}
2481
2482func TestAndroidMk_VendorApexRequired(t *testing.T) {
2483 ctx, config := testApex(t, `
2484 apex {
2485 name: "myapex",
2486 key: "myapex.key",
2487 vendor: true,
2488 native_shared_libs: ["mylib"],
2489 }
2490
2491 apex_key {
2492 name: "myapex.key",
2493 public_key: "testkey.avbpubkey",
2494 private_key: "testkey.pem",
2495 }
2496
2497 cc_library {
2498 name: "mylib",
2499 vendor_available: true,
2500 }
2501 `)
2502
2503 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2504 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2505 name := apexBundle.BaseModuleName()
2506 prefix := "TARGET_"
2507 var builder strings.Builder
2508 data.Custom(&builder, name, prefix, "", data)
2509 androidMk := builder.String()
2510 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2511}
2512
Jooyung Han2ed99d02020-06-24 23:26:26 +09002513func TestAndroidMkWritesCommonProperties(t *testing.T) {
2514 ctx, config := testApex(t, `
2515 apex {
2516 name: "myapex",
2517 key: "myapex.key",
2518 vintf_fragments: ["fragment.xml"],
2519 init_rc: ["init.rc"],
2520 }
2521 apex_key {
2522 name: "myapex.key",
2523 public_key: "testkey.avbpubkey",
2524 private_key: "testkey.pem",
2525 }
2526 cc_binary {
2527 name: "mybin",
2528 }
2529 `)
2530
2531 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2532 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
2533 name := apexBundle.BaseModuleName()
2534 prefix := "TARGET_"
2535 var builder strings.Builder
2536 data.Custom(&builder, name, prefix, "", data)
2537 androidMk := builder.String()
2538 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2539 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2540}
2541
Jiyong Park16e91a02018-12-20 18:18:08 +09002542func TestStaticLinking(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002543 ctx, _ := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002544 apex {
2545 name: "myapex",
2546 key: "myapex.key",
2547 native_shared_libs: ["mylib"],
2548 }
2549
2550 apex_key {
2551 name: "myapex.key",
2552 public_key: "testkey.avbpubkey",
2553 private_key: "testkey.pem",
2554 }
2555
2556 cc_library {
2557 name: "mylib",
2558 srcs: ["mylib.cpp"],
2559 system_shared_libs: [],
2560 stl: "none",
2561 stubs: {
2562 versions: ["1", "2", "3"],
2563 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002564 apex_available: [
2565 "//apex_available:platform",
2566 "myapex",
2567 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002568 }
2569
2570 cc_binary {
2571 name: "not_in_apex",
2572 srcs: ["mylib.cpp"],
2573 static_libs: ["mylib"],
2574 static_executable: true,
2575 system_shared_libs: [],
2576 stl: "none",
2577 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002578 `)
2579
Colin Cross7113d202019-11-20 16:39:12 -08002580 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002581
2582 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002583 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002584}
Jiyong Park9335a262018-12-24 11:31:58 +09002585
2586func TestKeys(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002587 ctx, _ := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002588 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002589 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002590 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002591 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002592 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002593 file_contexts: ":myapex-file_contexts",
Jiyong Park9335a262018-12-24 11:31:58 +09002594 }
2595
2596 cc_library {
2597 name: "mylib",
2598 srcs: ["mylib.cpp"],
2599 system_shared_libs: [],
2600 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002601 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002602 }
2603
2604 apex_key {
2605 name: "myapex.key",
2606 public_key: "testkey.avbpubkey",
2607 private_key: "testkey.pem",
2608 }
2609
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002610 android_app_certificate {
2611 name: "myapex.certificate",
2612 certificate: "testkey",
2613 }
2614
2615 android_app_certificate {
2616 name: "myapex.certificate.override",
2617 certificate: "testkey.override",
2618 }
2619
Jiyong Park9335a262018-12-24 11:31:58 +09002620 `)
2621
2622 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002623 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002624
2625 if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2626 t.Errorf("public key %q is not %q", keys.public_key_file.String(),
2627 "vendor/foo/devkeys/testkey.avbpubkey")
2628 }
2629 if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
2630 t.Errorf("private key %q is not %q", keys.private_key_file.String(),
2631 "vendor/foo/devkeys/testkey.pem")
2632 }
2633
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002634 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002635 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002636 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002637 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002638 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002639 }
2640}
Jiyong Park58e364a2019-01-19 19:24:06 +09002641
Jooyung Hanf121a652019-12-17 14:30:11 +09002642func TestCertificate(t *testing.T) {
2643 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
2644 ctx, _ := testApex(t, `
2645 apex {
2646 name: "myapex",
2647 key: "myapex.key",
2648 }
2649 apex_key {
2650 name: "myapex.key",
2651 public_key: "testkey.avbpubkey",
2652 private_key: "testkey.pem",
2653 }`)
2654 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2655 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2656 if actual := rule.Args["certificates"]; actual != expected {
2657 t.Errorf("certificates should be %q, not %q", expected, actual)
2658 }
2659 })
2660 t.Run("override when unspecified", func(t *testing.T) {
2661 ctx, _ := testApex(t, `
2662 apex {
2663 name: "myapex_keytest",
2664 key: "myapex.key",
2665 file_contexts: ":myapex-file_contexts",
2666 }
2667 apex_key {
2668 name: "myapex.key",
2669 public_key: "testkey.avbpubkey",
2670 private_key: "testkey.pem",
2671 }
2672 android_app_certificate {
2673 name: "myapex.certificate.override",
2674 certificate: "testkey.override",
2675 }`)
2676 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2677 expected := "testkey.override.x509.pem testkey.override.pk8"
2678 if actual := rule.Args["certificates"]; actual != expected {
2679 t.Errorf("certificates should be %q, not %q", expected, actual)
2680 }
2681 })
2682 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
2683 ctx, _ := testApex(t, `
2684 apex {
2685 name: "myapex",
2686 key: "myapex.key",
2687 certificate: ":myapex.certificate",
2688 }
2689 apex_key {
2690 name: "myapex.key",
2691 public_key: "testkey.avbpubkey",
2692 private_key: "testkey.pem",
2693 }
2694 android_app_certificate {
2695 name: "myapex.certificate",
2696 certificate: "testkey",
2697 }`)
2698 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2699 expected := "testkey.x509.pem testkey.pk8"
2700 if actual := rule.Args["certificates"]; actual != expected {
2701 t.Errorf("certificates should be %q, not %q", expected, actual)
2702 }
2703 })
2704 t.Run("override when specifiec as <:module>", func(t *testing.T) {
2705 ctx, _ := testApex(t, `
2706 apex {
2707 name: "myapex_keytest",
2708 key: "myapex.key",
2709 file_contexts: ":myapex-file_contexts",
2710 certificate: ":myapex.certificate",
2711 }
2712 apex_key {
2713 name: "myapex.key",
2714 public_key: "testkey.avbpubkey",
2715 private_key: "testkey.pem",
2716 }
2717 android_app_certificate {
2718 name: "myapex.certificate.override",
2719 certificate: "testkey.override",
2720 }`)
2721 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2722 expected := "testkey.override.x509.pem testkey.override.pk8"
2723 if actual := rule.Args["certificates"]; actual != expected {
2724 t.Errorf("certificates should be %q, not %q", expected, actual)
2725 }
2726 })
2727 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
2728 ctx, _ := testApex(t, `
2729 apex {
2730 name: "myapex",
2731 key: "myapex.key",
2732 certificate: "testkey",
2733 }
2734 apex_key {
2735 name: "myapex.key",
2736 public_key: "testkey.avbpubkey",
2737 private_key: "testkey.pem",
2738 }`)
2739 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2740 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2741 if actual := rule.Args["certificates"]; actual != expected {
2742 t.Errorf("certificates should be %q, not %q", expected, actual)
2743 }
2744 })
2745 t.Run("override when specified as <name>", func(t *testing.T) {
2746 ctx, _ := testApex(t, `
2747 apex {
2748 name: "myapex_keytest",
2749 key: "myapex.key",
2750 file_contexts: ":myapex-file_contexts",
2751 certificate: "testkey",
2752 }
2753 apex_key {
2754 name: "myapex.key",
2755 public_key: "testkey.avbpubkey",
2756 private_key: "testkey.pem",
2757 }
2758 android_app_certificate {
2759 name: "myapex.certificate.override",
2760 certificate: "testkey.override",
2761 }`)
2762 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2763 expected := "testkey.override.x509.pem testkey.override.pk8"
2764 if actual := rule.Args["certificates"]; actual != expected {
2765 t.Errorf("certificates should be %q, not %q", expected, actual)
2766 }
2767 })
2768}
2769
Jiyong Park58e364a2019-01-19 19:24:06 +09002770func TestMacro(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002771 ctx, _ := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002772 apex {
2773 name: "myapex",
2774 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002775 native_shared_libs: ["mylib", "mylib2"],
Jiyong Park58e364a2019-01-19 19:24:06 +09002776 }
2777
2778 apex {
2779 name: "otherapex",
2780 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002781 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002782 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002783 }
2784
2785 apex_key {
2786 name: "myapex.key",
2787 public_key: "testkey.avbpubkey",
2788 private_key: "testkey.pem",
2789 }
2790
2791 cc_library {
2792 name: "mylib",
2793 srcs: ["mylib.cpp"],
2794 system_shared_libs: [],
2795 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002796 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002797 "myapex",
2798 "otherapex",
2799 ],
Jooyung Han24282772020-03-21 23:20:55 +09002800 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002801 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002802 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002803 cc_library {
2804 name: "mylib2",
2805 srcs: ["mylib.cpp"],
2806 system_shared_libs: [],
2807 stl: "none",
2808 apex_available: [
2809 "myapex",
2810 "otherapex",
2811 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002812 static_libs: ["mylib3"],
2813 recovery_available: true,
2814 min_sdk_version: "29",
2815 }
2816 cc_library {
2817 name: "mylib3",
2818 srcs: ["mylib.cpp"],
2819 system_shared_libs: [],
2820 stl: "none",
2821 apex_available: [
2822 "myapex",
2823 "otherapex",
2824 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002825 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002826 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002827 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002828 }
Jiyong Park58e364a2019-01-19 19:24:06 +09002829 `)
2830
Jooyung Hanc87a0592020-03-02 17:44:33 +09002831 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08002832 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002833 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002834 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002835
Jooyung Hanccce2f22020-03-07 03:45:53 +09002836 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002837 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002838 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002839 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09002840 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09002841
Jooyung Hanccce2f22020-03-07 03:45:53 +09002842 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07002843 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09002844 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002845 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09002846 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002847
Colin Crossaede88c2020-08-11 12:17:01 -07002848 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
2849 // each variant defines additional macros to distinguish which apex variant it is built for
2850
2851 // non-APEX variant does not have __ANDROID_APEX__ defined
2852 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2853 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2854
2855 // APEX variant has __ANDROID_APEX__ defined
2856 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
2857 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2858 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2859 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2860
2861 // APEX variant has __ANDROID_APEX__ defined
2862 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
2863 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2864 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
2865 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
2866
Dan Albertb19953d2020-11-17 15:29:36 -08002867 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002868 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2869 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002870 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07002871
2872 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
2873 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09002874
2875 // non-APEX variant does not have __ANDROID_APEX__ defined
2876 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
2877 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
2878
2879 // APEX variant has __ANDROID_APEX__ defined
2880 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002881 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002882 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002883 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002884
Jooyung Hanc87a0592020-03-02 17:44:33 +09002885 // APEX variant has __ANDROID_APEX__ defined
2886 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09002887 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09002888 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07002889 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09002890
Dan Albertb19953d2020-11-17 15:29:36 -08002891 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07002892 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09002893 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08002894 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09002895}
Jiyong Park7e636d02019-01-28 16:16:54 +09002896
2897func TestHeaderLibsDependency(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07002898 ctx, _ := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09002899 apex {
2900 name: "myapex",
2901 key: "myapex.key",
2902 native_shared_libs: ["mylib"],
2903 }
2904
2905 apex_key {
2906 name: "myapex.key",
2907 public_key: "testkey.avbpubkey",
2908 private_key: "testkey.pem",
2909 }
2910
2911 cc_library_headers {
2912 name: "mylib_headers",
2913 export_include_dirs: ["my_include"],
2914 system_shared_libs: [],
2915 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09002916 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002917 }
2918
2919 cc_library {
2920 name: "mylib",
2921 srcs: ["mylib.cpp"],
2922 system_shared_libs: [],
2923 stl: "none",
2924 header_libs: ["mylib_headers"],
2925 export_header_lib_headers: ["mylib_headers"],
2926 stubs: {
2927 versions: ["1", "2", "3"],
2928 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002929 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09002930 }
2931
2932 cc_library {
2933 name: "otherlib",
2934 srcs: ["mylib.cpp"],
2935 system_shared_libs: [],
2936 stl: "none",
2937 shared_libs: ["mylib"],
2938 }
2939 `)
2940
Colin Cross7113d202019-11-20 16:39:12 -08002941 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09002942
2943 // Ensure that the include path of the header lib is exported to 'otherlib'
2944 ensureContains(t, cFlags, "-Imy_include")
2945}
Alex Light9670d332019-01-29 18:07:33 -08002946
Jiyong Park7cd10e32020-01-14 09:22:18 +09002947type fileInApex struct {
2948 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00002949 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09002950 isLink bool
2951}
2952
Jooyung Hana57af4a2020-01-23 05:36:59 +00002953func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09002954 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00002955 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09002956 copyCmds := apexRule.Args["copy_commands"]
2957 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09002958 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09002959 for _, cmd := range strings.Split(copyCmds, "&&") {
2960 cmd = strings.TrimSpace(cmd)
2961 if cmd == "" {
2962 continue
2963 }
2964 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00002965 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09002966 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09002967 switch terms[0] {
2968 case "mkdir":
2969 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09002970 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09002971 t.Fatal("copyCmds contains invalid cp command", cmd)
2972 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002973 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002974 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002975 isLink = false
2976 case "ln":
2977 if len(terms) != 3 && len(terms) != 4 {
2978 // ln LINK TARGET or ln -s LINK TARGET
2979 t.Fatal("copyCmds contains invalid ln command", cmd)
2980 }
2981 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002982 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09002983 isLink = true
2984 default:
2985 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
2986 }
2987 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09002988 index := strings.Index(dst, imageApexDir)
2989 if index == -1 {
2990 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
2991 }
2992 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00002993 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09002994 }
2995 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09002996 return ret
2997}
2998
Jooyung Hana57af4a2020-01-23 05:36:59 +00002999func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3000 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003001 var failed bool
3002 var surplus []string
3003 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003004 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003005 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003006 for _, expected := range files {
3007 if matched, _ := path.Match(expected, file.path); matched {
3008 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003009 mactchFound = true
3010 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003011 }
3012 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003013 if !mactchFound {
3014 surplus = append(surplus, file.path)
3015 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003016 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003017
Jooyung Han31c470b2019-10-18 16:26:59 +09003018 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003019 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003020 t.Log("surplus files", surplus)
3021 failed = true
3022 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003023
3024 if len(files) > len(filesMatched) {
3025 var missing []string
3026 for _, expected := range files {
3027 if !filesMatched[expected] {
3028 missing = append(missing, expected)
3029 }
3030 }
3031 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003032 t.Log("missing files", missing)
3033 failed = true
3034 }
3035 if failed {
3036 t.Fail()
3037 }
3038}
3039
Jooyung Han344d5432019-08-23 11:17:39 +09003040func TestVndkApexCurrent(t *testing.T) {
3041 ctx, _ := testApex(t, `
3042 apex_vndk {
3043 name: "myapex",
3044 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003045 }
3046
3047 apex_key {
3048 name: "myapex.key",
3049 public_key: "testkey.avbpubkey",
3050 private_key: "testkey.pem",
3051 }
3052
3053 cc_library {
3054 name: "libvndk",
3055 srcs: ["mylib.cpp"],
3056 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003057 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003058 vndk: {
3059 enabled: true,
3060 },
3061 system_shared_libs: [],
3062 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003063 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003064 }
3065
3066 cc_library {
3067 name: "libvndksp",
3068 srcs: ["mylib.cpp"],
3069 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003070 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003071 vndk: {
3072 enabled: true,
3073 support_system_process: true,
3074 },
3075 system_shared_libs: [],
3076 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003077 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003078 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003079 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003080
Jooyung Hana57af4a2020-01-23 05:36:59 +00003081 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003082 "lib/libvndk.so",
3083 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003084 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003085 "lib64/libvndk.so",
3086 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003087 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003088 "etc/llndk.libraries.VER.txt",
3089 "etc/vndkcore.libraries.VER.txt",
3090 "etc/vndksp.libraries.VER.txt",
3091 "etc/vndkprivate.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003092 })
Jooyung Han344d5432019-08-23 11:17:39 +09003093}
3094
3095func TestVndkApexWithPrebuilt(t *testing.T) {
3096 ctx, _ := testApex(t, `
3097 apex_vndk {
3098 name: "myapex",
3099 key: "myapex.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003100 }
3101
3102 apex_key {
3103 name: "myapex.key",
3104 public_key: "testkey.avbpubkey",
3105 private_key: "testkey.pem",
3106 }
3107
3108 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003109 name: "libvndk",
3110 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003111 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003112 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003113 vndk: {
3114 enabled: true,
3115 },
3116 system_shared_libs: [],
3117 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003118 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003119 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003120
3121 cc_prebuilt_library_shared {
3122 name: "libvndk.arm",
3123 srcs: ["libvndk.arm.so"],
3124 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003125 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003126 vndk: {
3127 enabled: true,
3128 },
3129 enabled: false,
3130 arch: {
3131 arm: {
3132 enabled: true,
3133 },
3134 },
3135 system_shared_libs: [],
3136 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003137 apex_available: [ "myapex" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003138 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003139 `+vndkLibrariesTxtFiles("current"),
3140 withFiles(map[string][]byte{
3141 "libvndk.so": nil,
3142 "libvndk.arm.so": nil,
3143 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003144
Jooyung Hana57af4a2020-01-23 05:36:59 +00003145 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003146 "lib/libvndk.so",
3147 "lib/libvndk.arm.so",
3148 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003149 "lib/libc++.so",
3150 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003151 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003152 })
Jooyung Han344d5432019-08-23 11:17:39 +09003153}
3154
Jooyung Han39edb6c2019-11-06 16:53:07 +09003155func vndkLibrariesTxtFiles(vers ...string) (result string) {
3156 for _, v := range vers {
3157 if v == "current" {
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +09003158 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003159 result += `
3160 vndk_libraries_txt {
3161 name: "` + txt + `.libraries.txt",
3162 }
3163 `
3164 }
3165 } else {
3166 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
3167 result += `
3168 prebuilt_etc {
3169 name: "` + txt + `.libraries.` + v + `.txt",
3170 src: "dummy.txt",
3171 }
3172 `
3173 }
3174 }
3175 }
3176 return
3177}
3178
Jooyung Han344d5432019-08-23 11:17:39 +09003179func TestVndkApexVersion(t *testing.T) {
3180 ctx, _ := testApex(t, `
3181 apex_vndk {
3182 name: "myapex_v27",
3183 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003184 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003185 vndk_version: "27",
3186 }
3187
3188 apex_key {
3189 name: "myapex.key",
3190 public_key: "testkey.avbpubkey",
3191 private_key: "testkey.pem",
3192 }
3193
Jooyung Han31c470b2019-10-18 16:26:59 +09003194 vndk_prebuilt_shared {
3195 name: "libvndk27",
3196 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003197 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003198 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003199 vndk: {
3200 enabled: true,
3201 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003202 target_arch: "arm64",
3203 arch: {
3204 arm: {
3205 srcs: ["libvndk27_arm.so"],
3206 },
3207 arm64: {
3208 srcs: ["libvndk27_arm64.so"],
3209 },
3210 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003211 apex_available: [ "myapex_v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003212 }
3213
3214 vndk_prebuilt_shared {
3215 name: "libvndk27",
3216 version: "27",
3217 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003218 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003219 vndk: {
3220 enabled: true,
3221 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003222 target_arch: "x86_64",
3223 arch: {
3224 x86: {
3225 srcs: ["libvndk27_x86.so"],
3226 },
3227 x86_64: {
3228 srcs: ["libvndk27_x86_64.so"],
3229 },
3230 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003231 }
3232 `+vndkLibrariesTxtFiles("27"),
3233 withFiles(map[string][]byte{
3234 "libvndk27_arm.so": nil,
3235 "libvndk27_arm64.so": nil,
3236 "libvndk27_x86.so": nil,
3237 "libvndk27_x86_64.so": nil,
3238 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003239
Jooyung Hana57af4a2020-01-23 05:36:59 +00003240 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003241 "lib/libvndk27_arm.so",
3242 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003243 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003244 })
Jooyung Han344d5432019-08-23 11:17:39 +09003245}
3246
3247func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
3248 testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
3249 apex_vndk {
3250 name: "myapex_v27",
3251 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003252 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003253 vndk_version: "27",
3254 }
3255 apex_vndk {
3256 name: "myapex_v27_other",
3257 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003258 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003259 vndk_version: "27",
3260 }
3261
3262 apex_key {
3263 name: "myapex.key",
3264 public_key: "testkey.avbpubkey",
3265 private_key: "testkey.pem",
3266 }
3267
3268 cc_library {
3269 name: "libvndk",
3270 srcs: ["mylib.cpp"],
3271 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003272 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003273 vndk: {
3274 enabled: true,
3275 },
3276 system_shared_libs: [],
3277 stl: "none",
3278 }
3279
3280 vndk_prebuilt_shared {
3281 name: "libvndk",
3282 version: "27",
3283 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003284 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003285 vndk: {
3286 enabled: true,
3287 },
3288 srcs: ["libvndk.so"],
3289 }
3290 `, withFiles(map[string][]byte{
3291 "libvndk.so": nil,
3292 }))
3293}
3294
Jooyung Han90eee022019-10-01 20:02:42 +09003295func TestVndkApexNameRule(t *testing.T) {
3296 ctx, _ := testApex(t, `
3297 apex_vndk {
3298 name: "myapex",
3299 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003300 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003301 }
3302 apex_vndk {
3303 name: "myapex_v28",
3304 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003305 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003306 vndk_version: "28",
3307 }
3308 apex_key {
3309 name: "myapex.key",
3310 public_key: "testkey.avbpubkey",
3311 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003312 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003313
3314 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003315 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003316 actual := proptools.String(bundle.properties.Apex_name)
3317 if !reflect.DeepEqual(actual, expected) {
3318 t.Errorf("Got '%v', expected '%v'", actual, expected)
3319 }
3320 }
3321
3322 assertApexName("com.android.vndk.vVER", "myapex")
3323 assertApexName("com.android.vndk.v28", "myapex_v28")
3324}
3325
Jooyung Han344d5432019-08-23 11:17:39 +09003326func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
3327 ctx, _ := testApex(t, `
3328 apex_vndk {
3329 name: "myapex",
3330 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003331 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003332 }
3333
3334 apex_key {
3335 name: "myapex.key",
3336 public_key: "testkey.avbpubkey",
3337 private_key: "testkey.pem",
3338 }
3339
3340 cc_library {
3341 name: "libvndk",
3342 srcs: ["mylib.cpp"],
3343 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003344 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003345 native_bridge_supported: true,
3346 host_supported: true,
3347 vndk: {
3348 enabled: true,
3349 },
3350 system_shared_libs: [],
3351 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003352 apex_available: [ "myapex" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003353 }
Jooyung Han35155c42020-02-06 17:33:20 +09003354 `+vndkLibrariesTxtFiles("current"), withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003355
Jooyung Hana57af4a2020-01-23 05:36:59 +00003356 ensureExactContents(t, ctx, "myapex", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003357 "lib/libvndk.so",
3358 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003359 "lib/libc++.so",
3360 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003361 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003362 })
Jooyung Han344d5432019-08-23 11:17:39 +09003363}
3364
3365func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
3366 testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
3367 apex_vndk {
3368 name: "myapex",
3369 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003370 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003371 native_bridge_supported: true,
3372 }
3373
3374 apex_key {
3375 name: "myapex.key",
3376 public_key: "testkey.avbpubkey",
3377 private_key: "testkey.pem",
3378 }
3379
3380 cc_library {
3381 name: "libvndk",
3382 srcs: ["mylib.cpp"],
3383 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003384 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003385 native_bridge_supported: true,
3386 host_supported: true,
3387 vndk: {
3388 enabled: true,
3389 },
3390 system_shared_libs: [],
3391 stl: "none",
3392 }
3393 `)
3394}
3395
Jooyung Han31c470b2019-10-18 16:26:59 +09003396func TestVndkApexWithBinder32(t *testing.T) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003397 ctx, _ := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003398 apex_vndk {
3399 name: "myapex_v27",
3400 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003401 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003402 vndk_version: "27",
3403 }
3404
3405 apex_key {
3406 name: "myapex.key",
3407 public_key: "testkey.avbpubkey",
3408 private_key: "testkey.pem",
3409 }
3410
3411 vndk_prebuilt_shared {
3412 name: "libvndk27",
3413 version: "27",
3414 target_arch: "arm",
3415 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003416 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003417 vndk: {
3418 enabled: true,
3419 },
3420 arch: {
3421 arm: {
3422 srcs: ["libvndk27.so"],
3423 }
3424 },
3425 }
3426
3427 vndk_prebuilt_shared {
3428 name: "libvndk27",
3429 version: "27",
3430 target_arch: "arm",
3431 binder32bit: true,
3432 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003433 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003434 vndk: {
3435 enabled: true,
3436 },
3437 arch: {
3438 arm: {
3439 srcs: ["libvndk27binder32.so"],
3440 }
3441 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003442 apex_available: [ "myapex_v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003443 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003444 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003445 withFiles(map[string][]byte{
3446 "libvndk27.so": nil,
3447 "libvndk27binder32.so": nil,
3448 }),
3449 withBinder32bit,
3450 withTargets(map[android.OsType][]android.Target{
3451 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003452 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3453 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003454 },
3455 }),
3456 )
3457
Jooyung Hana57af4a2020-01-23 05:36:59 +00003458 ensureExactContents(t, ctx, "myapex_v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003459 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003460 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003461 })
3462}
3463
Jooyung Han45a96772020-06-15 14:59:42 +09003464func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
3465 ctx, _ := testApex(t, `
3466 apex_vndk {
3467 name: "myapex",
3468 key: "myapex.key",
3469 file_contexts: ":myapex-file_contexts",
3470 }
3471
3472 apex_key {
3473 name: "myapex.key",
3474 public_key: "testkey.avbpubkey",
3475 private_key: "testkey.pem",
3476 }
3477
3478 cc_library {
3479 name: "libz",
3480 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003481 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003482 vndk: {
3483 enabled: true,
3484 },
3485 stubs: {
3486 symbol_file: "libz.map.txt",
3487 versions: ["30"],
3488 }
3489 }
3490 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3491 "libz.map.txt": nil,
3492 }))
3493
3494 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_image").Rule("apexManifestRule")
3495 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3496 ensureListEmpty(t, provideNativeLibs)
3497}
3498
Jooyung Hane1633032019-08-01 17:41:43 +09003499func TestDependenciesInApexManifest(t *testing.T) {
3500 ctx, _ := testApex(t, `
3501 apex {
3502 name: "myapex_nodep",
3503 key: "myapex.key",
3504 native_shared_libs: ["lib_nodep"],
3505 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003506 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003507 }
3508
3509 apex {
3510 name: "myapex_dep",
3511 key: "myapex.key",
3512 native_shared_libs: ["lib_dep"],
3513 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003514 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003515 }
3516
3517 apex {
3518 name: "myapex_provider",
3519 key: "myapex.key",
3520 native_shared_libs: ["libfoo"],
3521 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003522 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003523 }
3524
3525 apex {
3526 name: "myapex_selfcontained",
3527 key: "myapex.key",
3528 native_shared_libs: ["lib_dep", "libfoo"],
3529 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003530 file_contexts: ":myapex-file_contexts",
Jooyung Hane1633032019-08-01 17:41:43 +09003531 }
3532
3533 apex_key {
3534 name: "myapex.key",
3535 public_key: "testkey.avbpubkey",
3536 private_key: "testkey.pem",
3537 }
3538
3539 cc_library {
3540 name: "lib_nodep",
3541 srcs: ["mylib.cpp"],
3542 system_shared_libs: [],
3543 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003544 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003545 }
3546
3547 cc_library {
3548 name: "lib_dep",
3549 srcs: ["mylib.cpp"],
3550 shared_libs: ["libfoo"],
3551 system_shared_libs: [],
3552 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003553 apex_available: [
3554 "myapex_dep",
3555 "myapex_provider",
3556 "myapex_selfcontained",
3557 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003558 }
3559
3560 cc_library {
3561 name: "libfoo",
3562 srcs: ["mytest.cpp"],
3563 stubs: {
3564 versions: ["1"],
3565 },
3566 system_shared_libs: [],
3567 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003568 apex_available: [
3569 "myapex_provider",
3570 "myapex_selfcontained",
3571 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003572 }
3573 `)
3574
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003575 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003576 var provideNativeLibs, requireNativeLibs []string
3577
Sundong Ahnabb64432019-10-22 13:58:29 +09003578 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003579 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3580 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003581 ensureListEmpty(t, provideNativeLibs)
3582 ensureListEmpty(t, requireNativeLibs)
3583
Sundong Ahnabb64432019-10-22 13:58:29 +09003584 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003585 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3586 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003587 ensureListEmpty(t, provideNativeLibs)
3588 ensureListContains(t, requireNativeLibs, "libfoo.so")
3589
Sundong Ahnabb64432019-10-22 13:58:29 +09003590 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003591 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3592 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003593 ensureListContains(t, provideNativeLibs, "libfoo.so")
3594 ensureListEmpty(t, requireNativeLibs)
3595
Sundong Ahnabb64432019-10-22 13:58:29 +09003596 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003597 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3598 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003599 ensureListContains(t, provideNativeLibs, "libfoo.so")
3600 ensureListEmpty(t, requireNativeLibs)
3601}
3602
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003603func TestApexName(t *testing.T) {
Jiyong Parkdb334862020-02-05 17:19:28 +09003604 ctx, config := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003605 apex {
3606 name: "myapex",
3607 key: "myapex.key",
3608 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003609 native_shared_libs: ["mylib"],
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003610 }
3611
3612 apex_key {
3613 name: "myapex.key",
3614 public_key: "testkey.avbpubkey",
3615 private_key: "testkey.pem",
3616 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003617
3618 cc_library {
3619 name: "mylib",
3620 srcs: ["mylib.cpp"],
3621 system_shared_libs: [],
3622 stl: "none",
3623 apex_available: [
3624 "//apex_available:platform",
3625 "myapex",
3626 ],
3627 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003628 `)
3629
Sundong Ahnabb64432019-10-22 13:58:29 +09003630 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003631 apexManifestRule := module.Rule("apexManifestRule")
3632 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3633 apexRule := module.Rule("apexRule")
3634 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003635
3636 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3637 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
3638 name := apexBundle.BaseModuleName()
3639 prefix := "TARGET_"
3640 var builder strings.Builder
3641 data.Custom(&builder, name, prefix, "", data)
3642 androidMk := builder.String()
3643 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3644 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003645}
3646
Alex Light0851b882019-02-07 13:20:53 -08003647func TestNonTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003648 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003649 apex {
3650 name: "myapex",
3651 key: "myapex.key",
3652 native_shared_libs: ["mylib_common"],
3653 }
3654
3655 apex_key {
3656 name: "myapex.key",
3657 public_key: "testkey.avbpubkey",
3658 private_key: "testkey.pem",
3659 }
3660
3661 cc_library {
3662 name: "mylib_common",
3663 srcs: ["mylib.cpp"],
3664 system_shared_libs: [],
3665 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003666 apex_available: [
3667 "//apex_available:platform",
3668 "myapex",
3669 ],
Alex Light0851b882019-02-07 13:20:53 -08003670 }
3671 `)
3672
Sundong Ahnabb64432019-10-22 13:58:29 +09003673 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003674 apexRule := module.Rule("apexRule")
3675 copyCmds := apexRule.Args["copy_commands"]
3676
3677 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3678 t.Log("Apex was a test apex!")
3679 t.Fail()
3680 }
3681 // Ensure that main rule creates an output
3682 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3683
3684 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003685 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003686
3687 // Ensure that both direct and indirect deps are copied into apex
3688 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3689
Colin Cross7113d202019-11-20 16:39:12 -08003690 // Ensure that the platform variant ends with _shared
3691 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003692
Colin Cross56a83212020-09-15 18:30:11 -07003693 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003694 t.Log("Found mylib_common not in any apex!")
3695 t.Fail()
3696 }
3697}
3698
3699func TestTestApex(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003700 ctx, _ := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003701 apex_test {
3702 name: "myapex",
3703 key: "myapex.key",
3704 native_shared_libs: ["mylib_common_test"],
3705 }
3706
3707 apex_key {
3708 name: "myapex.key",
3709 public_key: "testkey.avbpubkey",
3710 private_key: "testkey.pem",
3711 }
3712
3713 cc_library {
3714 name: "mylib_common_test",
3715 srcs: ["mylib.cpp"],
3716 system_shared_libs: [],
3717 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003718 // TODO: remove //apex_available:platform
3719 apex_available: [
3720 "//apex_available:platform",
3721 "myapex",
3722 ],
Alex Light0851b882019-02-07 13:20:53 -08003723 }
3724 `)
3725
Sundong Ahnabb64432019-10-22 13:58:29 +09003726 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003727 apexRule := module.Rule("apexRule")
3728 copyCmds := apexRule.Args["copy_commands"]
3729
3730 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3731 t.Log("Apex was not a test apex!")
3732 t.Fail()
3733 }
3734 // Ensure that main rule creates an output
3735 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3736
3737 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003738 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003739
3740 // Ensure that both direct and indirect deps are copied into apex
3741 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3742
Colin Cross7113d202019-11-20 16:39:12 -08003743 // Ensure that the platform variant ends with _shared
3744 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003745}
3746
Alex Light9670d332019-01-29 18:07:33 -08003747func TestApexWithTarget(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003748 ctx, _ := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003749 apex {
3750 name: "myapex",
3751 key: "myapex.key",
3752 multilib: {
3753 first: {
3754 native_shared_libs: ["mylib_common"],
3755 }
3756 },
3757 target: {
3758 android: {
3759 multilib: {
3760 first: {
3761 native_shared_libs: ["mylib"],
3762 }
3763 }
3764 },
3765 host: {
3766 multilib: {
3767 first: {
3768 native_shared_libs: ["mylib2"],
3769 }
3770 }
3771 }
3772 }
3773 }
3774
3775 apex_key {
3776 name: "myapex.key",
3777 public_key: "testkey.avbpubkey",
3778 private_key: "testkey.pem",
3779 }
3780
3781 cc_library {
3782 name: "mylib",
3783 srcs: ["mylib.cpp"],
3784 system_shared_libs: [],
3785 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003786 // TODO: remove //apex_available:platform
3787 apex_available: [
3788 "//apex_available:platform",
3789 "myapex",
3790 ],
Alex Light9670d332019-01-29 18:07:33 -08003791 }
3792
3793 cc_library {
3794 name: "mylib_common",
3795 srcs: ["mylib.cpp"],
3796 system_shared_libs: [],
3797 stl: "none",
3798 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003799 // TODO: remove //apex_available:platform
3800 apex_available: [
3801 "//apex_available:platform",
3802 "myapex",
3803 ],
Alex Light9670d332019-01-29 18:07:33 -08003804 }
3805
3806 cc_library {
3807 name: "mylib2",
3808 srcs: ["mylib.cpp"],
3809 system_shared_libs: [],
3810 stl: "none",
3811 compile_multilib: "first",
3812 }
3813 `)
3814
Sundong Ahnabb64432019-10-22 13:58:29 +09003815 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003816 copyCmds := apexRule.Args["copy_commands"]
3817
3818 // Ensure that main rule creates an output
3819 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3820
3821 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003822 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3823 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3824 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003825
3826 // Ensure that both direct and indirect deps are copied into apex
3827 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3828 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3829 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3830
Colin Cross7113d202019-11-20 16:39:12 -08003831 // Ensure that the platform variant ends with _shared
3832 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3833 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3834 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003835}
Jiyong Park04480cf2019-02-06 00:16:29 +09003836
3837func TestApexWithShBinary(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07003838 ctx, _ := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09003839 apex {
3840 name: "myapex",
3841 key: "myapex.key",
3842 binaries: ["myscript"],
3843 }
3844
3845 apex_key {
3846 name: "myapex.key",
3847 public_key: "testkey.avbpubkey",
3848 private_key: "testkey.pem",
3849 }
3850
3851 sh_binary {
3852 name: "myscript",
3853 src: "mylib.cpp",
3854 filename: "myscript.sh",
3855 sub_dir: "script",
3856 }
3857 `)
3858
Sundong Ahnabb64432019-10-22 13:58:29 +09003859 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09003860 copyCmds := apexRule.Args["copy_commands"]
3861
3862 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
3863}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003864
Jooyung Han91df2082019-11-20 01:49:42 +09003865func TestApexInVariousPartition(t *testing.T) {
3866 testcases := []struct {
3867 propName, parition, flattenedPartition string
3868 }{
3869 {"", "system", "system_ext"},
3870 {"product_specific: true", "product", "product"},
3871 {"soc_specific: true", "vendor", "vendor"},
3872 {"proprietary: true", "vendor", "vendor"},
3873 {"vendor: true", "vendor", "vendor"},
3874 {"system_ext_specific: true", "system_ext", "system_ext"},
3875 }
3876 for _, tc := range testcases {
3877 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
3878 ctx, _ := testApex(t, `
3879 apex {
3880 name: "myapex",
3881 key: "myapex.key",
3882 `+tc.propName+`
3883 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003884
Jooyung Han91df2082019-11-20 01:49:42 +09003885 apex_key {
3886 name: "myapex.key",
3887 public_key: "testkey.avbpubkey",
3888 private_key: "testkey.pem",
3889 }
3890 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003891
Jooyung Han91df2082019-11-20 01:49:42 +09003892 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
3893 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
3894 actual := apex.installDir.String()
3895 if actual != expected {
3896 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3897 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003898
Jooyung Han91df2082019-11-20 01:49:42 +09003899 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
3900 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
3901 actual = flattened.installDir.String()
3902 if actual != expected {
3903 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
3904 }
3905 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003906 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003907}
Jiyong Park67882562019-03-21 01:11:21 +09003908
Jooyung Han580eb4f2020-06-24 19:33:06 +09003909func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003910 ctx, _ := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003911 apex {
3912 name: "myapex",
3913 key: "myapex.key",
3914 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003915
Jooyung Han580eb4f2020-06-24 19:33:06 +09003916 apex_key {
3917 name: "myapex.key",
3918 public_key: "testkey.avbpubkey",
3919 private_key: "testkey.pem",
3920 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003921 `)
3922 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09003923 rule := module.Output("file_contexts")
3924 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
3925}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003926
Jooyung Han580eb4f2020-06-24 19:33:06 +09003927func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003928 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003929 apex {
3930 name: "myapex",
3931 key: "myapex.key",
3932 file_contexts: "my_own_file_contexts",
3933 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003934
Jooyung Han580eb4f2020-06-24 19:33:06 +09003935 apex_key {
3936 name: "myapex.key",
3937 public_key: "testkey.avbpubkey",
3938 private_key: "testkey.pem",
3939 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003940 `, withFiles(map[string][]byte{
3941 "my_own_file_contexts": nil,
3942 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003943}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003944
Jooyung Han580eb4f2020-06-24 19:33:06 +09003945func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09003946 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09003947 apex {
3948 name: "myapex",
3949 key: "myapex.key",
3950 product_specific: true,
3951 file_contexts: "product_specific_file_contexts",
3952 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003953
Jooyung Han580eb4f2020-06-24 19:33:06 +09003954 apex_key {
3955 name: "myapex.key",
3956 public_key: "testkey.avbpubkey",
3957 private_key: "testkey.pem",
3958 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003959 `)
3960
Jooyung Han580eb4f2020-06-24 19:33:06 +09003961 ctx, _ := testApex(t, `
3962 apex {
3963 name: "myapex",
3964 key: "myapex.key",
3965 product_specific: true,
3966 file_contexts: "product_specific_file_contexts",
3967 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003968
Jooyung Han580eb4f2020-06-24 19:33:06 +09003969 apex_key {
3970 name: "myapex.key",
3971 public_key: "testkey.avbpubkey",
3972 private_key: "testkey.pem",
3973 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003974 `, withFiles(map[string][]byte{
3975 "product_specific_file_contexts": nil,
3976 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09003977 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
3978 rule := module.Output("file_contexts")
3979 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
3980}
Jooyung Han54aca7b2019-11-20 02:26:02 +09003981
Jooyung Han580eb4f2020-06-24 19:33:06 +09003982func TestFileContexts_SetViaFileGroup(t *testing.T) {
3983 ctx, _ := testApex(t, `
3984 apex {
3985 name: "myapex",
3986 key: "myapex.key",
3987 product_specific: true,
3988 file_contexts: ":my-file-contexts",
3989 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003990
Jooyung Han580eb4f2020-06-24 19:33:06 +09003991 apex_key {
3992 name: "myapex.key",
3993 public_key: "testkey.avbpubkey",
3994 private_key: "testkey.pem",
3995 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09003996
Jooyung Han580eb4f2020-06-24 19:33:06 +09003997 filegroup {
3998 name: "my-file-contexts",
3999 srcs: ["product_specific_file_contexts"],
4000 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004001 `, withFiles(map[string][]byte{
4002 "product_specific_file_contexts": nil,
4003 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004004 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4005 rule := module.Output("file_contexts")
4006 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004007}
4008
Jiyong Park67882562019-03-21 01:11:21 +09004009func TestApexKeyFromOtherModule(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004010 ctx, _ := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004011 apex_key {
4012 name: "myapex.key",
4013 public_key: ":my.avbpubkey",
4014 private_key: ":my.pem",
4015 product_specific: true,
4016 }
4017
4018 filegroup {
4019 name: "my.avbpubkey",
4020 srcs: ["testkey2.avbpubkey"],
4021 }
4022
4023 filegroup {
4024 name: "my.pem",
4025 srcs: ["testkey2.pem"],
4026 }
4027 `)
4028
4029 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4030 expected_pubkey := "testkey2.avbpubkey"
4031 actual_pubkey := apex_key.public_key_file.String()
4032 if actual_pubkey != expected_pubkey {
4033 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4034 }
4035 expected_privkey := "testkey2.pem"
4036 actual_privkey := apex_key.private_key_file.String()
4037 if actual_privkey != expected_privkey {
4038 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4039 }
4040}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004041
4042func TestPrebuilt(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004043 ctx, _ := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004044 prebuilt_apex {
4045 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004046 arch: {
4047 arm64: {
4048 src: "myapex-arm64.apex",
4049 },
4050 arm: {
4051 src: "myapex-arm.apex",
4052 },
4053 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004054 }
4055 `)
4056
4057 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4058
Jiyong Parkc95714e2019-03-29 14:23:10 +09004059 expectedInput := "myapex-arm64.apex"
4060 if prebuilt.inputApex.String() != expectedInput {
4061 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4062 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004063}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004064
4065func TestPrebuiltFilenameOverride(t *testing.T) {
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004066 ctx, _ := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004067 prebuilt_apex {
4068 name: "myapex",
4069 src: "myapex-arm.apex",
4070 filename: "notmyapex.apex",
4071 }
4072 `)
4073
4074 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4075
4076 expected := "notmyapex.apex"
4077 if p.installFilename != expected {
4078 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4079 }
4080}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004081
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004082func TestPrebuiltOverrides(t *testing.T) {
4083 ctx, config := testApex(t, `
4084 prebuilt_apex {
4085 name: "myapex.prebuilt",
4086 src: "myapex-arm.apex",
4087 overrides: [
4088 "myapex",
4089 ],
4090 }
4091 `)
4092
4093 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4094
4095 expected := []string{"myapex"}
Jiyong Park0b0e1b92019-12-03 13:24:29 +09004096 actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004097 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004098 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004099 }
4100}
4101
Roland Levillain630846d2019-06-26 12:48:34 +01004102func TestApexWithTests(t *testing.T) {
Roland Levillainf89cd092019-07-29 16:22:59 +01004103 ctx, config := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004104 apex_test {
4105 name: "myapex",
4106 key: "myapex.key",
4107 tests: [
4108 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004109 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004110 ],
4111 }
4112
4113 apex_key {
4114 name: "myapex.key",
4115 public_key: "testkey.avbpubkey",
4116 private_key: "testkey.pem",
4117 }
4118
Liz Kammer1c14a212020-05-12 15:26:55 -07004119 filegroup {
4120 name: "fg",
4121 srcs: [
4122 "baz",
4123 "bar/baz"
4124 ],
4125 }
4126
Roland Levillain630846d2019-06-26 12:48:34 +01004127 cc_test {
4128 name: "mytest",
4129 gtest: false,
4130 srcs: ["mytest.cpp"],
4131 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004132 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004133 system_shared_libs: [],
4134 static_executable: true,
4135 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004136 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004137 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004138
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004139 cc_library {
4140 name: "mylib",
4141 srcs: ["mylib.cpp"],
4142 system_shared_libs: [],
4143 stl: "none",
4144 }
4145
Liz Kammer5bd365f2020-05-27 15:15:11 -07004146 filegroup {
4147 name: "fg2",
4148 srcs: [
4149 "testdata/baz"
4150 ],
4151 }
4152
Roland Levillain9b5fde92019-06-28 15:41:19 +01004153 cc_test {
4154 name: "mytests",
4155 gtest: false,
4156 srcs: [
4157 "mytest1.cpp",
4158 "mytest2.cpp",
4159 "mytest3.cpp",
4160 ],
4161 test_per_src: true,
4162 relative_install_path: "test",
4163 system_shared_libs: [],
4164 static_executable: true,
4165 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004166 data: [
4167 ":fg",
4168 ":fg2",
4169 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004170 }
Roland Levillain630846d2019-06-26 12:48:34 +01004171 `)
4172
Sundong Ahnabb64432019-10-22 13:58:29 +09004173 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004174 copyCmds := apexRule.Args["copy_commands"]
4175
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004176 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004177 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004178 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004179
Liz Kammer1c14a212020-05-12 15:26:55 -07004180 //Ensure that test data are copied into apex.
4181 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4182 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4183
Roland Levillain9b5fde92019-06-28 15:41:19 +01004184 // Ensure that test deps built with `test_per_src` are copied into apex.
4185 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4186 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4187 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004188
4189 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004190 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4191 data := android.AndroidMkDataForTest(t, config, "", bundle)
4192 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004193 prefix := "TARGET_"
4194 var builder strings.Builder
4195 data.Custom(&builder, name, prefix, "", data)
4196 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004197 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4198 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4199 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4200 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004201 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004202 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004203 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004204
4205 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4206 data = android.AndroidMkDataForTest(t, config, "", flatBundle)
4207 data.Custom(&builder, name, prefix, "", data)
4208 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004209 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4210 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004211}
4212
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004213func TestInstallExtraFlattenedApexes(t *testing.T) {
4214 ctx, config := testApex(t, `
4215 apex {
4216 name: "myapex",
4217 key: "myapex.key",
4218 }
4219 apex_key {
4220 name: "myapex.key",
4221 public_key: "testkey.avbpubkey",
4222 private_key: "testkey.pem",
4223 }
4224 `, func(fs map[string][]byte, config android.Config) {
4225 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4226 })
4227 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004228 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004229 mk := android.AndroidMkDataForTest(t, config, "", ab)
4230 var builder strings.Builder
4231 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4232 androidMk := builder.String()
4233 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4234}
4235
Jooyung Hand48f3c32019-08-23 11:18:57 +09004236func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4237 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4238 apex {
4239 name: "myapex",
4240 key: "myapex.key",
4241 native_shared_libs: ["libfoo"],
4242 }
4243
4244 apex_key {
4245 name: "myapex.key",
4246 public_key: "testkey.avbpubkey",
4247 private_key: "testkey.pem",
4248 }
4249
4250 cc_library {
4251 name: "libfoo",
4252 stl: "none",
4253 system_shared_libs: [],
4254 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004255 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004256 }
4257 `)
4258 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4259 apex {
4260 name: "myapex",
4261 key: "myapex.key",
4262 java_libs: ["myjar"],
4263 }
4264
4265 apex_key {
4266 name: "myapex.key",
4267 public_key: "testkey.avbpubkey",
4268 private_key: "testkey.pem",
4269 }
4270
4271 java_library {
4272 name: "myjar",
4273 srcs: ["foo/bar/MyClass.java"],
4274 sdk_version: "none",
4275 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004276 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004277 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004278 }
4279 `)
4280}
4281
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004282func TestApexWithApps(t *testing.T) {
4283 ctx, _ := testApex(t, `
4284 apex {
4285 name: "myapex",
4286 key: "myapex.key",
4287 apps: [
4288 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09004289 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004290 ],
4291 }
4292
4293 apex_key {
4294 name: "myapex.key",
4295 public_key: "testkey.avbpubkey",
4296 private_key: "testkey.pem",
4297 }
4298
4299 android_app {
4300 name: "AppFoo",
4301 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004302 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004303 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09004304 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08004305 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004306 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004307 }
Jiyong Parkf7487312019-10-17 12:54:30 +09004308
4309 android_app {
4310 name: "AppFooPriv",
4311 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08004312 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09004313 system_modules: "none",
4314 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08004315 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004316 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09004317 }
Jiyong Park8be103b2019-11-08 15:53:48 +09004318
4319 cc_library_shared {
4320 name: "libjni",
4321 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004322 shared_libs: ["libfoo"],
4323 stl: "none",
4324 system_shared_libs: [],
4325 apex_available: [ "myapex" ],
4326 sdk_version: "current",
4327 }
4328
4329 cc_library_shared {
4330 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09004331 stl: "none",
4332 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09004333 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08004334 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09004335 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004336 `)
4337
Sundong Ahnabb64432019-10-22 13:58:29 +09004338 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004339 apexRule := module.Rule("apexRule")
4340 copyCmds := apexRule.Args["copy_commands"]
4341
4342 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09004343 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004344
Colin Crossaede88c2020-08-11 12:17:01 -07004345 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004346 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09004347 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004348 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09004349 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004350 // JNI libraries including transitive deps are
4351 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004352 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09004353 // ... embedded inside APK (jnilibs.zip)
4354 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
4355 // ... and not directly inside the APEX
4356 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
4357 }
Dario Frenicde2a032019-10-27 00:29:22 +01004358}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004359
Dario Frenicde2a032019-10-27 00:29:22 +01004360func TestApexWithAppImports(t *testing.T) {
4361 ctx, _ := testApex(t, `
4362 apex {
4363 name: "myapex",
4364 key: "myapex.key",
4365 apps: [
4366 "AppFooPrebuilt",
4367 "AppFooPrivPrebuilt",
4368 ],
4369 }
4370
4371 apex_key {
4372 name: "myapex.key",
4373 public_key: "testkey.avbpubkey",
4374 private_key: "testkey.pem",
4375 }
4376
4377 android_app_import {
4378 name: "AppFooPrebuilt",
4379 apk: "PrebuiltAppFoo.apk",
4380 presigned: true,
4381 dex_preopt: {
4382 enabled: false,
4383 },
Jiyong Park592a6a42020-04-21 22:34:28 +09004384 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004385 }
4386
4387 android_app_import {
4388 name: "AppFooPrivPrebuilt",
4389 apk: "PrebuiltAppFooPriv.apk",
4390 privileged: true,
4391 presigned: true,
4392 dex_preopt: {
4393 enabled: false,
4394 },
Jooyung Han39ee1192020-03-23 20:21:11 +09004395 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09004396 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01004397 }
4398 `)
4399
Sundong Ahnabb64432019-10-22 13:58:29 +09004400 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01004401 apexRule := module.Rule("apexRule")
4402 copyCmds := apexRule.Args["copy_commands"]
4403
4404 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004405 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
4406}
4407
4408func TestApexWithAppImportsPrefer(t *testing.T) {
4409 ctx, _ := testApex(t, `
4410 apex {
4411 name: "myapex",
4412 key: "myapex.key",
4413 apps: [
4414 "AppFoo",
4415 ],
4416 }
4417
4418 apex_key {
4419 name: "myapex.key",
4420 public_key: "testkey.avbpubkey",
4421 private_key: "testkey.pem",
4422 }
4423
4424 android_app {
4425 name: "AppFoo",
4426 srcs: ["foo/bar/MyClass.java"],
4427 sdk_version: "none",
4428 system_modules: "none",
4429 apex_available: [ "myapex" ],
4430 }
4431
4432 android_app_import {
4433 name: "AppFoo",
4434 apk: "AppFooPrebuilt.apk",
4435 filename: "AppFooPrebuilt.apk",
4436 presigned: true,
4437 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09004438 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09004439 }
4440 `, withFiles(map[string][]byte{
4441 "AppFooPrebuilt.apk": nil,
4442 }))
4443
4444 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4445 "app/AppFoo/AppFooPrebuilt.apk",
4446 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09004447}
4448
Dario Freni6f3937c2019-12-20 22:58:03 +00004449func TestApexWithTestHelperApp(t *testing.T) {
4450 ctx, _ := testApex(t, `
4451 apex {
4452 name: "myapex",
4453 key: "myapex.key",
4454 apps: [
4455 "TesterHelpAppFoo",
4456 ],
4457 }
4458
4459 apex_key {
4460 name: "myapex.key",
4461 public_key: "testkey.avbpubkey",
4462 private_key: "testkey.pem",
4463 }
4464
4465 android_test_helper_app {
4466 name: "TesterHelpAppFoo",
4467 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004468 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00004469 }
4470
4471 `)
4472
4473 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4474 apexRule := module.Rule("apexRule")
4475 copyCmds := apexRule.Args["copy_commands"]
4476
4477 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
4478}
4479
Jooyung Han18020ea2019-11-13 10:50:48 +09004480func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
4481 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00004482 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09004483 apex {
4484 name: "myapex",
4485 key: "myapex.key",
4486 native_shared_libs: ["libfoo"],
4487 }
4488
4489 apex_key {
4490 name: "myapex.key",
4491 public_key: "testkey.avbpubkey",
4492 private_key: "testkey.pem",
4493 }
4494
4495 apex {
4496 name: "otherapex",
4497 key: "myapex.key",
4498 native_shared_libs: ["libfoo"],
4499 }
4500
4501 cc_defaults {
4502 name: "libfoo-defaults",
4503 apex_available: ["otherapex"],
4504 }
4505
4506 cc_library {
4507 name: "libfoo",
4508 defaults: ["libfoo-defaults"],
4509 stl: "none",
4510 system_shared_libs: [],
4511 }`)
4512}
4513
Paul Duffine52e66f2020-03-30 17:54:29 +01004514func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004515 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00004516 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09004517 apex {
4518 name: "myapex",
4519 key: "myapex.key",
4520 native_shared_libs: ["libfoo"],
4521 }
4522
4523 apex_key {
4524 name: "myapex.key",
4525 public_key: "testkey.avbpubkey",
4526 private_key: "testkey.pem",
4527 }
4528
4529 apex {
4530 name: "otherapex",
4531 key: "otherapex.key",
4532 native_shared_libs: ["libfoo"],
4533 }
4534
4535 apex_key {
4536 name: "otherapex.key",
4537 public_key: "testkey.avbpubkey",
4538 private_key: "testkey.pem",
4539 }
4540
4541 cc_library {
4542 name: "libfoo",
4543 stl: "none",
4544 system_shared_libs: [],
4545 apex_available: ["otherapex"],
4546 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004547}
Jiyong Park127b40b2019-09-30 16:04:35 +09004548
Paul Duffine52e66f2020-03-30 17:54:29 +01004549func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09004550 // libbbaz is an indirect dep
Steven Moreland6e36cd62020-10-22 01:08:35 +00004551 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'. Dependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07004552.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004553.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004554.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01004555.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07004556.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01004557.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004558 apex {
4559 name: "myapex",
4560 key: "myapex.key",
4561 native_shared_libs: ["libfoo"],
4562 }
4563
4564 apex_key {
4565 name: "myapex.key",
4566 public_key: "testkey.avbpubkey",
4567 private_key: "testkey.pem",
4568 }
4569
Jiyong Park127b40b2019-09-30 16:04:35 +09004570 cc_library {
4571 name: "libfoo",
4572 stl: "none",
4573 shared_libs: ["libbar"],
4574 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004575 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004576 }
4577
4578 cc_library {
4579 name: "libbar",
4580 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09004581 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004582 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09004583 apex_available: ["myapex"],
4584 }
4585
4586 cc_library {
4587 name: "libbaz",
4588 stl: "none",
4589 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09004590 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004591}
Jiyong Park127b40b2019-09-30 16:04:35 +09004592
Paul Duffine52e66f2020-03-30 17:54:29 +01004593func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09004594 testApexError(t, "\"otherapex\" is not a valid module name", `
4595 apex {
4596 name: "myapex",
4597 key: "myapex.key",
4598 native_shared_libs: ["libfoo"],
4599 }
4600
4601 apex_key {
4602 name: "myapex.key",
4603 public_key: "testkey.avbpubkey",
4604 private_key: "testkey.pem",
4605 }
4606
4607 cc_library {
4608 name: "libfoo",
4609 stl: "none",
4610 system_shared_libs: [],
4611 apex_available: ["otherapex"],
4612 }`)
4613
Paul Duffine52e66f2020-03-30 17:54:29 +01004614 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004615 apex {
4616 name: "myapex",
4617 key: "myapex.key",
4618 native_shared_libs: ["libfoo", "libbar"],
4619 }
4620
4621 apex_key {
4622 name: "myapex.key",
4623 public_key: "testkey.avbpubkey",
4624 private_key: "testkey.pem",
4625 }
4626
4627 cc_library {
4628 name: "libfoo",
4629 stl: "none",
4630 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09004631 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004632 apex_available: ["myapex"],
4633 }
4634
4635 cc_library {
4636 name: "libbar",
4637 stl: "none",
4638 system_shared_libs: [],
4639 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09004640 }
4641
4642 cc_library {
4643 name: "libbaz",
4644 stl: "none",
4645 system_shared_libs: [],
4646 stubs: {
4647 versions: ["10", "20", "30"],
4648 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004649 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01004650}
Jiyong Park127b40b2019-09-30 16:04:35 +09004651
Jiyong Park89e850a2020-04-07 16:37:39 +09004652func TestApexAvailable_CheckForPlatform(t *testing.T) {
Paul Duffine52e66f2020-03-30 17:54:29 +01004653 ctx, _ := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09004654 apex {
4655 name: "myapex",
4656 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09004657 native_shared_libs: ["libbar", "libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004658 }
4659
4660 apex_key {
4661 name: "myapex.key",
4662 public_key: "testkey.avbpubkey",
4663 private_key: "testkey.pem",
4664 }
4665
4666 cc_library {
4667 name: "libfoo",
4668 stl: "none",
4669 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09004670 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09004671 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09004672 }
4673
4674 cc_library {
4675 name: "libfoo2",
4676 stl: "none",
4677 system_shared_libs: [],
4678 shared_libs: ["libbaz"],
4679 apex_available: ["//apex_available:platform"],
4680 }
4681
4682 cc_library {
4683 name: "libbar",
4684 stl: "none",
4685 system_shared_libs: [],
4686 apex_available: ["myapex"],
4687 }
4688
4689 cc_library {
4690 name: "libbaz",
4691 stl: "none",
4692 system_shared_libs: [],
4693 apex_available: ["myapex"],
4694 stubs: {
4695 versions: ["1"],
4696 },
Jiyong Park127b40b2019-09-30 16:04:35 +09004697 }`)
4698
Jiyong Park89e850a2020-04-07 16:37:39 +09004699 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
4700 // because it depends on libbar which isn't available to platform
4701 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4702 if libfoo.NotAvailableForPlatform() != true {
4703 t.Errorf("%q shouldn't be available to platform", libfoo.String())
4704 }
4705
4706 // libfoo2 however can be available to platform because it depends on libbaz which provides
4707 // stubs
4708 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4709 if libfoo2.NotAvailableForPlatform() == true {
4710 t.Errorf("%q should be available to platform", libfoo2.String())
4711 }
Paul Duffine52e66f2020-03-30 17:54:29 +01004712}
Jiyong Parka90ca002019-10-07 15:47:24 +09004713
Paul Duffine52e66f2020-03-30 17:54:29 +01004714func TestApexAvailable_CreatedForApex(t *testing.T) {
Jiyong Park89e850a2020-04-07 16:37:39 +09004715 ctx, _ := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09004716 apex {
4717 name: "myapex",
4718 key: "myapex.key",
4719 native_shared_libs: ["libfoo"],
4720 }
4721
4722 apex_key {
4723 name: "myapex.key",
4724 public_key: "testkey.avbpubkey",
4725 private_key: "testkey.pem",
4726 }
4727
4728 cc_library {
4729 name: "libfoo",
4730 stl: "none",
4731 system_shared_libs: [],
4732 apex_available: ["myapex"],
4733 static: {
4734 apex_available: ["//apex_available:platform"],
4735 },
4736 }`)
4737
Jiyong Park89e850a2020-04-07 16:37:39 +09004738 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
4739 if libfooShared.NotAvailableForPlatform() != true {
4740 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
4741 }
4742 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
4743 if libfooStatic.NotAvailableForPlatform() != false {
4744 t.Errorf("%q should be available to platform", libfooStatic.String())
4745 }
Jiyong Park127b40b2019-09-30 16:04:35 +09004746}
4747
Jiyong Park5d790c32019-11-15 18:40:32 +09004748func TestOverrideApex(t *testing.T) {
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004749 ctx, config := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09004750 apex {
4751 name: "myapex",
4752 key: "myapex.key",
4753 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004754 overrides: ["oldapex"],
Jiyong Park5d790c32019-11-15 18:40:32 +09004755 }
4756
4757 override_apex {
4758 name: "override_myapex",
4759 base: "myapex",
4760 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004761 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08004762 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004763 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09004764 }
4765
4766 apex_key {
4767 name: "myapex.key",
4768 public_key: "testkey.avbpubkey",
4769 private_key: "testkey.pem",
4770 }
4771
4772 android_app {
4773 name: "app",
4774 srcs: ["foo/bar/MyClass.java"],
4775 package_name: "foo",
4776 sdk_version: "none",
4777 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004778 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09004779 }
4780
4781 override_android_app {
4782 name: "override_app",
4783 base: "app",
4784 package_name: "bar",
4785 }
Jiyong Park20bacab2020-03-03 11:45:41 +09004786 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09004787
Jiyong Park317645e2019-12-05 13:20:58 +09004788 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
4789 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
4790 if originalVariant.GetOverriddenBy() != "" {
4791 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
4792 }
4793 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
4794 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
4795 }
4796
Jiyong Park5d790c32019-11-15 18:40:32 +09004797 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
4798 apexRule := module.Rule("apexRule")
4799 copyCmds := apexRule.Args["copy_commands"]
4800
4801 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09004802 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004803
4804 apexBundle := module.Module().(*apexBundle)
4805 name := apexBundle.Name()
4806 if name != "override_myapex" {
4807 t.Errorf("name should be \"override_myapex\", but was %q", name)
4808 }
4809
Baligh Uddin004d7172020-02-19 21:29:28 -08004810 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
4811 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
4812 }
4813
Jiyong Park20bacab2020-03-03 11:45:41 +09004814 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07004815 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09004816
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004817 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
4818 var builder strings.Builder
4819 data.Custom(&builder, name, "TARGET_", "", data)
4820 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09004821 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004822 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
4823 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08004824 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004825 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09004826 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08004827 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
4828 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09004829}
4830
Jooyung Han214bf372019-11-12 13:03:50 +09004831func TestLegacyAndroid10Support(t *testing.T) {
4832 ctx, _ := testApex(t, `
4833 apex {
4834 name: "myapex",
4835 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004836 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09004837 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09004838 }
4839
4840 apex_key {
4841 name: "myapex.key",
4842 public_key: "testkey.avbpubkey",
4843 private_key: "testkey.pem",
4844 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004845
4846 cc_library {
4847 name: "mylib",
4848 srcs: ["mylib.cpp"],
4849 stl: "libc++",
4850 system_shared_libs: [],
4851 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09004852 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004853 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004854 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09004855
4856 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4857 args := module.Rule("apexRule").Args
4858 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00004859 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004860
4861 // The copies of the libraries in the apex should have one more dependency than
4862 // the ones outside the apex, namely the unwinder. Ideally we should check
4863 // the dependency names directly here but for some reason the names are blank in
4864 // this test.
4865 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07004866 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08004867 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
4868 if len(apexImplicits) != len(nonApexImplicits)+1 {
4869 t.Errorf("%q missing unwinder dep", lib)
4870 }
4871 }
Jooyung Han214bf372019-11-12 13:03:50 +09004872}
4873
Paul Duffin9b879592020-05-26 13:21:35 +01004874var filesForSdkLibrary = map[string][]byte{
4875 "api/current.txt": nil,
4876 "api/removed.txt": nil,
4877 "api/system-current.txt": nil,
4878 "api/system-removed.txt": nil,
4879 "api/test-current.txt": nil,
4880 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01004881
4882 // For java_sdk_library_import
4883 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01004884}
4885
Jooyung Han58f26ab2019-12-18 15:34:32 +09004886func TestJavaSDKLibrary(t *testing.T) {
4887 ctx, _ := testApex(t, `
4888 apex {
4889 name: "myapex",
4890 key: "myapex.key",
4891 java_libs: ["foo"],
4892 }
4893
4894 apex_key {
4895 name: "myapex.key",
4896 public_key: "testkey.avbpubkey",
4897 private_key: "testkey.pem",
4898 }
4899
4900 java_sdk_library {
4901 name: "foo",
4902 srcs: ["a.java"],
4903 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004904 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09004905 }
Paul Duffin9b879592020-05-26 13:21:35 +01004906 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09004907
4908 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00004909 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09004910 "javalib/foo.jar",
4911 "etc/permissions/foo.xml",
4912 })
4913 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09004914 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
4915 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09004916}
4917
Paul Duffin9b879592020-05-26 13:21:35 +01004918func TestJavaSDKLibrary_WithinApex(t *testing.T) {
4919 ctx, _ := testApex(t, `
4920 apex {
4921 name: "myapex",
4922 key: "myapex.key",
4923 java_libs: ["foo", "bar"],
4924 }
4925
4926 apex_key {
4927 name: "myapex.key",
4928 public_key: "testkey.avbpubkey",
4929 private_key: "testkey.pem",
4930 }
4931
4932 java_sdk_library {
4933 name: "foo",
4934 srcs: ["a.java"],
4935 api_packages: ["foo"],
4936 apex_available: ["myapex"],
4937 sdk_version: "none",
4938 system_modules: "none",
4939 }
4940
4941 java_library {
4942 name: "bar",
4943 srcs: ["a.java"],
4944 libs: ["foo"],
4945 apex_available: ["myapex"],
4946 sdk_version: "none",
4947 system_modules: "none",
4948 }
4949 `, withFiles(filesForSdkLibrary))
4950
4951 // java_sdk_library installs both impl jar and permission XML
4952 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4953 "javalib/bar.jar",
4954 "javalib/foo.jar",
4955 "etc/permissions/foo.xml",
4956 })
4957
4958 // The bar library should depend on the implementation jar.
4959 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
4960 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
4961 t.Errorf("expected %q, found %#q", expected, actual)
4962 }
4963}
4964
4965func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
4966 ctx, _ := testApex(t, `
4967 apex {
4968 name: "myapex",
4969 key: "myapex.key",
4970 java_libs: ["foo"],
4971 }
4972
4973 apex_key {
4974 name: "myapex.key",
4975 public_key: "testkey.avbpubkey",
4976 private_key: "testkey.pem",
4977 }
4978
4979 java_sdk_library {
4980 name: "foo",
4981 srcs: ["a.java"],
4982 api_packages: ["foo"],
4983 apex_available: ["myapex"],
4984 sdk_version: "none",
4985 system_modules: "none",
4986 }
4987
4988 java_library {
4989 name: "bar",
4990 srcs: ["a.java"],
4991 libs: ["foo"],
4992 sdk_version: "none",
4993 system_modules: "none",
4994 }
4995 `, withFiles(filesForSdkLibrary))
4996
4997 // java_sdk_library installs both impl jar and permission XML
4998 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4999 "javalib/foo.jar",
5000 "etc/permissions/foo.xml",
5001 })
5002
5003 // The bar library should depend on the stubs jar.
5004 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5005 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5006 t.Errorf("expected %q, found %#q", expected, actual)
5007 }
5008}
5009
Paul Duffineedc5d52020-06-12 17:46:39 +01005010func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
5011 ctx, _ := testApex(t, ``,
5012 withFiles(map[string][]byte{
5013 "apex/a.java": nil,
5014 "apex/apex_manifest.json": nil,
5015 "apex/Android.bp": []byte(`
5016 package {
5017 default_visibility: ["//visibility:private"],
5018 }
5019
5020 apex {
5021 name: "myapex",
5022 key: "myapex.key",
5023 java_libs: ["foo", "bar"],
5024 }
5025
5026 apex_key {
5027 name: "myapex.key",
5028 public_key: "testkey.avbpubkey",
5029 private_key: "testkey.pem",
5030 }
5031
5032 java_library {
5033 name: "bar",
5034 srcs: ["a.java"],
5035 libs: ["foo"],
5036 apex_available: ["myapex"],
5037 sdk_version: "none",
5038 system_modules: "none",
5039 }
5040`),
5041 "source/a.java": nil,
5042 "source/api/current.txt": nil,
5043 "source/api/removed.txt": nil,
5044 "source/Android.bp": []byte(`
5045 package {
5046 default_visibility: ["//visibility:private"],
5047 }
5048
5049 java_sdk_library {
5050 name: "foo",
5051 visibility: ["//apex"],
5052 srcs: ["a.java"],
5053 api_packages: ["foo"],
5054 apex_available: ["myapex"],
5055 sdk_version: "none",
5056 system_modules: "none",
5057 public: {
5058 enabled: true,
5059 },
5060 }
5061`),
5062 "prebuilt/a.jar": nil,
5063 "prebuilt/Android.bp": []byte(`
5064 package {
5065 default_visibility: ["//visibility:private"],
5066 }
5067
5068 java_sdk_library_import {
5069 name: "foo",
5070 visibility: ["//apex", "//source"],
5071 apex_available: ["myapex"],
5072 prefer: true,
5073 public: {
5074 jars: ["a.jar"],
5075 },
5076 }
5077`),
5078 }),
5079 )
5080
5081 // java_sdk_library installs both impl jar and permission XML
5082 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5083 "javalib/bar.jar",
5084 "javalib/foo.jar",
5085 "etc/permissions/foo.xml",
5086 })
5087
5088 // The bar library should depend on the implementation jar.
5089 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5090 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5091 t.Errorf("expected %q, found %#q", expected, actual)
5092 }
5093}
5094
5095func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5096 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5097 apex {
5098 name: "myapex",
5099 key: "myapex.key",
5100 java_libs: ["foo"],
5101 }
5102
5103 apex_key {
5104 name: "myapex.key",
5105 public_key: "testkey.avbpubkey",
5106 private_key: "testkey.pem",
5107 }
5108
5109 java_sdk_library_import {
5110 name: "foo",
5111 apex_available: ["myapex"],
5112 prefer: true,
5113 public: {
5114 jars: ["a.jar"],
5115 },
5116 }
5117
5118 `, withFiles(filesForSdkLibrary))
5119}
5120
atrost6e126252020-01-27 17:01:16 +00005121func TestCompatConfig(t *testing.T) {
5122 ctx, _ := testApex(t, `
5123 apex {
5124 name: "myapex",
5125 key: "myapex.key",
5126 prebuilts: ["myjar-platform-compat-config"],
5127 java_libs: ["myjar"],
5128 }
5129
5130 apex_key {
5131 name: "myapex.key",
5132 public_key: "testkey.avbpubkey",
5133 private_key: "testkey.pem",
5134 }
5135
5136 platform_compat_config {
5137 name: "myjar-platform-compat-config",
5138 src: ":myjar",
5139 }
5140
5141 java_library {
5142 name: "myjar",
5143 srcs: ["foo/bar/MyClass.java"],
5144 sdk_version: "none",
5145 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005146 apex_available: [ "myapex" ],
5147 }
5148 `)
5149 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5150 "etc/compatconfig/myjar-platform-compat-config.xml",
5151 "javalib/myjar.jar",
5152 })
5153}
5154
Jiyong Park479321d2019-12-16 11:47:12 +09005155func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5156 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5157 apex {
5158 name: "myapex",
5159 key: "myapex.key",
5160 java_libs: ["myjar"],
5161 }
5162
5163 apex_key {
5164 name: "myapex.key",
5165 public_key: "testkey.avbpubkey",
5166 private_key: "testkey.pem",
5167 }
5168
5169 java_library {
5170 name: "myjar",
5171 srcs: ["foo/bar/MyClass.java"],
5172 sdk_version: "none",
5173 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005174 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005175 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005176 }
5177 `)
5178}
5179
Jiyong Park7afd1072019-12-30 16:56:33 +09005180func TestCarryRequiredModuleNames(t *testing.T) {
5181 ctx, config := testApex(t, `
5182 apex {
5183 name: "myapex",
5184 key: "myapex.key",
5185 native_shared_libs: ["mylib"],
5186 }
5187
5188 apex_key {
5189 name: "myapex.key",
5190 public_key: "testkey.avbpubkey",
5191 private_key: "testkey.pem",
5192 }
5193
5194 cc_library {
5195 name: "mylib",
5196 srcs: ["mylib.cpp"],
5197 system_shared_libs: [],
5198 stl: "none",
5199 required: ["a", "b"],
5200 host_required: ["c", "d"],
5201 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005202 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005203 }
5204 `)
5205
5206 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5207 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5208 name := apexBundle.BaseModuleName()
5209 prefix := "TARGET_"
5210 var builder strings.Builder
5211 data.Custom(&builder, name, prefix, "", data)
5212 androidMk := builder.String()
5213 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5214 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
5215 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
5216}
5217
Jiyong Park7cd10e32020-01-14 09:22:18 +09005218func TestSymlinksFromApexToSystem(t *testing.T) {
5219 bp := `
5220 apex {
5221 name: "myapex",
5222 key: "myapex.key",
5223 native_shared_libs: ["mylib"],
5224 java_libs: ["myjar"],
5225 }
5226
Jiyong Park9d677202020-02-19 16:29:35 +09005227 apex {
5228 name: "myapex.updatable",
5229 key: "myapex.key",
5230 native_shared_libs: ["mylib"],
5231 java_libs: ["myjar"],
5232 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09005233 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09005234 }
5235
Jiyong Park7cd10e32020-01-14 09:22:18 +09005236 apex_key {
5237 name: "myapex.key",
5238 public_key: "testkey.avbpubkey",
5239 private_key: "testkey.pem",
5240 }
5241
5242 cc_library {
5243 name: "mylib",
5244 srcs: ["mylib.cpp"],
5245 shared_libs: ["myotherlib"],
5246 system_shared_libs: [],
5247 stl: "none",
5248 apex_available: [
5249 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005250 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005251 "//apex_available:platform",
5252 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005253 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005254 }
5255
5256 cc_library {
5257 name: "myotherlib",
5258 srcs: ["mylib.cpp"],
5259 system_shared_libs: [],
5260 stl: "none",
5261 apex_available: [
5262 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005263 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005264 "//apex_available:platform",
5265 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005266 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005267 }
5268
5269 java_library {
5270 name: "myjar",
5271 srcs: ["foo/bar/MyClass.java"],
5272 sdk_version: "none",
5273 system_modules: "none",
5274 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09005275 apex_available: [
5276 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005277 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005278 "//apex_available:platform",
5279 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005280 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005281 }
5282
5283 java_library {
5284 name: "myotherjar",
5285 srcs: ["foo/bar/MyClass.java"],
5286 sdk_version: "none",
5287 system_modules: "none",
5288 apex_available: [
5289 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09005290 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005291 "//apex_available:platform",
5292 ],
Jooyung Han749dc692020-04-15 11:03:39 +09005293 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09005294 }
5295 `
5296
5297 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
5298 for _, f := range files {
5299 if f.path == file {
5300 if f.isLink {
5301 t.Errorf("%q is not a real file", file)
5302 }
5303 return
5304 }
5305 }
5306 t.Errorf("%q is not found", file)
5307 }
5308
5309 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
5310 for _, f := range files {
5311 if f.path == file {
5312 if !f.isLink {
5313 t.Errorf("%q is not a symlink", file)
5314 }
5315 return
5316 }
5317 }
5318 t.Errorf("%q is not found", file)
5319 }
5320
Jiyong Park9d677202020-02-19 16:29:35 +09005321 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
5322 // is updatable or not
Jiyong Park7cd10e32020-01-14 09:22:18 +09005323 ctx, _ := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005324 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005325 ensureRealfileExists(t, files, "javalib/myjar.jar")
5326 ensureRealfileExists(t, files, "lib64/mylib.so")
5327 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5328
Jiyong Park9d677202020-02-19 16:29:35 +09005329 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5330 ensureRealfileExists(t, files, "javalib/myjar.jar")
5331 ensureRealfileExists(t, files, "lib64/mylib.so")
5332 ensureRealfileExists(t, files, "lib64/myotherlib.so")
5333
5334 // For bundled build, symlink to the system for the non-updatable APEXes only
Jiyong Park7cd10e32020-01-14 09:22:18 +09005335 ctx, _ = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00005336 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09005337 ensureRealfileExists(t, files, "javalib/myjar.jar")
5338 ensureRealfileExists(t, files, "lib64/mylib.so")
5339 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09005340
5341 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
5342 ensureRealfileExists(t, files, "javalib/myjar.jar")
5343 ensureRealfileExists(t, files, "lib64/mylib.so")
5344 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09005345}
5346
Yo Chiange8128052020-07-23 20:09:18 +08005347func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
5348 ctx, config := testApex(t, `
5349 apex {
5350 name: "myapex",
5351 key: "myapex.key",
5352 native_shared_libs: ["mylib"],
5353 }
5354
5355 apex_key {
5356 name: "myapex.key",
5357 public_key: "testkey.avbpubkey",
5358 private_key: "testkey.pem",
5359 }
5360
5361 cc_library_shared {
5362 name: "mylib",
5363 srcs: ["mylib.cpp"],
5364 shared_libs: ["myotherlib"],
5365 system_shared_libs: [],
5366 stl: "none",
5367 apex_available: [
5368 "myapex",
5369 "//apex_available:platform",
5370 ],
5371 }
5372
5373 cc_prebuilt_library_shared {
5374 name: "myotherlib",
5375 srcs: ["prebuilt.so"],
5376 system_shared_libs: [],
5377 stl: "none",
5378 apex_available: [
5379 "myapex",
5380 "//apex_available:platform",
5381 ],
5382 }
5383 `)
5384
5385 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
5386 data := android.AndroidMkDataForTest(t, config, "", apexBundle)
5387 var builder strings.Builder
5388 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
5389 androidMk := builder.String()
5390 // `myotherlib` is added to `myapex` as symlink
5391 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
5392 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
5393 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
5394 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
5395 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex myotherlib apex_manifest.pb.myapex apex_pubkey.myapex\n")
5396}
5397
Jooyung Han643adc42020-02-27 13:50:06 +09005398func TestApexWithJniLibs(t *testing.T) {
5399 ctx, _ := testApex(t, `
5400 apex {
5401 name: "myapex",
5402 key: "myapex.key",
5403 jni_libs: ["mylib"],
5404 }
5405
5406 apex_key {
5407 name: "myapex.key",
5408 public_key: "testkey.avbpubkey",
5409 private_key: "testkey.pem",
5410 }
5411
5412 cc_library {
5413 name: "mylib",
5414 srcs: ["mylib.cpp"],
5415 shared_libs: ["mylib2"],
5416 system_shared_libs: [],
5417 stl: "none",
5418 apex_available: [ "myapex" ],
5419 }
5420
5421 cc_library {
5422 name: "mylib2",
5423 srcs: ["mylib.cpp"],
5424 system_shared_libs: [],
5425 stl: "none",
5426 apex_available: [ "myapex" ],
5427 }
5428 `)
5429
5430 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
5431 // Notice mylib2.so (transitive dep) is not added as a jni_lib
5432 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
5433 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5434 "lib64/mylib.so",
5435 "lib64/mylib2.so",
5436 })
5437}
5438
Jooyung Han49f67012020-04-17 13:43:10 +09005439func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
5440 ctx, _ := testApex(t, `
5441 apex {
5442 name: "myapex",
5443 key: "myapex.key",
5444 }
5445 apex_key {
5446 name: "myapex.key",
5447 public_key: "testkey.avbpubkey",
5448 private_key: "testkey.pem",
5449 }
5450 `, func(fs map[string][]byte, config android.Config) {
5451 delete(config.Targets, android.Android)
5452 config.AndroidCommonTarget = android.Target{}
5453 })
5454
5455 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
5456 t.Errorf("Expected variants: %v, but got: %v", expected, got)
5457 }
5458}
5459
Jiyong Parkbd159612020-02-28 15:22:21 +09005460func TestAppBundle(t *testing.T) {
5461 ctx, _ := testApex(t, `
5462 apex {
5463 name: "myapex",
5464 key: "myapex.key",
5465 apps: ["AppFoo"],
5466 }
5467
5468 apex_key {
5469 name: "myapex.key",
5470 public_key: "testkey.avbpubkey",
5471 private_key: "testkey.pem",
5472 }
5473
5474 android_app {
5475 name: "AppFoo",
5476 srcs: ["foo/bar/MyClass.java"],
5477 sdk_version: "none",
5478 system_modules: "none",
5479 apex_available: [ "myapex" ],
5480 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005481 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09005482
Colin Crosscf371cc2020-11-13 11:48:42 -08005483 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09005484 content := bundleConfigRule.Args["content"]
5485
5486 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09005487 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 +09005488}
5489
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005490func TestAppSetBundle(t *testing.T) {
5491 ctx, _ := testApex(t, `
5492 apex {
5493 name: "myapex",
5494 key: "myapex.key",
5495 apps: ["AppSet"],
5496 }
5497
5498 apex_key {
5499 name: "myapex.key",
5500 public_key: "testkey.avbpubkey",
5501 private_key: "testkey.pem",
5502 }
5503
5504 android_app_set {
5505 name: "AppSet",
5506 set: "AppSet.apks",
5507 }`)
5508 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08005509 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005510 content := bundleConfigRule.Args["content"]
5511 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
5512 s := mod.Rule("apexRule").Args["copy_commands"]
5513 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
5514 if len(copyCmds) != 3 {
5515 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
5516 }
5517 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
5518 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
5519 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
5520}
5521
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07005522func TestAppSetBundlePrebuilt(t *testing.T) {
5523 ctx, _ := testApex(t, "", func(fs map[string][]byte, config android.Config) {
5524 bp := `
5525 apex_set {
5526 name: "myapex",
5527 filename: "foo_v2.apex",
5528 sanitized: {
5529 none: { set: "myapex.apks", },
5530 hwaddress: { set: "myapex.hwasan.apks", },
5531 },
5532 }`
5533 fs["Android.bp"] = []byte(bp)
5534
5535 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
5536 })
5537
5538 m := ctx.ModuleForTests("myapex", "android_common")
5539 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
5540
5541 actual := extractedApex.Inputs
5542 if len(actual) != 1 {
5543 t.Errorf("expected a single input")
5544 }
5545
5546 expected := "myapex.hwasan.apks"
5547 if actual[0].String() != expected {
5548 t.Errorf("expected %s, got %s", expected, actual[0].String())
5549 }
5550}
5551
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005552func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005553 t.Helper()
5554
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005555 bp := `
5556 java_library {
5557 name: "some-updatable-apex-lib",
5558 srcs: ["a.java"],
5559 sdk_version: "current",
5560 apex_available: [
5561 "some-updatable-apex",
5562 ],
5563 }
5564
5565 java_library {
5566 name: "some-non-updatable-apex-lib",
5567 srcs: ["a.java"],
5568 apex_available: [
5569 "some-non-updatable-apex",
5570 ],
5571 }
5572
5573 java_library {
5574 name: "some-platform-lib",
5575 srcs: ["a.java"],
5576 sdk_version: "current",
5577 installable: true,
5578 }
5579
5580 java_library {
5581 name: "some-art-lib",
5582 srcs: ["a.java"],
5583 sdk_version: "current",
5584 apex_available: [
5585 "com.android.art.something",
5586 ],
5587 hostdex: true,
5588 }
5589
5590 apex {
5591 name: "some-updatable-apex",
5592 key: "some-updatable-apex.key",
5593 java_libs: ["some-updatable-apex-lib"],
5594 updatable: true,
5595 min_sdk_version: "current",
5596 }
5597
5598 apex {
5599 name: "some-non-updatable-apex",
5600 key: "some-non-updatable-apex.key",
5601 java_libs: ["some-non-updatable-apex-lib"],
5602 }
5603
5604 apex_key {
5605 name: "some-updatable-apex.key",
5606 }
5607
5608 apex_key {
5609 name: "some-non-updatable-apex.key",
5610 }
5611
5612 apex {
5613 name: "com.android.art.something",
5614 key: "com.android.art.something.key",
5615 java_libs: ["some-art-lib"],
5616 updatable: true,
5617 min_sdk_version: "current",
5618 }
5619
5620 apex_key {
5621 name: "com.android.art.something.key",
5622 }
5623
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005624 filegroup {
5625 name: "some-updatable-apex-file_contexts",
5626 srcs: [
5627 "system/sepolicy/apex/some-updatable-apex-file_contexts",
5628 ],
5629 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005630
5631 filegroup {
5632 name: "some-non-updatable-apex-file_contexts",
5633 srcs: [
5634 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
5635 ],
5636 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005637 `
5638 bp += cc.GatherRequiredDepsForTest(android.Android)
5639 bp += java.GatherRequiredDepsForTest()
5640 bp += dexpreopt.BpToolModulesForTest()
5641
5642 fs := map[string][]byte{
5643 "a.java": nil,
5644 "a.jar": nil,
5645 "build/make/target/product/security": nil,
5646 "apex_manifest.json": nil,
5647 "AndroidManifest.xml": nil,
5648 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005649 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005650 "system/sepolicy/apex/com.android.art.something-file_contexts": nil,
5651 "framework/aidl/a.aidl": nil,
5652 }
5653 cc.GatherRequiredFilesForTest(fs)
5654
Colin Crossae8600b2020-10-29 17:09:13 -07005655 config := android.TestArchConfig(buildDir, nil, bp, fs)
5656
5657 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005658 ctx.RegisterModuleType("apex", BundleFactory)
5659 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5660 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01005661 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin021f4e52020-07-30 16:04:17 +01005662 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005663 cc.RegisterRequiredBuildComponentsForTest(ctx)
5664 java.RegisterJavaBuildComponents(ctx)
5665 java.RegisterSystemModulesBuildComponents(ctx)
5666 java.RegisterAppBuildComponents(ctx)
5667 java.RegisterDexpreoptBootJarsComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005668 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5669 ctx.PreDepsMutators(RegisterPreDepsMutators)
5670 ctx.PostDepsMutators(RegisterPostDepsMutators)
5671
Colin Crossae8600b2020-10-29 17:09:13 -07005672 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005673
5674 _ = dexpreopt.GlobalSoongConfigForTests(config)
5675 dexpreopt.RegisterToolModulesForTest(ctx)
5676 pathCtx := android.PathContextForTesting(config)
5677 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
5678 transformDexpreoptConfig(dexpreoptConfig)
5679 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
5680
5681 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5682 android.FailIfErrored(t, errs)
5683
5684 _, errs = ctx.PrepareBuildActions(config)
5685 if errmsg == "" {
5686 android.FailIfErrored(t, errs)
5687 } else if len(errs) > 0 {
5688 android.FailIfNoMatchingErrors(t, errmsg, errs)
5689 return
5690 } else {
5691 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5692 }
5693}
5694
Jooyung Han548640b2020-04-27 12:10:30 +09005695func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
5696 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
5697 apex {
5698 name: "myapex",
5699 key: "myapex.key",
5700 updatable: true,
5701 }
5702
5703 apex_key {
5704 name: "myapex.key",
5705 public_key: "testkey.avbpubkey",
5706 private_key: "testkey.pem",
5707 }
5708 `)
5709}
5710
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005711func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005712 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005713 var transform func(*dexpreopt.GlobalConfig)
5714
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005715 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
5716 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005717 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005718 }
5719 testNoUpdatableJarsInBootImage(t, "", transform)
5720 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005721
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005722 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005723 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 +01005724 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005725 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.something:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005726 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005727 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005728 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005729
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005730 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 -07005731 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 +01005732 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005733 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005734 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005735 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005736 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005737
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005738 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 -07005739 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005740 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005741 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005742 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005743 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005744 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005745
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005746 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 -07005747 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 +01005748 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005749 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005750 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005751 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005752 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005753
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005754 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
5755 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005756 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005757 }
5758 testNoUpdatableJarsInBootImage(t, "", transform)
5759 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01005760
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005761 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005762 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005763 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005764 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005765 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005766 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005767 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005768
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005769 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005770 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005771 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005772 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005773 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005774 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005775 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005776
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005777 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07005778 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005779 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005780 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005781 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07005782 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005783 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005784
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005785 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
5786 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01005787 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01005788 }
5789 testNoUpdatableJarsInBootImage(t, "", transform)
5790 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00005791}
5792
Andrei Onea115e7e72020-06-05 21:14:03 +01005793func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
5794 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01005795 bp += `
5796 apex_key {
5797 name: "myapex.key",
5798 public_key: "testkey.avbpubkey",
5799 private_key: "testkey.pem",
5800 }`
5801 fs := map[string][]byte{
5802 "lib1/src/A.java": nil,
5803 "lib2/src/B.java": nil,
5804 "system/sepolicy/apex/myapex-file_contexts": nil,
5805 }
5806
Colin Crossae8600b2020-10-29 17:09:13 -07005807 config := android.TestArchConfig(buildDir, nil, bp, fs)
5808 android.SetTestNeverallowRules(config, rules)
5809 updatableBootJars := make([]string, 0, len(apexBootJars))
5810 for _, apexBootJar := range apexBootJars {
5811 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
5812 }
5813 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
5814
5815 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01005816 ctx.RegisterModuleType("apex", BundleFactory)
5817 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
5818 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
5819 cc.RegisterRequiredBuildComponentsForTest(ctx)
5820 java.RegisterJavaBuildComponents(ctx)
5821 java.RegisterSystemModulesBuildComponents(ctx)
5822 java.RegisterDexpreoptBootJarsComponents(ctx)
5823 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
5824 ctx.PreDepsMutators(RegisterPreDepsMutators)
5825 ctx.PostDepsMutators(RegisterPostDepsMutators)
5826 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
5827
Colin Crossae8600b2020-10-29 17:09:13 -07005828 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01005829
5830 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
5831 android.FailIfErrored(t, errs)
5832
5833 _, errs = ctx.PrepareBuildActions(config)
5834 if errmsg == "" {
5835 android.FailIfErrored(t, errs)
5836 } else if len(errs) > 0 {
5837 android.FailIfNoMatchingErrors(t, errmsg, errs)
5838 return
5839 } else {
5840 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
5841 }
5842}
5843
5844func TestApexPermittedPackagesRules(t *testing.T) {
5845 testcases := []struct {
5846 name string
5847 expectedError string
5848 bp string
5849 bootJars []string
5850 modulesPackages map[string][]string
5851 }{
5852
5853 {
5854 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
5855 expectedError: "",
5856 bp: `
5857 java_library {
5858 name: "bcp_lib1",
5859 srcs: ["lib1/src/*.java"],
5860 permitted_packages: ["foo.bar"],
5861 apex_available: ["myapex"],
5862 sdk_version: "none",
5863 system_modules: "none",
5864 }
5865 java_library {
5866 name: "nonbcp_lib2",
5867 srcs: ["lib2/src/*.java"],
5868 apex_available: ["myapex"],
5869 permitted_packages: ["a.b"],
5870 sdk_version: "none",
5871 system_modules: "none",
5872 }
5873 apex {
5874 name: "myapex",
5875 key: "myapex.key",
5876 java_libs: ["bcp_lib1", "nonbcp_lib2"],
5877 }`,
5878 bootJars: []string{"bcp_lib1"},
5879 modulesPackages: map[string][]string{
5880 "myapex": []string{
5881 "foo.bar",
5882 },
5883 },
5884 },
5885 {
5886 name: "Bootclasspath apex jar not satisfying allowed module packages.",
5887 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.`,
5888 bp: `
5889 java_library {
5890 name: "bcp_lib1",
5891 srcs: ["lib1/src/*.java"],
5892 apex_available: ["myapex"],
5893 permitted_packages: ["foo.bar"],
5894 sdk_version: "none",
5895 system_modules: "none",
5896 }
5897 java_library {
5898 name: "bcp_lib2",
5899 srcs: ["lib2/src/*.java"],
5900 apex_available: ["myapex"],
5901 permitted_packages: ["foo.bar", "bar.baz"],
5902 sdk_version: "none",
5903 system_modules: "none",
5904 }
5905 apex {
5906 name: "myapex",
5907 key: "myapex.key",
5908 java_libs: ["bcp_lib1", "bcp_lib2"],
5909 }
5910 `,
5911 bootJars: []string{"bcp_lib1", "bcp_lib2"},
5912 modulesPackages: map[string][]string{
5913 "myapex": []string{
5914 "foo.bar",
5915 },
5916 },
5917 },
5918 }
5919 for _, tc := range testcases {
5920 t.Run(tc.name, func(t *testing.T) {
5921 rules := createApexPermittedPackagesRules(tc.modulesPackages)
5922 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
5923 })
5924 }
5925}
5926
Jiyong Park62304bb2020-04-13 16:19:48 +09005927func TestTestFor(t *testing.T) {
5928 ctx, _ := testApex(t, `
5929 apex {
5930 name: "myapex",
5931 key: "myapex.key",
5932 native_shared_libs: ["mylib", "myprivlib"],
5933 }
5934
5935 apex_key {
5936 name: "myapex.key",
5937 public_key: "testkey.avbpubkey",
5938 private_key: "testkey.pem",
5939 }
5940
5941 cc_library {
5942 name: "mylib",
5943 srcs: ["mylib.cpp"],
5944 system_shared_libs: [],
5945 stl: "none",
5946 stubs: {
5947 versions: ["1"],
5948 },
5949 apex_available: ["myapex"],
5950 }
5951
5952 cc_library {
5953 name: "myprivlib",
5954 srcs: ["mylib.cpp"],
5955 system_shared_libs: [],
5956 stl: "none",
5957 apex_available: ["myapex"],
5958 }
5959
5960
5961 cc_test {
5962 name: "mytest",
5963 gtest: false,
5964 srcs: ["mylib.cpp"],
5965 system_shared_libs: [],
5966 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09005967 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09005968 test_for: ["myapex"]
5969 }
Jiyong Park46a512f2020-12-04 18:02:13 +09005970
5971 cc_library {
5972 name: "mytestlib",
5973 srcs: ["mylib.cpp"],
5974 system_shared_libs: [],
5975 shared_libs: ["mylib", "myprivlib"],
5976 stl: "none",
5977 test_for: ["myapex"],
5978 }
5979
5980 cc_benchmark {
5981 name: "mybench",
5982 srcs: ["mylib.cpp"],
5983 system_shared_libs: [],
5984 shared_libs: ["mylib", "myprivlib"],
5985 stl: "none",
5986 test_for: ["myapex"],
5987 }
Jiyong Park62304bb2020-04-13 16:19:48 +09005988 `)
5989
5990 // the test 'mytest' is a test for the apex, therefore is linked to the
5991 // actual implementation of mylib instead of its stub.
5992 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
5993 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5994 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09005995
5996 // The same should be true for cc_library
5997 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
5998 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
5999 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6000
6001 // ... and for cc_benchmark
6002 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6003 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6004 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006005}
6006
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006007// TODO(jungjw): Move this to proptools
6008func intPtr(i int) *int {
6009 return &i
6010}
6011
6012func TestApexSet(t *testing.T) {
6013 ctx, config := testApex(t, `
6014 apex_set {
6015 name: "myapex",
6016 set: "myapex.apks",
6017 filename: "foo_v2.apex",
6018 overrides: ["foo"],
6019 }
6020 `, func(fs map[string][]byte, config android.Config) {
6021 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006022 config.Targets[android.Android] = []android.Target{
6023 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6024 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6025 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006026 })
6027
6028 m := ctx.ModuleForTests("myapex", "android_common")
6029
6030 // Check extract_apks tool parameters.
6031 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6032 actual := extractedApex.Args["abis"]
6033 expected := "ARMEABI_V7A,ARM64_V8A"
6034 if actual != expected {
6035 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6036 }
6037 actual = extractedApex.Args["sdk-version"]
6038 expected = "30"
6039 if actual != expected {
6040 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6041 }
6042
6043 a := m.Module().(*ApexSet)
6044 expectedOverrides := []string{"foo"}
6045 actualOverrides := android.AndroidMkEntriesForTest(t, config, "", a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
6046 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6047 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6048 }
6049}
6050
Jiyong Park7d95a512020-05-10 15:16:24 +09006051func TestNoStaticLinkingToStubsLib(t *testing.T) {
6052 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6053 apex {
6054 name: "myapex",
6055 key: "myapex.key",
6056 native_shared_libs: ["mylib"],
6057 }
6058
6059 apex_key {
6060 name: "myapex.key",
6061 public_key: "testkey.avbpubkey",
6062 private_key: "testkey.pem",
6063 }
6064
6065 cc_library {
6066 name: "mylib",
6067 srcs: ["mylib.cpp"],
6068 static_libs: ["otherlib"],
6069 system_shared_libs: [],
6070 stl: "none",
6071 apex_available: [ "myapex" ],
6072 }
6073
6074 cc_library {
6075 name: "otherlib",
6076 srcs: ["mylib.cpp"],
6077 system_shared_libs: [],
6078 stl: "none",
6079 stubs: {
6080 versions: ["1", "2", "3"],
6081 },
6082 apex_available: [ "myapex" ],
6083 }
6084 `)
6085}
6086
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006087func TestApexKeysTxt(t *testing.T) {
6088 ctx, _ := testApex(t, `
6089 apex {
6090 name: "myapex",
6091 key: "myapex.key",
6092 }
6093
6094 apex_key {
6095 name: "myapex.key",
6096 public_key: "testkey.avbpubkey",
6097 private_key: "testkey.pem",
6098 }
6099
6100 prebuilt_apex {
6101 name: "myapex",
6102 prefer: true,
6103 arch: {
6104 arm64: {
6105 src: "myapex-arm64.apex",
6106 },
6107 arm: {
6108 src: "myapex-arm.apex",
6109 },
6110 },
6111 }
6112
6113 apex_set {
6114 name: "myapex_set",
6115 set: "myapex.apks",
6116 filename: "myapex_set.apex",
6117 overrides: ["myapex"],
6118 }
6119 `)
6120
6121 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6122 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6123 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 +09006124 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 +09006125}
6126
Jooyung Han938b5932020-06-20 12:47:47 +09006127func TestAllowedFiles(t *testing.T) {
6128 ctx, _ := testApex(t, `
6129 apex {
6130 name: "myapex",
6131 key: "myapex.key",
6132 apps: ["app"],
6133 allowed_files: "allowed.txt",
6134 }
6135
6136 apex_key {
6137 name: "myapex.key",
6138 public_key: "testkey.avbpubkey",
6139 private_key: "testkey.pem",
6140 }
6141
6142 android_app {
6143 name: "app",
6144 srcs: ["foo/bar/MyClass.java"],
6145 package_name: "foo",
6146 sdk_version: "none",
6147 system_modules: "none",
6148 apex_available: [ "myapex" ],
6149 }
6150 `, withFiles(map[string][]byte{
6151 "sub/Android.bp": []byte(`
6152 override_apex {
6153 name: "override_myapex",
6154 base: "myapex",
6155 apps: ["override_app"],
6156 allowed_files: ":allowed",
6157 }
6158 // Overridable "path" property should be referenced indirectly
6159 filegroup {
6160 name: "allowed",
6161 srcs: ["allowed.txt"],
6162 }
6163 override_android_app {
6164 name: "override_app",
6165 base: "app",
6166 package_name: "bar",
6167 }
6168 `),
6169 }))
6170
6171 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
6172 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
6173 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6174 }
6175
6176 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
6177 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
6178 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
6179 }
6180}
6181
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006182func TestNonPreferredPrebuiltDependency(t *testing.T) {
6183 _, _ = testApex(t, `
6184 apex {
6185 name: "myapex",
6186 key: "myapex.key",
6187 native_shared_libs: ["mylib"],
6188 }
6189
6190 apex_key {
6191 name: "myapex.key",
6192 public_key: "testkey.avbpubkey",
6193 private_key: "testkey.pem",
6194 }
6195
6196 cc_library {
6197 name: "mylib",
6198 srcs: ["mylib.cpp"],
6199 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006200 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006201 },
6202 apex_available: ["myapex"],
6203 }
6204
6205 cc_prebuilt_library_shared {
6206 name: "mylib",
6207 prefer: false,
6208 srcs: ["prebuilt.so"],
6209 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07006210 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01006211 },
6212 apex_available: ["myapex"],
6213 }
6214 `)
6215}
6216
Martin Stjernholm2856c662020-12-02 15:03:42 +00006217func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
6218 ctx, config := testApex(t, `
6219 apex {
6220 name: "myapex",
6221 key: "myapex.key",
6222 native_shared_libs: ["mylib"],
6223 }
6224
6225 apex_key {
6226 name: "myapex.key",
6227 public_key: "testkey.avbpubkey",
6228 private_key: "testkey.pem",
6229 }
6230
6231 cc_library {
6232 name: "mylib",
6233 srcs: ["mylib.cpp"],
6234 apex_available: ["myapex"],
6235 shared_libs: ["otherlib"],
6236 system_shared_libs: [],
6237 }
6238
6239 cc_library {
6240 name: "otherlib",
6241 srcs: ["mylib.cpp"],
6242 stubs: {
6243 versions: ["current"],
6244 },
6245 }
6246
6247 cc_prebuilt_library_shared {
6248 name: "otherlib",
6249 prefer: true,
6250 srcs: ["prebuilt.so"],
6251 stubs: {
6252 versions: ["current"],
6253 },
6254 }
6255 `)
6256
6257 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
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
6263 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
6264 // a thing there.
6265 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
6266}
6267
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07006268func TestMain(m *testing.M) {
6269 run := func() int {
6270 setUp()
6271 defer tearDown()
6272
6273 return m.Run()
6274 }
6275
6276 os.Exit(run())
6277}